<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom">
  <title>Jonas Follesø's World of Software</title>
  <id>http://jonas.follesoe.no/</id>
  <updated>2005-07-20T00:00:00Z</updated>
  <author>
    <name>Jonas Follesø</name>
  </author>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/follesoe" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="follesoe" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <title>Building testable WP7 apps using Microsoft.Practices.Phone.Adapters</title>
    <link href="http://jonas.follesoe.no/2012/04/28/testable-wp7-apps/" rel="alternate" />
    <id>http://jonas.follesoe.no/2012/04/28/testable-wp7-apps/</id>
    <published>2012-04-28T00:00:00Z</published>
    <updated>2012-04-28T00:00:00Z</updated>
    <author>
      <name>Jonas Follesø</name>
    </author>
    <summary type="html">&lt;p&gt;I’m a big believer in Test Driven Development as an effective practice that helps me write high quality, maintainable code. TDD is a practice I not only apply on larger enterprise applications, but something I try to do even on smaller mobile apps. In the day of the Apple App Store or Microsoft Marketplace you are relying on Apple or Microsoft to approve your application before it’s made available to your users. The process typically takes around a week – meaning it can potentially take a week before you fix a bug and the update is made available to the users. Introducing a bug in your mobile app can greatly hurt your rating in the Marketplace/App Store. Given the fact that you cannot simply upload a quick fix to the app stores, like you can on a web application, having solid testing for mobile applications is even more important than for other types of applications.&lt;/p&gt;




&lt;p&gt;With this in mind I was thrilled to see that Microsoft Pattern &amp;amp; Practices had taken this to hearth in their latest guidance for building Windows Phone 7 applications. The latest guide includes three major topics:&lt;/p&gt;

</summary>
    <content type="html">&lt;p&gt;I’m a big believer in Test Driven Development as an effective practice that helps me write high quality, maintainable code. TDD is a practice I not only apply on larger enterprise applications, but something I try to do even on smaller mobile apps. In the day of the Apple App Store or Microsoft Marketplace you are relying on Apple or Microsoft to approve your application before it’s made available to your users. The process typically takes around a week – meaning it can potentially take a week before you fix a bug and the update is made available to the users. Introducing a bug in your mobile app can greatly hurt your rating in the Marketplace/App Store. Given the fact that you cannot simply upload a quick fix to the app stores, like you can on a web application, having solid testing for mobile applications is even more important than for other types of applications.&lt;/p&gt;




&lt;p&gt;With this in mind I was thrilled to see that Microsoft Pattern &amp;amp; Practices had taken this to hearth in their latest guidance for building Windows Phone 7 applications. The latest guide includes three major topics:&lt;/p&gt;




&lt;ul&gt; 
    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hh848247.aspx"&gt;Developing a Windows Phone Application using the MVVM Pattern&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/gg490765.aspx"&gt;Developing an Advanced Windows Phone 7.5 App that Connects to the Cloud&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hh830877.aspx"&gt;Building Testable Windows Phone Applications&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I have previously written &lt;a href="http://jonas.follesoe.no/2008/07/19/youcard-re-visited-implementing-the-viewmodel-pattern/"&gt;several blog posts&lt;/a&gt; and given presentations on how the MVVM Pattern can help you separate the state and behavior of a piece of UI from the actual View-code. By moving state and behavior into a View Model-class with no UI dependencies, you can easily unit test the View Model in separation. If you would like to learn more about the MVVM-pattern I would strongly recommend my &lt;a href="http://jonas.follesoe.no/2010/03/07/mvvm-presentation-from-ndc2009-on-vimeo/"&gt;presentation from NDC 2009&lt;/a&gt;, or the &lt;a href="http://msdn.microsoft.com/en-us/library/hh848247.aspx"&gt;MVVM-chapter from the P&amp;amp;P WP7 Guidelines&lt;/a&gt;.
To ensure that the View Model classes can be tested independently it is important that they do not have any external dependencies that are hard to test. Whenever a View Model depends on some external resource, such as a web service, we introduce an interface for that dependency, and enable some form of Dependency Injection on the View Model so that we can replace the dependency with a stub or a mock during test.&lt;/p&gt;




&lt;p&gt;When working against the Windows Phone 7 APIs you will quickly realize that they are not very test-friendly. The API consists of several static or sealed classes that provide access to core phone-functionality such as Location Services, Compass, Camera, Gyroscope or other sensors. Since the classes are sealed, and do not implement an interface, there is no simple way to test code accessing these classes directly. The solution in such cases is typically to define your own interface mimicking the underlying API, and then implement an Adapter class delegating through to the underlying API.&lt;/p&gt;




&lt;p&gt;To demonstrate this principle I have created a simple application that displays your current location and compass heading. Such an application would need to use two classes that are hard to test; the &lt;a href="http://msdn.microsoft.com/en-us/library/system.device.location.geocoordinatewatcher.aspx"&gt;GeoCoordinateWatcher-class&lt;/a&gt; and the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.devices.sensors.compass(v=vs.92).aspx"&gt;Compass-class&lt;/a&gt;. A simple design, using the View Model pattern, would look something like this:&lt;/p&gt;


&lt;p&gt;&lt;img src="http://static.follesoe.no/testablewp7diagram1.jpg" alt="Class Diagram illustrating the MVVM pattern" /&gt;&lt;/p&gt;

&lt;p&gt;The problem with this design is how the TrackingViewModel-class is using the Compass-class and GeoCoordinateWatcher-class directly. It would be impossible to unit test the View Model, both because the Compass-sensor is not available in the simulator, but also just because of the fact that getting a location/compass reading takes time, and would make the tests slow and unreliable. Instead we are going to modify the design, and use the abstractions introduced by the Patterns &amp;amp; Practices team. We change our TrackingViewModel-class to depend on ICompass and IGeoCoordinateWatcher. At test-time we pass in mock-implementations of these two classes to enable testability, while at run-time we use the adapter classes GeoCordinateWatcherAdapter and CompassAdapter.&lt;/p&gt;


&lt;p&gt;&lt;img src="http://static.follesoe.no/testablewp7diagram2.jpg" alt="Class Diagram illustrating the MVVM pattern with testable Compass and GeoLocationWatcher classes" /&gt;&lt;/p&gt;

&lt;p&gt;With this small change we can now write unit tests for the TrackingViewModel-class. Here is an example of some of the tests I have written for the View Model.&lt;/p&gt;




&lt;script src="https://gist.github.com/2520932.js?file=TrackingViewModelTest.cs"&gt;&lt;/script&gt;




&lt;p&gt;Many people assume that you have to use an IoC-container to use Dependency Injection. That is not the case. My personal preference is to not introduce an IoC-container until it is necessary, and instead use overloaded constructors. The TrackingViewModel-class has two constructors, one that accepts the ICompass and IGeoCoordinateWatcher interfaces as parameters, and one default constructor that calls the parameterized constructor passing in the adapter classes as default. This enables testability, yet at the same time keeps the architecture of the application simple.&lt;/p&gt;




&lt;script src="https://gist.github.com/2520938.js?file=TrackingViewModelCtr.cs"&gt;&lt;/script&gt;




&lt;p&gt;In this example I only use two of the wrapped classes provided by the Microsoft.Practices.Phone.Adapters project. In addition the project contains adapters for the following classes in the Windows Phone 7.1 SDK:&lt;/p&gt;




&lt;table&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;Wrapper&lt;/th&gt;
            &lt;th&gt;Implements&lt;/th&gt;
            &lt;th&gt;Abstracted Class&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;AccelerometerAdapter&lt;/td&gt;
            &lt;td&gt;IAccelerometer&lt;/td&gt;
            &lt;td&gt;Accelerometer&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ApplicationFrameNavigationService&lt;/td&gt;
            &lt;td&gt;INavigationService&lt;/td&gt;
            &lt;td&gt;PhoneApplicationFrame&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;CameraCaptureTaskAdapter&lt;/td&gt;
            &lt;td&gt;ICameraCaptureTask&lt;/td&gt;
            &lt;td&gt;CameraCaptureTask&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;CompassAdapter&lt;/td&gt;
            &lt;td&gt;ICompass&lt;/td&gt;
            &lt;td&gt;Compass&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;            
            &lt;td&gt;GeoCordinateWatcherAdapter&lt;/td&gt;
            &lt;td&gt;GeoCoordinateWatcher, IGeoCoordinateWatcher&lt;/td&gt;
            &lt;td&gt;GeoCoordinateWatcher&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;GyroscopeAdapter&lt;/td&gt;
            &lt;td&gt;IGyroscope&lt;/td&gt;
            &lt;td&gt;Gyroscope&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;IsolatedStorageFacade&lt;/td&gt;
            &lt;td&gt;IIsolatedStorageFacade&lt;/td&gt;
            &lt;td&gt;IsolatedStorageFileAdapter, IsolatedStorageFileStreamAdapter&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;IsolatedStorageFileAdapter&lt;/td&gt;
            &lt;td&gt;IIsolatedStorageFile&lt;/td&gt;
            &lt;td&gt;IsolatedStorageFile&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;IsolatedStorageFileStreamAdapter&lt;/td&gt;
            &lt;td&gt;IsolatedStorageFileStream, IIsolatedStorageFileStream&lt;/td&gt;
            &lt;td&gt;IsolatedStorageFileStream&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;            
            &lt;td&gt;MessageBoxAdapter&lt;/td&gt;
            &lt;td&gt;IMessageBox&lt;/td&gt;
            &lt;td&gt;MessageBox&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;MotionAdapter&lt;/td&gt;
            &lt;td&gt;IMotion&lt;/td&gt;        
            &lt;td&gt;Motion&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;AccelerometerSensorReading&lt;/td&gt;
            &lt;td&gt;ISensorReading&lt;/td&gt;
            &lt;td&gt;AccelerometerReading&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;CompassSensorReading&lt;/td&gt;
            &lt;td&gt;ISensorReading&lt;/td&gt;
            &lt;td&gt;CompassReading&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;GyroscopeSensorReading&lt;/td&gt;
            &lt;td&gt;ISensorReading&lt;/td&gt;
            &lt;td&gt;GyroscopeReading&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;            
            &lt;td&gt;MotionSensorReading&lt;/td&gt;
            &lt;td&gt;ISensorReading&lt;/td&gt;
            &lt;td&gt;MotionReading&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;PhotoResultTaskEventArgs&lt;/td&gt;
            &lt;td&gt;TaskEventArgs&lt;/td&gt;
            &lt;td&gt;PhotoResult&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;




