HOT PRESS 27.2.09

More credit crunch friendly antics come courtesy of MTV, which has launched a website / video sharing site with internet provider Verizon FiOS and web production studio New New Networks (NNN). Signed and unsigned bands can upload videos they have created on a $99 budget or less within a 24 hour period. www.99dollarmusicvideos.com  

Johnnie Walker has launched Crossroads, its first global film since 2006’s award winning Human. The filmic commercial continues the brand’s Keep Walking tag line and the concept of progress. www.youtube.com/watch?v=jZl2rR5NDRY  

For more viral madness, if you haven’t seen it, check out Ken Block Gymkhana Practice, which has clocked up a massive 14m views since November. www.youtube.com/watch?v=rs-jAImScms  

Posted on 2/27/2009 1:42:00 PM by KatyDenis

Permalink | Comments (0) | Post RSSRSS comment feed |

Categories: Hot Press

Tags: , , , , , ,

 

Social Networking - A Travelers Observations

 

 

Two months overseas taught me a lot but coming back to present to the FARM there was one thing of interest that really stood out. 

Everywhere I went on my trip I noticed the huge potential for social networking as a travel tool and marketing device. There are facebook groups for almost everywhere I stayed, everything I did and even the weird local phenomena I found along the way. Agencies like The FARM should recognise the massive potential reach that  such a global, transient and digitally savvy demographic can have. 

Travel applications are already a goldmine for new media platforms such as Facebook and the iPhone, here are just a few:

  • Cities I’ve Visited
  • TravelPod Traveler IQ Challenge
  • Local Picks
  • LearnIt
  • Flight Status
  • Sit or Squat (find a bathroom near you!!)
  • iPhone Tipper
  • CouchSurfing (for those on a low low budget)

So why should we as a digital agency care?

It's all another case in point to solidify that social networking is NOT a fad, it is a fundemental shift in our means of communication and it's here to stay. The digital landscape is transforming! It will change the outlets for our line of work and our knowledge of this will becoming increasingly more valuable to clients.

Consumers are at the centre of this trend and it is predicted that by 2010 Gen-Y will have taken over the baby boomers and they are a very different group of consumers. They are rather digital USERS with huge potential spending power. At present 96% of Gen-Y internet users are part of a social networking site so there is great power here in word of mouth and viral marketing as users trust friends and recommendations rather than pushed sells.

So let's apply this to my trip. 

  • England: Piccadily Backpackers Hostel in London - incredibly active Facebook group. No wonder Facebook is the #1 social networking site with over 150 million users.
  • England: London Heathrow’s new Terminal 5 have facebook only internet stations (just in case you really feel the need to send your friend a poke before leaving the country).
  • England: The Red Phone booth challenge (how many people can you fit in one at once?) and the replica Harry Potter Platform 9 3/4 both have vast Facebook groups and Flickr galleriesand have been used as part of interactive advertising and marketing campaigns. 
  • Edinburgh, Scotland: Hogmanay, the 3 day Scottish New Year - one of the most blogged about New Years Eve events in the world, UGC rich website and active facebook group
  • New York City: Improv Everywhere's 'No Pants Subway Ride 2009' - a group similar to flash mobbers perform public stunts and are now a youtube phenomena much like Where The Hell is Matt? the dancing traveler who is now sponsored by Visa. A viral marketing success!!

  • Texas: Post-Obama Inauguration - an interesting case of social networking fear amidst the racial/political climate of the Obama-McCain election, also an impressive effort by the Obama camp to utilise social networks as campaign tool through Facebook application and keyword targeted Facebook group. A very smart move in realizing the new voting demographic of young people awakened by Obama's run for office. 
  • Los Angeles: iPhone tour applications for the Hollywood Walk of Fame and social network driven campaigns to get celebrities a star on the Walk 

So what are the questions the FARM should be thinking about?

How do we get a strong revenue stream through social network and viral marketing? Many businesses are still struggling to see how this can work for them as a marketing tool.

As users are engaged with their profiles and content simple display mechanisms do not work. Rather, widget and other applications that help people chat, create and share content are the areas to investigate. There is a need to harness the power of word-of-mouth and let users “do the marketing for you” by creating opportunities for people to feel ownership of the brand (much like Obama did with his campaign). According to eMarketer there is a predicted $1.3 billion social network advertising spend in 2009 so this is definitely not an outlet to ignore.

The client services team here at The FARM have begun delving into this realm to become experts on the possibilities of new media and the inevitable change that is taking place in our industry. 

So go and get BLOGGED!! 

