2011

Thursday, December 22, 2011 by Alex Norcliffe

Hi everyone! Have you booked up your Seasonal Religious-or-not Coding Fun calendar yet? No? Well, allow me to proffer a toy for the holidays. We've put up a couple of new Umbraco 5 builds for you to try out. We're calling it Release Candidate 1 - we're almost there in terms of features, and the remaining work for us to get to a 5.0 release is around performance, bugfixes from community testing, and any quick wins around handy methods that help with building a site.

As usual, if you're new to Umbraco 5 or you've come here from a web search, there is some background to the other releases we've done in the previous few months:

- Umbraco 5 Alpha 1 Release

- Umbraco 5 Alpha 2 is out today

- Umbraco 5 Alpha 3 is out today

- Umbraco 5 Beta 1 is out today

You can download the RC 1 web application zip from CodePlex, and within minutes of this blogpost going up our status page will reflect the latest updates too.

Before we crack on, a quick word about timings: while we haven't matched our recent hopes for a Christmas 5.0 completed release, we do know that we will be able to put it out by the end of January. We have now reached the point where we're going to be working on performance and bugfixes in time for 5.0, so that we can then quickly add any popular missing features with future releases (5.1, etc.) We're really grateful for your help testing this release, and we'll be using your feedback to make a lightning-fast, stable 5.0 after Christmas.

What's in the release?

Today's release has two parts. The first has the same level of User support as Beta 1 - i.e., no Members section. The second download is the same fundamental codebase, but with the Members section added. Work on this has not yet been completed, and we're keeping it on a parallel build for the moment so that we can evaluate community feedback and leave the option open for us to release 5.0 either with or without Members support depending on how the testing goes. We'd really appreciate if you could give that one a try too and let us know how you get on.

Issue Tracker

Speaking of "letting us know", it's about time we helped you help the project, by introducing the promised place to log v5 issues. We have used the CodePlex Issues tracker for some time, and it's been very good to us, but there are some niggles - and so we've created a new issue tracker at http://issues.umbraco.org for people to use for v5 RC1. We'd love feedback on this too, as if all goes well, we could see this as the new central tracker in the future.

We also have some exciting ideas about how to integrate this with the Karma system on Our - if you have any ideas too, please let us know!

The tracker is based on the excellent YouTrack from JetBrains, who have been kind enough to give us a free license for our open-source project.

Registration is open to all. After logging in, you will see the welcome page that gives you a few hints on querying the issues log.

image

We've got some issues in there already that we'll be working on in time for 5.0:

image

Logging an issue is really straightforward. You can select a release that you're targeting, and easily include screenshots from your clipboard or filesystem from the "Attach" menu:

image

Features added since Beta 1

Composite document types

A few people noticed a big feature lacking in Beta 1: inherited document types. Support for this was in the architecture from the beginning, but it didn't make the cut for that release. Today's download has the feature ready and waiting to be tested.

Where it slightly differs from v4.7 is that you can now have multiple parent document types! Party smile You can have two master document types, say "SEO Fields" and "Article Fields", and have a "News Article" document type that inherits the fields of both. We merge any tabs that have the same alias too, so that your editors see fields in common tabs grouped together.

You can change this inheritance structure at any time, but be warned of course that you may end up removing existing properties that you have filled out for content.

Here's an example: I've got a News Article document type which inherits from both "Seo Fields" and "Article Fields". My News Article type has a tab called "Article", and so does the "Article Fields" document type. If I edit "Article Fields", I can see my "Article" tab with its "Body Text" field:

image

If I edit the child "News Article" document type, I can see the inherited properties greyed-out for reference, and also the "News Title" field that only exists on this document type. I've also got some greyed-out Seo fields there because I'm also inheriting from my handy "Seo Fields" document type.

image

Editing some content that is a "News Article" shows the two fields merged into one Article tab:

image

Dictionary

The dictionary is now in there too. You'll notice it in the backoffice under the Settings tree, and you can use the @Umbraco.GetDictionaryItem helper in your templates to insert a value. As I mentioned in the previous release, the Dictionary in v5 uses our revised Language support that allows for fallbacks. So, if you specify that the Belgian French language "falls back" to regular French, any Dictionary items that are blank for Belgian French will revert to the value in the regular French language. This should be a timesaver for scenarios where your usage of the language in your website only differs in a few key words.

A quick word about keys: many have seen that you can have a "hierarchical" dictionary in v4, but you still have to find unque names for your keys, because you refer to them by only their key and not their path in your templates.

This changes in v5. Here's two dictionary items that I have:

image

Here's the code for using them:

<p>My key: @Umbraco.GetDictionaryItem("MyKey" )</p>
<p>My key 2: @Umbraco.GetDictionaryItem("MyKey/MyKey2" )</p>

Also, since Dictionary items are "just regular content" in Hive, we get Rollback, Move, Copy, and Permissions, all "for free":

image

Preview

You can now click the 'Save' button followed by the 'Preview' button and see your page rendered with the latest revision rather than the published copy.

Hierarchy navigators on DynamicModel

In your templates, you can now use the following navigators:

  • DynamicModel.Ancestors
  • DynamicModel.AncestorsOrSelf
  • DynamicModel.Descendants
  • DynamicModel.DescendantsOrSelf
  • DynamicModel.Children
  • DynamicModel.Parent

Each of these navigators also has more querying and sorting support on there. The following methods are available:

  • Single
  • SingleOrDefault
  • First
  • FirstOrDefault
  • Last
  • LastOrDefault
  • Any
  • Count
  • Where
  • OrderBy
  • OrderByDescending

All of these methods except the last two accept a string for querying against the dynamic properties on a piece of content. You can just supply the string, like v4:

DynamicModel.Children.FirstOrDefault("publisher == \"APRESS\"")

or you can supply parameters in order if you prefer - the numbers just correspond to the order of parameters that you supply after the first part:

DynamicModel.Children.FirstOrDefault("publisher == @0", "APRESS")

Normally, if you're used to dealing with lists of objects in .NET (IEnumerable<Something>) you may know that when you access methods like myList.Count(), the Count() method is actually what's called an "extension method" - it's a static method defined in one place that can be used on anything that implements IEnumerable<Something>. Why do we care? Because these static methods don't work on dynamic objects - those where not even Visual Studio knows the properties available, because .NET figures it out when your page is being rendered. But it would be a great pain to have to either not have those handy methods like Count(), Any(), First() on DynamicModel or have to call them in the alternative unintuitive way. So we've added them explicitly to the collection that underpins Ancestors, Children etc.

Long story short, it means you can also do queries like this, using Where() with Count() tacked on the end:

DynamicModel.Descendants.Where("NodeTypeAlias == @0", "BookPage").Count()

The OrderBy and OrderByDescending methods take a property alias, e.g. OrderBy("Name")

You can also use the same underscore prefix as in v4.7 in order to put a "recursive" property into your template. This is a throwback to the legacy of XSLT when it was straightforward to say "my current page might not have this property, but please go up the tree until you've found one". A bit like an "inherited" property. Where you would normally write DynamicModel.SiteName to put the Name property from the current page, you can put DynamicModel._siteName with the underscore and lowercasing indicating to the system that, if that property isn't found, it'll go up the tree until it's found it.

Alternative Templates

If you have more than one template available for the document type of your content, you can now include that in the Url similarly to v4. For example, here's the homepage template that I've been using to test querying, it has some cruft at the top:

image

And here's the cleaner one that I called AltHomepage.cshtml on my filesystem, and added to my Homepage doctype, accessed by adding ?altTemplate=althomepage to my browser address bar:

image

Happy bug-hunting holidays!

As always, we really appreciate the time people take to test out these releases - even putting up with it not having many performance optimisations until the final stage - and both reporting issues, and collaborating on the community site and on the contrib project.

So, best wishes to you and yours, and see you in the forums!

Team 5

Wednesday, December 14, 2011 by Peter Gregory

Compatibility ExampleToday we released a new feature over at our.umbraco.org to help identify package version compatibility. 

Previously it was up to the developer to specify whether a package was compatible with certain versions, however it sometimes wasn't entirely accurate.  So we decided to give it to you, the community, to report on whether or not a package works with a certain version of Umbraco. 

If you are logged in and once you have downloaded a package you will be given an opportunity to report on compatibility.  This information will be shared with the community via a small report displayed in the side bar of the package detail page. 

What do the Smileys mean?

The smiley faces specify how satisfied the community is that it works with that version of Umbraco. 0%, it has been reported that it doesn't work through to 100%, everyone has reported that it does work.

Whats in it for me?

For every package you submit a report for you will receive one karma point.  You can report as many times as you like, if a report exists from you we will simply update your existing report, however only one karma point will be given per package.  We believe this will lead to data on compatibility being far more accurate and will give confidence when downloading a package for the first time, knowing somebody within the community has tested it before you.  We already know what packages you have downloaded in the past, so get to it, earn a little karma and spread a little love. 

Monday, December 12, 2011 by Per Ploug

I got an email today from a developer who wanted to delete documents with Courier. As you might know, Courier does not support this, as the focus is moving and deploying content, not removing it. You can ofcourse unpublish items, and Courier will then unpublish them from your site. But incase of accidents, they will still be there.

What we could do however, was to force Courier to delete any document which is unpublished.

A problem thats easy to solve

However, because of the architecture behind Courier, we have an easy and clean way of doing it, we simply need to do 2 things:

  1. Write an ItemEventProvider which calls the standard umbraco document api to delete a document
  2. Subscribe to the Courier Document Item providers Extraction event to trigger the Delete document EventProvider

Writing a custom ItemEventProvider

An ItemEventProvider is a simple class, that has nothing else but an alias, and a Execute() method. In the Execute() method you can then add whatever code you want. Through Courier you can either tell it to execute the event, or you can tell it to add the Event to a specific queue which will execute later. We will get to that part later.

First we need a couple of references to the Courier dlls: Umbraco.Courier.Core.dll, Umbraco.Courier.ItemProviders.dll, and the Umbraco dlls: cms.dll, businesslogic.dll and interfaces.dll

With these usings in place:

using Umbraco.Courier.Core;
using Umbraco.Courier.Core.ProviderModel;
using Umbraco.Courier.Core.Diagnostics.Logging;

We can now implement the following class:

public class UnPublishDocument : ItemEventProvider
{
    public override string Alias
    {
        get{ return "DeleteDocument"; }
    }

    public override void Execute(ItemIdentifier itemId, SerializableDictionary<string, string> Parameters)
    {
        Guid g;
        //if the itemId is a valid Guid we will fetch a umbraco document from it
        if (Guid.TryParse(itemId.Id, out g))
        {
            try
            {
                //get the native umbraco document object
                umbraco.cms.businesslogic.web.Document d = new umbraco.cms.businesslogic.web.Document(g);
                        
                //call the native umbraco document api .delete();
                if (d != null)
                    d.delete();
                    
            }
            catch (Exception ex)
            {
                //logging of errors
                RevisionLog.Instance.AddItemEntry(itemId, this.GetType(), "DeleteDocument", ex.ToString(), LogItemEntryType.Error);
            }
        }
    }
}

So we have an event with the alias "DeleteDocument" inside of its execute() method we lookup an ItemIdentifier, in the case of document items, this always referes to the Unique ID of the document, which is a Guid.

We then fetch the document with the native umbraco document api and delete it.

All done.

Hooking into the Courier event model

So we now have an event, we then need to trigger this event at the appropriate time. Due to the way Courier runs an Extraction as a Database transaction, we need to wait untill after this is done, as we cannot access data inside the transaction while it runs. So we cannot call umbraco.cms.businesslogic.document, as it cannot get access to the document table.

The solution is to use the Build-in Event queue that Courier uses to delay events like these, untill after the database transaction is complete, that means that we can collect a ton of events during the extraction, and then execute all of them after the transaction is done. To do this, we simply need access to a ItemProvider while the extraction is running, as Couirer keeps the context synced between the source and target machine.

using Umbraco.Courier.Core;
using Umbraco.Courier.ItemProviders;
using Umbraco.Courier.Core.Enums;

And then we use the good ol' umbraco ApplicationBase to subscribe to events on Application start, in this case we call Umbraco.Courier.ItemProviders.DocumentItemProvider, which is the provider that handles deployment of documents and hook into it's Extracted event, which is triggered after the extraction / deployment of a document is done

//hook into the standard applicationbase for event subscriptions
public class EventSubscriber : ApplicationBase
{
    public EventSubscriber()
    {
        //get the DocumentItemProvider
        DocumentItemProvider.Instance().Extracted += new EventHandler<ItemEventArgs>(DataResolver_Extracted);
    }
}

Inside the event we access the current document being extracted, and the Item Provider being used

//this is Courier Item, not a native umbraco document
    Document d = e.Item as Document;
    //the current provider used 
    ItemProvider provider = sender as ItemProvider;

Finally we check if the document is unPublished, if it is, then we add a "DeleteDocument" event the queue that runs after the Database Transaction is Complete (DBTransactionComplete)

if(!d.Published)
    provider.ExecutionContext.QueueEvent("DeleteDocument", d.ItemId, null, EventManagerSystemQueues.DBTransactionComplete);

The provider has access to an ExecutionContext, which has access to currently active queues, we pass in the alias of the DeleteDocument ItemEvent Provider, then the ItemId, and finally the name of the queue we want it to be in.

The complete code looks like so:

public class EventSubscriber : ApplicationBase
{
    public EventSubscriber()
    {
        //get the DocumentItemProvider
        DocumentItemProvider.Instance().Extracted += new EventHandler<ItemEventArgs>(DataResolver_Extracted);
    }

    void DataResolver_Extracted(object sender, ItemEventArgs e)
    {
        //this is Courier Item, not a native umbraco document
        Document d = e.Item as Document;
        //the current provider used 
        ItemProvider provider = sender as ItemProvider;


        //if the document is not published, we queue the event "DeleteDocument" in the DBtransactionComplete queue
        //this will then be executed after the DB transaction is done.
        if(!d.Published)
            provider.ExecutionContext.QueueEvent("DeleteDocument", d.ItemId, null, EventManagerSystemQueues.DBTransactionComplete);
        }
    }
}

So with a total of ten lines of Code (excluding all the namespace and using declarations) we have now enabled Courier to delete documnets that are set to an unpublished state

We have full documentation on ItemEventProviders, the EventQueues, and Dataresolvers in this PDF

And you can download the source for the above example  here

Thursday, November 17, 2011 by Per Ploug

You've seen the videos, the blog posts and the feedback, and naturally started wondering: "Would Courier work for me, and how do I know without paying?"

Well, the only way to know if Courier fits your way of working, is by trying it out. And luckily, we've made it very easy to do just that.

Trial version and licensing

First of all, Courier 2.5 functions completely unrestricted as long as you run it on your local machine. There are zero limitations on the trial version as long as it happens on your machine, and not an internet/intranet server somewhere. So don't worry about those trial messages, as long as you stay on your local machine, it will be a fully working version

Setting up 2 local sites

Setting up local testing sites can be done in 2 ways, either you simply create 2 new empty sites in IIS as you normally would through web platform installer ( video), or by copying your website files and database from an existing site. Whatever you do, you should end up with 2 sites running on your local IIS webserver, in their own Application Pool, so each site has its own .net 4 integrated mode Application Pool.

Installing Courier 2.5

To make a connection between the 2 sites, you need Courier installed on both sites. To install Courier, follow the instructions below, which refers to the below screenshots:

 

repo enterDomain installed ContextMenu deployment
1. Courier in the repository 2. Setting the destination domain 3. Courier installed 4. Right-clicking to start deployment 5. the deployment dialog

Open the Umbraco backoffice, login, and browser to the developer section. Open the packages folder, and choose "umbraco package repository" In the window on the right side, it will now load the most popular pakages for umbraco, and enable you to search for a package. Search for "courier" and the Courier package should appear, then click the "install" button. (image 1)

When the install is complete, you will be prompted about entering a location domain. This refers to the toplevel domain your other umbraco site is installed on, so if it's on a local domain such as "mytestingdomain", or "test.local" simply enter those. If you run it on a specific port, enter the domain name, followed by port number, ex: "localhost:8078" (image 2)

Courier is now installed and ready to use (image 3). If you want to change the location domains, or add additional domains later, watch this video, or read the document on installation and configuration, found here.

When you have installed and configured Courier on both sites, it's time to perform your first deployment. Simply right-click the item you wish to deploy, and select "Courier" in the context menu (image 4)

This will launch the Courier transfer dialog, where you can now select what items you wish to transfer, or you can drill into selecting specific files or overwriting modes, by selecting "advanced settings" (Image 5)

You have now performed your first deployment with Courier. Now to dig a little deeper, I suggest you watch the Courier 2 videos on umbraco.tv (free) read the documentation on Courier, (if you need to work with apis or custom configurations) found here, or simply ask any questions you have on the our.umbraco Courier forum.

Upgrading trial to full version

When its time to go from the trial version, to the fully licensed one, it is simply a matter of a installing a license file from umbraco.com, if you havn't done it already, purchase Courier 2 from here, either as the standalone product or as part of Umbraco Complete.

When you've purchased a license, you can find it on your profile page on umbraco.com, where you can configure the top-level domains you need for your site.

After that configuration is done, simply open the umbraco backoffice, go to the Courier section, and enter your credentials on the Courier dashboard (image 3). This will give you the option to install the Courier licenses you've purchased directly on your site. Simply click "install" and your licenses is instantly installed, with Courier ready to use. Do this on all the sites you need Courier on.

Remember: Launch discount

To celebrate the Courier 2.5 launch, we're for a limited time offering
Courier 2, Full version at a discounted price of just €99, that means you save €350

To get the discount, simply enter the discount code "fgdtt2237asds" on the Cart page, during checkout. Offer ends December 1st

 

Tuesday, November 15, 2011 by Per Ploug

After a final round of checks and small bug fixes, we feel the 2.5 release is ready to get out to the masses. It is now available on our.umbraco.org for download, along with documentation and installation instructions.

To get a taste of what Courier can do, watch the videos here, or read this blog post, which outlines the latest version.

 

Courier 2.5 improvements

Robust task manager
Handles all your tasks, even very long running ones, so transfers, deployments and packaging tasks all run safely in their own threads, ensuring that nothing stops in the middle of an operation.

Support for community projects
Out of the box, uComponents and DAMP 2.0 datatypes are supported. At the same time, we've launched CourierContrib on codeplex, to ensure that we keep sharing code for adding compatibility for 3rd party datatypes. If you want to be part of this, or simply want to add courier support to your datatype, give us a shout on the forum or read the docs on dataresolvers for courier

Refined architecture
After feedback on 2.0 we decided to undertake the larger task of changing the core APIs to handle the common issues of timeouts, too many dependencies collected and the way responsibility was shared between core and the individual providers. It has been a big push to get done, but future development will be faster and more solid than before.

Improved UI
2.5 has been about improving the lives of non-technical users, who just want to right-click and deploy, so the UI in that area has been massively upgraded to give better feedback and handle users with limited permissions better - for instance, if a user is not allowed to transfer document types, courier will simply check if this is needed at all, so the deployment can continue.

Future development

This was the big push to get past the big issues, for the next releases planned, we will be doing small and focused releases, aimed at fixing immediate issues, reported by our users, and keep major feature development on hold, until we have had a good amount of maintance releases - stability is the main goal for the next releases.

Courier and version 5?

Future development of course also includes Version 5 support, and building a free Courier Provider for moving content from Version 4 to Version 5. It will support moving all the items that makes sense to move, namely content and media data, as well as much as possible of their respective media and document type information, we will keep you posted on the progess as we know more.

Courier for moving content and media from Version 4 to Version 5, will be free for everyone to use.

We hope you will enjoy this release, and give us feedback, good or bad so we can improve it even more.

Monday, November 14, 2011 by Niels Hartvig

A frequent topic we meet as we approach the release of Umbraco 5 is "how can I upgrade to Umbraco 5 [from Umbraco 4]". The answer is simple - you can't. But what's even more interesting is - you wouldn't even if you could. What you worry about is irrelevant - it's what I call "The Upgrade Myth".

As much as many of you want the latest and greatest, the lust isn't rational. We rarely need the new features, often not even most of the bug fixes. This is why most Umbraco installations aren't upgraded and haven't been the past three years (which is how long we've been monitoring it)?

Before you jump straight to the comment fields and claim that you do, please take a deep breath. While you may have done loads of patch upgrades (ie. from 4.7.0 to 4.7.1) of Umbraco installations, just how many of the sites you own or have made have been through a minor (ie. from 4.5.0 to 4.7.0) or major (ie. from 3.0.5 to 4.5.0) upgrade? If you say all of them, you're a minority. Less than 2% (updated from 1%, see comments) of Umbraco sites have been through minor or major upgrades.

This is because most sites have a lifespan of two to three years. Best practices on the web - both conceptually and technically - moves so fast that active sites often go through a complete re-do in that period. That doesn't mean that you swap your CMS or make very dramatic changes, but it's often enough to start from scratch (although you might import parts of your existing site).

We'll keep supporting Umbraco 4.x

Umbraco 4 is a solid platform and the version that gave us the major breakthrough. It'll be around for quite a while, is known by a huge community of experts and we'll keep supporting it with bug fixes and improvements for at least two years after the release of Umbraco 5. Period. It is still a safe choice.

To five or not to five

When people are asking "how can I upgrade", it's often consultants - not end-users - who ask. And what they really ask is "what happens to the Umbraco I know so well"? The answer is that it's changing - for the better. The downside is that it means that you'll need to change too.

Umbraco 5 is a whole new beginning. New underlying framework (ASP.NET MVC), new data layer (Hive) and a re-written UI (KnockoutJS). It's pretty bold. And maybe a little insane.

You see, we could all - core team, HQ, community - have chosen to rest on our laurels and enjoyed the huge success that Umbraco 4 is. And while we patted each other's backs and touched glasses of Krug we could witness how the wrinkles would appear and the energy slowly fade away.

But we're not like that. We're a rare crowd of curious, bold, hungry and foolish people. And Umbraco 5 is the testament.

You don't have to worry about upgrading your Umbraco site. But it's time to upgrade yourself.

Friday, November 11, 2011 by Alex Norcliffe

Hi everyone! It's Friday, so it must be time for an updated release of Umbraco 5. We're calling this one Beta 1 - there's still work to do, but it's getting more and more stable, the APIs are becoming more and more final, and your feedback will be as valuable as ever.

If you're new to Umbraco 5 or you've come here from a web search, there is some background to the other releases we've done in the previous few months:

- Umbraco 5 Alpha 1 Release

- Umbraco 5 Alpha 2 is out today

- Umbraco 5 Alpha 3 is out today

You can download the Beta 1 web application zip from CodePlex, and within minutes of this blogpost going up our status page will reflect the latest updates too.

Trialling Umbraco 5

If you haven't had a play with the Alphas, or don't know what to expect, I recorded a quick screencast to show you how quickly you can get up and running. I'm not so hot with the new fandangled Screenr kids so I'd love some feedback in the comments on what you'd like or not like to see in the future!

What's in the Beta 1?

Our focus since Alpha 3 has been on a couple of core areas:

Editing templates

Matt has made some further improvements to the template editor and recorded a nifty Screenr here:

Along with those tweaks, we've also got a new "Books" node in there which gives an example of how you can do parent-child templates just like Umbraco 4.

Getting your content into your templates & pages

The new Homepage template in the Dev-Dataset also has a lot of content by default as a mini-tutorial that can take you through some example queries. Querying for content is something that we have started since Alpha 3, and some of the early methods are already in there to play with. Our aim is to have this pretty much complete in time for Beta 2.

image

Bug fixing

We've been getting a lot of great feedback from the various hackdays and meetups, and we've closed as many issues as we could find. For example:

  • Deleting a property in a document type should no longer error
  • Deleting a whole document type should be fixed
  • Publishing all content from the context menu should have fewer niggles
  • Registering your own Dashboards in the backoffice should be easier (Darren Ferguson has put up a great example blogpost here)
  • .. and so on! Of course, if you do find any problems, we'd love to know. There's an Umbraco 5 forum on Our Community site which we keep an eye on as often as possible. With the next beta, it'll also be time to start having an issue tracker which we'll help you out with when the time comes.

Performance

The Alpha 3 was slow, we know - especially if you're using SqlCe. It's better in the Beta 1 - not yet perfect, but you'll notice the difference. Why are things slow in these pre-releases? Primarily because we're getting the foundations right first, and coming back in later to profile the code and understand where to make efficiency savings. Premature optimisation can really hurt a project - for example, if we added workarounds or caching before the full extent of the system was fleshed-out, we could hit a roadblock or find that the caching was lying to us.

So, now we've started our round of betas, we're in the phase where we start to profile the code and put effort into optimisation. This doesn't just mean adding caching - it's taking a look at the actual code as it runs and ensuring we're doing things efficiently.

This phase has started - the tree should be more performant in the backoffice, for example, but we know of plenty of other places where we can make it lightning fast as we move closer to the main release.

Performance part 2

As you may know, Lucene is extraordinarily fast at reading data from the local filesystem. If you don't know it - that's OK, just trust me when I say it's very often used to index data to a set of small files that make it much quicker to read or query, taking some of the burden off your database. In my past life I ran a team that moved Vogue.co.uk entirely onto Lucene in fact, and our database server only ever got contacted by our Lucene indexer once in a while and started to feel quite lonely.

Our goal is to let everyone have Examine / Lucene indexing in Umbraco 5 with very little setup or even to know it's happening. In addition to our core coding practises and database design, this is one of the ways in which we'll ensure Umbraco 5 is scalable and performant, long-term. Because of the way our data layer ("Hive") works, we can combine providers together in a configuration file, so that whoever responds first with a piece of content wins.

So Shannon has put a lot of work over the past few weeks into writing a Hive provider for Examine. It's included in the Beta 1, but it's disabled by default as we've got a bit more work to do. If you enable the provider, you can install just as normal - with your SQL Server totally switched off, if you like - and edit / display content just fine. Here's another Screenr if you'd like to have a play:

Known issues / limitations

We're still in pre-release mode even though this is a Beta 1, so there will be bugs and performance issues, but we really are grateful for you giving it a go so that you can be a part of a stable Umbraco 5 release! We've put the issues list on the CodePlex release page to keep it in one place.

Collaboration - Umbraco 5 Contrib!

In my last post I asked for input on what you think we should do to make it a more welcoming place to contribute to the codebase. As a result of some of the great feedback, at one of the recent UK hackdays we started a new CodePlex project called Umbraco 5 Contrib. We'd love for this to be a great playground for anyone who wants to have fun making property editors, custom trees, custom Hive providers, dashboards, anything really. Of course, Umbraco remains open source and that will never change - you can still fork the main codebase and we're always grateful for pull requests! But if you'd rather work on plugins in parallel, now there's a place to do it in collaboration with us and your fellow community members. Check out the code, there's already a Wordpress Hive provider, an example Products Hive provider, and an example Dashboard on there thanks to Darren and David! And I know more are coming - Morten is looking at a Flickr Hive provider, and Lee on a Google Maps property editor.

That's all for now, I hope you enjoy the Beta 1 and as always let us know what feedback you have!

Happy bug-hunting and thanks again for helping!
Team 5

Thursday, November 10, 2011 by Per Ploug

It is with a huge amount of pride and happiness I'm able to introduce Courier 2.5 today. This new version is a major step forward and is a result of the experiences and feedback we got from launching Courier 2.0 in May.

Courier is our take on a deployment tool for websites built on Umbraco. It's focused around 2 things:

  • Easy access to performing a deploy directly from the umbraco backoffice, so even non-technical editors can do it
  • Keeping track of the dependencies and resources needed for a deployed item to function

Courier 2.5, will be a free upgrade to Courier 2.0, and Courier 1.3 as well!

Looking back

It's not a long time since Courier 2.0 was released. It was received really positive, but as with everything, it was not a perfect fit to everyone. And it soon became apparent that 3 issues were widely reported:

  • Timeouts due to too much data being transferred at a time
  • Courier collecting tons of data, juts to transfer a single document
  • No default support for uComponents and other community data types.

Major changes

Courier 2.5 solves those 3 common issues, along with another 80 bugfixes and smaller enhancements. Let's dive into the new big changes.

A dedicated task-manager