&lt;p&gt;The Microsoft.Practices.Phone.Adapters project can be added as a &lt;a href="https://nuget.org/packages/Microsoft.Practices.Phone.Adapters.Source"&gt;NuGet-package&lt;/a&gt;. The package adds the interfaces/adapter files to your project, and you can choose to delete the once you don’t need (it is not a pre-compiled package). If you &lt;a href="http://www.microsoft.com/download/en/details.aspx?id=28804"&gt;download the example project from the MSDN site&lt;/a&gt; you also get a set of pre-written mock-classes you can use in your Unit Test project to mock the different interfaces.&lt;/p&gt;




&lt;p&gt;If you want to learn more about making your WP7 applications testable I would strongly encourage you to &lt;a href="http://msdn.microsoft.com/en-us/library/gg477144.aspx"&gt;read the full guide on this on MSDN&lt;/a&gt;. As I mentioned in the introduction, testability is just one aspect of the Patterns &amp;amp; Practices Guide for WP7, and I will be covering other areas in a later blog post.&lt;/p&gt;




&lt;p&gt;The example application for this blog post is available at &lt;a href="https://github.com/follesoe/TestableGeoTrackerDemo"&gt;https://github.com/follesoe/TestableGeoTrackerDemo&lt;/a&gt;.&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=7xjmfakES-U:rqTXZuNeJ9s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=7xjmfakES-U:rqTXZuNeJ9s:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=7xjmfakES-U:rqTXZuNeJ9s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?i=7xjmfakES-U:rqTXZuNeJ9s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=7xjmfakES-U:rqTXZuNeJ9s:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/follesoe/~4/7xjmfakES-U" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <title>QR code scanning on Windows Phone 7.5 using ZXlib</title>
    <link href="http://jonas.follesoe.no/2011/07/22/qr-code-scanning-on-windows-phone-75-using-zxlib/" rel="alternate" />
    <id>http://jonas.follesoe.no/2011/07/22/qr-code-scanning-on-windows-phone-75-using-zxlib/</id>
    <published>2011-07-22T00:00:00Z</published>
    <updated>2011-07-22T00:00:00Z</updated>
    <author>
      <name>Jonas Follesø</name>
    </author>
    <summary type="html">&lt;p&gt;One of the big new features of Windows Phone 7.5 (code named Mango) is direct camera access.
Having access to the camera stream enables several new scenarios, such as in-app QR and barcode scanning,
augmented reality applications or custom looking photo camera UI. There are some good resources on how
to use the new APIs to access the camera in Mango, but I haven’t found any complete examples of how to
implement a QR code scanner, which is what I am going to do in this blog post.&lt;/p&gt;

</summary>
    <content type="html">&lt;p&gt;One of the big new features of Windows Phone 7.5 (code named Mango) is direct camera access.
Having access to the camera stream enables several new scenarios, such as in-app QR and barcode scanning,
augmented reality applications or custom looking photo camera UI. There are some good resources on how
to use the new APIs to access the camera in Mango, but I haven’t found any complete examples of how to
implement a QR code scanner, which is what I am going to do in this blog post.&lt;/p&gt;




&lt;p&gt;Mango adds two API to access the camera. You can either use the webcam APIs introduced in Silverlight 4,
or you can use the new PhotoCamera class introduced in Mango. I’m not going to cover all the details of
the two APIs; instead I will focus on how to solve the scenario of implementing a QR scanner. If you want
to learn more about the Silverlight 4 APIs for accessing the camera I would highly recommend &lt;a href="http://kodierer.blogspot.com/2010/06/push-and-pull-silverlight-webcam.html"&gt;Rene Schulte’s
detailed blog post&lt;/a&gt;. For information on the PhotoCamera API I would recommend &lt;a href="http://msdn.microsoft.com/en-us/library/hh202956(v=VS.92).aspx"&gt;this MSDN article showing how
to build a camera application for Windows Phone&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;When starting on the task of building a QR scanner one of the first things I did was to research different
open source libraries to do the image recognition. Thankfully there are multiple libraries available,
but the &lt;a href="http://code.google.com/p/zxing/"&gt;ZXing library from Google&lt;/a&gt; seems to be one of the most popular. The ZXing library is ported to multiple
programming libraries, and supports a wide variety of 1D/2D codes (QR, Code128, Code39, EAN and many more).
There is a C# port of the library, which has later been &lt;a href="http://silverlightzxing.codeplex.com/"&gt;ported to Silverlight and Windows Phone 7&lt;/a&gt;.
So the actual task of writing the QR scanner is to integrate the ZXing library with the Mango camera API.&lt;/p&gt;




&lt;p&gt;The XAML code for the scanner consists of 4 main components. A Rectangle is used as to display the viewfinder
video stream. The way you hook the camera up to the rectangle is through a VideoBrush. A VidoBrush let you
paint any XAML element using a video source of some kind. To control orientation (depending on landscape or portrait)
a CompositeTransform is added to the VideoBrush. This transform lets us programmatically set the rotation of
the video brush to match the rotation of the camera. The final component is a ListBox used to display the
text decoded from the QR codes.&lt;/p&gt;




&lt;script src="https://gist.github.com/1098650.js?file=QRScanner.xml"&gt;&lt;/script&gt;




&lt;p&gt;In the code behind file we need to add some initialization code. In the constructor we instantiate an
ObservableCollection which will be the ItemsSource of the ListBox. Whenever a QR code is successfully
scanned the result is added the collection, which in turn will update items in the ListBox. We also create a
DispatcherTimer that will execute every 250 millisecond. On each tick we will try to decode the image for
any QR codes. In the OnNavgiatedTo method we instantiate the PhotoCamera class and hook the Initialized
event for the camera. We also set the source of the VideoBruch created in XAML to the photo camera.
This will start drawing whatever the camera sees on the Rectangle. We also hook the ShutterKeyHalfPressed
event to focus.&lt;/p&gt;




&lt;script src="https://gist.github.com/1098656.js?file=MainPage.cs"&gt;&lt;/script&gt;




&lt;p&gt;When the photo camera is initialized we run some more setup code. The code needs to access the width and height
of the preview resolution, so it cannot run before the camera is initialized. Next we create an instance of
PhotoCameraLumianceSource. This is a custom class extending the LumianceSource class from the ZXing library.
This class is responsible for extracting luminance data from any image. Since you could have different image formats,
ZXing has mad the framework extensible by providing a base class you can extend with the code needed to get
luminance data from the specific image format you are working with. Next we create an instance of the QRCodeReader.
This is the class responsible for decoding the image to scan for a QR code. The ZXing library comes with multiple
readers, so if you want to read Code128 bar codes you simply create a Code128Reader instead. Finally we set the
rotation of the preview VideoBrush and start the timer.&lt;/p&gt;




&lt;script src="https://gist.github.com/1098661.js?file=MainPage.cs"&gt;&lt;/script&gt;




&lt;p&gt;Every time the timer ticks the ScanPreviewBuffer is executed. This method is responsible for getting the image
data from the photo camera and tries to decode it. The photo camera offers multiple methods to get images.
You can either capture a full resolution image, or you can get the preview buffer. Capturing a full resolution
image would be too slow for a computer vision application, but thankfully we got methods to access the preview buffer.
You can get the preview buffer as either ARGB format or YCbCr format. The camera sensor is internally using YCbCr,
so getting it as Argb format would require conversion. If you only care about luminance (the Y in YCbCr)
there is a convenient method giving you the Y component of the YCbCr format. This is perfect as this is exactly
what we need to pass to the ZXing library. Rene Schutle got a good blog post going into the details of Argb vs YCbCr.&lt;/p&gt;




