Daisy Update

(I published this last weekend for a short while, and then pulled it after I started wondering if giving away too much info on Daisy was a bad idea. I think this will be the last post where I detail everything I’ve worked on. For example, I’ve been kicking some new interface stuff around in Photoshop this weekend that I really don’t want anybody to see untill release. We’ll see how it goes. On with the show…)

This weekend was mostly about two things – filling in missing features that hadn’t been implemented yet, and working on performance issues related to large subscriptions list.

A good friend was kind of enough to lend me a copy of his feed list which is huge compared to mine. I subscribe to about 100 weblogs – I tend to prune out stuff I rarely read and try to keep things manageable. My friends list had about 300 subscriptions in it, so it was a good test of my subscription list import and the performance of the application overall once the feed store grows to 400+ weblogs. Needless to say the performance was horrible, ๐Ÿ™‚ so I spent most of Saturday working on this. I’m happy to say things have improved quite a bit.

Today I spent working on filling in the nooks and crannies of the app, adding small features which I’ve put off over the last few weekends. Here are some screenshots:




Implemented search scopes, which are search providers you can use to search the web within the web interface. The search providers are pulled in from IE7’s search provider database so the two apps remain in sync.




Added a brilliant idea my boss Gary came up with, a search feature that searches blog search engines for references to articles your reading. Memorandum is nice, but it only lists a few A-list bloggers that have back linked to a particular article or post. This gives you access to the Long Tail by allowing you to search sites like Technorati, Pubsub, Digg, MSN Blog Search and Google Blog Search. I’ve already used this a few times, it’s quite useful.




I finally bit the bullet and implemented a sorted article list view. It wasn’t as bad as I thought it would be, and it turns out the newer XP (or Forms 2.0?) list view has built-in visual styles. It’s amazing how much this improves the usability of the app.




I also added a nice little error information inspector in the subscription properties for feeds that experience problems. This gives you an idea of what might be wrong with a feed that’s gone dark.




And last but not least, I added something that is just so cool, and yet so simple – a Welcome page for the preview pane that displays the first time you open the app. From this you get a quick summary of what’s going on with all of your subscriptions. I’ll be adding additional entries to this page as I continue to develop the app.

That’s about it. Next weekend – fixing problems with renaming, removing and reorganizing your subscription list now that I’ve finally tracked down the cause of my file access exceptions, and continuing to fill in the feature cracks. (I still have a number of small features that need completing.) Once I get done with this, and maybe work over my bug list a bit, I’ll finally be moving on and implementing another major feature, although I’m not sure what that will be yet.

I should also mention one thing I’ve noticed since I started this project. Microsoft’s new developer tools, languages and libraries are Da Bomb! If I had to implement Daisy in C++ using the MFC, well, I would have given up long ago. This app has swung together so fast it just blows my mind. And it’s been so easy. I dig Windows Forms and Visual Studio 2005.

UPDATE I just noticed I mispelled Friday in the list view as Firday. PETA will not appreciate that. ๐Ÿ™‚

RSS Naming Conventions Update

I’ve overhauled my naming conventions. I think “feed” is a little too geek, so in Daisy I’ve gone with a convention I think is much more user friendly:

Rule#1 – A ‘weblog’ is the thing that gets published. Like a newspaper.
Rule#2 – A ‘feed’ is the URL endpoint a weblogโ€™s content is available at. Like a newswire, itโ€™s a connection point.
Rule#3 – You subscribe to or unsubscribe from a weblog, not a feed.
Rule#4 – The result of subscribing to a weblog is a ‘subscription’.
Rule#5 – Itโ€™s ‘article’, not ‘post’.
Rule#6 – Articles have a ‘headline’.
Rule#7 – it’s not ‘tag’ it’s ‘topic’.
Rule#8 – ‘RSS’ never gets mentioned

Interesting Microsoft RSS Platform Problem Found

I finally spent some time today tracking down my sporadic file in use exceptions related to feed renaming and moving. Technically I’d consider this a bug, although I’m not sure how the folks in Redmond will solve it. (They probably won’t, so I will have to.) Essentially the problem involves delayed garbage collection of objects which basically hold COM references to unmanaged code (feed handles). The following code produces exception faults in the first feed rename call after the second feed object is created:

IFeedsManager fs = new FeedsManagerClass();

IFeed feed;
feed = fs.GetFeedByUrl("http://wherethehellismatt.typepad.com/blog/rss.xml") as IFeed;

feed.Rename("Where the Hell is Matt?");
feed.Rename("Where the Hell is Matt??");
feed.Rename("Where the Hell is Matt???");
feed.Rename("Where the Hell is Matt????");
feed.Rename("Where the Hell is Matt?????");

feed = fs.GetFeedByUrl("http://wherethehellismatt.typepad.com/blog/rss.xml") as IFeed;