Pushing a big site with all its files and data is something that can take a while to do. First of all, it has to push all those changes across a webservice connection, and collect and process all the data on both ends. So with Courier 2.5, everything is handled by a taskmanager, which handles long running tasks in the background, queues tasks if something is currently being processed, and gives live feedback on the process of each task. This makes those long-running tasks rock-solid and at the same time provides status on how far your deployment is.

Support for uComponents and DAMP 2.0 built-in

Massive respect to both of these community projects. They have built up an amazing traction and is used on the majority of all Umbraco sites being developed today. So from version 2.5, Courier supports and understands these datatypes, and at the same time, we've added a ton of helpers and sample code to help other projects do the same, all available on the newly launched Courier Contrib project page (which I will blog about very soon)

Tweaking dependency collection

When you transfer a document, you don't just transfer that single document, Courier performs a analysis on the items you want to deploy, and then collect all the files and data for those items to function properly in their new environment.  A good example is that if you want to transfer a document, you would obviously also need to have its document type, template, css, images, macros and so on, transferred with it, or you would end up with a deployed page, that might not work.  We've done a lot of work to make sure that items transferred still work, but require fewer dependencies and are therefore faster to transfer. And we will continue to do that, even for minor releases.  

Finally, Courier 2.5 comes with a hugely refactored architecture, and simpler and more clear API to use, so for those who want to write extensions or run Courier from a console or WPF application, it has become much simpler. I will blog about these changes in the coming weeks as well.

Try it today

Courier 2.5 pre-release is available as a package file  and manual install files, and samples and documentation is found here. We will make sure to provide files and documentation on our.umbraco.org as soon as 2.5 is launched.

Launch discount

To celebrate the launch, we're for a limited time offering
Courier 2, Full version at a discounted price of just €99, that means you save €350

To get the discount, simply enter the discount code "fgdtt2237asds" on the Cart page, during checkout. Offer ends December 1st

Thursday, November 10, 2011 by Niels Hartvig

We've decided to drop our plans of XSLT Support in v5 (it will be around forever in Umbraco 4!). For some this will cause some stir, so trust us that we didn't do this just for the fun of it.

XSLT has served us really well. In Umbraco 4 all published content is cached in one big XML document, making XSLT the obvious choice for manipulating the documents. For those who have mastered XSLT it's been a well-known and very powerful tool when making Umbraco sites. It's highly flexible, optimized for hierarchical content and blazingly fast.

XSLT in Umbraco has been there since the very start, in fact since version 1.0 that I made using classic ASP. Back then XML was all the rage, websites were simple and relatively small. And Microsoft loved XML. That was eight(!) years ago - remember those days?

Since then a lot of things has happened. We've learned that XML doesn't solves all problems, websites have become more sophisticated in their information architecture and new techniques have emerged. Sometimes you have to let go of your darlings to discover something new. And to be brutally honest, XSLT haven't been a happy marriage for most people. In fact, it repeatedly comes out as the number one disliked 'feature' of Umbraco whether you talk to front-end devs or .NET devs. It's time for a break-up from version 5. Here's why:

  1. It's tough to learn, hard to master
    While powerful, XSLT is very complicated to master. There's simpler tools that does a better job in most cases and does a fine job in edge cases. XSLT only does a better job for the 1% who knows the very heart of it
  2. It's not in tune with modern website architectures
    In the good ol' days, websites had a very strict IA. That was a perfect fit for Umbraco's hierarchical XML and XSLT templating. Times has changed. Today website structures are more fluent, more taxonomy based and more diversed (ground principles may be hierarchical but most content is tabular and relational). This doesn't make XML storage - thus XSLT processing - an obvious fit.
  3. It would be slow
    Now that Umbraco 5 no longer stores data in a published XML, the core would need to simulate this in order for XSLT to work. It means converting data. And that means loosing the blazingly speed, that makes even haters accept XSLT today
  4. The support from the mothership is non existing
    While we don't lay down flat when Microsoft change direction, it's no secret that the native XSLT processor in .NET is old and dated. It's many years since XSLT 2.0 saw the light of the day, but the .NET implementation is still based on 1.0 - which for instance doesn't know what a "date" is! We could grab a non-official XSLT implementation, but that would mean taking the responsibility for maintaining it and those resources could be used much, much better elsewhere.
  5. The alternatives are better now
    The way we've implemented data access in v5 and combined with the razor view engine, means that making anything from basic navigations to complex taxonomy based lists is much simpler than even the most elegant XSLT. We'll be providing lots of guidance and examples in the editor to make it easy to get going fast.

Changing habits is never easy but even the most stubborn XSLT rebel alliance members I've talked to think the case is good. So do I, and remember that I liked XSLT so much that I added it to the core in the first place. The same joy I felt back then when the first result of XSLT processing inside Umbraco 1.0 appeared on my screen, I feel with Razor now. And when used together with the data wrapper called "Hive" in Umbraco 5, it's a thing of beauty and speed.

To help with the transitioning,  we've decided to make the razor tutorials on Umbraco.TV free. So what are you waiting for, really - go on, learn something new and build better websites tomorrow!

Thursday, October 27, 2011 by Matt Brailsford


hackathon

Picture by Rick Helsen

Whilst October 21st marked the launch of Umbraco v5 Alpha 3, it also happened to coincide with the Dutch Umbraco Users Group's (DUUG) regular get together to talk about all things Umbraco, which on this occasion, was also set to be followed by a day long, community organised hackathon learning how to get started developing on v5. Well, with timing like that, how could we not go? 

DUUG Festival

The DUUG festival was held at the MediArena studios, and housed a total of 60 attendees. The day started with an intro to the event, swiftly followed by a session by our very own Tim Geyssens comparing Umbraco v4 with v5, highlighting some of the major differences between the two.

After a quick coffee break, it was my turn to get down and dirty with Property & Parameter Editors in v5, explaining what they are, how they work and how to go about making them.

But I wasn't finished there, and after a tasty lunch, I was back on stage diving straight into Hive Providers. Very much a coders session, I went through the Hive with a magnifying glass, highlighting everything a developer needed to know to start developing their own providers today.

At this point we thought we'd hogged the lime light enough for the day, so handed things over to the guys from Spindoctor to demo their behavioural targeting plugin for Umbraco (very impressive) followed by diehard Umbraco community member Sebastiaan Janssen to demo his own progress with v5 so far.

Throughout the day, there were also a series of Made in Holland sessions, where the local community demoed and showcased their own Umbraco projects. With Jeroen Breuer demoing the latest release of DAMP, Sander Felius from Indivirtual showcasing their use of Umbraco on the Heineken One web / mobile sites and Richard Soeteman demoing his very own Media Protect package, it was great to see the group celebrating their local talent.

And with that, day 1 came to end, as all days should end, at the bar talking even more about Umbraco.

Hackathon

The hackathon was held at the amazing offices of These Days, which was the perfect venue for it, and started with a group brainstorming session to discuss what things people would like to have a go at. Afterwards, everyone split into groups based on their topics of interest, and the hacking began. Now, I'm not going to lie, it was a bit of a slow start, with people hitting niggley little problems getting things running. After a little guidance, and perseverance from the developers though, things started to take shape. And after a spot of lunch (seriously, do the Dutch have satay sauce with everything?) things were well and truly steaming ahead. You could almost hear everyone's brains ticking away. It was buzzing. The sounds of keys tapping only stopping for the occasional cheer and round of applause as peoples projects began to come together. 

The next thing we knew, it was nearly 5 o'clock. We couldn't believe it, we could have kept going for hours, if not another day, but we finished off our projects as best we could, and presented them back to the group. The sheer diversity was immense, with people developing all sorts of things from Skins, Hive Providers and Property Editors and even a Surface Controller, which hasn't even been documented yet, it was really amazing to see. At the end, the feeling we got was that people were excited by it, and were keen to keep tinkering. But don't just taken our word for it though, check out the video below, and you can hear it straight from the horses mouth.


In all, they day itself was so much fun, and for us was a great way to get some much needed real and candid user feedback. It wasn't all positive, but then how would we improve if it was, but in the coming weeks, we hope to address many of the issues that were raised and make it much easier and clearer for new developers to get started experimenting with v5. Watch this space...

And with that, we would like to thank the organisers of DUUG (Richard Soeteman of Soeteman Software & Martijn Beumers of Axendo, sponsored by Indivirtual) and the hackathon (Dirk De Grave of Promex & the guys from These Days) for giving us the opportunity to join them, and the community members who joined us for their continued love for Umbraco. We are nothing without you.

PS. If you are attending the Umbraco UK Festival in London, there is still chance to join our UK hackathon session on the Thursday before. Simply fill in our form, and we'll select 24 people at random to join us. Good luck.

Thursday, October 27, 2011 by Niels Hartvig

We're hiring!

Early (read: January would be fantastic) 2012 we'd love to add a JavaScript developer / Frontend-engineer / what-ever-you-call-your-self-as-long-as-you-are-a-team-player-and-make-magic-and-want-to-be-even-greater-at-what-you-do to our team.

You'll be a part of a wonderfully talented, amazingly creative, relaxed but dedicated, distributed development team working on the fastest growing and most radical Web CMS on the Microsoft stack - Umbraco of course. And we're hungry for doing much better and change the world of building websites to the better.

You'll be working closely with me, Per Ploug Hansen, Alex Norcliffe and our wonderful friends at Mark Boulton Design.

Could this be you? Then send me a link to a profile which contains:

  • A maximum of 400 words. Anything above will go straight to the trash, unread.
  • Must include links to work you've done (beyond implementing sites) and are *proud* of and have source code available. It could be an open source project, it could be jQuery plugins or something else that shows what you're made of.
  • Bonus points for links to reputation profiles such as Stack Overflow, Codeplex or similar (but this is *not* a requirement so don't let this hold you back)
  • We don't care how old you are, who you've worked for or what degree from what university you have. We solely believe in craftsmanship. Make sure to let that shine!
  • Where you live and if you'd be willing to relocate to Denmark (not a requirement, most of us work remote!)
  • Deadline: November 30th 2011!

We know that you're out there and we'd love to have you on board on this crazy, exhausting but epically giving journey.

Love,
Niels…

Friday, October 21, 2011 by Alex Norcliffe

Hi everyone! It's time to release another Alpha of Umbraco 5 just in time for the weekend.

For a quick intro on what our Alphas have entailed so far, some background on the v5 effort, and some tips and tricks on getting Alphas up and running, check out the following posts:

- Umbraco 5 Alpha 1 Release

- Umbraco 5 Alpha 2 is out today

You can download the Alpha 3 web application zip from CodePlex, and within minutes of this blogpost going up our status page will reflect the latest updates too. I'll cut to the chase because this release has a massive amount of new features and improvements which we'll hope you'll enjoy testing!

What's in the Alpha 3

Here's a list of some of the improvements. As you can see, things are coming together pretty quickly lately - happy days.

  • Permissions!
    • Permissions grid on user groups editor (puts the permissions on the "system root" as a handy way of editing top-level permissions in one place)
    • Permissions grid on content & media.
    • Permissions are pluggable!
  • Rollback context menu on Content
  • Publish items from context menu
  • Move / Copy from context menu on Content & Media
  • Recycle bin
    • This is essentially a Move operation when you "delete" items - and the Recycle bin now also has permissions!
  • Templates tree shows Razor files as a tree with MVC layouts as a top node, and files that depend on the layout underneath
    • Click 'Create' on the context menu for an existing Layout to create a new template with auto-setup of Layout tag and Sections
  • New Languages tree including editing of fallbacks.
    • The Dictionary is not in Alpha 3 yet, but language fallbacks will be used when grabbing dictionary items. If a language is not found for an item it will use the language fallbacks to look elsewhere.
    • Languages are saved in a deep-config file at /App_Data/Umbraco/Config/umbraco.cms.languages.config, so compatible with continuous integration setups.
  • TinyMCE improvements
    • Insert hyperlinks to media items
    • New Insert Media dialog
  • A lot of other stuff under the hood, e.g. Hive relations & improvements, using Permissions to protect your own methods etc.

I hope you'll agree, it's quite a big list since Alpha 2! Let's have a quick scan at some of these new features.

Permissions

Permissions in Umbraco 5 are very powerful, and of course you can plug in your own permissions. We'll cover that in one of our upcoming tutorial posts. The intention for the Permissions model in v5 is to:

  • Let you inherit permissions from parent nodes
  • Let you override those inherited permissions - including denying a permission that is allowed further up the tree
  • Let you assign permissions to user groups so you can add/remove users from those groups at will to have the permissions apply to the users easily
  • Let you protect your own methods in your plugins with either built-in permissions, or even your own custom ones that come with your plugin

Umbraco 5 comes with an Administrators user group which has all permissions set to "Allow". Let's make a new user group:

image

Here I've clicked the "Allow" column to grant everything, and then denied the Create, Publish and Save permissions.

Let's make a new Dummy account and make it a member of that new group:

image

Now, logging on as that Dummy user, and right-clicking the Homepage, I don't have the Create, Publish or Save context menu items:

image

If I go to edit the Homepage and try to click Publish, I get told that I can't:

image

But those permissions were for all content, because I applied them directly to the user group. This sets up the "default" permissions between the User Group and the root System node to give you a handy way of setting system-wide permission sets.

Let's say I want to leave those defaults, but allow my Dummy user to create content under the Faq node. As an admin user, I'll go to the Faq node and choose "Permissions" from the context menu:

image

Here I've clicked on the Allow radio button for the Create permission. Let's save that and log back in as the Dummy user. Right-clicking on Homepage still shows no Create option, but right-clicking the Faq node allows me to Create:

image image

As you can see, Permissions in Alpha 3 are quite powerful already but we have more improvements on the way - the main one being speed. Right now (especially if you run on SqlCe) you'll notice some tree operations are a bit slow because we haven't optimised it fully yet, but performance of these items will massively improve as we get closer to a release.

Improvements to the Template editor

In Umbraco 4, there's a lot of lovely secret sauce to represent ASP.Net Master Pages (i.e., Templates in v4 terminology) as a hierarchical tree. It's an example of the Umbraco mantra: use regular technology for those who like it, but give a friendly GUI for those who don't need or want to know the details.

In Umbraco 5 as you may know we've switched to MVC3 rather than WebForms. What that means is the "Template" technology underpinning it is entirely different. It's taken some work, but in Alpha 3 we now have Template representing hierarchically. Here you can see the DevDataset layout which I was given as part of my installation, and I can expand it to see what Views (i.e. Templates) use that Layout:

image

Furthermore, if I right-click a Layout and choose "Create", and complete the wizard step, I get given a new template with the Layout property set and the @section elements available to me so I can get going quickly:

image

We'll be improving this further to add in some of the features in v4 around inserting fields and macros of course, but we think this is a great step in the right direction to give users similar tools even though we're now on top of the MVC stack. Let us know what you think!

Known issues / limitations

As usual, it's an Alpha, so there will be bugs and performance issues, but we really are grateful for you trying out the Alpha so that you can be a part of a stable Umbraco 5 release! We've put the issues list on the CodePlex release page to keep it in one place.

Collaboration

Today there's an Umbraco User-Group meetup in Amsterdam, and tomorrow (Sat 22nd October) they're having a hackday on Umbraco 5. On November 4th, there's the UK meetup and all the hacking that will ensue. On November 10th, I'll be in Brussels to talk about v5 too. We love being part of such an awesome community, and make no mistake - if you'd like to contribute to the codebase for Version 5, please do drop us a line! As I said last time, the best way is to grab the sourcecode from CodePlex, take a look at our developer Wiki (which is a work-in-progress), and once you feel acclimatised to the codebase or want to ask questions, we'll meet you on the Our forums to help you with your first pull request!

Alternatively, if there are ways in which you feel we could take steady, accessible steps to reducing any barriers for you to want to dig into Visual Studio and make that first pull request, please let us know too.

 

Happy bug-hunting and thanks again for helping!
Team 5

Wednesday, September 28, 2011 by Alex Norcliffe

It's a couple of weeks since we put out Alpha 1 and the response from the community has been incredibly helpful. So, today it's time to get a couple more features into folks' hands with another drop - Alpha 2 is now up on CodePlex for your bug-hunting pleasure! We've also updated the status page (our codename for v5 is "Jupiter"). We keep this updated once or twice per week, so it's worth a bookmark if you're keen to track progress.

You can download Alpha 2 from this CodePlex release page.

Umbraco & Version 5

The Alpha releases (and the CTP earlier in the year) are all about getting a build into the hands of developers ASAP to help with feedback. If you're coming to this page new to Umbraco or the v5 project, we have a host of videos of some of the talks we gave earlier this year over on the CodeGarden 2011 website. Each session contains a ton of information about Umbraco v5: what its all about, why its is being built from the ground up, how its being built and the architecture behind it. Check out the previous post for some background and those links.

Alpha 2 headlines

First of all a quick reminder - Alphas are buggy and incomplete! It's way beyond the sketch phase, but it's no oil painting - yet; with your help we can get it there and we are incredibly grateful for all who have taken Alpha 1 for a spin so far and given feedback on the forums or issue logger. With that said, we're really excited about the major additions in Alpha 2:

Hostname support

Over the past few weeks we've worked to enable multi-tenancy support in the Alpha 2, commonly known as adding "hostnames" to content nodes. Hostnames now support port numbers too!

image

Adding a hostname to a piece of content effectively makes that node the "root" of a website for routing, so when you add hostnames and then navigate to the properties panel of some content, you can see the host is now part of the Url generation for that node.

image

Adding macros to content

We've also worked on adding a new dialog box to TinyMCE for inserting a Macro into content just as you can with v4, and rendering it out in the front end. Macros are also now rendered in the editor (which is optional; you can turn it on in the Macro's properties). You can add parameters to a macro - which is either a Partial View, or a Child Action in MVC3 parlance - in the Macro editor under the Developer section:

image

Choosing this Macro in the rich text editor "Insert Macro" dialog box will then present those parameters together with the correct Parameter Editor for the type you selected. Parameter Editors are a new addition to the v5 codebase which are an extension of the same Property Editor architecture used to power the Content & Media Editor system

image

Here I've set the Age parameter to 82, shown in the richtext editor because I've enabled rendering in the Macro properties:

image

And after publishing my Homepage it's rendered in the front-end. The below is an example of rendering the content containing the embedded macro using the Homepage.cshtml template, which is included in the "Dev Dataset" package that I chose during installation:

image

What else is in Alpha 2

There are plenty of other improvements and changes in the Alpha 2, although a lot don't have a demonstrable "UI". Alpha 2 is intended to be tested for the following:

  • Create, Edit, Delete: Data Types, Documents Types (both Content & Media), Content, Media, Users, User Types, Macros, Stylesheets, Scripts, & Templates
  • Create & configure Dashboards
  • Create media & upload images
  • Lots property editors
  • APIs to create plugins: Trees, Editors, Menu items, Editors, Surface controllers, Property Editors, Dashboard match rules, Dashboard filters, Tasks, Macro parameter editors
  • Partial View & Child Action macros including caching and TinyMCE support
  • Chrome and IE 9 support
  • Hostname assignment and routing
  • Keyboard shortcuts: We've got some nice base code in there, an example of which is that Ctrl-S saves in almost all places

Getting started

Whilst we refine the alphas, it's pretty tricky to give a good & reliable "upgrade" experience, so for best results if you've tried Alpha 1 already, please try Alpha 2 with a blank database and IIS root.

Getting started with Umbraco v5 is the same as v4: you'll need to download the zip file from CodePlex, unzip the contents to your desired location, then point an IIS/IIS Express instance at that location. Don't forget to set your app pool to .NET 4 Integrated Mode! Note: Before unzipping, you may also need to right-click the zip, go to Properties, and click "Unblock" depending on your Windows security settings and chosen unzip tool.

Once you have IIS running, just visit the install page to begin the installation: http://localhost/install (where localhost is the host name of your instance). Be sure that you have the correct IIS file permissions setup just like in v4. When the installer begins you can then choose to use SqlCe embedded database or enter details to connect to a Sql Server 2008 instance. (MySql support is not tested in the Alpha 1 but is coming!)

After the database has been installed you can optionally install the 'DevDataset' package which will just pre-populate the Umbraco instance with some sample data that we've been using during development.

One installed, the default username and password for the backoffice is "admin" and "test" but you can change and edit this in the User section once you're in.

We've included the templates from the 'DevDataset' package in the default install even if you don't choose to install that package, for easy reference to some of the Razor syntax available in the Alpha 1. As this syntax improves in later releases and gets closer to 4.7.1 we'll be doing some more blog posts to give examples!

Getting involved

Umbraco is what it is because of its amazing community, and we're always in awe of the help and feedback we get. If you'd like to help find or fix bugs, or contribute to the codebase, please do get in touch. The best way is to grab the sourcecode from CodePlex, take a look at our developer Wiki (which is a work-in-progress), and once you feel acclimatised to the codebase or want to ask questions, we'll meet you on the Our forums to help you with your first pull request!

Known issues - what not to worry about

The CodePlex release page is the best place for this so that we can update it in one place.

 

We've got more good stuff to come - in the meantime, happy bug-hunting and thanks for helping!
Team 5

Monday, September 26, 2011 by Niels Hartvig

package-repo-homescreen

Today we're rolling out a big update to the Umbraco Package Repository. That's what you see when you browser packages from within the Umbraco Back Office. The first version of the Package Repository saw the light of the day in 2006 and haven't really been undated since, so it's actually our first update. Much overdue! 2006 was year 3 BO (Before Our), which means that everything we all love the most about the worlds most friendly community, hasn't been reflected in the Package Repository. At the same time the UX of the original package repository was designed at a time where there was nine (9!) public packages available done by two different people. Today there's more than 450 made, maintained and supported by hundreds if not thousands of developers!

Search, Karma and videotapes screenshots

package-repo-details

The new package repository is faster to browse, faster to comprehend and faster to install. On the new home screen you'll see a list of the most popular packages ordered by a combination of downloads and karma. If you're logged in on Our you'll also see a list of your personal favorites (again based on the packages you've downloaded and given karma). From any screen you can see details and install the package and on the package screen itself you have all the details, including screenshots and technical details such as Trust level and .NET version.

package-repo-search

We've also added a super powerful search which is present on any page in the repository letting you instantly search among all approved packages and again see details and install directly from the search result. The super fast suggestive search is handled by über wonderful Examine and clever usage of jQuery templates which is a great subject for a later blog post.

We're absolutely thrilled with the result and we hope you'll like it too! You can try it out for yourself - the improvements are already present in your existing Umbraco installation!

Thursday, September 22, 2011 by Gareth Evans

Welcome back!

Part 8 of the feature walkthrough continues with features available in umbraco 4.7.1
Today, I'm covering the new umbraco razor @Library added to the core.

This is now where all of the helper methods like GetNodeById will live, though they're aliased from @Model still, and any new functionality that may be added in the future.

By the way, in case you missed it, the uComponents team has already made a great start on the Razor Data Type Models! Go Team, #h5yr
Read all about this new feature in the last blog post here: /follow-us/blog-archive/2011/9/18/umbraco-razor-feature-walkthrough-part-7.aspx

@Library introduction

After writing a few methods such as NodeById and MediaById, I realised that these have nothing to do with the current @Model / DynamicNode / CurrentNode and they would be much better added to a seperate class.
After a discussion with a few of the more vocal razor users, we settled on creating a library class that can be accessed with @Library.
This class is of type RazorLibraryCore in the namespace umbraco.MacroEngines.Library.

There are a few methods available on it. This post and the next post will cover those features.

@Library Mix-Ins/Extensions - Add your own

@Library should allow you to create an extension method of your own and then call it from Razor.
Just create a simple extension method:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using umbraco.MacroEngines.Library;

namespace RazorLibraryMixInTest
{
    public static class MyRazorLibraryExtensions
    {
        public static string Foo(this RazorLibraryCore library)
        {
            return "Bar";
        }
    }
}

Then, simply call it from your Razor script:


@using RazorLibraryMixInTest
@Library.Foo()

Coalesce, Concatenate and Join

These new methods on @Library allow you to manipulate multiple string parameters to combine them in various ways.
Coalesce will take the first non-null, non-DynamicNull property value and return the value of it.
Concatenate will just concatenate [really?] the parameters you pass in together as if you had gone @Model.property + @Model.property2
and Finally, Join will do the same as Concatenate, except takes a seperator parameter as the first parameter.

All of these methods are DynamicNull safe, so they'll ignore properties that don't exist on your document types.
Here's an example, they take params object[] so you should be able stack up as many properties as you need.

@Library.Coalesce(@Model.property1, @Model.property2, @Model.Name)

Concatenate works the same way. Join has a slightly different syntax:


@Library.Join(",", @Model.property1, @Model.property2, @Model.Name)


NodeById, NodesById

@Library.NodeById is the functionality from the 4.7.0 release where you can go @Model.NodeById(1546)
While building that implementation, I made the decision to add a method that took a list of ids and returned a DynamicNodeList.
This overload was inconsistent, as the name suggested that it returned a single node, when in fact it returned a list.
I've renamed this overload as NodesById.

Other than this change, the implementation is the same.

@Library.If

Library.If is more syntactic sugar for Razor than anything. It wraps a simple ternary:


<strong>@{ @Model.booleanProperty ? "valueIfTrue" : "valueIfFalse" }</strong>
//is equivilent to:
<strong>@Library.If(@Model.booleanProperty, "valueIfTrue", "valueIfFalse")</strong>

Yes it's actually longer, but often when using embedded ternaries, e.g. inside an attribute value, you had to add extra brackets to get razor to parse the code properly.

@Library.ToDynamicXml

@Library.ToDynamicXml  provides some methods to convert various types to DynamicXml. The overloads are as follows:


public DynamicXml ToDynamicXml(string xml)
public DynamicXml ToDynamicXml(XElement xElement)  
public DynamicXml ToDynamicXml(XPathNodeIterator xpni)

These methods are pretty much self explainatory, but the XPathNodeIterator method will allow you to convert your old XSLT Extensions to be easily accessible within Razor.
This is intended as a stepping stone only, if you're writing a new interface, you should return it as a List<StronglyTypedObject>

@Library.Truncate

This method is used to take a string (or a block of HTML) and truncate it to a specific length.
It will optionally add an elipsis on the end for you (… ) and it is HTML Tag aware.

There are a number of overloads, but the most basic use case is this:


@Library.Truncate(Model.rteContent,100)

