Morten Christensen's BLOGA blog about developing packages and sites in Umbraco and working with .NEThttp://blog.sitereactor.dk/feed2024-03-19T13:31:33Zhttp://blog.sitereactor.dk/2011/06/19/optimize-it-package-for-umbracoOptimize it package for Umbraco<p>"Optimize It" is the name of the package that I entered in the Package Competition at CodeGarden 11. In this post I will go into more details about what it can be used for.</p>
<p>The idea with the package is that you can use it to optimize and check your stylesheets prior to implementing Client Dependency, or you can use it on existing sites (where you might not be able to implement something like Client Dependency) to get some quick performance gains.</p>
<p>The package extends the Css editor, in the Settings section of Umbraco, with 6 buttons. The functionality behind each button is described in the order they appear:</p>
<ol>
<li><p><strong>Parsing of stylesheet</strong>
One of the core functionalities of this package is the stylesheet parser, which is based on the syntax described <a href="http://www.w3.org/TR/css3-syntax/#style">here</a> and <a href="http://www.w3.org/TR/css3-syntax/#detailed-grammar">here</a>. Clicking this button will open a dialog with the parsing result. Any syntax errors like missing colons, semicolons and curly brackets will be listed. Aside from syntax errors the parser will also check image references in background and background-images properties and verify that they are present on disc.
Parsing your css files is important prior to minification, as the process might result in errors or disrupt the minification due to syntax errors.</p></li>
<li><p><strong>Minify stylesheet</strong>
This feature is kind of an added bonus, because it was already available in the css parser I used. I would always recommend that you use a framework like Client Dependency to minify and combres your JS and CSS files on Umbraco sites. But if you have a site that is already deployed without that type of framework implemented and want a quick performance gain then the built in minifier will be quite useful.
Clicking the "Minify stylesheet"-button will generate a new and minified version of your stylesheet with ".min" inserted in the filename.
Please note that comments will not be preserved.</p></li>
<li><p><strong>Prettify stylesheet</strong>
This feature is also an added bonus. It will take any minified stylesheet and make it pretty again. Please note the original file will not be overwritten, but a new file with ".pretty" inserted in the filename will be created.</p></li>
<li><p><strong>Optimize images in stylesheet</strong>
Clicking this button will start a threaded process to compress the images referenced within your stylesheet using SmushIt and PunyPNG.
Jpg, gif and png files are supported.
When the process is finished a text filed called "compres-result.txt" will be created in the css-folder with the results of the compression of each image. It also includes error messages if any errors occured during the process.
This is a very useful feature for any site where you want to ensure that the images used in your stylesheet is compressed as much as possible.</p></li>
<li><p><strong>Embed images in stylesheet</strong>
This feature will base64-encode and embed images in your stylesheet. When clicking the button a dialog box will open where you can specify the maximum number of kilobytes an image can be in order for it to be embedded. The default is 32kb as that is what will work with IE8 browsers. Please note that not all browsers supports images embedded in the stylesheet, but a fallback css file will be generated for you, which can be used for something like IE7. So two new css files will be created: one with "-embed" inserted in the filename, which is the same as the original stylesheet but with images embedded. The second file with "-embed-fallback" inserted in the filename will contain your id/class selectors with the original background and background-image image references.</p></li>
<li><p><strong>Generate sprite</strong>
This feature will allow you to automatically generate a sprite from the images in your stylesheet with the correct selectors from your stylesheet. Please note that original file will not be overwritten, so the image references will still be in your background and background-image properties. A new stylesheet with "-sprite" inserted in the filename will be created, which has all of the positions for the sprite. You will have a few options to specify layout type, margin width and margin between images prior to the sprite generation. Automatic layout is currently the best to use, as horizontol will not work in all cases (and im testing why).
Also please note that after generating the sprite you will most likely have to work with the styling as it is very rare that the generated sprite will fit into any existing markup/styling without some kind of tweak here and there.</p></li>
</ol>
<p>Here is an example of my own site before and after implementing the generated sprite and css:
<a href="http://blog.sitereactor.dk/get/optimizeit/sitereactor-web-before-sprite.jpg">Before sprite implementation</a> and <a href="http://blog.sitereactor.dk/get/optimizeit/sitereactor-web-after-sprite.jpg">After sprite is implemented</a>.
As you can see quite a few images is completly wrong because the original styles does not take account for i.e. a max width and height, which results in other images showing up where they are not supposed to. I could solve this by reworking some of the styling or the html, but the point being that I will have to do some work in order for it to work 100%. Even though you do have to do some work yourself I believe that this feature still adds value, as the sprite is automatically generated for you with all the positions, and all the right selectors. No need to mess around with the layout in Photoshop and try to figure out the positions afterwards.</p>
<p>With regards to the embedding of images I recommend that you read the two articles listed below. Primarily because you should be cautious when embedding images in your stylesheets. Be aware of the size of the stylesheet after the images has been embedded. In my own case I had a stylesheet that was 21kb before and 137kb after embedding images. None of the images I embedded exceeded 10kb, so the size of the css luckily didn't "explode". After minification and gzip compression my stylesheet will become even smaller and I will save around 60 requests for the various background images.</p>
<p>Articles about data URIs (embedded images): <a href="http://www.ravelrumba.com/blog/css-images-and-data-uris/">CSS Images and Data URIs</a> and <a href="http://www.ravelrumba.com/blog/a-look-at-how-browsers-download-and-render-css-background-images/">A Look at How Browsers Download and Render CSS Background Images</a>.</p>
<p><strong>Get the package on <a href="http://our.umbraco.org/projects/backoffice-extensions/optimize-it">our.umbraco.org</a></strong></p>
<img src="http://blog.sitereactor.dk/via-feed/2011/06/19/optimize-it-package-for-umbraco" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2011%2f06%2f19%2foptimize-it-package-for-umbraco&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2011-06-19T00:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>"Optimize It" is the name of the package that I entered in the Package Competition at CodeGarden 11. In this post I will go into more details about what it can be used for.</p>
<p>The idea with the package is that you can use it to optimize and check your stylesheets prior to implementing Client Dependency, or you can use it on existing sites (where you might not be able to implement something like Client Dependency) to get some quick performance gains.</p>
<p>The package extends the Css editor, in the Settings section of Umbraco, with 6 buttons. The functionality behind each button is described in the order they appear:</p>
<ol>
<li><p><strong>Parsing of stylesheet</strong>
One of the core functionalities of this package is the stylesheet parser, which is based on the syntax described <a href="http://www.w3.org/TR/css3-syntax/#style">here</a> and <a href="http://www.w3.org/TR/css3-syntax/#detailed-grammar">here</a>. Clicking this button will open a dialog with the parsing result. Any syntax errors like missing colons, semicolons and curly brackets will be listed. Aside from syntax errors the parser will also check image references in background and background-images properties and verify that they are present on disc.
Parsing your css files is important prior to minification, as the process might result in errors or disrupt the minification due to syntax errors.</p></li>
<li><p><strong>Minify stylesheet</strong>
This feature is kind of an added bonus, because it was already available in the css parser I used. I would always recommend that you use a framework like Client Dependency to minify and combres your JS and CSS files on Umbraco sites. But if you have a site that is already deployed without that type of framework implemented and want a quick performance gain then the built in minifier will be quite useful.
Clicking the "Minify stylesheet"-button will generate a new and minified version of your stylesheet with ".min" inserted in the filename.
Please note that comments will not be preserved.</p></li>
<li><p><strong>Prettify stylesheet</strong>
This feature is also an added bonus. It will take any minified stylesheet and make it pretty again. Please note the original file will not be overwritten, but a new file with ".pretty" inserted in the filename will be created.</p></li>
<li><p><strong>Optimize images in stylesheet</strong>
Clicking this button will start a threaded process to compress the images referenced within your stylesheet using SmushIt and PunyPNG.
Jpg, gif and png files are supported.
When the process is finished a text filed called "compres-result.txt" will be created in the css-folder with the results of the compression of each image. It also includes error messages if any errors occured during the process.
This is a very useful feature for any site where you want to ensure that the images used in your stylesheet is compressed as much as possible.</p></li>
<li><p><strong>Embed images in stylesheet</strong>
This feature will base64-encode and embed images in your stylesheet. When clicking the button a dialog box will open where you can specify the maximum number of kilobytes an image can be in order for it to be embedded. The default is 32kb as that is what will work with IE8 browsers. Please note that not all browsers supports images embedded in the stylesheet, but a fallback css file will be generated for you, which can be used for something like IE7. So two new css files will be created: one with "-embed" inserted in the filename, which is the same as the original stylesheet but with images embedded. The second file with "-embed-fallback" inserted in the filename will contain your id/class selectors with the original background and background-image image references.</p></li>
<li><p><strong>Generate sprite</strong>
This feature will allow you to automatically generate a sprite from the images in your stylesheet with the correct selectors from your stylesheet. Please note that original file will not be overwritten, so the image references will still be in your background and background-image properties. A new stylesheet with "-sprite" inserted in the filename will be created, which has all of the positions for the sprite. You will have a few options to specify layout type, margin width and margin between images prior to the sprite generation. Automatic layout is currently the best to use, as horizontol will not work in all cases (and im testing why).
Also please note that after generating the sprite you will most likely have to work with the styling as it is very rare that the generated sprite will fit into any existing markup/styling without some kind of tweak here and there.</p></li>
</ol>
<p>Here is an example of my own site before and after implementing the generated sprite and css:
<a href="http://blog.sitereactor.dk/get/optimizeit/sitereactor-web-before-sprite.jpg">Before sprite implementation</a> and <a href="http://blog.sitereactor.dk/get/optimizeit/sitereactor-web-after-sprite.jpg">After sprite is implemented</a>.
As you can see quite a few images is completly wrong because the original styles does not take account for i.e. a max width and height, which results in other images showing up where they are not supposed to. I could solve this by reworking some of the styling or the html, but the point being that I will have to do some work in order for it to work 100%. Even though you do have to do some work yourself I believe that this feature still adds value, as the sprite is automatically generated for you with all the positions, and all the right selectors. No need to mess around with the layout in Photoshop and try to figure out the positions afterwards.</p>
<p>With regards to the embedding of images I recommend that you read the two articles listed below. Primarily because you should be cautious when embedding images in your stylesheets. Be aware of the size of the stylesheet after the images has been embedded. In my own case I had a stylesheet that was 21kb before and 137kb after embedding images. None of the images I embedded exceeded 10kb, so the size of the css luckily didn't "explode". After minification and gzip compression my stylesheet will become even smaller and I will save around 60 requests for the various background images.</p>
<p>Articles about data URIs (embedded images): <a href="http://www.ravelrumba.com/blog/css-images-and-data-uris/">CSS Images and Data URIs</a> and <a href="http://www.ravelrumba.com/blog/a-look-at-how-browsers-download-and-render-css-background-images/">A Look at How Browsers Download and Render CSS Background Images</a>.</p>
<p><strong>Get the package on <a href="http://our.umbraco.org/projects/backoffice-extensions/optimize-it">our.umbraco.org</a></strong></p>
<img src="http://blog.sitereactor.dk/via-feed/2011/06/19/optimize-it-package-for-umbraco" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2011%2f06%2f19%2foptimize-it-package-for-umbraco&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2011/06/17/google-analytics-package-is-activeGoogle Analytics package is active!<p>During CodeGarden 11 a lot of people have been asking me about whether the Google Analytics package for Umbraco is still active, which is a totally valid question since nothing hasn't really happend for a year (no releases that is).</p>
<p>Ever since Umbraco 4.5 was launched at CodeGarden 10 I have been keen on getting it updated to run on version 4.5+, but also to make it better suited for future updates (i.e. v4.7 and v5). An updated version has however been delayed more than I ever anticipated due to various factors that I won't go into here.</p>
<p>Bottomline is that yes it IS active! I actually took 3 days off prior to CodeGarden 11 to try and finish it. There is however a lot of work involved, as I have made it loosely coupled, so the Core is seperated from whatever version of Umbraco you are running. This makes it easier for me to upgrade the package for different versions, and only have the views tied into Umbraco and using the Umbraco API.
Current status is that the core data model is working and all of the unit tests are working, so what is left now is creating the views for Umbraco 4.7.</p>
<p>When I get a little more time I will go into more technical details about the package and how I made it different from the version couple of released version.</p>
<p>Meanwhile I hope you will be patient with me and an upcoming release - even though you already have been (and thanks for that!).</p>
<p><em>PS: I did make a #h5is tweet earlier in case you were wondering.</em></p>
<img src="http://blog.sitereactor.dk/via-feed/2011/06/17/google-analytics-package-is-active" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2011%2f06%2f17%2fgoogle-analytics-package-is-active&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2011-06-17T00:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>During CodeGarden 11 a lot of people have been asking me about whether the Google Analytics package for Umbraco is still active, which is a totally valid question since nothing hasn't really happend for a year (no releases that is).</p>
<p>Ever since Umbraco 4.5 was launched at CodeGarden 10 I have been keen on getting it updated to run on version 4.5+, but also to make it better suited for future updates (i.e. v4.7 and v5). An updated version has however been delayed more than I ever anticipated due to various factors that I won't go into here.</p>
<p>Bottomline is that yes it IS active! I actually took 3 days off prior to CodeGarden 11 to try and finish it. There is however a lot of work involved, as I have made it loosely coupled, so the Core is seperated from whatever version of Umbraco you are running. This makes it easier for me to upgrade the package for different versions, and only have the views tied into Umbraco and using the Umbraco API.
Current status is that the core data model is working and all of the unit tests are working, so what is left now is creating the views for Umbraco 4.7.</p>
<p>When I get a little more time I will go into more technical details about the package and how I made it different from the version couple of released version.</p>
<p>Meanwhile I hope you will be patient with me and an upcoming release - even though you already have been (and thanks for that!).</p>
<p><em>PS: I did make a #h5is tweet earlier in case you were wondering.</em></p>
<img src="http://blog.sitereactor.dk/via-feed/2011/06/17/google-analytics-package-is-active" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2011%2f06%2f17%2fgoogle-analytics-package-is-active&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2011/03/27/provider-update-for-universal-media-pickerProvider update for Universal Media Picker<p>Today I have added one updated and one new provider to the Universal Media Picker package on our.umbraco.org.</p>
<p>I have updated the Amazon S3 provider to make uploaded files Public by default, which makes the provider a little more useful. Don't know how I missed it the first time around.
In this update I have added folder support similar to what you get using the AWS Console on aws.amazon.com. This is something that I have been wanting to do from the start, because it makes the experience of using the S3 provider way better then simply seeing a long list of filenames with the "path" in it. But since folders doesn't really exist in AWS and through the API (well, implicitly it is) I haven't really gotten around to it before now (with a little encouragement from <a href="http://anders.burla.dk/">Anders Burla</a>). So I'm happy to announce that you can now see and create folders within your S3 Bucket through the Universal Media Picker.</p>
<p>The new provider I have added is a Flickr Provider, which lets you connect your Flickr account to Umbraco and pick images you have uploaded to Flickr.
One of the cool things about this provider is that its using oAuth for authentication like the Facebook provider, so when you have installed the package you simply go to the Developer section, create a new DataType based on the Universal Media Picker, select the Flickr Provider and then click to authenticate the application for use with Umbraco. Couldn't be easier.
Please note that we are using a proxy server, which hosts the authentication process in order to allow for a plug-n-play type of installation, so you don't need to think about setting up an application with Flickr. I will most likely also release a version of the Provider, which allows you to enter you own oAuth information (Consumer Key, Secret and Return Url etc) for authentication on your own server. I'll will also write up a post about how to use the oAuth model with the Universal Media Picker.</p>
<p>Once you have authenticated the provider you have a couple of settings in the DataType, which is worth mentioning:</p>
<p>Max number of Photos and Max number of Photosets. These two options gives you the ability to limit the number of photos and photo sets that is displayed in the tree of the Media Picker. Because you can use Flickr in so many different ways I wanted to give users the ability to pick images from both Photo Sets and photos simply uploaded to Flickr.
If you only want to see Photo Sets then set the number of photos to zero and vice versa.</p>
<p>Save Photo ID to XML. Checking this box will save the ID of a photo to xml cache when publishing. By default the URL of the medium sized image will be saved to the xml cache upon publishing from Umbraco.
If you choose to use the ID you can use the Xslt Extension supplied with the package to get valuable information about the image (URLs for different sizes, dates, title and much more) - an example xslt is also supplied. Its also possible to get photo information using .NET with the supplied FlickrNet assembly - please refer to <a href="http://flickrnet.codeplex.com/">codeplex</a> for more info on using the .NET library.</p>
<p>User Id. This optional setting allows you to enter the ID of the user/owner which you want Flickr images listed for. This might be useful for users with multiple accounts.</p>
<p><img src="http://blog.sitereactor.dk//files/FlickrProviderConfig.JPG" alt="alt text" /></p>
<p>You can also upload images directly from the Media Picker to Flickr, and whether or not the uploaded photo is added to a photoset is optional. You won't be able to create new Photo Sets, but this might come in a later version if there is a demand for it. When uploading an image you can specify title, description, tags and whether the image is public. If you think additional properties would be valuable I'm open to suggestions.</p>
<p>So go check out the providers and remember to vote for the project on <a href=""http://our.umbraco.org/projects/backoffice-extensions/universal-media-picker">our.umbraco.org</a>. Remember you need to install the DataType (Universal<em>Media</em>Picker_1.3.zip) before you start adding providers.</p>
<p>Feedback is welcome.</p>
<img src="http://blog.sitereactor.dk/via-feed/2011/03/27/provider-update-for-universal-media-picker" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2011%2f03%2f27%2fprovider-update-for-universal-media-picker&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2011-03-26T00:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>Today I have added one updated and one new provider to the Universal Media Picker package on our.umbraco.org.</p>
<p>I have updated the Amazon S3 provider to make uploaded files Public by default, which makes the provider a little more useful. Don't know how I missed it the first time around.
In this update I have added folder support similar to what you get using the AWS Console on aws.amazon.com. This is something that I have been wanting to do from the start, because it makes the experience of using the S3 provider way better then simply seeing a long list of filenames with the "path" in it. But since folders doesn't really exist in AWS and through the API (well, implicitly it is) I haven't really gotten around to it before now (with a little encouragement from <a href="http://anders.burla.dk/">Anders Burla</a>). So I'm happy to announce that you can now see and create folders within your S3 Bucket through the Universal Media Picker.</p>
<p>The new provider I have added is a Flickr Provider, which lets you connect your Flickr account to Umbraco and pick images you have uploaded to Flickr.
One of the cool things about this provider is that its using oAuth for authentication like the Facebook provider, so when you have installed the package you simply go to the Developer section, create a new DataType based on the Universal Media Picker, select the Flickr Provider and then click to authenticate the application for use with Umbraco. Couldn't be easier.
Please note that we are using a proxy server, which hosts the authentication process in order to allow for a plug-n-play type of installation, so you don't need to think about setting up an application with Flickr. I will most likely also release a version of the Provider, which allows you to enter you own oAuth information (Consumer Key, Secret and Return Url etc) for authentication on your own server. I'll will also write up a post about how to use the oAuth model with the Universal Media Picker.</p>
<p>Once you have authenticated the provider you have a couple of settings in the DataType, which is worth mentioning:</p>
<p>Max number of Photos and Max number of Photosets. These two options gives you the ability to limit the number of photos and photo sets that is displayed in the tree of the Media Picker. Because you can use Flickr in so many different ways I wanted to give users the ability to pick images from both Photo Sets and photos simply uploaded to Flickr.
If you only want to see Photo Sets then set the number of photos to zero and vice versa.</p>
<p>Save Photo ID to XML. Checking this box will save the ID of a photo to xml cache when publishing. By default the URL of the medium sized image will be saved to the xml cache upon publishing from Umbraco.
If you choose to use the ID you can use the Xslt Extension supplied with the package to get valuable information about the image (URLs for different sizes, dates, title and much more) - an example xslt is also supplied. Its also possible to get photo information using .NET with the supplied FlickrNet assembly - please refer to <a href="http://flickrnet.codeplex.com/">codeplex</a> for more info on using the .NET library.</p>
<p>User Id. This optional setting allows you to enter the ID of the user/owner which you want Flickr images listed for. This might be useful for users with multiple accounts.</p>
<p><img src="http://blog.sitereactor.dk//files/FlickrProviderConfig.JPG" alt="alt text" /></p>
<p>You can also upload images directly from the Media Picker to Flickr, and whether or not the uploaded photo is added to a photoset is optional. You won't be able to create new Photo Sets, but this might come in a later version if there is a demand for it. When uploading an image you can specify title, description, tags and whether the image is public. If you think additional properties would be valuable I'm open to suggestions.</p>
<p>So go check out the providers and remember to vote for the project on <a href=""http://our.umbraco.org/projects/backoffice-extensions/universal-media-picker">our.umbraco.org</a>. Remember you need to install the DataType (Universal<em>Media</em>Picker_1.3.zip) before you start adding providers.</p>
<p>Feedback is welcome.</p>
<img src="http://blog.sitereactor.dk/via-feed/2011/03/27/provider-update-for-universal-media-picker" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2011%2f03%2f27%2fprovider-update-for-universal-media-picker&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2011/02/28/examine-provider-for-linq2umbracoExamine Provider for LINQ2Umbraco<p>The last couple of months I have been fortunate enough to work on a couple of Umbraco projects, which involved using Examine for searching and in the latest project we are using a Lucene index for caching Umbraco Members. This works surprisingly well and the performance of using Examine as a posed to the standard Member API is without comparison. But performance wasn't the only gain, as we have to retrieve the members based on different properties, which we now can do with a simple search.</p>
<p>After having worked with members through Examine I started thinking about whether there was anything to gain by using Examine to store and retrieve Umbraco documents. There is no doubt that Examine is super fast, but storing a page with its properties would need some modifications:
1. When Examine is indexing content it uses standard Lucene Analyzers, and HTML is stripped from the content, which makes perfect sense in a search scenario, but not so much when using it as an Umbraco document store.
2. Everything isn't indexed by default when using Examine. A few standard properties are not being indexed, and others are being Analyzed by default.
So first step is to create a custom indexer, which would enable storing a complete document with all its properties, which is not analyzed upon indexing.
Creating a custom Examine indexer is fairly straight forward. Shannon and Aaron have really done a great job with the implementation of Examine, and extending/modifying/creating is possible in every way imaginable.</p>
<p>With storing sorted, retrieval is the next step and creating a provider for LINQ2Umbraco is an obvious choice - well, at least in my opinion. Who doesn't love strongly typed objects :)
Again I have to give a shout-out to the black belt Ninja of the Aussie Umbraco Clan for creating a provider based LINQ2Umbraco implementation. After spending a couple of hours reading the source I started to create my own provider, which uses Examine for retrieving Umbraco documents instead of using the XML context like the standard implementation.
I made the provider by creating an ExamineDataProvider which implements the abstract UmbracoDataProvider class, an ExamineAssociationTree which implements the abstract AssociationTree class and an ExamineTree which implements the abstract Tree class. I also made an ExamineDataContext, which implements the IUmbracoDataContext interface.
Pretty straight forward, right. The hard part was figuring out how to replace the XML context lookups with Examine searches, but it actually worked out pretty good.</p>
<p>Because my initial intension was to create something that performed well, performance testing will be the final examination (no pun intended).
In order to test performance of the Examine provider I created a number of test cases, which retrieves and handles data in different ways. For comparison I created the same tests using the LINQ2Umbraco provider.
Each test case is run 15 times and the outcome is the average of these test runs.</p>
<p>The Umbraco setup is version 4.6.1 and .NET 4.0 with 7 different Document Types with the following structure:</p>
<p>Home (Number of nodes in Umbraco: 1)
- EventOverview (Number of nodes in Umbraco: 1)
-- EventType (Number of nodes in Umbraco: 5)
--- Year (Number of nodes in Umbraco: 22)
---- Month (Number of nodes in Umbraco: 237)
----- Event (Number of nodes in Umbraco: 2.896)
------ EventSection (Number of nodes in Umbraco: 28.830)</p>
<p>I generated a number of nodes in Umbraco to test different scenarios using the above structure.
The scenarios range from getting a specific node by id, get parent of a node, ancestors and traversing children of a node. All common tasks in my opinion, and I could probably have included a lot more.</p>
<p><strong>1. Scenario - DataContext:</strong>
The first scenario is not all that interesting as its just running a simple get from the DataContext of each provider, and as you can see from the numbers there is no significant difference between the two.</p>
<table width="100%">
<tbody>
<tr>
<td>Examine</td>
<td>LINQ2Umbraco</td>
</tr>
<tr>
<td>GetMonths: 00:00:00.0000506GetYears: 00:00:00.0000477
GetEvents: 00:00:00.0000466
GetVarious: 00:00:00.0001604</td>
<td>GetMonths: 00:00:00.0000508GetYears: 00:00:00.0000472
GetEvents: 00:00:00.0000467
GetVarious: 00:00:00.0001605</td>
</tr>
<tr>
<td colspan="2"><em>Example: <code>var months = _dataContext.Months;</code></em></td>
</tr>
</tbody>
</table>
<p><strong>2. Scenario - Get Parent:</strong>
In this test I get a specific node by id and lookup the parent with type.</p>
<table width="100%">
<tbody>
<tr>
<td>Examine</td>
<td>LINQ2Umbraco</td>
</tr>
<tr>
<td>GetMonthParent: 00:00:00.0045961GetEventParent: 00:00:00.3434473
GetEventSectionParent: 00:00:00.7446487</td>
<td>GetMonthParent: 00:00:00.6830741GetEventParent: 00:00:00.9745453
GetEventSectionParent: 00:00:01.2388632</td>
</tr>
<tr>
<td colspan="2"><em>Example:
<code>var month = _dataContext.Months.Where(x => x.Id == 11321).FirstOrDefault();
var year = month.Parent();</code>
</em></td>
</tr>
</tbody>
</table>
<p><strong>3. Scenario - Traverse:</strong>
In this test I get Months from the DataContext and loop through all months.</p>
<table width="100%">
<tbody>
<tr>
<td>Examine</td>
<td>LINQ2Umbraco</td>
</tr>
<tr>
<td>TraverseMonths: 00:00:00.0038782</td>
<td>TraverseMonths: 00:00:00.6199738</td>
</tr>
<tr>
<td colspan="2"><em>Example:
<code>var months = _examineDataContext.Months;
foreach (var month in months)
{
var name = month.NodeName;
}</code>
</em></td>
</tr>
</tbody>
</table>
<p><strong>4. Scenario - Traverse Children:</strong>
In this test I get i.e. Events from the DataContext, loop through all events and its children</p>
<table width="100%">
<tbody>
<tr>
<td>Examine</td>
<td>LINQ2Umbraco</td>
</tr>
<tr>
<td>GetYearMonthTraverseChildren: 00:00:00.0662222GetEventsTraverseChildren: 00:00:10.7358665</td>
<td>GetYearMonthTraverseChildren: 00:00:00.8251347GetEventsTraverseChildren: 00:00:23.0377022</td>
</tr>
<tr>
<td colspan="2"><em>Example:
<code>var events = _examineDataContext.Events;
foreach (var @event in events)
{
if (@event == null) continue;</code></em><em> foreach (var child in @event.Children)
{
string name = child.NodeName;
}
}
</em></td>
</tr>
</tbody>
</table>
<p><strong>5. Scenario - Count:</strong>
In this test I simply count the number of items of different types from in the DataContext</p>
<table width="100%">
<tbody>
<tr>
<td>Examine</td>
<td>LINQ2Umbraco</td>
</tr>
<tr>
<td>GetMonthsCount: 00:00:00.0031931GetYearsCount: 00:00:00.0004367
GetEventCounts: 00:00:00.3420866
GetEventSectionsCount: 00:00:00.7414970</td>
<td>GetMonthsCount: 00:00:00.6178589GetYearsCount: 00:00:00.5692922
GetEventsCount: 00:00:00.9023448
GetEventSectionsCount: 00:00:01.1714143</td>
</tr>
<tr>
<td colspan="2"><em>Example: <code>var events = _examineDataContext.Events;
int count = events.Count();</code></em></td>
</tr>
</tbody>
</table>
<p><strong>6. Scenario - Ancestors:</strong>
In this test I get a specific Event from the DataContext, and get different Ancestors based on type</p>
<table width="100%">
<tbody>
<tr>
<td>Examine</td>
<td>LINQ2Umbraco</td>
</tr>
<tr>
<td>GetEventAncestorAsYear: 00:00:00.3837243
GetEventAncestorAsHome: 00:00:00.0011323</td>
<td>GetEventAncestorAsYear: 00:00:01.0451501GetEventAncestorAsHome: 00:00:00.0014134</td>
</tr>
<tr>
<td colspan="2"><em>Example:
<code>var firstEvent = _examineDataContext.Events.Where(x => x.Id == 1210).FirstOrDefault();
var home = firstEvent.AncestorOrDefault();</code>
</em></td>
</tr>
</tbody>
</table>
<p>Note: All numbers are calculated averages from 15 test runs in the following format: hh:mm:ss:ms</p>
<p>For now I'll let the numbers speak for themselves. But I would like to include some tests for the new Query options that comes with Umbraco 4.7 for a little more perspective, and comment some more on the numbers from the various test cases.</p>
<p>If you have some test cases that you think would be valuable for this comparison, please feel free to add a comment with your test case.</p>
<p>I will try to wrap up the code in a solution and package it up with an Umbraco site and test cases, so others can have a go. So check back for updates.</p>
<p>All in all I'm pretty happy with the performance tests so far.</p>
<p>Here is links to the solution containing LINQ2Umbraco with my addition of an Examine Provider (please note that the solution contains the original LINQ2Umbraco source as it has internal dependencies):</p>
<p><a title="Download LINQ2Examine Solution" href="http://cdn.sitereactor.dk/Files/LINQ2Examine-Solution.zip">Download solution</a>
<a title="Download only Examine Provider assemby" href="http://cdn.sitereactor.dk/Files/LINQ2Examine-Assembly.zip">Download assemblies only</a></p>
<p>The solution and assembly has an Examine indexer, which you should use for indexing your content before trying to use the provider to get strongly typed objects from your index.
Set type="LINQ2Examine.Examine.Indexer.ExamineNodeIndexer, LINQ2Examine" for your ExamineIndexProvider in your ExamineSettings.config in order to use it for indexing.</p>
<p>Reference your generated datacontext like this:</p>
<p>public partial class UmbracoDataContext : LINQ2Examine.ExamineDataContext, IUmbracoDataContext
public interface IUmbracoDataContext : LINQ2Examine.IUmbracoDataContext</p>
<p>When using the Examine DataContext you initialize like this:</p>
<p>ExamineDataProvider dataProvider = new ExamineDataProvider("MyIndexSearcher");
Generated.IUmbracoDataContext dataContext = new Generated.UmbracoDataContext(dataProvider);</p>
<p>I will add the test solution over the coming weekend, as I need to clean up the current solution and move it to a demo site instead.</p>
<img src="http://blog.sitereactor.dk/via-feed/2011/02/28/examine-provider-for-linq2umbraco" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2011%2f02%2f28%2fexamine-provider-for-linq2umbraco&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2011-02-27T23:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>The last couple of months I have been fortunate enough to work on a couple of Umbraco projects, which involved using Examine for searching and in the latest project we are using a Lucene index for caching Umbraco Members. This works surprisingly well and the performance of using Examine as a posed to the standard Member API is without comparison. But performance wasn't the only gain, as we have to retrieve the members based on different properties, which we now can do with a simple search.</p>
<p>After having worked with members through Examine I started thinking about whether there was anything to gain by using Examine to store and retrieve Umbraco documents. There is no doubt that Examine is super fast, but storing a page with its properties would need some modifications:
1. When Examine is indexing content it uses standard Lucene Analyzers, and HTML is stripped from the content, which makes perfect sense in a search scenario, but not so much when using it as an Umbraco document store.
2. Everything isn't indexed by default when using Examine. A few standard properties are not being indexed, and others are being Analyzed by default.
So first step is to create a custom indexer, which would enable storing a complete document with all its properties, which is not analyzed upon indexing.
Creating a custom Examine indexer is fairly straight forward. Shannon and Aaron have really done a great job with the implementation of Examine, and extending/modifying/creating is possible in every way imaginable.</p>
<p>With storing sorted, retrieval is the next step and creating a provider for LINQ2Umbraco is an obvious choice - well, at least in my opinion. Who doesn't love strongly typed objects :)
Again I have to give a shout-out to the black belt Ninja of the Aussie Umbraco Clan for creating a provider based LINQ2Umbraco implementation. After spending a couple of hours reading the source I started to create my own provider, which uses Examine for retrieving Umbraco documents instead of using the XML context like the standard implementation.
I made the provider by creating an ExamineDataProvider which implements the abstract UmbracoDataProvider class, an ExamineAssociationTree which implements the abstract AssociationTree class and an ExamineTree which implements the abstract Tree class. I also made an ExamineDataContext, which implements the IUmbracoDataContext interface.
Pretty straight forward, right. The hard part was figuring out how to replace the XML context lookups with Examine searches, but it actually worked out pretty good.</p>
<p>Because my initial intension was to create something that performed well, performance testing will be the final examination (no pun intended).
In order to test performance of the Examine provider I created a number of test cases, which retrieves and handles data in different ways. For comparison I created the same tests using the LINQ2Umbraco provider.
Each test case is run 15 times and the outcome is the average of these test runs.</p>
<p>The Umbraco setup is version 4.6.1 and .NET 4.0 with 7 different Document Types with the following structure:</p>
<p>Home (Number of nodes in Umbraco: 1)
- EventOverview (Number of nodes in Umbraco: 1)
-- EventType (Number of nodes in Umbraco: 5)
--- Year (Number of nodes in Umbraco: 22)
---- Month (Number of nodes in Umbraco: 237)
----- Event (Number of nodes in Umbraco: 2.896)
------ EventSection (Number of nodes in Umbraco: 28.830)</p>
<p>I generated a number of nodes in Umbraco to test different scenarios using the above structure.
The scenarios range from getting a specific node by id, get parent of a node, ancestors and traversing children of a node. All common tasks in my opinion, and I could probably have included a lot more.</p>
<p><strong>1. Scenario - DataContext:</strong>
The first scenario is not all that interesting as its just running a simple get from the DataContext of each provider, and as you can see from the numbers there is no significant difference between the two.</p>
<table width="100%">
<tbody>
<tr>
<td>Examine</td>
<td>LINQ2Umbraco</td>
</tr>
<tr>
<td>GetMonths: 00:00:00.0000506GetYears: 00:00:00.0000477
GetEvents: 00:00:00.0000466
GetVarious: 00:00:00.0001604</td>
<td>GetMonths: 00:00:00.0000508GetYears: 00:00:00.0000472
GetEvents: 00:00:00.0000467
GetVarious: 00:00:00.0001605</td>
</tr>
<tr>
<td colspan="2"><em>Example: <code>var months = _dataContext.Months;</code></em></td>
</tr>
</tbody>
</table>
<p><strong>2. Scenario - Get Parent:</strong>
In this test I get a specific node by id and lookup the parent with type.</p>
<table width="100%">
<tbody>
<tr>
<td>Examine</td>
<td>LINQ2Umbraco</td>
</tr>
<tr>
<td>GetMonthParent: 00:00:00.0045961GetEventParent: 00:00:00.3434473
GetEventSectionParent: 00:00:00.7446487</td>
<td>GetMonthParent: 00:00:00.6830741GetEventParent: 00:00:00.9745453
GetEventSectionParent: 00:00:01.2388632</td>
</tr>
<tr>
<td colspan="2"><em>Example:
<code>var month = _dataContext.Months.Where(x => x.Id == 11321).FirstOrDefault();
var year = month.Parent();</code>
</em></td>
</tr>
</tbody>
</table>
<p><strong>3. Scenario - Traverse:</strong>
In this test I get Months from the DataContext and loop through all months.</p>
<table width="100%">
<tbody>
<tr>
<td>Examine</td>
<td>LINQ2Umbraco</td>
</tr>
<tr>
<td>TraverseMonths: 00:00:00.0038782</td>
<td>TraverseMonths: 00:00:00.6199738</td>
</tr>
<tr>
<td colspan="2"><em>Example:
<code>var months = _examineDataContext.Months;
foreach (var month in months)
{
var name = month.NodeName;
}</code>
</em></td>
</tr>
</tbody>
</table>
<p><strong>4. Scenario - Traverse Children:</strong>
In this test I get i.e. Events from the DataContext, loop through all events and its children</p>
<table width="100%">
<tbody>
<tr>
<td>Examine</td>
<td>LINQ2Umbraco</td>
</tr>
<tr>
<td>GetYearMonthTraverseChildren: 00:00:00.0662222GetEventsTraverseChildren: 00:00:10.7358665</td>
<td>GetYearMonthTraverseChildren: 00:00:00.8251347GetEventsTraverseChildren: 00:00:23.0377022</td>
</tr>
<tr>
<td colspan="2"><em>Example:
<code>var events = _examineDataContext.Events;
foreach (var @event in events)
{
if (@event == null) continue;</code></em><em> foreach (var child in @event.Children)
{
string name = child.NodeName;
}
}
</em></td>
</tr>
</tbody>
</table>
<p><strong>5. Scenario - Count:</strong>
In this test I simply count the number of items of different types from in the DataContext</p>
<table width="100%">
<tbody>
<tr>
<td>Examine</td>
<td>LINQ2Umbraco</td>
</tr>
<tr>
<td>GetMonthsCount: 00:00:00.0031931GetYearsCount: 00:00:00.0004367
GetEventCounts: 00:00:00.3420866
GetEventSectionsCount: 00:00:00.7414970</td>
<td>GetMonthsCount: 00:00:00.6178589GetYearsCount: 00:00:00.5692922
GetEventsCount: 00:00:00.9023448
GetEventSectionsCount: 00:00:01.1714143</td>
</tr>
<tr>
<td colspan="2"><em>Example: <code>var events = _examineDataContext.Events;
int count = events.Count();</code></em></td>
</tr>
</tbody>
</table>
<p><strong>6. Scenario - Ancestors:</strong>
In this test I get a specific Event from the DataContext, and get different Ancestors based on type</p>
<table width="100%">
<tbody>
<tr>
<td>Examine</td>
<td>LINQ2Umbraco</td>
</tr>
<tr>
<td>GetEventAncestorAsYear: 00:00:00.3837243
GetEventAncestorAsHome: 00:00:00.0011323</td>
<td>GetEventAncestorAsYear: 00:00:01.0451501GetEventAncestorAsHome: 00:00:00.0014134</td>
</tr>
<tr>
<td colspan="2"><em>Example:
<code>var firstEvent = _examineDataContext.Events.Where(x => x.Id == 1210).FirstOrDefault();
var home = firstEvent.AncestorOrDefault();</code>
</em></td>
</tr>
</tbody>
</table>
<p>Note: All numbers are calculated averages from 15 test runs in the following format: hh:mm:ss:ms</p>
<p>For now I'll let the numbers speak for themselves. But I would like to include some tests for the new Query options that comes with Umbraco 4.7 for a little more perspective, and comment some more on the numbers from the various test cases.</p>
<p>If you have some test cases that you think would be valuable for this comparison, please feel free to add a comment with your test case.</p>
<p>I will try to wrap up the code in a solution and package it up with an Umbraco site and test cases, so others can have a go. So check back for updates.</p>
<p>All in all I'm pretty happy with the performance tests so far.</p>
<p>Here is links to the solution containing LINQ2Umbraco with my addition of an Examine Provider (please note that the solution contains the original LINQ2Umbraco source as it has internal dependencies):</p>
<p><a title="Download LINQ2Examine Solution" href="http://cdn.sitereactor.dk/Files/LINQ2Examine-Solution.zip">Download solution</a>
<a title="Download only Examine Provider assemby" href="http://cdn.sitereactor.dk/Files/LINQ2Examine-Assembly.zip">Download assemblies only</a></p>
<p>The solution and assembly has an Examine indexer, which you should use for indexing your content before trying to use the provider to get strongly typed objects from your index.
Set type="LINQ2Examine.Examine.Indexer.ExamineNodeIndexer, LINQ2Examine" for your ExamineIndexProvider in your ExamineSettings.config in order to use it for indexing.</p>
<p>Reference your generated datacontext like this:</p>
<p>public partial class UmbracoDataContext : LINQ2Examine.ExamineDataContext, IUmbracoDataContext
public interface IUmbracoDataContext : LINQ2Examine.IUmbracoDataContext</p>
<p>When using the Examine DataContext you initialize like this:</p>
<p>ExamineDataProvider dataProvider = new ExamineDataProvider("MyIndexSearcher");
Generated.IUmbracoDataContext dataContext = new Generated.UmbracoDataContext(dataProvider);</p>
<p>I will add the test solution over the coming weekend, as I need to clean up the current solution and move it to a demo site instead.</p>
<img src="http://blog.sitereactor.dk/via-feed/2011/02/28/examine-provider-for-linq2umbraco" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2011%2f02%2f28%2fexamine-provider-for-linq2umbraco&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2011/01/12/umbraco-on-azure-series-deploying-to-azure-with-acceleratorUmbraco on Azure Series: Deploying to Azure with Accelerator<p>This is the second post in the series about deploying Umbraco to Windows Azure. In the previous post we looked at deploying a clean <a title="SQL Azure post" href="http://blog.sitereactor.dk/2011/01/11/umbraco-on-azure-series-sql-azure/" target="_blank">Umbraco database to SQL Azure</a>, so this post assumes that you have a database running on SQL Azure.</p>
<p>The focus of this post is to get your local Umbraco solution deployed to a Hosted Service on Windows Azure. Well, you actually need two services to deploy Umbraco because the Hosted Service is only half of running Umbraco on Azure, so deployed to a Hosted Service and Storage.
During the deployment you will be creating a virtual harddrive, which will be deployed to Storage. So before getting started please make sure you have access to both Hosted Service and Storage.</p>
<p>In this post the Azure Accelerator project will come into play, and is listed in the prerequisites below. The cool thing about Accelerator is that it "just" needs to be configured and then it'll build a virtual harddrive (VHD) containing your Umbraco solution and upload it to storage for you. Aside from that you will also be able to publish the two packages (Configuration cscfg-file and Package cspkg-file) needed to deploy the worker role, which is the Azure VM instance that keeps your site running. The binding between the hosted Azure instance and VHD in storage is done by configuring (step 3) and running Accelerator.
The Azure VM is the equivalent of a website instance in your IIS, but since this is a cloud service the instance will live and die in the cloud. This means that if you stop the instance it will die, if the instance crashes it will die (for a production site you would have at least two instances running, so your website doesn't die if one instance crashes). Because of this you need your Umbraco solution persisted to storage, which is where the Azure Storage and VHD comes in. So basically you will have a lot less to worry about when using the Accelerator project.</p>
<p><span style="text-decoration:underline;">Prerequisites:</span>
Umbraco database running on SQL Azure from previous post (or an embedded database if you don't want to use SQL Azure).
Local Umbraco (4.5.2 .NET 3.5) solution using the database on SQL Azure.
Keys for Azure Storage (more info will follow).
The two guides on The Azure Accelerators Project from <a title="Azure Accelerator on Codeplex" href="http://azureaccelerators.codeplex.com/" target="_blank">codeplex</a>.
Source Code for Azure Accelerator from <a title="Azure Accelerator on codeplex" href="http://azureaccelerators.codeplex.com/releases/view/54738" target="_blank">codeplex</a>.
Visual Studio 2010 with Cloud Sevice v.1.2 installed.
- <a title="Windows Azure SDK download" href="http://msdn.microsoft.com/en-us/windowsazure/cc974146" target="_blank">Windows Azure SDK version 1.2</a> (included in Cloud Service installation) - look for June 2010 release (version 1.2) at the bottom of the page.
- <a title="Windows Azure AppFabric download" href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=39856a03-1490-4283-908f-c8bf0bfad8a5&displaylang=en" target="_blank">Windows Azure AppFabric SDK version 1.0</a>.
<strong>- Note that the version is very important as the Azure Accelerator will not work with newer versions of the SDK. At least for now, as I'm still to figure out if there is a conflict when using newer versions of the SDK. Using version 1.3 of the SDK has proven troublesome for Warren Buckley. So to save yourself a headache go with version 1.2 of the SDK untill it has been investigated further.</strong></p>
<p>Make sure you have installed the SDKs from the list above before going further.</p>
<p><strong>1.)</strong> First off I will show you how to setup Storage on Windows Azure, as you will need access keys for storage in order to deploy the VHD to Azure Storage.
Go to the <a title="WindowsAzurePlatform portal" href="http://windows.azure.com" target="_blank">WindowsAzurePlatform</a> portal and login. If you are prompted to choose which version of the portal you want to use then choose the new one. Its built in Silverlight and works quite nice.
From the left column click "Hosted Serivces, Storage Accounts & CDN" (see screenshot below).</p>
<p><a href="http://blog.sitereactor.dk//files/azure/azure-left-column-storage-accounts.jpg"><img class="aligncenter size-full wp-image-207" title="Azure left column Storage Accounts" src="/files/azure/azure-left-column-storage-accounts.jpg" alt="" width="225" height="264" /></a></p>
<p>Now your available services will be listed, so click "Storage Accounts" from the left column and then "New Storage Account" from the top menu.</p>
<p><a href="http://blog.sitereactor.dk//files/azure/storage-accounts.jpg"><img class="aligncenter size-full wp-image-208" title="Storage Accounts" src="/files/azure/storage-accounts.jpg" alt="" width="237" height="297" /></a></p>
<p>A new dialog pops up where you have to choose your Storage Account subscription, a name that will make up the url and a region - select a region that is close to you. See screenshot below.</p>
<p><a href="http://blog.sitereactor.dk//files/azure/create-a-new-storage-account.jpg"><img class="aligncenter size-full wp-image-209" title="Create a New Storage Account" src="/files/azure/create-a-new-storage-account.jpg" alt="" width="370" height="277" /></a></p>
<p>When you have clicked the Create button you will see the storage account appear in the main window. Click and you will get a new right column with properties. Copy the Primary access key and your Storage Account name as they are needed in the configuration of the Accelerator project.</p>
<p><a href="http://blog.sitereactor.dk//files/azure/storage-properties.jpg"><img class="aligncenter size-full wp-image-210" title="Storage Properties" src="/files/azure/storage-properties.jpg" alt="" width="301" height="176" /></a></p>
<p>Now you have succesfully created a storage account that you can use to deploy your VHD with Umbraco solution to. But first you need to configure the Accelerator project and build it, so you can have it create and upload the VHD for you.</p>
<p><strong>2.)</strong> Unzip the Azure Accelerator solution and open it with Visual Studio 2010. Unbind the solution from (codeplex) source control and make the files writeable, as you need to update a couple of files.
First thing I recommend you do is to look through the references for the 3 projects, just to make sure there are no missing references or version conflicts.
Finally build the solution to verify it also builds.</p>
<p><strong>3.)</strong> This step is probably the most complicated one, because there are alot of settings to go through to configure the solution. Before going any further I recommend that you read the two guides from the <a title="Azure Accelerator project page on codeplex" href="http://azureaccelerators.codeplex.com" target="_blank">Azure Accelerator project page</a> if you haven't already done so.</p>
<p>Locate the "AcceleratorService" project in the solution and right click Properties on the AcceleratorWorkerRole to edit the various settings. See screenshot below.</p>
<p><a href="http://blog.sitereactor.dk//files/azure/acceleratorservice.jpg"><img class="aligncenter size-full wp-image-212" title="AcceleratorService project" src="/files/azure/acceleratorservice.jpg" alt="" width="240" height="177" /></a></p>
<p>I'm not what the best approach for going through these settings are, so I have listed them all with their default value and written what you should change the value to - if the value needs to be changed.</p>
<p><span style="text-decoration:underline;">Configuration:</span>
Full trust - leave it set to full trust.
Instances is by default set to one instance with Medium VM size. You can leave this as is, but it is recommended to deploy production sites with minimum two instances. For this guide you don't need more then one.
Note: Remember that two instances implies higher costs. Also note that a Medium VM isn't super fast, so consider setting it to Large or Extra Large.</p>
<p><span style="text-decoration:underline;">Settings:</span>
AcceleratorApplication - Default: Umbraco,3.x
Change to Umbraco,4.0</p>
<p>AcceleratorConnectionString - Default: UseDevelopmentStorage=true
Change this by clicking ... and enter your storage credentials in the dialog. See screenshow below:</p>
<p><a href="http://blog.sitereactor.dk//files/azure/storage-connection-string.jpg"><img class="aligncenter size-medium wp-image-214" title="Storage Connection String" src="/files/azure/storage-connection-string.jpg?w=300" alt="" width="300" height="182" /></a></p>
<p>When changed the connectionstring should look something like this:
DefaultEndpointsProtocol=http;AccountName=YourStorageAccountName;AccountKey=YourStoragePrimaryAccessKey</p>
<p>LocalSitePath - Default: C:\inetpub\wwwroot
This is the path to the folder containing the Umbaco solution. If you have installed your Umbraco website to the default location you probably don't need to change it, but make sure the path is correct and change if necessary.</p>
<p>AcceleratorConfigBlobUri - Default: wa-accelerator-config/umbraco.config
This is the default location for the umbraco.config, which is being used by Accelerator so leave this setting as is.</p>
<p>AcceleratorContainerSyncUri - Default: wa-accelerator-apps/inetpub
Also a default setting that you don't need to change.</p>
<p>AcceleratorMachineKey - Default: <machineKey validationKey="A Long Key" decryptionKey="Another Long Key" validation="SHA1" decryption="AES" />
Just leave this as is.</p>
<p>EnableDevStorage - Default: false
Since we are deploying to Azure Hosted Service leave this as is. You only want to enable development storage when testing locally.</p>
<p>allowInsecureRemoteEndpoints - Default: true
The site will be running a standard HTTP connection, so leave the value set to true.</p>
<p>Hostheader - Default: (blank)
The hostheader is blank by default and for this guide it can be left blank as we will only deploy one Umbraco site that will respond to whatever URL is generated by Azure.</p>
<p>Diagnostics - Default: ApplicationName=Umbraco;EnableLogging=true;DiagnosticsConsole=false;RealtimeTracing=false;LogFilter=Verbose;LogTransferInterval=5;BufferQuotaInMB=512
This string determines how diagnostics will be handled by Accelerator when deployed to Azure. As you can see logging is enabled, which is fine for now so just leave it set to default value. But maybe consider if the buffer should be set to something smaller then 512MB.</p>
<p>DiagnosticsConnectionString - Default: UseDevelopmentStorage=true
If you want to use diagnostics you have to change this setting to an Azure Storage account. This would typically be the same credentials as entered in AcceleratorConnectionString and when done your connectionstring would look similar to the one below:
DefaultEndpointsProtocol=http;AccountName=YourStorageAccountName;AccountKey=YourStoragePrimaryAccessKey
Note that official documentation states that diagnostics should run on https (for DefautlEndPointsProtocol), but you will be able to deploy it with http.</p>
<p>DiagnosticsServiceBus - Default: ServiceNamespace=enterservicebus;ServicePath=diag/umbraco;IssuerName=owner;IssuerSecret=enterissuersecret
I must admit I'm not totally confident about this setting, but I believe the idea is to have a ServiceBus that keeps an eye on the Instance and writes errors to storage. You will probably have to setup a ServiceBus via AppFabric, but leave this for now as its not needed to succesfully deploy the Umbraco solution to Azure. I will write a follow-up blog post where I hope to have some more answers about this setting ;)</p>
<p>AcceleratorDrivePageBlobUri - Default: cloud-drives/Umbraco.vhd
Also a default setting that you don't need to change. This is the location used for the VHD in storage.</p>
<p><span style="text-decoration:underline;">Endpoints:</span>
HttpIn - Default: 80
Leave this setting set to default value.</p>
<p>HttpInAlt - Default: 8080
Leave this setting set to default value.</p>
<p><span style="text-decoration:underline;">Local Storage:</span>
LocalStorage - Default: 16384
This local storage refers to the actual instance's (Azure VM) local storage size, which will typically be used for ASP.NET caching and IIS temporary files.</p>
<p>CloudDriveCache - Default: 2048
This setting is the size in MB used for the common storage for mounted cloud drives.</p>
<p>DiagnosticLogs - Default: 16384
This setting is the size in MB used for temporary storage for trace files and event logs created by Accelerator.
All of these local storage settings can be left set to default values. But keep in mind that you might want to revise these settings for a production site.</p>
<p><strong>4.)</strong> Now that the various settings has been updated you are ready to build the solution and publish the packages. But first you want to make sure you build release assemblies - see screenshot below:</p>
<p><a href="http://blog.sitereactor.dk//files/azure/release-build.jpg"><img class="aligncenter size-full wp-image-216" title="Release build" src="/files/azure/release-build.jpg" alt="" width="201" height="48" /></a></p>
<p>So build the solution, which produces a Publish folder in your Accelerator solution folder:</p>
<p><a href="http://blog.sitereactor.dk//files/azure/publish-folder.jpg"><img class="aligncenter size-full wp-image-217" title="Publish folder" src="/files/azure/publish-folder.jpg" alt="" width="223" height="172" /></a></p>
<p>Now go back to Visual Studio and right click Publish from the AcceleratorService project. This will open a new dialog like the one in the screenshot below.</p>
<p><a href="http://blog.sitereactor.dk//files/azure/publish-cloud-service.jpg"><img class="aligncenter size-medium wp-image-218" title="Publish Cloud Service" src="/files/azure/publish-cloud-service.jpg?w=300" alt="" width="300" height="249" /></a></p>
<p>Choose "Create Service Package Only" and click OK. The output folder will open automatically, so note the location of the two files (see screenshot below) as they will be used in step 6.</p>
<p><a href="http://blog.sitereactor.dk//files/azure/published-packages.jpg"><img class="aligncenter size-full wp-image-219" title="Published Packages" src="/files/azure/published-packages.jpg" alt="" width="213" height="79" /></a></p>
<p><strong>5.)</strong> Now its time to build the VHD and upload it to storage using AccelCon.exe (located in Publish folder in your Accelerator solution folder) from Windows Azure SDK Command Prompt.
Note that you have to run the Azure SDK Command Prompt as administrator, so select the Windows Azure SDK Command Prompt from Start -> All Programs -> Windows Azure SDK v1.2 and right click "Run as administrator". Once you got it open you need to naviate to the Publish folder which contains the AccelCon.exe file.
Type in this command and follow the instructions in the Command Prompt window: AccelCon /u /w /q
This will start the creation of the VHD, copying of Umbraco solution to VHD and finally uploading it to your storage account.</p>
<p><strong>6.)</strong> Final setp is to setup a Hosted Service and install the two published packages (AcceleratorService.cspkg and ServiceConfiguration.cscfg).
Go to the WindowsAzurePlatform portal and Navigate to "Hosted Services, Storage Accounts & CDN" -> "Hosted Services". From the top menu click "New Hosted Service" and a new dialog will appear.
Fill out the form similar to the screen below, but note that the URL prefix has to be unique from anything that is already deployed to azure. But don't worry it'll give you an error message if you choose a URL prefix that is already in use.</p>
<p>You can choose to deploy to staged environment or directly to production. For this guide you can choose either one. If you choose the staged environment you will get a random URL that you can use to test your hosted service (Umbraco solution) and you can later choose to promote that service fra staging to production.</p>
<p>Choose the same region as you chose for you Storage Account and browse and locate the two packages: AcceleratorService.cspkg (package localtion) and ServiceConfiguration.cscfg (configuration file).</p>
<p><a href="http://blog.sitereactor.dk//files/azure/create-a-new-hosted-service.jpg"><img class="aligncenter size-medium wp-image-220" title="Create a New Hosted Service" src="/files/azure/create-a-new-hosted-service.jpg?w=251" alt="" width="251" height="300" /></a></p>
<p>After clicking OK you will most likely get a warning message if you have only set one instance in the configuration of the AcceleratorWorkerRole. It will take some time for the Hosted Service to initialize and startup the instance with VHD attached. While waiting you will see the following in the main window of the WindowsAzurePlatform portal:</p>
<p><a href="http://blog.sitereactor.dk//files/azure/hosted-service-initializing.jpg"><img class="aligncenter size-medium wp-image-221" title="Hosted Service Initializing" src="/files/azure/hosted-service-initializing.jpg?w=300" alt="" width="300" height="43" /></a></p>
<p>And when your solution has been succesfully deployed to Azure Hosted Service it will look like this:</p>
<p><a href="http://blog.sitereactor.dk//files/azure/hosted-service-ready.jpg"><img class="aligncenter size-medium wp-image-223" title="Hosted Service Ready" src="/files/azure/hosted-service-ready.jpg?w=300" alt="" width="300" height="41" /></a></p>
<p>You should now be able to access the site via the standard url with your selected url prefix: YOURPREFIX.cloudapp.net.</p>
<p>I have deployed my Umbraco solution to <a title="Umbraco with CWS running on Windows Azure" href="http://umbracoazurecws.cloudapp.net" target="_blank">umbracoazurecws.cloudapp.net</a> (with CWS installed of course - this is my special dedication to Warren Buckley for trying to deploy Umbraco to Azure).
<em>Please note that this site will only be running for a couple of days, as I'm paying for each hour the instance is active :-S</em></p>
<p>That wasn't too bad was it ;-)</p>
<p>I hope you have found these two posts about deploying Umbraco to Windows Azure useful, and if you have any additional questions or think something is missing in this guide please feel free to drop a comment.</p>
<p><strong>Update:</strong> Okay, maybe I should have deployed this demo site to two large or extra-large instances because now the site just loads like crap :-)<strong></strong></p>
<p><strong>2nd Update:</strong> Deploying with two instances seems to work a lot better.</p>
<p><strong>3rd Update:</strong> Please disregard the 2nd update - deploying an Umbraco site with multiple instances will not work, as you can only mount the Cloud Drive on a single instance. Multiple instances will only work with snapshots, which doesn't do Umbraco any good - see this <a title="Discussion on Codeplex" href="http://azureaccelerators.codeplex.com/discussions/245276" target="_blank">Codeplex discussion</a> for reference.</p>
<img src="http://blog.sitereactor.dk/via-feed/2011/01/12/umbraco-on-azure-series-deploying-to-azure-with-accelerator" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2011%2f01%2f12%2fumbraco-on-azure-series-deploying-to-azure-with-accelerator&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2011-01-11T23:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>This is the second post in the series about deploying Umbraco to Windows Azure. In the previous post we looked at deploying a clean <a title="SQL Azure post" href="http://blog.sitereactor.dk/2011/01/11/umbraco-on-azure-series-sql-azure/" target="_blank">Umbraco database to SQL Azure</a>, so this post assumes that you have a database running on SQL Azure.</p>
<p>The focus of this post is to get your local Umbraco solution deployed to a Hosted Service on Windows Azure. Well, you actually need two services to deploy Umbraco because the Hosted Service is only half of running Umbraco on Azure, so deployed to a Hosted Service and Storage.
During the deployment you will be creating a virtual harddrive, which will be deployed to Storage. So before getting started please make sure you have access to both Hosted Service and Storage.</p>
<p>In this post the Azure Accelerator project will come into play, and is listed in the prerequisites below. The cool thing about Accelerator is that it "just" needs to be configured and then it'll build a virtual harddrive (VHD) containing your Umbraco solution and upload it to storage for you. Aside from that you will also be able to publish the two packages (Configuration cscfg-file and Package cspkg-file) needed to deploy the worker role, which is the Azure VM instance that keeps your site running. The binding between the hosted Azure instance and VHD in storage is done by configuring (step 3) and running Accelerator.
The Azure VM is the equivalent of a website instance in your IIS, but since this is a cloud service the instance will live and die in the cloud. This means that if you stop the instance it will die, if the instance crashes it will die (for a production site you would have at least two instances running, so your website doesn't die if one instance crashes). Because of this you need your Umbraco solution persisted to storage, which is where the Azure Storage and VHD comes in. So basically you will have a lot less to worry about when using the Accelerator project.</p>
<p><span style="text-decoration:underline;">Prerequisites:</span>
Umbraco database running on SQL Azure from previous post (or an embedded database if you don't want to use SQL Azure).
Local Umbraco (4.5.2 .NET 3.5) solution using the database on SQL Azure.
Keys for Azure Storage (more info will follow).
The two guides on The Azure Accelerators Project from <a title="Azure Accelerator on Codeplex" href="http://azureaccelerators.codeplex.com/" target="_blank">codeplex</a>.
Source Code for Azure Accelerator from <a title="Azure Accelerator on codeplex" href="http://azureaccelerators.codeplex.com/releases/view/54738" target="_blank">codeplex</a>.
Visual Studio 2010 with Cloud Sevice v.1.2 installed.
- <a title="Windows Azure SDK download" href="http://msdn.microsoft.com/en-us/windowsazure/cc974146" target="_blank">Windows Azure SDK version 1.2</a> (included in Cloud Service installation) - look for June 2010 release (version 1.2) at the bottom of the page.
- <a title="Windows Azure AppFabric download" href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=39856a03-1490-4283-908f-c8bf0bfad8a5&displaylang=en" target="_blank">Windows Azure AppFabric SDK version 1.0</a>.
<strong>- Note that the version is very important as the Azure Accelerator will not work with newer versions of the SDK. At least for now, as I'm still to figure out if there is a conflict when using newer versions of the SDK. Using version 1.3 of the SDK has proven troublesome for Warren Buckley. So to save yourself a headache go with version 1.2 of the SDK untill it has been investigated further.</strong></p>
<p>Make sure you have installed the SDKs from the list above before going further.</p>
<p><strong>1.)</strong> First off I will show you how to setup Storage on Windows Azure, as you will need access keys for storage in order to deploy the VHD to Azure Storage.
Go to the <a title="WindowsAzurePlatform portal" href="http://windows.azure.com" target="_blank">WindowsAzurePlatform</a> portal and login. If you are prompted to choose which version of the portal you want to use then choose the new one. Its built in Silverlight and works quite nice.
From the left column click "Hosted Serivces, Storage Accounts & CDN" (see screenshot below).</p>
<p><a href="http://blog.sitereactor.dk//files/azure/azure-left-column-storage-accounts.jpg"><img class="aligncenter size-full wp-image-207" title="Azure left column Storage Accounts" src="/files/azure/azure-left-column-storage-accounts.jpg" alt="" width="225" height="264" /></a></p>
<p>Now your available services will be listed, so click "Storage Accounts" from the left column and then "New Storage Account" from the top menu.</p>
<p><a href="http://blog.sitereactor.dk//files/azure/storage-accounts.jpg"><img class="aligncenter size-full wp-image-208" title="Storage Accounts" src="/files/azure/storage-accounts.jpg" alt="" width="237" height="297" /></a></p>
<p>A new dialog pops up where you have to choose your Storage Account subscription, a name that will make up the url and a region - select a region that is close to you. See screenshot below.</p>
<p><a href="http://blog.sitereactor.dk//files/azure/create-a-new-storage-account.jpg"><img class="aligncenter size-full wp-image-209" title="Create a New Storage Account" src="/files/azure/create-a-new-storage-account.jpg" alt="" width="370" height="277" /></a></p>
<p>When you have clicked the Create button you will see the storage account appear in the main window. Click and you will get a new right column with properties. Copy the Primary access key and your Storage Account name as they are needed in the configuration of the Accelerator project.</p>
<p><a href="http://blog.sitereactor.dk//files/azure/storage-properties.jpg"><img class="aligncenter size-full wp-image-210" title="Storage Properties" src="/files/azure/storage-properties.jpg" alt="" width="301" height="176" /></a></p>
<p>Now you have succesfully created a storage account that you can use to deploy your VHD with Umbraco solution to. But first you need to configure the Accelerator project and build it, so you can have it create and upload the VHD for you.</p>
<p><strong>2.)</strong> Unzip the Azure Accelerator solution and open it with Visual Studio 2010. Unbind the solution from (codeplex) source control and make the files writeable, as you need to update a couple of files.
First thing I recommend you do is to look through the references for the 3 projects, just to make sure there are no missing references or version conflicts.
Finally build the solution to verify it also builds.</p>
<p><strong>3.)</strong> This step is probably the most complicated one, because there are alot of settings to go through to configure the solution. Before going any further I recommend that you read the two guides from the <a title="Azure Accelerator project page on codeplex" href="http://azureaccelerators.codeplex.com" target="_blank">Azure Accelerator project page</a> if you haven't already done so.</p>
<p>Locate the "AcceleratorService" project in the solution and right click Properties on the AcceleratorWorkerRole to edit the various settings. See screenshot below.</p>
<p><a href="http://blog.sitereactor.dk//files/azure/acceleratorservice.jpg"><img class="aligncenter size-full wp-image-212" title="AcceleratorService project" src="/files/azure/acceleratorservice.jpg" alt="" width="240" height="177" /></a></p>
<p>I'm not what the best approach for going through these settings are, so I have listed them all with their default value and written what you should change the value to - if the value needs to be changed.</p>
<p><span style="text-decoration:underline;">Configuration:</span>
Full trust - leave it set to full trust.
Instances is by default set to one instance with Medium VM size. You can leave this as is, but it is recommended to deploy production sites with minimum two instances. For this guide you don't need more then one.
Note: Remember that two instances implies higher costs. Also note that a Medium VM isn't super fast, so consider setting it to Large or Extra Large.</p>
<p><span style="text-decoration:underline;">Settings:</span>
AcceleratorApplication - Default: Umbraco,3.x
Change to Umbraco,4.0</p>
<p>AcceleratorConnectionString - Default: UseDevelopmentStorage=true
Change this by clicking ... and enter your storage credentials in the dialog. See screenshow below:</p>
<p><a href="http://blog.sitereactor.dk//files/azure/storage-connection-string.jpg"><img class="aligncenter size-medium wp-image-214" title="Storage Connection String" src="/files/azure/storage-connection-string.jpg?w=300" alt="" width="300" height="182" /></a></p>
<p>When changed the connectionstring should look something like this:
DefaultEndpointsProtocol=http;AccountName=YourStorageAccountName;AccountKey=YourStoragePrimaryAccessKey</p>
<p>LocalSitePath - Default: C:\inetpub\wwwroot
This is the path to the folder containing the Umbaco solution. If you have installed your Umbraco website to the default location you probably don't need to change it, but make sure the path is correct and change if necessary.</p>
<p>AcceleratorConfigBlobUri - Default: wa-accelerator-config/umbraco.config
This is the default location for the umbraco.config, which is being used by Accelerator so leave this setting as is.</p>
<p>AcceleratorContainerSyncUri - Default: wa-accelerator-apps/inetpub
Also a default setting that you don't need to change.</p>
<p>AcceleratorMachineKey - Default: <machineKey validationKey="A Long Key" decryptionKey="Another Long Key" validation="SHA1" decryption="AES" />
Just leave this as is.</p>
<p>EnableDevStorage - Default: false
Since we are deploying to Azure Hosted Service leave this as is. You only want to enable development storage when testing locally.</p>
<p>allowInsecureRemoteEndpoints - Default: true
The site will be running a standard HTTP connection, so leave the value set to true.</p>
<p>Hostheader - Default: (blank)
The hostheader is blank by default and for this guide it can be left blank as we will only deploy one Umbraco site that will respond to whatever URL is generated by Azure.</p>
<p>Diagnostics - Default: ApplicationName=Umbraco;EnableLogging=true;DiagnosticsConsole=false;RealtimeTracing=false;LogFilter=Verbose;LogTransferInterval=5;BufferQuotaInMB=512
This string determines how diagnostics will be handled by Accelerator when deployed to Azure. As you can see logging is enabled, which is fine for now so just leave it set to default value. But maybe consider if the buffer should be set to something smaller then 512MB.</p>
<p>DiagnosticsConnectionString - Default: UseDevelopmentStorage=true
If you want to use diagnostics you have to change this setting to an Azure Storage account. This would typically be the same credentials as entered in AcceleratorConnectionString and when done your connectionstring would look similar to the one below:
DefaultEndpointsProtocol=http;AccountName=YourStorageAccountName;AccountKey=YourStoragePrimaryAccessKey
Note that official documentation states that diagnostics should run on https (for DefautlEndPointsProtocol), but you will be able to deploy it with http.</p>
<p>DiagnosticsServiceBus - Default: ServiceNamespace=enterservicebus;ServicePath=diag/umbraco;IssuerName=owner;IssuerSecret=enterissuersecret
I must admit I'm not totally confident about this setting, but I believe the idea is to have a ServiceBus that keeps an eye on the Instance and writes errors to storage. You will probably have to setup a ServiceBus via AppFabric, but leave this for now as its not needed to succesfully deploy the Umbraco solution to Azure. I will write a follow-up blog post where I hope to have some more answers about this setting ;)</p>
<p>AcceleratorDrivePageBlobUri - Default: cloud-drives/Umbraco.vhd
Also a default setting that you don't need to change. This is the location used for the VHD in storage.</p>
<p><span style="text-decoration:underline;">Endpoints:</span>
HttpIn - Default: 80
Leave this setting set to default value.</p>
<p>HttpInAlt - Default: 8080
Leave this setting set to default value.</p>
<p><span style="text-decoration:underline;">Local Storage:</span>
LocalStorage - Default: 16384
This local storage refers to the actual instance's (Azure VM) local storage size, which will typically be used for ASP.NET caching and IIS temporary files.</p>
<p>CloudDriveCache - Default: 2048
This setting is the size in MB used for the common storage for mounted cloud drives.</p>
<p>DiagnosticLogs - Default: 16384
This setting is the size in MB used for temporary storage for trace files and event logs created by Accelerator.
All of these local storage settings can be left set to default values. But keep in mind that you might want to revise these settings for a production site.</p>
<p><strong>4.)</strong> Now that the various settings has been updated you are ready to build the solution and publish the packages. But first you want to make sure you build release assemblies - see screenshot below:</p>
<p><a href="http://blog.sitereactor.dk//files/azure/release-build.jpg"><img class="aligncenter size-full wp-image-216" title="Release build" src="/files/azure/release-build.jpg" alt="" width="201" height="48" /></a></p>
<p>So build the solution, which produces a Publish folder in your Accelerator solution folder:</p>
<p><a href="http://blog.sitereactor.dk//files/azure/publish-folder.jpg"><img class="aligncenter size-full wp-image-217" title="Publish folder" src="/files/azure/publish-folder.jpg" alt="" width="223" height="172" /></a></p>
<p>Now go back to Visual Studio and right click Publish from the AcceleratorService project. This will open a new dialog like the one in the screenshot below.</p>
<p><a href="http://blog.sitereactor.dk//files/azure/publish-cloud-service.jpg"><img class="aligncenter size-medium wp-image-218" title="Publish Cloud Service" src="/files/azure/publish-cloud-service.jpg?w=300" alt="" width="300" height="249" /></a></p>
<p>Choose "Create Service Package Only" and click OK. The output folder will open automatically, so note the location of the two files (see screenshot below) as they will be used in step 6.</p>
<p><a href="http://blog.sitereactor.dk//files/azure/published-packages.jpg"><img class="aligncenter size-full wp-image-219" title="Published Packages" src="/files/azure/published-packages.jpg" alt="" width="213" height="79" /></a></p>
<p><strong>5.)</strong> Now its time to build the VHD and upload it to storage using AccelCon.exe (located in Publish folder in your Accelerator solution folder) from Windows Azure SDK Command Prompt.
Note that you have to run the Azure SDK Command Prompt as administrator, so select the Windows Azure SDK Command Prompt from Start -> All Programs -> Windows Azure SDK v1.2 and right click "Run as administrator". Once you got it open you need to naviate to the Publish folder which contains the AccelCon.exe file.
Type in this command and follow the instructions in the Command Prompt window: AccelCon /u /w /q
This will start the creation of the VHD, copying of Umbraco solution to VHD and finally uploading it to your storage account.</p>
<p><strong>6.)</strong> Final setp is to setup a Hosted Service and install the two published packages (AcceleratorService.cspkg and ServiceConfiguration.cscfg).
Go to the WindowsAzurePlatform portal and Navigate to "Hosted Services, Storage Accounts & CDN" -> "Hosted Services". From the top menu click "New Hosted Service" and a new dialog will appear.
Fill out the form similar to the screen below, but note that the URL prefix has to be unique from anything that is already deployed to azure. But don't worry it'll give you an error message if you choose a URL prefix that is already in use.</p>
<p>You can choose to deploy to staged environment or directly to production. For this guide you can choose either one. If you choose the staged environment you will get a random URL that you can use to test your hosted service (Umbraco solution) and you can later choose to promote that service fra staging to production.</p>
<p>Choose the same region as you chose for you Storage Account and browse and locate the two packages: AcceleratorService.cspkg (package localtion) and ServiceConfiguration.cscfg (configuration file).</p>
<p><a href="http://blog.sitereactor.dk//files/azure/create-a-new-hosted-service.jpg"><img class="aligncenter size-medium wp-image-220" title="Create a New Hosted Service" src="/files/azure/create-a-new-hosted-service.jpg?w=251" alt="" width="251" height="300" /></a></p>
<p>After clicking OK you will most likely get a warning message if you have only set one instance in the configuration of the AcceleratorWorkerRole. It will take some time for the Hosted Service to initialize and startup the instance with VHD attached. While waiting you will see the following in the main window of the WindowsAzurePlatform portal:</p>
<p><a href="http://blog.sitereactor.dk//files/azure/hosted-service-initializing.jpg"><img class="aligncenter size-medium wp-image-221" title="Hosted Service Initializing" src="/files/azure/hosted-service-initializing.jpg?w=300" alt="" width="300" height="43" /></a></p>
<p>And when your solution has been succesfully deployed to Azure Hosted Service it will look like this:</p>
<p><a href="http://blog.sitereactor.dk//files/azure/hosted-service-ready.jpg"><img class="aligncenter size-medium wp-image-223" title="Hosted Service Ready" src="/files/azure/hosted-service-ready.jpg?w=300" alt="" width="300" height="41" /></a></p>
<p>You should now be able to access the site via the standard url with your selected url prefix: YOURPREFIX.cloudapp.net.</p>
<p>I have deployed my Umbraco solution to <a title="Umbraco with CWS running on Windows Azure" href="http://umbracoazurecws.cloudapp.net" target="_blank">umbracoazurecws.cloudapp.net</a> (with CWS installed of course - this is my special dedication to Warren Buckley for trying to deploy Umbraco to Azure).
<em>Please note that this site will only be running for a couple of days, as I'm paying for each hour the instance is active :-S</em></p>
<p>That wasn't too bad was it ;-)</p>
<p>I hope you have found these two posts about deploying Umbraco to Windows Azure useful, and if you have any additional questions or think something is missing in this guide please feel free to drop a comment.</p>
<p><strong>Update:</strong> Okay, maybe I should have deployed this demo site to two large or extra-large instances because now the site just loads like crap :-)<strong></strong></p>
<p><strong>2nd Update:</strong> Deploying with two instances seems to work a lot better.</p>
<p><strong>3rd Update:</strong> Please disregard the 2nd update - deploying an Umbraco site with multiple instances will not work, as you can only mount the Cloud Drive on a single instance. Multiple instances will only work with snapshots, which doesn't do Umbraco any good - see this <a title="Discussion on Codeplex" href="http://azureaccelerators.codeplex.com/discussions/245276" target="_blank">Codeplex discussion</a> for reference.</p>
<img src="http://blog.sitereactor.dk/via-feed/2011/01/12/umbraco-on-azure-series-deploying-to-azure-with-accelerator" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2011%2f01%2f12%2fumbraco-on-azure-series-deploying-to-azure-with-accelerator&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2011/01/11/umbraco-on-azure-series-sql-azureUmbraco on Azure Series: SQL Azure<p>There has been a lot of buzz around the <a title="Azure Accelerator on Codeplex" href="http://azureaccelerators.codeplex.com/" target="_blank">Azure Accelerator</a> for Umbraco by Microsoft, but it doesn't seem like many have tried it out yet. It might be because it is a little complicated to get up and running. But with <a title="Windows Azure Pass" href="http://www.windowsazurepass.com/" target="_blank">Windows Azure Pass</a> (gives you 30 day free access to Windows Azure and SQL Azure) and this blog series there shouldn't really be any excuse.</p>
<p>First off I need to give some credit to Daniel Bardi for wrting this 23 step guide on the our.umbraco.org wiki "<a title="Installing Umbraco to SQL Azure" href="http://our.umbraco.org/wiki/install-and-setup/how-to-install-umbraco-on-windows-server-2008/installing-umbraco-to-sql-azure" target="_blank">Installing Umbraco to SQL Azure</a>", and to Microsoft for creating the Azure Accelerator project (developed by Slalom Consulting). The guides that are available helped me succesfully deploy an Umbraco database to SQL Azure and an instance to the Windows Azure Hosted Services.
So why am I writing this post if guides already exist? Well, I found a couple of gotchas along the way that I think others can benefit from. And if you have got limited to no experience with Azure or if you find the existing guides too techie or complicated this post is for you.</p>
<p>On a side note: On the Azure Accelerator project page on codeplex you will find two extensive guides to deploying Umbraco to Azure, but nothing about the database and i'm not sure if this is simply because they have used an embedded database, but it confused me the first time around.</p>
<p>The focus of this first post is SQL Azure, because I found it the best approach to get the db up and running first. Best see the database working before we start deploying the Umbraco solution, right. (If you were using an embedded database this wouldn't be necessary, but since SQLCE is still in beta and Vistadb is out of the picture SQL Azure is the best option in my opinion).</p>
<p><span style="text-decoration:underline;">Prerequisites:</span><a title="SQL 2008 R2 Express" href="http://www.microsoft.com/express/Database/InstallOptions.aspx" target="_blank"></a></p>
<p><a title="SQL 2008 R2 Express" href="http://www.microsoft.com/express/Database/InstallOptions.aspx" target="_blank">SQL Server 2008</a> - Only needed if you don't already have an SQL Server or SQL Server Express available.
<a title="SQL 2008 R2 Express" href="http://www.microsoft.com/express/Database/InstallOptions.aspx" target="_blank">SQL Management Studio 2008 R2 Express</a> - If you already have an SQL Server installed then you just need to download the SQL Server Management Studio Express (second column), which is needed to connect to SQL Azure among a couple of other things.
Local Internet Information Server (IIS 7.5).
<a title="Umbraco download on codeplex" href="http://umbraco.codeplex.com/releases/view/51165" target="_blank">Umbraco v.4.5.2</a> ASP.NET 3.5.
Windows Azure account with access to Hosted Services and Storage (will be used in next post), and of course access to SQL Azure.</p>
<p><strong>1.)</strong> First thing you want to do is to setup the database server and database instance on SQL Azure. I'm using the new layout on the <a title="Windows Azure Platform" href="https://windows.azure.com/" target="_blank">Windows Azure Platform</a> and I recommend you do the same.
When you login you should see a left column similar to the screenshot below:</p>
<p><a href="http://blog.sitereactor.dk//get/azure/azure-left-column-home.jpg"><img class="aligncenter size-full wp-image-183" title="Azure Platform Left Column" src="/get/azure/azure-left-column-home.jpg" alt="" width="231" height="266" /></a>
The interesting thing here is the Database, so click it and you should see your subscriptions for SQL Azure.
From the top menu click Create Server to setup your Database Server instance. You will need to select a Region for server, and an administrative user and password. Select a region that is close to you (i.e. I have selected North Europe).
The name of the server will be generated for you and the DNS to the server will be servername.database.windows.net.
When the server is up and running you need to configure Firewall Rules, otherwise you will not be able to connect to it from your local machine. So add an IP range that includes your local IP (see example below).</p>
<p><a href="http://blog.sitereactor.dk//get/azure/sqlazure-firewall-rules.jpg"><img class="aligncenter size-thumbnail wp-image-184" title="SQL Azure Firewall Rules" src="/get/azure/sqlazure-firewall-rules.jpg?w=300" alt="" width="300" height="99" /></a>
With database server and firewall setup you can now create a new database, but instead of doing this through the portal we will create a .dacpac and an sql script to create or rather deploy the Umbraco database to SQL Azure. The next steps will take you through the process of creating these two scripts, and finally deploying them to SQL Azure.</p>
<p><strong>2.)</strong> Now that you got SQL Azure setup, you need to make a local installation of Umbraco. This is just a regular installation of Umbraco, so just do what you normally do to setup a site in your IIS.
One very important thing is to do a "clean" installation, which means to let Umbraco run its install script to setup the db, but don't install runway, cws or any other starterkit. Keeping the database clean will make it easier to deploy.</p>
<p>A side note for installing Umbraco with regards to the upcoming post is to install it to IIS' default site. If you have the possibility to do this it will save you from editing a couple of settings when deploying Umbraco, as the Azure Accelerator is set to the default IIS site (but it can of course be changed).</p>
<p><strong>3.)</strong> Third step is to make the local database deployable - this is also step 3 in the 23-step guide on <a title="Installing Umbraco to SQL Azure" href="http://our.umbraco.org/wiki/install-and-setup/how-to-install-umbraco-on-windows-server-2008/installing-umbraco-to-sql-azure" target="_blank">our.umbraco.org</a>. So open up management studio R2 and navigate to the database for your Umbraco install - I have called mine UmbracoAzure.
Expand the database, then Tables and find the table called "umbracoUserLogins", right click and select Design from the menu. In the design view you select the two rows called contextID and userID, right click and select Set Primary Key. Now save the changes to the table and you should be ready for the next step.</p>
<p><a href="http://blog.sitereactor.dk//get/azure/umbracouserlogins.jpg"><img class="aligncenter size-full wp-image-187" title="umbracoUserLogins Design view" src="/get/azure/umbracouserlogins.jpg" alt="" width="364" height="154" /></a></p>
<p><strong>4.)</strong> This step will cover step 4-6 from the 23-step guide. The files that are generated in this step and the next is available for download at the end of this post.
Close the design view, and select your database, right click and navigate to Tasks -> Extra Data-tier Application (if you don't have this option you probably don't have Management Studio R2 Express installed).</p>
<p><a href="http://blog.sitereactor.dk//get/azure/extra-data-tier-application.jpg"><img class="aligncenter size-medium wp-image-188" title="Extra Data-tier Application" src="/get/azure/extra-data-tier-application.jpg?w=300" alt="" width="300" height="211" /></a>A new dialog will appear, which will guide you through the creation of a .dacpac file and an sql script.
Click next and verify Application name (same as database), and make a note of the location in "Save to DAC package file" as we will need this file to deploy the local database to SQL Azure. Click next a couple of times to finish generating the file.</p>
<p><strong>5.)</strong> This step will cover step 7-13 from the 23-step guide.
Once again go back and select the database, right click and select Tasks -> Generate Scripts.</p>
<p><a href="http://blog.sitereactor.dk//get/azure/generate-scripts.jpg"><img class="aligncenter size-medium wp-image-190" title="Generate Scripts" src="/get/azure/generate-scripts.jpg?w=300" alt="" width="300" height="214" /></a>
A new dialog will appear, which will guide you through the creation of an sql script with inserts for the database on SQL Azure.
Click next and change the default radio button selection to "Select specific database objects" and check the Tables checkbox, as you only want to generate a script for the tables. This is an easy step as a default Umbraco database only contains tables.
On the next screen click the Advanced-button and find the row with "Types of data to script" in the new dialog, and change it to Data only. Click OK, note the location of where the file is saved and click next, next and finally finish.</p>
<p><strong>6.)</strong> Now we have the two files needed to deploy the database to SQL Azure, but you need to move a single line the sql script before deploying anything. This is the first gotcha!
Open up your sql file with the data inserts and look at line 29 where the inserts for the umbracoNode table begins. If you look at the values you will notice that the id is ascending -92, -90, -89 etc. but all of them have a parentID, which is -1. The node with id -1 is the umbraco master root, which you need to move up so its the first insert in the umbracoNode table. If you don't you will get various insert errors while deploying, you will be able to login to Umbraco, but if you navigate to the Developer section and expand the DataType folder you will notice that something is missing.
The edited script is available for download at the end of this post (login is: admin and password: b).</p>
<p><strong>7.)</strong> Disconnect from your local database server and connect to SQL Azure using the connection info that you got while setting up the database server in step 1 and 2.</p>
<p><a href="http://blog.sitereactor.dk//get/azure/sql-azure-connection.jpg"><img class="aligncenter size-medium wp-image-191" title="SQL Azure Connection" src="/get/azure/sql-azure-connection.jpg?w=300" alt="" width="300" height="223" /></a>
When you are connected you can simply expand the Databases folder and see your databases if you have created any through the WindowsAzurePlatform portal. The cool thing about the R2 version of SQL Management Studio is that is allows you to connect to SQL Azure as it was just another SQL Server. Microsoft has also created an online management tool that you can use to do a lot of the same stuff as in management studio. You can access this online tool from the WindowsAzurePlatform portal by clicking Manage from the top menu (in the Database section), but I prefer to use management studio. You will need management studio to deploy the .dacpac file, which creates the database with Tables and contraints.</p>
<p>When you are logged into your SQL Azure database server, right click on the server and select "Deploy Data-tier Application" from the menu. This will open up a dialog where you simply select the .dacpac file, which was generated in a previous step, click next a couple of times and when you are done you have a new database with all the tables of a normal Umbraco install. Next step is to insert the default data.</p>
<p><a href="http://blog.sitereactor.dk//get/azure/deploy-data-tier-application.jpg"><img class="aligncenter size-full wp-image-192" title="Deploy Data-tier Application" src="/get/azure/deploy-data-tier-application.jpg" alt="" width="289" height="164" /></a></p>
<p><strong>8.)</strong> From the menu in SQL Management Studio R2 Express click File -> Open -> File and locate the sql file that was previously generated and re-organized. Make sure the newly created database is selected or that the script starts with "Use [DATABASENAME]" and click Execute in the menu (might be an idea to click Parse first to verify there are no errors in the script).
Execute should run without any errors, so if you encounter any errors you best revise the previous steps, delete the database and try again.</p>
<p><a href="http://blog.sitereactor.dk//get/azure/execute-sql-script.jpg"><img class="aligncenter size-full wp-image-193" title="Execute SQL Script" src="/get/azure/execute-sql-script.jpg" alt="" width="310" height="29" /></a></p>
<p><strong>9.)</strong> With the database setup you can now verify that it is in fact working. Go back to your local install of Umbraco and change the connection string in web.config, which should be changed to something like this:</p>
<p><code><add key="umbracoDbDSN" value="Server=tcp:DATABASESERVERNAME.database.windows.net;Database=UmbracoAzure;User ID=USERNAME;Password=PASSWORD;Trusted_Connection=False;Encrypt=True;" /></code></p>
<p>Note: If you can't access the database it might be that you need to review your firewall settings for the SQL Azure database server.</p>
<p>And there you go, now you have deployed a standard Umbraco database to SQL Azure. Next post will go through the deployment of the Umbraco solution.</p>
<p>Package with the two scripts needed to deploy to SQL Azure:
<a href="http://cdn.sitereactor.dk/Files/DeployScripts.zip">Zip contains both the .dacpac and .sql files.</a></p>
<img src="http://blog.sitereactor.dk/via-feed/2011/01/11/umbraco-on-azure-series-sql-azure" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2011%2f01%2f11%2fumbraco-on-azure-series-sql-azure&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2011-01-10T00:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>There has been a lot of buzz around the <a title="Azure Accelerator on Codeplex" href="http://azureaccelerators.codeplex.com/" target="_blank">Azure Accelerator</a> for Umbraco by Microsoft, but it doesn't seem like many have tried it out yet. It might be because it is a little complicated to get up and running. But with <a title="Windows Azure Pass" href="http://www.windowsazurepass.com/" target="_blank">Windows Azure Pass</a> (gives you 30 day free access to Windows Azure and SQL Azure) and this blog series there shouldn't really be any excuse.</p>
<p>First off I need to give some credit to Daniel Bardi for wrting this 23 step guide on the our.umbraco.org wiki "<a title="Installing Umbraco to SQL Azure" href="http://our.umbraco.org/wiki/install-and-setup/how-to-install-umbraco-on-windows-server-2008/installing-umbraco-to-sql-azure" target="_blank">Installing Umbraco to SQL Azure</a>", and to Microsoft for creating the Azure Accelerator project (developed by Slalom Consulting). The guides that are available helped me succesfully deploy an Umbraco database to SQL Azure and an instance to the Windows Azure Hosted Services.
So why am I writing this post if guides already exist? Well, I found a couple of gotchas along the way that I think others can benefit from. And if you have got limited to no experience with Azure or if you find the existing guides too techie or complicated this post is for you.</p>
<p>On a side note: On the Azure Accelerator project page on codeplex you will find two extensive guides to deploying Umbraco to Azure, but nothing about the database and i'm not sure if this is simply because they have used an embedded database, but it confused me the first time around.</p>
<p>The focus of this first post is SQL Azure, because I found it the best approach to get the db up and running first. Best see the database working before we start deploying the Umbraco solution, right. (If you were using an embedded database this wouldn't be necessary, but since SQLCE is still in beta and Vistadb is out of the picture SQL Azure is the best option in my opinion).</p>
<p><span style="text-decoration:underline;">Prerequisites:</span><a title="SQL 2008 R2 Express" href="http://www.microsoft.com/express/Database/InstallOptions.aspx" target="_blank"></a></p>
<p><a title="SQL 2008 R2 Express" href="http://www.microsoft.com/express/Database/InstallOptions.aspx" target="_blank">SQL Server 2008</a> - Only needed if you don't already have an SQL Server or SQL Server Express available.
<a title="SQL 2008 R2 Express" href="http://www.microsoft.com/express/Database/InstallOptions.aspx" target="_blank">SQL Management Studio 2008 R2 Express</a> - If you already have an SQL Server installed then you just need to download the SQL Server Management Studio Express (second column), which is needed to connect to SQL Azure among a couple of other things.
Local Internet Information Server (IIS 7.5).
<a title="Umbraco download on codeplex" href="http://umbraco.codeplex.com/releases/view/51165" target="_blank">Umbraco v.4.5.2</a> ASP.NET 3.5.
Windows Azure account with access to Hosted Services and Storage (will be used in next post), and of course access to SQL Azure.</p>
<p><strong>1.)</strong> First thing you want to do is to setup the database server and database instance on SQL Azure. I'm using the new layout on the <a title="Windows Azure Platform" href="https://windows.azure.com/" target="_blank">Windows Azure Platform</a> and I recommend you do the same.
When you login you should see a left column similar to the screenshot below:</p>
<p><a href="http://blog.sitereactor.dk//get/azure/azure-left-column-home.jpg"><img class="aligncenter size-full wp-image-183" title="Azure Platform Left Column" src="/get/azure/azure-left-column-home.jpg" alt="" width="231" height="266" /></a>
The interesting thing here is the Database, so click it and you should see your subscriptions for SQL Azure.
From the top menu click Create Server to setup your Database Server instance. You will need to select a Region for server, and an administrative user and password. Select a region that is close to you (i.e. I have selected North Europe).
The name of the server will be generated for you and the DNS to the server will be servername.database.windows.net.
When the server is up and running you need to configure Firewall Rules, otherwise you will not be able to connect to it from your local machine. So add an IP range that includes your local IP (see example below).</p>
<p><a href="http://blog.sitereactor.dk//get/azure/sqlazure-firewall-rules.jpg"><img class="aligncenter size-thumbnail wp-image-184" title="SQL Azure Firewall Rules" src="/get/azure/sqlazure-firewall-rules.jpg?w=300" alt="" width="300" height="99" /></a>
With database server and firewall setup you can now create a new database, but instead of doing this through the portal we will create a .dacpac and an sql script to create or rather deploy the Umbraco database to SQL Azure. The next steps will take you through the process of creating these two scripts, and finally deploying them to SQL Azure.</p>
<p><strong>2.)</strong> Now that you got SQL Azure setup, you need to make a local installation of Umbraco. This is just a regular installation of Umbraco, so just do what you normally do to setup a site in your IIS.
One very important thing is to do a "clean" installation, which means to let Umbraco run its install script to setup the db, but don't install runway, cws or any other starterkit. Keeping the database clean will make it easier to deploy.</p>
<p>A side note for installing Umbraco with regards to the upcoming post is to install it to IIS' default site. If you have the possibility to do this it will save you from editing a couple of settings when deploying Umbraco, as the Azure Accelerator is set to the default IIS site (but it can of course be changed).</p>
<p><strong>3.)</strong> Third step is to make the local database deployable - this is also step 3 in the 23-step guide on <a title="Installing Umbraco to SQL Azure" href="http://our.umbraco.org/wiki/install-and-setup/how-to-install-umbraco-on-windows-server-2008/installing-umbraco-to-sql-azure" target="_blank">our.umbraco.org</a>. So open up management studio R2 and navigate to the database for your Umbraco install - I have called mine UmbracoAzure.
Expand the database, then Tables and find the table called "umbracoUserLogins", right click and select Design from the menu. In the design view you select the two rows called contextID and userID, right click and select Set Primary Key. Now save the changes to the table and you should be ready for the next step.</p>
<p><a href="http://blog.sitereactor.dk//get/azure/umbracouserlogins.jpg"><img class="aligncenter size-full wp-image-187" title="umbracoUserLogins Design view" src="/get/azure/umbracouserlogins.jpg" alt="" width="364" height="154" /></a></p>
<p><strong>4.)</strong> This step will cover step 4-6 from the 23-step guide. The files that are generated in this step and the next is available for download at the end of this post.
Close the design view, and select your database, right click and navigate to Tasks -> Extra Data-tier Application (if you don't have this option you probably don't have Management Studio R2 Express installed).</p>
<p><a href="http://blog.sitereactor.dk//get/azure/extra-data-tier-application.jpg"><img class="aligncenter size-medium wp-image-188" title="Extra Data-tier Application" src="/get/azure/extra-data-tier-application.jpg?w=300" alt="" width="300" height="211" /></a>A new dialog will appear, which will guide you through the creation of a .dacpac file and an sql script.
Click next and verify Application name (same as database), and make a note of the location in "Save to DAC package file" as we will need this file to deploy the local database to SQL Azure. Click next a couple of times to finish generating the file.</p>
<p><strong>5.)</strong> This step will cover step 7-13 from the 23-step guide.
Once again go back and select the database, right click and select Tasks -> Generate Scripts.</p>
<p><a href="http://blog.sitereactor.dk//get/azure/generate-scripts.jpg"><img class="aligncenter size-medium wp-image-190" title="Generate Scripts" src="/get/azure/generate-scripts.jpg?w=300" alt="" width="300" height="214" /></a>
A new dialog will appear, which will guide you through the creation of an sql script with inserts for the database on SQL Azure.
Click next and change the default radio button selection to "Select specific database objects" and check the Tables checkbox, as you only want to generate a script for the tables. This is an easy step as a default Umbraco database only contains tables.
On the next screen click the Advanced-button and find the row with "Types of data to script" in the new dialog, and change it to Data only. Click OK, note the location of where the file is saved and click next, next and finally finish.</p>
<p><strong>6.)</strong> Now we have the two files needed to deploy the database to SQL Azure, but you need to move a single line the sql script before deploying anything. This is the first gotcha!
Open up your sql file with the data inserts and look at line 29 where the inserts for the umbracoNode table begins. If you look at the values you will notice that the id is ascending -92, -90, -89 etc. but all of them have a parentID, which is -1. The node with id -1 is the umbraco master root, which you need to move up so its the first insert in the umbracoNode table. If you don't you will get various insert errors while deploying, you will be able to login to Umbraco, but if you navigate to the Developer section and expand the DataType folder you will notice that something is missing.
The edited script is available for download at the end of this post (login is: admin and password: b).</p>
<p><strong>7.)</strong> Disconnect from your local database server and connect to SQL Azure using the connection info that you got while setting up the database server in step 1 and 2.</p>
<p><a href="http://blog.sitereactor.dk//get/azure/sql-azure-connection.jpg"><img class="aligncenter size-medium wp-image-191" title="SQL Azure Connection" src="/get/azure/sql-azure-connection.jpg?w=300" alt="" width="300" height="223" /></a>
When you are connected you can simply expand the Databases folder and see your databases if you have created any through the WindowsAzurePlatform portal. The cool thing about the R2 version of SQL Management Studio is that is allows you to connect to SQL Azure as it was just another SQL Server. Microsoft has also created an online management tool that you can use to do a lot of the same stuff as in management studio. You can access this online tool from the WindowsAzurePlatform portal by clicking Manage from the top menu (in the Database section), but I prefer to use management studio. You will need management studio to deploy the .dacpac file, which creates the database with Tables and contraints.</p>
<p>When you are logged into your SQL Azure database server, right click on the server and select "Deploy Data-tier Application" from the menu. This will open up a dialog where you simply select the .dacpac file, which was generated in a previous step, click next a couple of times and when you are done you have a new database with all the tables of a normal Umbraco install. Next step is to insert the default data.</p>
<p><a href="http://blog.sitereactor.dk//get/azure/deploy-data-tier-application.jpg"><img class="aligncenter size-full wp-image-192" title="Deploy Data-tier Application" src="/get/azure/deploy-data-tier-application.jpg" alt="" width="289" height="164" /></a></p>
<p><strong>8.)</strong> From the menu in SQL Management Studio R2 Express click File -> Open -> File and locate the sql file that was previously generated and re-organized. Make sure the newly created database is selected or that the script starts with "Use [DATABASENAME]" and click Execute in the menu (might be an idea to click Parse first to verify there are no errors in the script).
Execute should run without any errors, so if you encounter any errors you best revise the previous steps, delete the database and try again.</p>
<p><a href="http://blog.sitereactor.dk//get/azure/execute-sql-script.jpg"><img class="aligncenter size-full wp-image-193" title="Execute SQL Script" src="/get/azure/execute-sql-script.jpg" alt="" width="310" height="29" /></a></p>
<p><strong>9.)</strong> With the database setup you can now verify that it is in fact working. Go back to your local install of Umbraco and change the connection string in web.config, which should be changed to something like this:</p>
<p><code><add key="umbracoDbDSN" value="Server=tcp:DATABASESERVERNAME.database.windows.net;Database=UmbracoAzure;User ID=USERNAME;Password=PASSWORD;Trusted_Connection=False;Encrypt=True;" /></code></p>
<p>Note: If you can't access the database it might be that you need to review your firewall settings for the SQL Azure database server.</p>
<p>And there you go, now you have deployed a standard Umbraco database to SQL Azure. Next post will go through the deployment of the Umbraco solution.</p>
<p>Package with the two scripts needed to deploy to SQL Azure:
<a href="http://cdn.sitereactor.dk/Files/DeployScripts.zip">Zip contains both the .dacpac and .sql files.</a></p>
<img src="http://blog.sitereactor.dk/via-feed/2011/01/11/umbraco-on-azure-series-sql-azure" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2011%2f01%2f11%2fumbraco-on-azure-series-sql-azure&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2011/01/09/blogging-goal-for-2011Blogging goal for 2011<p>Looking back at 2010 I didn't really blog as much as I wanted to, so I have decided to do at least 12 blog posts in 2011, which are all related to Umbraco. I will probably also be blogging about future meetups in Copenhagen and package releases, but these are not included in the 12 blog posts for 2011. The goal is to write posts that others will find useful or educating in some way. I think of them as posts that would have helped me in developing sites with Umbraco had I read them prior to a given implementation.</p>
<p>So far I have 8 ideas on my todo list, and I'm sure the last 4 will come along by the end of the year. I would be surprised if I don't find anything in relation to Umbraco v5 to write about :)</p>
<p>There is nothing secret about the upcoming stuff, so here is the list and I hope it will awake some interest among other developers - and hopefully not to much impatience ;)</p>
<ol>
<li>Umbraco on Azure Series: SQL Azure</li>
<li>Umbraco on Azure Series: Deploying
to Azure with Accelerator</li>
<li>Autocomplete with jQuery and WCF in
Umbraco (CWS)</li>
<li>Google Analytics with jQuery</li>
<li>Umbraco developer setup (TFS & DDD)</li>
<li>Custom indexing with Umbraco Examine</li>
<li>Using OAuth with Universal Media
Picker</li>
<li>Showing top posts using data from
Google Analytics</li>
</ol>
<p>So stay turned as the first two posts will be published over the next two weeks. As for the others ... they will most likely be published on a monthly basis. I have a package (<em>cough</em> Google Analytics <em>cough</em>) that needs to be updated and released as soon as possible.</p>
<img src="http://blog.sitereactor.dk/via-feed/2011/01/09/blogging-goal-for-2011" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2011%2f01%2f09%2fblogging-goal-for-2011&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2011-01-08T23:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>Looking back at 2010 I didn't really blog as much as I wanted to, so I have decided to do at least 12 blog posts in 2011, which are all related to Umbraco. I will probably also be blogging about future meetups in Copenhagen and package releases, but these are not included in the 12 blog posts for 2011. The goal is to write posts that others will find useful or educating in some way. I think of them as posts that would have helped me in developing sites with Umbraco had I read them prior to a given implementation.</p>
<p>So far I have 8 ideas on my todo list, and I'm sure the last 4 will come along by the end of the year. I would be surprised if I don't find anything in relation to Umbraco v5 to write about :)</p>
<p>There is nothing secret about the upcoming stuff, so here is the list and I hope it will awake some interest among other developers - and hopefully not to much impatience ;)</p>
<ol>
<li>Umbraco on Azure Series: SQL Azure</li>
<li>Umbraco on Azure Series: Deploying
to Azure with Accelerator</li>
<li>Autocomplete with jQuery and WCF in
Umbraco (CWS)</li>
<li>Google Analytics with jQuery</li>
<li>Umbraco developer setup (TFS & DDD)</li>
<li>Custom indexing with Umbraco Examine</li>
<li>Using OAuth with Universal Media
Picker</li>
<li>Showing top posts using data from
Google Analytics</li>
</ol>
<p>So stay turned as the first two posts will be published over the next two weeks. As for the others ... they will most likely be published on a monthly basis. I have a package (<em>cough</em> Google Analytics <em>cough</em>) that needs to be updated and released as soon as possible.</p>
<img src="http://blog.sitereactor.dk/via-feed/2011/01/09/blogging-goal-for-2011" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2011%2f01%2f09%2fblogging-goal-for-2011&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2010/11/03/umbraco-dk-festivalUmbraco DK Festival<p>First off I want to give a big shout-out to Warren Buckley and Adam Shallcross + the rest of the CogWorks for putting together the Umbraco UK Festival in London. What a great event! It was a really interesting and inspirational day of all things Umbraco. Incredible lineup of sessions and a great turn out.</p>
<p>Now its time for the DK Festival in Copenhagen, and even though we won't be able to have two tracks we still have a great lineup! Its really exciting seeing this little festival come to life, and I'm really looking forward to November 19th where the Umbraco DK Festival will take place. I hope to see a lot of Danish Umbracians show up and support the Danish community.</p>
<p>Here is the invitation to the event (in Danish):</p>
<p>Fredag d.19.November er første gang vi afholder en Umbraco Festival i København. Eventet er arrangeret af det danske Community og takket være en række sponsorer vil det være gratis at deltage i dette event. Vi har en række interessante sessions på programmet, en keynote fra Niels Hartvig og en speciel gæst, som vi mener er en tur til København værd.</p>
<p>Eventet finder sted hos 1508, som også lagde lokaler til Umbraco's 5 års fødselsdag.</p>
<p>Jeg ser frem til at se en masse danske Umbracians til dette event :)</p>
<p>It might seem a bit strange that a majority of the information about the event is in English when presentations will all be in Danish, but I wanted the rest of the community (that doesn't speak Danish) to be able to follow along in what we are doing in Denmark, and who knows maybe we will be able to create a bigger event in the future. Maybe a Scandinavian festival :) Or if nothing else inspire other local communities to create their own Umbraco Festival.</p>
<p>We have an official site up and running (courtesy of The CogWorks and Warren Buckley) with information about all the sessions and the venue (@ 1508 A/S) in Copenhagen, so go check it out: www.umbracodkfestival.dk.
A lot of people have already signed up, so if you want to join us for a full day of Umbraco Awesomeness then hurry up and sign-up before its too late. The event ends around 17.00, but there will be socializing afterwards for those that want to stick around and we will probably grab a bit to eat later on and you are more then welcome to join.</p>
<p>And if you live in or aournd Copenhagen or maybe just visiting for the weekend there is a post festival workshop (XSLT Ping Pong fest) taking place the day after the Festival Saturday the 20th of November from 10:00 am. Sign-up via our umbraco: http://our.umbraco.org/events/xslt-ping-pong-fest.</p>
<img src="http://blog.sitereactor.dk/via-feed/2010/11/03/umbraco-dk-festival" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2010%2f11%2f03%2fumbraco-dk-festival&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2010-11-02T23:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>First off I want to give a big shout-out to Warren Buckley and Adam Shallcross + the rest of the CogWorks for putting together the Umbraco UK Festival in London. What a great event! It was a really interesting and inspirational day of all things Umbraco. Incredible lineup of sessions and a great turn out.</p>
<p>Now its time for the DK Festival in Copenhagen, and even though we won't be able to have two tracks we still have a great lineup! Its really exciting seeing this little festival come to life, and I'm really looking forward to November 19th where the Umbraco DK Festival will take place. I hope to see a lot of Danish Umbracians show up and support the Danish community.</p>
<p>Here is the invitation to the event (in Danish):</p>
<p>Fredag d.19.November er første gang vi afholder en Umbraco Festival i København. Eventet er arrangeret af det danske Community og takket være en række sponsorer vil det være gratis at deltage i dette event. Vi har en række interessante sessions på programmet, en keynote fra Niels Hartvig og en speciel gæst, som vi mener er en tur til København værd.</p>
<p>Eventet finder sted hos 1508, som også lagde lokaler til Umbraco's 5 års fødselsdag.</p>
<p>Jeg ser frem til at se en masse danske Umbracians til dette event :)</p>
<p>It might seem a bit strange that a majority of the information about the event is in English when presentations will all be in Danish, but I wanted the rest of the community (that doesn't speak Danish) to be able to follow along in what we are doing in Denmark, and who knows maybe we will be able to create a bigger event in the future. Maybe a Scandinavian festival :) Or if nothing else inspire other local communities to create their own Umbraco Festival.</p>
<p>We have an official site up and running (courtesy of The CogWorks and Warren Buckley) with information about all the sessions and the venue (@ 1508 A/S) in Copenhagen, so go check it out: www.umbracodkfestival.dk.
A lot of people have already signed up, so if you want to join us for a full day of Umbraco Awesomeness then hurry up and sign-up before its too late. The event ends around 17.00, but there will be socializing afterwards for those that want to stick around and we will probably grab a bit to eat later on and you are more then welcome to join.</p>
<p>And if you live in or aournd Copenhagen or maybe just visiting for the weekend there is a post festival workshop (XSLT Ping Pong fest) taking place the day after the Festival Saturday the 20th of November from 10:00 am. Sign-up via our umbraco: http://our.umbraco.org/events/xslt-ping-pong-fest.</p>
<img src="http://blog.sitereactor.dk/via-feed/2010/11/03/umbraco-dk-festival" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2010%2f11%2f03%2fumbraco-dk-festival&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2010/08/16/time-for-another-cph-meetupTime for another CPH meet-up<p>Vacation time is over, so back to work or even better ... Back to Umbraco development.
It has been a couple of months since CG10 and even longer since the last CPH meet up, so I thought it was about time for another Umbraco meet up in Copenhagen.</p>
<p>Agenda for the meet up is open for suggestions, so please feel free to contact me with possible topics. To get us started I have a couple of suggestions for topics of discussion and an idea that I have been playing with during the summer.</p>
<p>Following one of the announcements from CG10: "Umbraco Market", I thought it would be interesting to hear what kind of plugins or extensions you would like to see in there and what your expections are.</p>
<p>Staying on the CG10 theme it might be interesting to hear what the rest of you thought of the CG10 sessions, and for those that didn't attend we can share experiences and knowledge :-) I for one would like to hear from people who had a chance to attend Aaron's Linq2Umbraco session and Christians Xslt session, which I unfortunately didn't get chance to attend.</p>
<p>Finally, during the summer I have been planning an "Umbraco Community Day" with some help from Søren Spelling Lund that I would like to talk with you about as well. It will probably be very similar to the "Umbraco UK Festival" in London, but will of course be held in CPH. So if you aren't planning on going to London we will have an excellent Umbraco event for you here in Denmark later this year.</p>
<p>I hope that you will join me and other Umbracians Thursday in week 38 (the 23rd of September) for another Umbraco meet up in Copenhagen. For now the location will be the Codehouse office in CPH.V. but it might be moved depending on how many want to attend.
Sign-up via our umbraco: http://our.umbraco.org/events/copenhagen-meet-up</p>
<img src="http://blog.sitereactor.dk/via-feed/2010/08/16/time-for-another-cph-meetup" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2010%2f08%2f16%2ftime-for-another-cph-meetup&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2010-08-15T22:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>Vacation time is over, so back to work or even better ... Back to Umbraco development.
It has been a couple of months since CG10 and even longer since the last CPH meet up, so I thought it was about time for another Umbraco meet up in Copenhagen.</p>
<p>Agenda for the meet up is open for suggestions, so please feel free to contact me with possible topics. To get us started I have a couple of suggestions for topics of discussion and an idea that I have been playing with during the summer.</p>
<p>Following one of the announcements from CG10: "Umbraco Market", I thought it would be interesting to hear what kind of plugins or extensions you would like to see in there and what your expections are.</p>
<p>Staying on the CG10 theme it might be interesting to hear what the rest of you thought of the CG10 sessions, and for those that didn't attend we can share experiences and knowledge :-) I for one would like to hear from people who had a chance to attend Aaron's Linq2Umbraco session and Christians Xslt session, which I unfortunately didn't get chance to attend.</p>
<p>Finally, during the summer I have been planning an "Umbraco Community Day" with some help from Søren Spelling Lund that I would like to talk with you about as well. It will probably be very similar to the "Umbraco UK Festival" in London, but will of course be held in CPH. So if you aren't planning on going to London we will have an excellent Umbraco event for you here in Denmark later this year.</p>
<p>I hope that you will join me and other Umbracians Thursday in week 38 (the 23rd of September) for another Umbraco meet up in Copenhagen. For now the location will be the Codehouse office in CPH.V. but it might be moved depending on how many want to attend.
Sign-up via our umbraco: http://our.umbraco.org/events/copenhagen-meet-up</p>
<img src="http://blog.sitereactor.dk/via-feed/2010/08/16/time-for-another-cph-meetup" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2010%2f08%2f16%2ftime-for-another-cph-meetup&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2010/07/09/umbraco-community-projectUmbraco Community Project<p>Codename: Get everybody a "High Five" t-shirt</p>
<p>One of the big highlights of this years Codegarden was the speech by <a title="Cheif Happiness Officer" href="http://positivesharing.com" target="_blank">Cheif Happiness Officer</a> <a title="Alexander on Twitter" href="http://twitter.com/alexkjerulf" target="_blank">Alexander Kjerulf</a> about happiness at work. He really got everybody pumped for the conference (or festival) and it really set the mood for the remaining days. There was literally "High Fives" and people shouting "Your Rock!" throughout the venue (and now on twitter #h5yr).
I hope that the speech was taped, so everybody who was there gets a chance to relive this great start of Codegarden - and that all those who wasn't able to attend this years Codegarden also gets a chance to experience the buzz.</p>
<p>Personally, I think that the "High Five, You Rock" term is a really great way of saying that various contributions are really appreciated. And it seems that people in the community keep using the term both on the forums and on twitter.
Not surprisingly, because the Umbraco community really does Rock!</p>
<p>So feeding of the buzz from Alexanders speech I thought it would be a good idea to come up with something to maintain the "high fives" and the "you rock!" among the people of the community. And is there a better way then putting it on a t-shirt? I don't think so.. :-)</p>
<p>I pitched the idea to <a href="http://twitter.com/warrenbuckley" target="_blank">Warren Buckley</a>, who then got me in contact with the designer behind the MVPs CG10 notebook. The designer, <a href="http://twitter.com/uberkraaft" target="_blank">Matt Williams</a>, did a really great job on the artwork for the notebooks and also did a really great job on designing artwork for an Umbraco community t-shirt.</p>
<p>I'm happy to present the "High Five, We Rock" Umbraco community t-shirt design:</p>
<p style="text-align: center;"><a href="http://blog.sitereactor.dk/files/highfive-tee-sample.png"><img title="High Five, We Rock Communit t-shirt" src="http://blog.sitereactor.dk/files/umbracotee_final-minimized.png" alt="" width="111" height="150" /></a></p>
<p>The idea with the t-shirt design is that it is freely available for everybody to use - get it printed on a t-shirt, coffee mug, mousepad or whatever you like (read the terms below). But first and foremost I have reached out to different people who organizes Umbraco meet-ups to hear if they would be able to find a sponsor, who want to pay for the expenses in getting t-shirts for the attendees. This has already been very positive!</p>
<p><a href="http://twitter.com/ashallcross01" target="_blank">Adam Shallcross</a> from <a href="http://www.thecogworks.co.uk" target="_blank">Cogworks</a> will sponsor High Five t-shirts for the next London meet-up.
<a href="http://twitter.com/netaddicts" target="_blank">Dirk De Grave</a> (Umbraco MVP) from <a href="http://promex.be">Promex</a> will find a sponsor for the next Belgium meet-up.
I am in the process of finding a sponsor for the next Copenhagen meet-up, and <a href="http://twitter.com/leekelleher" target="_blank">Lee Kelleher</a> (Umbraco MVP) is also trying to find a sponsor for the upcoming <a title="South West UK Meet-up" href="http://our.umbraco.org/events/umbraco-south-west-uk-user-meetup-%28july-2010%29" target="_blank">South West</a> meet-up.</p>
<p>So get yourself to one of the upcoming meet-ups, and you might just get a cool "High Five, We Rock" Umbraco Community t-shirt.</p>
<p>If you arrange meet-ups or usergroups in your local region, please feel free to use the design to get yourself and your local community some "High Five, We Rock" t-shirts. If you work for a company that does Umbraco solutions nag your boss to get you and your colleagues some cool t-shirts ;-)</p>
<p>The most important thing is to spread the word that the Umbraco Community Rocks! (and great way of doing this is with a t-shirt and a message)</p>
<p>Download the design for Print in <a href="http://www.sitereactor.dk/files/umbracotee_Final-EPS.zip">EPS</a>, <a href="http://www.sitereactor.dk/files/umbracotee_Final-PSD.zip">PSD</a>, <a href="http://www.sitereactor.dk/files/UmbracoTee-PDF.zip">PDF</a> or <a href="http://www.sitereactor.dk/files/UmbracoTee-PNG.zip">PNG</a>. There is also a <a href="http://www.sitereactor.dk/files/Umbraco_Tee_positional.pdf">PDF with positioning</a> that you can give the printing service. Optimal size of printed design is 38cm in height.</p>
<p>I have also created some wallpapers to shine up your workstation:
<a href="http://www.sitereactor.dk/files/1920x1080-HighFive.jpg">1920x1080</a>, <a href="http://www.sitereactor.dk/files/1680x1050-HighFive.jpg">1680x1050</a>, <a href="http://www.sitereactor.dk/files/1280x1024-HighFive.jpg">1280x1024</a>, <a href="http://www.sitereactor.dk/files/1280x720-HighFive.jpg">1280x720</a> and for iPhone 320x480 <a href="http://www.sitereactor.dk/files/320x480-HighFive.jpg">JPG</a> or <a href="http://www.sitereactor.dk/files/320x480-HighFive.png">PNG</a> and 640x960 <a href="http://www.sitereactor.dk/files/640x960-HighFive.jpg">JPG</a> or <a href="http://www.sitereactor.dk/files/640x960-HighFive.png">PNG</a>.</p>
<p>Terms of use:
You are free to use the design for print on t-shirts, hoodies, coffee mugs or whatever you want to print it on. But you are not allowed to change the design from its original state in the files supplied above, and you are not allowed to resell merchandise or clothes with the design.</p>
<img src="http://blog.sitereactor.dk/via-feed/2010/07/09/umbraco-community-project" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2010%2f07%2f09%2fumbraco-community-project&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2010-07-08T00:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>Codename: Get everybody a "High Five" t-shirt</p>
<p>One of the big highlights of this years Codegarden was the speech by <a title="Cheif Happiness Officer" href="http://positivesharing.com" target="_blank">Cheif Happiness Officer</a> <a title="Alexander on Twitter" href="http://twitter.com/alexkjerulf" target="_blank">Alexander Kjerulf</a> about happiness at work. He really got everybody pumped for the conference (or festival) and it really set the mood for the remaining days. There was literally "High Fives" and people shouting "Your Rock!" throughout the venue (and now on twitter #h5yr).
I hope that the speech was taped, so everybody who was there gets a chance to relive this great start of Codegarden - and that all those who wasn't able to attend this years Codegarden also gets a chance to experience the buzz.</p>
<p>Personally, I think that the "High Five, You Rock" term is a really great way of saying that various contributions are really appreciated. And it seems that people in the community keep using the term both on the forums and on twitter.
Not surprisingly, because the Umbraco community really does Rock!</p>
<p>So feeding of the buzz from Alexanders speech I thought it would be a good idea to come up with something to maintain the "high fives" and the "you rock!" among the people of the community. And is there a better way then putting it on a t-shirt? I don't think so.. :-)</p>
<p>I pitched the idea to <a href="http://twitter.com/warrenbuckley" target="_blank">Warren Buckley</a>, who then got me in contact with the designer behind the MVPs CG10 notebook. The designer, <a href="http://twitter.com/uberkraaft" target="_blank">Matt Williams</a>, did a really great job on the artwork for the notebooks and also did a really great job on designing artwork for an Umbraco community t-shirt.</p>
<p>I'm happy to present the "High Five, We Rock" Umbraco community t-shirt design:</p>
<p style="text-align: center;"><a href="http://blog.sitereactor.dk/files/highfive-tee-sample.png"><img title="High Five, We Rock Communit t-shirt" src="http://blog.sitereactor.dk/files/umbracotee_final-minimized.png" alt="" width="111" height="150" /></a></p>
<p>The idea with the t-shirt design is that it is freely available for everybody to use - get it printed on a t-shirt, coffee mug, mousepad or whatever you like (read the terms below). But first and foremost I have reached out to different people who organizes Umbraco meet-ups to hear if they would be able to find a sponsor, who want to pay for the expenses in getting t-shirts for the attendees. This has already been very positive!</p>
<p><a href="http://twitter.com/ashallcross01" target="_blank">Adam Shallcross</a> from <a href="http://www.thecogworks.co.uk" target="_blank">Cogworks</a> will sponsor High Five t-shirts for the next London meet-up.
<a href="http://twitter.com/netaddicts" target="_blank">Dirk De Grave</a> (Umbraco MVP) from <a href="http://promex.be">Promex</a> will find a sponsor for the next Belgium meet-up.
I am in the process of finding a sponsor for the next Copenhagen meet-up, and <a href="http://twitter.com/leekelleher" target="_blank">Lee Kelleher</a> (Umbraco MVP) is also trying to find a sponsor for the upcoming <a title="South West UK Meet-up" href="http://our.umbraco.org/events/umbraco-south-west-uk-user-meetup-%28july-2010%29" target="_blank">South West</a> meet-up.</p>
<p>So get yourself to one of the upcoming meet-ups, and you might just get a cool "High Five, We Rock" Umbraco Community t-shirt.</p>
<p>If you arrange meet-ups or usergroups in your local region, please feel free to use the design to get yourself and your local community some "High Five, We Rock" t-shirts. If you work for a company that does Umbraco solutions nag your boss to get you and your colleagues some cool t-shirts ;-)</p>
<p>The most important thing is to spread the word that the Umbraco Community Rocks! (and great way of doing this is with a t-shirt and a message)</p>
<p>Download the design for Print in <a href="http://www.sitereactor.dk/files/umbracotee_Final-EPS.zip">EPS</a>, <a href="http://www.sitereactor.dk/files/umbracotee_Final-PSD.zip">PSD</a>, <a href="http://www.sitereactor.dk/files/UmbracoTee-PDF.zip">PDF</a> or <a href="http://www.sitereactor.dk/files/UmbracoTee-PNG.zip">PNG</a>. There is also a <a href="http://www.sitereactor.dk/files/Umbraco_Tee_positional.pdf">PDF with positioning</a> that you can give the printing service. Optimal size of printed design is 38cm in height.</p>
<p>I have also created some wallpapers to shine up your workstation:
<a href="http://www.sitereactor.dk/files/1920x1080-HighFive.jpg">1920x1080</a>, <a href="http://www.sitereactor.dk/files/1680x1050-HighFive.jpg">1680x1050</a>, <a href="http://www.sitereactor.dk/files/1280x1024-HighFive.jpg">1280x1024</a>, <a href="http://www.sitereactor.dk/files/1280x720-HighFive.jpg">1280x720</a> and for iPhone 320x480 <a href="http://www.sitereactor.dk/files/320x480-HighFive.jpg">JPG</a> or <a href="http://www.sitereactor.dk/files/320x480-HighFive.png">PNG</a> and 640x960 <a href="http://www.sitereactor.dk/files/640x960-HighFive.jpg">JPG</a> or <a href="http://www.sitereactor.dk/files/640x960-HighFive.png">PNG</a>.</p>
<p>Terms of use:
You are free to use the design for print on t-shirts, hoodies, coffee mugs or whatever you want to print it on. But you are not allowed to change the design from its original state in the files supplied above, and you are not allowed to resell merchandise or clothes with the design.</p>
<img src="http://blog.sitereactor.dk/via-feed/2010/07/09/umbraco-community-project" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2010%2f07%2f09%2fumbraco-community-project&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2010/04/18/cg10-transport-and-hotel-guideCG10: Transport and hotel guide<p>This post is a bit off-topic from my usual blog posts, but I thought I'd write up this post to help CG10-attendees who are coming to Denmark for the first time or those who have been here before and would like some insights into public transportation in CPH.
There has been a lot of buzz on twitter about which hotels to choose and where to stay, and while I have been living in CPH all my life I have never stayed at a hotel here so I won't be able to tell you which hotels are really good, but I do know which areas of the City are nice and common prices.
I won't go into to much detail about each hotel, but simply focus on which part of the City they are located in and how to get to the CodeGarden10-venue from there. I have selected the hotels that I have seen mentioned on twitter, so if you have been looking at a hotel which is not mentioned below feel free to add a comment and I can supply a couple of notes on how to get to CG10, which is the most important ;)</p>
<p>First off, when staying in Copenhagen you should take advantage of the public transportation which is pretty easy to come by. There is always a bus, train or metro going to where you wanna go (CG10).
Copenhagen is divided into zones, and when you buy a ticket you should buy for the number of zones you are traveling within (which can never be below two). The center of the City is Zone 1, and the other parts of (greater) Copenhagen is Zone 2 or Zone 3 (airport is Zone 4).
So this means that if you are staying in Copenhagen and going to the CG10 venue (which is located in the City of Frederiksberg - Frederiksberg is surrounded by Copenhagen) you should buy a ticket for 2 zones - Price DKK 23. If you want to take the metro, train or bus from the Airport (Kastrup / CPH Airport) to the center of the City or the other way around you should buy a ticket for 3 zones - Price DKK 34,50. Remember that when you buy a ticket you can use it for an hour in both the metro, train and bus - one ticket to rule them all.
You will probably be going by public transportation 2 times each day for maybe 3 days, so you might as well buy a 10-trip card ("Klippekort" in Danish). This card costs DKK 135, its blue and is for 2 zones and can be bought at train stations, in the bus or in some kiosks.
A taxi from the center of Copenhagen to the venue would probably run you around DKK 100.</p>
<p>And now to the hotels:</p>
<p><strong>Kong Arthur</strong>
As you might have heard this is where a majority of the hip Umbraco crowd is staying: HQ, Core Team and MVPs.
This hotel is located north of the center Copenhagen with a nice view of the lakes (the old entrance to Copenhagen - not sure if you would call it a 'moat').
If you are staying here you are only 400 meters from Nørreport metro, train and bus station. I would recommend you take the metro (direction: "Vanløse") to the station called "Fasanvej", which is only 3 stops after you got on at Nørreport. When you get off at "Fasanvej"-station you walk in the direction that the metro is leaving, and when you come up to the road you go right and walk about 4-5 min. to traffic light number two and then turn left. Walk a couple of minutes and you should start to feel the CG10 buzz :)
<span style="text-decoration:underline;">Prices</span>: As far as I can tell the prices range from DKK 800-1300/night during CodeGarden 10. I'm not sure whether the discount that Niels tweeted about is still valid, but as far as I remember it was 10% off/night.
Check out the website: <a title="Kong Arthur" href="http://www.kongarthur.dk/uk-index.php">www.kongarthur.dk</a> (website in english).
<span style="text-decoration:underline;">Airport:</span> When arriving you can take the metro from the airport to Nørreport station.</p>
<p><strong>Wakeup Copenhagen</strong>
This is a brand new hotel, and was I actually surprised to see how cheap it is. For a hotel in central Copenhagen you probably won't find it cheaper (unless you don't mind junkies in front of the hotel :-P ).
This hotel is located a few minutes from the center (the center being the Copenhagen town hall / city square), and also just a few minutes from Copenhagens Central Train station. If you are staying here you are about a 10 min walk from the central station and <a title="Tivoli Gardens website in english" href="http://www.tivoli.dk/composite-3351.htm" target="_blank">Tivoli Gardens</a>. So this would also be a nice choice if you are bringing the family, as you are 3 min from an outdoor harbour swimming pool, 3 min from a shopping center with Cinemas and about 10 min from the City center and a serious shopping spree.
When going to the CG10 venue, I would recommend that you walk to the central station, go to track 9-10 and take any train to Nørreport station (thats the second stop after the central station). You get off at Nørreport and go down and take the metro to "Fasanvej"-station (direction: "Vanløse") - same as above.
<span style="text-decoration:underline;">Prices</span>: As far as I can tell from the website the prices starts at DKK 365, and I guess thats only for online booking. Go check it out: <a title="Wakeup Copenhagen" href="http://www.wakeupcopenhagen.com" target="_blank">www.wakeupcopenhagen.com</a> (website in english).
<span style="text-decoration:underline;">Airport</span>: When arriving you can take the train or bus (250S) to the central station.</p>
<p><strong>Hotel Cabinn</strong>
This is another cheap hotel. I don't know much about it other then its considered to be cheap, and its a chain that has multiple hotels around the City. Two of them are located in Frederiksberg and are very close to a metro station, and actually located on the other side of the Copenhagen lakes then the Kong Arthur hotel although you probably won't be able to see it from there. If you stay at one of the Cabinn hotels located in Frederiksberg you should be about 300 meters from the metro station called "Forum", which is only two stops from "Fasanvej"-station. So I think you could get from the hotel to the CG10 venue in 15-20 min. Like with the other two hotels above the direction of the metro should say "Vanløse", and the station you should get of at is "Fasanvej".
<span style="text-decoration:underline;">Prices</span>: Starts at DKK 485/night
<span style="text-decoration:underline;">Airport</span>: You can simply take the metro from the Airport to "Forum"-station if you decide to stay in the City of Frederiksberg.
<span style="text-decoration:underline;">Locations</span>: In the city of Frederiksberg you have two options: the one on Vodroffsvej 55 (which is closest to the city) or the one on Danasvej 32 (which is closest to the metro). In the city center you have the one on Mitchellsgade 14, which is right behind Tivoli Gardens and very close to Wakeup Copenhagen and the central station. Other then that its right next to the main offices of the Danish police, so I would be very surprised if you were robbed outside the hotel :-P
Check out the website: <a title="Hotel Cabinn" href="http://www.cabinn.com/english/index.html" target="_blank">www.cabinn.com</a> (in english).</p>
<p>Other things:
Yes, I wouldn't really recommend the hotels that are on the opposite side of the central station from the Tivoli Gardens. The streets called Istedgade, Reventlowsgade, Colbjørnsensgade and Helgolandsgade are packed with hotels, but it isn't really the nicest part of Copenhagen (to put it nicely). I have friends who have lived nearby, so its not because its a ghetto, crackhouse or anything like that. But I wouldn't want to stay there myself, as its THE place to be if you are a junkie or prostitute.</p>
<p><strong><span style="text-decoration:underline;">Useful links:</span></strong>
Metro: <a href="http://intl.m.dk/">www.m.dk</a>
CPH Airport: <a href="http://cph.dk">www.cph.dk</a>
Movia - bus information for tourist: <a href="http://www.moviatrafik.dk/Service/Tourist/Pages/Tourist.aspx">www.movia.dk</a>
Wonderful Copenhagen - tourist information: <a href="http://www.visitcopenhagen.dk/" target="_blank">www.visitcopenhagen.dk</a></p>
<p><a href="http://tinyurl.com/y2p2qta" target="_blank">Lonely Planet Copenhagen City Guide</a> for iPhone as tweeted by <a title="@bramloquet" href="http://twitter.com/bramloquet" target="_blank">Bram Loquet</a></p>
<p>I think that was about it. Hope you find the information in this post useful.
If you want to see another hotel on the list, drop me a comment and I will add some transport information. Just remember that I really don't know anything about the hotels, but rather how to get to the CG10 venue ;)</p>
<img src="http://blog.sitereactor.dk/via-feed/2010/04/18/cg10-transport-and-hotel-guide" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2010%2f04%2f18%2fcg10-transport-and-hotel-guide&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2010-04-17T22:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>This post is a bit off-topic from my usual blog posts, but I thought I'd write up this post to help CG10-attendees who are coming to Denmark for the first time or those who have been here before and would like some insights into public transportation in CPH.
There has been a lot of buzz on twitter about which hotels to choose and where to stay, and while I have been living in CPH all my life I have never stayed at a hotel here so I won't be able to tell you which hotels are really good, but I do know which areas of the City are nice and common prices.
I won't go into to much detail about each hotel, but simply focus on which part of the City they are located in and how to get to the CodeGarden10-venue from there. I have selected the hotels that I have seen mentioned on twitter, so if you have been looking at a hotel which is not mentioned below feel free to add a comment and I can supply a couple of notes on how to get to CG10, which is the most important ;)</p>
<p>First off, when staying in Copenhagen you should take advantage of the public transportation which is pretty easy to come by. There is always a bus, train or metro going to where you wanna go (CG10).
Copenhagen is divided into zones, and when you buy a ticket you should buy for the number of zones you are traveling within (which can never be below two). The center of the City is Zone 1, and the other parts of (greater) Copenhagen is Zone 2 or Zone 3 (airport is Zone 4).
So this means that if you are staying in Copenhagen and going to the CG10 venue (which is located in the City of Frederiksberg - Frederiksberg is surrounded by Copenhagen) you should buy a ticket for 2 zones - Price DKK 23. If you want to take the metro, train or bus from the Airport (Kastrup / CPH Airport) to the center of the City or the other way around you should buy a ticket for 3 zones - Price DKK 34,50. Remember that when you buy a ticket you can use it for an hour in both the metro, train and bus - one ticket to rule them all.
You will probably be going by public transportation 2 times each day for maybe 3 days, so you might as well buy a 10-trip card ("Klippekort" in Danish). This card costs DKK 135, its blue and is for 2 zones and can be bought at train stations, in the bus or in some kiosks.
A taxi from the center of Copenhagen to the venue would probably run you around DKK 100.</p>
<p>And now to the hotels:</p>
<p><strong>Kong Arthur</strong>
As you might have heard this is where a majority of the hip Umbraco crowd is staying: HQ, Core Team and MVPs.
This hotel is located north of the center Copenhagen with a nice view of the lakes (the old entrance to Copenhagen - not sure if you would call it a 'moat').
If you are staying here you are only 400 meters from Nørreport metro, train and bus station. I would recommend you take the metro (direction: "Vanløse") to the station called "Fasanvej", which is only 3 stops after you got on at Nørreport. When you get off at "Fasanvej"-station you walk in the direction that the metro is leaving, and when you come up to the road you go right and walk about 4-5 min. to traffic light number two and then turn left. Walk a couple of minutes and you should start to feel the CG10 buzz :)
<span style="text-decoration:underline;">Prices</span>: As far as I can tell the prices range from DKK 800-1300/night during CodeGarden 10. I'm not sure whether the discount that Niels tweeted about is still valid, but as far as I remember it was 10% off/night.
Check out the website: <a title="Kong Arthur" href="http://www.kongarthur.dk/uk-index.php">www.kongarthur.dk</a> (website in english).
<span style="text-decoration:underline;">Airport:</span> When arriving you can take the metro from the airport to Nørreport station.</p>
<p><strong>Wakeup Copenhagen</strong>
This is a brand new hotel, and was I actually surprised to see how cheap it is. For a hotel in central Copenhagen you probably won't find it cheaper (unless you don't mind junkies in front of the hotel :-P ).
This hotel is located a few minutes from the center (the center being the Copenhagen town hall / city square), and also just a few minutes from Copenhagens Central Train station. If you are staying here you are about a 10 min walk from the central station and <a title="Tivoli Gardens website in english" href="http://www.tivoli.dk/composite-3351.htm" target="_blank">Tivoli Gardens</a>. So this would also be a nice choice if you are bringing the family, as you are 3 min from an outdoor harbour swimming pool, 3 min from a shopping center with Cinemas and about 10 min from the City center and a serious shopping spree.
When going to the CG10 venue, I would recommend that you walk to the central station, go to track 9-10 and take any train to Nørreport station (thats the second stop after the central station). You get off at Nørreport and go down and take the metro to "Fasanvej"-station (direction: "Vanløse") - same as above.
<span style="text-decoration:underline;">Prices</span>: As far as I can tell from the website the prices starts at DKK 365, and I guess thats only for online booking. Go check it out: <a title="Wakeup Copenhagen" href="http://www.wakeupcopenhagen.com" target="_blank">www.wakeupcopenhagen.com</a> (website in english).
<span style="text-decoration:underline;">Airport</span>: When arriving you can take the train or bus (250S) to the central station.</p>
<p><strong>Hotel Cabinn</strong>
This is another cheap hotel. I don't know much about it other then its considered to be cheap, and its a chain that has multiple hotels around the City. Two of them are located in Frederiksberg and are very close to a metro station, and actually located on the other side of the Copenhagen lakes then the Kong Arthur hotel although you probably won't be able to see it from there. If you stay at one of the Cabinn hotels located in Frederiksberg you should be about 300 meters from the metro station called "Forum", which is only two stops from "Fasanvej"-station. So I think you could get from the hotel to the CG10 venue in 15-20 min. Like with the other two hotels above the direction of the metro should say "Vanløse", and the station you should get of at is "Fasanvej".
<span style="text-decoration:underline;">Prices</span>: Starts at DKK 485/night
<span style="text-decoration:underline;">Airport</span>: You can simply take the metro from the Airport to "Forum"-station if you decide to stay in the City of Frederiksberg.
<span style="text-decoration:underline;">Locations</span>: In the city of Frederiksberg you have two options: the one on Vodroffsvej 55 (which is closest to the city) or the one on Danasvej 32 (which is closest to the metro). In the city center you have the one on Mitchellsgade 14, which is right behind Tivoli Gardens and very close to Wakeup Copenhagen and the central station. Other then that its right next to the main offices of the Danish police, so I would be very surprised if you were robbed outside the hotel :-P
Check out the website: <a title="Hotel Cabinn" href="http://www.cabinn.com/english/index.html" target="_blank">www.cabinn.com</a> (in english).</p>
<p>Other things:
Yes, I wouldn't really recommend the hotels that are on the opposite side of the central station from the Tivoli Gardens. The streets called Istedgade, Reventlowsgade, Colbjørnsensgade and Helgolandsgade are packed with hotels, but it isn't really the nicest part of Copenhagen (to put it nicely). I have friends who have lived nearby, so its not because its a ghetto, crackhouse or anything like that. But I wouldn't want to stay there myself, as its THE place to be if you are a junkie or prostitute.</p>
<p><strong><span style="text-decoration:underline;">Useful links:</span></strong>
Metro: <a href="http://intl.m.dk/">www.m.dk</a>
CPH Airport: <a href="http://cph.dk">www.cph.dk</a>
Movia - bus information for tourist: <a href="http://www.moviatrafik.dk/Service/Tourist/Pages/Tourist.aspx">www.movia.dk</a>
Wonderful Copenhagen - tourist information: <a href="http://www.visitcopenhagen.dk/" target="_blank">www.visitcopenhagen.dk</a></p>
<p><a href="http://tinyurl.com/y2p2qta" target="_blank">Lonely Planet Copenhagen City Guide</a> for iPhone as tweeted by <a title="@bramloquet" href="http://twitter.com/bramloquet" target="_blank">Bram Loquet</a></p>
<p>I think that was about it. Hope you find the information in this post useful.
If you want to see another hotel on the list, drop me a comment and I will add some transport information. Just remember that I really don't know anything about the hotels, but rather how to get to the CG10 venue ;)</p>
<img src="http://blog.sitereactor.dk/via-feed/2010/04/18/cg10-transport-and-hotel-guide" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2010%2f04%2f18%2fcg10-transport-and-hotel-guide&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2010/04/13/umbraco-meetup-in-cphUmbraco meetup in CPH<p>Yes, it's time for an Umbraco meet-up in CPH!
It seems that the Umbraco community is more on fire now then ever before, and the UK gang is setting the bar high for community meet-ups (one day I'll have to stop by and drink a beer with you guys). The danish community is however a bit more quite or just too busy making excellent solutions for an ever growing install base. So now is the time for the danish Umbraco cell to become a bit more active :-)
I haven't seen or heard of a meet-up in CPH aside from the feb 16. event and CG09 and the upcoming CG10, so here it is.</p>
<p>On May the 3rd we will meet up for a preliminary Umbraco meet-up. The agenda is still a work in progress, but I have been brainstorming with <a title="Jespers twitter profile" href="http://www.twitter.com/jesperordrup" target="_blank">Jesper Ordrup</a> and here is what we have come up with:</p>
<ul>
<li>First order of business: What do you expect from an Umbraco meet-up, and what you like to see happen at future meet-ups</li>
<li>Umbraco interest group</li>
<li>The need for workshops - skills needed for Umbraco 5 or other things umbraco</li>
</ul>
<p>Suggestions are more then welcome, so send me your thoughts via <a title="sitereactor on twitter" href="http://twitter.com/sitereactor" target="_blank">twitter</a> or email: mc@sitereactor.dk</p>
<p>The meet-up will take place at Codehouse, which is located on Amerikavej 15b, 1.floor, 1756 Copenhagen V. from 16.00hs to whenever the last man leaves, which will probably be me since I have to lock up.</p>
<p>Codehouse will sponsor drinks and sandwiches, so please let me know if you are coming - sign-up on <a title="Event sign-up at our umbraco" href="http://our.umbraco.org/events/cph-meet-up" target="_blank">our.umbraco.org/events</a></p>
<p>I hope to see you there</p>
<img src="http://blog.sitereactor.dk/via-feed/2010/04/13/umbraco-meetup-in-cph" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2010%2f04%2f13%2fumbraco-meetup-in-cph&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2010-04-12T22:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>Yes, it's time for an Umbraco meet-up in CPH!
It seems that the Umbraco community is more on fire now then ever before, and the UK gang is setting the bar high for community meet-ups (one day I'll have to stop by and drink a beer with you guys). The danish community is however a bit more quite or just too busy making excellent solutions for an ever growing install base. So now is the time for the danish Umbraco cell to become a bit more active :-)
I haven't seen or heard of a meet-up in CPH aside from the feb 16. event and CG09 and the upcoming CG10, so here it is.</p>
<p>On May the 3rd we will meet up for a preliminary Umbraco meet-up. The agenda is still a work in progress, but I have been brainstorming with <a title="Jespers twitter profile" href="http://www.twitter.com/jesperordrup" target="_blank">Jesper Ordrup</a> and here is what we have come up with:</p>
<ul>
<li>First order of business: What do you expect from an Umbraco meet-up, and what you like to see happen at future meet-ups</li>
<li>Umbraco interest group</li>
<li>The need for workshops - skills needed for Umbraco 5 or other things umbraco</li>
</ul>
<p>Suggestions are more then welcome, so send me your thoughts via <a title="sitereactor on twitter" href="http://twitter.com/sitereactor" target="_blank">twitter</a> or email: mc@sitereactor.dk</p>
<p>The meet-up will take place at Codehouse, which is located on Amerikavej 15b, 1.floor, 1756 Copenhagen V. from 16.00hs to whenever the last man leaves, which will probably be me since I have to lock up.</p>
<p>Codehouse will sponsor drinks and sandwiches, so please let me know if you are coming - sign-up on <a title="Event sign-up at our umbraco" href="http://our.umbraco.org/events/cph-meet-up" target="_blank">our.umbraco.org/events</a></p>
<p>I hope to see you there</p>
<img src="http://blog.sitereactor.dk/via-feed/2010/04/13/umbraco-meetup-in-cph" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2010%2f04%2f13%2fumbraco-meetup-in-cph&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2010/03/14/google-analytics-for-umbraco-package-updateGoogle Analytics for Umbraco (package update)<p>I thought it was about time to blog about the latest version of my Google Analytics package for Umbraco, here, a couple of weeks after it has been released on <a title="Package download on our.umbraco.org" href="http://our.umbraco.org/projects/google-analytics-for-umbraco" target="_blank">our.umbraco.org</a>.</p>
<p>It seems I haven't blogged since august 2009, so excuse me if I'm a bit rusty.</p>
<p>Let me take a stroll down memory lane to CodeGarde'09 when the package was first showcased and actually won the prize for best package, which I'm clearly very proud off. I have been getting very good feedback ever since, and this has really motivated me to make the package even greater.
First release included some basic reports that you would also find in Google Analytics when logging in and clicking the main sections (Dashboard, Visitors, Traffic Sources, Content and Goals), and the charts was made using the Google Chart API - so Google all the way :-) It covered a basic need to view basic statistics within Umbraco, but wasn't really all that flexible.</p>
<p>After CodeGarden'09 I started the initial work to rewrite the package to make it more flexible and enable the ability to create custom reports, which had been a goal of mine since day one or two. Okay, maybe not from the first couple of days, as my first goal was to create a simple statistics section in Umbraco while learning how to create a custom section, which I had never done before. Version 1 of the package was very much a learning process for me. So after having gone through the learning process of version 1 I was ready to pursue my second goal: Create a killer Google Analytics package.</p>
<p>To fulfill my second goal I would have to implement the following features:</p>
<ul>
<li>Custom Reports</li>
<li>Flash Charts</li>
<li>Umbraco DataType</li>
</ul>
<p>These features seemed somewhat simple at the time, but turned out to be very time consuming to make.
Creating custom reports based on 47 predefined Metrics and 65 predefined Dimensions makes up for a s**t load of combinations, so I had to come up with a way to calculate the results as a single integer, an average, a percentage and time. I think I have tested something like 90% of the reports, which are available through Google Analytics by default and it seems that my model works (so far anyway - I dread multi-series reports).</p>
<p>Next feature was the Flash charts. Flash charts are simply more flashy then static images, so I chose to go with <a title="Fusion Charts Free" href="http://www.fusioncharts.com/free/" target="_blank">Fusion Charts Free</a> for the implementation because 1.they are free and open source, 2.they are super nice and 3.there is an impressive amount of charts available to work with. So far I have only implemented the Single Line chart, 2D & 3D Pie chart and Bar chart, but hope to implement more. Luckily it will be easy to add more charts, as I have created a C# wrapper for the properties that make up the Flash object.
I have kept the Google Chart API implementation for the summary charts, but also implemented as objects in my model.</p>
<p>The Data Type was one of the most requested features in the package forums on <a title="Package download on our.umbraco.org" href="http://our.umbraco.org/projects/google-analytics-for-umbraco" target="_blank">our.umbraco.org</a>, so clearly I wanted to implement this as well and it is a very cool feature to have. I would love to be able to add a statistics-tab to my Document Types and see how many pageviews, visits etc. my content got.</p>
<p>With the main features down the only hurdle to overcome was the time factor. I originally thought I would be able to post an update in August 2009, but didn't have enough time so maybe October was more realistic, but no. I kept pushing the release because I didn't have enough time to dedicate to the project, and only worked on it from time to time during weekends.
The new year came and I had got a lot of work done, and when the feb16 birthday event was announced it was great opportunity to prep a release. The implementation of the different charts was done, and ability to create custom reports was also ready. Only some small features was still needing some polish, and the Data Type.
I thought to myself that I must release this package (give the people what they want) very soon, so I set a deadline for February 26. for release of the reworked package.</p>
<p>For the feb16 birthday event I demoed the new and hugely improved package in Copenhagen, which seemed to go okay. The crowd was really really quite, but I'm hoping it was because they were speechless :-)
I announced that the package would be released on <a title="Package download on our.umbraco.org" href="http://our.umbraco.org/projects/google-analytics-for-umbraco" target="_blank">our.umbraco.org</a> on feb 26. so the heat was on. The following 10 days I coded like a crazy to make my deadline, and I started creating teasers for the package to rise awareness and to further pressure myself.</p>
<p>Version 1.0.6 was released on feb.26th. and was very well received. The installer was updated a couple of days later, so <strong>current version is 1.0.7</strong>.</p>
<p>Current features include:</p>
<ul>
<li>32 Standard Reports</li>
<li>Custom Reports</li>
<li>Data Type (choose any report)</li>
<li>Switch between multiple profiles for accounts available through credentials (google account)</li>
<li>Flash Charts based on Fusion Chart Free (Single line-, 2D & 3D Pie- and Bar charts)</li>
<li>Static Charts for summary views (based on Google Charts API)</li>
<li>Tables for viewing things like Content by Visits, Browser types, version etc.</li>
<li>Sorting of reports (Umbraco tree)</li>
<li>Sorting of charts within a report</li>
<li>Editing of existing charts within a report</li>
<li>Delete charts from a report</li>
<li>Delete reports</li>
<li>Change icons for reports in tree</li>
</ul>
<p>Here are links to the 10 teasers, which I created during the last 10 days of development:</p>
<p><strong>Installing the Package</strong>: <a rel="nofollow" href="http://screenr.com/EHh">http://screenr.com/EHh</a><br/>
<strong>Accounts & Profiles</strong>: <a rel="nofollow" href="http://screenr.com/3jx">http://screenr.com/3jx</a><br/>
<strong>Editing Reports</strong>: <a rel="nofollow" href="http://screenr.com/q3x">http://screenr.com/q3x</a> and <a rel="nofollow" href="http://screenr.com/Mix">http://screenr.com/Mix</a><br/>
<strong>Data Type</strong>: <a rel="nofollow" href="http://screenr.com/gbx">http://screenr.com/gbx</a> and <a rel="nofollow" href="http://screenr.com/8vx">http://screenr.com/8vx</a><br/>
<strong>Sorting Reports</strong>: <a rel="nofollow" href="http://screenr.com/Szx">http://screenr.com/Szx</a><br/>
<strong>Changing Icons</strong>: <a rel="nofollow" href="http://screenr.com/4cx">http://screenr.com/4cx</a><br/>
<strong>Custom Reports</strong>: <a rel="nofollow" href="http://screenr.com/k4x">http://screenr.com/k4x</a></p>
<p>I hope you find this package useful! I really enjoyed making it, and thanks for all the wonderful feedback!
If you have any suggestions for updates or additions, please feel free to add a request on the forums. Please also feel free to share your custom reports, as I would love to see which reports others use.</p>
<p><a title="Package download on our.umbraco.org" href="http://our.umbraco.org/projects/google-analytics-for-umbraco" target="_blank"><strong>Google Analytics for Umbraco version 1.0.7</strong></a></p>
<p>[gallery columns="5"]</p>
<img src="http://blog.sitereactor.dk/via-feed/2010/03/14/google-analytics-for-umbraco-package-update" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2010%2f03%2f14%2fgoogle-analytics-for-umbraco-package-update&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2010-03-13T23:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>I thought it was about time to blog about the latest version of my Google Analytics package for Umbraco, here, a couple of weeks after it has been released on <a title="Package download on our.umbraco.org" href="http://our.umbraco.org/projects/google-analytics-for-umbraco" target="_blank">our.umbraco.org</a>.</p>
<p>It seems I haven't blogged since august 2009, so excuse me if I'm a bit rusty.</p>
<p>Let me take a stroll down memory lane to CodeGarde'09 when the package was first showcased and actually won the prize for best package, which I'm clearly very proud off. I have been getting very good feedback ever since, and this has really motivated me to make the package even greater.
First release included some basic reports that you would also find in Google Analytics when logging in and clicking the main sections (Dashboard, Visitors, Traffic Sources, Content and Goals), and the charts was made using the Google Chart API - so Google all the way :-) It covered a basic need to view basic statistics within Umbraco, but wasn't really all that flexible.</p>
<p>After CodeGarden'09 I started the initial work to rewrite the package to make it more flexible and enable the ability to create custom reports, which had been a goal of mine since day one or two. Okay, maybe not from the first couple of days, as my first goal was to create a simple statistics section in Umbraco while learning how to create a custom section, which I had never done before. Version 1 of the package was very much a learning process for me. So after having gone through the learning process of version 1 I was ready to pursue my second goal: Create a killer Google Analytics package.</p>
<p>To fulfill my second goal I would have to implement the following features:</p>
<ul>
<li>Custom Reports</li>
<li>Flash Charts</li>
<li>Umbraco DataType</li>
</ul>
<p>These features seemed somewhat simple at the time, but turned out to be very time consuming to make.
Creating custom reports based on 47 predefined Metrics and 65 predefined Dimensions makes up for a s**t load of combinations, so I had to come up with a way to calculate the results as a single integer, an average, a percentage and time. I think I have tested something like 90% of the reports, which are available through Google Analytics by default and it seems that my model works (so far anyway - I dread multi-series reports).</p>
<p>Next feature was the Flash charts. Flash charts are simply more flashy then static images, so I chose to go with <a title="Fusion Charts Free" href="http://www.fusioncharts.com/free/" target="_blank">Fusion Charts Free</a> for the implementation because 1.they are free and open source, 2.they are super nice and 3.there is an impressive amount of charts available to work with. So far I have only implemented the Single Line chart, 2D & 3D Pie chart and Bar chart, but hope to implement more. Luckily it will be easy to add more charts, as I have created a C# wrapper for the properties that make up the Flash object.
I have kept the Google Chart API implementation for the summary charts, but also implemented as objects in my model.</p>
<p>The Data Type was one of the most requested features in the package forums on <a title="Package download on our.umbraco.org" href="http://our.umbraco.org/projects/google-analytics-for-umbraco" target="_blank">our.umbraco.org</a>, so clearly I wanted to implement this as well and it is a very cool feature to have. I would love to be able to add a statistics-tab to my Document Types and see how many pageviews, visits etc. my content got.</p>
<p>With the main features down the only hurdle to overcome was the time factor. I originally thought I would be able to post an update in August 2009, but didn't have enough time so maybe October was more realistic, but no. I kept pushing the release because I didn't have enough time to dedicate to the project, and only worked on it from time to time during weekends.
The new year came and I had got a lot of work done, and when the feb16 birthday event was announced it was great opportunity to prep a release. The implementation of the different charts was done, and ability to create custom reports was also ready. Only some small features was still needing some polish, and the Data Type.
I thought to myself that I must release this package (give the people what they want) very soon, so I set a deadline for February 26. for release of the reworked package.</p>
<p>For the feb16 birthday event I demoed the new and hugely improved package in Copenhagen, which seemed to go okay. The crowd was really really quite, but I'm hoping it was because they were speechless :-)
I announced that the package would be released on <a title="Package download on our.umbraco.org" href="http://our.umbraco.org/projects/google-analytics-for-umbraco" target="_blank">our.umbraco.org</a> on feb 26. so the heat was on. The following 10 days I coded like a crazy to make my deadline, and I started creating teasers for the package to rise awareness and to further pressure myself.</p>
<p>Version 1.0.6 was released on feb.26th. and was very well received. The installer was updated a couple of days later, so <strong>current version is 1.0.7</strong>.</p>
<p>Current features include:</p>
<ul>
<li>32 Standard Reports</li>
<li>Custom Reports</li>
<li>Data Type (choose any report)</li>
<li>Switch between multiple profiles for accounts available through credentials (google account)</li>
<li>Flash Charts based on Fusion Chart Free (Single line-, 2D & 3D Pie- and Bar charts)</li>
<li>Static Charts for summary views (based on Google Charts API)</li>
<li>Tables for viewing things like Content by Visits, Browser types, version etc.</li>
<li>Sorting of reports (Umbraco tree)</li>
<li>Sorting of charts within a report</li>
<li>Editing of existing charts within a report</li>
<li>Delete charts from a report</li>
<li>Delete reports</li>
<li>Change icons for reports in tree</li>
</ul>
<p>Here are links to the 10 teasers, which I created during the last 10 days of development:</p>
<p><strong>Installing the Package</strong>: <a rel="nofollow" href="http://screenr.com/EHh">http://screenr.com/EHh</a><br/>
<strong>Accounts & Profiles</strong>: <a rel="nofollow" href="http://screenr.com/3jx">http://screenr.com/3jx</a><br/>
<strong>Editing Reports</strong>: <a rel="nofollow" href="http://screenr.com/q3x">http://screenr.com/q3x</a> and <a rel="nofollow" href="http://screenr.com/Mix">http://screenr.com/Mix</a><br/>
<strong>Data Type</strong>: <a rel="nofollow" href="http://screenr.com/gbx">http://screenr.com/gbx</a> and <a rel="nofollow" href="http://screenr.com/8vx">http://screenr.com/8vx</a><br/>
<strong>Sorting Reports</strong>: <a rel="nofollow" href="http://screenr.com/Szx">http://screenr.com/Szx</a><br/>
<strong>Changing Icons</strong>: <a rel="nofollow" href="http://screenr.com/4cx">http://screenr.com/4cx</a><br/>
<strong>Custom Reports</strong>: <a rel="nofollow" href="http://screenr.com/k4x">http://screenr.com/k4x</a></p>
<p>I hope you find this package useful! I really enjoyed making it, and thanks for all the wonderful feedback!
If you have any suggestions for updates or additions, please feel free to add a request on the forums. Please also feel free to share your custom reports, as I would love to see which reports others use.</p>
<p><a title="Package download on our.umbraco.org" href="http://our.umbraco.org/projects/google-analytics-for-umbraco" target="_blank"><strong>Google Analytics for Umbraco version 1.0.7</strong></a></p>
<p>[gallery columns="5"]</p>
<img src="http://blog.sitereactor.dk/via-feed/2010/03/14/google-analytics-for-umbraco-package-update" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2010%2f03%2f14%2fgoogle-analytics-for-umbraco-package-update&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2009/08/27/do-you-feel-obligated-to-open-source-your-umbraco-packageDo you feel obligated to open source your Umbraco package?<p>I have been thinking about this subject for some time now, but todays tweets got me thinking and I thought I'd write up a post to <strong>hopefully stir up some discussion</strong>.</p>
<p>Maybe I should start off by saying that i'm not a money hungry developer, but I think that we can all agree that even though we are working with an open source CMS, we have to make money some how some way. Of course we get paid when developing a customer solution, but it seems to me that things are a bit different when developing addons, plugins, packages, datatypes and everything else that has been developed by and for the Umbraco community.</p>
<p>Currently there are two packages available for purchase in the Umbraco store, and I counted 68 packages on our.umbraco.org today.
Don't get me wrong, I love the fact that so many people are contributing with a lot of great stuff that is free to install and use. I personally used <strong>Warren's CWS</strong> package to get up to speed on Umbraco v.4 after not having used Umbraco since v.3.0.3. I think it is a great resource, but I probably wouldn't have bought it if it was only available for purchase in the Umbraco store. No offense Warren ;-)</p>
<p>I myself started a pretty big project (at least for a spare time project) by developing Google Analytics for Umbraco, which is open sourced and thus free for all :) I thought about different models for getting a bit of return on creating a fairly large project, but ultimately decided that it should be open sourced. Partly because Google Analytics is already free to use, so it seem to be the best incentive to make the Umbraco package free as well - even though it might have greater value for some. Another part of the decision has to do with installbase and getting the package out there - won't go into details, but sometimes its just nice to share your shit.
<a href="http://www.axendo.nl">Axendo</a>, who have also created an Analytics plugin for Umbraco, have chosen to make a limited free version and a paid version, which I think is a cleaver thing to do. I hope the good guys at <strong>Axendo</strong> are not pissed of by me making my package open source and free, but hopefully they'll still be able to sell their package, and they could actually use my source in their product should they want to do so in the future.
I would personally find it cool if someone would want to adopt my Google Analytics for Umbraco package, and I would encourage all Solution Providers and Developers to make some money on implementing the Google Analytics section in customer solutions. In my latest offer to a new client I included a couple of packages from our.umbraco.org, which I think will be a win win situation for all: the client will get some very useful tools (free) and we (the solution provider) got some extra hours in on implementation.</p>
<p>Making a package free, open source or paid is ultimately up to the developer. One might think that because the CMS is free so should the addons. Well, not necessarily! Take a great addon like <strong>uCommerce</strong> which will definatly not be free, this product has a clear incentive for customers to buy it. I won't go into details about uCommerce but I would love to hear <strong>Søren</strong>'s thoughts on selling an addon for an open source CMS :)</p>
<p>Over the next six month I will be developing a couple of addons for Umbraco (got the ideas, just need the time), which will all be open source and made in my spare time. The main reason for these addons being open source is that the counter part or the part that will be integrated with Umbraco is also open source. I'm also hoping that the fact that the addons are free to install will help them spread and thus create a greater installbase. This could of course also be done with a limited free version and a paid full version, but I'm somehow not entirely sure that would work for the addons in question.
So how do I get paid for spending a lot of spare time creating great addons? Should I get paid? Isn't the gift of giving enough? :P
Well, a sponsor-an-umbraco-dev program would be great but I don't know who would actually sponsor my work, so maybe selling support/upgrades/feature request implementations would be a better solution?</p>
<p>I personally think that when the good guys at Umbraco start selling the Forms module, it will make it easier for other developers to sell their packages, addons, plugins or whatever. Would also love to hear <strong>Niels</strong>' thoughts on this - do you think that <strong>Umbraco HQ</strong> in a sense will lead the pack and in some way encourage customers/users to pay for addons?
When a customer sees what great stuff he can get for a reasonable amount of money he probably won't have a problem paying for it even though he "bought" an open source CMS in the first place, right?</p>
<p>So what do you think? Do you feel obligated to open source your Umbraco package or simply make it available for free? Are all the packages on our.umbraco.org not worth paying for? Are you hoping that all packages for Umbraco will always be free to install and use?</p>
<p>Please share your thoughts, as I would love to hear what others think about this subject.</p>
<p><strong>Darren Ferguson</strong>, you are one of the few people with packages in the store. What are your thoughts?</p>
<p><strong>Tommy Poulsen</strong>, you are making a great addon with the PDF creator. Do you intend to sell this addon or contribute it as a free to use package on our.umbraco.org and why?</p>
<p>Other package developers: Do you ultimately feel it depends on the content/usability of the package whether it should be free or paid?</p>
<p>I hope I didn't make this post too much about money, but rather what makes developers or solution providers choose to make an Umbraco package free, paid or open source and how they get compensated for their work (via implementation for example?).</p>
<img src="http://blog.sitereactor.dk/via-feed/2009/08/27/do-you-feel-obligated-to-open-source-your-umbraco-package" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2009%2f08%2f27%2fdo-you-feel-obligated-to-open-source-your-umbraco-package&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2009-08-26T22:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>I have been thinking about this subject for some time now, but todays tweets got me thinking and I thought I'd write up a post to <strong>hopefully stir up some discussion</strong>.</p>
<p>Maybe I should start off by saying that i'm not a money hungry developer, but I think that we can all agree that even though we are working with an open source CMS, we have to make money some how some way. Of course we get paid when developing a customer solution, but it seems to me that things are a bit different when developing addons, plugins, packages, datatypes and everything else that has been developed by and for the Umbraco community.</p>
<p>Currently there are two packages available for purchase in the Umbraco store, and I counted 68 packages on our.umbraco.org today.
Don't get me wrong, I love the fact that so many people are contributing with a lot of great stuff that is free to install and use. I personally used <strong>Warren's CWS</strong> package to get up to speed on Umbraco v.4 after not having used Umbraco since v.3.0.3. I think it is a great resource, but I probably wouldn't have bought it if it was only available for purchase in the Umbraco store. No offense Warren ;-)</p>
<p>I myself started a pretty big project (at least for a spare time project) by developing Google Analytics for Umbraco, which is open sourced and thus free for all :) I thought about different models for getting a bit of return on creating a fairly large project, but ultimately decided that it should be open sourced. Partly because Google Analytics is already free to use, so it seem to be the best incentive to make the Umbraco package free as well - even though it might have greater value for some. Another part of the decision has to do with installbase and getting the package out there - won't go into details, but sometimes its just nice to share your shit.
<a href="http://www.axendo.nl">Axendo</a>, who have also created an Analytics plugin for Umbraco, have chosen to make a limited free version and a paid version, which I think is a cleaver thing to do. I hope the good guys at <strong>Axendo</strong> are not pissed of by me making my package open source and free, but hopefully they'll still be able to sell their package, and they could actually use my source in their product should they want to do so in the future.
I would personally find it cool if someone would want to adopt my Google Analytics for Umbraco package, and I would encourage all Solution Providers and Developers to make some money on implementing the Google Analytics section in customer solutions. In my latest offer to a new client I included a couple of packages from our.umbraco.org, which I think will be a win win situation for all: the client will get some very useful tools (free) and we (the solution provider) got some extra hours in on implementation.</p>
<p>Making a package free, open source or paid is ultimately up to the developer. One might think that because the CMS is free so should the addons. Well, not necessarily! Take a great addon like <strong>uCommerce</strong> which will definatly not be free, this product has a clear incentive for customers to buy it. I won't go into details about uCommerce but I would love to hear <strong>Søren</strong>'s thoughts on selling an addon for an open source CMS :)</p>
<p>Over the next six month I will be developing a couple of addons for Umbraco (got the ideas, just need the time), which will all be open source and made in my spare time. The main reason for these addons being open source is that the counter part or the part that will be integrated with Umbraco is also open source. I'm also hoping that the fact that the addons are free to install will help them spread and thus create a greater installbase. This could of course also be done with a limited free version and a paid full version, but I'm somehow not entirely sure that would work for the addons in question.
So how do I get paid for spending a lot of spare time creating great addons? Should I get paid? Isn't the gift of giving enough? :P
Well, a sponsor-an-umbraco-dev program would be great but I don't know who would actually sponsor my work, so maybe selling support/upgrades/feature request implementations would be a better solution?</p>
<p>I personally think that when the good guys at Umbraco start selling the Forms module, it will make it easier for other developers to sell their packages, addons, plugins or whatever. Would also love to hear <strong>Niels</strong>' thoughts on this - do you think that <strong>Umbraco HQ</strong> in a sense will lead the pack and in some way encourage customers/users to pay for addons?
When a customer sees what great stuff he can get for a reasonable amount of money he probably won't have a problem paying for it even though he "bought" an open source CMS in the first place, right?</p>
<p>So what do you think? Do you feel obligated to open source your Umbraco package or simply make it available for free? Are all the packages on our.umbraco.org not worth paying for? Are you hoping that all packages for Umbraco will always be free to install and use?</p>
<p>Please share your thoughts, as I would love to hear what others think about this subject.</p>
<p><strong>Darren Ferguson</strong>, you are one of the few people with packages in the store. What are your thoughts?</p>
<p><strong>Tommy Poulsen</strong>, you are making a great addon with the PDF creator. Do you intend to sell this addon or contribute it as a free to use package on our.umbraco.org and why?</p>
<p>Other package developers: Do you ultimately feel it depends on the content/usability of the package whether it should be free or paid?</p>
<p>I hope I didn't make this post too much about money, but rather what makes developers or solution providers choose to make an Umbraco package free, paid or open source and how they get compensated for their work (via implementation for example?).</p>
<img src="http://blog.sitereactor.dk/via-feed/2009/08/27/do-you-feel-obligated-to-open-source-your-umbraco-package" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2009%2f08%2f27%2fdo-you-feel-obligated-to-open-source-your-umbraco-package&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2009/06/05/google-analytics-for-umbraco-first-betaGoogle Analytics for Umbraco - First Beta<p>I'm happy to announce the first beta release of my Google Analytics plugin/section for Umbraco.<br/>
The development took a bit longer then first anticipated, but I think it turned out really well. There are still a few bugs, so I don't recommend that you install it in a customer solution just yet. This first release <span style="text-decoration:underline;">is</span> a beta release, so first off you should just try it out and please feel free to report any bugs you might find.<br/>
When I have had a chance to clean up the source code, and documenting it I will release the code as open source.</p>
<p>Currently known bugs are:<br/>
When submitting a new date range the first click on the button doesn't raise the click event of the button, so you have to make your selection again and click the button to refresh the view with your new date range (default date range si one month).</p>
<p>I'm currently using Googles Chart API to display the charts, so the amount of data that can be displayed is limited.</p>
<p>At the bottom of this post you will find a link to download the files necessary to install the google analytics plugin. This is not a "normal" umbraco package that you can install from within the client, so need to unpack the files within the root directory of you umbraco installation.<br/>
These files are included in the package:<br/>
web.config<br/>
umbracoAppInserts.sql<br/>
umbracoAppTreeUpdate.sql (only needed if you have downloaded the package before - contains sql fix).<br/>
bin\Google.GData.Analytics.dll<br/>
bin\Google.GData.Client.dll<br/>
bin\Sitereactor.GoogleAnalytics.dll<br/>
config\Analytics\Analytics.config<br/>
config\Analytics\AnalyticsChartProperties.config<br/>
umbraco\config\lang\*.xml<br/>
umbraco\statistics\StatContent.aspx</p>
<p>So, there are a couple of things that you have to be aware of when installing/unpacking these files.<br/>
First off, the web.config file is just a standard umbraco web.config so be sure not to overwrite you own. This file is simply included to shown you how and where to configure the google analytics account that you want displayed within Umbraco.
Under <appSettings> you have to add the following to your web.config file:<br/>
<add key="GoogleAnalytics.Email" value="email@gmail.com"/><br/>
<add key="GoogleAnalytics.Passwd" value="password"/><br/>
<add key="GoogleAnalytics.ProfileId" value="ga:profileid"/></p>
<p>These three entries are your Google Analytics credentials. If you are unsure of what your profileid number is, then login to analytics, click on the account you want shown within umbraco, click view report and the id value of the querystring is your profileid :)</p>
<p>The umbracoAppInserts.sql file is a sql script that creates three entries in your umbraco database, which will make the Statistics section appear within umbraco. Before you run this script, open it up and replace [umbracodatabasename] with [your db name].</p>
<p>Finally, in "umbraco\config\lang\" I have included the newest language files (from the 4.0.2.1 release) as all of these files include a translation for "Statistics" (the name of the section). You only need to extract these to your umbraco\config\lang directory if the section name looks like this:<br/>
[insert stats image]</p>
<p>I have included the latest release build of the Google Analytics .NET API, which is needed to get access to and retrieve data from the service.</p>
<p>The Sitereactor.GoogleAnalytics assembly contains all my wonderfull code :) -> Connecting to and retrieving analytics data feeds, manipulating the data and forming URLs for retrieving Google Charts (check out the API <a title="Google Chart API" href="http://code.google.com/intl/da/apis/chart/" target="_blank">here</a>). If you have a suggestion for another Chart implementation then googles, please let me know (should be open source).
All of this code will become open source very soon.</p>
<p>StatContent.aspx handles the analytics views within umbraco.</p>
<p>Analytics.config and AnalyticsChartProperties.config are used to configure the five views within the statistics section (Dashboard, Visitors, Traffic Sources, Content and Goals). These views are exactly what you find on the Google Analytics site with the only difference that it is currently not possible to click the statistics and get a detailed view (this will be included in a future release).
The usage of <section name="Dashboard"> and <report name="Pageviews" chartType="" chartData="" aggregateType=""> within the Analytics.config-file is currently strongly typed, so you shouldn't mess to much with this file - if you change the name attribute something will break or not shown up :)<br/>
The AnalyticsChartProperties.config-file you can go crazy with :) Values/InnerText only, though. Here, the size and color of small and large charts are specified. For example, a large SingleLineChart has a width of 500px and height of 125px, so if you want to increase that or maybe just change the color of the line, be my guest.</p>
<p>I think that was pretty much it. Let me know if you have any problems installing the section or experience bugs or differences in the datasets, please let me know (after you have double checked ;) ). All feedback is appriciated.</p>
<p>Here are some screens of what to expect - file at the bottom.</p>
<p>[insert gallery]</p>
<p><strong><a title="Google Analytics for Umbraco - First Beta" href="http://our.umbraco.org/projects/google-analytics-for-umbraco" target="_blank">Download the package from our.umbraco.org</a>.</strong></p>
<p><strong>UPDATE: Package updated with sql insert and update script.
</strong>Previous package had a typo in the umbracoAppInserts.sql script (the column "treeHandlerType" in the "umbracoAppTree" table had "loadStatTree" - should be "LoadStatTree"). Caused the five nodes not loading.</p>
<p>PS: This release was only been tested with umbraco v4.0.1. If you have trouble installing it with v3, please let me know and I'll look into it.</p>
<p><strong>UPDATE (07/07-09):</strong> This blog post is a bit our of date with regards to the installation of the add-in for umbraco. Please look to the project page on our.umbraco.org for the latest package.<br/>
Current package is GoogleAnalytics_1.0.2-fixed.zip.<br/>
<strong><a href="http://our.umbraco.org/projects/google-analytics-for-umbraco">Google Analytics for Umbraco Project page</a></strong></p>
<img src="http://blog.sitereactor.dk/via-feed/2009/06/05/google-analytics-for-umbraco-first-beta" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2009%2f06%2f05%2fgoogle-analytics-for-umbraco-first-beta&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2009-06-04T22:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>I'm happy to announce the first beta release of my Google Analytics plugin/section for Umbraco.<br/>
The development took a bit longer then first anticipated, but I think it turned out really well. There are still a few bugs, so I don't recommend that you install it in a customer solution just yet. This first release <span style="text-decoration:underline;">is</span> a beta release, so first off you should just try it out and please feel free to report any bugs you might find.<br/>
When I have had a chance to clean up the source code, and documenting it I will release the code as open source.</p>
<p>Currently known bugs are:<br/>
When submitting a new date range the first click on the button doesn't raise the click event of the button, so you have to make your selection again and click the button to refresh the view with your new date range (default date range si one month).</p>
<p>I'm currently using Googles Chart API to display the charts, so the amount of data that can be displayed is limited.</p>
<p>At the bottom of this post you will find a link to download the files necessary to install the google analytics plugin. This is not a "normal" umbraco package that you can install from within the client, so need to unpack the files within the root directory of you umbraco installation.<br/>
These files are included in the package:<br/>
web.config<br/>
umbracoAppInserts.sql<br/>
umbracoAppTreeUpdate.sql (only needed if you have downloaded the package before - contains sql fix).<br/>
bin\Google.GData.Analytics.dll<br/>
bin\Google.GData.Client.dll<br/>
bin\Sitereactor.GoogleAnalytics.dll<br/>
config\Analytics\Analytics.config<br/>
config\Analytics\AnalyticsChartProperties.config<br/>
umbraco\config\lang\*.xml<br/>
umbraco\statistics\StatContent.aspx</p>
<p>So, there are a couple of things that you have to be aware of when installing/unpacking these files.<br/>
First off, the web.config file is just a standard umbraco web.config so be sure not to overwrite you own. This file is simply included to shown you how and where to configure the google analytics account that you want displayed within Umbraco.
Under <appSettings> you have to add the following to your web.config file:<br/>
<add key="GoogleAnalytics.Email" value="email@gmail.com"/><br/>
<add key="GoogleAnalytics.Passwd" value="password"/><br/>
<add key="GoogleAnalytics.ProfileId" value="ga:profileid"/></p>
<p>These three entries are your Google Analytics credentials. If you are unsure of what your profileid number is, then login to analytics, click on the account you want shown within umbraco, click view report and the id value of the querystring is your profileid :)</p>
<p>The umbracoAppInserts.sql file is a sql script that creates three entries in your umbraco database, which will make the Statistics section appear within umbraco. Before you run this script, open it up and replace [umbracodatabasename] with [your db name].</p>
<p>Finally, in "umbraco\config\lang\" I have included the newest language files (from the 4.0.2.1 release) as all of these files include a translation for "Statistics" (the name of the section). You only need to extract these to your umbraco\config\lang directory if the section name looks like this:<br/>
[insert stats image]</p>
<p>I have included the latest release build of the Google Analytics .NET API, which is needed to get access to and retrieve data from the service.</p>
<p>The Sitereactor.GoogleAnalytics assembly contains all my wonderfull code :) -> Connecting to and retrieving analytics data feeds, manipulating the data and forming URLs for retrieving Google Charts (check out the API <a title="Google Chart API" href="http://code.google.com/intl/da/apis/chart/" target="_blank">here</a>). If you have a suggestion for another Chart implementation then googles, please let me know (should be open source).
All of this code will become open source very soon.</p>
<p>StatContent.aspx handles the analytics views within umbraco.</p>
<p>Analytics.config and AnalyticsChartProperties.config are used to configure the five views within the statistics section (Dashboard, Visitors, Traffic Sources, Content and Goals). These views are exactly what you find on the Google Analytics site with the only difference that it is currently not possible to click the statistics and get a detailed view (this will be included in a future release).
The usage of <section name="Dashboard"> and <report name="Pageviews" chartType="" chartData="" aggregateType=""> within the Analytics.config-file is currently strongly typed, so you shouldn't mess to much with this file - if you change the name attribute something will break or not shown up :)<br/>
The AnalyticsChartProperties.config-file you can go crazy with :) Values/InnerText only, though. Here, the size and color of small and large charts are specified. For example, a large SingleLineChart has a width of 500px and height of 125px, so if you want to increase that or maybe just change the color of the line, be my guest.</p>
<p>I think that was pretty much it. Let me know if you have any problems installing the section or experience bugs or differences in the datasets, please let me know (after you have double checked ;) ). All feedback is appriciated.</p>
<p>Here are some screens of what to expect - file at the bottom.</p>
<p>[insert gallery]</p>
<p><strong><a title="Google Analytics for Umbraco - First Beta" href="http://our.umbraco.org/projects/google-analytics-for-umbraco" target="_blank">Download the package from our.umbraco.org</a>.</strong></p>
<p><strong>UPDATE: Package updated with sql insert and update script.
</strong>Previous package had a typo in the umbracoAppInserts.sql script (the column "treeHandlerType" in the "umbracoAppTree" table had "loadStatTree" - should be "LoadStatTree"). Caused the five nodes not loading.</p>
<p>PS: This release was only been tested with umbraco v4.0.1. If you have trouble installing it with v3, please let me know and I'll look into it.</p>
<p><strong>UPDATE (07/07-09):</strong> This blog post is a bit our of date with regards to the installation of the add-in for umbraco. Please look to the project page on our.umbraco.org for the latest package.<br/>
Current package is GoogleAnalytics_1.0.2-fixed.zip.<br/>
<strong><a href="http://our.umbraco.org/projects/google-analytics-for-umbraco">Google Analytics for Umbraco Project page</a></strong></p>
<img src="http://blog.sitereactor.dk/via-feed/2009/06/05/google-analytics-for-umbraco-first-beta" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2009%2f06%2f05%2fgoogle-analytics-for-umbraco-first-beta&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2009/04/26/google-analytics-for-umbraco-first-installmentGoogle Analytics for Umbraco - First installment<p>This is the first installment in a series about implementing google analytics (with the new data export api) in Umbraco, so you can get your sites statistics in your CMS (where it should be). This post only deals with getting the section up and running, so everything is prepared for the next installment, which will deal with the actual statistics.</p>
<p>As you can see in my previous post I have been giving a shot at porting the <a title="Google Analytics Data Export API" href="http://code.google.com/intl/da/apis/analytics/docs/" target="_blank">analytics api</a> to the <a title=".NET Client Library Developer's Guide" href="http://code.google.com/intl/da/apis/gdata/client-cs.html" target="_blank">.NET client library</a>. Having the availability of analytics in Googles .NET client library would make the code and usage much prettier :-) .... and it would probably make the implementation in a sysmtem like Umbraco much easier.</p>
<p>Well back to the topic. When I first saw the <a title="Attention Developers: Google Analytics API Launched!" href="http://analytics.blogspot.com/2009/04/attention-developers-google-analytics.html" target="_blank">announcement</a> of the analytics api I touhgt that an ideal implementation would be a CMS like Umbraco (or Sitecore for that matter), and when <a title="Niels Hartvigs twitter account" href="http://twitter.com/umbraco" target="_blank">Niels Hartvig</a> twitted about the challenge to create an analytics plugin for Umbraco I knew it was my calling. Okay, not a calling in a biblical sense, but an obvious excuse to get started.</p>
<p>So how do one get started... I thought the best solution would be to create a statistics section and keep the style of the Umbraco sections. Lucky for me there is predefined css classes and icon for a statistics section, so I can concentrate on how to implement the functionality.<br/>
I haven't actually created a new section before, so I started off by browsing the Umbraco forums for tips and inspiration, which I found in a two piece article on simm.dk - Part <a title="Making custom sections and trees inside Umbraco - Part I" href="http://www.simm.dk/umbraco-corner/articles/making-custom-sections-and-trees-inside-umbraco---part-i.aspx" target="_blank">one</a> & <a title="Making custom sections and trees inside Umbraco - part II" href="http://www.simm.dk/umbraco-corner/articles/making-custom-sections-and-trees-inside-umbraco---part-ii.aspx" target="_blank">two</a>. The article shows which tables in the database needs to be updated with info on the new section, which was a great help to get started.</p>
<p>I started by creating a new entry for my statistics app in the umbracoApp table:</p>
<a href="http://elpadrinodk.wordpress.com/files/2009/04/dbo-umbracoapp.png"><img class="size-full wp-image-40" title="dbo-umbracoapp" src="http://elpadrinodk.wordpress.com/files/2009/04/dbo-umbracoapp.png" alt="umbracoApp table view" width="510" height="211" /></a>
<p>The fields was filled with the following data:
<ul>
<li>sortOrder: 9</li>
<li>appAlias: stats</li>
<li>appIcon: .traystats</li>
<li>appName: Statistics</li>
<li>appInitWithTreeAlias: NULL</li>
</ul>
You can find a description of the diffirent fields in the article on simm.dk, so I won't go too much into detail about the above. The important thing here is to note the 'appAlias', which is used to reference the application in the next two tables that also has to be updated with some data about the application. The classname '.traystats' is already present in the css, so we don't need to change or anything special here - lucky me/us.</p>
<p>Next table that has to be changed in order for the statistics section to show in Umbraco is umbracoAppTree:</p>
<a href="http://elpadrinodk.wordpress.com/files/2009/04/dbo-umbracoapptree.png"><img class="size-full wp-image-43" title="dbo-umbracoapptree" src="http://elpadrinodk.wordpress.com/files/2009/04/dbo-umbracoapptree.png" alt="umbracoAppTree table view" width="510" height="295" /></a>
<p>The fields was filled with the following data:
<ul>
<li>treeSilent: False</li>
<li>TreeInitialize: True</li>
<li>treeSortOrder: 0</li>
<li>appAlias: stats</li>
<li>treeAlias: stats</li>
<li>treeTitle: Statistics</li>
<li>treeIconClosed: folder.gif</li>
<li>treeIconOpen: folder_o.gif</li>
<li>treeHandlerAssembly: Sitereactor.GoogleAnalytics</li>
<li>treeHandlerType: LoadStatTree</li>
<li>action: NULL</li>
</ul>
Again you'll find a very nice description of the different fields in the article on simm.dk. The most important part here is probably the treeHandlerAssembly and treeHandlerType, which I have set to my custom assembly that will make up the Google Analytics section and the class which will load the tree (treeHandlerType) is set to LoadStatTree.<br/>
The Open and Closed tree icons are is standard, as I don't want to do anything special on this part as of now.</p>
<p>I want to make a special note on the appAlias, one thing that I missed in the articles on simm.dk. You might want to add a key of the appAlias to the language xmls, which are located in /umbraco/config/lang/ (en.xml for the english language), otherwise the title on the treelist could end up being just [stat] (which isn't very pretty). Look for the following area tag:
<pre><code><area alias="sections"></code></pre> and add the following key <pre><code><key alias="stats">Statistics</key></code></pre></p>
<p>The next table is easy :-) Its just mapping the user(s) to the app/section - in this case I only have a single admin user who I want to give access.</p>
<a href="http://elpadrinodk.wordpress.com/files/2009/04/dbo-umbracouser2app.png"><img class="size-full wp-image-46" title="dbo-umbracouser2app" src="http://elpadrinodk.wordpress.com/files/2009/04/dbo-umbracouser2app.png" alt="umbracoUser2App table view" width="252" height="239" /></a>
<p>The default admin user id is zero, so just add that and the appAlias and the table editing is done.</p>
<p>Now on to the coding.</p>
<p>I started off by trying the code example in the last of the two articles on simm.dk, but couldn't actually get it to work so I browsed through the Umbraco source code to see how the User and Member sections are built. The way these two classes (loadUsers and loadMembers) are built is fairly simple and you can find them plus all the other classes, which loads treelists in Umbraco in the following folder: umbraco 4.0.1 source\umbraco\presentation\umbraco\Trees.
So to setup the code that loads the tree menu I created a class, which implements BaseTree - an abstract class that implements the ITree interface.
Example: <em>public class LoadStatTree : BaseTree</em></p>
<p>This implementation implies that the following three clases are implemented in the LoadStatTree class:
<ul>
<li>protected override void CreateRootNode(ref XmlTreeNode rootNode)</li>
<li>public override void RenderJS(ref StringBuilder Javascript)</li>
<li>public override void Render(ref XmlTree tree)</li>
</ul>
CreateRootNode simply does what the name implies - creates the root node for the current section. This can be implemented as follows:
<pre><code>rootNode.Icon = FolderIcon; //Standard icon for a folder
rootNode.OpenIcon = FolderIconOpen; //Standard icon for an open folder
rootNode.NodeType = TreeAlias; //Alias of the current tree
rootNode.NodeID = "-1"; //Start node should be set to minus in order to not interfer with the normal structure/nodetree.</code></pre></p>
<p>RenderJS is used to render Javascript output to the browser, which (from the actually section in Umbraco) is used to open the webform with the dashboard/TabView (right side of the screen). Here is an example:</p>
<pre><code>Javascript.Append(
@"
function openStats(id) {
parent.right.document.location.href = stats/statsDashboard.aspx?id=' + id;
}
");</code></pre>
<p>In the sample code, which you will find at the end of this post the webform that is opened simply shows a Hello World text. In order for the dashboard to look correct and in keeping with the look and feel of Umbraco it would be a good idea to implement the TabView control. In the next post I'll show you how it can be done and how I have used it.</p>
<p>The last method Render is used to programmatically create the tree menu using the XmlTree. For this example I have simply created four items in the menu using the XmlTreeNode like this:
<pre><code>XmlTreeNode xNode = XmlTreeNode.Create(this);
xNode.NodeID = "0";
xNode.Text = "Menu Item 1"; //Name
xNode.Action = "javascript:openStats(0);";
xNode.Icon = "folder.gif";
xNode.OpenIcon = "folder_o.gif";
tree.Add(xNode);</code></pre>
</p>
<p>Okay, so now the tree menu is in place and we can concentrate on the content and how and what of the analytics statistics to show on the dashboard.
While we wait for a finished version of the analytics data export api implemented in the .NET client library, this article is a good place to start for using the available api in C#: <a title="Introducing Google Analytics API with asp.net / C#" href="http://www.akamarketing.com/blog/103-introducing-google-analytics-api-with-aspnet-c.html" target="_blank">Introducing Google Analytics API with asp.net / C#</a>. It could of course be implemented using javascript, but not sure how well it would fit into the existing context of Umbraco. I have yet to try it out, but I fear that it will interfer with some of the existing javascript used by the Umbraco client and that the login functionality won't be too smooth. But maybe initializing the login with some jQuery appended to the browser might do the trick. Anyway, I will look into both possibilities untill the next post where there will be an actual implementation of the google analytics data api.</p>
<p><a title="Sitereactor.GoogleAnalytics.zip file" href="http://www.sitereactor.dk/media/Sitereactor.GoogleAnalytics.zip" target="_self">Here is the code sample</a>, which implements the above examples (and which will also be expanded with an implementation of google analytics).
And here is a screenshot of the results of the examples and code given in this post:</p>
<p><a href="http://elpadrinodk.wordpress.com/files/2009/04/umbraco-statistics.png"><img class="size-full wp-image-49" title="umbraco-statistics" src="http://elpadrinodk.wordpress.com/files/2009/04/umbraco-statistics.png" alt="Umbraco Statics Section" width="509" height="369" /></a></p>
<img src="http://blog.sitereactor.dk/via-feed/2009/04/26/google-analytics-for-umbraco-first-installment" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2009%2f04%2f26%2fgoogle-analytics-for-umbraco-first-installment&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2009-04-25T22:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>This is the first installment in a series about implementing google analytics (with the new data export api) in Umbraco, so you can get your sites statistics in your CMS (where it should be). This post only deals with getting the section up and running, so everything is prepared for the next installment, which will deal with the actual statistics.</p>
<p>As you can see in my previous post I have been giving a shot at porting the <a title="Google Analytics Data Export API" href="http://code.google.com/intl/da/apis/analytics/docs/" target="_blank">analytics api</a> to the <a title=".NET Client Library Developer's Guide" href="http://code.google.com/intl/da/apis/gdata/client-cs.html" target="_blank">.NET client library</a>. Having the availability of analytics in Googles .NET client library would make the code and usage much prettier :-) .... and it would probably make the implementation in a sysmtem like Umbraco much easier.</p>
<p>Well back to the topic. When I first saw the <a title="Attention Developers: Google Analytics API Launched!" href="http://analytics.blogspot.com/2009/04/attention-developers-google-analytics.html" target="_blank">announcement</a> of the analytics api I touhgt that an ideal implementation would be a CMS like Umbraco (or Sitecore for that matter), and when <a title="Niels Hartvigs twitter account" href="http://twitter.com/umbraco" target="_blank">Niels Hartvig</a> twitted about the challenge to create an analytics plugin for Umbraco I knew it was my calling. Okay, not a calling in a biblical sense, but an obvious excuse to get started.</p>
<p>So how do one get started... I thought the best solution would be to create a statistics section and keep the style of the Umbraco sections. Lucky for me there is predefined css classes and icon for a statistics section, so I can concentrate on how to implement the functionality.<br/>
I haven't actually created a new section before, so I started off by browsing the Umbraco forums for tips and inspiration, which I found in a two piece article on simm.dk - Part <a title="Making custom sections and trees inside Umbraco - Part I" href="http://www.simm.dk/umbraco-corner/articles/making-custom-sections-and-trees-inside-umbraco---part-i.aspx" target="_blank">one</a> & <a title="Making custom sections and trees inside Umbraco - part II" href="http://www.simm.dk/umbraco-corner/articles/making-custom-sections-and-trees-inside-umbraco---part-ii.aspx" target="_blank">two</a>. The article shows which tables in the database needs to be updated with info on the new section, which was a great help to get started.</p>
<p>I started by creating a new entry for my statistics app in the umbracoApp table:</p>
<a href="http://elpadrinodk.wordpress.com/files/2009/04/dbo-umbracoapp.png"><img class="size-full wp-image-40" title="dbo-umbracoapp" src="http://elpadrinodk.wordpress.com/files/2009/04/dbo-umbracoapp.png" alt="umbracoApp table view" width="510" height="211" /></a>
<p>The fields was filled with the following data:
<ul>
<li>sortOrder: 9</li>
<li>appAlias: stats</li>
<li>appIcon: .traystats</li>
<li>appName: Statistics</li>
<li>appInitWithTreeAlias: NULL</li>
</ul>
You can find a description of the diffirent fields in the article on simm.dk, so I won't go too much into detail about the above. The important thing here is to note the 'appAlias', which is used to reference the application in the next two tables that also has to be updated with some data about the application. The classname '.traystats' is already present in the css, so we don't need to change or anything special here - lucky me/us.</p>
<p>Next table that has to be changed in order for the statistics section to show in Umbraco is umbracoAppTree:</p>
<a href="http://elpadrinodk.wordpress.com/files/2009/04/dbo-umbracoapptree.png"><img class="size-full wp-image-43" title="dbo-umbracoapptree" src="http://elpadrinodk.wordpress.com/files/2009/04/dbo-umbracoapptree.png" alt="umbracoAppTree table view" width="510" height="295" /></a>
<p>The fields was filled with the following data:
<ul>
<li>treeSilent: False</li>
<li>TreeInitialize: True</li>
<li>treeSortOrder: 0</li>
<li>appAlias: stats</li>
<li>treeAlias: stats</li>
<li>treeTitle: Statistics</li>
<li>treeIconClosed: folder.gif</li>
<li>treeIconOpen: folder_o.gif</li>
<li>treeHandlerAssembly: Sitereactor.GoogleAnalytics</li>
<li>treeHandlerType: LoadStatTree</li>
<li>action: NULL</li>
</ul>
Again you'll find a very nice description of the different fields in the article on simm.dk. The most important part here is probably the treeHandlerAssembly and treeHandlerType, which I have set to my custom assembly that will make up the Google Analytics section and the class which will load the tree (treeHandlerType) is set to LoadStatTree.<br/>
The Open and Closed tree icons are is standard, as I don't want to do anything special on this part as of now.</p>
<p>I want to make a special note on the appAlias, one thing that I missed in the articles on simm.dk. You might want to add a key of the appAlias to the language xmls, which are located in /umbraco/config/lang/ (en.xml for the english language), otherwise the title on the treelist could end up being just [stat] (which isn't very pretty). Look for the following area tag:
<pre><code><area alias="sections"></code></pre> and add the following key <pre><code><key alias="stats">Statistics</key></code></pre></p>
<p>The next table is easy :-) Its just mapping the user(s) to the app/section - in this case I only have a single admin user who I want to give access.</p>
<a href="http://elpadrinodk.wordpress.com/files/2009/04/dbo-umbracouser2app.png"><img class="size-full wp-image-46" title="dbo-umbracouser2app" src="http://elpadrinodk.wordpress.com/files/2009/04/dbo-umbracouser2app.png" alt="umbracoUser2App table view" width="252" height="239" /></a>
<p>The default admin user id is zero, so just add that and the appAlias and the table editing is done.</p>
<p>Now on to the coding.</p>
<p>I started off by trying the code example in the last of the two articles on simm.dk, but couldn't actually get it to work so I browsed through the Umbraco source code to see how the User and Member sections are built. The way these two classes (loadUsers and loadMembers) are built is fairly simple and you can find them plus all the other classes, which loads treelists in Umbraco in the following folder: umbraco 4.0.1 source\umbraco\presentation\umbraco\Trees.
So to setup the code that loads the tree menu I created a class, which implements BaseTree - an abstract class that implements the ITree interface.
Example: <em>public class LoadStatTree : BaseTree</em></p>
<p>This implementation implies that the following three clases are implemented in the LoadStatTree class:
<ul>
<li>protected override void CreateRootNode(ref XmlTreeNode rootNode)</li>
<li>public override void RenderJS(ref StringBuilder Javascript)</li>
<li>public override void Render(ref XmlTree tree)</li>
</ul>
CreateRootNode simply does what the name implies - creates the root node for the current section. This can be implemented as follows:
<pre><code>rootNode.Icon = FolderIcon; //Standard icon for a folder
rootNode.OpenIcon = FolderIconOpen; //Standard icon for an open folder
rootNode.NodeType = TreeAlias; //Alias of the current tree
rootNode.NodeID = "-1"; //Start node should be set to minus in order to not interfer with the normal structure/nodetree.</code></pre></p>
<p>RenderJS is used to render Javascript output to the browser, which (from the actually section in Umbraco) is used to open the webform with the dashboard/TabView (right side of the screen). Here is an example:</p>
<pre><code>Javascript.Append(
@"
function openStats(id) {
parent.right.document.location.href = stats/statsDashboard.aspx?id=' + id;
}
");</code></pre>
<p>In the sample code, which you will find at the end of this post the webform that is opened simply shows a Hello World text. In order for the dashboard to look correct and in keeping with the look and feel of Umbraco it would be a good idea to implement the TabView control. In the next post I'll show you how it can be done and how I have used it.</p>
<p>The last method Render is used to programmatically create the tree menu using the XmlTree. For this example I have simply created four items in the menu using the XmlTreeNode like this:
<pre><code>XmlTreeNode xNode = XmlTreeNode.Create(this);
xNode.NodeID = "0";
xNode.Text = "Menu Item 1"; //Name
xNode.Action = "javascript:openStats(0);";
xNode.Icon = "folder.gif";
xNode.OpenIcon = "folder_o.gif";
tree.Add(xNode);</code></pre>
</p>
<p>Okay, so now the tree menu is in place and we can concentrate on the content and how and what of the analytics statistics to show on the dashboard.
While we wait for a finished version of the analytics data export api implemented in the .NET client library, this article is a good place to start for using the available api in C#: <a title="Introducing Google Analytics API with asp.net / C#" href="http://www.akamarketing.com/blog/103-introducing-google-analytics-api-with-aspnet-c.html" target="_blank">Introducing Google Analytics API with asp.net / C#</a>. It could of course be implemented using javascript, but not sure how well it would fit into the existing context of Umbraco. I have yet to try it out, but I fear that it will interfer with some of the existing javascript used by the Umbraco client and that the login functionality won't be too smooth. But maybe initializing the login with some jQuery appended to the browser might do the trick. Anyway, I will look into both possibilities untill the next post where there will be an actual implementation of the google analytics data api.</p>
<p><a title="Sitereactor.GoogleAnalytics.zip file" href="http://www.sitereactor.dk/media/Sitereactor.GoogleAnalytics.zip" target="_self">Here is the code sample</a>, which implements the above examples (and which will also be expanded with an implementation of google analytics).
And here is a screenshot of the results of the examples and code given in this post:</p>
<p><a href="http://elpadrinodk.wordpress.com/files/2009/04/umbraco-statistics.png"><img class="size-full wp-image-49" title="umbraco-statistics" src="http://elpadrinodk.wordpress.com/files/2009/04/umbraco-statistics.png" alt="Umbraco Statics Section" width="509" height="369" /></a></p>
<img src="http://blog.sitereactor.dk/via-feed/2009/04/26/google-analytics-for-umbraco-first-installment" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2009%2f04%2f26%2fgoogle-analytics-for-umbraco-first-installment&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2009/04/25/google-data-apis-and-analyticsGoogle Data APIs and Analytics<p><strong>Updated May 7th 2009 - <a href="#updated">see here</a>.</strong><br/>
I was real happy to see the annoucement of the <a title="Attention Developers: Google Analytics API Launched!" href="http://analytics.blogspot.com/2009/04/attention-developers-google-analytics.html" target="_blank">Google Analytics API</a> and anxious to get started.<br/>
As-is the API is available through the JavaScript and Java programming languages, as well as open to protocol interactions using raw XML and HTTP. This is all great, but i'm a .NET developer and would of course have liked to see the analytics API implemented in the <a title=".NET Client Library Developer's Guide" href="http://code.google.com/intl/da/apis/gdata/client-cs.html" target="_blank">Google Data APIs .NET Client Library</a>, as was done with the <a title="gdata-samples.java-1.31.1.zip" href="http://code.google.com/p/gdata-java-client/" target="_self">Java (1.31.1) version of the library</a>.</p>
<p>Since the full source for the Java version is available I thought I would have a look and maybe give a shot at porting it to C#. So I gave myself and the code 4 hours to see how far I could get implementing the analytics api in the .NET client library. Two hours in it was clear that my Java skills aren't as good as they used to be... I don't think I have actually touched Java since 2003. But I continued anyway, as the code spawned.</p>
<p>I created the Service class, which uses AccountFeed and DataFeed that uses AccountQuery and DataQuery respectively. And then there is the Entry class(es)... this is there I started to see double - wish I had a better recollection of Java even though it is very similar to C#. I compared alot of the Java and C# implementations of the Feed and Query classes of google calendar and contact, but two hours in my head started spinning...</p>
<p>Before I have a chance to have someone a bit more skilled in Java then me, I will proably not do to much more work on porting the analytics api. But if anyone should be interested in helping out, please give me a buzz. If you wanna review the current code and give me an indication of the direction, please feel free to do so.</p>
<p>Also, if you want to contribute please drop a comment.<br/>
I will be happy to do some more coding when I get back on track with how the structure should be in the C# version.</p>
<p><span style="text-decoration:line-through;"><a title="Google Data API Source - Library - Work in Progress" href="http://www.sitereactor.dk/media/Google Data API Source - Library - WIP.zip">Here is a zip-file of the project</a></span> (VS2005) - the source code that come with the <a title="Download the .NET library for the Google Data API" href="http://code.google.com/p/google-gdata/" target="_blank">Google .NET client library</a>.</p>
<p>I will write another post within the next couple of dayes, which goes a bit more into details about the code. AND hopefully have time to make some unit tests...
<a name="updated"> </a>
<strong>Updated May 7th 2009</strong>: Please download the new zip with the complete project - <a title="Google Data API Source - Library - UPDATED" href="http://www.sitereactor.dk/media/Google Data API Source - Library.zip">VS2005 client library including analytics</a>.
The previous file (and project) was very much a work in progress. I have continued the work by studying the other implementations and the existing Java implementation to build a .NET version of the analytics api, which is now complete.<br/>
It currently lacks unit tests, so if anyone wants to join in please feel free to do so. I probably won't have to to do unit testing for the next 3 weeks, but I do plan to write a follow-up post on how to use the api using .NET. Also, in the Java implementation the dxp:aggregates node is implementated so you can access it as an object - this is currently not implemented. Please let me know if you need it.</p>
<img src="http://blog.sitereactor.dk/via-feed/2009/04/25/google-data-apis-and-analytics" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2009%2f04%2f25%2fgoogle-data-apis-and-analytics&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2009-04-24T22:00:00Z2024-03-19T13:31:33ZMorten Christensen<p><strong>Updated May 7th 2009 - <a href="#updated">see here</a>.</strong><br/>
I was real happy to see the annoucement of the <a title="Attention Developers: Google Analytics API Launched!" href="http://analytics.blogspot.com/2009/04/attention-developers-google-analytics.html" target="_blank">Google Analytics API</a> and anxious to get started.<br/>
As-is the API is available through the JavaScript and Java programming languages, as well as open to protocol interactions using raw XML and HTTP. This is all great, but i'm a .NET developer and would of course have liked to see the analytics API implemented in the <a title=".NET Client Library Developer's Guide" href="http://code.google.com/intl/da/apis/gdata/client-cs.html" target="_blank">Google Data APIs .NET Client Library</a>, as was done with the <a title="gdata-samples.java-1.31.1.zip" href="http://code.google.com/p/gdata-java-client/" target="_self">Java (1.31.1) version of the library</a>.</p>
<p>Since the full source for the Java version is available I thought I would have a look and maybe give a shot at porting it to C#. So I gave myself and the code 4 hours to see how far I could get implementing the analytics api in the .NET client library. Two hours in it was clear that my Java skills aren't as good as they used to be... I don't think I have actually touched Java since 2003. But I continued anyway, as the code spawned.</p>
<p>I created the Service class, which uses AccountFeed and DataFeed that uses AccountQuery and DataQuery respectively. And then there is the Entry class(es)... this is there I started to see double - wish I had a better recollection of Java even though it is very similar to C#. I compared alot of the Java and C# implementations of the Feed and Query classes of google calendar and contact, but two hours in my head started spinning...</p>
<p>Before I have a chance to have someone a bit more skilled in Java then me, I will proably not do to much more work on porting the analytics api. But if anyone should be interested in helping out, please give me a buzz. If you wanna review the current code and give me an indication of the direction, please feel free to do so.</p>
<p>Also, if you want to contribute please drop a comment.<br/>
I will be happy to do some more coding when I get back on track with how the structure should be in the C# version.</p>
<p><span style="text-decoration:line-through;"><a title="Google Data API Source - Library - Work in Progress" href="http://www.sitereactor.dk/media/Google Data API Source - Library - WIP.zip">Here is a zip-file of the project</a></span> (VS2005) - the source code that come with the <a title="Download the .NET library for the Google Data API" href="http://code.google.com/p/google-gdata/" target="_blank">Google .NET client library</a>.</p>
<p>I will write another post within the next couple of dayes, which goes a bit more into details about the code. AND hopefully have time to make some unit tests...
<a name="updated"> </a>
<strong>Updated May 7th 2009</strong>: Please download the new zip with the complete project - <a title="Google Data API Source - Library - UPDATED" href="http://www.sitereactor.dk/media/Google Data API Source - Library.zip">VS2005 client library including analytics</a>.
The previous file (and project) was very much a work in progress. I have continued the work by studying the other implementations and the existing Java implementation to build a .NET version of the analytics api, which is now complete.<br/>
It currently lacks unit tests, so if anyone wants to join in please feel free to do so. I probably won't have to to do unit testing for the next 3 weeks, but I do plan to write a follow-up post on how to use the api using .NET. Also, in the Java implementation the dxp:aggregates node is implementated so you can access it as an object - this is currently not implemented. Please let me know if you need it.</p>
<img src="http://blog.sitereactor.dk/via-feed/2009/04/25/google-data-apis-and-analytics" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2009%2f04%2f25%2fgoogle-data-apis-and-analytics&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2009/03/28/sitecore-432-tips-and-tricksSitecore 4.3.2 tips and tricks<p>I expect that a majority of the Sitecore installations out there are upgraded to version 5.3 or 6.0, but a select few are still running version 4.3.1. I'am "fortunate" to work with a few solutions running this version, during which I have encountered a lack of references. Offcourse http://sdn4.sitecore.net is still online, but solutions for questions and issues that you would normally send to Sitecore support is hard to come by.</p>
<p>So my contribution this way around is some small tips and tricks that I have found usefull or as the common cause for problems in and around Sitecore v.4.3.1.</p>
<p><strong>SQLDatabaseOwner:</strong>
<setting name="SQLDatabaseOwner" value="[dbo]" />
When moving a solution from one host to another, this little setting might cause some serious pain if the DB owner changes. I have recently encountered this issue because the host that the customer was moving from used the username/login as the dbowener, whereas the new host simply used dbo. The database was backed-up by the old host and restored by the new host and everything seemed fine untill we tried to login or enter the sites of the solution.
It took me a day to figure out that there was a SQLDatabaseOwner-setting in the web.config and that the dbowner was now different from the one on the old host ... doh!</p>
<p><strong>Not able to create folders in the media library?</strong>
I can't remember how often I have talked with a customer who have had problems creating folders in the media library, either directly in Sitecore or through extranet. In 95-99% of the cases it helps adding the current site to IE's list of trusted sites - and allow the site to open pop-ups.
Would be nice to have some kind of macro that the clients could run on their computer to help setup the necessary settings in IE. Especially if they run/edit multiple sites.</p>
<p><strong>Strange Google Toolbar issue</strong>
While talking to a client about why the content editor wasn't working correctly, I discovered that disabling the google toolbar that the client had installed help enable the functions of the content editor. More specifically editing tables and using the left menu of the content editor was a problem. There most be some kind of javascript issue between the sitecore content editor and the installed toolbar. I haven't done any further testing on this issue, because I like to keep my development machine as clean as possible. But everytime I encounter a support issues involving strange behaviour in the content editor I tell the client to turn off any toolbars that they might have installed.</p>
<p>Maybe this will work for you too.</p>
<img src="http://blog.sitereactor.dk/via-feed/2009/03/28/sitecore-432-tips-and-tricks" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2009%2f03%2f28%2fsitecore-432-tips-and-tricks&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2009-03-27T23:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>I expect that a majority of the Sitecore installations out there are upgraded to version 5.3 or 6.0, but a select few are still running version 4.3.1. I'am "fortunate" to work with a few solutions running this version, during which I have encountered a lack of references. Offcourse http://sdn4.sitecore.net is still online, but solutions for questions and issues that you would normally send to Sitecore support is hard to come by.</p>
<p>So my contribution this way around is some small tips and tricks that I have found usefull or as the common cause for problems in and around Sitecore v.4.3.1.</p>
<p><strong>SQLDatabaseOwner:</strong>
<setting name="SQLDatabaseOwner" value="[dbo]" />
When moving a solution from one host to another, this little setting might cause some serious pain if the DB owner changes. I have recently encountered this issue because the host that the customer was moving from used the username/login as the dbowener, whereas the new host simply used dbo. The database was backed-up by the old host and restored by the new host and everything seemed fine untill we tried to login or enter the sites of the solution.
It took me a day to figure out that there was a SQLDatabaseOwner-setting in the web.config and that the dbowner was now different from the one on the old host ... doh!</p>
<p><strong>Not able to create folders in the media library?</strong>
I can't remember how often I have talked with a customer who have had problems creating folders in the media library, either directly in Sitecore or through extranet. In 95-99% of the cases it helps adding the current site to IE's list of trusted sites - and allow the site to open pop-ups.
Would be nice to have some kind of macro that the clients could run on their computer to help setup the necessary settings in IE. Especially if they run/edit multiple sites.</p>
<p><strong>Strange Google Toolbar issue</strong>
While talking to a client about why the content editor wasn't working correctly, I discovered that disabling the google toolbar that the client had installed help enable the functions of the content editor. More specifically editing tables and using the left menu of the content editor was a problem. There most be some kind of javascript issue between the sitecore content editor and the installed toolbar. I haven't done any further testing on this issue, because I like to keep my development machine as clean as possible. But everytime I encounter a support issues involving strange behaviour in the content editor I tell the client to turn off any toolbars that they might have installed.</p>
<p>Maybe this will work for you too.</p>
<img src="http://blog.sitereactor.dk/via-feed/2009/03/28/sitecore-432-tips-and-tricks" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2009%2f03%2f28%2fsitecore-432-tips-and-tricks&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2009/03/28/did-you-remember-tooDid you remember too....<p>Developers often forget to check-up on some of the simple things when delivering a solution - especially if no review is in place. I myself try to have a checklist with certain things that should be double checked before a solution is handed over to the customer.</p>
<p>Here are some of the small/big things that I find we or other developers have forgotten about when delivering a Sitecore solution.</p>
<p><strong>Admin Folder</strong><br />
The admin folder under the Sitecore folder often holds some scripts, which could make s solution vulnerable like reading the web.config file, dbbrowser (which offcourse is password protected, but still). When reading this you should ask yourself if you remembered to delete the folder, disallow anonymous access or protect it in some other way.</p>
<p><strong>Sitecore 5.3 Audrey user</strong><br />
This one is my favourite! The audrey user in Sitecore 5.3 solutions. I can't remember how many solutions I have had to delete or disable this user, because someone else forgot to. And thus leaving the solution wide open, because audrey has a blank password.<br />
And I could mention about 5-10 sitecore solutions that I have stumbled upon online with either the audrey, webmaster or developer user enabled. It is unfortunate that so many developers forget about these "shadow" user accounts.</p>
<p><strong>Sitecore 5.2 Webmaster and Developer user</strong><br />
My second favourite! Probably because there aren't so many 5.2 versions out there any more, but I have taken over a bunch (well, maybe 3-4) of 5.2-solutions, which had the webmaster and developer user enabled. Although the solution had been runing for 1-2 years!</p>
<p>Although these user accounts may give limited access, the "hacker" would still be able to see everything in your Sitecore client. And if you have modules like the mailinglist installed, well then you are exposing the email-address of all your subscribers, right?</p>
<img src="http://blog.sitereactor.dk/via-feed/2009/03/28/did-you-remember-too" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2009%2f03%2f28%2fdid-you-remember-too&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2009-03-27T23:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>Developers often forget to check-up on some of the simple things when delivering a solution - especially if no review is in place. I myself try to have a checklist with certain things that should be double checked before a solution is handed over to the customer.</p>
<p>Here are some of the small/big things that I find we or other developers have forgotten about when delivering a Sitecore solution.</p>
<p><strong>Admin Folder</strong><br />
The admin folder under the Sitecore folder often holds some scripts, which could make s solution vulnerable like reading the web.config file, dbbrowser (which offcourse is password protected, but still). When reading this you should ask yourself if you remembered to delete the folder, disallow anonymous access or protect it in some other way.</p>
<p><strong>Sitecore 5.3 Audrey user</strong><br />
This one is my favourite! The audrey user in Sitecore 5.3 solutions. I can't remember how many solutions I have had to delete or disable this user, because someone else forgot to. And thus leaving the solution wide open, because audrey has a blank password.<br />
And I could mention about 5-10 sitecore solutions that I have stumbled upon online with either the audrey, webmaster or developer user enabled. It is unfortunate that so many developers forget about these "shadow" user accounts.</p>
<p><strong>Sitecore 5.2 Webmaster and Developer user</strong><br />
My second favourite! Probably because there aren't so many 5.2 versions out there any more, but I have taken over a bunch (well, maybe 3-4) of 5.2-solutions, which had the webmaster and developer user enabled. Although the solution had been runing for 1-2 years!</p>
<p>Although these user accounts may give limited access, the "hacker" would still be able to see everything in your Sitecore client. And if you have modules like the mailinglist installed, well then you are exposing the email-address of all your subscribers, right?</p>
<img src="http://blog.sitereactor.dk/via-feed/2009/03/28/did-you-remember-too" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2009%2f03%2f28%2fdid-you-remember-too&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>http://blog.sitereactor.dk/2008/11/15/a-quiet-blogA quiet blog<p>I haven't written a post for a long time long, so I thought it was time for an update.</p>
<p>During my work with Umbraco I have tried to implement the member control, but haven't been able to get it to work. No matter what I do, it crashes :( ....and all I wanted was a simple newsletter signup type function. So, I created my own control, which couldn't be easier :-)
I will post and share my solution within a couple of days - hopefully someone out there can benefit from my solution ... or simply provide you with some inspiration.</p>
<img src="http://blog.sitereactor.dk/via-feed/2008/11/15/a-quiet-blog" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2008%2f11%2f15%2fa-quiet-blog&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>2008-11-14T23:00:00Z2024-03-19T13:31:33ZMorten Christensen<p>I haven't written a post for a long time long, so I thought it was time for an update.</p>
<p>During my work with Umbraco I have tried to implement the member control, but haven't been able to get it to work. No matter what I do, it crashes :( ....and all I wanted was a simple newsletter signup type function. So, I created my own control, which couldn't be easier :-)
I will post and share my solution within a couple of days - hopefully someone out there can benefit from my solution ... or simply provide you with some inspiration.</p>
<img src="http://blog.sitereactor.dk/via-feed/2008/11/15/a-quiet-blog" /> <div class='facebook'>
<iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.sitereactor.dk%2f2008%2f11%2f15%2fa-quiet-blog&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
</div>