&lt;p&gt;The GetPreviewBufferY method takes a byte array as its parameter and will populate this byte array with the
luminance data from the preview buffer. We pass in the PreviewBufferY property from our luminance source class
(which will be explained later). Once we have captured the luminance data we create a HybridBinarizer and a
BinaryBitmap. They are part of the ZXing library. I haven’t worked enough with ZXing yet to fully understand
the architecture, but these classes are steps the luminance data pass through before being passed to the decode
method of the QRCodeReader. If the decode is successful the decoded text is added to the ObservableCollection,
which in turn will update the ListBox. The QRCodeReader decode method will throw an exception if it is not able
to decode the image, so we need to wrap the code in a try-catch block.&lt;/p&gt;




&lt;script src="https://gist.github.com/1098663.js?file=MainPage.cs"&gt;&lt;/script&gt;




&lt;p&gt;The PhotoCameraLumianceSoure implements the LumianceSource base class used by the ZXing library. The class is
responsible for exposing the luminance data for the image format you are working with. Conveniently the PhotoCamera
class gives us the luminance data directly, so implementing the class does not take much code. There are basically
one property and one method you need to implement. The Matrix property simply returns the luminance data for the
complete image. The getRow method returns the luminance data for a given row. Both the property and the method
simply read the PreviewBufferY byte array which is filled every time the timer calls the GetPreviewBufferY method.&lt;/p&gt;




&lt;script src="https://gist.github.com/1098666.js?file=PhotoCameraLuminanceSource.cs"&gt;&lt;/script&gt;




&lt;p&gt;So how does this work in practice? Below is a YouTube video demonstrating the QR scanner. As you can see it’s
fairly quick and accurate (well, at least on bright images of my computer screen). I have not yet tested it in the wild,
and the ZXing library offers many customizations to fine tune how you want the scanner to behave, but at least this
demonstrates how you can combine ZXing and the Mango PhotoCamera API to implement a QR scanner in less than 150
lines of user code!&lt;/p&gt;




&lt;iframe width="640" height="510" src="http://www.youtube.com/embed/kZOtzRMMpws?rel=0&amp;amp;hd=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;




&lt;p&gt;The complete QR code scanner &lt;a href="https://github.com/follesoe/WinPhoneSamples/tree/master/ScannerDemo"&gt;example code is available on github&lt;/a&gt;.&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=AtLPggPVRes:exMRWgjFCrE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=AtLPggPVRes:exMRWgjFCrE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=AtLPggPVRes:exMRWgjFCrE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?i=AtLPggPVRes:exMRWgjFCrE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=AtLPggPVRes:exMRWgjFCrE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/follesoe/~4/AtLPggPVRes" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <title>Cross platform .NET mobile apps talk at NDC 2011</title>
    <link href="http://jonas.follesoe.no/2011/07/22/cross-platform-mobile-ndc-2011/" rel="alternate" />
    <id>http://jonas.follesoe.no/2011/07/22/cross-platform-mobile-ndc-2011/</id>
    <published>2011-07-22T00:00:00Z</published>
    <updated>2011-07-22T00:00:00Z</updated>
    <author>
      <name>Jonas Follesø</name>
    </author>
    <summary type="html">&lt;p&gt;Earlier this summer I gave a presentation at NDC 2011 about writing cross platform mobile 
applications using C# and .NET. At the time of the presentation the future of MonoTouch and 
Mono for Android was uncertain, but with the &lt;a href="http://blog.xamarin.com/2011/07/18/first-press-release/"&gt;recent news of Xamarin gaining ownership&lt;/a&gt;
of the products, the future of C# on iOS and Android looks brighter than ever.&lt;/p&gt;

</summary>
    <content type="html">&lt;p&gt;Earlier this summer I gave a presentation at NDC 2011 about writing cross platform mobile 
applications using C# and .NET. At the time of the presentation the future of MonoTouch and 
Mono for Android was uncertain, but with the &lt;a href="http://blog.xamarin.com/2011/07/18/first-press-release/"&gt;recent news of Xamarin gaining ownership&lt;/a&gt;
of the products, the future of C# on iOS and Android looks brighter than ever.&lt;/p&gt;




&lt;p&gt;The presentation covers 8 concrete strategies for designing applications for 
maximum code re-use across all three platforms, as well as techniques to make development
more productive and hassle-free. The strategies/techniques covered in the presentation are:&lt;/p&gt;


&lt;ol&gt;
    &lt;li&gt;Portable Class Libraries&lt;/li&gt;
    &lt;li&gt;Linked Files&lt;/li&gt;
    &lt;li&gt;The "Project Linker" tool&lt;/li&gt;
    &lt;li&gt;VSMonoTouch to open MonoTouch projects in Visual Studio&lt;/li&gt;
    &lt;li&gt;Pre-processor directives&lt;/li&gt;
    &lt;li&gt;Abstract common functionality&lt;/li&gt;
    &lt;li&gt;Leverage MVVM on all platforms&lt;/li&gt;
    &lt;li&gt;Use pre-built abstractions such as MonoMobile.Extensions&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;All the presentations from NDC 2011 are available in a &lt;a href="http://ndc2011.no/userfiles/NDC2011_mp4.torrent"&gt;torrent file&lt;/a&gt;, 
but to make the presentation more discoverable and accessible I have uploaded it to my Vimeo 
account. The slides are available on SlideShare.&lt;/p&gt;




&lt;iframe src="http://player.vimeo.com/video/26701639?portrait=0&amp;amp;color=ff0179" width="671" height="377" frameborder="0"&gt;&lt;/iframe&gt;


&lt;p&gt;&lt;a href="http://vimeo.com/26701639"&gt;Cross platform .NET mobile apps in practice&lt;/a&gt; from &lt;a href="http://vimeo.com/follesoe"&gt;Jonas Follesø&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;




&lt;div style="width:425px" id="__ss_8657552"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/follesoe/cross-platform-mobile-apps-using-net" title="Cross platform mobile apps using .NET"&gt;Cross platform mobile apps using .NET&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse8657552" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=crossplatformmobileappsusing-net-110721173336-phpapp01&amp;stripped_title=cross-platform-mobile-apps-using-net&amp;userName=follesoe" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse8657552" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=crossplatformmobileappsusing-net-110721173336-phpapp01&amp;stripped_title=cross-platform-mobile-apps-using-net&amp;userName=follesoe" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/follesoe"&gt;Jonas Follesø&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=Ys3DiEYF5vk:bXn0ybqjhOg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=Ys3DiEYF5vk:bXn0ybqjhOg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=Ys3DiEYF5vk:bXn0ybqjhOg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?i=Ys3DiEYF5vk:bXn0ybqjhOg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=Ys3DiEYF5vk:bXn0ybqjhOg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/follesoe/~4/Ys3DiEYF5vk" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <title>WP7, iOS &amp; Android: Is .NET the platform to rule them all?</title>
    <link href="http://jonas.follesoe.no/2011/03/20/mono-across-all-platforms/" rel="alternate" />
    <id>http://jonas.follesoe.no/2011/03/20/mono-across-all-platforms/</id>
    <published>2011-03-20T00:00:00Z</published>
    <updated>2011-03-20T00:00:00Z</updated>
    <author>
      <name>Jonas Follesø</name>
    </author>
    <summary type="html">&lt;p&gt;&lt;em&gt;&lt;img width="120" hspace="10" src="http://static.follesoe.no/TheDeveloperCover.jpg" align="left" /&gt;The following blog post is an article originally published in the most current issue 
of "The Developer", a magazine distributed to Norwegian developers. 
The article discusses the exciting possibility to use C# and .NET across the 
three major smart phone platforms WP7, iOS and Android. Since the magazine is only 
distributed in Norway I decided to post it on my blog as well. 
You can either read it here, or &lt;a href="http://static.follesoe.no.s3.amazonaws.com/Is .NET the platform to rule them all.pdf"&gt;download a PDF version of the article&lt;/a&gt; as 
presented in the magazine.&lt;br/&gt;&lt;/em&gt;&lt;/p&gt;

</summary>
    <content type="html">&lt;p&gt;&lt;em&gt;&lt;img width="120" hspace="10" src="http://static.follesoe.no/TheDeveloperCover.jpg" align="left" /&gt;The following blog post is an article originally published in the most current issue 
of "The Developer", a magazine distributed to Norwegian developers. 
The article discusses the exciting possibility to use C# and .NET across the 
three major smart phone platforms WP7, iOS and Android. Since the magazine is only 
distributed in Norway I decided to post it on my blog as well. 
You can either read it here, or &lt;a href="http://static.follesoe.no.s3.amazonaws.com/Is .NET the platform to rule them all.pdf"&gt;download a PDF version of the article&lt;/a&gt; as 
presented in the magazine.&lt;br/&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;If you ask me 2010 was the year of the mobile app. Everyone was talking about
them, from consumers around the lunch table, to CEOs in the boardrooms. It was
like 1999 all over again; only this time it was not about building websites, but to
have some kind of offering in one of the major mobile app stores. According to
the analysts at IDG the huge interest in mobile apps is not just a fad. They expect
download numbers to grow from 10.9 billion in 2010 to 76.9 billion in 2014. As
a result app revenue will surpass $35 billion the same year. In short, mobile is
going to play an important role for software developers over the next few years.&lt;/p&gt;