This will return the content of rteContent, but only the first 100 characters. Characters that are tags (e.g. <strong>) will not be counted towards the 100, and a … will be added on the end.
If the truncation occurs in the middle of a tag, (e.g. there'd be no </strong>) the tag will still be closed.

Disclaimer
: I haven't confirmed that the truncation will always close tags properly, I've fixed a number of issues that I've seen while testing with my own production sites but there may be cases where this method truncates wrongly, or breaks a tag. I suggest carefully testing to make sure it works for your use case.

Here are the other overloads:


public IHtmlString Truncate(IHtmlString html, int length)
public IHtmlString Truncate(IHtmlString html, int length, bool addElipsis)
public IHtmlString Truncate(IHtmlString html, int length, bool addElipsis, bool treatTagsAsContent)
public IHtmlString Truncate(DynamicNull html, int length)
public IHtmlString Truncate(DynamicNull html, int length, bool addElipsis)
public IHtmlString Truncate(DynamicNull html, int length, bool addElipsis, bool treatTagsAsContent)
public IHtmlString Truncate(string html, int length)
public IHtmlString Truncate(string html, int length, bool addElipsis)
public IHtmlString Truncate(string html, int length, bool addElipsis, bool treatTagsAsContent)

Rather than explaining each of the overloads, which would be boring for all of us, there are 3 input types, and for each of those, 3 overloads.
addElipsis controls whether the … will be added and "treatTagsAsContent" effectively disables the HTML tag parsing portion of this method.

@Library.StripHTML

As the name suggests, this method will strip the HTML tags out of a block of HTML and return just the text. For example:

This is some text <strong> and this is some bold text</strong> in a sentence
Will become:
This is some text and this is some bold text in a sentence

This method will not deal with <script> or <style> tags properly, as they can have nested < and >.

Here are the overloads:


public HtmlString StripHtml(IHtmlString html)
public HtmlString StripHtml(DynamicNull html)
public HtmlString StripHtml(string html)
public HtmlString StripHtml(IHtmlString html, List<string> tags)
public HtmlString StripHtml(DynamicNull html, List<string> tags)
public HtmlString StripHtml(string html, List<string> tags)
public HtmlString StripHtml(IHtmlString html, params string[] tags)
public HtmlString StripHtml(DynamicNull html, params string[] tags)
public HtmlString StripHtml(string html, params string[] tags)


These methods are fairly self explainatory, but the simple use case is this:


@Library.StripHTML(Model.rteContent)
If you only wanted to strip specific tags, such as the dreaded <pre>, you could do this:


@Library.StripHTML(Model.rteContent, "pre")


Conclusion:

I've got one more blog post planned to introduce the last of the features that are in umbraco 4.7.1

I'm Gareth Evans, Follow me at @agrath on twitter, and here's a few links:
The new Razor forum on our.umbraco: http://our.umbraco.org/forum/developers/razor
Codeplex for any feature requests or bugs: http://umbraco.codeplex.com/

Read more from the Umbraco Razor walkthrough series

Part 1
Part 2
Part 3
Part 4
Part 5
Part 6
Part 7
Part 8

Sunday, September 18, 2011 by Gareth Evans

Welcome back!

Part 7 of the feature walkthrough continues with features available in umbraco 4.7.1
Today, I'm covering the new features available to help you write markup faster with less conditionals - if statements.

IsHelper

I like elegant code, especially in my Razor templates, and I found myself repeatedly having to write @foreach loops with a counter variable (e.g. int i = 0; i++) in order to track what node I was iterating over. In part 6, I introduced a new method called Index (aliased as position) which lets you get the current position.

This index property has been combined with the parent and children methods on DynamicNode to solve a lot of your standard requirements when iterating over nodes and generating HTML. Since generating HTML is the primary job of Razor, so we want it to be as concise and as quick as possible.

IsHelper (this is the internal name) methods all work the same, and have 3 overloads. They're basically ternary operators, but work a little nicer in that they're easy to embed in properties and quicker to write as you don't need so many brackets to make Razor understand them.
The general idea behind IsHelper is to allow you to dynamically inject class names and style attributes onto your nodes, based on their position within the list you're iterating. You can use this for a variety of things such as alternating row colours or fixing the margin/padding on the first/last item etc.

All DynamicNodes (except for the top most node) belong to a set, whether that's their parents list, or a special set created in context such as the result from Ancestors
This means that when you're iterating over a set, the node will belong to that set, no matter where the original node was sourced from in the tree.
What this means is that each node as you iterate has a concept of the list that contains it (that you are iterating) so a method call to that node can determine it's position in the iteration.

Here are the overloads:
IsHelper() => bool
IsHelper(string valueIfTrue) => valueIfTrue || emptyString
IsHelper(string valueIfTrue, string valueIfFalse) => valueIfTrue || valueIfFalse

IsHelper is just an internal name though, so when calling them, you use the name of the specific IsHelper you want.
These are:
IsFirst
If this is the first node in a set
IsNotFirst
If this is not the first node in a set
IsLast
If this is the last node in a set
IsNotLast
You guessed it! If this is not the last node in a set
IsPosition, IsNotPosition
Is the current node at index? Example: @item.IsPosition(3)
IsModZero, IsNotModZero
Is the current node position evenly dividable (modulus) by a given number? Will be true for every 3rd node: @item.IsModZero(3)
IsEven, IsOdd
Shorthand versions for IsModZero(2) and IsNotModZero(2)
IsEqual
Tests if the current node in your iteration is equivalent (by id) to another node

IsDescendant,IsDescendantOrSelf
Is the current node a descendant of another specified node. Would usually be used if your node set wasn't contigious, and came from a Descendants & Where for example
IsAncestor,IsAncestorOrSelf
Is the current node an ancestor of another specified node. Would usually be used if your node set wasn't contigious, and came from a Descendants & Where for example
The direction of this method is read like this: "Is the current node an ancestor of this node"

As all of these methods work the same way, I've only given you one example. Substitute the different helper names to see the result:


<ul>
@foreach(var item in Model.Children)
{
    <li style="color:@item.IsEven("red","blue")">@item.Name</li>
}
</ul>

DynamicNode.Where

In a similar vein to IsHelper, DynamicNode.Where allows you to execute a predicate against the current node, and return either a bool, or valueIfTrue or valueIfFalse. The overloads are the same as IsHelper.
Here's an example:


<div class='@Model.Where("width > 200", "wide", "notwide")'>
...
</div>

[I]RazorDataTypeModel - Datatype Developers Property Data / Model interface

This is going to be a bit of a wordy one, but bear with me,

In 4.7.0 (or it could been after 4.7.0 for 4.7.1, I forget - trying to get my commit cape)
I added a special hardcoded up-cast (well I call it that, the bit of DynamicNode that converts strings to their types depending on their content) for the uComponents multi node tree picker.
I did this because I used it on a site and I thought, hey, wouldn't it be cool if the selected nodes came back as a List<int> instead of a CSV list? 

Obviously, I wasn't thinking, because this didn't make sense; I wasn't going to add hard coded types for every datatype available, and as indisposable as uComponents is, it still shouldn't have
support for it's return types built into the core.

It wasn't until I was talking to Jeroen on the last day of Codegarden 2011, the developer of DAMP (a multiple media picker) who had just shown the beta of 2.0 that I realised that it might be
useful if datatype developers could provide a way for their data type to return an instance of a class instead of the underlying data from the property (which is always a string in v4 - this is what the
upcasting code does)

Enter IRazorDataTypeModel, excuse the name.. but it's a model for your data type for Razor, so it makes sense in context.
It works like this:
1) Data type developer or development team creates (and decorates) a class to use as the Model for their data type (or consumer if you're really keen)
2) The data type is added to a document type and used on a content item
3) The property data is accessed in a Razor script file with @Model.propertyName
4) The data type model class is returned instead of the underlying property data

Cool.. so if you're a data type developer, how do you use this?
I've intentionally tried to keep this simple, so that very little work is required by data type developers, yet performance should still be good.
To do this, I've created a custom attribute which is used to signify to DynamicNode that you have a model class for your plugin.
This attribute defines the GUID of your data type (which is defined in the Id property of your data type itself as well) and provides a way that the runtime can identify your class as a data type model,
and determine what editor control it's for, without instantiating that model class.
Your model class must have an empty constructor, but all .net classes have this by default, unless you define constructors, in which case you must define an parameter-less constructor.
The model class must also implement the IRazorDataTypeModel interface, which is a single method that DynamicNode uses to pass the property data through to your instance for the node.
This method returns the instance of your data model.

Right, so here's some sample code, this class will be returned for the DAMP media picker (the GUID you see below is for DAMP), but it's obviously not a complete example, just a proof of concept.
It's up to the data type developers to create their own implementations.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using umbraco.MacroEngines;
using System.Xml;
namespace RazorDampModel
{
    [RazorDataTypeModel("EF94C406-9E83-4058-A780-0375624BA7CA")]
    public class DampModel : IRazorDataTypeModel
    {
        public object PropertyData;
        public int CurrentNodeId;
        public XmlDocument AsXml;
        public bool Init(int CurrentNodeId, string PropertyData, out object instance)
        {
            this.PropertyData = PropertyData;
            this.CurrentNodeId = CurrentNodeId;
            AsXml = new XmlDocument();
            AsXml.LoadXml(PropertyData.ToString());
            instance = AsXml;
            return true;
        }
    }
}

You can see in this example, the GUID for DAMP being passed in the RazorDataTypeModel attribute, and the single required method from the IRazorDataType model interface, Init.

This method receives the current node id as an integer and the PropertyData as an string, and is expected to return an instance of the class in the "out object instance" variable (hint: you could return 'this' here, or an immutable type such as string, int)

Once this is done, that DLL can be deployed as part of the plugin OR compiled into a seperate assembly and dropped into the bin folder.
This means that if you use a data type that hasn't implemented this feature, you can write the model class for that data type, submit it to the data type developer, and use your implementation locally until it does get included.

For the example above, you'd be able to access the XmlDocument field labeled AsXml like so:


@Model.propertyName.AsXml.OuterXml

This would of course return the outer XML of the XmlDocument to the razor template.
I can't wait to see how this feature gets used!

I've started a project on codeplex with a few examples, but they're just quick ones I hacked together when building a recent site:
http://razordatatypemodels.codeplex.com/




Conclusion

I've got quite a few more blog posts planned for the coming few days, introducing all the new features that are in umbraco 4.7.1

I'm Gareth Evans, Follow me at @agrath on twitter, and here's a few links:
The new Razor forum on our.umbraco: http://our.umbraco.org/forum/developers/razor
Codeplex for any feature requests or bugs: http://umbraco.codeplex.com/

Read more from the Umbraco Razor walkthrough series

Part 1
Part 2
Part 3
Part 4
Part 5
Part 6
Part 7
Part 8

Friday, September 16, 2011 by Peter Gregory

When Umbraco Examine was released many developers including myself thought all my search woes were solved. I figured I would be able to just fire up Umbraco, configure examine and BAM! I would have a search engine that gave me exactly what I needed. But after giving it an initial go and trying it out, most developers left it alone and put it in the too hard basket as they did not understand what was going on under the surface or why their search results were not what they expected. What I want to try and achieve in this post is to demystify Umbraco Examine and provide a few tips I have picked up while working with it.

What is Examine?
First, for those that don't know what I am on about let's just start by telling you what Examine is.  Examine is a provider based Indexer/Searcher API and wraps the Lucene.Net indexing/searching engine. Examine makes it super easy to work with Lucene indexes and allows you to query or index almost any content with very little effort. Lucene is SUPER fast and when managed correctly can allow you to open up super fast searching on absurd amounts of data.

What is Umbraco Examine?
Umbraco Examine is the Umbraco implementation of Examine. Examine is not exclusive to Umbraco and can actually be used as a completely stand alone component on any project that needs a fast Index. Umbraco Examine is a combination of Umbraco, Examine and Lucene.Net and uses Umbraco as the data source for its Lucene index. Lucene has been a part of Umbraco from the early days and powers the back office search.

The Basics of Examine
Out of the box Umbraco comes configured to index content and members in the back office for the back office or internal search engine that appears in the header. As Examine is configuration driven you can quickly modify or set up indexes and searchers. The best place to start is with an index set.

You configure an index set in the /config/examineIndex.config file. This file defines our indexes. As mentioned earlier, there are two internal default indexes configured in this file, and they are called "InternalIndexSet" and "InternalMemberIndexSet". Index sets are extremely easy to set up. The quickest way to get your index set up and running is with a single line of code.


<IndexSet SetName="WebsiteIndexSet" IndexPath="~/App_Data/TEMP/ExamineIndexes/WebsiteIndexSet/">

Really, that is all you need.  You can actually leave out a majority of the configuration and Examine will revert to the default which is to index all your data and all your properties. But if you want a little more control you can use the full configuration options as shown below.


<IndexSet SetName="WebsiteIndexSet" IndexPath="~/App_Data/TEMP/ExamineIndexes/WebsiteIndexSet/">
    <IndexAttributeFields>
        <add Name="id" />
        <add Name="nodeName" />       
        <add Name="updateDate" />
        <add Name="writerName" />
        <add Name="path" />
        <add Name="nodeTypeAlias" />
        <add Name="parentID" />
    </IndexAttributeFields>
    <IndexUserFields>
        <add Name="bodyText"/>
        <add Name="metaDescription"/>
        <add Name="metaTitle"/>
    </IndexUserFields>
    <IncludeNodeTypes>
        <add Name="TextPage"/>
    </IncludeNodeTypes>
    <ExcludeNodeTypes>
    </ExcludeNodeTypes>
</IndexSet>

Let's break it down.

SetName defines the name that we will use to reference this set in configuration and code later.

IndexPath defines where the actual index will reside.  The standard root location in Umbraco is in App_Data/TEMP/ExamineIndexes folder

<IndexAttributeFields>
This is where we define which of the standard properties (not user defined properties) we wish to index.

<IndexUserFields>
These are the properties that we have defined against our DocumentTypes that we want to index.  Use the property aliases.

<IncludeNodeTypes> & <ExcludeNodeTypes>
I like to think of these as the white list and the black list. Basically figure out if you have to include more or exclude more nodeTypes. Generally which ever one requires less configuration is the one that you should use but that is completely up to you and how much you like typing.

Just remember that creating errors in index configuration is easy if you make spelling mistakes.  You will know if you have made errors as your index will either not create or not include the features you expect.  We will look at how to check your index content later with Luke, a Java based tool that allows us to look into our index and run queries against the index directly.

So now we have defined our index, we actually now need to tell Examine what to do with this configuration.  In our next step we need to configure our Indexer and our Searcher.  This is done in the /config/ExamineSettings.Config file.

This file contains two main sections, <ExamineIndexProviders> and <ExamineSearchProviders>

Setting Up your IndexProvider
We will start out by creating our ExamineIndexProvider. As the name suggests this tells Examine how to manage our Index.  Again, contrary to what you may have been told you can actually leave out most of the optional configuration and simply specify your indexer in a single line of code.


<add name="WebsiteIndexer" type="UmbracoExamine.UmbracoContentIndexer, UmbracoExamine"/>

But if we want more control we can define our Provider by creating the configuration as follows:


<add name="WebsiteIndexer" type="UmbracoExamine.UmbracoContentIndexer, UmbracoExamine" 
    dataService="UmbracoExamine.DataServices.UmbracoDataService, UmbracoExamine" 
    supportUnpublished="false" 
    supportProtected="false" 
    analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net" 
    enableDefaultEventHandler="true"/>

Let's look at each of the options.

name: This is the alias that we are going to give our indexer. You may notice above that we have given it the name WebsiteIndexer. If maintaining the naming conventions (Suffix of Indexer, Searcher, IndexSet) Examine will be able to wire up the parts easily and we can omit certain configuration elements. If however we decided that we wanted to call our indexer something else we would need to specify the indexSet attribute so that our indexer knows what it is wired up to.

type: Because we are indexing Umbraco Content we need to specify the type as being UmbracoExamine.UmbracoContentIndexer.

dataService (optional): The type that this provider will instantiate in order to query Umbraco for the data that it requires. Generally this shouldn't need to change unless you want to use test data from a non-Umbraco source or you have very custom requirements.

indexSet (optional): Explicitly specifies the index set to use. Generally this is wired up based on naming conventions.

supportUnpublished (optional): As the name implies specifies whether or not you want to index unpublished content.

supportProtected (optional): Set this to true if you want it to index your protected content.

analyzer (optional): The Lucene.Net analyzer to use when storing data. There are a number of different analyzers available and they all do slightly different things. If you want a good overview of the different analyzers check out http://www.aaron-powell.com/lucene-analyzer

enableDefaultEventHandler (optional):Will automatically listen for Umbraco events and index when required. If you are relying on the standard Umbraco events, setting this False could be a simple way of disabling indexing if required.

Now that Examine knows how to index our site. It should be reading the config and slamming your content into an index.

Checking your Index
The easiest way to check that your config is correct is to first go and look in the IndexPath that you specified in your IndexSet.   You should see a set of folders and files. If you want to check the contents of the index you can do this using a tool named Luke which you can either download or launch from this page http://www.getopt.org/luke/.

Using Luke, you can open up your index and see its content. It should give you statistics on the elements, number of documents indexed etc. If however you don't see indexed items then it's likely you have either made a mistake in your indexSet configuration or it has not indexed yet. When you are finished with Luke it's important to close the index to get Luke to release its lock on the files.

Luke can also be used to run raw Lucene searches against your index. This can be helpful during development or to debug your queries. Later on in this document you will start to learn how these raw queries fit together.
Setting up your Search Provider
We have a provider for our indexing, now we need to set up our search provider.  We do this by adding a new provider in the <ExamineSearchProviders> section of the examinesettings.config file.  The simplest search provider element looks like this:


<add name="WebsiteSearcher" type="UmbracoExamine.UmbracoExamineSearcher, UmbracoExamine" analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net"/>

Let's break it down, again.

name: This is the alias for our search provider.  Again if we stick to naming conventions we can omit the indexSet attribute as it is able to automatically determine this from its own name.

type: Because we are searching Umbraco content we specify the type as UmbracoExamine.UmbracoExamineSearcher as the type of search provider.

analyzer (optional): Just like the indexer our search provider also needs to know what type of analyzer to use when searching the index. Make sure that your search is using the same analyzer as your indexer. Think of it as the language the indexer writes, the searcher needs to be able to read, just like if you write in English don't expect to be able to read French.

Awesome! Our configuration is now complete! Our site should now be indexing our content and has a way of accessing it via a search provider.  However, configuration is only part of the story... we now need to do some coding.

Querying with Examine
So without further ado let's cut straight to the chase and focus on querying your indexes.  We are going to look first at the Fluent API which allows you to quickly create queries using an easy to learn chaining syntax, and then at building your own Raw Lucene queries for more complex scenarios.

Fluent API.
Examine contains a powerful fluent API that enables you to create searches by chaining up query conditions and then pass that chain to Examine to return results.  Let's look at formulating a query.
First we need to specify our search provider that we want to do the searching for us.


var Searcher = ExamineManager.Instance.SearchProviderCollection["WebsiteSearcher"];

The alias "WebsiteSearcher" comes from the searcher that we have configured examinesettings.config file.

Next we want to create an instance of ISearchCriteria that we will use to build our search query.


var searchCriteria = Searcher.CreateSearchCriteria();

Next we are going to chain up query. Lets look at one of the most common tasks you would be using examine for, which is to search a set of nodes for a particular word. We have a number of operators available to us to do this.  These are Or(), And(), Not() and Equals(). Lets look at the Or() operator.


var query = searchCriteria.Field("nodeName","hello").Or().Field("metaTitle","hello").Compile();
var searchResults = Searcher.Search(query);
yourRepeater.DataSource = searchResults;
yourRepeater.DataBind();

Now this is where things often go wrong for developers and why they often get a little frustrated. What they assume is that this query is going to return them results where either nodeName or metaTitle contain hello. But what actually happens with this query is that by default Examine reads this query as nodeName MUST contain hello or metaTitle SHOULD contain hello. So you will often get odd results or none at all.

So Examine feeds the query to Lucene as follows.

+nodeName:hello metaTitle:hello

The + specifies that it MUST meet this rule.

Fortunately there is an easy way to fix this behaviour, by specifying the default operator for our search criteria to be BooleanOperation.Or.  The simplest way of explaining what this does is that without it the default operation that Examine uses in Lucene terms is MUST (or AND in Examine terms). Because of this default behaviour, it means that if you are unaware of it you will probably see some strange results. By passing in the default operator of OR (in Lucene terms SHOULD) you stop the default AND operation. To fix this change the creation of the instance of the ISearchCriteria to pass in a BooleanOperation.Or like this:


var searchCriteria = Searcher.CreateSearchCriteria(BooleanOperation.Or);

Now when Examine passes the query to Lucene it will pass as this:

nodeName:hello metaTitle:hello

Which in simple terms means give me anything where nodeName or metaTitle contain hello.  Much better.

So with this knowledge let's look at another example using the And() operator.


