<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mark Everard</title>
	<atom:link href="http://www.markeverard.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.markeverard.com/blog</link>
	<description>The only consistency is change itself</description>
	<lastBuildDate>Mon, 13 Feb 2012 07:00:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Role and user based property security for EPiServer</title>
		<link>http://www.markeverard.com/blog/2012/02/13/role-and-user-based-property-security-for-episerver/</link>
		<comments>http://www.markeverard.com/blog/2012/02/13/role-and-user-based-property-security-for-episerver/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 07:00:59 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[EPiServer]]></category>

		<guid isPermaLink="false">http://www.markeverard.com/blog/?p=701</guid>
		<description><![CDATA[One of the requirements I&#8217;ve often seen from some of our bigger (more enterprise) EPiServer clients &#8211; is the ability to add more granular levels of security to the page editing process. By default EPiServer allows the following security to be set up for page editing: Specify edit / admin rights for each page &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>One of the requirements I&#8217;ve often seen from some of our bigger (more enterprise) EPiServer clients &#8211; is the ability to add more granular levels of security to the page editing process. By default EPiServer allows the following security to be set up for page editing:</p>
<ul>
<li><strong>Specify edit / admin rights for each page</strong> &#8211; this allows you to define parts of the page tree that editors have permissions over. These permissions allow you to use the to specify one of the following access levels for each page (Read / Create / Change/ Delete / Publish / Administer) which dictates an editor&#8217;s ability to create / view and publish a page.</li>
<li><strong>Specify access levels required to view each edit mode tab</strong> &#8211; this allows you to group particular page properties onto particular tabs and show or hide those based on the access levels defined above.</li>
</ul>
<p>However &#8211; what is missing here is a more granular approach for individual properties on each page. For example allowing users in a &#8216;MetaEditor&#8217; role to update page meta data without being able to edit anything else.</p>
<p>EPiServer exposes an EditPanel.LoadedPage event which allows you to modify the loaded PageData object and modify it accordingly. One of the code properties available on an EPiServer property is DisplayEditUI which dictates whether the property is shown on the edit panel. Using the EditPanel.LoadedPage event to set property visibility in this way <a title="Hiding properties in edit mode " href="http://world.episerver.com/Modules/Forum/Pages/thread.aspx?id=41592" target="_blank">isn&#8217;t new</a>.  However now we have strongly typed PageType classes (thanks to <a title="EPiServer CMS PageTypeBuilder" href="http://pagetypebuilder.codeplex.com/" target="_blank">PageTypeBuilder</a>) we can revisit this and treat it as a true application cross cutting concern.</p>
<p>What I wanted to be able to achieve was a true attribute based security system, that worked with the standard ASP.Net Membership model allowing developers to set which roles and users would be able to view and modify each property by setting an code based attribute in the TypedPageData class.</p>
<p>The solution relies on the following pieces:</p>
<ul>
<li>An EPiServer Initialization module that hooks up a method to the EditPanel.LoadedPage event.</li>
<li>An Authorize attribute that you can place on PageTypeBuilder TypedPageData classes and properties.</li>
<li>A locator which will scan your current page type for each property and modify the DisplayEditUI property based on the attributes values.</li>
</ul>
<p>The following rules apply:</p>
<ul>
<li>A property level [Authorize] attribute will override any setting from a class level [Authorize] attribute</li>
<li>[Authorize] attributes can set either usernames or roles which will be honoured &#8211; see the example below.</li>
<li>The [Authorize] attribute allows you to specify whether you wish to apply the security rules to the built in-EPiServer properties as well as any you have defined through code.</li>
</ul>
<p>Here is an example usage:</p>
<pre class="brush: csharp; title: ; notranslate">
using System;
using FortuneCookie.PropertySecurity;
using PageTypeBuilder;
using EPiServer.Templates.AlloyTech.PageTypes.Tabs;

namespace EPiServer.Templates.AlloyTech.PageTypes.AlloyTech
{
   [PageType(&quot;74f6ef3e-407b-4132-8108-7fa831910197&quot;,
   Name = &quot;[AlloyTech] Standard page&quot;,
   Filename = &quot;/Templates/AlloyTech/Pages/Page.aspx&quot;,
   DefaultChildSortOrder = EPiServer.Filters.FilterSortOrder.None,
   Description = &quot;The standard page is the most commonly used page on the web site.&quot;,
   DefaultVisibleInMenu = true,
   AvailablePageTypes = new Type[] {  })]
   [Authorize(Principals = &quot;StandardPageEditorRole,mark.everard&quot;, ApplyToDefaultProperties = false)]
   public class StandardpagePageType : TypedPageData
   {
      [PageTypeProperty(EditCaption = &quot;Main body&quot;,
      HelpText = &quot;The main body will be shown in the main content area of the page&quot;,
      Tab = typeof(InformationTab),
      Type = typeof(EPiServer.SpecializedProperties.PropertyXhtmlString))]
      [Authorize(Principals = &quot;MainBodyEditorRole&quot;)]
      public virtual string MainBody { get; set; }

      [PageTypeProperty(EditCaption = &quot;Secondary body&quot;,
      HelpText = &quot;The contents of this property will be shown in the right column of the page, you can use both text and images for layout.&quot;,
      Tab = typeof(InformationTab),
      Type = typeof(EPiServer.SpecializedProperties.PropertyXhtmlString))]
      public virtual string SecondaryBody { get; set; }
   }
}
</pre>
<p>In this case &#8211; any editor will be able to see the default EPiServer page properties (PageName, PageCategories etc). Editors in the StandardPageEditorRoles and me (user with username mark.everard) will be able to view / edit the SecondaryBody property, and only editors in the MainBodyEditorRole will be able to modify the MainBody property.</p>
<p>At present,  I&#8217;m not too happy with the blanket approach to the default properties that the current version has. I&#8217;d be interested to hear any better ideas for dealing with this &#8211; or better yet send me a pull request to the <a title="FortuneCookie.PropertySecurity source code at GitHub" href="https://github.com/markeverard/FortuneCookie.PropertySecurity" target="_blank">project on GitHub</a>.</p>
<p>A Nuget package (FortuneCookie.PropertySecurity) built against .Net 4.0 / EPiServer 6R2 and PTB 2.0 has been uploaded for review to the <a title="EPiServer Nuget" href="http://nuget.episerver.com" target="_blank">EPiServer Nuget feed</a> (and so should be available soon). The source code is available on <a title="FortuneCookie.PropertySecurity source code at GitHub" href="https://github.com/markeverard/FortuneCookie.PropertySecurity" target="_blank">GitHub &#8211; https://github.com/markeverard/FortuneCookie.PropertySecurity</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.markeverard.com/blog/2012/02/13/role-and-user-based-property-security-for-episerver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>London EPiServer Meetup is on 23rd Feb</title>
		<link>http://www.markeverard.com/blog/2012/02/02/london-episerver-meetup-is-on-23rd-feb/</link>
		<comments>http://www.markeverard.com/blog/2012/02/02/london-episerver-meetup-is-on-23rd-feb/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 13:12:04 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[EPiServer]]></category>

		<guid isPermaLink="false">http://www.markeverard.com/blog/?p=693</guid>
		<description><![CDATA[We&#8217;re back for 2012. We&#8217;ll be having our first 2012 London EPiServer Developer Meetup, hosted at Fortune Cookie on Thursday 23rd February. Coming to talk to us this time will be: Meridium &#8211; who will be telling us all about the latest version of ImageVault &#8211; which is image and digital asset management module for [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re back for 2012. We&#8217;ll be having our first 2012 <a title="EPiServer developers in London" href="http://www.meetup.com/EPiServer-London/" target="_blank">London EPiServer Developer Meetup</a>, hosted at <a title="Digital Agency London" href="http://www.fortunecookie.co.uk" target="_blank">Fortune Cookie</a> on <strong>Thursday 23rd February.</strong></p>
<p><strong></strong>Coming to talk to us this time will be:</p>
<ul>
<li><a title="Meridium develop and distribute unique off the shelf add-on's for EPiServer and Microsoft SharePoint, resulting in a more powerful, efficient and easy to use plattform. " href="http://www.meridium.se/en/" target="_blank">Meridium</a> &#8211; who will be telling us all about the latest version of <a title="ImageVault" href="http://www.meridium.se/en/products/imagevault/overview/" target="_blank">ImageVault</a> &#8211; which is image and digital asset management module for EPiServer.</li>
<li><a title="Joel Abrahamsson" href="http://joelabrahamsson.com/" target="_blank">Joel Abrahamsson</a> &#8211; who should need little introduction. Joel has been instrumental in helping to improve the EPiServer development experience &#8211; through his open source projects such as <a title="Page Type Builder for EPiServer CMS" href="http://pagetypebuilder.codeplex.com/" target="_blank">PageTypeBuilder</a> and <a title="EPiAbstractions" href="http://epiabstractions.codeplex.com/" target="_blank">EPiAbstractions</a> (amongst others). Tonight though Joel will be wearing a different hat as he&#8217;ll be talking about his latest project. <a title="Truffler - an advanced search engine service" href="http://truffler.net/" target="_blank">Truffler.Net</a> &#8211; an advanced search engine and C# API</li>
<li>Plus &#8211; some other (to be confirmed) talks from our community members</li>
</ul>
<p>We will start <strong>presentations promptly at 7pm</strong> so please aim to get there for <strong>6:30pm</strong></p>
<p>There will be some food and drinks (kindly provided by <a title="EPiServer - software to build your online presence" href="http://www.episerver.com/" target="_blank">EPiServer</a> UK) and plenty of opportunity to network and talk tech.</p>
<p><a title="EPiServer Developer Meetup Spring 2012" href="http://www.meetup.com/EPiServer-London/events/50703712/" target="_blank">Full details are on the Meetup page</a> where you can sign up and RSVP to confirm attendance.</p>
<p>I hope you&#8217;ll agree that its a great program and also I think we&#8217;re incredibly lucky to have both Meridium and Joel flying over from Sweden to come and talk to us. Please show your support.</p>
<p>See you all on the 23rd.</p>
<p>Mark</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markeverard.com/blog/2012/02/02/london-episerver-meetup-is-on-23rd-feb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Missing Personalization Containers</title>
		<link>http://www.markeverard.com/blog/2012/01/06/missing-personalization-containers/</link>
		<comments>http://www.markeverard.com/blog/2012/01/06/missing-personalization-containers/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 16:00:36 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[EPiServer]]></category>

		<guid isPermaLink="false">http://www.markeverard.com/blog/?p=673</guid>
		<description><![CDATA[Combining Composer with Visitor groups on your EPiServer CMS6 R2 site gives your editors a powerful new way of working with &#8216;personalized&#8217; content, via the built-in Personalization Container Composer element. This function allows an editor to create a Composer area that will display a unique list of other Composer functions; depending on which visitor group [...]]]></description>
			<content:encoded><![CDATA[<p>Combining Composer with Visitor groups on your EPiServer CMS6 R2 site gives your editors a powerful new way of working with &#8216;personalized&#8217; content, via the built-in Personalization Container Composer element.</p>
<p>This function allows an editor to create a Composer area that will display a unique list of other Composer functions; depending on which visitor group a user is matched to in your site. This means that editors can personalise more than just page content, and can also adjust the page layout and functionality offered to each visitor, by dragging different Composer functions into each Personalized &#8216;slide&#8217; within the Personalization Container function.</p>
<h2>Upgrading a site to 6 R2</h2>
<p>After upgrading a few sites from CMS6 to CMS6R2, if you don&#8217;t check the option to import PageTypes during the upgrade process (which if you&#8217;re using PageTypeBuilder you might think you can skip) then  the Personalization container isn&#8217;t created, and you&#8217;ll be missing this piece of functionality.</p>
<p style="text-align: center;"><a href="http://www.markeverard.com/blog/wp-content/uploads/2012/01/personalizationcontainer11.png"><img class="size-full wp-image-681 aligncenter" title="personalization container" src="http://www.markeverard.com/blog/wp-content/uploads/2012/01/personalizationcontainer11.png" alt="personalization container" width="500" /></a></p>
<p>The easiest way to re-create this function is to export the composer PageType information from a &#8216;fresh&#8217; install of the Composer / R2 Alloy Tech site, and then import this into your site.</p>
<p>To save you the hassle of setting up a fresh demo site. I&#8217;ve included an exported Composer Personalization function as a download below (.xml format).</p>
<p><a title="Personalization Container" href="http://www.markeverard.com/blog/wp-content/uploads/2012/01/PersonalizationContainer1.zip" target="_blank">PersonalizationContainer.zip</a> &#8211; Import using EPiServer Composer Import / Export page.</p>
<p>You just need to import this using the Composer import feature in EPiServer Admin mode, and hey presto!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markeverard.com/blog/2012/01/06/missing-personalization-containers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A QueryString Visitor Group Criterion for EPiServer</title>
		<link>http://www.markeverard.com/blog/2011/11/07/a-querystring-visitor-group-criterion-for-episerver/</link>
		<comments>http://www.markeverard.com/blog/2011/11/07/a-querystring-visitor-group-criterion-for-episerver/#comments</comments>
		<pubDate>Mon, 07 Nov 2011 08:00:11 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[EPiServer]]></category>

		<guid isPermaLink="false">http://www.markeverard.com/blog/2011/11/28/query-string/</guid>
		<description><![CDATA[A common usage for advanced website analytics systems (Omniture, Google etc) is to track the effectiveness of external digital marketing campaigns such as banner ads, pay-per-click, sponsored search results&#8230;&#8230;.. Technically, this is normally achieved by adding a querystring key to the campaign link url and then tracking requests that use this key. So for example, [...]]]></description>
			<content:encoded><![CDATA[<p>A common usage for advanced website analytics systems (Omniture, Google etc) is to track the effectiveness of external digital marketing campaigns such as banner ads, pay-per-click, sponsored search results&#8230;&#8230;..</p>
<p>Technically, this is normally achieved by adding a querystring key to the campaign link url and then tracking requests that use this key. So for example, a Google Adwords campaign linking to your /products page would also include a querystring parameter of cid=marketingcampaign (example: http://yoursite.com/products?cid=marketingcampaign)</p>
<p>This querystring parameter can be picked up by your analytics implementation and used to track various aspects of the campaign.</p>
<p>On an EPiServer CMS6 R2 site, editors can use the Personalization/Visitor Group framework to provide a unique page experience per visitor, meaning that its possible to provide personalized content for each external marketing campaign on any page on your site.</p>
<p>Out-of-the-box, EPiServer provides a criterion which checks the incoming request Url or the page referrer, but not one that checks the querystring of the incoming request.</p>
<p>Creating a Visitor group criterion is <a title="Developing Custom Visitor Group Criteria" href="http://world.episerver.com/Documentation/Items/Tech-Notes/EPiServer-CMS-6/EPiServer-CMS-6-R2/Visitor-Groups-Creating-Custom-Criteria/" target="_blank">straight forward</a> &#8211; the only issue I&#8217;ve ever had trouble with; is when working on a .NET 4.0 project &#8211; <a title="Unable to implement abstract CriterionBase class in EPiServer " href="http://tedgustaf.com/en/blog/2011/4/criterionbase-no-suitable-method-found-to-override/" target="_blank">which was solved by Ted Nyberg.</a></p>
<p>I&#8217;ve created a simple QueryString Criterion which will provide a match based on the following:</p>
<ol>
<li>Whether the current request contains a user specified querystring key</li>
<li>and / or whether the current request contains a matching querystring key which also has the user specified value.</li>
</ol>
<p style="text-align: center;"><a href="http://www.markeverard.com/blog/wp-content/uploads/2011/11/querystringcriterion.png"><img class="aligncenter size-full wp-image-664" title="querystringcriterion" src="http://www.markeverard.com/blog/wp-content/uploads/2011/11/querystringcriterion.png" alt="" width="600" height="326" /></a></p>
<p>The source code is available as part of the <a title="Criteria Pack for EPiServer CMS on CodePlex" href="http://criteriapack.codeplex.com/" target="_blank">Criteria Pack on Codeplex</a> and of course there is a Nuget package on <a title="EPiServer Nuget feed" href="http://nuget.episerver.com/" target="_blank">Nuget.episerver.com</a> &#8211; (as soon as its been approved!)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markeverard.com/blog/2011/11/07/a-querystring-visitor-group-criterion-for-episerver/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>GiveCamp UK &#8211; a philanthropic software development microcosm</title>
		<link>http://www.markeverard.com/blog/2011/10/26/givecamp-uk-a-philanthropic-software-development-microcosm/</link>
		<comments>http://www.markeverard.com/blog/2011/10/26/givecamp-uk-a-philanthropic-software-development-microcosm/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 23:00:39 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://www.markeverard.com/blog/?p=623</guid>
		<description><![CDATA[I was lucky enough to participate in the first UK GiveCamp over the course of the last weekend. Wow, what an incredible experience! &#8220;Pair 120 developers with a collection of UK charities each with an IT need. Lock them in a room, feed with caffeine, cooked pig and sugar. Leave to bake over the course [...]]]></description>
			<content:encoded><![CDATA[<p>I was lucky enough to participate in the first <a title="GiveCamp UK" href="http://www.givecamp.org.uk/" target="_blank">UK GiveCamp</a> over the course of the last weekend.</p>
<p><strong>Wow, what an incredible experience!</strong></p>
<p><strong>&#8220;Pair 120 developers with a collection of UK charities each with an IT need. Lock them in a room, feed with caffeine, cooked pig and sugar. Leave to bake over the course of a weekend, peel open (and off the floor) on Sunday afternoon. Stand back and view the results.&#8221;</strong></p>
<p>The concept, execution and community was superb (see @stack72&#8242;s <a title="Thanks for GiveCampUK 2011" href="http://www.givecamp.org.uk/blog/thanks-givecampuk-2011" target="_blank">post</a> for a great list of thanks to those involved). A special thanks must also go to <a title="University College London" href="http://www.ucl.ac.uk/" target="_blank">UCL</a> for hosting the event and the generous <a title="GiveCamp UK Sponsors" href="http://www.givecamp.org.uk/sponsors" target="_blank">sponsors</a> for providing financial support and goodies! Come the Sunday afternoon &#8216;show and tell&#8217;, all of the project teams delivered some great work, much of which will make a tangible difference to each of the <a title="GiveCamp UK 2011 charities" href="http://www.givecamp.org.uk/blog/introducing-our-givecamp-uk-2011-charity-projects">UK charities</a> that got involved.</p>
<h4>&#8220;For the first time in living memory, someone cried because the software we did was so good.&#8221;</h4>
<p>What better testimonial than this? How many times have you had this reaction whilst working in your day job <img src='http://www.markeverard.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div id="attachment_641" class="wp-caption aligncenter" style="width: 650px"><img class="size-full wp-image-641  " title="GiveCamp UK 2011" src="http://www.markeverard.com/blog/wp-content/uploads/2011/10/6268685214_64dde3976a_z.jpg" alt="GiveCamp UK 2011" width="640" height="426" /><p class="wp-caption-text">GiveCamp UK 2011 - photo by Bert Craven</p></div>
<h2></h2>
<h2>A software development microcosm</h2>
<p>Whilst the time-scales involved in GiveCamp make it an unreal experience, at the end of the day it&#8217;s just software development, and so the normal rules and pitfalls of software development apply.</p>
<p>The thing that really struck me whilst working, is that is that it&#8217;s very easy to get carried away and lose focus from the end output. Whilst much of this could be attributed to the excitement, intensity (and tiredness) that surrounds the event. Actually it is just par for the (software development) course.</p>
<p>If you&#8217;re ever involved in a future GiveCamp (and by all means you should), here are some of my top tips&#8230;&#8230;</p>
<h3><strong>Deliver deliver deliver</strong></h3>
<p>Don&#8217;t overreach and try to build the <a title="Tower of Babel" href="http://en.wikipedia.org/wiki/Tower_of_Babel" target="_blank">Tower of Babel</a>. Solving one problem well, is better than half solving many problems.</p>
<p>This means you constantly have to question the solution to make sure that every design decision that is made, is made for the right reasons. Do you really need that level of granular security or additional view? Focus on your core functionality only.</p>
<p>Remember building &#8216;cool&#8217; stuff is not the output you&#8217;re looking for. Delivering a working solution that solves a real world problem is the ONLY goal&#8230;.</p>
<h3><strong>Engagement</strong></h3>
<p>As ever, it is important that you have a engaged stakeholder / product owner &#8211; who is actively available to field questions and define their needs (we all know this from our day jobs right?)</p>
<p>Remember though, the charities will be like a kid in a sweetshop &#8211; whilst you are their &#8216;knight in shining armour&#8217;. It&#8217;s ok to question their requirement wish-list. 41 hours is not a long time to deliver a solution. So always make sure you stay focussed on solving a real and well defined problem.</p>
<h3><strong>Keep it simple stupid</strong></h3>
<p>After the weekend, the solutions are handed over lock and key to the charities. You need to make sure they know what you&#8217;ve built for them and that they have enough information to support it going forwards. This could mean documentation! One team produced a 40 page document on how to install a SQL Server instance. The time spent on that document was way more important than any one additional software feature. Without it, the solution wouldn&#8217;t have even been deployed.</p>
<p>Remember &#8211; not everybody knows the things you as a developer takes for granted. Imagine that you&#8217;re delivering a solution for your dear <a title="My Nan's website!" href="http://www.cybernanna.co.uk" target="_blank">Nan</a>. That&#8217;s the level you should aim for.</p>
<h3><strong>Focus on what you know</strong></h3>
<p>When you&#8217;re under pressure to deliver, don&#8217;t go off-piste and make some &#8216;left-field&#8217; technology choices, so you can learn the latest new and shiny thing. Stick with what you know and what your team has capabilities with. Don&#8217;t worry, they&#8217;ll still be plenty of opportunity to learn.</p>
<p>For me I was working with ASP.NET / MVC but I still learnt more about Git, Entity Framework and what an awesome service <a title="AppHarbor" href="https://appharbor.com/" target="_blank">AppHarbor</a> provide.</p>
<h2>Future me</h2>
<p>I definitely wish I&#8217;d had <a title="'Future me'" href="http://2.bp.blogspot.com/_B63yhGbGh1I/SqEiLVZRtYI/AAAAAAAABBE/L7HqPaQ7tLA/s320/man+from+the+future.jpg" target="_blank">&#8216;future me&#8217;</a>, looking over my shoulder to remind of those things throughout the weekend (especially at 2am on Sunday morning when the adrenaline was wearing thin). However I also know that &#8216;future me&#8217; would have told me how proud he was of all of us who donated time and effort to help out.</p>
<p>Top stuff to all involved. Here&#8217;s to GiveCamp UK 2012!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markeverard.com/blog/2011/10/26/givecamp-uk-a-philanthropic-software-development-microcosm/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>What are you going to do about it?</title>
		<link>http://www.markeverard.com/blog/2011/09/12/what-are-you-going-to-do-about-it/</link>
		<comments>http://www.markeverard.com/blog/2011/09/12/what-are-you-going-to-do-about-it/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 08:00:35 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://www.markeverard.com/blog/2011/08/10/what-are-you-going-to-do-about-it/</guid>
		<description><![CDATA[As programmers, we&#8217;re very used to dealing with systems that are easy to understand and behave predictably (though I have worked with some codebases that are the exact opposite). Aside from code, the majority of our day-to-day interactions in the workplace are with team members, managers, clients and other colleagues. These human interactions are often [...]]]></description>
			<content:encoded><![CDATA[<p>As programmers, we&#8217;re very used to dealing with systems that are easy to understand and behave predictably (though I have worked with some codebases that are the exact opposite).</p>
<p>Aside from code, the majority of our day-to-day interactions in the workplace are with team members, managers, clients and other colleagues. These human interactions are often much harder to predict and respond to, but can have a much greater impact on your work environment, productivity and workplace happiness.</p>
<p>I attended <a title="@royosherove" href="http://twitter.com/royosherove" target="_blank">Roy Osherove&#8217;s</a> &#8216;Lead Better London&#8217; course held at <a title="Skills Matter " href="http://skillsmatter.com/" target="_blank">Skills Matter</a> back in July (and have been meaning to post a follow up about it ever since). Roy was / is a leading voice in the .NET community (though now he&#8217;s exploring what Ruby has to offer) and is the author of &#8216;<a title="The Art of Unit Testing" href="http://artofunittesting.com/" target="_blank">The Art of Unit Testing</a>&#8216;, which I consider to be THE book to read if you want to learn and become better at writing test code for your software. Roy regularly blogs about software team leadership issues over on <a title="Five Whys" href="http://www.5whys.com" target="_blank">FiveWhys.com</a>, and it is from there where I found out about the course.</p>
<p>The 2-day course caught my eye, as it was focussed on managing people and software teams rather than any specific project methodology, such as agile. Courses such as these give you a great opportunity to take a step back and view your workplace and your interactions within it in a different light, without the distraction of your &#8216;real work&#8217;. Roy is a great mentor and from the off, ably demonstrated the &#8216;ninja&#8217; leadership techniques he was trying to teach to us. His ability to listen, comprehend and consolidate a problem down to a fundamental is a skill I really want to perfect.</p>
<p>Things I took home with me from the course:</p>
<ul>
<li><strong>Confidence to Lead</strong>: motivation to tackle the issues I see day-to-day in my workplace</li>
<li><strong>How I react:</strong> ability to recognise my own and my colleagues behavioural traits and adjust my response to suit</li>
<li><strong>Who I want to be:</strong> a clearer idea of the characteristics I believe make a good leader and the willpower to make sure I follow the right path.</li>
</ul>
<div id="attachment_616" class="wp-caption aligncenter" style="width: 360px"><a href="http://www.markeverard.com/blog/wp-content/uploads/2011/08/lego-bricks.jpg"><img class="size-full wp-image-616 " title="lego-bricks" src="http://www.markeverard.com/blog/wp-content/uploads/2011/08/lego-bricks.jpg" alt="lego-bricks" width="350" height="263" /></a><p class="wp-caption-text">The plural of Lego is Lego, not Legos. The word Lego is a trademark and should be used as such. Here is a picture of some Lego bricks.</p></div>
<p>Roy is holding another <a title="Two Day Essential Skills Workshop for Software Team Leaders" href="http://5whys.com/courses" target="_blank">course in London this November (2011)</a> , so if you&#8217;re interested in learning how to lead and grow a software team, then you should do what you need to do to get yourself on his course.</p>
<p>For me, the challenge now is to take the skills I&#8217;ve learnt and put them into practise in my day-to-day work life.</p>
<p>Let the human experiment begin&#8230;&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markeverard.com/blog/2011/09/12/what-are-you-going-to-do-about-it/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating a custom ModelBinder allowing validation of injected composite models</title>
		<link>http://www.markeverard.com/blog/2011/07/18/creating-a-custom-modelbinder-allowing-validation-of-injected-composite-models/</link>
		<comments>http://www.markeverard.com/blog/2011/07/18/creating-a-custom-modelbinder-allowing-validation-of-injected-composite-models/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 07:00:47 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[EPiServer]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://www.markeverard.com/blog/?p=581</guid>
		<description><![CDATA[Model Binding &#8211; is the &#8216;auto-magic&#8217; step performed by the ASP.NET MVC framework to convert user submitted data (either http post values, querystring values or url route values) into a strongly typed model, used in your controller actions. Out of the box, the MVC framework also allows you to set validation attributes on your models [...]]]></description>
			<content:encoded><![CDATA[<p><a title="ASP.NET MVC Model Binding" href="http://weblogs.asp.net/nmarun/archive/2010/02/25/asp-net-mvc-model-binding.aspx" target="_blank">Model Binding</a> &#8211; is the &#8216;auto-magic&#8217; step performed by the ASP.NET MVC framework to convert user submitted data (either http post values, querystring values or url route values) into a strongly typed model, used in your controller actions.</p>
<p>Out of the box, the MVC framework also allows you to set <a title="Models and Validation in ASP.NET MVC" href="http://msdn.microsoft.com/en-us/library/dd410405.aspx" target="_blank">validation attributes</a> on your models which are inspected at the model binding stage, meaning that your controller actions can inspect the ModelState.IsValid property to assess whether the user submitted data meet expectations. This attribute based approach to validation provides a clean way to handle validation (a cross-cutting concern) without introducing additional code into your controller action.</p>
<p>One of the features needed when putting together the <a title="Fortune Cookie Personalization Engine for EPiServer " href="http://personalization.codeplex.com/">Fortune Cookie Personalization Engine for EPiServer</a> was to perform validation on a user submitted criteria value. As a reminder, in the context of the Personalization Engine, a criteria is an editor submitted string which is persisted and used by a ContentProvider to allow for a more granular method of content retrieval. For further background and explanation, check out one of my earlier posts &#8211; <a title="Personalization Engine – ContentProvider Criteria Models" href="http://www.markeverard.com/blog/2011/06/06/personalization-engine-contentprovider-criteria-models/" target="_blank">Personalization Engine &#8211; ContentProvider Criteria Models</a></p>
<p>In the full Personalization Engine domain model, criteria properties belong to IContentModel objects which are used to specify the user interface displayed to an editor to allow them to enter the criteria. Below is an example of a TextBoxCriteriaModel which renders as a textbox in the Admin interface.</p>
<p><a href="http://www.markeverard.com/blog/wp-content/uploads/2011/07/criteriamodel-validation.jpg"><img class="aligncenter size-full wp-image-586" title="criteriamodel-validation" src="http://www.markeverard.com/blog/wp-content/uploads/2011/07/criteriamodel-validation.jpg" alt="criteriamodel-validation-interface" width="571" height="294" /></a></p>
<p>The string value from this criteria input is posted to the controller action.  However as the type of IContentModel depends on the value of the ContentProvider dropdown, validation attributes cannot be set directly on the model passed to/from this view as different concrete IContentModel types need to be able to specify different validation rules.</p>
<p>To provide validation of the composite IContentModel using validation attributes, we have to hook in to one of the extension points of the ASP.NET MVC framework and create a custom model binder.</p>
<h3>Validating composite models</h3>
<p>Our <a title="ASP.NET Model Binder" href="http://odetocode.com/blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx">custom ModelBinder</a> needs to perform the following tasks:</p>
<ul>
<li>Bind the incoming data against an AdminViewModel (the model passed from the user interface shown above).</li>
<li>Obtain an instance of the specified ICriteriaModel and update the ICriteriaModel&#8217;s criteria property with the value posted by the form.</li>
<li>Validate the composite (and now populated) ICriteriaModel</li>
<li>Update the ModelState with the validation results from the composite model, along with the original parent model validation results</li>
</ul>
<p>As the custom ModelBinder needs to perform all of the existing validation and binding that the DefaultModelBinder would, I&#8217;ve chosen to inherit from it and add the additional composite model validation logic into the overriden BindModel method. An instantiated IContentModel is obtained from the AdminViewModel, and the <a title="ModelValidator class" href="http://msdn.microsoft.com/en-us/library/system.web.mvc.modelvalidator.aspx" target="_blank">ModelValidator</a> framework class allows us to validate the composite IContentModel, before updating the bindingContext.ModelState with an validation errors.</p>
<pre class="brush: csharp; title: ; notranslate">

public class CriteriaValidationModelBinder : DefaultModelBinder
{
   const string ValidationPropertyName = &quot;Criteria&quot;;

   public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
   {
      if (bindingContext.Model != null)
         return bindingContext.Model;

      var model = base.BindModel(controllerContext, bindingContext);

      var adminViewModel = model as AdminViewModel;
      if (adminViewModel == null)
         return model;

      var criteriaValue = bindingContext.ValueProvider.GetValue(ValidationPropertyName);
      adminViewModel.CriteriaModel.Criteria = criteriaValue != null ? criteriaValue.AttemptedValue : string.Empty;

      ModelMetadata modelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() =&gt; adminViewModel.CriteriaModel, typeof(ICriteriaModel));
      ModelValidator compositeValidator = ModelValidator.GetModelValidator(modelMetadata, controllerContext);

      foreach (ModelValidationResult result in compositeValidator.Validate(null))
         bindingContext.ModelState.AddModelError(ValidationPropertyName, result.Message);

      return model;
   }
}
</pre>
<p>Our custom ModelBinder can be hooked into our application in Global.asax, or in an <a title="EPiServer 6 Initialization" href="http://world.episerver.com/Documentation/Items/Tech-Notes/EPiServer-CMS-6/EPiServer-CMS-60/Initialization/" target="_blank">EPiServer IInitializableModule</a> using the following method.</p>
<pre class="brush: csharp; title: ; notranslate">

private void AddCriteriaValidationModelBinder()
{
    ModelBinders.Binders.Add(typeof(AdminViewModel), new CriteriaValidationModelBinder());
}
</pre>
<p>And that&#8217;s it&#8230;. ModelBinders are an important piece of the MVC framework, and in the majority of scenarios you can rely on the DefaultModeBinder to handle all of your requirements. However creating your own ModelBinder for more advanced requirements is pretty straightforward, depending on your requirements for your binder <img src='http://www.markeverard.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.markeverard.com/blog/2011/07/18/creating-a-custom-modelbinder-allowing-validation-of-injected-composite-models/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Personalization Engine &#8211; User Interface</title>
		<link>http://www.markeverard.com/blog/2011/07/07/personalization-engine-user-interface/</link>
		<comments>http://www.markeverard.com/blog/2011/07/07/personalization-engine-user-interface/#comments</comments>
		<pubDate>Thu, 07 Jul 2011 13:58:29 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[EPiServer]]></category>

		<guid isPermaLink="false">http://www.markeverard.com/blog/?p=514</guid>
		<description><![CDATA[One of the things I wanted to provide with the PersonalizationEngine framework was a series of simple User Interface elements , which would provide an easy way to demonstrate the Personalization Engine within front-end templates, and also provide developers with some simple examples of how to use the API. Lee Crowe has stepped up to [...]]]></description>
			<content:encoded><![CDATA[<p>One of the things I wanted to provide with the <a title="Personaliztion Engine for EPiServer" href="http://personalization.codeplex.com/" target="_blank">PersonalizationEngine framework </a>was a series of simple User Interface elements , which would provide an easy way to demonstrate the Personalization Engine within front-end templates, and also provide developers with some simple examples of how to use the API.</p>
<p><a title="Lee Crowe" href="http://world.episerver.com/System/Users-and-profiles/Community-Profile-Card/Croweman/" target="_blank">Lee Crowe</a> has stepped up to the mark and contributed these for me <img src='http://www.markeverard.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  &#8211; Thanks Lee</p>
<p>These User Interface elements are contained in a separate NuGet package: FortuneCookie.PersonalizationEngine.UI (dependent on FortuneCookie.PersonalizationEngine) ,which is available to download the <a title="EPiServer Nuget feed" href="http://nuget.episerver.com">EPiServer NuGet feed</a>.</p>
<p>The packages contains:</p>
<p>1) A custom property, (using <a title="Mulitple Selection Custom Property" href="http://world.episerver.com/Blogs/Lee-Crowe/Dates/2011/5/Multiple-Selection-Custom-Property-Base-Control/" target="_blank">Lee&#8217;s  multiple selection custom property</a>)  &#8211; which allow you to select a limited set of defined Personalization Engine content providers from which to return content. This allows you to have PersonalizationEngine rules defined on a page-by-page basis.</p>
<p>2) Two dynamic content controls (using the <a title="Dynamic Content Plugin Attribute" href="http://world.episerver.com/Documentation/Items/Tech-Notes/EPiServer-CMS-6/EPiServer-CMS-6-R2/Dynamic-Content/" target="_blank">new DynamicContentPlugin attribute</a>) &#8211; one which just displays PersonalizationEngine results from the full rule-set, and one which uses the custom property described above to allow a limited sub-set.</p>
<h3>FortuneCookie.PersonalizationEngine 1.1</h3>
<p>Additionally there is a new version of the core FortuneCookie.PersonalizationEngine, which contains some minor updates and enhancements</p>
<p>1) Added a new event that you can hook into to filter any results prior to them being returned from the PersonalizatioEngine. A good usage for this may be to filter by PageType definition in the case you don&#8217;t want your PersonalizationEngine results to contain a particular PageType</p>
<p>The example below will filter all Article pages from any content returned from a PagesWithPageNameContentProvider. The event is hooked on in Global.asax</p>
<pre class="brush: csharp; title: ; notranslate">

protected void Application_Start(Object sender, EventArgs e)
{
 PersonalizationEngine.OnContentProviderGetContent += PersonalizationEngine_OnContentProviderGetContent;
}

 private void PersonalizationEngine_OnContentProviderGetContent(ContentProviderEventArgs e)
 {
     if (e.ContentProviderType == typeof(PagesWithPageNameContentProvider))
          e.ContentProviderPages = e.ContentProviderPages.Where(p =&gt; p.PageTypeID != PageTypeResolver.Instance.GetPageTypeID(typeof(ArticlePageType)));
 }
</pre>
<p>2) Changed the call to DataFactory.Instance.GetPages, to an iterated call to DataFactory.Instance.GetPage in the CachedContentProviderBase class. Although the latter method is less performant &#8211; there is an <a title="DataFactory.GetPages bug" href="http://joelabrahamsson.com/entry/page-type-builder-131-released-some-fixes-for-r2#comments">acknowledged bug</a> in CMS6R2 which means that PageTypeBuilder does not hook into the GetPages method result meaning that returned results are unTyped.</p>
<p>Both of these packages are now available in the <a title="EPiServer NuGet Feed" href="http://nuget.episerver.com" target="_blank">EPiServer Nuget Feed</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.markeverard.com/blog/2011/07/07/personalization-engine-user-interface/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Serving videos to iOS devices from EPiServer VPP folders</title>
		<link>http://www.markeverard.com/blog/2011/07/05/serving-videos-to-ios-devices-from-episerver-vpp-folders/</link>
		<comments>http://www.markeverard.com/blog/2011/07/05/serving-videos-to-ios-devices-from-episerver-vpp-folders/#comments</comments>
		<pubDate>Tue, 05 Jul 2011 07:00:39 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[EPiServer]]></category>
		<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.markeverard.com/blog/?p=549</guid>
		<description><![CDATA[We recently launched an EPiServer site that made moderate, but high-profile usage of video and was also designed to be iOS device friendly &#8211; meaning no Flash and Html5 used to display video. Late on in development / integration we came across an issue where the mp4 / m4v videos file that were being served [...]]]></description>
			<content:encoded><![CDATA[<p>We recently launched an EPiServer site that made moderate, but high-profile usage of video and was also designed to be iOS device friendly &#8211; meaning no Flash and Html5 used to display video. Late on in development / integration we came across an issue where the mp4 / m4v videos file that were being served from an EPiServer VPP folder did not play when viewed on an iOS device. A little investigation found that the video files would play correctly when served natively from a static / non-content managed location.</p>
<p><em>(Note: If you&#8217;re serving a large amount of media content, then you&#8217;d be better off looking at a full media hosting solution rather than just serving from the EPiServer VPP).</em></p>
<h3>Http-Headers</h3>
<p>Obviously the files were identical, so the only difference was in how IIS was serving them. Below are the Http responses (captured using FireBug) for the identical .m4v video files, one served from a VPP, and one from a native path.</p>
<p><a href="http://www.markeverard.com/blog/wp-content/uploads/2011/06/vppm4v.gif"><img class="aligncenter size-full wp-image-551" title="vppm4v" src="http://www.markeverard.com/blog/wp-content/uploads/2011/06/vppm4v.gif" alt="" width="374" height="150" /></a></p>
<p><a href="http://www.markeverard.com/blog/wp-content/uploads/2011/06/staticm4v.gif"><img class="size-full wp-image-550 aligncenter" title="staticm4v" src="http://www.markeverard.com/blog/wp-content/uploads/2011/06/staticm4v.gif" alt="" width="375" height="165" /></a></p>
<p>The significant difference is the <strong>Accept-Ranges : bytes </strong>header.  Cool &#8211; so we can just add in this header to our response and we&#8217;re sorted right? <strong>WRONG I&#8217;m afraid!</strong></p>
<h3>HTTP/1.1 Accept-Ranges header field</h3>
<p>The <strong>Accept-Ranges</strong> response-header field allows the server to indicate its acceptance of range requests for a resource. This means that the server is open to partial downloads of files, and that clients (web-browsers) can download a limited &#8216;chunk&#8217; of a file by requesting a specific byte-range, for-example bytes 5001-9999.</p>
<p>Going back to our original issue of why the files didn&#8217;t play on an iOS device, a quick look on the <a title="Configure your server for iOS media" href="http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/CreatingVideoforSafarioniPhone/CreatingVideoforSafarioniPhone.html#//apple_ref/doc/uid/TP40006514-SW6">Apple developer notes</a> (via <a title="Does iPhone/iPad Safari require 'Accept-Ranges' header for video?" href="http://stackoverflow.com/questions/3397241/does-iphone-ipad-safari-require-accept-ranges-header-for-video">StackOverflow</a>) confirms that the web server needs to be configured to correctly handle byte-range requests. This explains why our file doesn&#8217;t work on an iOS device when served from an EPiServer VPP.</p>
<h3>EPiServer.Web.StaticFileHandler</h3>
<p>Our site was running using IIS7.5 in integrated pipeline mode, meaning  that pretty much the whole Request / Response pipeline is handled by  ASP.NET modules. Looking in the EPiServer site web.config you can see that the location path elements for VPP paths (Global /PageFiles etc) contain the HttpHandlers that are responsible for serving VPP filess. This is a bespoke EPiServer file handler implementation (EPiServer.Web.StaticFileHandler), which unlike the default IIS7 StaticFileHandler does not support Range-Requests <img src='http://www.markeverard.com/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<h3>The Solution</h3>
<p>Now you didn&#8217;t think that I&#8217;d explain all of this, without heroically coming up with a solution did you? Well I am providing a solution, but its hardly heroic as most of the hard work was done many years ago by <a title="Scott Mitchell" href="http://scottonwriting.net/ScottMitchell.asp">Scott Mitchell</a> &#8211; see <a title="Range Specific Requests in ASP.NET" href="http://dotnetslackers.com/articles/aspnet/Range-Specific-Requests-in-ASP-NET.aspx">Range-Specific Requests in ASP.NET</a>. In his post Scott explains and provides an example of how to roll a HttpHandler with support for range-specific HTTP requests.</p>
<p>I&#8217;ve inherited from the RangeRequestHandlerBase class that Scott posted in the above article, and overidden a few methods adding in some EPiServer specifics, such as mapping the request path to the physical VPP file path and also using the EPiServer.Web.MimeMapping class to handle mapping from an extension to a mime type.</p>
<pre class="brush: csharp; title: ; notranslate">

    public class RangeRequestFileHandler : RangeRequestHandlerBase
    {
        ///
        /// Returns a FileInfo object from the mapped VirtualPathProviderFile
        ///
        /// &lt;param name=&quot;context&quot; /&gt;
        ///
        public override FileInfo GetRequestedFileInfo(HttpContext context)
        {
            UnifiedFile file = GetFileInfoFromVirtualPathProvider(context);

            if (file == null)
                return null;

            PreventRewriteOnOutgoingStream();
            return new FileInfo(file.LocalPath);
        }

        private static UnifiedFile GetFileInfoFromVirtualPathProvider(HttpContext context)
        {
            return GenericHostingEnvironment.VirtualPathProvider.GetFile(context.Request.FilePath) as UnifiedFile;
        }

        ///
        /// Returns the MIME type from the mapped VirtualPathProviderFile
        ///
        /// &lt;param name=&quot;context&quot; /&gt;
        ///
        public override string GetRequestedFileMimeType(HttpContext context)
        {
            UnifiedFile file = GetFileInfoFromVirtualPathProvider(context);
            return MimeMapping.GetMimeMapping(file.Name);
        }

        ///
        /// Prevents episerver rewrite on outgoing stream.
        ///
        private void PreventRewriteOnOutgoingStream()
        {
            if (UrlRewriteProvider.Module != null)
                UrlRewriteProvider.Module.FURLRewriteResponse = false;
        }
</pre>
<p>This handler can be used to serve files from your VPP folders by adding the following configuration (IIS7 only folks &#8211; which if you&#8217;re not using then you really should be pushing for an upgrade!). This handler listed below is set up only to serve files of type .m4v &#8211; and remember that it does not provide any of the native EPiServer functionality for setting the staticFile cache expiration time.</p>
<pre class="brush: xml; title: ; notranslate">

&lt;location path=&quot;Global&quot;&gt;
     &lt;system.webServer&gt;
         &lt;handlers&gt;
              &lt;add name=&quot;webresources&quot; path=&quot;WebResource.axd&quot; verb=&quot;GET&quot; type=&quot;System.Web.Handlers.AssemblyResourceLoader&quot;/&gt;
              &lt;add name=&quot;videofiles&quot; path=&quot;*.m4v&quot; verb=&quot;*&quot; type=&quot;FortuneCookie.RangeRequestFileHandler.RangeRequestFileHandler, FortuneCookie.RangeRequestFileHandler&quot;/&gt;
              &lt;add name=&quot;wildcard&quot; path=&quot;*&quot; verb=&quot;*&quot; type=&quot;EPiServer.Web.StaticFileHandler, EPiServer&quot;/&gt;
         &lt;/handlers&gt;
      &lt;/system.webServer&gt;
      &lt;staticFile expirationTime=&quot;-1.0:0:0&quot;/&gt;
 &lt;/location&gt;
</pre>
<p>The full source code can be downloaded from the Code section at EPiServer World and a <a title="EPiServer Nuget Feed" href="http://nuget.episerver.com">NuGet</a> package is available that will auto-magically add in the code and configure your Global and PageFile VPP&#8217;s to serve .mp4, .m4v and .mov video files using the RangeRequestFileHandler.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markeverard.com/blog/2011/07/05/serving-videos-to-ios-devices-from-episerver-vpp-folders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Summer 2011 London EPiServer Meetup programme</title>
		<link>http://www.markeverard.com/blog/2011/07/02/summer-2011-london-episerver-meetup-programme/</link>
		<comments>http://www.markeverard.com/blog/2011/07/02/summer-2011-london-episerver-meetup-programme/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 11:37:49 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[EPiServer]]></category>

		<guid isPermaLink="false">http://www.markeverard.com/blog/?p=567</guid>
		<description><![CDATA[Our third London EPiServer Meetup is almost upon us &#8211; (this Thursday 7th July). We&#8217;ve got a theme of &#8216;Integration&#8217; this time and three of our members have kindly volunteered to talk: Paul Dunstone (from our hosts Rufus) &#8211; who will be talking about an EPiServer / SmartLogic integration that allowed for a rich and [...]]]></description>
			<content:encoded><![CDATA[<p>Our <a title="London EPiServer Developer Meetup Summer 2011" href="http://www.meetup.com/EPiServer-London/events/22066221/" target="_blank">third London EPiServer Meetup</a> is almost upon us &#8211; (this Thursday 7th July). We&#8217;ve got a theme of &#8216;Integration&#8217; this time and three of our members have kindly volunteered to talk:</p>
<ul>
<li>Paul  Dunstone (from our hosts Rufus) &#8211; who will be talking about  an  EPiServer / SmartLogic integration that allowed for a rich and   automated content classification. Paul previously <a href="http://world.episerver.com/Blogs/PaulD/Dates/2011/2/Implementing-the-semantic-web-in-EPiServer-6-using-Smartlogic-and-the-Google-Search-Appliance-by-Paul-Dunstone--Rufus-Leonard/">blogged</a> about this, but this will provide a great opportunity to understand more of the technical details.</li>
</ul>
<ul>
<li>Raghavendra  Bangalore-Govindaiah (aka Rags) &#8211; who will be  presenting an overview  of a COMET based pushed real-time data feed  integration with an  EPiServer site. For those of you who have never  heard of COMET before,  this should be interesting as COMET introduces a  new model of working  across the web. Rather than the traditional  request/response cycle it  uses long held http requests to allow the  server to PUSH content  updates directly to client web browsers.</li>
</ul>
<ul>
<li>Mark Everard -I&#8217;ll be giving an  overview of NuGet, Microsoft&#8217;s  package management tool  for ASP.NET / Visual Studio, including a look at  how to create your own  packages and integrate the creation process with  your project&#8217;s build  script using MSBuild.</li>
</ul>
<p>It again should be a great night and I hope to see you a lot of you there.</p>
<p>~ Mark</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markeverard.com/blog/2011/07/02/summer-2011-london-episerver-meetup-programme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