&lt;p&gt;As a .NET developer you are faced with some tough decisions. Which platform
do you bet on? How do you get your skills up-to-date quickly enough? Do you
suck it up and learn CocoaTouch and Objective-C to target the popular Apple iOS
devices? Should you learn Java and go for the Android? Or should you skip two
of the most popular mobile platforms and stick to C# and develop for the newly
released Windows Phone 7?&lt;/p&gt;




&lt;p&gt;Businesses face some of the same decisions, as they need to decide where to
focus their resources and efforts. Should they target all the major platforms,
or focus only on iOS devices? What will be the cost of maintaining these
applications over time? A quick search for “DnB NOR” (Norway’s largest financial
services group) in the iTunes App Store reveals that they already have five apps
available. This is for iOS devices alone. In addition, two of the applications are
also available in Android Market. With seven apps published already one can
start to imagine what the cost and technical challenges of maintaining them over
time will be.&lt;/p&gt;




&lt;p&gt;When choosing which technology to use for implementing mobile apps, the
popular choices have traditionally been either web-based apps written in HTML,
CSS &amp; JavaScript, or alternatively fully native apps tailored to a specific platform.
Both alternatives have their pros and cons. Web-based applications might be
quicker to build and easier to make cross-platform, but the drawback is that you
do not have full access to the phone specific APIs. And it is harder to provide the
same high fidelity user experience as a native app offers. With native apps, the
challenge might be a steep learning curve and having to re-implement the same
app across different platforms.&lt;/p&gt;




&lt;p&gt;With the release of MonoTouch at the end of 2009 Novell introduced a new
way to build apps for iOS devices. Against all odds the programmers at Novell
had found a way to bring Mono, the open source implementation of .NET,
to the iPhone without requiring unlocking or jail-breaking the device. The
MonoTouch framework enables developers to build native iOS apps using the C# programming 
language using many of the core .NET libraries. MonoTouch is designed to conform to the 
strict requirements set by Apple for App Store eligibility. MonoTouch allows .NET 
developers to take advantage of their existing skills, reuse existing code and libraries, 
making the transition to the iOS platform easier.&lt;/p&gt;




&lt;p&gt;Instead of porting Windows Forms or WPF to the iPhone, MonoTouch provides
a thin .NET layer on top of the native CocoaTouch APIs giving your applications
a fully native look and feel, making them indistinguishable from the traditional
iPhone applications. And where it makes sense, MonoTouch will provide
standard .NET APIs instead of the CocoaTouch counterparts. For example, you
use standard ADO.NET to talk to SQLite databases on the device, and XML can
be processed using the familiar System.Xml.Linq API. MonoTouch apps are
developed using the MonoDevelop IDE, an experience very similar to that of
Visual Studio.&lt;/p&gt;




&lt;p&gt;Managed runtimes like the CLR (Common Language Runtime) and JVM (Java
Virtual Machine) typically use just-in-time (JIT) compilation, where byte
code is translated to machine code at runtime. Apple forbids the inclusion of
mechanisms that enable execution of arbitrary third party code, effectively
blocking the use of non-standard runtimes, interpreters and virtual machines.
The developers at Novell were able to overcome this obstacle by using an
alternative ahead-of-time (AOT) compilation model where .NET Common
Intermediate Language (CIL) is compiled directly to native code. AOT compiles
the MonoTouch applications to native executables that do not rely on a virtual
machine to run.&lt;/p&gt;




&lt;p&gt;With the success of MonoTouch, Novell decided to take a similar approach to
bring .NET to the Android platform. MonoDroid provides .NET bindings against
the Android API, as well as a .NET-to-Java interop mechanism. Android is a
more open platform than iOS and allows for JIT compilation of code. The Mono
runtime will run side-by-side with the Dalvik runtime, providing direct access
to many of the core Linux OS APIs through the standard .NET libraries like
System, System.IO and System.Net. Just as with MonoTouch, a MonoDroid app
will use the native UI toolkit, giving the user the same great user experience as
with any other native app. MonoDroid integrates with Visual Studio making the
experience of writing apps for Android even more familiar.&lt;/p&gt;




&lt;p&gt;Both MonoTouch and MonoDroid expose the same subset of the .NET core
API, which is a subset based on the Silverlight API. This is the same subset
Microsoft chose to use for their newly released Windows Phone 7. This means
that there now exists a core set of APIs that are the same across the three major
smartphone platforms. By carefully crafting an application in such a way as to
separate business logic from user interface code, it is possible to reuse code and
libraries across all platforms. I expect patterns to emerge over time that describe
how to best structure your code for maximum reuse across the different mobile
platforms.&lt;/p&gt;




&lt;p&gt;For many developers mobile apps have made it fun to program again. Within
weeks you can go from an idea to an app that can be downloaded by millions of
users through one of these app stores. Who knows, something that starts of as
a hobby project might turn out to be the next Angry Birds. No matter if you do
app development as a hobby or professionally there is nothing more gratifying as
seeing your first app being available in one of the app stores.
Happy app-ing everybody!&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=SicUnY42ZFI:eCYGGmc9rVA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=SicUnY42ZFI:eCYGGmc9rVA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=SicUnY42ZFI:eCYGGmc9rVA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?i=SicUnY42ZFI:eCYGGmc9rVA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=SicUnY42ZFI:eCYGGmc9rVA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/follesoe/~4/SicUnY42ZFI" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <title>I’m joining BEKK</title>
    <link href="http://jonas.follesoe.no/2010/08/01/im-joining-bekk/" rel="alternate" />
    <id>http://jonas.follesoe.no/2010/08/01/im-joining-bekk/</id>
    <published>2010-08-01T00:00:00Z</published>
    <updated>2010-08-01T00:00:00Z</updated>
    <author>
      <name>Jonas Follesø</name>
    </author>
    <summary type="html">&lt;p&gt;Tomorrow will be my first day as a &lt;a href="http://www.bekk.no"&gt;BEKK&lt;/a&gt; employee. I will be joining the BEKK Trondheim office as a senior consultant. After three good years in Capgemini I decided it was time for a change. I will continue to work on different projects as a consultant, but my role in BEKK also gives me some dedicated time for other activities like exploring new technologies, preparing presentations, writing articles etc. I will continue to be just as involved in the developer community as I am today, and I already got some cool speaking gigs lined up for the fall. More on that later.&lt;/p&gt;

</summary>
    <content type="html">&lt;p&gt;Tomorrow will be my first day as a &lt;a href="http://www.bekk.no"&gt;BEKK&lt;/a&gt; employee. I will be joining the BEKK Trondheim office as a senior consultant. After three good years in Capgemini I decided it was time for a change. I will continue to work on different projects as a consultant, but my role in BEKK also gives me some dedicated time for other activities like exploring new technologies, preparing presentations, writing articles etc. I will continue to be just as involved in the developer community as I am today, and I already got some cool speaking gigs lined up for the fall. More on that later.&lt;/p&gt;




&lt;p&gt;BEKK have &lt;a href="http://open.bekk.no/"&gt;some really talented people working for them&lt;/a&gt;, and over the years I’ve noticed how they’ve been one of the early adopters of agile processes and techniques (XP, Scrum, Kanban, TDD/BDD etc), as well as new technologies (Ruby on Rails, Cucumber) here in Norway. I hope that by working for BEKK I’ll get a chance to broaden my technical experience, and perhaps do some projects on alternative platforms (I’m sure .NET will continue to be my main platform  so don’t worry about me leaving the .NET community).&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=AE95JbeRLm8:wTCilfVMaqY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=AE95JbeRLm8:wTCilfVMaqY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=AE95JbeRLm8:wTCilfVMaqY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?i=AE95JbeRLm8:wTCilfVMaqY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=AE95JbeRLm8:wTCilfVMaqY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/follesoe/~4/AE95JbeRLm8" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <title>NDC2010 - Patterns and techniques for building Windows Phone 7 applications</title>
    <link href="http://jonas.follesoe.no/2010/07/07/ndc2010---patterns-and-techniques-for-building-windows-phone-7-applications/" rel="alternate" />
    <id>http://jonas.follesoe.no/2010/07/07/ndc2010---patterns-and-techniques-for-building-windows-phone-7-applications/</id>
    <published>2010-07-07T00:00:00Z</published>
    <updated>2010-07-07T00:00:00Z</updated>
    <author>
      <name>Jonas Follesø</name>
    </author>
    <summary type="html">&lt;p&gt;Last month I was lucky enough to both attend and speak at the Norwegian Developer Conference. It was a fantastic conference, and the conversations following the conference are still &lt;a href="http://search.twitter.com/search?q=%23ndc2010"&gt;buzzing on twitter&lt;/a&gt; and &lt;a href="http://blog.scottbellware.com/2010/06/praise-for-norwegian-developers.html"&gt;in the blogosphere&lt;/a&gt;. For me NDC must have been one of the best conferences I’ve ever attended, offering a diverse range of topics from some of the best speakers in the industry. I’m humbled to be invited to speak at such a great event.&lt;/p&gt;