var query = searchCriteria.Fields("nodeName","hello").And().Field("metaTitle",hello").Compile();

without passing the BooleanOperation.Or into our ISearchCriteria we would get the following for our Lucene query

+nodeName:hello +metaTitle:hello

Which means give me results where nodeName MUST contain hello AND metaTitle MUST contain hello.

With the BooleanOperation.Or we would get this:

nodeName:hello +metaTitle:hello

Which means give me results where nodeName SHOULD contain hello AND metaTitle MUST contain hello.

What if we want grouping?  Well with Examine you get GroupedAnd() and GroupedOr() which as you would expect mean we can group up fields to look in and pass in a query term. I'm going to assume that I am using the BooleanOperation.Or from now on so will only show the result that it gives using that default operator.


var query = searchCriteria.GroupedOr(new string[] { "nodeName", "metaTitle"}, "hello").Compile();

This would give a Lucene query that looks like this:

(nodeName:hello metaTitle:hello)

You can also pass in a group of query value.


var query = searchCriteria.GroupedOr(new string[] { "nodeName", "metaTitle"}, new string[]{"hello", "goodbye"}).Compile();

this would end up being:

(nodeName:hello metaTitle:goodbye)

I think you get the gist.

But wait, there's more! What if you want to start combining operators? You can! It's not called chaining for nothing...


var query = searchCriteria.Field("nodeName","hello").And().GroupedOr(new string[] { "metaTitle", "metaDescription"}, new string[]{"hello", "goodbye"}).Compile();

This would end up being:

nodeName:hello +(metaTitle:hello metaDescription:goodbye)

Fuzzy
Sometimes users will query your site looking for a term that they could have misspelled or is very close. Fuzzy gives you the ability to get Lucene to look for terms that look like your term.  Eg mound could actually be sound.


var query = searchCriteria.Fields("nodeName","hello".Fuzzy(0.8)).Compile();

The optional value you pass into Fuzzy between 0 and 1 specifies how Fuzzy or how close the match is to the original. For instance a match of 0.5 will not return when a threshold of 0.8 is specified.

Boosting
Sometime you want to give a field more relevance than others. Thankfully we can use the concept of Boosting. What this does is give a particular query a higher relevance. That means that you can for instance say that if the nodeName contains the query then Boost it because its more relevant than those that only contain the term in the body.


var query = searchCriteria.Fields("nodeName","hello".Boost(8)).Or().Field("metaTitle","hello".Boost(5)).Compile();

If you're curious as to the Math of this, don't be. First rule of Lucene is never ask how the Math works.

Power Searching with Raw Lucene Queries
Cool, we have learnt a lot. BUT the Fluent API can't do everything. Let's look at a complex example that is not achievable with the Fluent API. Let's say we want to do a search with a phrase, boost exact matches, find results that contain any of the parts of our search phrase. The Fluent API will not be able to do this. So this is where you need to know a little bit of Lucene query syntax.  Along the way I have been showing you what certain queries look like when we convert them from the fluent API to Lucene syntax. It's not as complex as it looks.

Let's say our query is for the following phrase: "paging in XSLT". Most times when you search with Examine you will unfortunately either get nothing back or get back only a few results that match exactly. To see why, let's look at how we might do this with Fluent and then look at the problem when it's converted:


var query = searchCriteria.Fields("nodeName","paging in XSLT").Compile();

When this converts it looks like this:

nodeName:"paging in XSLT"

The problem becomes apparent straight away as you can see it quotes the phrase which basically means the term is the whole phrase. What we want from Lucene is the following:

nodeName:paging in XSLT

What this basically means is that field nodeName needs to contain either paging, in, or XLST.

So to achieve this we need to build our custom Lucene query and then pass it to Examine as a Raw query.


var term = Request["q"];
var luceneString = "nodeName:" + term; var query = searchCriteria.RawQuery(luceneString);

Cool, now our search is starting to perform more like how we want it to. Now what about making it boost matches containing all the terms higher? No worries.


var luceneString = "nodeName:";
luceneString += "(+" + term.Replace(" ", " +") + ")^5 ";
luceneString += "nodeName:" + term;

The resultant query would look like this:

nodeName:(+paging +in +XSLT)^5 nodeName:paging in XSLT

The ^5 is the equivalent of .Boost(5)

So as you can see, it can get pretty complex but also pretty powerful.  For more information I really suggest that you take the time to look through the official Lucene query syntax guide http://lucene.apache.org/java/2_4_0/queryparsersyntax.html as it will show you what can be used to achieve very complicated queries.

We haven't gone into the output of results but quickly here is what you could end up with in your codebehind using the above Raw query:


var Searcher = ExamineManager.Instance.SearchProviderCollection["OurIndexSearcher"];
var searchCriteria = Searcher.CreateSearchCriteria(BooleanOperation.Or);
var term = Request["q"];
var luceneString = "nodeName:"; luceneString += "(+" + term.Replace(" ", " +") + ")^5 "; luceneString += "nodeName:" + term;
var query = searchCriteria.RawQuery(luceneString); var searchResults = Searcher.Search(query).OrderByDescending(x => x.Score); yourRepeater.DataSource = searchResults;
yourRepeater.DataBind();

And then in your code front the objects that you are iterating over are of type Examine.SearchResult. So to databind on those you would have syntax like the following:


<%# ((Examine.SearchResult)Container.DataItem).Fields["nodeName"] %>

In conclusion Examine is awesome and with a little bit of information and a little patience to get to know it, you can be up and running with some very complex querying.

Thursday, September 15, 2011 by Gareth Evans

Part 6 of the feature walkthrough is the first post for the features available in umbraco 4.7.1 but continues from the previous series.
Today, I'm covering the first set of changes added after the 4.7 release.
I originally wrote these blog posts on my way back from CodeGarden (you can do a lot of blogging with 26 hours of flights) however due to the release getting delayed.. a little.. I'm only just posting them now.

CodeGarden 2011
It was great to meet some of the Razor users at CodeGarden 2011, and hopefully I managed to convert at least 1 member of the XSLT rebel alliance to try Razor.
From talking to a few of the existing razor users, I realised that not everyone may be aware of the work done on DynamicNodeList to enable simple filtering of the list.

I often saw code that looked like this:


@using umbraco.MacroEngines;
<ul>
@{
    DynamicNode n = @Model;
    List<DynamicNode> nl = @Model.Children.Items;
    foreach(dynamic item in nl.Where(x => x.GetProperty("umbracoNaviHide").Value != "1"))
    {
        <li>@item.Name</li>
    }
}
</ul>

While this code is not wrong, and in fact is a supported way of interacting with your object model from Razor, it's probably not the easiest.
I covered this in an earlier blog post but I thought I'd just reiterate it here.
For simple filtering and sorting operations, you don't need to access the inner .Items [List<DynamicNode>] of the DynamicNode list, DynamicNodeList has ordering and filtering built into it that WILL work with Dynamic objects, no more dynamically dispatched or cannot use a lambda with a dynamic object errors.

You only need to do this if you really really want to use standard lambda syntax, or perhaps if you wanted to do a multi-line predicate or dispatch it to a Business Object model.

This code will work in place:


<ul>
@foreach(var item in @Model.Children.Where("!umbracoNaviHide"))
{
    <li>@item.Name</li>
}
</ul>

DynamicXml fixes and changes
As mentioned in part 3 DynamicXml provides dot notation access to XML documents stored in a node property.
Following up on some feedback on both the forums and codeplex, some intended behaviour wasn't working quite right. DynamicXml was meant to reduce a single node (that is, if you selected down the chain and reached a bottom-most node) to a string.
Unfortunately, attributes weren't considered so this blocked access to those nodes.
In 4.7.1, the deepest nodes are considered to be nodes that do not have attributes or children. These will automatically convert to strings.

Another change to DynamicXml is that when dealing with xml files that may have variable amounts of children, the behaviour of the dot syntax was inconsistent. Sometimes you needed to use [] indexing, and other times not. We've improved this to make it more logical.

The final fix/change to DynamicXml is to fix a oversight with XML nodes containing - in attribute and element names.
The razor parser treats - as a subtraction within the template parsing. To resolve this, if your XML contains - in an element name or attribute name, it is stripped out.


<!--This-->
<somerandomxml>
<node attribute-name="adkda" nondashedattribute="akgdj-324kad">
</node>
<node-with-dashes attribute-with-dashes="dash-ed">
<othernode>for-example<othernode>
</node-with-dashes>
</somerandomxml>

<!--Will become this:-->
<somerandomxml>
<node attributename="adkda" nondashedattribute="akgdj-324kad">
</node>
<nodewithdashes attributewithdashes="dash-ed">
<othernode>for-example<othernode>
</nodewithdashes>
</somerandomxml>

As an aside, did you know that you can use . notation to access an attribute if you have that node?


//Given the following XML contained in a Books document type property
/*

<Books>
<Book genre="action">Exploring Razor</Book>
<Book genre="drama">The death of XSLT</Book>
</Books>

*/

@Model.Books.Book[0].genre => "action"


GetProperty & GetPropertyRecursive

One of the biggest complaints on the forums was accessing recursive data in Razor was difficult. I thought that could be improved, so we've added some new methods to Model [DynamicNode]
These methods deal with accessing string properties in a non dynamic way. That is to say, the property values will not be up-cast to their underlying type.
The advantage to these methods over the dot notation access is that we can add recursion and fallback as well.

There are a few overloads available:


//The most simplistic example, will retrieve a property by alias and return it as the interface IProperty which contains a Name, Value and Version
public IProperty GetProperty(string alias);
//The same as the previous example, except will recurse up the tree until it finds the first occurance of the alias you asked for
public IProperty GetProperty(string alias, bool recursive);     
//The same as the first example, except only returns the value as a string
public string GetPropertyValue(string alias);
//The same as the previous example, but if the alias was not found, use the fallback string instead
public string GetPropertyValue(string alias, string fallback);    
//Find the property value with the specified alias. If not found on the current node, check the parent. Rinse. Repeat.
public string GetPropertyValue(string alias, bool recursive);    
//The same as the previous, but if after checking all parents, and not found, use the fallback string.
public string GetPropertyValue(string alias, bool recursive, string fallback);

GetPropertyRecursive has a special shorthand helper:

Access your property prefixed with _ [this was the only available legal c# character I could use:
Model._pageTitle will fetch the page title of the current page walking recursively up the tree.

New methods on DynamicNode

HasProperty
This method is used like this and is fairly self explanatory: @Model.HasProperty("picture") => true|false

Index (or Position)
When a node is part of a list, returns the node's position within that list. If the node is not part of a list, return's it's position within it's parent's children [it's siblings]


<ul>
@foreach(var item in @Model.Children)
{
   <li><em>@item.Index()</em>&nbsp;@item.Name</li>
}
</ul>


IsNull and HasValue

Will check a given property name to see if it IsNull (==null) or has no Value (Whitespace or Empty or Null)


@Model.HasValue("property") => true|false
@Model.IsNull("property") => true|false

Pluck | Select

This new method (Pluck, aliased as Select) is available on a DynamicNodeList and will allow you to extract a value from a set and return it as a list.
The use case for this was alluded to in a previous blog post, but the idea is that since you can pass a set of values into a .Where, you may need a way to get that set.

Pluck works like this:


@Model.Children.Pluck("colour") =>
new List<string>()
//red
//blue
//green
//pink
//orange...

Conclusion

I've got quite a few more blog posts planned for the coming few days, introducing all the new features that are in umbraco 4.7.1

I'm Gareth Evans, Follow me at @agrath on twitter, and here's a few links:
The new Razor forum on our.umbraco: http://our.umbraco.org/forum/developers/razor
Codeplex for any feature requests or bugs: http://umbraco.codeplex.com/

Read more from the Umbraco Razor walkthrough series

Part 1
Part 2
Part 3
Part 4
Part 5
Part 6
Part 7
Part 8

Monday, September 05, 2011 by Shannon Deminick

image

Alpha 1 launched

Everyone on the team is really pleased to have launched the Umbraco Jupiter Alpha 1 release which you can find on CodePlex here.  This is the first v5 release since we launched the CTP (Preview) at CodeGarden 2011. We are planning on putting out a new Jupiter version on CodePlex about every 2 weeks (approximately), so be sure to watch this space for new and exciting updates!

In fact, don't just take our word for it - to celebrate the milestone we decided to put together a "Road to Jupiter" page which outlines our progress with Umbraco 5 and upcoming tasks. It's the first time we've done this at Umbraco and we'd love your feedback!

What is Umbraco v5 (aka Jupiter)?

In a nutshell, Umbraco v5 is a ground-up rebuild of your favorite CMS and is built on top of ASP.Net MVC 3. It will look the same and have all of the same great Umbraco ideas powering the new CMS but the underlying architecture has been completely upgraded. During CodeGarden 2011 this year we had a stream dedicated to discussing & presenting Umbraco v5. If you missed out on CodeGarden this year, or didn't get a chance to check out all of the v5 sessions, we've got them all recorded for you! Each session contains a ton of information about Umbraco v5: what its all about, why its is being built from the ground up, how its being built and the architecture behind it:  Keynote, File,New, Mvc Application, Get Plugged in to Umbraco Jupiter, Deep Dive in to Jupiter Architecture, Awesome Hidden Gems in Jupiter, Panel: Why not to use v5, 0 To Hive in 45, Localization in v5

image

What is an Alpha release?

An Alpha release is the first release to come out in the software cycle that is not a 'Preview' (CTP). It's intended for developers looking to become familiar with the codebase and architecture, or for those who would like to help us identify bugs. It can also be used by those interested in developing plugins for the final release. An Alpha build will contain bugs (some of which maybe security issues), and will not contain all of the features expected in the final release, it is therefore not to be used for production use.

The underlying framework, architecture and codebase will change between this release and the final release as we refine it, so although it is recommended for developers to start making plugins for v5, please know that you will need to update your code for future builds.

Getting started

Getting started with Umbraco v5 is the same as v4: you'll need to download the zip file from CodePlex, unzip the contents to your desired location, then point an IIS/IIS Express instance at that location. Don't forget to set your app pool to .NET 4 Integrated Mode! Note: Before unzipping, you may also need to right-click the zip, go to Properties, and click "Unblock" depending on your Windows security settings and chosen unzip tool.

Once you have IIS running, just visit the install page to begin the installation: http://localhost/install (where localhost is the host name of your instance). Be sure that you have the correct IIS file permissions setup just like in v4. When the installer begins you can then choose to use SqlCe embedded database or enter details to connect to a Sql Server 2008 instance. (MySql support is not tested in the Alpha 1 but is coming!)

After the database has been installed you can optionally install the 'DevDataset' package which will just pre-populate the Umbraco instance with some sample data that we've been using during development.

One installed, the default username and password for the backoffice is "admin" and "test" but you can change and edit this in the User section once you're in.

We've included the templates from the 'DevDataset' package in the default install even if you don't choose to install that package, for easy reference to some of the Razor syntax available in the Alpha 1. As this syntax improves in later releases and gets closer to 4.7.1 we'll be doing some more blog posts to give examples!

One other thing - we're focussing our development on the Chrome browser at the moment, so you may find major snags in browsers like IE9 - but don't worry, that's something we'll be focussing on fully in time for the Beta.

Technical documentation

The Jupiter Alpha release comes with all the APIs you'll need to start creating back-office plugins and we've even got some documentation already written to help you get started. Please note that much of this documentation is in its early stages but should be enough to help you get started creating plugins and learning a bit about the API. We urge developers interested in making v5 plugins to get started now so we can hear your feedback, comments and suggestions as we progress towards the 5.0 release of Umbraco.

Known issues / limitations

The CodePlex release page lists the known issues and limitations. Please note that as this is an Alpha, there are many features not included in this release that will be included in future releases. We've only mentioned the known issues/limitations regarding what is actually shipped in this release, not what is missing... we know what is missing :)

 

Cheers and happy bug-hunting!
Everyone on the v5 team 

Friday, August 26, 2011 by Per Ploug

On tuesday the 30th, we will migrate all our web sites to a new datacenter, on to new and faster servers and a faster connection. 

However, as part of this, we need to change DNS settings and IPs so during most of tuesday, depending on how fast your dns updates, umbraco.com and our.umbraco.org will either show a offline message, or redirect your to a temporary domain for that site when it's ready on its new location. 

We will do our best to keep downtime as low as possible, as we know how many people count on the help our community provides, as well as access to licenses and product files on umbraco.com

To all our Confidence support customers, our helpdesk will remain online and have personal ready to answer you questions as always.

Update: Server has been moved

Wednesday, August 24, 2011 by Peter Gregory

Every uNews we send out we generally feature one of our fantastic Gold Partners and their thoughts on experiencing, using, and supporting Umbraco.  We hope you all enjoy reading the differing points of view from some of the companies using Umbraco around the world.  This month we asked one of our Danish gold partners, Kraftvaerk, to tell us a little about why they use Umbraco.  They sent us back a 3 page response!  We tried our hardest to cut it down, but to be honest, most, if not all of the content was really really good.  Particularly their thoughts on some of the lesser advertised benefits of using Umbraco within an organisation.  So we decided to keep the article in it's entirety and post it up here on our blog.  That way it doesn't lose any integrity, and members of the community who may not receive Unews also get the benefit of giving it a read.  We hope you like it as much as we did.  On a side note, I also think a lot of this would be great material for 'Convincing your Boss'.  Enjoy.

Kraftvaerk Aarhus' relationship with Umbraco

Kraftvaerk is a consultancy house with 40 consultants who work with development and optimization of web portal and e-commerce solutions. We have recently received an Umbraco Award for best technical solution, and one of our employees has been nominated an Umbraco Most Valuable Person.

Kraftvaerk are skilled in a number of .NET-based CMS, such as Sitecore, SharePoint and Umbraco. Several of our consultants also have experience with DynamicWeb. 
However In 2008, Kraftvaerk Aarhus realized that Umbraco made it possible for us to deliver more value to our customers. Of course, the fact that Umbraco is free contributes to this, but we also discovered other less obvious benefits that we - and our customers - value highly. Among those are: 

Shorter implementation time

Our consultants found that the implementation time was very short compared to other content management systems, such as Sitecore. Often, we can save 25-35 % of implementation time. This leaves us with "free hours" for customization and/or the possibility of offering better products at a lower price. 

Flexibility

Kraftvaerk soon learned that we could develop even complex websites and e-business solutions much easier than before. This is due to the very simple structure of Umbraco. Umbraco's great strength is that it aims to be a superior CMS, and Umbraco does not fall into the popular trap of developing each and every web application you can think of. E.g. many CMS houses want to develop statistic modules, e-mail modules, e-business modules and other applications into their CMS. The result is often an inferior module that complicates the CMS. In most cases, you will be able to find better and cheaper third party products from specialized producers anyway. 

Customers love Umbraco. 

The Umbraco interface is much more intuitive to use than other CMS. To exemplify, Kraftvaerk consultants usually spend only 1-2 hours to train new Umbraco end users. Our experience with other CMS is that it usually takes a whole day to educate our customers to perform the same actions. In the business case of Økologisk Landsforening (Organic Denmark) we were able to train 2 web editors to educate 20+ internal editors in just 2 hours' time. 

Umbraco community 

Kraftvaerk employees find the community around Umbraco fantastic. We can get answers to Umbraco questions very fast. Equally important is that the answers often are thorough and detailed. This is due to a huge commitment and passion among the many Umbraco professionals. 

Our strategic focus

Since Kraftvaerk Aarhus realized that we could deliver incredible value using the Umbraco CMS, we decided to take a strategic focus on this platform. We have thus elaborated the Umbraco platform after a model that we call "umbraco website framework", internally called UWF.

The idea to develop the Umbraco Website Framework arose when we could identify many common problems among editors in different organizations, such as:

  • Editors are experiencing greater pressure in the form of multiple tasks, tighter deadlines, distribution to multiple platforms and demands for faster time-to-market for new functionality and content.
  • Many editors find that dependency on a web agency and the limitations of their existing CMS prevent rapid time-to-market of new ideas.
  • Most editors feel the need to distribute content to a number of different platforms (website, campaign sites, facebook, mobile devices ecc.). In this context, it is very time consuming and inefficient to create the same content for different platforms.

The philosophy behind our UWF is to solve the above challenges on behalf of customers. UWF therefore ensures:

  • Maximum and easy reuse of content across portals and other platforms.
  • Editors can solve complicated tasks and design changes on their own, without involving the web agency.
  • Integration to Facebook, Twitter, popular email systems with the purpose of having a single point for content creation and then distributing from Umbraco to the desired platforms.

Uwf -concepts

Customers have embraced the Umbraco Website Framework and Kraftvaerk's Umbraco focus.  Among Kraftvaerk references, you find:

Furthermore, we are very pleased that many of the best skilled Umbraco consultants today wish to work at our Aarhus office. 

Interested in more Kraftvaerk stuff?

Kraftvaerk's Umbraco site: www.nytcms.dk (in danish)

Kim Andersens blog: www.kim-andersen.dk (in danish)

Kraftvaerk's partner profile: /certified-partners/browse-solution-providers/kraftvaerk

 

Wednesday, August 17, 2011 by Shannon Deminick

Currently in Umbraco v5, there are 3 types of Macros:

  • Xslt
  • Partial View
  • Surface Action

Both the Partial View and Surface Action macro types are brand new to v5, the Xslt macro will remain very similar to how it works in v4. 

Here's a quick run overview of the two new types of Macros in v5…

Partial View Macros

A full dedicated blog post has been written on Partial View Macros HERE which includes detailed explanation, code snippets, etc….

Surface Action Macros

First, we need to explain what the term 'Surface' means: The term 'Surface' relates to a new plugin type in v5 called a Surface Controller which is an MVC controller that interacts with the front-end/render layer of Umbraco, and just like any other MVC Controller, it can contain Actions that render views. Surface Action Macros may in fact be one of the most powerful types of macros in v5 because all of the processing can be done directly by a Controller which is capable of interacting with any of the services registered in the IoC container. This basically means that you can pretty much do anything from within a Surface controller action and then render out any type of view you want … you could even go so far as to render out some Xslt since Xslt is just a view rendered with our Xslt View Engine.

Surface Controllers can interact in many ways with the front-end such as via macros and we'll be writing dedicated blog posts for both Surface Controller Plugins and how to create, use and configure Surface Action Macros in the very near future, stay tuned!

Wednesday, July 27, 2011 by Niels Hartvig

While this blog post is more personal than the average posts on this blog, I'm posting it as it's impossible that what happened to my family won't have an impact on my level of commitment to the Umbraco project in the near future.

Yesterday August - my seven year lovely first born son - was diagnosed with Diabetes Type 1. He's ok. I'm lucky to live in a country with amazing health care and near a hospital with amazing knowledge on the subject. He's the most brave person I've met and thank god he doesn't appear to have inherited his father's fear of needles. Something which is clever when he'll need to prick himself more than ten times a day for the rest of his life.

As a parent there's a lot to learn in very little time. This means that August will naturally be my (almost) only concern in the next few weeks where my wife and I are given intense instructions on diabetes by doctors, dieticians, psychologists and other experts that I've been shaken hands with the past 24 hours but yet to remember what role they had. As crazy as it may sound, I've felt blessed numerous times of living in a country where I'm given these opportunities. I know that I'm more lucky than the average parent of a child with diabetes.

The side effect is naturally that my evolvement with Umbraco will be at an all time low. However, I feel blessed again. Even though there's never a good timing for an event like this, the project is at a stage where I'm not indispensable. The core team knows v5 better than I do, work is being done on getting 4.7.1 out of the door (albeit delayed until coming weeks), my wonderful coworkers at HQ (the Umbraco company) knows how to run it without me and the community ethos is stronger than ever.

So this doesn't mean that I'll go away - after all the Umbraco community is my second family. Please take as good care of it as I'll do of my number one in the coming weeks and months.

Love,
Niels…

Tuesday, July 19, 2011 by Aaron Powell

When Alex, Shannon and myself were putting together the list of Umbraco 5 Gems for the CodeGarden 11 talk we had to make a decision about what we would and what we wouldn't be able to cover. Since we only had an hour and there are so many awesome hidden gems in Umbraco 5 there was a number of things that simply didn't make it into the presentation.

In this final part of the series we're going to have a look at the remaining Gems, the last of the cool features from the Umbraco 5 CTP (but not the last of the cool features for Umbraco 5!)

 

Bendy Objects

In Umbraco 5 we're making quite extensive use of dynamic objects to make it easier for people to work with the data that is being generated from the Umbraco database, similar to the idea of DynamicNode in Umbraco 4. But we realised that we needed a much more powerful way that you could deal with dynamic objects and more importantly, dynamic object graphs.
This is where Bendy comes in, the idea of Bendy (and in turn Bendy Objects) is that you can turn any object, or any object graph, into a dynamic object. With Bendy you can either make the objects dynamic typed and use 'dot-notation' (entity.SomeProperty) to access the data stored by that entity for a property or you can use it like an indexer (entity["SomeProperty"]). What is also really cool about Bendy is that is all lazy loaded so if you never access a particular property the data will never be produced, and the same goes for children and parent objects. This gives us high performance within the API itself.
Expect to see more on Bendy as tutorials come out around working with Umbraco 5 data.

 

WriteLockDisposable

Dealing with shared memory resources in multi-threaded applications can be a bit of a pain and your only safe bet is to use double lock checking. With some improvements that have come as part of .NET 4.0 we've been able to make this a bit simpler for developers through a custom API we're exposing called WriteLockDisposable. Essentially this creates a disposable object which you can then use yourself to create singleton objects and not worry about having thread locks occurring from accessing shared resources.

 

Mandate API

How many times have you written a check for an ArgumentNullException, how about a generic ArgumentException? This is something we do a lot in Umbraco 5. And I mean a lot!
Since we wanted a way which we could easily do the check in the same way everywhere we've created an API which is named Mandate. You use Mandate like saying Mandate.That(boolean, "message when failing") and we'll handle the rest. We're even going to support localizing the exception messages using the awesome new localization framework. Mandate can be used for null checking or boolean condition checking, giving a clean and common way to do error raising.

 

DisposableTimer

Anyone who has tried debugging an internal error of Umbraco 4 will know just how hard it can be and when something breaks internally it's very hard to describe to someone else. To address this with Umbraco 5 there is a new API which is used to manage the tracking of information when something internally is happening. When you spin up a DisposableTimer a log message starts then you can use the logging API add your own messages before the DisposableTimer is disposed of. This means you can see what happens between the start and finish making it very easy to see the what happened in a particular scope.

 

Logging

As mentioned above we have a DiposableTimer in Umbraco 5 which will help tracing what happens in a particular scope block which you can do your own logging in. For logging we've gone with log4net which is a very popular .NET logging API. To make it simpler to work with we expose a LogHelper class which will help you get the appropriate logger for your type.
Another really good feature of log4net is that through its powerful configuration system we can control the logging very finely, so when you deploy to a production server you can dial back the logging to a minimal. If an error is happening in a specific section of the application you can enable deeper logging for that section than the rest of the site, etc.
Hopefully this means that finding errors within the core of Umbraco 5 itself a lot easier.

 

Simplifying LINQ with QueryDescription

For a Hive Provider the ability to query is quite important and the obvious query API is LINQ. The problem with LINQ (well with Expression Trees actually) is that they are very complex and to create your own custom provider that will be able to process an Expression Tree into something that you can understand in your provider is really quite complex.
In an effort to make it simpler for people to create their own Hive Provider and have it queryable we've created an API in Umbraco 5 called QueryDescription so rather than receiving the Expression Tree in its raw form Umbraco 5 will parse it into a QueryDescription which you can then consume in a much simpler manner.
This will give the power of LINQ to consumers of Hive Providers yet a simple API to handle as a Hive Provider implementer.

 

PreValue's are overridable

Something we've noticed with the way users were using Property Editors which had PreValues in Umbraco 4 was that the same Property Editor would be used on multiple Data Types with only a change to a PreValue or two. With Umbraco 5 we've decided to make this a bit easier, rather than having to create multiple Data Types to change a single PreValue you'll be able to override the PreValue properties on the Document Type. This means that you can create a Data Type which is your standard way with standard PreValues, but on a special case you can change it to what's needed.
The advantage of doing this is that if you want to create a larger change to a Data Type you'll be able to do that in a single place, rather than across multiple Data Types.

 

Examine is BACK

Examine the Lucene.Net search API which has been included since Umbraco 4.5 will be making a return in Umbraco 5 but it's getting a face lift. Instead of being an external API which has its own query manner and such the new Examine version (ingeniously named Examine 2) will be an Umbraco 5 Hive Provider. Something that we've been stressing in this blog series (and the Umbraco 5 Hive talks) is that the Hive isn't just about Nodes and Examine will be living proof of this.
Additionally Examine will be taking a larger role in the way data is handled in Umbraco 5, rather than being the primary Lucene.Net API we're going to be providing a fast-read API to serving out the published content in Umbraco, a new API powered by Examine.
And after all Examine 2 is just a Hive Provider so why couldn't it be used in such a way to make the published content even faster?

 

Providing functionality to pages

In Umbraco 4 you can put your own functionality behind a template by creating a custom base type that the template inherits from. With Umbraco 5 we wanted to offer similar capabilities but in a MVC way, this means that we need to ensure that if you want to create a Controller and Action then you can.
Well the good news that this will be possible in Umbraco 5, allowing you to use the skills from standard ASP.NET MVC3 development for the most part. Rather than looking at the URL to get the Controller and Action Umbraco 5 will look to the Document Type Alias and Template Name. So if you have a Document Type with the alias textPage you can create a Controller named TextPageController. Immediately the Umbraco 5 rendering engine will redirect all requests through the Index Action (assuming it exists), allowing you to provide global changes to any page using that Document Type. If you want to take it one step further you can then create an Action on the Controller which has the same name as a template, say Content (for the content template) which you then have control over just that particular Document Type and Template combination. This opens up a world of possibilities to say return JSON from a Template rather than HTML but influencing the Action Result returned from the Action.
Powerful huh!

 

And now we are at the end of our Umbraco 5 Gems series. We hope that you've enjoyed reading about some of the more hidden and unusual aspects of Umbraco 5 and can't want to get cracking with it.

Friday, July 15, 2011 by Aaron Powell

The last part of the Umbraco 5 Gems talk at CodeGarden 11 was to look at some of the more crazy aspects of Umbraco 5, the stuff that you'll want to know if you're delving deeply into the API and really wanting to extend Umbraco beyond the needs of the average user.
 

IoC is swappable


We've decided that Autofac will be our IoC (Inversion of Control) container of choice, but that doesn't mean that it suits everyone. As a developer you might already have a stack that relies on another library such as NInject or Windsor, or your team is just more comfortable with one of the other DI containers available.
With the way the Umbraco 5's IoC is designed it will be possible for you to use another IoC container without having to hack into the core of Umbraco, instead there will be a few interfaces and classes to implement which will provide all the hooks into Umbraco. Internally all of v5's dependency registrations are done against our abstraction layer meaning as soon as you plug in your library of choice, our registrations will still end up in your container for you to interact with or have our components injected into yours.
 

Abstract task system / loosely-coupled events bus


In Umbraco 4 events are strongly typed against the various .NET types within Umbraco, using the standard .NET event system. In an application the size and complexity of Umbraco standard .NET events can be a bit restricting, so instead for Umbraco 5 we're going with a loosely coupled task system in which events are raised into an application-wide task manager based on pre-defined trigger names.
To listen for a task you simply hook your code up with a trigger name similar to a regular .NET event, or add a Task to your plugin assembly decorated with the appropriate attribute, and our task manager will execute it when the relevant trigger is fired, meaning you don't have to connect directly to a particular object instance. Tasks are also chainable so you can cancel proceeding tasks or pass information back to the caller or the next task in the queue.
It also means that a task with a particular name can be raised from various locations within the application - even your own plugins.
This disconnected task system means that we can have much greater flexibility than standard .NET events.
 

File system is a Hive provider


Like everything in Umbraco 5 we have a Hive provider for the file system. Files such as CSS, JavaScript, Templates, etc are loaded through the Hive. Out of the box this will be loading off your hard drive, but it does mean that we have a lot of interesting options. Since we abstract away the file system you can swap the file system out for a Hive provider for one which reads out of a database?
Or out of cloud storage like Azure?
This means that you can leverage the power of a CDN to serve out your common assets and increase the scalability of your Umbraco 5 website.
 

Drumroll... Umbraco Application Framework is separate from the CMS


Since there's lot of cool features and reusable classes in Umbraco 5 which don't require a web UI, or any UI for that matter, we've made a deliberate separation between the Application Framework and CMS projects and because of this you can use them without the CMS product itself.
In fact the CMS is just a product which has been built on top of the Umbraco Application Framework.
So in your own application you can leverage APIs such as the Hive, Localization or the task system.

 

So this wraps up the list of Umbraco 5 Gems from the CodeGarden 11 talk but as it turns out there was way too many Gems to cover in a single hour so keep an eye out for the next post on the Umbraco 5 Gems we haven't previously spoken about!

Wednesday, July 13, 2011 by Per Ploug

On thursday July 13th at 12:00 GMT+1 we will start upgrading umbraco.com as part of a bigger maintance job on our internal systems.

It means that umbraco.com will be inaccessible for most of an hour, including any licenses, invoices, or downloads you might want to access from umbraco.com

our.umbraco.org and the umbraco deli will not be affected by this maintance and will stay online.

Sorry for the inconvenience, we'll try to get the site back online as fast as possible.

UPDATE: we're back, took 20 minutes longer then expected, and we hit a tiny hiccup with license downloads. If you find any issues with the site, please post a comment to this post or use our standard contact forms, we're keeping an eye on the site, but everything seems to be running smoothly

Wednesday, July 13, 2011 by Aaron Powell

Another day and another Umbraco 5 Gems post is available. Today we'll be looking at what Gems there are for Developers with the Umbraco 5 release.
Umbraco has a great history of being highly flexible for people who want to extend it beyond just a simple CMS. In this article we're going to dive how we're making the CMS even easier to extend than before from the point of view of a developer working with the API or a developer wanting to create packages.
 

Searchable trees


Umbraco has had back office searching through a search box in the upper left corner of the content application, but the problem was it was limited and hard to plug your own trees into. If you wanted to have searching for your own back office application then you had to go about doing it as a dashboard application. While this is good (and still do-able in Umbraco 5) it did mean that you didn't have the ability to leverage the built-in UI of Umbraco.
Well with Umbraco 5 this has been addressed with a new interface, ISearchableTree. When implementing this interface whilst putting together your own tree, you'll be able to hook into the Umbraco UI for searching. What's really cool is that this is contextual, so if you create a custom tree which is loaded into an existing application, e.g. for content, searching will be targeted against that automatically.

 

The data layer is a Hive of activity, and the default content provider is NHibernate 3


Data in Umbraco 5 is the epitome of pluggable, and you can even merge multiple providers into one website. The primary, out-of-the-box provider for content, media, etc. in Umbraco 5 will be NHibernate (with Fluent NHibernate to make the mappings more robust). This means that there's no more embedded SQL, instead we can leverage the testability of an ORM. This also means that we can maintain our support for Microsoft SQL Server (including CE4) and MySQL.
It also means we're going to be having proper transactional data interaction so it'll be a lot harder to get yourself into a state where the Umbraco database is corrupt.
Hive is not just about traditional "database" data either: you can use it to plug in your own data for powering content, but we also use it for things like files meaning cloud storage feels no different to native storage, you simply swap out the provider in config. There are more details in Alex's talk from CodeGarden11.
 

Hive ID's are URLs


To tie in with the Hive in Umbraco 5 we've changed the ID scheme to not be just a number. This means we're able to store more information in the ID, and in fact the Hive will store two additional pieces of information, the "item type" e.g. content / media, and the provider.
The reason this is powerful is that because we're able to have different Hive providers listen for the URL scheme, and load the data from a different provider depending on the route or other rules.
In fact the different files in the application (CSS, JavaScript, DocType Icons, etc) are all loaded from a single Hive provider with different instances listening for different URL schemes, the CSS provider listens for storage://stylesheets where as JavaScript is storage://javascript, and so on. Even the "file upload" property editor uses Hive, but more on why that is awesome in a future post.
 

Simpler back office applications and trees


One thing we got from talking to package developers was that creating back office applications and trees could be quite tricky and even getting your own tree into an existing back office application could be difficult. In Umbraco 5 this has been changed so that it wont require these to be kept in the database, instead they are kept in the config. So with a simple change to config you'll be able to create a new application, move trees between applications, etc. Also these config options will be specific to your plugin so you don't need to worry about updating a global config file somewhere (more on Umbraco 5 configs below).
Additionally these will have an immediate effect on Umbraco so you don't have to log out or restart IIS (and t here's a really sexy little animation which you'll see to refresh the application icons!).
 

Plugins are not loaded into the /bin


When you've got an Umbraco site with many different extensions it's possible that you'll have a lot of assemblies in your /bin folder, but how can you keep track of what files belong to what package?
Again in Umbraco 5 we've decided to address this and in doing so we have elected to store plugin assemblies separately, in the plugin directory itself - and since each plugin is in its own folder, it'll be a lot easier to work out exactly what belongs to what files belong to what plugin.
Again to learn more about the v5 plugins I suggest you check out Shannon's talk.
 

Plugins use NuGet


Rather than maintaining our own plugin XML format we've decided to go with NuGet as our packaging format. NuGet is perfect for packaging since it has all the information we need for a plugin, a name, id, version, license URL, etc.
There is even a simple to use desktop tool (and command line) which will mean you'll be able to create packages from within the Umbraco UI and from outside the Umbraco UI.
Please note that in the CTP you're unable to create packages from the Umbraco UI, instead you need to use the NuGet desktop application. There's a good amount of information on the NuGet website which covers what NuGet is in more details and even a walk-through of how to create a NuGet package using the desktop application. There are a few differences though and again I suggest you refer to Shannon's talk for more about plugins in Umbraco 5.
 

Simplified configs


When we were speaking to package developers one of the primary things that they use the Package Actions in Umbraco 4 is to manage changing the configs for Umbraco. So a big goal of v5 was to make it easier for package developers to provide configuration information to Umbraco from a package without worrying about modifying the web.config of the website.
Since each plugin is in its own folder it also has its own config. When Umbraco 5 starts up it will parse all the configs for all the packages and produce a large view of the config state of the application. In addition all the configs will be loaded in a last-in order, so if you want to override something within either the root Umbraco config, or in another package, you will be able to. And when you uninstall a package the config will be removed too, rolling back to a pre-installed state.
This is known as the Deep Config Manager and it is responsible for the whole Umbraco 5 config. And don't worry, it still supports both app-settings and custom config sections depending on your personal preference.

So this brings us to the end of another Umbraco 5 Gems blog post. Hopefully some of the changes we've got around making Umbraco 5 an amazing development platform are tantalising for application and package developers. Stay tuned though, we've got more Umbraco 5 Gems to come.

Monday, July 11, 2011 by Aaron Powell

Continuing our theme of Umbraco 5 Gems we've decided that today we'll look at the Gems for ASP.NET MVC developers and we've got some really handy ways which you'll be able to hook into MVC. Additionally this means that your existing MVC skills will be usable when developing with Umbraco 5. It also means that a lot of the skills you can gain from MVC tutorials will be usable in Umbraco 5.
 

Convention over Configuration


One idea that MVC touts is the idea of Convention over Configuration, particularly with the way that it lays out its project. An MVC project will have folders such as Content (containing CSS, Assets, etc), Scripts (for JavaScript) and Views (for HTML) and with Umbraco 5 we're keeping these folders and using them to store the files which you'll use in Umbraco sites.
Plugins will also use those folders.
 

Global ActionFilters


MVC has the concept of Global ActionFilters which allow you to interact with the pipeline and are used for things such as handling errors. But it does mean that you can use them to extend or interact with the internals of Umbraco without having to modify the core .NET code.
 

Knockout JS


If you haven't looked into Knockout JS I suggest you go do that now! It's awesome.
With Umbraco 5 we're using Knockout quite extensively to handle the back office UI state, everything from DocType editing to CSS editing. This is exciting as it means we'll be shipping Knockout out of the box with Umbraco so you'll be able to use it yourself to create powerful back office UIs.
 

Embedded Views


Sometimes package developers (and the Umbraco core) want to ship only a single file as part of their package. With Umbraco 5 we're supporting a way which you can turn the Razor view file into an embedded resource in your assembly. This means that if you don't want your HTML available to be edited it can be neatly rolled up into something that other developers are unable to get to.

And this wraps up part 2 of our Umbraco 5 Gems series. Hopefully this gives you some cool insights into what's coming for Umbraco 5 that you can use your existing ASP.Net MVC skills with. Stay tuned for more v5 Gem goodness!

Friday, July 08, 2011 by Aaron Powell

At code garden this year Alex, Shannon and I talked about some of the hidden gems which are being included in version 5 of Umbraco.
Well not every feature was able to be given the credit it deserved in the talk (also after the fact we realized we missed some too!) so we said that we'd produce a series of blog posts which will look at some of the features in more depth. Over this series of posts we're going to look at Umbraco 5 Gems from the perspective of difference kinds of people who use Umbraco because there are lots of different kinds of Umbraco users and not everything will be logical for them. Also to include everything in a single post would make for a really huge post!
 
First up we're going to look at some Umbraco 5 Gems for Content Editors.

It looks the same

Although not really a Gem in itself this is something that we really want to stress about Umbraco 5, that we're keeping the same Umbraco look and feel from a user point of view for Umbraco 5. That's not to say it'll be a 100% skin copy of Umbraco 4, expect some improvements and more polish (because after all the web has evolved a lot since the first Umbraco back office UI was done) but the concepts that editors have grown to know and love will still be retained. This means that it's not a case of re-skilling Content Editors upon the release of Umbraco 5.


Drag and drop DocType properties and tabs

This is a feature you won't know about until you come across it and once you find it you'll wonder how you lived without it. Simply put, Shannon realized that it was a pain to move a property between tabs when editing a DocType and that there should be a simpler way. Well now there is, you can just drag it to a different tab!
Additionally to this you can also drag tabs around, rather than relying on the numerical index.
Simple improvements to save bundles of time :).

 

