<?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>timjroberts.com</title>
	<atom:link href="http://www.timjroberts.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.timjroberts.com</link>
	<description>timjroberts.com</description>
	<lastBuildDate>Thu, 18 Aug 2011 18:50:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Composing WCF services with MEF</title>
		<link>http://www.timjroberts.com/2011/08/wcf-services-with-mef/</link>
		<comments>http://www.timjroberts.com/2011/08/wcf-services-with-mef/#comments</comments>
		<pubDate>Thu, 18 Aug 2011 11:45:18 +0000</pubDate>
		<dc:creator>Tim Roberts</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[mef]]></category>

		<guid isPermaLink="false">http://www.timjroberts.com/?p=155</guid>
		<description><![CDATA[In an earlier post I showed how it was possible to extend MEF with a custom part creation policy that tied the lifetime of an exported part to the lifetime of a HTTP request or session. Another common requirement I&#8217;ve encountered many times is how to make WCF services compose-able, and in this post, I&#8217;ll [...]]]></description>
			<content:encoded><![CDATA[<p>In an earlier post I showed how it was possible to extend MEF with a custom part creation policy that tied the lifetime of an exported part to the lifetime of a HTTP request or session. Another common requirement I&#8217;ve encountered many times is how to make WCF services compose-able, and in this post, I&#8217;ll show you how I achieve this by writing a custom WCF instance provider.</p>
<p>An instance provider is what WCF uses to create a service object, so it makes sense to start there.  The IInstanceProvider interface defines two methods: GetInstance() (+1 overload) and ReleaseInstance(). We need to implement these so that our instance provider is MEF-aware and delegates the creation of the service object to MEF allowing it to satisfy all of the object&#8217;s import requirements through composition. Let&#8217;s begin then, by creating a new ComposedInstanceProvider class:</p>
<pre>
<pre class="brush: c#; ">

public class ComposedInstanceProvider : IInstanceProvider
{
   private readonly Type _serviceType;
   private readonly CompositionContainer _container;

   public ComposedInstanceProvider(Type serviceType, CompositionContainer container)
   {
      _serviceType = serviceType;
      _container = container;
   }

   public object GetInstance(InstanceContext context)
   {
      Export export = GetServiceExport();

      if (export == null)
         throw new InvalidOperationException();

      return export.Value;
   }

   public object GetInstance(InstanceContext context, Message message)
   {
      return GetInstance(context);
   }

   public void ReleaseInstance(InstanceContext context, object instance)
   {
      var disposable = instance as IDisposable;

      if (disposable != null)
         disposeable.Dispose();
   }

   private Export GetServiceExport()
   {
      var importDefinition
      = new ContractBasedImportDefinition(AttributedModelServices.GetContractName(_serviceType),
                                          AttributedModelServices.GetTypeIdentity(_serviceType),
                                          null,
                                          ImportCardinality.ZeroOrMore,
                                          true,
                                          true,
                                          CreationPolicy.Any);

      return _container.GetExports(importDefinition).FirstOrDefault();
   }
}
</pre>
</pre>
<p>This is essentially the core to making WCF service compose-able. The GetInstance() implementations that are invoked by WCF simply use a supplied CompositionContainer object to get an implementation of the service type. So far so good. However, we need to plug our custom instance provider into WCF, and that means implementing a few other WCF pieces. First we need a custom service behaviour (implementing IServiceBehavior), that allows us to extend the service with our compose-able behaviour. It does this by replacing the default instance provider with a ComposedInstanceProvider. I tend to think of service behaviours as aspects or cross-cutting features that are applied across the entire service, and compose-ability fits in nicely with this metaphor. We&#8217;ll also need a custom service host (a class derived from ServiceHost), that will apply the service behaviour to the service that it is hosting.</p>
<p>If we want to use .svc files to host our services in IIS, then we will also need to implement a custom service host factory (a class derived from ServiceHostFactory) which is responsible for creating instances of our derived ServiceHost class. Since we started in the middle of the stack with our custom instance provider, let&#8217;s move up a level and implement the custom service behaviour:</p>
<pre>
<pre class="brush: c#; ">

public class ComposedServiceBehavior : IServiceBehavior
{
   private readonly IInstanceProvider _instanceProvider;

   public ComposedServiceBehavior(Type serviceType, CompositionContainer container)
   {
      _instanceProvider = new ComposedInstanceProvider(serviceType, container);
   }

   public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
   { }

   public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase,
                                    Collection&lt;ServiceEndpoint&gt; endpoints, BindingParameterCollection bindingParameters)
   { }

   public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
   {
      foreach (ChannelDispatcherBase dispatcher in serviceHostBase.ChannelDispatchers)
      {
         var channelDispatcher = dispatcher as ChannelDispatcher;

         if (channelDispatcher == null)
            continue;

         foreach (EndpointDispatcher endpointDispatcher in channelDispatcher.Endpoints)
         {
            endpointDispatcher.DispatchRuntime.InstanceProvider = _instanceProvider;
         }
      }
   }
}
</pre>
</pre>
<p><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;">The behaviour implementation is again very simple. It creates a new ComposedInstanceProvider object using the supplied service type and CompositionContainer objects, and then replaces it with the default one in the endpoint dispatcher. Whenever WCF requires a service object to be created, it will now be using our own MEF-aware instance provider.</span></p>
<p><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;">Next, we need a custom service host that will apply our behaviour. Again, this class is very simple:</span></p>
<pre>
<pre class="brush: c#; ">

public class ComposedServiceHost : ServiceHost
{
   private readonly Type _serviceType;
   private readonly CompositionContainer _container;

   public ComposedServiceHost(Type serviceType, CompositionContainer container, params Uri[] baseAddresses)
      : base(serviceType, baseAddresses)
   {
      _serviceType = serviceType;
      _container = container;
   }

   protected override void OnOpening()
   {
      if (Description.Behaviors.Find&lt;ComposedServiceBehavior&gt;() == null)
      {
         Description.Behaviors.Add(new ComposedServiceBehavior(_serviceType, _container));
      }

      base.OnOpening();
   }
}
</pre>
</pre>
<p><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;">Our custom service host simply adds our ComposedServiceBehavior implementation to the service description if it has not already been done so. If you’re self-hosting your services in a Windows Service for example, then that&#8217;s all you need to do. Instead of creating a ServiceHost object when your application starts, you simply create a new ComposedServiceHost and pass in the CompositionContainer that it should use to satisfy the imports.</span></p>
<p><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;">If you use .svc files to host your WCF services in IIS, then you&#8217;ll need to use a custom service host factory that knows how to create ComposedServiceHost objects. Once you&#8217;ve implemented the custom service host factory as shown below:</span></p>
<pre>
<pre class="brush: c#; ">

public class ComposedServiceHostFactory : ServiceHostFactory
{
   protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
   {
      CompositionContainer container = ComposedServiceHosts.CompositionContainer;

      if (container == null)
         throw new InvalidOperationException();

      return CreateComposedServiceHost(serviceType, baseAddresses, container);
   }

   protected virtual ComposedServiceHost CreateComposedServiceHost(Type serviceType, Uri[] baseAddresses, CompositionContainer container)
   {
      return new ComposedServiceHost(serviceType, container, baseAddresses);
   }
}
</pre>
</pre>
<p>you can then modify the .svc file so that it uses it in the Factory attribute:</p>
<pre>
<pre class="brush: c#; ">

&lt;% @ServiceHost Service=&quot;FooService&quot; Factory=&quot;ComposedServiceHostFactory&quot; %&gt;
</pre>
</pre>
<p><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;">The factory is created by the WCF hosting runtime, which prevents us from passing in the CompositionContainer we need to compose our WCF services. To get around this, we&#8217;ll need a utility that provides this for us when the WCF runtime invokes the factory. You can see being used in the overridden CreateServiceHost() method above where it obtains the container from a ComposedServiceHosts utility class.</span></p>
<pre>
<pre class="brush: c#; ">

public static class ComposedServiceHosts
{
   private static CompositionContainer _container = null;

   internal static CompositionContainer CompositionContainer
   {
      get { return _container; }
   }

   public static void SetCompositionContainer(CompositionContainer container)
   {
      _container = container;
   }
}
</pre>
</pre>
<p><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;">We can then create our CompositionContainer in the Global.asax file (as we would normally do for any web-based project), and set-up the ComposedServiceHosts utility class so that it is used for all our composed service operations:</span></p>
<pre>
<pre class="brush: c#; ">

protected void Application_Start(object sender, EventArgs e)
{
   var catalogs
   = new AggregateCatalog(new[]
     {
        new AssemblyCatalog(typeof(FooService).Assembly),
        new AssemblyCatalog(GetType().Assembly)
     });

   ComposedServiceHosts.SetCompositionContainer(new CompositionContainer(catalogs));
}
</pre>
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.timjroberts.com/2011/08/wcf-services-with-mef/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Defining Web-scoped parts with MEF</title>
		<link>http://www.timjroberts.com/2011/02/web-scoped-mef-parts/</link>
		<comments>http://www.timjroberts.com/2011/02/web-scoped-mef-parts/#comments</comments>
		<pubDate>Wed, 16 Feb 2011 21:42:42 +0000</pubDate>
		<dc:creator>Tim Roberts</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[mef]]></category>

		<guid isPermaLink="false">http://www.timjroberts.com/?p=133</guid>
		<description><![CDATA[Out of the box, MEF provides you with limited options for defining the lifetime of exported parts. At its most basic you can define either transient or singleton lifetimes (CreationPolicy.NonShared and CreationPolicy.Shared respectively). We have to remember that although MEF can be used as an IoC container, it has been primarily designed to focus on managing composition rather than compile [...]]]></description>
			<content:encoded><![CDATA[<p>Out of the box, MEF provides you with limited options for defining the lifetime of exported parts. At its most basic you can define either transient or singleton lifetimes (CreationPolicy.NonShared and CreationPolicy.Shared respectively). We have to remember that although MEF can be used as an IoC container, it has been primarily designed to focus on managing <em>composition</em> rather than compile time dependencies. This goes part way to explaining why it doesn&#8217;t have broader lifetime management features baked in like other IoC container implementations. In short, out of the box, MEF has a much coarser level of granularity when it comes to to the management of dependencies.</p>
<p>When used in web-projects (either web-forms or MVC based), we will sometimes have the requirement to scope exported parts based on either the lifetime of a HTTP request, or an associated session. For example, we would like to be able to write code along the lines of this:</p>
<pre>
<pre class="brush: c#; ">

[Export(typeof(IFoo))]
[WebPartCreationPolicy(WebCreationPolicy.Session)]
public class SessionFoo : IFoo
{ }
</pre>
</pre>
<p>Obviously the [WebPartCreationPolicy] attribute is something new, and in this example we&#8217;re aiming for one SessionFoo object to exist for the lifetime of the HTTP session. Likewise, we could use the value WebCreationPolicy.Request to indicate that an export exists for the lifetime of the current HTTP request. The good news is that MEF is highly extensible, and our web-scoped lifetime requirements can be easily implemented as a new catalog which simply transforms the part definitions found in another catalog through composition.</p>
<p>The code for this post can be found on my private fork of the <a href="https://github.com/timjroberts/MefContrib" target="_blank">MefContrib project</a> (found at GitHub). In this fork I&#8217;ve introduced a new project called <a href="https://github.com/timjroberts/MefContrib/tree/master/src/MefContrib.Web" target="_blank">MefContrib.Web</a> to support these (and other) web-specifc features.</p>
<h3>Implementing a new WebScopedCatalog</h3>
<p>Once the exports have been marked up with a [WebPartCreationPolicy] attribute, we need to do three things:</p>
<ol>
<li>Use an existing catalog to include the exported parts in the eventual CompositionContainer. For example, we could use a DirectoryCatalog or an AssemblyCatalog</li>
<li>Pass the catalog into a newly created WebScopedCatalog</li>
<li>Pass the WebScopedCatalog into our CompositionContainer</li>
</ol>
<p>In web projects, we typically setup our CompositionContainer in the Global.asax. In the following example, we&#8217;ll use MVC:</p>
<pre>
<pre class="brush: c#; ">

public class MvcApplication : HttpApplication
{
    protected void Application_Start()
    {
       AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);

        var catalog = new WebScopedCatalog(new DirectoryCatalog(Server.MapPath(&quot;~\\bin&quot;)));
        var container = new CompositionContainer(catalog);

        ControllerBuilder.Current.SetControllerFactory(new CompositionControllerFactory(container));
    }
}
</pre>
</pre>
<p>It&#8217;s important to note that you can also pass an AggregateCatalog into a new WebScopedCatalog allowing exports from a collection of underlying catalogs to be adorned with web-scoped lifetime semantics. In the above example we then give the CompositionContainer object to an MVC controller factory that knows how to create <em>composed</em> controllers. The WebScopedCatalog queries the parts of the underlying catalog and for any part definition which has a WebCreationPolicy metadata value, creates a new WebScopedComposablePartDefinition object in its place. It then stores a list of these parts unioned with those that didn&#8217;t so that it can return them when queried by MEF. Basically it transforms the underlying list of composable part definitions so that where one has a web-creation policy, the ComposablePartDefinition is replaced with the new WebScopedComposablePartDefinition object instead:</p>
<pre>
<pre class="brush: c#; ">

public class WebScopedCatalog : ComposablePartCatalog
{
    private readonly IQueryable&lt;ComposablePartDefinition&gt; _parts;

    public WebScopedCatalog(ComposablePartCatalog partCatalog)
    {
        if (partCatalog == null)
            throw new ArgumentNullException(&quot;partCatalog&quot;);

        var webScopedParts
            = from part in partCatalog.Parts
                let exportDef = part.ExportDefinitions.First()
              where exportDef.Metadata.ContainsKey(&quot;WebCreationPolicy&quot;)
              select part;

        var nonScopedParts = partCatalog.Parts.Except(webScopedParts);

        _parts
            = webScopedParts.Select(p =&gt; new WebScopedComposablePartDefinition(p))
                .Union(nonScopedParts)
                .AsQueryable();
    }

    public override IQueryable&lt;ComposablePartDefinition&gt; Parts
    {
        get { return _parts; }
    }
}
</pre>
</pre>
<p>When MEF requires access to the part, the WebScopedComposablePartDefinition object simply inspects the value of the WebCreationPolicy metadata value, and then returns either a WebRequestScopedComposablePart or a WebSessionScopedComposablePart object based on that value:</p>
<pre>
<pre class="brush: c#; ">

public class WebScopedComposablePartDefinition : ComposablePartDefinition
{
    private readonly ComposablePartDefinition _partDefinition;

    internal WebScopedComposablePartDefinition(ComposablePartDefinition partDefinition)
    {
        _partDefinition = partDefinition;
    }

    public override ComposablePart CreatePart()
    {
        var policy = (WebCreationPolicy)_partDefinition.ExportDefinitions.First().Metadata[&quot;WebCreationPolicy&quot;];

        if (policy == WebCreationPolicy.Request)
            return new WebRequestScopedComposablePart(_partDefinition.CreatePart());
        else
            return new WebSessionScopedComposablePart(_partDefinition.CreatePart());
    }

    ...
}
</pre>
</pre>
<p>The implementation of these <em>web-scoped</em> aware composable parts look in either the HTTPContext object&#8217;s <em>session</em> or <em>current items</em> dictionaries for a created object and returns the object if one is found. If one isn&#8217;t found, it delegates to the underlying ComposablePart to create the object before storing it in the associated dictionary thereby caching the exported object at either the request or session boundary. For example, the WebSessionScopedComposablePart is defined as follows:</p>
<pre>
<pre class="brush: c#; ">

public class WebSessionScopedComposablePart : WebScopedComposablePart
{
    internal WebSessionScopedComposablePart(ComposablePart composablePart)
        : base(composablePart)
    { }

    public override object GetExportedValue(ExportDefinition definition)
    {
        string sessionKey = string.Format(&quot;__Session_{0}&quot;, Key);

        var obj = CurrentHttpContext.Session[sessionKey];

        if (obj != null)
            return obj;

        obj = CreatePart();

        CurrentHttpContext.Session[sessionKey] = obj;

        return obj;
    }
}
</pre>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.timjroberts.com/2011/02/web-scoped-mef-parts/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>The Ambient Context Pattern</title>
		<link>http://www.timjroberts.com/2010/12/the-ambient-context-pattern/</link>
		<comments>http://www.timjroberts.com/2010/12/the-ambient-context-pattern/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 13:53:38 +0000</pubDate>
		<dc:creator>Tim Roberts</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[patterns]]></category>

		<guid isPermaLink="false">http://www.timjroberts.com/?p=99</guid>
		<description><![CDATA[Ambient Context as a pattern has been around for a while, and although I&#8217;ve been making heavy use of it lately I haven&#8217;t really recognized it as a pattern until fairly recently. Like me, it is also very likely that you have also been making use of ambient context. If you&#8217;ve ever written code like [...]]]></description>
			<content:encoded><![CDATA[<p>Ambient Context as a pattern has been around for a while, and although I&#8217;ve been making heavy use of it lately I haven&#8217;t really recognized it as a pattern until fairly recently. Like me, it is also very likely that you have also been making use of ambient context. If you&#8217;ve ever written code like this:<span id="more-99"></span> </p>
<pre>
<pre class="brush: csharp; ">

using (var scope = new TransactionScope())
{
   using (var connection = new SqlConnection(...)
   {
      // Update the DB using connection
   }
   scope.Complete();
}
</pre>
</pre>
<p>or have made use of the OperationContext object in WCF for example, then you too have also been making use of  ambient context. When I say ambient context as a pattern has been around for a while, I mean it has been for at least two or three years. I&#8217;ve found a few good blog posts from around that time that do a good job in describing the ambient context pattern. <a href="http://aabs.wordpress.com/" target="_blank">The Wandering Glitch</a> has even gone as far as documenting <a href="http://aabs.wordpress.com/2007/12/31/the-ambient-context-design-pattern-in-net/" target="_blank">ambient context in pattern language</a> format and highlights several of its benefits, including the ability to define scopes, and also its use in providing cross cutting capabilities without having to introduce static variables or additional parameters into your method signatures. <span style="color: #000000;"><a href="http://blog.ploeh.dk/" target="_blank">Mark Seemann</a> also has a fantastic blog post on his old MSDN blog site which talks about <a href="http://blogs.msdn.com/b/ploeh/archive/2007/07/23/ambientcontext.aspx" target="_blank">using ambient context when implementing cross cutting aspects</a> of code.</span> </p>
<p><span style="color: #000000;">If you&#8217;re looking for an example then <a href="http://startbigthinksmall.wordpress.com/" target="_blank">Lars Corneliussen</a> has <a href="http://startbigthinksmall.wordpress.com/2008/04/24/nice-free-and-reusable-net-ambient-context-pattern-implementation/" target="_blank">documented one of his implementations</a>and has also made the source code available. What&#8217;s interesting about Lars&#8217; implementation is his introduction of a ThreadVariable&lt;T&gt; class which encapsulates the core of his ambient context implementation. Typical ambient context implementations use a static variable (marked with the ThreadStatic attribute) to represent the <em>context</em>. Lars&#8217; approach wraps this detail up and hides it which is something that I&#8217;ll probably borrow from in my future implementations. </span><span style="color: #000000;">Ambient context typically also makes use of a disposable <em>scope</em> class to define the <em>context</em>. This can be seen in the example shown above with the TransactionScope class. While the <em>scope</em> object is in &#8220;scope&#8221;, the underlying context is valid. When the <em>scope </em>class is disposed of then the context is also disposed of.</span> </p>
<p><span style="color: #000000;">I&#8217;ve been using ambient context quite a lot recently with some work that I have been doing with AutoMapper. I&#8217;ve been mapping a common data model into various other forms, including other outward bound data models and also dictionaries (which are then serialized into streams as INI files). <em>That&#8217;s right, you&#8217;ve guessed it; I&#8217;ve been interfacing with very old legacy applications</em>. As part of this work I have been implementing custom type converters which are simply objects that implement an interface and are then plugged into the AutoMapper mapping infrastructure through a .ConvertUsing() method call. Although AutoMapper is a fantastic utility it&#8217;s quite difficult to pass extrinsic data into the mapping process. I guess the assumption is that you should have everything you need from the source data model. Despite this, combining ambient context with AutoMapper, I have been able to pass external data and other objects into my custom type converters by writing code like this:</span> </p>
<pre>
<pre class="brush: csharp; ">

using (new MappingContextScope())
{
   MappingContext.Current.Formatter = new FooStreamFormatter();

   var iniStream = Mapper.Map&lt;FooDataModel, Stream&gt;(dataModel);
   SaveStream(iniStream, streamPath);
}
</pre>
</pre>
<p><span style="color: #000000;">The custom type converters that may or may not be used in this mapping operation will also have access to the MappingContext by accessing MappingContext.Current. In this example, I need to apply some custom formatting within the stream being generated from a FooDataModel object (for example, dates, times, decimal point formatting and so on). </span><span style="color: #000000;">Ambient context made this easy to implement and its structure lends itself well in helping to keep the code clean.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.timjroberts.com/2010/12/the-ambient-context-pattern/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Hello World (redux)</title>
		<link>http://www.timjroberts.com/2010/11/hello-world/</link>
		<comments>http://www.timjroberts.com/2010/11/hello-world/#comments</comments>
		<pubDate>Sun, 21 Nov 2010 12:00:52 +0000</pubDate>
		<dc:creator>Tim Roberts</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.timjroberts.com/?p=81</guid>
		<description><![CDATA[This is a little deja-vu! So, let me begin (again): This is the second time that I&#8217;ve run a blog at timjroberts.com. The first one is long gone now so let&#8217;s not dwell on it, but please, feel free to drop a comment on this post and explain the virtues of backing up your data to [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><em>This is a little deja-vu!</em></p>
<p style="text-align: left;">So, let me begin <em>(again):</em></p>
<p style="text-align: center;"><a href="http://www.timjroberts.com/wp-content/uploads/2010/11/dilbert-blog.png"><img class="alignnone size-full wp-image-80" title="dilbert-blog" src="http://www.timjroberts.com/wp-content/uploads/2010/11/dilbert-blog.png" alt="" width="505" height="228" /></a></p>
<p style="text-align: left;">This is the second time that I&#8217;ve run a blog at timjroberts.com. The first one is long gone now so let&#8217;s not dwell on it, but please, feel free to drop a comment on this post and explain the virtues of backing up your data to me. I really will appreciate it. Going forward, this will become my <em>little space</em> on the web where I can drop my thoughts on life as a professional Developer, the things that I&#8217;m working on in the moment which will become a reference for myself (and others who might read it), and anything else that might take my fancy along the way. This blog is an open house, you&#8217;re welcome back anytime and you&#8217;re free to drop me comments. Disagree with something I said, or have an opinion yourself? Let me know. <em>I love a good banter</em>.</p>
<p><a href="http://www.timjroberts.com/wp-content/uploads/2010/11/dilbert-blog.png"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.timjroberts.com/2010/11/hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