Posted on 2/25/2009 11:36:00 AM by KristinaReddaway

Permalink | Comments (20) | Post RSSRSS comment feed |

Categories: Morning tea

Tags: , , , , , , , ,

 

The FARM Renovation Rescue

 

The FARMers were thrown into the twilight zone arriving to work February 2nd, after the FARM Renovation Rescue Team transformed the office over the weekend. Under Natasha’s “interior art direction” Chris, John, Nina, Chris Rann, Leah, Dang (and a cameo by Shannon) knocked out a wall, redecorated the lounge, rewired the entire office suite and induced jungle fever with a plant collection worthy of Mr Don Burke.

Rann hit the renovations with a vengeance. Spurred on by an eerie resemblance to Tom Williams, Australia's favourite chippy (except for maybe Scotty Cam), Rann set about to refit all the office's power boards. 

Leah starred in the role of Sadie the Cleaning Lady, dashing in elbow length rubber gloves and armed with a bottle of Domestos. Johnny Farnham would be proud. For those of you who not familiar with this song, look up the lyrics - gender theorists eat your heart out!!

 

Nina and Natasha braved Ikea and two nursery visits. Fortunately the latter included the assistance of a lovely tall South American chap, followed by a knowledgeable greener who asked "are the balcony plants going to be loved or neglect?" In all honesty, he suggested star jasmine as a hardy solution.The FARM gnomes now start out blankly from our plant boxes and occasionally get hugs at Friday night drinks. 

 

Meanwhile, back at the office ChrisP became playmates with the FARMs resident entertainer Asher, saving him the epic ordeal of the Ikea children's ball-pit pen. 

 

Pushing through with a totaly of 24 hours work in two days, half a case of the amber liquid (only half? i hear you ask), and a strategically placed pizza break or two, short work was made of the refit. 

Massive thanks to the team for making the office so pimpin'!! 

  
   

Posted on 2/24/2009 3:16:00 PM by KristinaReddaway

Permalink | Comments (41) | Post RSSRSS comment feed |

Categories: The Farm

Tags: , , , ,

 

Linq to Umbraco

Intro

We've been working on 3 larger Umbraco sites in which we've implemented our own Linq to Umbraco strategy. It's a fairly simple strategy, it doesn't involve custom expression trees or anything, it simply leverages Linq to Xml, IEnumerable<T> and extension methods. In simple terms, we basically convert Xml nodes into our own objects which we can then run typed Linq queries against. Since the performance of deserialization of this Xml into objects was one of our concerns, we implemented Microsoft's Policy Injection framework to handle the caching of our Umbraco objects which works really well (more on this later). Here's a quick example of what this allows you to do with Umbraco data (in this case Umbraco is storing information about events, such as festivals, etc...)

var todayEvents = (from e in GetEvents()
                               where e.FromDate.Date == DateTime.Now.Date
                               select e).ToList();

The source code is available here: LinqUmbraco.zip (566.35 kb).

Background

In order for this to work, there is a bit of setup involved. The way that we've gone about this implementation is by defining a data model for each Document Type that you want to be able to use in this framework. In this example, Umbraco will need to be setup with a few Document Types: Event, EventComment, EventOrganizer, EventsContainer. I've included the definitions of these doc types in the source code so you can easily import them. For an event model, we would create an interface:

public interface IUmbEvent : IUmbracoItem
    {
        System.Collections.Generic.List<UmbEventComment> EventComments { get; set; }
        string EventTitle { get; set; }
        DateTime FromDate { get; set; }
        string FullDescription { get; set; }
        string ShortDescription { get; set; }
        bool ShowInListing { get; set; }
        DateTime? ToDate { get; set; }
    }

You'll notice this interface extends IUmbracoItem which I've defined in our code library. It contains all of the basic properties of an Umbraco node:

 public interface IUmbracoItem
    {
        DateTime CreatedDate { get; set; }
        int CreatorId { get; set; }
        string CreatorName { get; set; }
        int Id { get; set; }
        int Level { get; set; }
        System.Collections.Generic.Dictionary<string, string> NodeData { get; }
        string NodeName { get; set; }
        int NodeType { get; set; }
        string NodeTypeAlias { get; set; }
        int ParentId { get; set; }
        string Path { get; set; }
        int SortOrder { get; set; }
        int? Template { get; set; }
        DateTime UpdateDate { get; set; }
        string UrlName { get; set; }
        string Version { get; set; }
        string WriterName { get; set; }
    }