No more popups

A lot of the workflow in Umbraco is done through the use of popup windows, things such as creating, moving and managing permissions of a document. With the change into MVC we were able to revisit this idea, and from that we've decided that when possible we'll just use the main editor pane rather than a popup. This gives a lot more visible space to provide users information during the process of creating a new node, or moving one around the CMS.
 

 

Media is content

In Umbraco 4 there is a reasonable distinction between the idea of media and content, although they share a lot of the same root concepts. Thanks to the changes in the way data is treated (aka the Hive) we've been able to bring these concepts even closer, making the API for working with media identical to working with content. It also means that customizing the media types should be exactly the same as document types.

Localization improvements

We're not language gurus, we're CMS gurus, but thanks to the awesome work of Niels Kurnel localization is going to be even more powerful in Umbraco 5 than ever before. There's more to it than can be summed up in a paragraph so I recommend you go check out Niels' CodeGarden presentation on the new localization features of Umbraco 5. It's also available for you to use separately from Umbraco, but more on that in a future post!

Sprite framework

Umbraco 5 will make it easier to use CSS sprites for DocType icons, etc. This works by looking for a CSS file with the same name as the sprite image file. Umbraco will then parse the CSS file and find all the CSS sprite rules to produce a list of images which are all located within the sprite itself.
This makes it easier to utilize sprites within the Umbraco back office for content editors to work with.
 
That wraps up the first in this series about Umbraco 5 gems, and our look at what's going to be awesome for Content Editors. Stay tuned for more Umbraco 5 gems!

Wednesday, July 06, 2011 by Warren Buckley

Every year at CodeGarden we run a package competition, where attendees have the opportunity to submit an Umbraco package that extends the out of the box functionality of Umbraco.

At the end of CodeGarden we ask all our package competition entries to present their package, giving them 5 minutes a piece to present before being thrown off the stage, finished or not. Submissions can range from useful and powerful packages to the downright silly, which of course, we love :)

Prizes

This year we introduced a theme for our package competition prizes, deciding on cool DIY build projects (such as some great Arduino projects that we found).

Third Prize - Useless Machine
This is not an Arduino project, however we saw this and it made us smile.
http://www.youtube.com/watch?v=Z86V_ICUCD4

Second Prize -Thingamagoop 2
This is a handmade, analog and digital synthesizer that you control with light.  It is built with Arduino so it could be reprogrammed to do something else.
http://bleeplabs.com/thingamagoop2/

First Prize - Thing-O-Matic MakerBot
This was a great first prize, an open source Arduino 3D printer from the guys over at MakerBot in New York that allows you to print 3D objects from your computer. Want to print out a kazoo to relive the memory of the CodeGarden marching band from bingo, sure can!!
http://www.makerbot.com

The Winners

The packages were judged by the attendees with the biggest cheers and the winners for this year were as follows:

Lee-Kelleher

3rd Place - uBackChat
Lee Kelleher demo'd a package that allowed users of the Umbraco back office to instant message one another, this could be useful for clients where more than one editor is likely to be working on the site at the same time.

http://our.umbraco.org/projects/backoffice-extensions/ubackchat
https://bitbucket.org/vertino/ubackchat/src

Morten-Christensen

2nd Place - Optimize It
Morten Christensen demo'd a great utility package for Umbraco that allows you to optimise your CSS and JavaScript from the Umbraco back office in a few clicks, such as generating a sprite image from your CSS, prettify and minify your CSS and other useful utilities that you may want.
Unfortunately Morten ran out of time when demoing this at CodeGarden, however he still managed to bag 2nd place with this fantastic package.

http://our.umbraco.org/projects/backoffice-extensions/optimize-it
http://blog.sitereactor.dk/2011/06/19/optimize-it-package-for-umbraco

tim-payne

1st Place - uBrokeIt
Tim Payne showed us a great package called uBrokeIt, which was a great little fun package that was not to be taken seriously. uBrokeIt allows you to introduce non destructive and amusing bugs into the back office such as 'boss mode' and 'kitten mode'. Rather than me trying to explain this fun/silly package, I will let Tim do a much better job with his screencast.

http://our.umbraco.org/projects/backoffice-extensions/ubrokeit
http://www.screenr.com/22Bs

However with these great packages I need to give a big honourable mention to Matt Brailsford who was the only one to submit a package developed against V5 of Umbraco, so massive kudos to Matt for demoing a V5 package. High Five You Rock!

Congratulations to all our winners and thanks again to everyone who entered the package competition. High Five You Rock! I must admit I am jealous of Tim winning that awesome 3D printer, it looks like it will be a fun project to build!

Has all this talk of CodeGarden got you excited about what next year's CodeGarden will bring? Wondering how can it get any better? Trust us, it can! So make sure to get in early with our super early discount for CodeGarden12 tickets at a low price for a limited time (first 100 tickets or when we remember to turn the discount off).

Well that's it for this year's CodeGarden follow-up blog posts, make sure you keep your eyes peeled on the Umbraco twitter stream and the CodeGarden11 site as we continue to release a new video each workday.

Until next year.... have fun, and don't forget to pack your kazoo's for next year :)

Cheers,
Warren & The Umbraco HQ

Tuesday, July 05, 2011 by Peter Gregory

Only two weeks remain before we return to Sydney Australia to run the next round of Umbraco certification courses from the 19th to the 22nd of July.

Melbourne TrainingIf your company uses Umbraco as its main CMS platform, I would encourage you to consider certifying your developers and becoming a Certified Partner.  Certification not only helps affirm and build on your developer's knowledge but also provides credibility for your company when pitching for work.  To become a Certified Partner involves having four certifications at either Level 1 or 2.  This can also be obtained by having two developers certified at both level 1 & 2.  Currently in Australia we provide a package rate for developers who choose to do both levels in the same week and this can be a very cost effective option for gaining Certified Partner status. There are currently only two spots left on level 1 which also means there are only 2 package deals available.  This is a great opportunity for a company to take the next step in professionalising their use of Umbraco.  Do not hesitate, register today [external site].

From a trainer's perspective, I really enjoy teaching the courses as it's great to see the "AHA!" moments when a developer discovers something new, and then seeing the satisfaction a developer gets when they finish up the course and can finally claim the badge of Umbraco Certified Developer.  You'd be surprised how many developers come purely to 'gain the certification' assuming they know most of what there is to know, who walk away going 'Wow, I learnt so much!' But what I enjoy the most is when I see that developer become part of the wider developer community, contributing on the forum, twitter and in some cases developing packages.

Umbraco is so much more than just a great tool that you use to build content managed websites. It is also a community of dedicated developers passionate about what they do. I encourage all newly certified developers to join in the conversation and contribute back as there are many opportunities to give input even if you are not a "Core" developer.

This round we have a change of venue and have moved to a more central location in the city at the offices of Umbraco Gold Partner Next Digital. Massive thanks to Next Digital for providing the venue, we really appreciate the support and help with logistics.  If you are interested in training or certifying your team (or yourself) but can't make it to this round, we will be running another set of courses in Australia before the end of the year.  Please contact me for more details.

And last, but not least, as we place a lot of value on community here at Umbraco, we will be running a meetup whilst in Sydney for all Umbraco users, whether you are attending the training or not.  If you'd like to come along let us know by signing up on our.umbraco.org, we'd love to see you there.

Peter Gregory - Umbraco HQ Australia

Monday, July 04, 2011 by Warren Buckley

This year at the Umbraco HQ we decided to bring back the Umbraco awards for two reasons. First was to celebrate all the awesome and high quality work that the community produces when  building great Umbraco websites, and secondly it was a great way for us to collect new & exciting case studies for Umbraco's own website.  So expect to see these featured on the site very soon!  We short listed three finalists for each category.  The winners were announced at the end of CodeGarden where each winner was presented with a very unique award: a custom painted 18inch Umbraco branded Mega Munny. Below, Per Ploug from HQ talks us through the category winners.

umbraco-awards-CG11

Best Technical Solution

Home.dk
Kraftvaerk - www.nytcms.dk

HollandToer.nl
WVD Media - www.wvdmedia.nl

FDIH.dk
CodeHouse - www.codehouse.dk

tech-solution

Winner: Home.dk
"Home.dk was selected because it scales really well, (one of the biggest sites in dk) and because of their efforts to make the editing environment extra friendly. Editors can put together microsites by just picking content with various pickers, so no more need for IT because non-tech people can just put together the sites themselves."

Read how happy the Kraftvaerk team were to win the Umbraco Award on their blog
http://www.nytcms.dk/nyheder/kraftvaerk-vinder-umbraco-award

Best Designed Site

LoveBeverlyHills.com
RTP Interactive - www.rtp.com

HenningLarsen.com
1508 - www.1508.dk

NLEngenharia.com
Massive Visuals Agency - www.itsmassive.com

best-design

Winner: HenningLarsen.com
"Henning Larsen was chosen for its functional design.  You can pick cases, articles etc and generate a PDF from the site, which is cool for their users, but their sales people actually also use it to make ultra-fast sales pitches, and it's a beautiful site."

Best Integration

HenriLloyd.com
Amaze - www.amaze.com

TescoPLC.com
MerchantCantos - www.merchantcantos.com

ThisIsCentralStation.com
ScreenMedia - www.screenmedia.co.uk

best-integration

Winner: ThisIsCentralStation.com
"This is Central Station was selected as best integration because it's integrating a social network with Umbraco, it's a nice integration, and its design and UX is actually different from all the Facebook clones out there. So great use of third party system + the flexibility of Umbraco in regards to design."

Read how attached Jon has become to the Mega Munny/Umbraco Award ScreenMedia won
http://www.screenmedia.co.uk/blog/2011/june/we-won,-we-won-the-umbraco-award-2011

It was really hard for the panel to choose the nominees & winners from all the great entries we received. So if you entered into the Umbraco Awards, we would like to say a BIG thank you. The other reason we started up the Umbraco awards again this year, was to get great case studies for us to use.  We have previously asked the community before but without much success, now we have a ton of great case studies to showcase. So expect to see them on the Umbraco.com site soon.

Thanks again for all the great submissions. In the final CodeGarden11 follow up blog post I will blog all about the package competition that we hold each year at the end of the conference.

Until next time....
Warren & The Umbraco HQ

Thursday, June 30, 2011 by Warren Buckley

Continuing on in the CodeGarden11 wrap up blog series, in this post we will introduce the Umbraco MVPs.

Each year at CodeGarden the community vote for their 5 favourite Umbraco MVPs (Most Valued People) based on the 20 top people with the most karma over the year. Here at the Umbraco HQ we love to celebrate with the Umbraco community these outstanding people within the community itself, and CodeGarden presents an excellent opportunity to do so. With the voting incredibly close this year we decided to have 6 MVPs.

The 6 wonderful MVPs for 2011/2012 are as follows:

Darren Ferguson

Darren-Ferguson

Darren runs the Umbraco Level 2 certification in the UK and travels worldwide to teach the course.  He is also actively involved in developing and maintaining the course materials.
He contributes to the Umbraco project in many ways and has been an active member of the community since 2006.

Darren runs a small company called Ferguson Moriyama in which his role is a developer, project manager, consultant and teacher of all things content management and web.

When Darren is not working he likes fast cars, growing vegetables (especially chillies), eating good food and finding nice pubs to have a pint in.

Douglas Robar

Douglas-Robar

Four-time MVP Douglas Robar has been building Umbraco sites since V2 and sharing his knowledge along the way. Doug runs Percipient Studios, an Umbraco-focused company.

An official trainer, Doug has trained hundreds of certified developers in all market segments through regional and on-site courses in the USA and now the UK. ImageGen and XSLTsearch continue to be among the top five most popular Umbraco packages used in tens of thousands of sites.

An avid 'explainer', Doug is known for his clarity and thoroughness in teaching, speaking and writing. 'I still remember what it was like being new to Umbraco. The amazingly friendly, humble and helpful responses I got to my noob questions made me realize the Umbraco community is very special. I want to be that way and foster that attitude in the community for others who are new to Umbraco.'

Doug loves photography and you'll often find him behind the lens at Umbraco meetups (check out his Umbraco photos on Flickr). And though he's a proud member of the XSLT Rebel Alliance he's also rather fond of Razor.

Jan Skovgaard

Jan-Skovgaard

Jan is 28 years old, single, and an Umbracoholic! He lives in Aarhus, which together with London is the Umbraco metropolis.

He works as a frontend-developer at Kraftvaerk where he is using Umbraco on a daily basis: He primarily works with XSLT rebellion but is looking forward to learning a lot more Razor in the future.

Jan has been using Umbraco since 2006 and has been an active part of the community since 2008. He considers himself as a "supporter" on the forum - he likes to help people out and is learning a lot from it as well. He is trying to make sure that people feel welcome and experience that Umbraco indeed has the most friendly community in the world and that Umbraco is really FUN to work with.

Jan is a part of the Danish Umbraco user group and in 2010 he arranged the very first Umbraco Meetup in Aarhus with his colleague Kim Andersen.

Lee Kelleher

Lee-Kelleher

Lee Kelleher is a freelance ASP.NET developer from Liverpool, (now based near Bristol). Having been using Umbraco for the past 3 years he has become increasingly involved with the community and helped towards building a network of user-groups within the UK. Lee was also awarded an MVP status back in 2010/2011, as voted by the community. He has contributed and developed many packages including the ever popular uComponents project.

With over 15 years of web-development experience, Lee has worked with a vast range of clients from small to large such as Toyota, PricewaterhouseCooper, Ernst & Young and JPMorgan Chase.

Matt Brailsford

Matt-Brailsford

Matt Brailsford (aka Package Machine, aka Karma Whore, aka Karminator) is a Certified Umbraco developer and the creator of a number of top rated Umbraco packages including the Editors Manual and the Desktop Media Uploader. Starting out in early 2010, he has quickly become one of the most active devs within the community.

Sebastiaan Janssen

Sebastiaan-Janssen

Sebastiaan has been a vocal Umbraco enthusiast since he discovered it in 2009. He loves helping people out on Our Umbraco, engaging with the community and blogging about his experiences. Additionally, when the mood strikes him he creates (or contributes to) packages that will make his life as a developer easier and give him more karma, to eventually beat the Karminator.

In his spare time, Sebastiaan loves going to gigs of up-and-coming (indie) bands, enjoys cycling and is interested in science and gadgets. And whiskey. ;)

Well aren't they an interesting and friendly bunch!
I highly recommend you take a few minutes out of your day to watch the Umbraco community celebrate these fine fellows at this years CodeGarden by watching the MVP section in the keynote.

CG11 MVPs Static Video

Like the sound of all this CodeGarden fun? Then why not get in super early for next year's CodeGarden conference with our ridiculously cheap price for the first 100 people, so be quick!

With that being said I'll wrap up here and tell you that in the next installment of the CodeGarden11 wrap up posts, I'll talk about the prestigious Umbraco Awards and who the nominees & winners were of each category.

Until next time,
Warren & The Umbraco HQ

Thursday, June 23, 2011 by Warren Buckley

Another CG has come and gone, we're all a little more tired and a lot more knowledgeable about Umbraco v5.  With CG behind me I thought I'd reflect on the event and the people that make it...well, Umbraco CG in a series of blog posts.

Keynote

CG11-Keynote

Following a rousing introduction by the Chief Happiness officer, Niels Hartvig (aka, the Boss) guided the keynote through a massive collection of topics.....
Up for discussion was the growth of Umbraco as a community and as a company, with the following people taking the stage to discuss the following:

  • Gavin Warrener from Microsoft spoke on the relationship between Umbraco & Microsoft
  • Alex Morris from Mark Boulton Design discussed the new partnership, and how they are helping to improve & advance the UX at Umbraco
  • Per Ploug from the Umbraco HQ, spoke about & demo'd the new release of Courier 2
  • Paul Sterling & Peter Gregory from the Umbraco HQ spoke about Deli
  • Alex Norcliffe & Shannon Deminick from the Umbraco HQ discussed the upcoming release of V5


Rather than me trying to describe the keynote in detail I highly recommend you watch the keynote video or the relevant section.

Entire Keynote
http://stream.umbraco.org/video/2087970/codegarden-11-keynote

Microsoft & Umbraco
http://stream.umbraco.org/video/2087970/2094927/microsoft-umbraco

Mark Boulton Design
http://stream.umbraco.org/video/2087970/2097928/mark-boulton-design-umbraco

Courier 2
http://stream.umbraco.org/video/2087970/2098403/courier-2

Deli
http://stream.umbraco.org/video/2087970/2098468/deli

V5
http://stream.umbraco.org/video/2087970/2098498/v5

Love CodeGarden?

If you thoroughly enjoyed this years CodeGarden or if you were gutted that you didn't make it to this years CodeGarden then make sure to get your ticket for CodeGarden12, as tickets are already on sale, with the first 100 going for a very special price....

So next in the series of blog posts wrapping up the CodeGarden festival, I'll talk about who the fantastic & friendly MVPs for 2011/2012 are and we'll find a little bit more about them.

Warren & The Umbraco HQ

Wednesday, June 08, 2011 by Warren Buckley

Hello there!
With it being exactly one week to go until CodeGarden begins, we thought we should run through  some useful information, let's call it:
"The beginner's survival guide to CodeGarden."

It will be what you make it!

CodeGarden is all about participating and getting involved. Not finding the session you're in  relevant? Move to another! You make CodeGarden what you want it to be, so make sure you come prepared to make the most of it, and most importantly, get involved.

Leave Work at Home

It is super important to make sure you leave work at home and make yourself unavailable to your boss, workmates & clients if and when at all possible. At CodeGarden we want you to have a great time and make yourself present, rather than being unsociable and sitting in the corner checking your work emails every five minutes.  It's just good manners really. :)

Internet

It is unlikely there will be a good stable internet connection at the venue.  We will have some 3G wireless boxes which worked reasonably well last year, but as we all know, WiFi at most tech conferences is unreliable at best.
If you desperately need to use the Internet, which you shouldn't really, due to the "Leave Work at Home" rule, then we recommend you bring a 3G dongle with you.

Marketing

If you distribute marketing material (Flyers, t-shirts, etc) without being a sponsor we'll beat you over the head with the above aforementioned dongle, and ban you from CodeGarden forever. If you're interested in becoming a last minute sponsor get in touch to avoid any bruises ;)

Finding the venue

The venue is called "Kedelhallen" (The kettle hall) and is located on Nyelandsvej 75A, 2000 Frederiksberg. IMPORTANT! Google Maps have it mapped wrong! Here's the street view of the venue location and the venue has a huge chimney, handy to use as a landmark.

Be there before 9:00

The Conference starts at 9:30 sharp, but registration opens at 8.00. So help everyone by coming early and making registration as smooth as possible. There is a large number of us, so it may take a little time to get everyone through.  Take the opportunity, meet some new people, drink some coffee, shake a few hands and remember to 'smile.'

Remember cash

While food, water, coffee, etc is on the house, you might want to buy snacks or something else at the cafe. BUT the Cafe only accepts the Danish credit card "Dankort" or cash. So, make sure to bring Danish crowns in cash as most places will only accept Danish crowns, not EUR or USD.

Sun block

The venue has a large outside area which traditionally is used for informal breakout sessions, and the weather is looking GOOD. So remember to bring sun block, sunglasses and a hat, and look forward to turning that LCD tan into something a bit more decent.

It's a festival - not a conference... CodeGarden doesn't stop at 4'o clock

There's dinner and social events on both Wednesday and Thursday. On Wednesday we'll celebrate a great first day by touring around the canals of Copenhagen in charted canal boats with music and a bar. On Thursday, there's the infamous and classy (cough) Umbraco Bingo. So to recap, CodeGarden does not end at 4 o'clock, make sure you stick around!

Bring your laptop

To get the most out of CodeGarden you'll need your laptop ready to run Umbraco.  You will likely be installing tons of new stuff during the conference, especially if you plan on attending the new hands on track we have for you.

CG11 is the official hashtag

If you're adding photos to Flickr or if you tweet about CodeGarden make sure to use the CG11 hashtag (#CG11 on Twitter) so it'll be a part of the backchannel.
We've also added a Flickr Group for everyone's photos, so any photos you take, make sure to post them to this group with the following tags: "CodeGarden11" "CG11" "Umbraco".
Also please tag yourself or other people in these photos, as they will appear on your profile page on the CodeGarden 11 site. For example here are some photos of Niels.


Sweet!  That's about everything you'll need to know to survive this year's CodeGarden Festival.
We'll see you in a week's time when the fun begins!
The Umbraco HQ.

Thursday, June 02, 2011 by Warren Buckley

Ok! Here it is, the final instalment of our 'Up close and personal' questions and answers write up. Not long to go now, the hype is getting huge, and with this line up, it's pretty obvious why! I don't want to say we saved the best till last, but, well.... i'm last, so. Enjoy!"

Jason Prothero

Jason-Prothero

Q: So this year you are doing a session at CodeGarden titled "The E-Commerce Showdown". Can you tell us what the session will be about?

A: I'm on the e-Commerce package showdown panel talking about Commerce 4 Umbraco. I'll generally be talking about its current state, pluses/minuses of the package, and how others can get involved since it is an open source project. Before Codegarden I plan to have a down-loadable demo store and hopefully an install that actually works well! Basically, I'd like to make C4U a viable option in the Umbraco e-commerce world and make it easy for developers to get involved in the future.

Q: What are you most looking forward to at this years CodeGarden?

A: I'm really excited about meeting all the people I know through Twitter and Our.Umbraco in person! I'm also really excited to learn about Umbraco 5 and Courier 2. CodeGarden looks like a blast from what I've seen in the past. I'm just really excited to be able to go this year!

Q: What is the most exciting thing for you about the upcoming V5 release?

A: Well, I'm excited to have a fully MVC experience and it appears that the extensibility has been taken to a new level. But really, I love Umbraco as it is, so v5 just means more good stuff, right?!

Paul Sterling

Paul-Sterling

Q: So this year yourself and Peter Gregory are presenting a session at CodeGarden, titled "Introduction to Deli". Can you tell us a little about Deli and what we can learn at your session?

A: Peter and I (and a bunch of other folks from the Umbraco HQ and the community) have been hard at work making the Deli something that will add more value to the Umbraco Community and will broaden the opportunities in the Umbraco commercial ecosystem. The Deli is the evolution of the Projects section from our.umbraco.org and retains all the goodness Projects have now, but adds a marketplace for commercially licensed packages. The Introduction to Deli session is aimed at package creators who are interested in offering commercial packages to the Umbraco community. We'll talk about the ins and outs of entering the commercial package space and how the Deli helps ease some of the difficult parts of getting started. We'll also give a thorough introduction to the tools for vendors in the Deli; from the built-in license creator to the vendor dashboards - and a few more things we'll keep as a surprise. If you have a commercial Umbraco package now, or think you might create one in the future, this session will be an hour of your time very well spent.

Q: What are you most looking forward to at this years CodeGarden?

A: Aside from high-fiving as many of the amazing Umbraco community folks as I can, I'm excited to talk with old friends about what they've been up to with Umbraco in the last year and to hear about how new friends are using Umbraco now. I'm also interested to see how the CodeGarden morning runs feel after some of the legendary CodeGarden parties.

Q: What is the most exciting thing for you about the upcoming V5 release?

A: I am very excited about the Hive we've heard so much about, and the potential for running Umbraco in widely dispersed and loosely coupled cloud environments this brings to V5.

Casey Neehouse

Casey-Neehouse

Q: What are you most looking forward to at this years CodeGarden?

A: It has been a long time since I have seen several of my Umbraco friends, and I really look forward to connecting with them, catching up, and experiencing the world of Umbraco. The level of creativity present at the CodeGarden festival is nothing short of amazing, with some of the most useful packages and tools being delivered at the event.

Q: What is the most exciting thing for you about the upcoming V5 release?