</summary>
    <content type="html">&lt;p&gt;Last month I was lucky enough to both attend and speak at the Norwegian Developer Conference. It was a fantastic conference, and the conversations following the conference are still &lt;a href="http://search.twitter.com/search?q=%23ndc2010"&gt;buzzing on twitter&lt;/a&gt; and &lt;a href="http://blog.scottbellware.com/2010/06/praise-for-norwegian-developers.html"&gt;in the blogosphere&lt;/a&gt;. For me NDC must have been one of the best conferences I’ve ever attended, offering a diverse range of topics from some of the best speakers in the industry. I’m humbled to be invited to speak at such a great event.&lt;/p&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;My session was on building Silverlight applications for the Windows Phone 7 platform. Instead of doing a feature tour of all the new APIs I decided to focus on some of the patterns and principles I find important when doing Silverlight development, and showing how to apply these in a Windows Phone 7 context. Some of the topics I covered in my talk included: &lt;/p&gt;


&lt;p&gt;  &lt;ul&gt;   &lt;li&gt;How to do TDD in Silverlight on WP7 &lt;/li&gt;    &lt;li&gt;The MVVM design pattern and &lt;a href="http://mvvmlight.codeplex.com/"&gt;MVVM Light Framework&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;How to use dependency injection in a WP7 context and how it can help you inject stub implementations of APIs that isn’t available in the emulator. &lt;/li&gt;    &lt;li&gt;Asynchronous web services using Rx (Reactive Extensions). &lt;/li&gt;    &lt;li&gt;How to use the location APIs and how to make stub implementations for the emulator. &lt;/li&gt;    &lt;li&gt;How to use the push notification API. &lt;/li&gt;    &lt;li&gt;Making your views Blend-friendly by supplying design time data. &lt;/li&gt;    &lt;li&gt;The Metro design language (look and feel of WP7 applications) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;To best illustrate these concepts I’ve built a full Windows Phone 7 application that lets you monitor arrivals and departures from any Norwegian airport. The application consumes a set of &lt;a href="http://www.avinor.no/avinor/trafikk/50_Flydata"&gt;REST services exposed by Avinor&lt;/a&gt; that lets you look up arrivals and departures for a given airport. I’ve made the entire application &lt;a href="http://github.com/follesoe/FlightsNorway"&gt;available on GitHub as open source&lt;/a&gt;, and I do plan to polish it enough to actually publish it on the app marked place as soon as the WP7 is released.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" title="Screenshot" border="0" alt="Screenshot" src="http://static.follesoe.no/WindowsLiveWriter/NDC2010PatternsandtechniquesforbuildingW_D1A1/Screenshot_3.png" width="247" height="480" /&gt;&lt;/p&gt;  &lt;p&gt;Most sessions from NDC2010 where recorded, and can be &lt;a href="http://streaming.ndc2010.no/"&gt;downloaded from the Tandberg streaming server&lt;/a&gt; or as &lt;a href="http://www.ndc2010.no/index.aspx?id=361621"&gt;a complete torrent with all the sessions&lt;/a&gt;. I’ve also uploaded my session to Vimeo (for my personal video archive), and to make it easier to embed it on my blog.&lt;/p&gt;  &lt;p&gt;&lt;object width="669" height="251"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=12986550&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=12986550&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="669" height="251"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://vimeo.com/12986550"&gt;Silverlight Applications for Windows Phone 7&lt;/a&gt; from &lt;a href="http://vimeo.com/follesoe"&gt;Jonas Follesø&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The slides are available on Slide Share, and &lt;a href="http://github.com/follesoe/FlightsNorway"&gt;the source code is up on GitHub&lt;/a&gt;. I do plan to update the code as new versions of the WP7 platform is released, and hope the application can serve as a good example of how to architect a WP7 application.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_4524607"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="Get a flying start with Windows Phone 7 - NDC2010" href="http://www.slideshare.net/follesoe/get-a-flying-start-with-windows-phone-7-ndc2010"&gt;Get a flying start with Windows Phone 7 &amp;ndash; NDC2010&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse4524607" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=getaflyingstartwithwp7-100617052020-phpapp02&amp;amp;stripped_title=get-a-flying-start-with-windows-phone-7-ndc2010" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed name="__sse4524607" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=getaflyingstartwithwp7-100617052020-phpapp02&amp;amp;stripped_title=get-a-flying-start-with-windows-phone-7-ndc2010" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/follesoe"&gt;follesoe&lt;/a&gt;.&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Thanks to everyone who showed up for my session, and for the great feedback on Twitter, in person and through the conference evaluation system. Thanks to everyone I meet during the conference that I got a chance to talk to – it’s amazing how many talented people you meet at a conference like NDC. Also big thanks to the people behind NDC – they did an amazing job and I’m truly looking forward to next year’s conference!&lt;/p&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=-7u--nkbX0g:ZN4bqpaCs-c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=-7u--nkbX0g:ZN4bqpaCs-c:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=-7u--nkbX0g:ZN4bqpaCs-c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?i=-7u--nkbX0g:ZN4bqpaCs-c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=-7u--nkbX0g:ZN4bqpaCs-c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/follesoe/~4/-7u--nkbX0g" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <title>XP2010 and BlackBoxRecorder</title>
    <link href="http://jonas.follesoe.no/2010/06/04/xp2010-and-blackboxrecorder/" rel="alternate" />
    <id>http://jonas.follesoe.no/2010/06/04/xp2010-and-blackboxrecorder/</id>
    <published>2010-06-04T00:00:00Z</published>
    <updated>2010-06-04T00:00:00Z</updated>
    <author>
      <name>Jonas Follesø</name>
    </author>
    <summary type="html">&lt;p&gt;This week I have been attending the 11&lt;sup&gt;th&lt;/sup&gt; international conference on Agile Software Development, &lt;a href="http://xp2010.org/"&gt;XP2010&lt;/a&gt;, in Trondheim. It has been an amazing week, filled with learning, excellent food and awesome social events, making new friends and catching up with old. I gave two lightning talks during the conference, one on UI prototyping in agile projects (the same I gave at Smidig 2009), and one on Generating Characterization Tests for Legacy Code. The talk on characterization tests was based on some work I did back in October – December 2009. I was involved in a partial rewrite of some pretty bad legacy code. One of the techniques we discovered was that we could use the slow running integration tests to code generate fast and more targeted characterization tests for the code we were rewriting. &lt;/p&gt;

</summary>
    <content type="html">&lt;p&gt;This week I have been attending the 11&lt;sup&gt;th&lt;/sup&gt; international conference on Agile Software Development, &lt;a href="http://xp2010.org/"&gt;XP2010&lt;/a&gt;, in Trondheim. It has been an amazing week, filled with learning, excellent food and awesome social events, making new friends and catching up with old. I gave two lightning talks during the conference, one on UI prototyping in agile projects (the same I gave at Smidig 2009), and one on Generating Characterization Tests for Legacy Code. The talk on characterization tests was based on some work I did back in October – December 2009. I was involved in a partial rewrite of some pretty bad legacy code. One of the techniques we discovered was that we could use the slow running integration tests to code generate fast and more targeted characterization tests for the code we were rewriting. &lt;/p&gt;