feed.Rename("Where the Hell is Matt?");
feed.Rename("Where the Hell is Matt??");
feed.Rename("Where the Hell is Matt???");
feed.Rename("Where the Hell is Matt????");
feed.Rename("Where the Hell is Matt?????");

The exception is a file in use exception:

System.IO.FileLoadException
{"The process cannot access the file because it is being used by another process. (Exception from HRESULT: 0x80070020)":null}

The only way to solve it, is to force a garbage collection cycle:

IFeedsManager fs = new FeedsManagerClass();

IFeed feed;
feed = fs.GetFeedByUrl("http://wherethehellismatt.typepad.com/blog/rss.xml") as IFeed;

feed.Rename("Where the Hell is Matt?");
feed.Rename("Where the Hell is Matt??");
feed.Rename("Where the Hell is Matt???");
feed.Rename("Where the Hell is Matt????");
feed.Rename("Where the Hell is Matt?????");

feed = null;

GC.Collect();

feed = fs.GetFeedByUrl("http://wherethehellismatt.typepad.com/blog/rss.xml") as IFeed;

feed.Rename("Where the Hell is Matt?");
feed.Rename("Where the Hell is Matt??");
feed.Rename("Where the Hell is Matt???");
feed.Rename("Where the Hell is Matt????");
feed.Rename("Where the Hell is Matt?????");

So here I am, working with the latest and greatest in language runtimes, and I find that, because Microsoft doesn’t use their own tools when developing code (The feed store is a C++ COM object and is accessed through Interop) I’m forced to “clean up after myself” anyway. Feels like I’m back in ANSI c calling free on malloc’d memory blocks. Joy. Of course this is still beta code, so maybe I’m being too critical at this point. We’ll have to wait and see. But I honestly don’t see how this can be fixed from the unmanaged side of things, so my guess is even after the final release it’s probably going to have to happen on my end. I also think this is going to cause some pretty serious problems down the road, since multiple applications can access the feed store at once, any of which might open and hold a handle on a feed or feed folder.

Daisy

One of the great things about working on a reader is that you get to read web logs while you debug. ๐Ÿ™‚ Tonight I did some work on the browser user interface, adding a links dock while also cleaning things up a bit. I still have some work to do but that that can wait for a bit until I have more time. Honesty, I’m feeling a bit overwhelmed. I sat down and started itemizing features I wanted Sunday night, which took me into the “wouldn’t it be cool if” realm. Next weekend I’m going to backup, prioritize things and push the “wibc” list down the stack for a bit. I need to keep centered on implementing a good reader, after which I can work on the fun stuff.

Here’s the new browser interface:

I’ve borrowed elements from different browsers. I have screenshots of Opera, IE 6, IE 7, and Safari on my desktop for reference. I’ll be honest, most of the link dock changes came from Safari, I like the way Apple did their links band. There are no favorite icons on my dock, I’ve decided against it. Fave icons work in the feed tree but they just suck up space here and cause attention problems for the user. Kudos to Apple design.

Hey, and guess what, my tabs “elegantly resize themselves” too. ๐Ÿ™‚

I still have work to do though, especially on tabs, Quick Tabs functionality, and the search button which at this point is just a filler graphic from IE 7.0. Also there are the issues surrounding communicating secure vs. non-secure sites, and SSL certificate information. All in due time. One nice thing though about Internet Explorer, after setting a few flags on the mshtml object, I’ve got built in pop-up blocking, and built in security enhancements, no coding required. When it comes to building re-usable components for developers, Microsoft is king.

Daisy Update

I spent most of last weekend working on finalizing various feed properties, which are used to control things like download frequency and automatic mark as read after a period of time. I also implemented a couple features somebody was recently begging for in NetNewsWire, including the “dinosaurs feature”, although I ended up calling it “dormancy” and implemented it in a user friendly way.

After finalizing all the feed settings, I was able to go back and really finalize the two wizards used in importing feeds, the OPML import and the new feed subscription wizards. I spent a lot of time on this, since these are probably the two interfaces users will first see when they install the app. It’s interesting, the first thing that gets developed in a project like this is the feed list import wizard, and you want to get it up and running quickly. So you end up with something kind of thrown together. Once you’ve imported once though, you never need it again, so opml import can quickly be forgotten. I think a number of reader developers did exactly this, they threw that component together and then forgot about it. Since it really is the very first part of the app users will see, it’s what they use when forming their first impressions. So I went back, and worked on all three of these interfaces quite a bit. I also implemented a nice trash bin feature where deleted feeds, deleted content, and dormant / broken feeds end up. This is something I’ve wanted in the previous readers I’ve used. Within this feature there’s a “one week delayed” trash bin where feeds get placed before their deleted, giving the user time to decide what they want to do.