A: Umbraco V5 (Jupiter) most intrigues me by the fact that it is a ground-up rebuild of Umbraco into the latest and greatest technology from Microsoft. I feel that this release will entice new users to consider Umbraco, and the testing enhancements that are present in the codebase will make Umbraco more stable than ever before. The team behind Jupiter is some of the worlds most technical and creative minds. With them, what can't I look forward to?

Warren Buckley

Warren-Buckley

Q: What are you most looking forward to at this years CodeGarden?

A: I will have to say the same as most people and say it's great to catch up with old friends and make new ones and to hear how everyone uses Umbraco differently. For me it is hard to pin it to one particular thing as I have been organising CodeGarden with the rest of the Umbraco HQ. With the amazing schedule we have this year, the hands on track, along with the infamous Umbraco bingo and other great surprises & treats all I can say is that this years CodeGarden will be the best one yet!

Q: What is the most exciting thing for you about the upcoming V5 release?

A: I must admit I haven't had much time to look into V5, but with those clever whizz kids from the core team hard at work with an entire rewrite, its bound to be amazing! With that said I think the most exciting thing that I know about V5 is that for a developer like me, the ideologies and methods behind Umbraco are staying the same.

So, that's us.  Most of the team who will have the pleasure and privledge of teaching, discussing and hopefully inspiring you with all things Umbraco this CodeGarden.  If we havn't said it enough yet, this year will be THE YEAR to get yourselves down here.  A lot of the conference is dedicated to making the move over to V5 easy for you, and your team.  There will also be introductions made to some fantastic new products such as Courier 2 and The Deli.  Throw in there the legendary Umbraco bingo, meeting up with old friends and making new ones... why would you even consider sitting at home and reading the hype on twitter?  Buy your ticket NOW!  Once you've secured one, come back here and leave a comment telling us what YOU are looking forward to most at CG11.

Friday, May 27, 2011 by Warren Buckley

Hiya,
As we are getting closer and closer to CodeGarden the buzz and hype surrounding it is growing on twitter and I think we can all agree on that this years CodeGarden is going to be far the best.

So to continue with our "Up close and personal" blog post series, I have spoken to some speakers to see what they
have to say about CodeGarden.

Doug Robar

Doug-Robar

Q: So this year you are doing a session at CodeGarden titled "Did you Know?" Can you tell us what the session will be about?

A: Knowing as much as possible about what Umbraco does very well and very easily helps me build better sites more quickly and with higher profits. As a long-time Umbraco user and #lazyweb I'm always interested in finding things I didn't know about Umbraco. Helpful tips. How-to's. Tidbits. Rules of thumb. Hidden gems. Best practices and examples of what-not-to-do. Folklore and history. All these things make the Umbraco project and the people involved in it even more special.

This is a fast-paced session for both new and experienced users. I'll be sharing a huge grab bag of stuff; everyone will find something they didn't know.

Q: What are you most looking forward to at this years CodeGarden?

A: It's been said many times and I'll echo it again... the people! To be sure, CodeGarden is a great opportunity to learn about the latest Umbraco developments and learn from the gurus. But collaborating in real time, talking face to face with people from around the globe that I've only met online, getting excited by all the cool things others are doing with Umbraco and receiving encouragement and support for my own ideas and projects... what could be better?

I know we geeks are supposed to be socially inept. Maybe that's true in general, but not in the Umbraco community! I've trained hundreds of people and met hundreds more and I can tell you there's something very special and unique about the Umbraco community. These people aren't just decent, friendly folk. They are the kind of people I want to have as friends, to invite home, meet the family, and share a meal with. CodeGarden is the biggest gathering of my worldwide friends and colleagues. I wouldn't miss it for anything.

Oh, and I'll also go home with a bunch of new skills and code.

Q: What is the most exciting thing for you about the upcoming V5 release?

A: Unconventionally, I'm really excited that so much is staying the same in v5. Site builders have learned the How's and Why's of Umbraco and won't be losing that investment with 5. What you know about document types, templates, macros, being a super hero to your users, all those foundational concepts and principles, the stuff you use in every site you build are totally applicable in v5. I'm thrilled that even though the internals are all new and greatly improved and we'll all benefit from that in v5 and beyond, the core concepts of what Umbraco is and does remains the same. Take a deep breath, bask in your existing Umbraco skills, and then dive deep into V5 at CodeGarden for even more greatness!

Darren Ferguson

Darren-Ferguson

Q: So this year you are doing a session at CodeGarden titled "Multi Language Websites in Umbraco". Can you tell us what the session will be about?

A: Our session has two presenters - I'll be demonstrating the more traditional approach to multi language sites in Umbraco, including some information on the relations API. The whole demo is put together live with a bunch of Razor, with a few bad jokes thrown in for good measure. Dimitri, the other speaker has a bit more of an innovative approach to demonstrate it. I've not seen it yet, so I'm looking forward to being a spectator for part of the presentation. Finally - we'll open up to Q&A at the end.

Q: What are you most looking forward to at this year's CodeGarden?

A: Catching up with old friends and hopefully making some new ones. It is always nice to meet the people that you've communicated with in the Umbraco community in the past year. Hopefully we'll be blessed with the usual CodeGarden weather this year - there is nothing quite like sitting out on the lawn at the venue with a beer - talking geek.

Q: What is the most exciting thing for you about the upcoming V5 release?

A: Hive (storage agnostic persistence) looks great - but just the re-architecture in general. I'm less fascinated by the fact that it is MVC and more interested in the fact that the project has an extremely competent full time architect this time around. Hopefully the team will be kept off the beer to avoid any more "Grapper" namespaces :)

Dimitri Kourkoulis

Dimitri-Kourkoulis

Q: So this year you are doing a session at CodeGarden titled "Multi Language Websites in Umbraco". Can you tell us what the session will be about?

A: Actually I am going to share a session with Darren Ferguson, on multi-language web sites in Umbraco. For my part of the session, I will be demonstrating a method of providing and managing multilingual content without relying on multiple sites.

In the environment where I work, it is very important to offer the exact same structure of information to all visitors, regardless of their choice of language. When we started using Umbraco, most of the documentation we were able to find on the subject proposed setting up multiple sites within an Umbraco installation, one for each of the supported languages. We needed to support many languages and we thought that going about doing things this way would pose two risks; that publishing multi-lingual content simultaneously would be hard to manage and also that different visitors would see different versions of the site, when for example certain translations are not ready as fast as others or even due to human error.

So we realised that what we needed was what was often referred to as a "1:1 multilingual site structure". We found some information about how to implement this in Umbraco. Over time, also taking feedback from our users into consideration, we evolved the method and today we are quite happy with it.

I will be explaining to the audience how such a system can be set up and, most importantly, demonstrate that this is a viable solution, perfectly feasible to implement in Umbraco. I hate to spoil the suspense but I have already made a package with this method and have posted it on our.umbraco.org. I think that, using the package, some time will be saved so that I can focus on how the method solves problems, rather than going into too many development details.

Q: What are you most looking forward to at this years CodeGarden?

A: This will be my first year at CodeGarden, so I am not sure exactly what to expect. I have enjoyed the BUUG festival which I have attended in Belgium. It was very informative and it was nice to meet members of the Umbraco community for the first time. I know that CodeGarden is a very big event for Umbraco, so I am looking forward to being there, getting to know the community even better and, of course, to find out as much as possible about version 5.

Q: What is the most exciting thing for you about the upcoming V5 release?

A: I am sure that there are many details about V5 that I do not know yet, but from what I am aware of so far, I would say that Hive is the most exciting thing for me. It is very often that one has to link to external data sources these days, so anything that helps towards this end is certainly good news!

Niels Kühnel

Niels-Kuhnel

Q: So this year you are doing a session at CodeGarden titled "Forget About Resource Strings. Umbraco.Foundation.Localization". Can you tell us what the session will be about?

A: It's about how to manage all the "micro content" you have in a website. That is, how Umbraco 5 helps you and the end users manage all the small texts, validation messages etc you have in your templates and code. As a bonus the localization framework is compatible with all (spoken) languages in the world so it will help you in the frontend when you're doing multi language homepages. It also supports a lot of different text sources which will help your work flow in the development phase. Come see the texts in the backoffice be changed from a Google Spreadsheet.

Q: What are you most looking forward to at this year's CodeGarden?

A: Meeting up with everyone in the same time zone and sharing ideas in an informal atmosphere without a 140 character limit is something I'm really looking forward to.

Q: What is the most exciting thing for you about the upcoming V5 release?

A: The Hive. The unified approach to handling all the data sources that make up a modern website the same way is simply brilliant. Apart from that, the fantastic and solid approach to content management that has evolved and matured in the world's friendliest community over the years now runs off world class code and architecture. It's highly unlikely that any single company could ever encapsulate that amount of talent, brilliance and experience in a product.

Anders Burla Johansen

Anders-Burla-Johansen

Q: So this year you are doing a session at CodeGarden titled "The E-Commerece Showdown". Can you tell us what the session will be about?

A: This session will introduce you to three different e-commerce solutions for Umbraco - Tea Commerce, uCommerce and Commerce for Umbraco. You will be explained the possibilities with the various systems, their strengths and which system is best suited for specific scenarios. It will be an intense session, as each presenter only has 15 minutes to present their system, giving You the best tools and knowledge to build your next e-commerce solution with Umbraco. At the end of the session we will have a 15 min Q&A - so prepare your e-commerce questions and we will have the answers.

Q: What are you most looking forward to at this year's CodeGarden?

A: Meeting the entire Umbraco community - meeting familiar faces, new ones, and faces I only know from a Twitter profile. And of course the Umbraco Bingo - wondering what surprises the team has arranged this year!

Q: What is the most exciting thing for you about the upcoming V5 release?

A: As a package developer, I'm most excited to see how you build third party packages with the new API. I want to see how the new stuff works under the hood, how easy it is and what new possibilities it gives.

Søren Spelling Lund

Soren-Spelling-Lund

Q: So this year you are doing a session at CodeGarden, titled "The E-Commerce Showdown" can you tell us what the session will be about?

A: We're taking a look at what makes uCommerce 2.0 tick, when it makes sense to use it, and what you can expect when you do decide to use it. We'll cover the new Marketing Foundation and what it brings to the table to help you build advanced e-commerce solutions. Basically how you'll discover how to build awesome e-commerce solutions with Umbraco. Plus we'll have a couple of cool surprises in store for attendees at this session, so remember to sign up today :)

Q: What are you most looking forward to, at this years CodeGarden?

A: For me personally the high point of CodeGarden is always meeting old and new Umbracians and catching up from last year. It's always a treat to meet the talented people working with Umbraco out there.

Q: What is the most exciting thing for you about the upcoming V5 release?

A: The big thing is getting an honest to god architecture for Umbraco and the opportunities it will bring for cool new features in Umbraco itself and uCommerce, of course. The Hive looks especially promising for integrating custom data in an even more seamless fashion that what we can do today.

We may be bias, but we loved reading through the different session synopsis, and especially people's individual and unique reasons why they love attending CodeGarden and what they are anticipating most about the new version 5 release.... one of the main focus' of this years conference. If you have yet to purchase your ticket, head over to the Umbraco site, there are limited tickets left. Once you've secured one, come back here and leave a comment telling us what YOU are looking forward to most at CG11.

Monday, May 23, 2011 by Warren Buckley

Hello again.
Following on from the success of the ' Up close and personal interviews with the CodeGarden speakers', we thought it would be a great idea to do a follow up post, asking the same questions to more of our fantastic CG11 line up.

Tim Geyssens

Tim-Geyssens

Q: So this year you are doing a session at CodeGarden, titled "Contour Strikes Again". Can you tell us what the session will be about?

A: After last year's introductory session to Contour (our official form builder) I'm diving deeper into the possibilities. Taking Contour a lot further then a simple contact form and showing how you can use it for polls, voting forms, quizzes, registrations and much much more. You'll see that it takes only minimal effort and you end up with reusable components that can save you a lot of valuable time.

Q: What are you most looking forward to at this year's CodeGarden?

A: It's hard to pick a single favorite...  For me it's the combination of interesting sessions, being around the who's who in the Umbraco world, and catching up with old and new friends that makes CodeGarden an incredible and not-to-be-missed event.

Q: What is the most exciting thing for you about the upcoming V5 release?

A: I can't wait to see the first sites running on V5 and the community creating extensions and packages.

Per Ploug Hansen

Per-Ploug-Hansen

Q: So this year you are doing a session at CodeGarden titled "Team Development with and/or without Courier 2.0".  Can you tell us what the session will be about?

A: Well, in the last couple of years, we've seen massive adoption of Umbraco in big corporations who have big development teams, big editorial teams, or both.
With these new users, we are also seeing new usage patterns. Like running Umbraco in multiple instances to handle development, testing, staging or content approval. This has so far been really complicated, due to the Umbraco 4 architecture.
So my talk is about how teams have handled this so far, what are the lessons learned and suggested best practices.
Based on these common scenarios, I will show two things with Courier 2:

  1. How developers can add new features to a test instance, transfer the modifications to a staging environment, without worrying about database merges, dependencies or development files.
  2. How editorial teams can work on content on an internal instance and push content revisions to a live site, without any technical knowledge.

Q: What are you most looking forward to at this year's CodeGarden?

A: Catching up with old friends and meeting new ones. Also, looking forward to seeing the core team present their baby to the world. I know they are extremely proud of what they've made, so it will be great to see it presented to the public.

Q: What is the most exciting thing for you about the upcoming V5 release?

A: I've yet to actually look into the technical details of V5, but to me, it's massive that we get to MVC, get all the underlying code cleaned-up, and still stick with the tried and true formula that has made Umbraco such a big success.

Martin Beeby

Martin-Beeby

Q: So this year you are doing a session at CodeGarden, titled "Azure & Umbraco" Can you tell us what the session will be about?

A: I'm going to be talking about how and why Microsoft used Umbraco and the Azure cloud computing platform to get a UK Tech.Days registration site live. It was a pet project for me and I learnt a lot about Umbraco and Azure along the way which I'd like to share.

Q: What are you most looking forward to at this year's CodeGarden?

A: I am really fascinated to learn more about Version 5, being an MVC developer I'm really excited by the direction Umbraco is taking. It's my first CodeGarden so I am looking forward to meeting everybody, if it's as welcoming and as friendly as the Umbraco UK Festival was last year then I know I am going to have a great time.

Q: What is the most exciting thing for you about the upcoming V5 release?

A: MVC and support for Azure are major wins for me, I'm itching to find out more and dig deeper into the new features at CodeGarden.

Aaron Powell

Aaron-Powell

Q: So this year you are doing a session at CodeGarden titled "Collaboration in Umbraco" and "0 to Hive in 45". Can you tell us what these sessions will be about?

A: This year has seen a lot of exciting changes in Umbraco, from a developer on the project's point of view. First off we moved away from TFS and this saw something exciting... a lot of commits from the community. This was everything from fixing bugs to expanding existing core features. Ultimately though Mercurial is still a foreign concept to many developers and it can be a bit tricky to get started, so I want to share why it has worked so well for Umbraco and how you too can get started with it.
On the last day I'll be co-presenting with Alex Norcliffe a session in which we'll be diving into the deep new layers of V5. There's a lot to cover in this session, it'll probably be fairly hectic talk as there's a lot to cover! Alex has already given a good synopsis in his interview - /follow-us/blog-archive/2011/5/17/up-close-and-personal-with-the-codegarden'11-speakers

Q: What are you most looking forward to at this year's CodeGarden?

A: One of the things I'm most looking forward to is getting to meet all the people I know through Twitter, our.umbraco, etc. It's always exciting to meet people who you chat to in a virtual environment face-to-face. And as always I'm looking forward to seeing what craziness the HQ team has come up with, every year there seems to be something new and wacky brought to the conference.

Q: What is the most exciting thing for you about the upcoming V5 release?

A: I'd have to say I'm most excited about the possibility of interacting with your own data in a much simpler fashion. It's always been possible to extend Umbraco to work with your own data inside Umbraco but it has never been a simple task and more often than not you had to work around tricky limitations within the core of Umbraco.

Adi Molina

Adi-Molina

Q: So this year you are doing a session at CodeGarden titled "Spicing Up Umbraco". Can you tell us what the session will be about?

A: "Spicing-Up-Umbraco" encompasses clever ways of transforming Umbraco instances into a client-driven application by applying a few techniques, such as adding new sections, creating your own trees, and tailoring the user interface to fit the exact needs of a client. The session will also highlight the concept behind the Umbraco content management system developed for FOX International Channels: a global publishing platform that features multilingual websites, all under one abstract, product-independent application built for television networks such as FOX, FX and The National Geographic Channel.

Q: What are you most looking forward to at this year's CodeGarden?

Being my first CodeGarden, I am stoked to get to meet, learn from and share ideas with the Umbraco community as well as the Umbraco core. I'm eager to attend the sessions encompassing Jupiter and Umbraco's next steps and future plans. But most of all, I'm looking forward to the Boat Party of course!

Q: What is the most exciting thing for you about the upcoming V5 release?

The idea that Jupiter switched over to MVC makes it particularly interesting. As developers, we can definitely take advantage of MVC's incredible features in order to create even friendlier, sophisticated interfaces and help us automate tasks efficiently. I cannot wait to spice-up v5!

Sebastiaan Janssen

Sebastiaan-Janssen

Q: So this year you are doing a session at CodeGarden titled "Macros - XSLT & The Razor Way". Can you tell us what the session will be about?

A: I like toying with new technologies so I've been very active in using Razor in Umbraco even before it was released. Before that I used to use XSLT almost exclusively as I felt UserControls were not very beneficial for my productivity. Developers now have an interesting choice, as Razor and XSLT are similar tools. My talk will focus on the good bits of both Razor and XSLT and when you would use which.

Q: What are you most looking forward to, at this years CodeGarden?

A: What I love about CodeGarden every time is talking with great people who have great ideas about Umbraco and software development in general. But I'm also really excited to learn all about Umbraco 5. I am looking forward to starting developing new packages right away because I'm sure I'll be incredibly inspired!

Q: What is the most exciting thing for you about the upcoming V5 release?

While V5 will be exciting for many reasons, I'm mostly looking forward to working with the new API and easier creation of custom datatypes in the backend. Extensibility has always been my main attraction to Umbraco and I'm happy to get productivity improvements in the new version.

 

 

We may be bias, but we loved reading through the different session synopsis, and especially people's individual and unique reasons why they love attending CodeGarden and what they are anticipating most about the new version 5 release.... one of the main focus' of this years conference. If you have yet to purchase your ticket, head over to the Umbraco site, there are limited tickets left. Once you've secured one, come back here and leave a comment telling us what YOU are looking forward to most at CG11.


Warren & the Umbraco HQ.

Monday, May 16, 2011 by Warren Buckley

Those of you who have been onto the CodeGarden 11 website would have seen and possibly already signed up on the session information and time table page. We know with so many top notch speakers presenting awesome and informative sessions, it's going to be hard to choose.. To make it a little easier (or possibly harder...) we've asked a few of the CodeGarden11 speakers a couple of questions about who they are and what they'll be presenting on.

Niels Hartvig

Niels-Hartvig

Q: So this year you are doing several sessions at CodeGarden on version 5 of Umbraco, can you tell us what the sessions will be about?

A: My sessions will show how big an effort we've put into making existing v4 lovers feel at home. This has been one of the promises from the very beginning and the core team has done an incredible job of following through and I get the easy job of showing their great work. I'm also doing an intro session on MVC which is mainly targeted at designers/web developers who are looking for reusable MVC patterns to use when they go back and build websites.

Q: What are you most looking forward to, at this years CodeGarden?

A: Meeting old friends and introducing new people to the cozy yet serious atmosphere that makes CodeGarden so special. And of course giving the MVPs a big hug on stage.

Q: What is the most exciting thing for you about the upcoming V5 release?

A: Even though we're not done yet, I can't wait to show the amazing progress. With v5 the core team has built an amazing foundation for the next five years which lets us move forward at an incredible pace. It's the version of Umbraco that I dreamed of building but never had the skills to pull off. As such, a wonderful proof of the power of open source!

Peter Gregory

peter-gregory

Q: So this year yourself and Paul Sterling are presenting a session at CodeGarden, titled "Introduction to Deli" can you tell us a little about Deli and what we can learn at your session?

A: Deli is the new Umbraco marketplace where the Umbraco community will have the ability to buy and sell commercial Umbraco products.  Our session will provide developers with all the information they will need to get started licencing and selling their packages.

Q: What are you most looking forward to at this years CodeGarden?

A: This is a pivotal year in the life of Umbraco with the upcoming release of V5, there is a sense of excitement and anticipation in the air and I believe it will be the one not to miss.  It is a chance to collaborate and socialise with what I think is one of the friendliest developer communities around.

Alex Norcliffe

Alex-Norcliffe

Q: So this year you are doing a session at CodeGarden, titled "0 to hive in 45" can you tell us what the session will be about?

A: In researching and designing the architecture of v5 over the past year, one huge common denominator was always the way we treat data in projects. The sources of data, and their quantity, have changed a lot over the past few years, to the point where an average website is legitimately a collection of data from all over the place: for example Twitter, a Flickr feed, an existing image management system, and of course the CMS itself. Hive is all about enabling a configurable way of plugging that content into the underbelly of Umbraco 5, and still leave editing and templating it as friendly as ever.

Q: What are you most looking forward to, at this years CodeGarden?

A: I'm excited about the team being able to shed light on all the work we've been doing on version 5 and getting those focused and creative discussions going that only CodeGarden can provide.

Q: What is the most exciting thing for you about the upcoming V5 release?

A: Being at the coalface for many months means there's too many exciting things to list, but I know I'm looking forward to seeing what funky things people create with the tools we've built into version 5.

Shannon Deminick

shannon-deminick

Q: So this year you are doing a session at CodeGarden, titled "Get Plugged into Jupiter" can you tell us what the session will be about?

A: Jupiter's (the codename for V5) back-office has been re-engineered from the ground up with extensibility as a primary focus. My session will be about all of the great new ways to extend the Umbraco back-office by way of Plugins. Nearly all of Jupiter's back-office functionality is driven by Plugins, from context menu items to the editors you see in the right editor panel. In my session I'll be reviewing all of the different types of Plugins and their structure, the basics on how to create all of them, then a deep dive on creating a more complex one from the ground up and getting it installed.

Q: What are you most looking forward to, at this years CodeGarden?

A: I can't wait to meet up with everyone I've met from the previous years and actually meet all of the people on Twitter that I only know through the Interwebs. Most importantly for me, I'm looking forward to learning and sharing ideas with all of the smart people in this community.

Q: What is the most exciting thing for you about the upcoming V5 release?

I'm really looking forward to helping developers get started with creating packages for Jupiter. I'm hoping that the new framework will make it a breeze for them to create amazing new add-ons. I've already had a few requests for how to get started so hopefully we'll have a few Jupiter packages ready to go before CG11!

So if you haven't booked your ticket to CodeGarden yet, then what are you waiting for go and sort it out now.

Here at the Umbraco HQ, we love hearing from you all, so why not tell us what your most looking forward to at CodeGarden or the upcoming V5 release in the comments below.

Wednesday, May 04, 2011 by Niels Hartvig

mix11195946

As you've may seen, I was given the awesome chance of appearing in the keynote at this years Microsoft MIX '11 conference. It was an amazing (and terrifying) experience and a milestone beyond what anyone in the project had dreamt possible (except for Sir Paul Sterling who made it happen!).

People who've met me knows, that there's (almost) nothing I love more than talking about Umbraco and I'm proud to be representing such an awesome project at various conferences. But a keynote at the biggest Microsoft event for web developers was enormous and I wanted to find a great way to show that this project is a true team effort and not an ego one. At the same way it was a great chance to thank the ones who believed the project when it was 10% great idea and 90% bugs. So the respect tee was born and I wore it with pride during the 4 minutes and 30 seconds of fame…

The Respect tee - Design by Tore Rosbo

Credit where due

Today Umbraco is a well known and proved platform, but it hasn't always been that way. Years ago it was nothing but an idea and some pretty bad code (at one point even written in ASP Classic and VB6 COM objects!) written in a tiny flat in Copenhagen, Denmark. But for some reason a bunch of people and a few agencies could see the potential and believed me when I said "come and participate, it could be awesome.".

These are the types of people on the Tee above. The agencies who early on brought clients, the developers who contributed to the source, the community people who devoted a ton of their time to introduce new people to the platform. The seeds. The Umbraco DNA.

They are (in the random order they appear on the Tee):

  • Thomas Madsen-Mygdal. An old friend and inspiration. The guy who introduced me to the crazy phenomenon "Open Source" and who talked about transparency and participatory culture before it got devaluated into buzzwords.
  • Anders Pollas. The first guy (except me) to do an implementation on Umbraco. Poor guy. That wasn't easy, but he was patient and kept coming back with ideas and also contributed to the first starter kit back when we proudly released Umbraco 2.0 (David Hasselhoff, anyone?)
  • Kasper Bumbech: The guy who really introduced me to a better way of doing .NET dev and a lead driver in porting Umbraco to .NET. Before Kasper I was still convinced that the best place to do business logic was in sprocs. Imagine that.
  • Ebita. A Copenhagen based agency who were among the first to believe in Umbraco for their clients and the first company to contribute directly to the source. And the company who hired me at a point where I would have gone broke if it wasn't for them
  • Per Ploug Krogslund. The artist formerly known as Per Ploug Hansen and the first employee in the HQ (now partner). I'm so lucky you came. If it wasn't for you, the project wouldn't be where it is today.
  • DGU. The first major client on Umbraco and my biggest client when I tried to finance Umbraco dev doing implementation. The probably regretted it as the project really was a mess, but their big ambitions with their site made Umbraco ambitious too.
  • Douglas Robar. Umbraco MVP all years. This guy needs no introduction. A warmer, more patient and friendly guy doesn't really exist. I'd love him even without his EOS.
  • 1508. The other agency who believed in Umbraco even before it was completed. They've been generously giving advice, they've contributed, they've brought amazing clients and last year we became a client as they did our new identity.
  • Jesper Ordrup. MVP Followed Umbraco before it was released. His teasing blog posts and comments followed every announcement where I had to postpone the release of Umbraco and was super motivating. MVP in 2007 and producer of some of the first packages for Umbraco. And he's still around.
  • Thomas Höhler. His claim to fame might be as "The Grillmeister", but like Jesper he was among the first to contribute packages to Umbraco and also a 2007 MVP. He's also around still and even started doing official Umbraco training in Germany this year!
  • Dirk DeGrave. MVP 2008, 2009 and 2010. Still today the guy who've replied to most posts in the forum. A big inspiration for many who've learned that contributing by sharing knowledge is as crucial to Umbraco as creating packages.
  • Lee Kelleher. 2010 MVP and an instrumental part of the Umbraco community today. In building an Umbraco ecosystem in the UK, in contributing with packages and in replying to forum posts. A role model for any 2011-Umbracian.
  • Richard Soeteman. 2010 MVP and the Dutch package monster. An inspiration for realizing that Umbraco could also be a commercial platform for indie package developers.
  • Morten Bock. 2009 MVP. This guy is like an Umbraco cork. He surfaces and disappears (due to workload). But when he surfaces he brings amazing constructive criticism and great input on how Umbraco can be improved for developers relying on the platform.
  • Warren Buckley. Aka the Creative Website Starter. An alltime Umbraco MVP (2007, 2008, 2009 and 2010) and the creator of the most popular way to learn Umbraco for frontend devs.
  • Matt Brailsford. Contrary to the rest on the list, he hasn't been around always. He popped out of nowhere last year but quickly became known by everyone for he's incredible number of packages (and their incredible usefulness and quality). He's known as the Karminator and you only need to look at the chart of highest ranked people on Our Umbraco to realize why.
  • Morten Christensen. Creator of the Google Analytics and Default Values packages that for many is among the most essential ones to Umbraco dev (and why some people still begin new development on 4.5.2 - when is that upgrade coming, Morten!). Also the main driver in the efforts of building the Danish Umbraco community
  • Paul Sterling. The guy leading the US operations and instrumental in keeping things professional in the HQ while understanding that our casual tone is an essential part of our DNA. I can't count how many fires he has had to extinguish because of me and my bad European habits.
  • Aaron Powell. The one half of the Australian Code Mafia(tm) and a guy who dared put his own rumor on stake in the efforts of improving the core of Umbraco at a time where most .NET developers thought it was more constructive to stultify.
  • Shannon Deminick. The other half of the Australian Code Mafia(tm). Like Aaron he dared to go places in the core where no others would risk going and the quality of the current core gained a significant jump with his contributions. Also one of the founders of the uComponents project which really should be default in any Umbraco install.
  • Tim Geyssens. Was on the first ever Umbraco course (that I teached) and I remembered how this awesome Belgian guy just got the Umbraco way of thinking. From there it went fast as he became a 2008 and 2009 MVP due to his continuous blogging and packaging efforts and in late summer 2009 he became the 3rd employee in Umbraco.
  • Casey Neehouse. As an MVP in 2007 and 2008 he helped countless people back when the Umbraco community was nothing but dreams and an Yahoo mailinglist and also the creator of Doc2Form. Unfortunately, my ego scared him away in end of 2008 but luckily the story got a happy ending this year when my ego calmed down and Casey returned now in the form of an HQ employee. A proof that nothing is impossible in the world of Umbraco
  • Peter Gregory. Have spend tireless efforts in promoting Umbraco down under. Despite being a kiwi he has know moved to Australia and joined the HQ where he'll lead our efforts in making Umbraco even more known
  • Alex Norcliffe. Our lead architect on Umbraco 5 (aka JUPITER) who is a rare bread that respects and listens to people who implement websites and try to balance the need for keeping it easy while giving the core of Umbraco the most beautiful architecture known to man. Seriously, this guy needs to cope with me on a day to day basis. That alone is something!
  • Gregory Roekens. CTO of Wunderman London and the guy that called me up a Friday evening in 2007 while I was cooking dinner to let me know that http://www.peugeot.com would move to Umbraco. I was baffled. It was that evening and because of that call I finally realized we were on to something. I remember the whole scene as if it was yesterday.
  • Lars Buur. My first real boss. Hired me straight out of high school in 1998 to work on the first Danish CMS (Site In A Box(!)), despite I knew nothing about databases or ASP. He later told me that it was my Delphi knowledge that got me the job. If it wasn't for Lars (and the co-founder of the company Thomas Christensen) I wouldn't have known about CMS, maybe I wouldn't even had gone into web dev and I for sure wouldn't have been 'raised' in an environment so packaged with an 'everything is possible' attitude.