&lt;p&gt;For the last three-four months I’ve been working on an open source testing tool that streamlines the technique of generating characterization tests for your legacy code. The project is called &lt;a href="http://follesoe.github.com/BlackBoxRecorder/"&gt;BlackBoxRecorder&lt;/a&gt; and is &lt;a href="http://github.com/follesoe/BlackBoxRecorder"&gt;available on Github&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;  &lt;p&gt;&lt;a href="http://follesoe.github.com/BlackBoxRecorder/"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="BBR_logo_white" border="0" alt="BBR_logo_white" src="http://static.follesoe.no/WindowsLiveWriter/XP2010andBlackBoxRecorder_141F3/BBR_logo_white_5.png" width="550" height="128" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;BlackBoxRecorder is a tool that uses &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;AOP-techniques&lt;/a&gt; to automatically record and generate characterization tests for legacy .NET code (code without tests). You apply a &lt;strong&gt;&lt;em&gt;[Recording]&lt;/em&gt;&lt;/strong&gt;-attribute on the method you want to generate tests for, and a &lt;strong&gt;&lt;em&gt;[Dependency]&lt;/em&gt;&lt;/strong&gt;-attribute on any class accessing external resources such as the file system, web services or databases.&lt;/p&gt;  &lt;p&gt;Each method invocation of a method marked with the recording-attribute will be stored in an XML file. The XML file contains information about the method, copies of input parameters, output parameters and return values. If the method being recorded invokes any methods on a class marked with the Dependency-attribute, the return values of the dependency will also be recorded in the same XML file. This enables automatic mocking of external dependencies when playing back the characterization test.&lt;/p&gt;  &lt;p&gt;For each method recording BlackBoxRecorder will generate a unit test that will play back the recorded XML file against the method. The return values from the method will be compared against the recorded return values using reflection. If any change is detected the test will fail. The test will serve as a change detector (which in essence is what characterization test is), notifying you of any changed behavior in the method being tested. If the change was intentional you can configure the generated test to ignore that property on next run.&lt;/p&gt;  &lt;p&gt;The generated tests supports automatic stubbing/mocking of the types marked with the Dependency-attribute. When the test is played back, the dependency will load return values from the XML recording and return these instead of actually calling the external resource. You do not have to change your code for this to work and even static methods are supported.&lt;/p&gt;  &lt;p&gt;I got some really good feedback on the session, and it was pretty cool that Michael Feathers attended the session. I referenced his book and quoted him a few times in the presentation, so I was really glad he enjoyed the talk.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://twitter.com/mfeathers/status/15319087953"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="MichaelFeathersCommentOnTalk" border="0" alt="MichaelFeathersCommentOnTalk" src="http://static.follesoe.no/WindowsLiveWriter/XP2010andBlackBoxRecorder_141F3/MichaelFeathersCommentOnTalk_1.png" width="665" height="88" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I also got questions from several people who where interested in what it would take to port BlackBoxRecorder to Java. So on Thursday evening I organized an open space session where we walked through the code and discussed how to implement a Java version. We continued the talk over lunch Friday, and soon enough &lt;a href="http://twitter.com/olecr"&gt;Ole Christian Rynning&lt;/a&gt;, &lt;a href="http://twitter.com/jhannes"&gt;Johannes Brodwall&lt;/a&gt;, &lt;a href="http://twitter.com/infosophy"&gt;Geir Amdal&lt;/a&gt;, &lt;a href="http://twitter.com/mkotsbak"&gt;Marius Kotsbak&lt;/a&gt; and myself where hacking away on a spike implementing BalackBox for Java. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://yfrog.com/581z1uj"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Hacking away on a Java implementation of BlackBoxRecorder" border="0" alt="Hacking away on a Java implementation of BlackBoxRecorder" src="http://static.follesoe.no/WindowsLiveWriter/XP2010andBlackBoxRecorder_141F3/JackBoxHacking_3.jpg" width="360" height="270" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;We called the implementation &lt;a href="http://github.com/oc/jackbox/"&gt;JackBox, and the code is up on Github if you want to jump in and contribute&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://twitter.com/jhannes/status/15411484272"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="JackBoxFirstCommit" border="0" alt="JackBoxFirstCommit" src="http://static.follesoe.no/WindowsLiveWriter/XP2010andBlackBoxRecorder_141F3/JackBoxFirstCommit_2.png" width="670" height="333" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I will definitely blog more about BlackBoxRecorder as soon as I’m done with my NDC2010 presentations. Thanks to organizers, speakers and attendees for making XP2010 a memorable experience!&lt;/p&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=k5yc7Na5G1c:ypB9MqKKGao:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=k5yc7Na5G1c:ypB9MqKKGao:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=k5yc7Na5G1c:ypB9MqKKGao:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?i=k5yc7Na5G1c:ypB9MqKKGao:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=k5yc7Na5G1c:ypB9MqKKGao:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/follesoe/~4/k5yc7Na5G1c" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <title>Simulating multitouch on the Windows Phone 7 Emulator</title>
    <link href="http://jonas.follesoe.no/2010/03/21/simulating-multitouch-on-the-windows-phone-7-emulator/" rel="alternate" />
    <id>http://jonas.follesoe.no/2010/03/21/simulating-multitouch-on-the-windows-phone-7-emulator/</id>
    <published>2010-03-21T00:00:00Z</published>
    <updated>2010-03-21T00:00:00Z</updated>
    <author>
      <name>Jonas Follesø</name>
    </author>
    <summary type="html">&lt;p&gt;&amp;#160;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="WindowsPhone7" border="0" alt="WindowsPhone7" src="http://static.follesoe.no/WindowsLiveWriter/SimulatingmultitouchontheWindowsPhone7Em_11F9B/WindowsPhone7_5.jpg" width="500" height="329" /&gt; &lt;/p&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Over the weekend I have had tons of fun playing around with the Windows Phone 7 Developers Tools. The platform looks awesome, both from an end user perspective as well as a developer perspective. &lt;/p&gt;


&lt;p&gt;  &lt;p&gt;One of the scenarios I’ve been exploring involves some simple multitouch pinch and zoom gestures. It’s fairly simple to add custom touch functionality by &lt;a href="http://msdn.microsoft.com/en-us/library/ff426933(VS.96).aspx"&gt;subscribing to the Manipulation Events hanging off all UIElements&lt;/a&gt;. If you got a touch enabled Windows 7 computer you can even test multitouch directly in the emulator. However, I was a little bummed when I read that, unlike the Surface SDK, simulating multitouch input using multiple mice was not supported: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“The Windows Phone Emulator does not support multitouch input through the mouse, so you must test scale transforms on a development computer that supports touch input, or test on an actual device.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This is not entirely true. When I read this I remembered &lt;a href="http://geekswithblogs.net/kobush/archive/2009/03/10/129993.aspx"&gt;this cool blog post from Szymon Kobalczyk on emulating a multitouch device in Windows 7&lt;/a&gt;. In his post Szymon talks about the MultiTouchVista project. It’s an open source piece of software that lets you install a Windows 7 touch driver. The driver talks to a multitouch service that can read input from multiple sources and turn them into standard Windows 7 multitouch events. Sources for input include things like multiple mice, web&amp;#160; cameras and Wii remotes. Since the MultiTouchVista application appears as a standard Windows 7 touch driver it will work in any Windows 7 touch-enabled application, like the Windows Phone 7 emulator.&lt;/p&gt;  &lt;p&gt;For detailed installation instructions, check out the projects official CodePlex site. I have recorded a quick demo showing multitouch in Silverlight 3, MS Paint and the Windows Phone 7 emulator using two mice connected to my iMac.&lt;/p&gt; &lt;object width="671" height="503"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10330829&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=ff0179&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=10330829&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=ff0179&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="671" height="503"&gt;&lt;/embed&gt;&lt;/object&gt;  &lt;p&gt;&lt;a href="http://vimeo.com/10330829"&gt;Emulating Multitouch on the Windows Phone 7 Emulator using multiple mice&lt;/a&gt; from &lt;a href="http://vimeo.com/follesoe"&gt;Jonas Follesø&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;&amp;#160;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="WindowsPhone7" border="0" alt="WindowsPhone7" src="http://static.follesoe.no/WindowsLiveWriter/SimulatingmultitouchontheWindowsPhone7Em_11F9B/WindowsPhone7_5.jpg" width="500" height="329" /&gt; &lt;/p&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Over the weekend I have had tons of fun playing around with the Windows Phone 7 Developers Tools. The platform looks awesome, both from an end user perspective as well as a developer perspective. &lt;/p&gt;


&lt;p&gt;  &lt;p&gt;One of the scenarios I’ve been exploring involves some simple multitouch pinch and zoom gestures. It’s fairly simple to add custom touch functionality by &lt;a href="http://msdn.microsoft.com/en-us/library/ff426933(VS.96).aspx"&gt;subscribing to the Manipulation Events hanging off all UIElements&lt;/a&gt;. If you got a touch enabled Windows 7 computer you can even test multitouch directly in the emulator. However, I was a little bummed when I read that, unlike the Surface SDK, simulating multitouch input using multiple mice was not supported: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“The Windows Phone Emulator does not support multitouch input through the mouse, so you must test scale transforms on a development computer that supports touch input, or test on an actual device.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This is not entirely true. When I read this I remembered &lt;a href="http://geekswithblogs.net/kobush/archive/2009/03/10/129993.aspx"&gt;this cool blog post from Szymon Kobalczyk on emulating a multitouch device in Windows 7&lt;/a&gt;. In his post Szymon talks about the MultiTouchVista project. It’s an open source piece of software that lets you install a Windows 7 touch driver. The driver talks to a multitouch service that can read input from multiple sources and turn them into standard Windows 7 multitouch events. Sources for input include things like multiple mice, web&amp;#160; cameras and Wii remotes. Since the MultiTouchVista application appears as a standard Windows 7 touch driver it will work in any Windows 7 touch-enabled application, like the Windows Phone 7 emulator.&lt;/p&gt;  &lt;p&gt;For detailed installation instructions, check out the projects official CodePlex site. I have recorded a quick demo showing multitouch in Silverlight 3, MS Paint and the Windows Phone 7 emulator using two mice connected to my iMac.&lt;/p&gt; &lt;object width="671" height="503"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10330829&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=ff0179&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=10330829&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=ff0179&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="671" height="503"&gt;&lt;/embed&gt;&lt;/object&gt;  &lt;p&gt;&lt;a href="http://vimeo.com/10330829"&gt;Emulating Multitouch on the Windows Phone 7 Emulator using multiple mice&lt;/a&gt; from &lt;a href="http://vimeo.com/follesoe"&gt;Jonas Follesø&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=PCGSQEDn3Bo:V0sj7dXgovc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=PCGSQEDn3Bo:V0sj7dXgovc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=PCGSQEDn3Bo:V0sj7dXgovc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?i=PCGSQEDn3Bo:V0sj7dXgovc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=PCGSQEDn3Bo:V0sj7dXgovc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/follesoe/~4/PCGSQEDn3Bo" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <title>MVVM presentation from NDC2009 on Vimeo</title>
    <link href="http://jonas.follesoe.no/2010/03/07/mvvm-presentation-from-ndc2009-on-vimeo/" rel="alternate" />
    <id>http://jonas.follesoe.no/2010/03/07/mvvm-presentation-from-ndc2009-on-vimeo/</id>
    <published>2010-03-07T00:00:00Z</published>
    <updated>2010-03-07T00:00:00Z</updated>
    <author>
      <name>Jonas Follesø</name>
    </author>
    <summary type="html">&lt;p&gt;Last year I gave a presentation on the MVVM design pattern at the Norwegian Developer Conference. Most of the presentations from NDC2009 was recorded and made available online, including mine. However, the user experience of the &lt;a href="http://arkiv.ndc2009.no/agenda.aspx?cat=1071&amp;amp;id=1813"&gt;video content on the NDC site&lt;/a&gt; isn’t the best. Playing a video requires multiple clicks, and the videos are only available in WMV format. &lt;/p&gt;