Next I've created a class that implements this interface called UmbEvent which extends UmbracoItem(which in turn implements IUmbracoItem). The constructor function of these objects are what does the deserialization:

public UmbEvent(XElement x)
            : base(x)
        {
            //Get the from date and use the DateConverter to convert it.
            //If the returned date is MinValue, then the value in Umbraco has not actually
            //been set and since it is mandatory, we'll throw an Exception.
            FromDate = x.UmbSelectDataValue<DateTime>("FromDate", DateConverter);
            if (FromDate == DateTime.MinValue)
                throw new Exception(string.Format("The node with id {0} does not have a start date set", this.Id.ToString()));

            //Get the ToDate using a NullableDateTimeConverter
            ToDate = x.UmbSelectDataValue<DateTime?>("ToDate", NullableDateTimeConverter);

            EventTitle = x.UmbSelectDataValue("EventTitle");
            ShortDescription = x.UmbSelectDataValue("ShortDescription");
            FullDescription = x.UmbSelectDataValue("FullDescription");
           
            //Get the ShowInListing using the IntConverter since the value stored in Umbraco is
            //an integer, not a boolean.
            ShowInListing = x.UmbSelectDataValue<int>("ShowInListing", IntConverter) == 1;           
           
            //Select all child "node" nodes that have a node type alias
            //of "Event Comment" from the current element, deserialize them
            //to UmbEventComment objects, and store them in our List property.
            EventComments = x.UmbSelectNodes()
                .UmbSelectNodesWhereNodeTypeAlias("EventComment")
                .Select(n => new UmbEventComment(n))
                .ToList();           
        }

In the code for the UmbracoItem class are some helper methods for data conversion so exceptions are not thrown and that data is converted properly. 

The next step is to setup the data service layer. I generally create a different service class for each model and in this example we'll have IUmbEventService interface with an UmbEventService class defined as:

public interface IUmbEventService : IUmbracoService
    {

        int CreateEvent(IUmbEvent cqEvent);
        void UpdateEvent(int eventId, IUmbEvent e);
        List<IUmbEvent> GetEvents();
        IUmbEvent GetEvent(int eventId);
        DateTime LastEventDate { get; }

    }

Using the code

Service Layer

Most of the important work is done in the service layer. The underlying method that is called for retreiving events is the GetEvents() method which returns a List<IUmbEvent> object which we can use to query. This method will look up all events in the Umbraco xml cache, convert each one to an UmbEvent and return a list of these deserialized objects. I've created a bunch of Linq to Xml extension methods for use with Umbraco which I use to query the Umbraco xml cache. This makes querying Umbraco xml much nicer, easier and allows you to use System.Xml.Linq objects instead of the old XPath objects. Here's the definition of the GetEvents() method:

[CachingCallHandler(1, 0, 0)]
public List<IUmbEvent> GetEvents()
{

    Console.WriteLine("Looking up and caching all published events...");

    //Lookup the event container node in Umbraco
    XElement xNode = UmbXmlLinqExtensions.GetNodeByXpath(EventContainerXPath);

    var eventData = xNode
        .UmbSelectNodes() //selects all descendant "node" nodes
        .UmbSelectNodesWhereNodeTypeAlias(EventNodeTypeAlias) //selects nodes of a certain alias
        .Select(x => new UmbEvent(x)) //This does the object conversion
        .Where(x => x.FromDate != DateTime.MinValue); //ensure we don't return events with no start date

    return eventData.Cast<IUmbEvent>().ToList();
}

Now that this method is create, we can just query the result of the method to find Events by whatever criteria we've defined in the IUmbEvent interface. For example, the GetEvent method body is quite simple:

public IUmbEvent GetEvent(int eventId)
{
    var myEvent = m_This.GetEvents()
        .Where(x => x.Id == eventId);

    return myEvent.SingleOrDefault();
}

To expose my service layer classes, i have a service factory class that creates new instances of each service type when requested. This makes it easy to call services from code since there's always one point of entry.

Calling the services

I've included a class called Tests which calls the methods of the event service. With the above framework in place, using the code is extremely easy:

List<IUmbEvent> events = m_Factory.EventService.GetEvents();

or

IUmbEvent e = m_Factory.EventService.GetEvent(LookupEventId);

Also in the source code are service methods to create and update Umbraco nodes. If you're not familiar with how to do this, this will show you a fairly easy way to get the job done. The CreateEvent method actually checks to see if a "Pending" event organizer node is there and if not it creates one and then creates new unpublished events under this node.

Running the tests