So that's the twenty. The MVPs, the biggest core contributors, the early adopters and motivators. Making a v2.0 of this tee would be impossible. Even a 6pt font size on a XXXL couldn't fit the names of the people driving Umbraco forward today. But the project is standing on the shoulders of these fine people. If you meet them, give them a hug and a high five! It's easy to recognize them if they wear the t-shirt. It's exclusively made for them. A very limited edition for a very rare group of special people.

Love and godspeed Umbraco!

Thursday, April 28, 2011 by Shannon Deminick

There's been a ton of great progress made on Umbraco v5 (aka Jupiter) in the last month and I'm finally taking some time to write a blog post or two about Jupiter and some of it's new features, more specifically Plugins. There's a lot of stuff to write about regarding Plugins and I realized that the only way it was going to be possible was to put together a series of blog posts. If you are attending Code Garden this year, I will be doing a session on Plugins in Umbraco Jupiter and urge you to read this series as it becomes available so you can have a bit of a head start.

The first part of the series is an introduction to Plugins, what they are and what types there are. Future posts will go into detail on how they are made, installed & loaded into Umbraco. If you are like me and can't wait to jump into some code, we actually have a public Umbraco Jupiter Wiki site running that contains much of the technical details of v5. Keep in mind that this wiki is a work in progress and we will be constantly updating it as the codebase progresses.

Here's the first part in the series of Umbraco Jupiter Plugins.

Enjoy!

Wednesday, April 20, 2011 by Warren Buckley

As I mentioned from my last blog post, I'm going to blog more regularly about any news we have about CodeGarden here at the Umbraco HQ, so here's the next installment!

Before I carry on, if you are reading this and thinking "what is CodeGarden?" Well, it's Umbraco's annual conference. Check out this post announcing CodeGarden tickets are for sale and how to convince your boss you should come for more information.

This year we are proud to announce something new and different which we haven't done before at previous CodeGarden festivals. This year not only are we going from two days to three full days dedicated entirely to Umbraco, but we have decided here at the HQ that we are going to dedicate an entire track to hands on workshop & learning.

 

So what can you expect from this new track at CodeGarden?

We will have a nice relaxed environment for you to code and get hands-on experience & advice with the Umbraco core team themselves. Yes you read that right, you will be able to get hands on knowledge and advice from the brains behind Umbraco at no extra cost.

The workshop will run all 3 days of CodeGarden which will also have a focus on getting hands-on experience with Umbraco 5, so this is a perfect time to take a break from the client projects at home and get hands-on practical knowledge about the brand new version of Umbraco, re-written from the ground up and built on Microsoft's MVC3 stack.

This track is also a great way to meet and discuss with like-minded attendees to discuss version 5 package ideas and work together to win that all important package competition!

 

Package Competition

Each year we give developers a chance to build & showcase an Umbraco package, that adds some new functionality to Umbraco at the end of the conference with shiny prizes galore.

With the dedicated hands-on track this will make life easier to allow developers to work with one another and exchange ideas or even produce an Umbraco package. But you don't have to be a developer to join in the fun, you could be someone who is non-technical but who has a brilliant idea that you would like to share by teaming up with developers in a fun and open atmosphere.

 

So much knowledge!

With the Umbraco Core team, MVPs, package developers and other Umbraco developers & designers all attending CodeGarden, you can be assured there will be someone there to help you. I can't even imagine what the combined Karma point score will be!

This year's schedule is very busy with the focus on Version 5, so we have not announced anything official in the schedule for Open Space, however we have the room to do this in some places around the venue. So lets just wait and see what happens with this.

 

What sessions are at CodeGarden?

Well we have just released the schedule for this years CodeGarden on the official website, and I think this has to be the best schedule so far. For example we have sessions from Niels Hartvig & Per Ploug on how to move your data from v4 to v5, Martin Beeby and Morten Christensen on Azure & Umbraco, Adi Molina from FOX International talking about how they implement Umbraco websites.

There are so many good sessions that I simply can't list them all, so I recommend you to go over to the CodeGarden website and take a look for yourself.

 

This all sounds brilliant, but where do I buy my ticket?

Wondering how to get tickets to this years CodeGarden in Copenhagen? Look no further as we conveniently have a page all about CodeGarden, what it is and what you can expect and of course a way to buy your ticket/s.


Well until next time
Warren & The Umbraco HQ

Thursday, April 14, 2011 by Warren Buckley

We're thrilled to announce the return of the Umbraco awards at this year's CodeGarden.
There's a lot of great Umbraco work going on in our community with people using Umbraco in many impressive ways. Now it's time to get all that fantastic work out in the limelight. We've made it free to participate and we'll have the following categories.

Best Technical Solution

In this category we'll promote the best and most innovative usage of Umbraco, the concepts and API's. So the focus is on the technical usage of Umbraco. So show us the clever things you have done with Umbraco.

Best Designed Site

We're looking for the designs that blow you away. Not only visually, but also in respect to web standards. Where stunning design meets clean markup.

Best Integration

Usually Umbraco doesn't stand alone and is often integrated with other systems. We've got an award ourselves for integration (BNP CMS Awards 2006) and we'd like to see how you're using Umbraco as a hub for other systems.

Case studies

Here at the Umbraco HQ, we think that with all these great submissions that it would be a brilliant idea to turn these into case studies. So by entering into the Umbraco Awards please make sure you and your client agree that we may use your submission as a case study on the umbraco.com website - its great exposure for you and your client.

How do I enter?

To enter the Umbraco Awards is simple, just fill out the form over on the CodeGarden11 website.
But what are you waiting for? Come and show us your best stuff and see if you can win an Umbraco Award that you will be proud to show off to your clients and colleagues. With it being an Umbraco Award you can expect the award itself is something unique and cool that you will want to show off.

Rules

  • An individual or company can only participate once in each category
  • Only submissions with full details are evaluated & considered for nomination
  • The submitter must be the creator of the work
  • Voting will be done by the Umbraco HQ

Dates

  • We'll open for submissions on 14th April
  • Deadline for submissions is 13th May 1st June
  • We'll announce the final winners during CodeGarden11

Notes

  • If you submit a website to the Umbraco Awards you will most likely want to buy a ticket to CodeGarden, so that you or your company can pick up the award in person if you win.
  • By entering into the Umbraco Awards please make sure you and your client agree that we may use your submission as a case study on the umbraco.com website - its great exposure for you and your client.

One last thing - Good Luck!

Update: 13/5/11 We have extended the date for the submissions, to the 1st of June.

Friday, April 01, 2011 by Niels Hartvig

For much too long have the wonderful HQ people of Paul Sterling in the US and  Peter Gregory in Australia felt isolated and alone. As a company who cares deeply about CSR, HR and other crappy acronyms used by enterprises who've grown so big that they don't know who they are, it's evident that we have to do something about that. Therefore I'm pleased to announce that the HQ will grow its employee count by 100% in both markets.

shannonWelcome Shannon Deminick!
From today Shannon Deminick will be joining Peter Gregory at our Australian operations. While Shannon likely needs no introduction, he sure deserves one. He has been one of the top core contributors the past years, one of the founders of the impressive uComponents package and an all round nice guy. Now imagine what'll happen now that he's joining us fulltime! It'll obviously also mean that Peter will be able to speak to a human being in his own timezone which our corporate psychologist thinks will greatly improve his health.

caseyWelcome Casey Neehouse!
Also starting today is Casey Neehouse, who'll help Paul Sterling keep up with the rapid growth that Umbraco is seeing in the mighty United States. While people new to Umbraco might not recognize his name, Casey has been in the Umbraco community from the very start, the maker of the very popular Doc2Form package and was the first to be announced an Umbraco MVP. We're thrilled that he'll get back into the Umbracosphere not to mention fulltime! Paul is also really excited as he has great confidence that Casey joining will rapidly slow his current hair loss rate.


Good times. Even on a day full of bad jokes.

Wednesday, March 16, 2011 by Administrator

I'm really excited and also really nervous about today, as I officially announce the first public beta of Courier 2.

Excited because I think we have something really awesome to show you: a completely rewritten staging and deployment engine for Umbraco, which can move any piece of functionality (content, media, macros, templates, you name it) between multiple instances of umbraco. Built to run outside of umbraco, and not depending on umbraco's datalayer or HttpContext.

But I'm also nervous, because Courier 2 has been under development for a long time, and I don't want to disappoint anyone, or present something that is not done, so we could probably keep on polishing and adding stuff to make it "just right"

But today I decided that a Beta is ready, because what we have now, is alread kick-ass, it solves a ton of really hard problems in regard to moving data back and forth between installations and it does it in the safest possible way, it will make your umbraco life so much easier. No more updating directly on the live server because deployment was too hard, no more missing types, css, or files, and no more time spend on going through ever little damn change, to ensure that it works on the new instance.

So today we launch the public beta, so we can get all your valuable feedback to make this as stable and flexible as possible.

What can I do with the beta?

First all, this is a real beta not a "google beta", it will have bugs, it could even have bugs that wipe out your website or make your site unstable, so do not use this without a backup, and never ever on a live site, you been warned.

You can move any umbraco object from one location to another, either by simply right-clicking the item in the tree UI and select where you want to put it, or you can build an entire set of objects you would like to move at once, currently called a "revision"

Now the neat part is that Courier 2 automatically detects dependencies on which selected Item depends on, so if you for example select a single content page courier will do this:

  • Detect if page has a parent
  • Detect if page has a document type
  • Detect if page has a template
  • Detect if page contains macros, links and images

Courier will then do the same for all those dependencies and their dependencies, so we end up with a pretty complex tree of cross-references. When Courier installs these items on the new instance, it will then go through this web of dependencies and make sure they are all installed in the right order.

 

 

Whats missing?

Polish! and UI. There is a UI one in place now, but we are not at all done, making that as clean as we want it. So still a lot to do there.

There are still a couple of internal look-ups in the different managers that needs some refactoring, but nothing that will affect you, it's more to do with making the internals consistent and avoid any "hacks".

Under the hood...

...Is a ton of public APIs so you can actually write your own deployment client, look in the developer docs on the build server, and in the Sample console application source which is up there as well.

Documentation on how to use these things to the max are under way, and will be announced as soon as possible.

Download docs here

Report bugs

We need to get the bugs and feedback reported, this is the only way that we can improve the stability of Courier 2, so it can run in any setting and fit into any need.

You can report bugs from the Courier UI, or by going to this page.

Download beta builds

The beta is released on our build-server so it will get daily updates. Chances are that, if you file a bug report, it will be fixed the next day. Simply keep an eye on the Courier dashboard in Umbraco which lists the most recent changes (also available here)

Download courier beta here

Sunday, March 13, 2011 by Gareth Evans

Part 5 of the feature walkthrough continues with features available in umbraco 4.7.
You should be using the 4.7 RC or higher for these examples.
Today, I'm covering the changes between the 4.7 beta and RC1
Sorry this post is a little late, the RC has been out for a while now.

Fixed Bugs
We've fixed a lot of little bugs reported on codeplex and the forums.
The most notable was that you couldn't call OrderBy with a single descending column.
There's better support for your expressions in .Where too, but more on that below…

DateTime property support
The first releases of 4.7 didn't gracefully handle DateTime properties, they'd still return as string. Now, you can do the following:

@Model.Children.Where("updateDate < DateTime.Now.AddDays(-2)")

This didn't work previously in 4.7beta because updateDate was still boxed as an object and object < DateTime can't be implicitly converted. The underlying change here is that now the left hand side of your expression will be unboxed to the type of the right hand side, if it's a node. This means that because DateTime.Now.AddDays(-2) returns a date time and updateDate returns a Func<DynamicNode,object> the object gets unboxed to be a DateTime (which it was anyway)

IsProtected & HasAccess

We've added helper methods (these have changed to properties in the 4.7 final) on DynamicNode to check to see if a given node is protected or if the currently logged in (or not) user has access to that node.
Here's an example:

@foreach(var item in Model.Children)
{
    if(item.HasAccess())
    {
        @item.Name <br/>
    }
}


Warning: HasAccess and IsProtected are methods in 4.7 RC, but in the 4.7 Final, they're Properties. This means you will need to drop the () off the calls if you use this syntax.

Better Tree Navigation

The 4.7 beta release contained a method - AncestorOrSelf, which allowed you to get the most top-level node in your content tree.
In 4.7 RC, we've added some extra methods which give you more flexible support over navigating the tree.

Each of these methods have 3 overloads.
1) An empty call .Method() - returns the default condition, e.g. all nodes that match the given call
2) A level filtered call .Method(int) - returns nodes which are <= or >= (depending on if you're using Ancestors or Descendants) the desired number
3) A node type alias filtered call .Method(string) - returns nodes which have the matching node type alias (or the first in the case of AncestorOrSelf)

The AncestorOrSelf method itself has been upgraded to support the same overloads too.

.AncestorsOrSelf
Get all the ancestors (parents) walking up the tree and return them as a DynamicNodeList

@foreach(var item in Model.AncestorsOrSelf())
{
    @item <br/>
}

.Descendants
Get all the children [deep] of the current node, by collecting the children.
.Children will only return the immediate children, whereas Descendants will return all of them (children of children..)

.DescendantsOrSelf
The same as Descendants, but will not return the current node as the first item in the list

.Ancestors
The same as .AncestorsOrSelf but will not return the current node as the first item in the list

DynamicNodeWalker - Our secret weapon in the fight against the Rebel XSLT alliance

I don't know about you, but I always found navigating around nodes in XSLT to be difficult. If you had a node, and you wanted to go to the first child, or the next sibling.. well, good luck.
It's possible, but it's not easy.
In the 4.7 RC, we added DynamicNodeWalker - this is mostly just an internal [as in you never see this in your Razor files] name, but I like the walker reference (and, no, i'm not a huge SW fan)

DynamicNodeWalker gives us some more methods on a DynamicNode.
The methods are PrototypeJs inspired, a javascript library I've used extensively but has largely fallen to the JQuery empire.

These methods are: Up/Down/Next/Previous.
Each method will take no parameters, which is equivalent to one "step" or an integer which is equivalent to a number of steps.

For the following examples, I'm using a content tree which looks like this:


Company
    Division 1
        Department
            Team 1
                Employee 1
                Employee 2
            Team 2
        Department 2
            Team 3
                Employee 3
                Employee 4
            Team 4
        Department 3
        Department 4
    Division 2

Assuming you're currently sitting on Company…


Model.Down().Next() //Division 2
Model.Down(1).Next().Down(1) //Employee 3


Or, if you're on Employee 3..


Model.Up(1).Previous().Down().Next() // Team 2
Model.Next() // Employee 4

Each of these methods will only ever return a single node, so in the case of Down, it's the first child, for Next, it's the following sibling.
If a node doesn't match the requested node, you'll get null - so look out for null references. If you get "Sequence contains no elements" or "Cannot perform runtime binding on a null reference" then you should check to make sure that the steps (int parameter) and directions you're using match your tree.

.Contains (methods on properties)
In the 4.7 beta, we had pretty good support for .Where - you could check node values, but one thing that didn't work was calling methods on those values.
For example:


@foreach(var item in Model.Children.Where("bodyText.Contains(\"cat\")"))
{
    @item.Name <br/>
}


Wouldn't work.
This is now fixed in 4.7 RC.
Warning: A bug was pointed out on the forum with this which has been fixed in 4.7 Final - which is that if you're performing multiple checks, this won't work:


@foreach(var item in Model.Children.Where("bodyText.Contains(\"cat\") || !(bodyText.Contains(\"dog\"))"))
{
    @item.Name <br/>
}

.ContainsAny (and extension method support)

Taking an example case - you're using the Contains example above, and you want to check for multiple keywords.
In 4.7 Beta, you could do this:


var items = @Model.Children.Where("Name.Contains(\"cat\") || Name.Contains(\"dog\") || Name.Contains("\fish\")")


Not very nice is it? What if you had more than 3 keywords to check?
In 4.7 RC, you can do this:


var values = new Dictionary<string,object>();
var keywords = new List<string>();
keywords.Add("cat");
keywords.Add("dog");
keywords.Add("fish");
values.Add("keywords",keywords);
var items = @Model.Children.Where("Name.ContainsAny(keywords)", values); 


Certainly a lot more readable, though verbose.
The keywords List<string> can come from somewhere else though.

ContainsAny is an extension method, defined within the Razor implementation - however because of the way the method is loaded and invoked, you can write your own and drop them in the bin folder like the example in part 3

Here's the actual implementation for ContainsAny:


public static bool ContainsAny(this string haystack, List<string> needles)
{
    if (!string.IsNullOrEmpty(haystack) || needles.Count > 0)
    {
        foreach (string value in needles)
        {
            if (haystack.Contains(value))
                return true;
        }
    }
    return false;
}


MediaById and NodeById new overloads

We've added another couple of overloads to MediaById and NodeById that take List<object> and params object[]
These let you return multiple nodes as a list.
The intention for these methods is to give better support when working with the uComponents multi node tree picker.
MediaById returns a new type, DynamicMediaList

Warning: DynamicMediaList is just a list wrapper, it doesn't support OrderBy or Where like DynamicNodeList does.

Here's an example of the new overloads being used:
I have a property on my document type which uses a multi node tree picker, and it's set to CSV type.
Warning: I tested the below sample and unfortunately the decimal handling code in DynamicNode caught the CSV string and turned it into a decimal. I've fixed this for the final.


@{

var nodes = @Model.NodeById(Model.multiChildPicker);
foreach(var node in nodes)
{
    @node.Name <br/>
}

}

This will work in the RC (assuming those node ids are valid)


@{

var nodes = @Model.NodeById(1024,2048,4096);
foreach(var node in nodes)
{
    @node.Name <br/>
}

}

DynamicNull
In the beta, when a property or type wasn't found, we just returned null.
This broke handling, particularly with True/False types which didn't have a value (null instead of 0)

The 4.7 RC will return a new type, DynamicNull which you can test for.
This was added so that a .Where against a property which existed on some nodes in the set but not on others, wouldn't crash.
.Where explicitly checks for this type and returns a default value (false)
An example of this is @Model.Children.Where("umbracoNaviHide != true") and not all of the nodes in your children have that property

You can explicitly check for it like this:

@using umbraco.MacroEngines;
@if(@Model.propertyNameThatDoesntExist.GetType() == typeof(DynamicNull))
{

}

IHtmlString
Finally, in 4.7 Beta, if you define a property on your document type using the RTE editor, you have to use @Html.Raw in the beta to decode the HTML.
In 4.7 RC, we auto-detect this type and return it as IHtmlString which makes the view engine treat it as HTML.

You should only need to use @Html.Raw if you're not using the RTE editor.



Conclusion

This post ended up being way longer than I expected!
A few more changes have been made for the 4.7 final, if you're code inclined, feel free to check out the commit messages, but otherwise, stay tuned for Part 6 after the 4.7 final release

I'm Gareth Evans, Follow me at @agrath on twitter, and here's a few links:
The new Razor forum on our.umbraco: http://our.umbraco.org/forum/developers/razor
Codeplex for any feature requests or bugs: http://umbraco.codeplex.com/

Read more from the Umbraco Razor walkthrough series

Part 1
Part 2
Part 3
Part 4
Part 5
Part 6
Part 7
Part 8

Tuesday, March 08, 2011 by Niels Hartvig

On March 15th the voting for the 2011 Umbraco MVPs begin. If that sounds all gibberish to you, don't panic - I'll (try to) explain it all in this post!

What's an MVP

MVPs are quite common in different projects and they're all inspired by Microsofts "Most Valued Professional" program. In Umbraco MVP stands for "Most Valued People" as we see at least as big value in amateurs as in professionals. In fact several Umbraco MVPs started as amateurs only to find that Umbraco is now the cornerstone of their professional career.

An MVP is a person who's not a part of the core team nor a part of the Umbraco HQ (the company), but in some other way adds extraordinary value to the project. Looking back at previous MVPs this translate into being friendly in the forum or making incredible and highly useful packages. In other words, MVPs represent the best of the community which is the last building block in what makes the foundation of the Umbraco project; the company, the core team and the community.

How does one become an MVP

We nominate the candidates for the 2011 MVPs on Tuesday the 15th of 2011 based on the people who got most karma on 'Our' from March 14th 2010 to March 14th 2011. The twenty people with most karma who isn't either a part of the HQ or the core team will be selected and the community can start voting. This year, you can vote on three people (giving them 5, 3 and 1 point respectively) and you can only vote once and not change your vote. So make sure to consider your votes carefully! In order to vote you'll need to have a profile on Our Umbraco.

The voting ends on April 15th 2011 and we'll notify the winners directly. From here it gets really tough as you'll have to keep it a secret until CodeGarden '11 where we'll officially announce the MVPs. Being the magician I am, I know that you're thinking then why not just wait with ending the voting until CodeGarden, right? Well, there's a good reason which brings me to the benefits of becoming an MVP!

The benefits

The number one benefit is obviously the honor. As the nomination of MVPs are solely in the hands of the community, becoming an MVP means that you're among the five most regarded and appreciated people in a community over 10.000 people strong. It takes a lot of effort, courage and patience and the biggest benefit in my humble opinion is the loads of virtual high fives you'll get.

There is another benefit too, though. You'll get free admission to the annual developer conference, CodeGarden. In fact you'll also get free accommodation at the best business hotel in Copenhagen during the conference too. Oh, and we'll pay for your flight no matter where in the world you live. Not even Microsoft does that to their MVPs! But there's one more thing and whether it's a benefit or not, I'll leave it for you to decide!

The CodeGarden Retreat

Four years ago we started what became a tradition - the CodeGarden retreat. We invite the most active cores, the HQs and the MVPs to an extended weekend in a country house right before CodeGarden. It's four very long days and nights where we combine deep talks on the future of Umbraco with socializing. And since the beginning it has been where the best ideas for Umbraco has be coined. For four days we got twenty very different Umbracians together without customer deadlines nor any it-cannot-be-done mentality. The sky is the limit (and so is the beer tap we've learned). It's fun, but it's much easier to show videos of the 2008 and 2009 retreats (unfortunately, I didn't get a video done in 2010):

2009:

2008:

Godspeed to everyone who's among the twenty nominates next week. Umbraco wouldn't be Umbraco without you!

Tuesday, March 01, 2011 by Gareth Evans

Part 4 of the feature walkthrough continues with features available in the TAFKA 4.6.2 release.
Today, I'm covering .Where to filter nodes and .OrderBy to order nodes

RC1 is just around the corner and there's a bunch more features coming - i'll try and cover those too when they come out -
We've got more functions for navigating your tree, slightly better support for some .Where edge cases, .Where extension methods and more!

Where

Taking this implementation to the next level, we quickly found we wanted to select a random number of elements which should be visible but were still published.
An example is if you have a boolean property (defined as the True/False data type) on your document type that indicates if an item should be featured or not.

With DynamicObject (DynamicNode too, because it inherits from), the c# compiler / razor parser doesn't allow you to use the familiar lambda syntax to filter your sets.
This is because we now return a DynamicObject [DynamicNodeList] to allow method chaining.

This will not work in 4.6.1 or 4.7.

@Model.Children.Where(item => item.shouldBeFeatured);

//Lambda's cannot be used against Dynamic Objects


With the new 4.7 syntax, you can now use .Where to filter your nodesets.
To do this, we took the string parser from the 2008 linq samples and then added support for working with DynamicObjects

I saved the best for last!

A simplistic filter by a single boolean:

@Model.Children.Where("shouldBeFeatured")


A longhand filter, demonstrating the equality operator and type safety:

@Model.Children.Where("shouldBeFeatured == true")


Using NotEquals:

@Model.Children.Where("shouldBeFeatured != true")


Using GreaterThan against a numeric property

@Model.Children.Where("catCount > 1")


Using Modulus (to get the remainder of a number)
(will return any children where the number of cats is even)

@Model.Children.Where("catCount % 2 == 0") 


Using string comparisons and boolean logic (|| [or], && [and]) - also shows how to nest strings

@Model.Children.Where("menuType == \"Top Menu\ || menuType == \"Bottom Menu\"") 


Chaining into your own extension method
(will return 8 randomly selected nodes which are marked as featured items)

@Model.Children.Where("shouldBeFeatured").Random(8)


Passing Variables from outer scope into the .Where expression:
If you need to access a variable from outside the scope (e.g. a number etc) and don't want to pass it as a constant,

var maxLevelForSitemap = 4;
var values = new Dictionary<string,object>();
values.Add("maxLevelForSitemap", maxLevelForSitemap) ;        
var items = node.Children.Where("ShouldBeVisible == true && Level <= maxLevelForSitemap", values);


OrderBy

We have also added support for OrderBy, this lets you sort your nodesets by the properties on the nodes themselves.

Simplistic ordering by a single property:

@Model.Children.OrderBy("catCount")


More complex ordering by multiple properties, with descending/ascending support:

@Model.Children.OrderBy("catCount, colour desc")


Warning: There's a small bug in the 4.7 beta which means you can't order by a single descending column. This is fixed in RC1.

 

Conclusion

That pretty much wraps up my additions to Razor in 4.7beta, hopefully the new syntax improves your ability to work with razor to build websites with umbraco :)
Some more parts to come once the RC is released

I'm Gareth Evans, Follow me at @agrath on twitter, and here's a few links:
The new Razor forum on our.umbraco: http://our.umbraco.org/forum/developers/razor
Codeplex for any feature requests or bugs: http://umbraco.codeplex.com/

Read more from the Umbraco Razor walkthrough series

Part 1
Part 2
Part 3
Part 4
Part 5
Part 6
Part 7
Part 8

Monday, February 28, 2011 by Warren Buckley

Hello all,
Here at the Umbraco HQ we are happy to announce our first confirmed session.
Without further-a-do we bring you: "The Umbraco E-Commerce Showdown".
In this session we bring you 3 different E-commerce solutions for Umbraco.  Each speaker will  tell you about their solution and why it may suit your next E-Commerce project in a quick 15min presentation each, followed up by a Q&A to wrap up the session.
We have the following e-commerce solutions presenting in the showdown:

  • Anders Burla Johansen from TeaCommerce for simple & low budget solutions
  • Søren Spelling Lund from uCommerce for more complex & larger budget solutions
  • Jason Prothero from Commerce for Umbraco as a free open source solution