&lt;p&gt;  &lt;p&gt;The feedback I’ve gotten on the presentation is so good that I decided to make it a bit more discoverable by &lt;a href="http://vimeo.com/9765330"&gt;uploading it to Vimeo&lt;/a&gt;. In addition to the MVVM presentation I have also uploaded &lt;a href="http://vimeo.com/9964528"&gt;my lightning talk from Smidig 2009&lt;/a&gt; (in Norwegian) as well as my &lt;a href="http://vimeo.com/9967222"&gt;Silverlight talk from TechEd New Zealand 2008&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;If you want to watch all the content from NDC2009 you can download it &lt;a href="http://blogs.msdn.com/grothaug/pages/downloadable-ndc2009-videos.aspx"&gt;nicely packaged as one big torrent file&lt;/a&gt;. Oh, and I haven’t made an announcement on the blog yet, but I will be &lt;a href="http://www.ndc2010.no/index.aspx"&gt;speaking at this year’s NDC&lt;/a&gt;.&lt;/p&gt; &lt;object width="670" height="536"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9765330&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=ff0179&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9765330&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=ff0179&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="670" height="536"&gt;&lt;/embed&gt;&lt;/object&gt;  &lt;p&gt;&lt;a href="http://vimeo.com/9765330"&gt;MVVM Design Pattern NDC2009&lt;/a&gt; from &lt;a href="http://vimeo.com/follesoe"&gt;Jonas Follesø&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_1664018"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="MVVM Design Pattern NDC2009" href="http://www.slideshare.net/follesoe/mvvm-design-pattern-ndc2009"&gt;MVVM Design Pattern NDC2009&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mvvmpresentationndc2009-090630160910-phpapp02&amp;amp;stripped_title=mvvm-design-pattern-ndc2009" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mvvmpresentationndc2009-090630160910-phpapp02&amp;amp;stripped_title=mvvm-design-pattern-ndc2009" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/follesoe"&gt;follesoe&lt;/a&gt;.&lt;/div&gt; &lt;/div&gt;&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;Last year I gave a presentation on the MVVM design pattern at the Norwegian Developer Conference. Most of the presentations from NDC2009 was recorded and made available online, including mine. However, the user experience of the &lt;a href="http://arkiv.ndc2009.no/agenda.aspx?cat=1071&amp;amp;id=1813"&gt;video content on the NDC site&lt;/a&gt; isn’t the best. Playing a video requires multiple clicks, and the videos are only available in WMV format. &lt;/p&gt;