This weekend, I skipped the feed item list I was going to work on cause it’s going to be boring work ๐Ÿ™‚ and implemented the tabbed browsing view. I was a little leery of this, I thought it would be a bitch, but I ended up getting a basic view up and running in just a couple hours. It’s not complete yet though, I think the tabs need some custom UI work since I’m not a big fan of the look and feel of the default XP tabs. Here’s a screen shot of the tabbed browsing as it stands tonight, along with the properties pane for controlling dormancy.

Click for a big shot. That’s about it till next weekend.

Update I just realized my browser pane doesn’t have an rss discovery icon! gotta add that. I also want to replace the search button with a little control that highlights open search discovery as well. Lots of work to do, the UI is still pretty stock, but we’re making progress.

Naming Conventions for Feed Readers

There’s been some discussion of this as of late, here’s my take:

Rule #1 – It’s never a post, it’s an article.
Rule #2 – It’s always subscribe / unsubscribe, nothing else.
Rule #3 – Old feeds which do not get updated are ‘abandoned‘.
Rule #4 – A feed is represented by a ‘web site‘ and a ‘feed url‘.
Rule #5 – It’s a ‘favorite icon‘ not a ‘favicon‘.

..and here’s the one rule I can’t quite figure out:

Is it a feed or a blog or a weblog? I like ‘weblog’, I hate ‘blog.’ I also like ‘feed’ when it’s in the “pull” context. I think you subscribe to a feed, while you visit a weblog.

And here’s the kicker rule –

Rule #7 – ‘RSS‘ never gets mentioned. It doesn’t exist as far as the user is concerned.

When was the last time somebody walked up to you and said:

“Hey, I HTTP’d Zooomr the other day, it was cool, you should check it out.”

You browse or ‘check out’ a web site, and you view a weblog or subscribe to a feed. I think that works.

RSS‘ is a protocol, nothing more and nothing less. It belongs and should stay in the protocol naming basket. As should ‘Atom 0.3‘.

Now, if we could just do something about this mess:

Daisy Progress

Well, after three weekends and some week nights I think I’m doing pretty good. This weekend I worked on a number of things. I’ve added favorite icon support, and I also added a nice icon chooser (shown in the shot below) so that users can choose a custom icon for any particular blog. I also got all the drag and drop functionality in the main feed tree view working, and finished up all the event work so that when something in Microsoft’s RSS feed store changes from another app, Daisy reflects that change. I also worked out some bugs related to renaming, deleting, and moving feeds and folders.

The geek’esk property grid is gone, and I’ve added some nicer icons in some places. I also managed to get double buffering turned on for all interfaces, so animations are nice and smooth with no chatter. I also implemented my idea of fade up and down on all windows, something I wasn’t sure I was going to like but now I don’t understand why other developers haven’t made use of. It offers a much nicer user experience. Hmm, what else, I think thats about it. Next week I’m going to work on the feed item list in the upper right. I want that list control replaced with a nicer composite control that supports filtering, and sorting options, specifically:

item list grouping toggle switch:
– no grouping (straight list)
– daily groups: today, yesterday, two days ago, three days ago, last week
– read/unread groups: new, old

display filter toggle switch (which effect what’s in the preview pane)
– all, old, new, today, yesterday, last two days, last three days, this week, last week

This might be some work, depends on whether or not I can find a commercial control that I can buy and drop in, or develop the whole thing myself. After thats done, I’ll be moving up to work on the toolbar area, and hopefully get tabbed browsing going.

It’s All In The Name

I found out today that somebody has already developed a feed reader named “Feed Explorer”, and after checking it out, I think it kinda sucks. So I’m thinking about renaming my feed reader to “Daisy”. The main icon for feed explorer is a yellow flower where the petals are supposed to represent feeds, and the center of the flower represents you. I like the symbolism, and I also like soft feel of it. Most readers I’ve looked at are totally geek. If RSS is going to reach mainstream, it needs to shed the geek appeal and become accessible and understandable to the average user. Daisy will target that user base.

I’m sure a graphic designer could do some cool stuff with the logo, but until I get to that point, I’ve worked up a new logo I’ll be using during development.

Can you dig it? I’d prefer the flower to be less of a stand-out dot, maybe an illustration from the side with petals falling slightly down, maybe draping over the text. I think it would fit nicely into the top to the base of the ‘i’. But I’m not an artist, so for now I’ll work with what I have.

Tales of a BeOS Refugee

This is an interesting read: Tales of a BeOS Refugee I found it searching around for information on “the good ways and bad ways” to use transparency in applications. Windows Forms windows support transparency, so it’s tempting to go overboard with it in Feed Explorer. Seeing the main window through it’s child windows and dialogs is cool, but making everything 50% transparent is not a good idea. If cool factor kills usability, your in trouble. Therefore I’ve decided to not do any hokey animation of child windows, which I think takes up too much cpu time and slows down your use of the app, and I’m going to use a simple, fast fade in and fade out on all child windows, which adds a nice, soft touch to the UI. I think it strikes a good balance.