I've created a simple ashx handler that you can setup in your Umbraco project to test this data layer. You'll need to build the solution and copy the DLL files over from the bin folder of the UmbracoData project into your Umbraco bin folder (don't copy over the Umbraco DLLs if you don't want to ... these are Umbraco 4 DLLs). Then add an HttpHandler to your web.config:

<add verb="*" path="datatest.ashx" type="UmbracoData.TestHandler, UmbracoData" />

You'll have to make sure Umbraco is setup for this project so you'll need to: 

  • Import all of the document types
  • Create a node of type "EventsContainer" called "Events" under the root content node

Now you can navigate to datatest.ashx which will allow you to run the tests. If you want to step through the code, just Attach to your Asp.Net process with the solution open.

Policy Injection

As I mentioned before, performance will be a factor if for every event query, we need to deserialize every event xml node into an object. This is where caching comes in handy. We use Policy Injection quite a bit to do caching and logging in our applications as it makes these tasks incredibly easy. Policy Injection is a simple form of AOP (Aspect Oriented Programming) and is part of Microsoft's Enterprise Library. You'll see that this method is attributed with the CachingCallHandler which is going to cache the output of this method for 1 hour in this case. In each subsequent call to this method Policy Injection will intercept the call and determine if it has been cached, and if so, it will simply return the cached results and cancel the execution of the method.

In order for Policy Injection to work, you need to either create a new service class or wrap and existing service class the with Policy Injection. As i mentioned before I use a service factory to expose all of my service classes and in this class, it creates each service with Policy Injection:

public class ServiceFactory
{
    public IUmbEventService EventService
    {
        get
        {
            return PolicyInjection.Create<UmbEventService, IUmbEventService>();
        }
    }       
}

There is a catch!! You'll notice in the above code snippet that defines the GetEvent method uses the syntax: m_This.GetEvents(). This is because we need a reference to the event service class wrapped in Policy Injection inside the event service class.... confusing in know. This is because the Policy Injection framework is the only thing that knows anything about the CachingCallHandler attribute and if we call GetEvents inside one of the methods of the UmbEventService, then Policy Injection is actually not playing any part of that method call. To get around this, we define an internal property in the UmbEventService class of type IUmbEventService and in the constructor function, we wrap this instance in Policy Injection and assign it to this property:

public UmbEventService()
{
    //Ensure our internal object is wrapped in PolicyInjection
    m_This = PolicyInjection.Wrap<IUmbEventService>(this);
}

/// <summary>
/// We declare this variable as a "trick" to ensure that PolicyInjection
/// is still used when we call internal members of this class.
/// For example, any method of UmbEventService that calls GetEvents() will need
/// to call m_This.GetEvents() to ensure that it returns the cached data
/// and does not re-execute the code in body of the method.
/// </summary>
IUmbEventService m_This;

Another point of interest is that i've included an Umbraco action handler to refresh the Policy Injection cache whenever a node is published.

The source code is available here: LinqUmbraco.zip (566.35 kb).

Posted on 2/24/2009 12:38:00 PM by Shannon Deminick

Permalink | Comments (0) | Post RSSRSS comment feed |

Categories: Technology

Tags: , , ,

 

Camp Quality Launch!

[February 2009] The FARM is very proud to announce the launch of the new Camp Quality website that brings to life the concept of “Bubbles of sunshine” for its supporters and families. Camp Quality is a not for profit organisation that believes in bringing optimism and happiness to the lives of children and families affected by cancer through fun therapy.

 

 

Drawing upon CQ’s philosophy that “Laughter is the best medicine”, one of the features of the website is the spontaneous page takeovers to make people laugh and smile! Keep an eye out for Giggle and the McDonald’s CQ puppets debuting for launch. The technology used here is flash based and as such can be flexible in the future to inject random moments of fun, interactivity or campaign support, without having to change the overall architecture or design of the site.

 

 

As a colourful and media rich site (featuring CQTV and Jukebox), the online component of Camp Quality becomes just as fun a space for children living with cancer to hang out, as the programs’ real world activities.

Using the new feature rich Umbraco 4 CMS system, the CQ site allowed us to think outside the box creatively and still enable the client control and flexibility over the content. The site also drives participation by inviting public users to add their own events, videos, photos, comments and stories which are also managed through the CMS.

We hope the new Camp Quality site inspires you to stay positive and laugh out loud. Have fun!

Posted on 2/23/2009 4:35:00 PM by KristinaReddaway

Permalink | Comments (10) | Post RSSRSS comment feed |

Categories: Project Releases

Tags: , , ,