&lt;p&gt;  &lt;p&gt;The feedback I’ve gotten on the presentation is so good that I decided to make it a bit more discoverable by &lt;a href="http://vimeo.com/9765330"&gt;uploading it to Vimeo&lt;/a&gt;. In addition to the MVVM presentation I have also uploaded &lt;a href="http://vimeo.com/9964528"&gt;my lightning talk from Smidig 2009&lt;/a&gt; (in Norwegian) as well as my &lt;a href="http://vimeo.com/9967222"&gt;Silverlight talk from TechEd New Zealand 2008&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;If you want to watch all the content from NDC2009 you can download it &lt;a href="http://blogs.msdn.com/grothaug/pages/downloadable-ndc2009-videos.aspx"&gt;nicely packaged as one big torrent file&lt;/a&gt;. Oh, and I haven’t made an announcement on the blog yet, but I will be &lt;a href="http://www.ndc2010.no/index.aspx"&gt;speaking at this year’s NDC&lt;/a&gt;.&lt;/p&gt; &lt;object width="670" height="536"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9765330&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=ff0179&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9765330&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=ff0179&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="670" height="536"&gt;&lt;/embed&gt;&lt;/object&gt;  &lt;p&gt;&lt;a href="http://vimeo.com/9765330"&gt;MVVM Design Pattern NDC2009&lt;/a&gt; from &lt;a href="http://vimeo.com/follesoe"&gt;Jonas Follesø&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_1664018"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="MVVM Design Pattern NDC2009" href="http://www.slideshare.net/follesoe/mvvm-design-pattern-ndc2009"&gt;MVVM Design Pattern NDC2009&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mvvmpresentationndc2009-090630160910-phpapp02&amp;amp;stripped_title=mvvm-design-pattern-ndc2009" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mvvmpresentationndc2009-090630160910-phpapp02&amp;amp;stripped_title=mvvm-design-pattern-ndc2009" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/follesoe"&gt;follesoe&lt;/a&gt;.&lt;/div&gt; &lt;/div&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=y1u5NzM9pcc:OQ2NWBhuwzg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=y1u5NzM9pcc:OQ2NWBhuwzg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=y1u5NzM9pcc:OQ2NWBhuwzg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?i=y1u5NzM9pcc:OQ2NWBhuwzg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=y1u5NzM9pcc:OQ2NWBhuwzg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/follesoe/~4/y1u5NzM9pcc" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <title>Automatic INPC using dynamic proxy and Ninject</title>
    <link href="http://jonas.follesoe.no/2010/01/17/automatic-inpc-using-dynamic-proxy-and-ninject/" rel="alternate" />
    <id>http://jonas.follesoe.no/2010/01/17/automatic-inpc-using-dynamic-proxy-and-ninject/</id>
    <published>2010-01-17T00:00:00Z</published>
    <updated>2010-01-17T00:00:00Z</updated>
    <author>
      <name>Jonas Follesø</name>
    </author>
    <summary type="html">&lt;p&gt;There has been lots of talk in the Silverlight community about what is the best way to implement the INotifyPropertyChanged interface. During Christmas I blogged about &lt;a href="http://jonas.follesoe.no/AutomaticINotifyPropertyChangedUsingDynamicProxy.aspx"&gt;how you can use dynamic proxies to get INPC implemented automatically&lt;/a&gt;. Since then both &lt;a href="http://www.ingebrigtsen.info/post/2010/01/10/INotifyPropertyChanged-Automagically-implemented.aspx"&gt;Einar Ingebrigtsen&lt;/a&gt; and &lt;a href="http://justinangel.net/"&gt;Justin Angel&lt;/a&gt; have blogged about an interesting approach to INPC using MSIL weaving. I really recommend checking out Justin’s post, as he covers some of the pros and cons of different INPC implementations, as well as purposing &lt;a href="http://justinangel.net/#BlogPost=AutomagicallyImplementingINotifyPropertyChanged"&gt;an elegant solution using post-build MSIL weaving&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;  &lt;p&gt;One of the things Justin mentions as a drawback of the dynamic proxy approach is that you cannot simply new up your ViewModel directly and get change notification automatically. You have to explicitly create the ViewModel instance through a proxy creator. Einar also mentioned that he had a hard time finding a way to integrate the proxy creator with an IoC container.&lt;/p&gt;  &lt;p&gt;When I write code I’m always careful about where I instantiate my objects, and lately all projects I’ve worked on have used some sort of IoC container. Having an IoC container gives you a single place in your code base to create- and register objects. If the dynamic proxy implementation of automatic INPC is going to be useful it has to be as simple requesting a ViewModel instance from the IoC container. In this blog post I’m going to show how you can combine automatic INPC using dynamic proxy with the Ninject IoC container.&lt;/p&gt;  &lt;p&gt;If you have read my blog you may have noticed &lt;a href="http://jonas.follesoe.no/YouCardRevisitedImplementingDependencyInjectionInSilverlight.aspx"&gt;I got a soft spot for Ninject&lt;/a&gt;. I mean, who cannot love a framework whose name, graphic profile and code examples are all about Ninjas? When I first set out to integrate my automatic INPC interceptor with &lt;a href="http://ninject.org/"&gt;Ninject&lt;/a&gt; I wasn’t quite sure where to start. Ninject 1.0 had AOP concepts built in, but in 2.0 (which are under development) this has been moved out of the core and into a separate interception extension module. This is part of the new modular design of Ninject 2.0. Features you may not need all the time are moved out to separate extensions, leaving the core really small and simple (&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;There has been lots of talk in the Silverlight community about what is the best way to implement the INotifyPropertyChanged interface. During Christmas I blogged about &lt;a href="http://jonas.follesoe.no/AutomaticINotifyPropertyChangedUsingDynamicProxy.aspx"&gt;how you can use dynamic proxies to get INPC implemented automatically&lt;/a&gt;. Since then both &lt;a href="http://www.ingebrigtsen.info/post/2010/01/10/INotifyPropertyChanged-Automagically-implemented.aspx"&gt;Einar Ingebrigtsen&lt;/a&gt; and &lt;a href="http://justinangel.net/"&gt;Justin Angel&lt;/a&gt; have blogged about an interesting approach to INPC using MSIL weaving. I really recommend checking out Justin’s post, as he covers some of the pros and cons of different INPC implementations, as well as purposing &lt;a href="http://justinangel.net/#BlogPost=AutomagicallyImplementingINotifyPropertyChanged"&gt;an elegant solution using post-build MSIL weaving&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;  &lt;p&gt;One of the things Justin mentions as a drawback of the dynamic proxy approach is that you cannot simply new up your ViewModel directly and get change notification automatically. You have to explicitly create the ViewModel instance through a proxy creator. Einar also mentioned that he had a hard time finding a way to integrate the proxy creator with an IoC container.&lt;/p&gt;  &lt;p&gt;When I write code I’m always careful about where I instantiate my objects, and lately all projects I’ve worked on have used some sort of IoC container. Having an IoC container gives you a single place in your code base to create- and register objects. If the dynamic proxy implementation of automatic INPC is going to be useful it has to be as simple requesting a ViewModel instance from the IoC container. In this blog post I’m going to show how you can combine automatic INPC using dynamic proxy with the Ninject IoC container.&lt;/p&gt;  &lt;p&gt;If you have read my blog you may have noticed &lt;a href="http://jonas.follesoe.no/YouCardRevisitedImplementingDependencyInjectionInSilverlight.aspx"&gt;I got a soft spot for Ninject&lt;/a&gt;. I mean, who cannot love a framework whose name, graphic profile and code examples are all about Ninjas? When I first set out to integrate my automatic INPC interceptor with &lt;a href="http://ninject.org/"&gt;Ninject&lt;/a&gt; I wasn’t quite sure where to start. Ninject 1.0 had AOP concepts built in, but in 2.0 (which are under development) this has been moved out of the core and into a separate interception extension module. This is part of the new modular design of Ninject 2.0. Features you may not need all the time are moved out to separate extensions, leaving the core really small and simple (90kb).&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ninject-ninja" border="0" alt="ninject-ninja" src="http://static.follesoe.no/WindowsLiveWriter/AutomaticINPCusingdynamicproxyandNinject_13E0B/ninject-ninja_3.jpg" width="612" height="346" /&gt; &lt;/p&gt;  &lt;p&gt;My first plan was to use the Ninject interception extension. The extension uses the LinFu framework for dynamic proxies, and I wasn’t sure how to get my Castle Dynamic Proxy based implementation to work directly. I later got contacted by &lt;a href="http://www.twitter.com/innovatian"&gt;Ian Davis&lt;/a&gt;, the owner of the interception-extension project. He asked if I needed some help getting automatic INPC working with Ninject. After some back-and-forth on Twitter Ian had an implementation of automatic INPC added to the &lt;a href="http://github.com/idavis/ninject.extensions.interception"&gt;Ninject.Extension.Interception project&lt;/a&gt;. The code is &lt;a href="http://github.com/idavis/ninject.extensions.interception/commit/b991f89ca687fe0265d9e34d2ba6f626b06b6a5d"&gt;commited to the trunk&lt;/a&gt;, and is available on &lt;a href="http://github.com/idavis/ninject.extensions.interception"&gt;github&lt;/a&gt; if you want to check it out. Ian’s implementation is probably worth a blog post on its own.&lt;/p&gt;  &lt;p&gt;A comment from &lt;a href="http://miguelmadero.blogspot.com/"&gt;Miguel Madero&lt;/a&gt; pointed me in the right direction to get my interceptor working with Ninject. Miguel had integrated it himself by implementing the interceptor as a Ninject Provider. Ninject lets you register types against providers which let you write code that creates the instance when the type is requested from the container. The interface is really simple, having one Create-method. In this method you have to create the instance being requested.&lt;/p&gt;  &lt;p&gt;The implementation for the automatic INPC provider is fairly simply. It finds the largest constructor of the ViewModel being requested, creates instances of all constructor parameters, before calling the dynamic proxy creator I implemented in my &lt;a href="http://jonas.follesoe.no/AutomaticChangeNotificationForDependentProperties.aspx"&gt;previous two&lt;/a&gt; &lt;a href="http://jonas.follesoe.no/AutomaticINotifyPropertyChangedUsingDynamicProxy.aspx"&gt;blog posts&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ProviderCode" border="0" alt="ProviderCode" src="http://static.follesoe.no/WindowsLiveWriter/AutomaticINPCusingdynamicproxyandNinject_13E0B/ProviderCode_3.png" width="670" height="555" /&gt; &lt;/p&gt;  &lt;p&gt;In Ninject all configuration is done through code using an internal DSL. You configure the container by creating module classes specifying the bindings of the different types you want to be able to create. In this example I have a simple logging service (to demonstrate constructor injection combined with automatic INPC) as well as a simple ViewModel. The ViewModel is bound to the provider, which will call the proxy creator when the ViewModel is requested.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ConfigurationExample" border="0" alt="ConfigurationExample" src="http://static.follesoe.no/WindowsLiveWriter/AutomaticINPCusingdynamicproxyandNinject_13E0B/ConfigurationExample_3.png" width="670" height="240" /&gt; &lt;/p&gt;  &lt;p&gt;This unit tests shows how to request an instance of the ViewModel from the container. When the Name-property is set the ViewModel will log the action to the fake logger which was injected into the ViewModel constructor.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ExampleUnitTestOfViewModelFromKernel" border="0" alt="ExampleUnitTestOfViewModelFromKernel" src="http://static.follesoe.no/WindowsLiveWriter/AutomaticINPCusingdynamicproxyandNinject_13E0B/ExampleUnitTestOfViewModelFromKernel_3.png" width="670" height="193" /&gt; &lt;/p&gt;  &lt;p&gt;Having to register every single ViewModel against the provider is tedious and repetitive. Miguel Madero also suggested that you can override the GetBinding method of the Ninject StandardKernel and use convention over configuration. By overriding the GetBinding method we can check if the type being requested is a ViewModel, and if it is we can create a binding on the fly tying the ViewModel type against the automatic INPC provider.&lt;/p&gt;  &lt;p&gt;The implementation of the AutoNotifyKernel is really simple. It checks if the name of the type being requested contains “ViewModel” and implements the IAutoNotifyPropertyChanged interface. If it does we create a binding for the type.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="AutoNotifyKernel" border="0" alt="AutoNotifyKernel" src="http://static.follesoe.no/WindowsLiveWriter/AutomaticINPCusingdynamicproxyandNinject_13E0B/AutoNotifyKernel_3.png" width="670" height="398" /&gt; &lt;/p&gt;  &lt;p&gt;Having a convention based approach in place we do not have to manually register every single ViewModel.&lt;/p&gt;  &lt;p&gt;Some of this code might seem complicated, but I really wanted to cover the details of how to integrate it with Ninject, as similar approaches probably work for other containers. Once you got a framework for automatic INPC in place the usage becomes really simple. In the example application for automatic INPC the code needed to implement the ViewModel, configure the container and tie the ViewModel to the View looks something like this:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="FullExample" border="0" alt="FullExample" src="http://static.follesoe.no/WindowsLiveWriter/AutomaticINPCusingdynamicproxyandNinject_13E0B/FullExample_3.png" width="670" height="844" /&gt; &lt;/p&gt;  &lt;p&gt;It’s funny how such a simple interface can trigger so many different implementations. I hope you found my blog post on combining a dynamic proxy approach with an IoC container useful. It will be interesting to see which approach emerges as the most used, and which frameworks that will provide implementations of the different techniques.&lt;/p&gt; &lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-1a08c11c407c0d8e.skydrive.live.com/embedicon.aspx/Code%20samples/AutoINPC.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=OEjNQ4jSiec:1UKLzQOCcdI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=OEjNQ4jSiec:1UKLzQOCcdI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=OEjNQ4jSiec:1UKLzQOCcdI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?i=OEjNQ4jSiec:1UKLzQOCcdI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/follesoe?a=OEjNQ4jSiec:1UKLzQOCcdI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/follesoe?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/follesoe/~4/OEjNQ4jSiec" height="1" width="1"/&gt;</content>
  </entry>
</feed>

