Blog Reader Replacement

[Warning: This is largely a rant… it is by no means a serious review of any of these products.]

For the last couple of years I’ve been using FeedGhost as my RSS Reader of choice. I install it on all my machines – home, work and laptop. Up until recently I’ve been happy with the tool. I was originally drawn to it because 1) it looked fresh and new with plenty of visual polish, 2) it had a great synchronization mechanism which meant all my machines could be kept in sync.

FeedGhost

Alas, in the last couple of months things have started to fail. Running FeedGhost on my laptop has suddenly jumped from using 100Mb to using well over a 1Gb. Even more worrisome the synchronization seems to have had a few bugs introduced. Blog entries appears under the wrong category/feed and old items keep incorrectly showing as unread.

So… time for a new Blog Reader. The guys at work use Google Reader. I pity them, I try to educate them and when all else fails I just mock them.

So what serious contenders are there? I used SharpReader many years ago. Simple, quick but definitely lacking in features – I don’t think its being actively developed.

So from SharpReader I moved to RssBandit. I downloaded the latest version, loaded my feed list and took it for a spin. Initial reaction is one of disappointment. On the surface it seems much as it was a few years ago. They’ve added synchronization and a download manager. The posts glow a horrible yellow when you mouse over them – very annoying but presumably something that can be turned off.

RSSBandit

At the same time as downloading RssBandit I got the latest version of FeedDemon. I haven’t used this product before – I seem to remember a time when it wasn’t free. The Newsgator synchronization seems to work well and is quick as is loading the posts themselves. Its been severely beaten with the ugly stick which is a shame. It also doesn’t behave how I would “expect” in many cases. For instance – it doesn’t seem to let you open more than one node in the feed list tree. If you open one it closes the previous – why?!

FeedDemon

I don’t really want too much in an RSS Reader. My feature list in order of importance would go something like:

  1. Simply, effective synchronization of feeds and entry status.
  2. Well rendered post in a couple of layout formats – summary list, “river of news” flow etc.
  3. “Helpers” for adding subscriptions, e.g. Subscribe action takes clipboard URL by default, browser right click extensions etc.
  4. Clean, intuitive user interface – most are way to cluttered.

Of course what might be nice is a WPF based RSS Reader. Maybe using Live Services/Sync Framework behind the scenes to do the synchronization. Maybe Paperboy will become such a tool?

Overall – I’m a little disappointed with the available offerings. Does anyone have a (non browser based) alternative that they’d recommend?

Panoramas using Microsoft Image Composite Editor (ICE) and HD View

After having had quite a bit of fun stitching photos together using Window Live Photo Gallery I decided to see what other gems it may have on its feature list. What I found was the Extras/Download more photo tools… menu which took me to this website.

Photosynth is awesome, but it requires that all photos be public at this stage. AutoCollage I had tried out before and whilst it is kinda cute, I preferr having more custom control in the layout (hence my PhotoPlay app a few years ago).

The Image Composite Editor (apart from having a truly uninspiring name) seem to essentially be the engine that Windows Live Photo Gallery uses under the hood to perform its own “Create panoramic photo” feature. Of course the Image Composite Editor (ICE) allows you to get more involved in how the composite stitching is performed. It also has quite a few export options, including: HD View Tileset, Adobe Photoshop, Deepzoom Tileset or just plan jpg or png.

Microsoft Image Composite Editor

I did some experiments with the HD View Tileset option. What I liked about this was it allows you to view the image whilst getting a better perspective of the rotational span. Kind of like printing out a panoramic strip and then wrapping it around your head about 15cm from your eyes whist spanning the correct angle of the composite. Err… ok – that wasn’t a great explanation – try the links below.

DSC07492-5 Stitch

Dunk Island – View from Mount Kootaloo

DSC07549-53 Stitch

Dunk Island – Alone on Muggy Muggy Beach

Weekend Getaway to Kangaroo Island

I spent last weekend away with the family touring around Kangaroo Island. I managed to take a few photos of the “mandatory” tourist spots. I’ve become quite a fan of taking panoramic photos the easy way – i.e. standing in one spot and taking multiple photos at different angles with a relatively constant horizon.