Anders Burla Johansen & Rune Grønkjær
Tea Commerce - http://www.teacommerce.dk

TeaCommerce

Throughout their careers Anders and Rune have worked with various content management systems. They have chosen to specialize in Umbraco because of its strong foundation, flexibility and extensibility - all of which made Tea Commerce possible. The guys have surfed the Umbraco wave since version 3.0.3 and have never looked back.

They share many years of experience in configuring and developing e-commerce solutions and therefore know what is required of a good e-commerce system. This expertise and their passion for Umbraco created the idea for Tea Commerce.

Tea Commerce is a strong lightweight e-commerce system for Umbraco - which provides the necessary tools to easily implement an e-commerce solution. The main focus of Tea Commerce lies on the front-end developer. Everything can be done with HTML, CSS, JavaScript and XSLT/Razor, while it's still possible to extend your e-commerce through .NET.

Tea Commerce comes with a complete JavaScript API built using the powerful jQuery library, making it a breeze to create nice looking effects and web 2.0 functionality on e-commerce solutions. The API creates an ajax front against the server, which means all important procedures and calculations is performed on the server, securing the system against fraud.

To make it even easier to get started with e-commerce and Umbraco, the Tea Commerce starter kit was created. In just 1 minute the starter kit will allows the user to have a basic e-commerce solution up and running on Umbraco. This gives a good foundation to further develop and style the webshop to the users exact needs.

 

Søren Spelling Lund
uCommerce - http://www.ucommerce.dk

uCommerce

Søren Spelling Lund is founder of uCommerce, an e-commerce platform designed from the ground up to work with Umbraco. As such he makes his living doing Umbraco development and having a blast doing it. During the past ten years he's been involved in creating some of the largest e-commerce sites in Denmark.
Søren is a Microsoft MVP and active in the Danish .NET community as founder of Aarhus .NET User Group and host of the weekly podcast ANUGCast. He has been a regular speaker at Codegarden the past two years.

You can reach Søren through Twitter and via his .NET and uCommerce blog.

uCommerce was developed with one goal in mind: Build an e-commerce platform for Umbraco integrated to match the experience of working with Umbraco exactly. Thus uCommerce provides an extensible e-commerce platform with special emphasis on the flexible framework at its core on which developers and designers build webshops, online stores, and ebusiness systems.

Introduced at Codegarden '09 uCommerce continues to grow as an e-commerce platform and today provides a rich Catalog Foundation with support for multiple stores and catalogs, a Transaction Foundation for handling baskets, orders, creditcard processing, and order management, an Analytics Foundation for reporting, and finally the Marketing Foundation, which supports targeted site ads and content, discounts, vouchers, and advanced pricing.

Designers can leverage Razor and XSLT to build beautiful stores just like they would with a content site. As a platform and framework uCommerce enables developers to extend any aspects of the out of the box features to match client specifications exactly and provides store owners a migration path as their business grows and matures.

 

Jason Prothero
ProWorks Corporation - http://www.proworks.com

CommerceForUmbraco

About Commerce 4 Umbraco:
Commerce 4 Umbraco is an Open Source e-Commerce package for Umbraco.  It has been integrated into Umbraco fairly deeply and supports all recent versions of Umbraco.  C4U is a bit unpolished, yet customizable and has been gaining contributors over the recent months.  Come learn if Commerce 4 Umbraco is an option for your next e-Commerce project.  How hard is it to get started?  What are the pros and cons of using C4U?  Why does ProWorks/Jason use it?

About Jason:
Jason is a Level 2 Certified Umbraco Developer from Oregon, USA and has experience with several CMS systems including Umbraco, Sitecore, Sitefinity, Magento, ASP.NET Storefront, among others. He recently took over as coordinator of the Commerce 4 Umbraco project and has deployed several e-Commerce websites using Commerce 4 Umbraco including: teclabsinc.com, gifts4runners.com, and wildflowerseed.com. He blogs on the ProWorks Blog as "Jason" and can be found on Twitter as @protherj and on the Our Umbraco site as "protherj".

 

So with our first session announced, I know I will definitely be attending to see the different types of e-commerce
solutions out there battle it out.

Until the next time where we have more news about CodeGarden for you..... let me assure you, as soon as we have a session
confirmed, you will hear about it here first!

Warren & The Umbraco HQ

Monday, February 28, 2011 by Gareth Evans

Part 3 of the feature walkthrough continues with features available in the TAFKA 4.6.2 release.
Today, I'm covering locating ancestors, the XML helpers and Extension Methods and the XPath helper

RC1 is just around the corner and there's a bunch more features coming - i'll try and cover those too

AncestorOrSelf

The 4.6.1 version of Razor had an implementation of AncestorOrSelf that took a Func<DynamicNode,bool> as a predicate to decide when to stop ascending the node tree.
In 4.7, there's now a parameterless implementation that will climb to the top of the node tree and return the top most grandparent.

Here's an example:

var Node = @Model.NodeById(1640);
var Home = Node.AncestorOrSelf();
@Home.Name;

Ancestors

Sometimes you want to get a list of the parents walking up the tree.
For this, you can use .Ancestors on the node:

var Node = @Model.NodeById(1640);
@foreach(var level in Node.Ancestors)
{
    <li><a href="@level.Url">@level.Name</a></li>
}

Ancestors and AncestorOrSelf have been improved in RC1 - more on that in a later part!

Type Safety

In 4.6.1, when a property was returned by the @ syntax, the type was always string.
This meant that sometimes when you really wanted a boolean or integer, you had to do typecasting within your razor template.

Assuming the properties I'm using below exist on your Document types,
In 4.7, we've improved this so that you can simply go:

if(@Model.shouldBeVisible){
    //Do something
}

//or

if(@Model.catCount > 1)
{
    //Do something
}

Warning: this change may break a few of your existing templates but was needed to support some more of the advanced features.
If you have if statements or similar that are checking against strings, they'll need to be refactored slightly.

//instead of:
if(@Model.shouldBeVisible == "1") 
//use:
if(@model.shouldBeVisible)

Supported types are currently:
string, int, decimal, bool, xml (see below for xml)

XML Properties

If you have a field which contains valid XML, and wasn't generated from an RTE, DynamicNode will detect this and allow you to
access it with . notation
If there's more than one node with the same name, you'll need to use [] indexing to access the element you want

Here's an example:
@Model.xmlProperty.Catalog.Books[1].Genre

Warning: the property access is case sensitive. Make sure you check your case.
The root node is removed, so omit that, and remember to check for indexing if you have multiple nodes that might be returned.

If the XML function is kicking in, your root node may need to be excluded - check umbracoSettings.config for an override of document element types that shouldn't be converted

Custom Extension Methods

When working with DynamicNodeList, sometimes you need some functionality that we haven't provided.
We've added support for calling your own Mix-Ins against the DynamicNodeList type.
Here's an example that we've been using for testing:
This random method has been included in the core distribution for 4.7 but we've included it below so that you can see how to write one

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using umbraco.MacroEngines;

namespace SniperSystems.Umbraco.Razor.Extensions
{
public static class RazorExtensions
{
    public static DynamicNodeList Random(this DynamicNodeList all, int Min, int Max)
    {
        //get a random number generator
        Random r = new Random();
        //choose the number of elements to be returned between Min and Max
        int Number = r.Next(Min, Max);
        //Call the other method
        return Random(all, Number);
    }
    public static DynamicNodeList Random(this DynamicNodeList all, int Max)
    {
        //Randomly order the items in the set by a Guid, Take the correct number, and return this wrapped in a new DynamicNodeList
        return new DynamicNodeList(all.Items.OrderBy(x => Guid.NewGuid()).Take(Max));
    }
}
}


Put this in a new class library and compile it.
Drop the DLL in your bin folder, and now you can do this:

@ForEach(@Model.Children.Random(8))
{
    //Working with 8 randomly selected Children
}

 

Unlike the Alliance's way of implementing Random, there's no chance of a single node coming back more than once in your random selection - Unique nodes only!

There are 3 overloads to Random in the 4.7 distribution:

Random() will return a single randomly selected node from the collection
Random(int number) will return N randomly selected nodes from the collection
Random(int min, int max) will return between min and max randomly selected nodes from the collection

XPath helper

Sometimes .Where isn't enough to select the node you want - it only works on the current node, and you can't easily check
Parents/Children
We've added a .XPath helper which lets you use XPath to select the nodes.
The XPath you use is used to select nodes from the original XML which are then upgraded to NodeFactory.Node and then
DynamicNode

@foreach(var item in @Model.XPath("//ChildItem[catCount > 4 and count(.//catPictures) > 0]").Random(4))
{
    @item.Name<br/>
}

The .XPath helper also works on a DynamicXml item (from an XML property) but won't do the upgrade to DynamicNode/DynamicNodeList like when you call it directly on @Model

 

We're really very sorry we had to provide something that was similar to XSLT, but it does add a lot of functionality :)

 

I'm Gareth Evans, Follow me at @agrath on twitter, and here's a few links:
The new Razor forum on our.umbraco: http://our.umbraco.org/forum/developers/razor
Codeplex for any feature requests or bugs: http://umbraco.codeplex.com/

Read more from the Umbraco Razor walkthrough series

Part 1
Part 2
Part 3
Part 4
Part 5
Part 6
Part 7
Part 8

Friday, February 25, 2011 by Niels Hartvig

Years ago Per and I did some regular videos where we talked and mumbled about what was going on the Umbraco community and company. Unfortunately we stopped prioritizing these as the project started to grow and we couldn't do everything we wanted. This was a mistake and now they're back and we'll make it into a regular thing. Here's our first attempt to catch up:

Links from the video:

Umbraco 4.7 beta:

Download: http://umbraco.codeplex.com/releases/view/59502
Razor contributors: Elijah Glover and Gareth Evans

CodeGarden:

/codegarden-2011

Courier 2.0 intro videos:

From December build - Courier 2.0 concepts: http://dl.dropbox.com/u/3498919/4.swf

From December build - Courier outside the browser: http://dl.dropbox.com/u/3498919/5.swf

From February build Work in progress UI: http://dl.dropbox.com/u/3498919/6.swf

Thursday, February 24, 2011 by Gareth Evans

Part 2 of the feature walkthrough continues with features available in the TAFKA 4.6.2 release.
Today, i'm covering Macro Parameters, some fetching node helpers, and how to access media

Macro Parameters

You can now access parameters defined on the macro which invokes the macro.
Just like XSLT, if you define a macro parameter, you can then pass it from the Template to the Macro.

Please excuse the references to cats in the upcoming examples, cat pictures are ridiculously easy to find online and they make good examples when testing.

Given a parameter defined on the macro called animalName, you can access it in Razor like this:
@Parameter.Animalname => "cat"

The casing makes no difference here.

Culture specific strings are available too with @Dictionary

DynamicNode Constructors [string | int | object]

We've added constructors to DynamicNode that allow you to look up a node.
There's 3 overloads which take different types depending on what you have available to you at the time:

//a node that has it's id passed by QueryString
new DynamicNode(HttpContext.Current.Request.QueryString["id"]) //a node from a known hardcoded ID
new DynamicNode(1046)


When you define variables like this, you must declare them with the type dynamic:
e.g.

dynamic node = new DynamicNode(1046)


if you don't do this, Razor won't be able to find properties or methods on the new type

DynamicMedia vs Media Properties

In 4.6.1, working with media was a little difficult.
While it was easy to get the nodeId of the media item, you couldn't easily get access to the data of the media.

You could execute the new Media() constructor from the API but the readability wasn't quite right.

We've added a new type called DynamicMedia which can be used in two ways.

You can instantiate a DynamicMedia item with an id:

dynamic mediaItem = new DynamicMedia(1054);
@mediaItem.umbracoFile // => /path/to/media/item.jpg

or, from a DynamicNode, you can call the shorthand helper, .Media
There's two overloads for .Media
one just takes a property name for the property to return as DynamicMedia. You should use this syntax when you need to access multiple properties on the Media item

dynamic mediaItem = @item.Media("catPicture");
@mediaItem.umbracoFile
@mediaItem.comment //(assuming comment is defined as a property on your media type)

the second, allows you to quickly access a single property:

@item.Media("catPicture","umbracoFile")


Here's an example:

@ForEach(var item in @Model.Children) { 
<img src="@item.Media("catPicture","umbracoFile")" />

 

DynamicMedia ctor string,int,object)

Just like DynamicNode, there's a constructor that takes string, int or object and returns you a DynamicMedia
Internally, the method just takes whatever you give it and attempts to treat it as an int.
If an int is successfully obtained, you get a DynamicMedia instance.

DynamicNode .NodeById & .MediaById

As a shorthand, a slightly more readable syntax is available if you already have a DynamicNode
You can call .NodeById or .MediaById to get a DynamicNode or DynamicMedia.

These are just helpers on DynamicNode so that you don't have to remember to put them in dynamic to access properties.
Here's an example:

@Model.NodeById(1046).Name


Follow me at @agrath on twitter, and here's a few links:
The new Razor forum on our.umbraco: http://our.umbraco.org/forum/developers/razor
Codeplex for any feature requests or bugs: http://umbraco.codeplex.com/

Read more from the Umbraco Razor walkthrough series

Part 1
Part 2
Part 3
Part 4
Part 5
Part 6
Part 7
Part 8

Wednesday, February 23, 2011 by Gareth Evans

Introduction

The new razor support for umbraco is great, though the initial release bundled with 4.6.1 was really just a preview.  We've barely scratched the surface of what can be achieved by combining the power of umbraco with the simplicity of the Razor template syntax.

This post, which will be one of a series of posts over the next few days, introduces myself as well as a few of the new MacroEngine features in 4.7's implementation of Razor.

These posts will be slightly technical, if there's anything not in DynamicNode that you find yourself really needing, Drop a codeplex request up and i'll try and keep up!

About Me & Sniper Systems Ltd

My name is Gareth Evans, and I own a small business called Sniper Systems in Auckland, New Zealand.
We've been working with Umbraco in a user capacity for about 4 years having built about 50-60 sites.
We run our own managed hosting where we host umbraco, as well as custom developed ASP.Net webform applications.

I'm part of the Australasian team mentioned in the previous blog post that has worked on the Razor updates in 4.7.
That said, due to the well documented rivalry between Australia and New Zealand, I will be quick to mention that I'm from New Zealand which is not part of, or in any way (apart from both loving umbraco) associated with Australia.

I'm quite fluent with XSLT but I found the razor syntax to be much more readable, and my employees with no prior XSLT experience struggled to learn how to write xpath and use XSLT to transform documents.
With the new release of Razor, we tried to build an entire site using it, avoiding XSLT entirely and ran into some problems.
I made the decision to contribute back to Umbraco and implement the features in Razor that I wanted.

We're available for hire to work on umbraco sites, our website can be found at http://snipersystems.co.nz or I can be reached on twitter under the username @agrath

So with that out of the way, on with the rest of the fun!

Why the new functionality?

For a recent website built by Sniper, we made the decision to try and build it entirely using Razor and ran up against a few problems.
While the code read nicely for simple iterations and property retrieval, we quickly ran up against some issues with types while trying to manipulate sets.

The core of the model used for the Umbraco razor engine is based around a .net 4 class called DynamicObject.
DynamicObject allows you to define getters (and setters) that take the place of real properties on an object.
When the runtime goes to fetch a property referenced by the .Syntax, it instead invokes the correct method on the type which returns the property or invokes the method.
Unfortunately, when it does this, the return type is the base type object - this means that you can't chain method calls without typecasting.
   
An example of this is calling @Model.Children - this returned (in 4.6.1) an IEnumerable<DynamicNode> but this was boxed in an object.
In order to then call .Count on that instance (to get the number of Children), you had to cast the object back to IEnumerable<DynamicNode>.
This proved to be more trouble than it's worth and completely ruined the readability of the Razor template:
Due to a compilation issue, you can't add a @using for umbraco.MacroEngines, so this is what you were left with to get the Count of Children

@(((IEnumerable<umbraco.MacroEngines.DynamicNode>)(@Model.Children)).Count());

Any other syntax results in not being able to find the Count() method on object

IEnumerable handling, we can do better
   
In order to solve this, we created a new DynamicObject type called DynamicNodeList - this type is used whenever anything in the Razor engine for umbraco returns a list of DynamicNodes
This includes .Children and the filtered version .nodeTypeAlias (e.g. .Pictures if you have children of nodeTypeAlias Picture)

In 4.7 you can do this:

@Model.Children.Count()
//or
@Model.Pictures.Count() //assuming you have children of type Picture

Because DynamicNodeList inherits from DynamicObject, the Razor engine knows that Count() needs to be invoked via the Dynamic methods and the resulting value is returned

Simplistic IEnumerable method support

Taking this new DynamicNodelist a bit further, we now have support for all of the standard IEnumerable methods. They haven't been reimplemented, they're proxied by DynamicNodeList onto the original (inner) IEnumerable<DynamicNode>.

By the way, if you have a DynamicNodeList and for some reason you want to get the internal list, it's public so you can do this:

var list = @Model.Children;
list.Items // => IEnumerable<DynamicNode>


This syntax is intended to be used when you're working with DynamicNodeList from inside your own methods, but more on that later.

Here's a few examples of what you can now do with a DynamicNodeList from a @Model method:

//.Take (get the first X items of the list)
@Model.Children.Take(2) //=> the first two items from the list

//.Skip
@Model.Children.Skip(2) //=> the entire list excluding the first two items from the list

//.ElementAt
@Model.Children.ElementAt(1) //=> The second element in the children list. Will return null if there aren't that many children

//.Count
@Model.Children.Count() //=> The number of children

//Chaining
//You can chain these methods:
@Model.Children.Skip(2).Take(2) //=> the 3rd and 4th children
@Model.Children.Skip(2).Take(2).Count() //=> 2


Okay, so that concludes part 1, I'll post another part continuing on from this introductory post in a day or two.

Follow me at @agrath on twitter, and here's a few links:
The new Razor forum on our.umbraco: http://our.umbraco.org/forum/developers/razor
Codeplex for any feature requests or bugs: http://umbraco.codeplex.com/workitem/30069

Read more from the Umbraco Razor walkthrough series

Part 1
Part 2
Part 3
Part 4
Part 5
Part 6
Part 7
Part 8

Wednesday, February 23, 2011 by Niels Hartvig

About a month after we released 4.6.1 we had planned to release 4.6.2. You could say that it is part of a natural progression to have a beautiful service pack release to address the feedback we had received once the project was in the wild. Business as usual and we had been there with the 3, 4 and 4.5 releases.  4.6.2 was also progressing in the same vein. But…

Bring in the Australasians
When we released JUNO one of the things to follow was switching from Team Foundation System (TFS) to Mercurial (Hg) for source control. This was mostly related to the development of v5 but it has rapidly proved that distributed source control is like adding fuel to an 'open source' fire. After a month we have seen more forks of v4.6/v5 than we had seen patches for v4. And why would you care? Because it turns out that the community is smarter than the core team, which is exactly what we had hoped for. Or, what we hoped with v5 - certainly not with v4.6 as that was supposed to be the final minor release until v5 was here.

But that's where those damn clever Australasians (apparently the most clever word for people living in either Australia or New Zealand which  makes me doubt just how clever they really are!) come in. You see, in Australia there's a guy called Elijah Glover and in New Zealand there's a guy called Gareth Evans and they have one thing in common - a craving for a more powerful Razor scripting engine than the one we introduced in v4.6. And while these type of people suck at coming up with words describing their geographical region, they write code that makes you shed tears of joy. And the result is a faster, more flexible razor engine with medium trust support and a query language that'll cause your XSLT-loving colleague to cry also (in pain at the slow death of their language). It's so good, that I couldn't possibly look at myself in the mirror if the version of Umbraco that included this code poetry should be left with a pathetic patch increment in its version number. (Well, my colleagues in the HQ knew that I had no choice as these improvements require minor updates to the web.config which isn't allowed when we release a patch release).

So v4.7 it is
So the bottom line is that there'll be no v4.6.2 and out of the blue v4.7 beta is here. It's beautiful...  a veritable buffet of great enhancements and bug fixes, but more than anything in my opinion, the best Razor implementation in the industry. You'll love it. Unless you're a die-hard XSLT lover... But then you probably drive a Kia or a Hyundai and deserve to be left with ancient technology in a wannabe modern wrapping anyway.

Enough rambling, I digress - v4.7 beta is awaiting your test and we expect the full release within days. So enjoy. I certainly have! Now go download it.

Note for upgrades
If you're upgrading from 4.6.x make sure you read the release notes. There are three minor updates to your web.config that you'll need to make apart from the usual upgrade process. It's thoroughly described in the stuff you normally wouldn't read yet would complain if it didn't exist. This time we've tried our best :-)

More on the Razor improvements

Over the next few weeks Elijah and Gareth will be blogging here about the awesome Razor improvements. So stay tuned!

Wednesday, February 16, 2011 by Cherie Gregory

Today marks Umbraco’s 6th birthday and being the generous and kind bunch of people that we are... we have decided to give away one free ticket to this year’s CodeGarden festival held in Copenhagen this June. Codegarden is where the Umbraco community comes together for three days to learn & collaborate on all things Umbraco. For those who may have missed the big news... recently we announced this year’s CodeGarden will have a specific focus on the next major version of Umbraco, version 5.

Didn’t win the ticket and still need a reason to convince your boss to let you go to CodeGarden 11? Rather than the Umbraco HQ telling you why you should go, we asked members of the Umbraco community to tell us why they go instead.

So how do I enter this competition?

To have a chance of winning this ticket, simply tweet the following message...

Happy Birthday #umbraco #umbracois6 RT to WIN a #CG11 ticket http://umbraco.org/cg11-tickets

Tweet it now

Rules

  • You may enter/retweet the message as many times as you like.
  • The winner will be selected at random from all the messages submitted.
  • The winner will receive one free ticket to this year’s CodeGarden 11 festival only, accommodation, flights and additional expenses are not included.
  • If the winner is unable to attend CodeGarden 11, another entry will be randomly drawn and the prize will be transferred.
  • The cutoff point for tweets is midnight on 16th February 2011 GMT - 8:00.
  • The winner will be notified by Direct Message on twitter, so make sure you are following the account @umbraco.

Good luck! See you at Codegarden 11.

Friday, February 11, 2011 by Warren Buckley

Here at the Umbraco HQ we have something exciting to tell you.  We'll keep it brief and to the point...

This year we are happy to announce that the next major version of Umbraco will be a HUGE part of CodeGarden, with its own dedicated track. The Umbraco 5 track will include sessions from the Core Team on what you can expect when released - from a range of "getting started" sessions to more "bare-metal" plugin development.
Umbraco 5 has been entirely rebuilt from the ground up to support MVC3, with new data provider support to help you stay nimble whether you're building a small blog or a huge site. Everything from the Hive, to Razor, to learning the basics of version 5 will be covered.

Now that we have announced our BIG news, go and buy your ticket for CodeGarden 11 today.

See you at CodeGarden
Warren & The Umbraco HQ

Friday, February 04, 2011 by Warren Buckley

Yes it's that time of year again to start buying your tickets to the annual Umbraco conference "CodeGarden".
This year we expect 350 Umbraco users to descend on Kedellehan in Copenhagen in the Summer for three full days of demos, collaboration, hacking and great socialising with one of the friendliest communities out there.

umbraco-codegarden10-keynote
Photo: Keynote of CodeGarden 10 taken by Douglas Robar

CodeGarden is not like a traditional conference with just dull sessions , it offers a totally unique experience and friendly atmosphere, that you can't find anywhere else. As some of our attendees said last year it felt more like a great & friendly summer festival rather than a conference. That doesn't mean it's just drinking in the sun all day every day ;-)

CodeGarden has a great mix of sessions, from practical hands on knowledge that you can take away with you to sessions on how large scale sites are running and using Umbraco, but CodeGarden isn't all about the sessions, its about meeting with other like minded developers and users to swap ideas and collaborate together. This is exactly what happened at last years CodeGarden, which enabled the birth of the popular uComponents project. For me this is one of the reasons what makes CodeGarden unique.

You really have got to be here to experience this unique take on how Umbraco does conferences and I recommend you convince
your boss to buy your ticket today, but if you might struggle to convince them then we have the perfect solution for you.

How to convince your boss in 90 seconds

Convince Your Boss 11 CoverWe know it isn't always easy to get the budget for going away for a 3 day conference. That is why we've put together a special white paper on CodeGarden 2011.

Simply print out the "Convince your boss" PDF and put it on their desk

Conferences can be hard to measure the value of. What do people actually get out of 3 days away from the office, and can the cost be justified?

To us there is no discussion, CodeGarden is the best investment you can make as an Umbraco developer / agency. That is why, we've put together a special white-paper on the conference and the value it represents.
Download the PDF now

For more information on CodeGarden and how to buy your ticket can all be find on the CodeGarden page, but if you remind your boss if they buy your ticket before the 15th of May they will save a whopping 100EURO.

 

Over the coming months expect regular blog posts from myself announcing speakers, sessions and the general
buzz leading up to the conference festival?

I look forward to seeing you all at CodeGarden.
Warren & The Umbraco HQ

Friday, January 21, 2011 by Niels Hartvig

One of the great things about having your own company is that you get a chance to (try to) make it a better place than where you've worked yourself. That said, I've been pretty spoiled in my previous jobs with some great bosses and awesome challenges.

This morning I thought of dealing with off-days. Probably because I had one yesterday. One of the days where I'm going to work and get very little done. Not because I don't want to, but simply because there's some miscommunication between my fingers and my brain (however, I didn't try using my nose like this guy). Most programmers - and creative people in general - that I've spoke to about this, recognize it immediately yet I haven't found anyone who had a 'formal' policy on dealing with these things. I'd love to.

Let's face it - off days are inconvenient. Big time. They have this special ability to pop up when you needed them the least. Which usually means that you have to do your best to ignore them to meet a deadline, milestone, meeting, demo, whatever. So you write crap. Which really is the developer equivalent to hustling through an unprepared presentation. It might save you short term, but makes you feel bad (or at least it should!) and long term it'll come back as a boomerang. It's simply not worth it.

So why? Why do we have work environments that believe developers can work as factory workers. Who are we trying to cheat? When we ignore an obvious issue, we don't improve. It's things like these that are heaven sent when it comes to evolve as a human being. Accepting off-days in return for trying to understand them is the way forward. In many cases off-days can relate to lack of sleep or personal distractions (nothing is worse than going to work with an unsettled argument at home) and what if that's more than ok. Why hide that. We're humans - we're not perfect. If it was ok and if everyone in a company could be open, we might start being able to work out patterns for off-days and see if they could be minimized. Or just be turned better. Whether it's going home and getting some sleep, seeing a therapist (paid by work), calling your wife or…

I really want to develop some policy around this for the HQ and if it work out, I'll blog again. At least a start is simply saying out loud that off-days are fine and a part of us. Until then, let's try to help each other with our experiences in the comments - start the conversation!

Saturday, January 15, 2011 by Niels Hartvig

JUNO_BE7D_Juno_thumb

After more than six months of development we've finally released JUNO aka Umbraco version 4.6 - our biggest maintenance release ever. It's a huge leap forward and if we haven't been so conservative with our version numbering and if the number 5 wasn't reserved already, it's a release that certainly deserves a bigger number increment.

The focus in 4.6 is two-fold - making it easier to get started with Umbraco and make it a pleasure to stay. The first is covered through a new installer, new starter kits, a brand new skinning engine and new default dashboards to guide you after the install. The latter through loads of TLC; with more than 200 bug fixes and loads of love and polish, Umbraco 4.6 is a pleasure to work with and really a testament to how our "Sustainable Idealism" philosophy allows us to add much more resources to the core development.

Over the next weeks we'll cover lots of the improvements in Umbraco 4.6, among others:

  • Improved installer experience
  • Updated Starter Kits (Simple, Blog, Personal, Business)  and Beautiful, free, customizable skins included
  • Default dashboards and new config options for your own dashboards
  • Skinning engine and Skin customization
  • Support for Microsoft SQL CE 4.0
  • Support for Microsoft Razor Syntax
  • Much easier creation and configuration of custom data types
  • Polish of the new logout mechanism (a login modal instead of a js alert to ensure that you can continue work without loosing data

Until then, go test Umbraco 4.6 for yourself. It's available directly in Microsoft WebMatrix (more on that later), Microsoft Web Gallery or from Codeplex.