Back in the “good ‘ol days” I used to spend hours stitching the individual photos together afterwards. This involved difficult colour matching, transforms to cater for perspective, manual touchups/blurs of the edges etc. These days I simply select the photos (in any order) using Windows Live Photo Gallery and then choose “Create panoramic photo…”. Hey presto – all done!

Here’s a few samples – click for larger versions. These are all taken with a 6 year old digital camera by a novice photographer (me).

EDIT: First photo now links to full size image (around 2.9Mb).

DSC09098 Stitch

Beach at Penneshaw – taken from Frenchman’s Rock. Cape Jervis on the horizon on the far right.

DSC09150 Stitch

Remarkable Rocks

 DSC09169 Stitch

Admiral’s Arch

DSC09252 Stitch Wide 

Stokes Bay – great beach for young kids.

INotifyPropertyChanged via Extension Methods

I imagine most developers that work with data-binding in WinForms or WPF have their preferred way of implementing INotifyPropertyChanged (or individual <property>Changed events). Normally I use a base class to hide the interface declaration and event and then use helper methods in the setters to take care of raising the event when applicable.

I’ve also spent some time looking at AOP alternatives using PostSharp. These look really promising, but it does require taking a dependency on PostSharp.

Another alternative is to use Extension methods. I had this realisation today and figured I’d spend a few minutes putting together a quick test. Getting the event proved a little irksome, and I’m passing around property names as strings (as opposed to perhaps using a member expression). Here’s the extension class:

public static class PropertyChangedExtension
{
public static void OnPropertyChanged(this INotifyPropertyChanged sender, string propertyName)
{
RaiseEvent(sender, propertyName,  "PropertyChanged");
}
public static void OnPropertyChanging(this INotifyPropertyChanging sender, string propertyName)
{
RaiseEvent(sender, propertyName, "PropertyChanging");
}
public static bool SetValue<T>(this INotifyPropertyChanged sender, 
ref T backingField,
T newValue,
string propertyName) { if ( Equals( backingField, newValue )) return false; var propertyChanging = sender as INotifyPropertyChanging; if (propertyChanging != null) propertyChanging.OnPropertyChanging(propertyName); backingField = newValue; OnPropertyChanged(sender, propertyName); return true; } private static void RaiseEvent(object sender, string propertyName, string eventName) { var fieldInfo = sender.GetType().GetField(eventName, BindingFlags.Instance | BindingFlags.NonPublic); if (fieldInfo != null) { var eventDelegate = fieldInfo.GetValue(sender) as MulticastDelegate; if (eventDelegate != null) eventDelegate.DynamicInvoke(
new object[] { sender, new PropertyChangedEventArgs(propertyName) }); } } }

Here’s a simple test class.

public classPerson: INotifyPropertyChanging, INotifyPropertyChanged

{

    public eventPropertyChangedEventHandler PropertyChanged;

    public eventPropertyChangingEventHandler PropertyChanging;

    private string_firstName;

    private string_lastName;

    public stringFirstName

    {

        get{ return_firstName; }

       
set

      
{

            if(this.SetValue(ref _firstName, value, "FirstName"))

                this.OnPropertyChanged("FullName");

        }

    }

    public string LastName

    {

        get { return _lastName; }

       
set

       
{

            if (this.SetValue(ref _lastName, value, "FirstName"))

                this.OnPropertyChanged("FullName");

        }

    }

    public string FullName

    {

        get { return string.Format("{0} {1}", FirstName, LastName); }

    }

}

Note that I use the boolean result from SetValue to determine whether I should fire property changed events on other dependent properties (again this is something that can be done declaratively using PostSharp).

The RaiseEvent method in the Extension class is a really nasty hack (in other words it won’t always work and is slow). You can simply pass through the event handlers which makes things much simpler, but what I was aiming for was the least amount of code in the setters. I wouldn’t use this code in a production environment (a base class is much better suited). However it is well suited for adding property change notification to classes that I’m just throwing together for a demo or prototype without having to worry about PostSharp dependencies or base classes.