Sunday, December 31, 2006

Book Review: "America: A Love Story"

Like many non-Americans I have a strange attraction to the United States. Having neither the means nor the time to explore this vast continent on my own I am looking for substitutes to get intimately familiar with the different corners of America. This is what I was hoping to find in Torre B Isaksen's "America: A Love Story".

The author, Mr. Isaksen, a Norwegian-born sea captain, spent half a year traveling from Alaska to Florida, using his car. His travels took him through many states and he writes about the people and places he saw. Quite a few exciting events happened to him during the trip, but that is not what makes this book interesting. Where Mr. Isaksen really shines is in his narrative of all the original people he met on his travels, sometimes old friends, but most of the time just random encounters on his journey.

As the book title hints, Mr. Isaksen's unrelenting love for the US is ever-present throughout the pages, and often this is too much for the reader to swallow. While he keeps referring back to the vast amount of places he visited during his travels by sea, he always uses this information to point out the superiority of the American way, regardless of subject. His story often strays off on a tangent, and more often than not, this leads to the Vietnam war, which a significant number of fragments in the book is dedicated to.

As a travelogue throughout the US, the book contains a fair amount of memorable episodes and you get a feeling for the place and the people living there. However, the constant backtracking to Vietnam, the many romantic encounters on the road, and a few grammatical and spelling errors reduce the enjoyment from what could have been a great read. Despite these issues I still enjoyed the book and felt that I got a deeper and more intimate understanding of the US geography and people without actually being there.

Saturday, November 25, 2006

Emails to the FeedJournal Domain

I just had a large backlog of e-mails delivered to me. They were all addressed to any of the e-mail addresses in my feedjournal.com domain. There were e-mails all the way back from the end of August until today. Of course, this is an extremely costly thing to have happen to an µ-ISV and especially at a time around a product launch.

I have been speaking to both my domain name registrar and my hosting provider and problem is now solved once and for all. You should all feel free to safely use the feedjournal.com addresses for contacting me in the future.

I am terribly sorry for everyone who tried to contact me during this time (31st Aug - today) and never received a reply. I am now starting to process the e-mail backlog and reply to each and everyone of you.

Sunday, November 19, 2006

FeedJournal v2.0 is Available

After a few sabbatical months in the aftermath of the Made In Express Contest, it is finally time for FeedJournal v2.0 to see the light of day. Functionality-wise there are no major differences between v1.0 and v2.0 - all the changes have occurred behind the scenes. The database is now using on a much leaner engine, considerably speeding up the download size and installation process. On top of this, the new version is going shareware, with a 30-day trial version without any limitations. The price for a single computer license is $39.95, but during 2006 there is an introductory offer of $29.95.

Monday, November 13, 2006

Hack.net v2.0

I have been knocking my head bloody against v2.0 of hack.net for over half a year now. This bugger seems even more diabolic than the first version of the puzzle, which wasn't solved until a few years after its initial publication. Every time I think I have come up with some clever approach how to solve the first stage, but no significant breakthrough so far. I am pretty sure that those curly brackets are a part of getting to the next step... How about a subtle hint, Ryan?

Anyone else out there working on it?

Thursday, November 2, 2006

Moving Incoming Newsletters and Alerts to RSS

Spam and inbox overload is one of the unavoidable pains of an active online life, right? Well, not necessarily so. There are a few proven techniques for how to get rid of unwanted e-mail from your inbox. One of them is to be very restrictive about giving out your personal e-mail address, another involves investing in advanced anti-spam filters. But how do you go about signing up for newsletters and other information from sites that you are not trusting?

I am happy with my current setup for solving these problems and thought that I would share it with you.

The service I am using is free and called MailBucket. It is simply an email address with the suffix "@mailbucket.org" that is free for you to claim. Let's say you want to use the e-mail address joe@mailbucket.org - you simply type this address in the e-mail field when subscribing to for example a newsletter. Then add a subscription in your favorite RSS reader to http://www.mailbucket.org/joe.xml and read the incoming messages from there. Of course, this setup does not allow you to easily reply to messages but typically this is not anything you will do when subscribed to a newsletter. If you eventually decide that you don't want to receive their messages any longer you simply delete the feed from your RSS reader. To find a unique e-mail address I am building my username (the part before the @ in the e-mail address) by using a unique prefix, a dash ("-"), and the name of the service (for example joe-bookcrossing@mailbucket.org). You can find out more about MailBucket's excellent free service at http://www.mailbucket.org.

Of course it is not advisable to use a MailBucket address when signing up for a service where a secret password or other confidential information will be sent to you, because all feeds are public and unprotected. For a few months I have been a happy user, subscribing to news alerts from for example BookCrossing and TopCoder as well as various Yahoo Groups. It also automatically provides me with a convenient way of categorizing my incoming messages compared with using my regular e-mail address for everything.

Back in Blog Business

I am back from a long blog break which became much longer than scheduled. We went for two weeks' vacation in Sweden, which was excellent. Coming back to Israel I realized that I had forgotten my USB disk in Sweden. The disk contained my blog database, so I asked them to send it to me. A week ago it arrived, but the Thingamablog database had been corrupted for some reason; I guess it didn't like all the traveling... A lesson as good as any to take backups more seriously.

Now I have finally managed to restore the database to a state more or less as it was before, and the blog should get going again.

Wednesday, September 27, 2006

Microsoft Resolves Controversy (WTG!)

Shortly after I published my previous blog post regarding the Made In Express Contest controversy, Microsoft contacted me. They said that they had conducted a review of the final results and had decided to award the amount of the Grand Prize to both of the First Place winners!

So what swayed Microsoft into changing their attitude? I am not saying that my blog post did it, but I like to think that it played a part in their decision. Another huge contributor to this decision was Channel9 user Minh (thank you!), who called up Mark Jewett at Microsoft to get some answers. The phone conversation was recorded and you can download the mp3 from here.

Way to go, Mark Jewett and Microsoft! I know that you took a a lot of abuse in the C9 forums but the way that you resolved the situation impresses me. Thank you!

Tuesday, September 26, 2006

The Big Controversy Regarding the Winner(s)

C9 posters demand that the winning team in Made In Express Contest will be disqualified from the competition and their $10,000 prize revoked. They point at evidence that the winner, professor Ernie Hall, did not abide by the rules by using already developed code and working in a team.

I have been lurking in the C9 forums for the last few days, following the heated debate. Three forum threads [1] [2] [3] totaling over 200 posts to date, cover it all. The posters include Mark Jewett, the MS guy behind the contest, as well as two out of the three judges, Chris Pirillo and Robert Scoble.

I assume the rest of the finalists have been following the C9 discussion as well, but so far all of them have kept mum. As the runner-ups, I and Ali Khalid, are identified as the big losers in all of this (a mere $9,000), I decided to make my opinion heard.

First of all I must admit that Ernie's robot AI entry was my favorite as well. I think that it really showcases Express Edition's versatility when it comes to product ideas. That's probably why Microsoft liked it too. However, when I look at all the hard facts about the rules and compare them with Ernie's submission it is quite obvious that something is wrong here. It becomes clear by just reading any of his blog entries where he is posting C# source code. In the file header it is clearly written that someone else wrote the code in 2005. Many of the header files in his submitted source code have timestamps from 2005 and are signed by other developers.

If you download the source code you will also see that the code was not initially written in Express Edition, but rather converted to this format at a later stage. The presence of the _UpgradeReport_Files folder proves this.

I am glad that the C9 forum opened up my eyes to this as I was too busy coding FeedJournal than to check if my competitors were adhering to the rules during the contest. Anyway, according to Microsoft's forum answers it seems unlikely that they will do anything about this. Instead their official response is rather dry:

Thank you for your feedback regarding the Made In Express Contest. We have reviewed your complaint and have determined that the Contest was operated in accordance with the official rules. We appreciate your interest and look forward to your participation in next years contest.

Tuesday, September 19, 2006

FeedJournal is Awarded First Place in Microsoft Contest

Yesterday, Microsoft announced that my newspaper project FeedJournal had been awarded First Place in their Made In Express Contest. As regular readers of my blog know, my brainchild FeedJournal is the .NET application I am writing to revolutionize the way you read newspapers.

The judges (Chris Pirillo, LockerGnome; Phillip Torrone, MAKE Magazine; Robert Scoble, Scobleizer) motivation read:

Jonas helped us all take a step closer to publishing our own newspaper based on the news we care about. FeedJournal is actually a little glimpse of the future…it will likely be a common way for readers to ‘roll their own’ magazines in the near future.

This is probably my finest moment ever in my long software development career and I want to thank Microsoft for arranging the contest and everyone who has supported the project by dropping emails or blog comments. And I want to send a special thank you to my wife and baby daughter for having patience with my late evening development sessions during this time.

Tuesday, August 29, 2006

FeedJournal Voting - Last Chance

Last chance to vote for FeedJournal in Made In Express Contest! Anyone is free to vote and the booths will close on September 1st!

Thank you for your support.

Saturday, August 26, 2006

Competitive Programming

I am a competitive guy. People who know me well, know that I always go to the bottom of things; have a passing interest in anything will never happen to me. It's either all or nothing. For years, I have been looking for ways to funnel my energies into some kind of online community. Requirements are that it should be engaging, competitive and educational. I have been taking quite a few stabs at different online gaming communities but they haven't turned out to be what I am looking for.

I am happy to say that finally, I think I have found the niche I have been hunting. TopCoder.com. TopCoder is an online community for people who love programming. Or rather, it was; today it has grown to cater for architects, testers and graphics artists as well. The basic concept is that you participate in contests where you need to solve three algorithm problems in a language of your choice (mine is .NET C#). The faster you solve it the more points you score. Given that the system tests pass your implementation, that is. Or that no competitor will challenge your implementation with a unit test. That's the weekly competition TopCoder is running, and which is divided into two divisions according to your rating. Sometimes one of the sponsors throw in money in the prize pot to make it more interesting. On top of this there are weekly design and implementation challenges where the best submissions will be awarded enough cash to make it worth having a look at.

There is just one thing missing from TopCoder, and that is that they should allow remote pair programming competitions or us agile geeks. Just read the story of this guy who tried it.

Thursday, August 17, 2006

FeedJournal Database Decisions

Chris Pirillo has something to say about the Made In Express Contest. Considering he is one of the judges in the contest, I am definitely listening. This is his verdict about my own entry, FeedJournal:


Still has a long way to go, but I'd say that sample output is quite nifty. The only thing that keeps me from installing and recommending the app wholeheartedly is the need to install SQL Server 2005 Express Edition first - which I'm not going to do on my desktop. Suggestion: push forward with this one, but rely on something else for feed information storage (sorry, but installing SQL is overkill for users like myself).




Considering his overall harsh judgment of the projects I consider this pretty favorable, and indeed he goes on to mention FeedJournal as one of his four favorite entries. However, let's consider his criticism for a moment. The SQL Server 2005 Express Edition is a required component in the contest as long as you want to have a database. FeedJournal definitely needs one. Here is a section from the contest rules:


Submitted Projects must compile successfully in Visual Studio 2005 Express Editions (any edition), and use SQL Server 2005 (any edition) for any database storage or data access code.


Of course Mr Pirillo is spot on in his criticism, and the database issue does not come as any surprise to me. The fact is that the required runtime for SQL Server Express Edition is 55MB, 10 times larger than the setup files for the actual FeedJournal application! I already touched upon this in a previous blog entry where I considered using SQL Server Everywhere Edition.

The good news is that there is already a solution to the problem! FeedJournal is using a database wrapper class, making it trivial to switch database engines. Since the start of the development I have been secretly working on a separate configuration using the open-source System.Data.SQLite database. Compared with SQL Server's 55MB runtime, SQLite weighs in at a mere 400kb using a single DLL file. w00t!! Sure, SQLite offers less design time support from inside Visual Studio, but it is a small price to pay in comparison.

FeedJournal versions using SQLite are fully functional and has been running in my personal test environment all the time. These will be released for beta testing in a few weeks time, most likely after the contest ends in order to abide by the rules.

Wednesday, August 16, 2006

FeedJournal v1.0 and Contest Voting

In Made In Express Contest it is now up to the public to vote for the project they like best. FeedJournal is one out of the 11 projects you can vote for. Please make a visit and choose your favorite!

This also implies that you can finally download FeedJournal v1.0 from the the Made In Express link above. Despite the name it is a beta test version, while I am continuing to work on v2.0. Visit feedjournal.com for more information.

Monday, August 7, 2006

I'm Excited, and Writely So

When writing drafts for this blog, I have been struggling with how to type up the articles. Sometimes I am working on different computers and I need an easy way of moving the documents between locations. So far I have been using a USB drive where I store the documents. This has the drawback of needing the same application installed on all computers. Another option is setting up an automatic synchronization between shared computers but it doesn't work for me because some of them are blocked behind a firewall.

Enter the new paradigm of online word processors! The idea is that your documents are edited using your web browser and the files are hosted on the service's website. You can choose to share or protect each document, and despite being a new phenomenon there are already a few interesting players on the market. All of these online services automatically integrate many additional features useful for bloggers. They offer spell-checking, document sharing for review, real-time collaboration, history of changes, and direct publishing to your blog. And they are all free of charge to use! The best ones are overviewed at About.com.

My personal favorite is Writely, which really stands out from the competition. The interface is slick and simple to use. There are all the features that you expect and more. It includes comments, handy keyboard shortcuts for accessing common functions, and importing of common file formats. Technology like this really excites me! Writely was acquired a few months ago by Google, and has temporarily disabled users registration, but there is a backdoor.

Sunday, August 6, 2006

Contest Deadline for FeedJournal

The time has come to let go of FeedJournal v1.0. I have been working on it for months and thinking about it for even longer. Without the definite contest deadline hanging over me, I think it would have been difficult for me to resist adding more features before publicizing it. But, in the end it's for the better. FeedJournal needs to get out there and get some real-world testing before it can mature into higher versions with a larger feature set.

I definitely don't see this contest submission as the end of the line for FeedJournal, more like a baby's first steps. I choose to look at this version as a public beta test. Although v1.0 has been thoroughly tested I have decided to let it expire on October 1st, forcing users to upgrade to a higher version. Much like a beta or release candidate would work.

The time has also come for me to sum up the experience of having competed in Made In Express Contest.

Sometimes I have felt isolated, that I don't have any cubicle neighbors or managers to discuss design choices or feature priorities with. Then I realize that there are huge numbers of other single developers out there doing the same thing, 12 of us happen to be in this contest. And if we want to break our isolation we can, help is always just a forum post, instant message or email away. And I choose to see it as a challenge, that we have responsibility for all the implementation choices, design decisions and even marketing options. A challenge which is there to empower us as providers of a service or application.

Sometimes I have been feeling that time was not enough. Who are these people at Microsoft letting us run like crazy implementing these projects in just a couple of months? Do they get a kick out of seeing us burning the midnight oil? Well, even though I am sure it has been a hectic summer for the whole dozen of us finalists, seeing it coming to an end now I just want to keep on running. To keep pushing out more features and squashing bugs. The contest deadline has forced me to set up an infrastructure for publishing an installation program, finishing the help text and generally smoothing the rough edges. All of this means that I can take v1.0 and start pushing out upgrades if there is an interest out there. And from what I have seen in the blogosphere, there is.

No matter how tough it has been for the last months, one thing is for sure: it has been a blast! Good luck to all of us in the contest! Both regarding the judges' verdict and the future life of our projects.

The deadline for the contest is tonight (6th) at midnight, and the submissions should become available on Microsoft's contest site shortly thereafter. I will post a link on this blog as soon as I have more information.

Friday, August 4, 2006

HOWTO: Auto-Increment the Version in Visual C# Express

One of the features that I miss the most when I am working in Visual C# 2005 Express Edition is the possibility to auto-increment the version number for each build. Below, I will explain how to get around the limitation and add this functionality to the stripped down Express Edition of Microsoft's Visual Studio development environment.

The solution comes from CodeProject user PIEBALDconsult's Versioner project. His C# class increases the revision number of the AssemblyVersion, given the path to the file where it resides (typically AssemblyInfo.cs). Since PIEBALDconsult only provides the source code I took the liberty of compiling it into a .NET 2.0 executable, which can be downloaded from here (ZIP). The steps necessary for enabling auto-increment are listed below:

  1. Download and extract Versioner.exe from the ZIP archive to the project directory where you want to enable the auto-increment feature.
  2. Right click on the project in Visual C# 2005 Express Edition and choose Properties.
  3. Click Build Events.
  4. In the text box where it says Pre-build event command line enter:
$(ProjectDir)Versioner.exe $(ProjectDir)Properties\AssemblyInfo.cs        

Now, each time you compile the project, the AssemblyVersion's revision will increase by one.

SQL Server Everywhere Edition Requirements

The Community Technology Preview (CTP) of Microsoft SQL Server 2005 Everywhere Edition requires Windows XP SP2 or Windows Vista. If Windows 2000 is unsupported I will have to look at other solutions instead for the future. I tried to convert my database from Express's MDF format into Everywhere's SDF format, but ran into problems. With the short time remaining to the version 1.0 deadline (contest submission) the database optimization is something that will have to wait. Now is not the time to introduce more risk in the project.

I also decided to go with the ClickOnce system of deploying the application, which is helping out. It comes especially in handy with the installation of the runtime environments for .NET 2.0 and SQL Server Express. ClickOnce automatically figures out if the user needs to get these installed without me having to write a single line of code/script, which is really neat.

Thursday, August 3, 2006

Help Format Confusion

As I previously blogged about I was using Shalom Help Maker to generate my help file. After spending some time with this and finally completing the user documentation, I was ready to insert it into FeedJournal. The it suddenly hit me: this is not the right help format! The Danish Shalom Help Maker is generating help files in the old Windows .HLP format, which has been obsolete for some years now. What I need is CHM format, which I had up till now deluded myself into believing I was working with. Ouch!

OK, there must be some way of converting my HLP file into CHM, right? Nope, at least nothing free, and all of the programs I tried generated an error during the conversion. Finally, after much hunting I found a link to a freeware application on the excellent forums at Joel on Software. The program was called HelpMaker, and sure enough its conversion feature also choked on my HLP file, but I was able to copy/paste the content to generate a CHM file. HelpMaker also offer to possibility to compile to many different formats: CHM, HLP, MSDN format, RTF, and HTML. All in all, the process using HelpMaker was much easier than that of HTML Help Workshop, the free and official vanilla solution.

I took the opportunity to compile an output for the web at the same time as I compiled the CHM file. The web based help files are available here.

Now, if I only had realized my mistake earlier, I would have saved many hours that I now spent working on the wrong format. Doh!

Finishing Touches

Two days left for FeedJournal's contest submission and I am trying to prioritize which items have higher priority than others to complete. Right now I am working on the text of the CHM help file and I hope to finish it soon. After that (if there will be enough time) I want to see if I can easily switch to SQL Server Everywhere Edition, which should boost performance on low-end PCs quite a bit.

Before submission I also want to make sure that the install scripts are completed. I haven't decided between ClickOnce and InnoSetup yet. I have previous positive experiences with InnoSetup, but Microsoft's ClickOnce also seems nice in that it can support transparent upgrades and it integrates the .NET 2.0 framework installation automatically.

I will also need to write an build instructions document, which should be straightforward in my case. One item which is not obvious to me is if I should deliver the third-party open-source libraries I use in source code format or as precompiled assemblies. I fired away an email to the contest coordinator, to get an answer to that one.

Wednesday, August 2, 2006

The Demise of nDoc

Some of my fellow finalists have blogged about their intended usage of nDoc as a documentation tool for their source code. nDoc is hugely popular for automatic documentation of .NET code, using Visual Studio's support for XML comments in the source code. A week ago, nDoc went into a coma, when its single maintainer, Kevin Downs, announced his resignation from the open-source project. The problem, which in many cases are symptomatic of open-source projects, is that a majority of these projects are driven by one or a few enthusiast individuals, and their lifespan is directly related to how long it lasts until these individuals lose interest. It is rare to see a dying project being rescued by another developer, who keeps it running. Problems selling the software is the usual reason for the death of a commercial application. This sort of death is less painful for the software market, since the user base is potentially much smaller.

The love-hate relationship between open-source developers and small software vendors is about if software should be free or not. Developers of commercial software feel that the open-source community is undervaluing their work. Often they are frightened to see their carefully designed and evolved application being blatantly copied by an open-source initiative. This is not stopping the same developers from using open-source software though, no matter if it is a freely licensed library for their commercial software or an open source office suite or web browser.

Kevin Downs resignation is sad for the wide user-base of nDoc, but there is a light in the end of the tunnel. Microsoft recently launched a technology preview of Sandcastle, a project with a lot of similarities to nDoc. Sandcastle is bound to be more responsive to technology changes than nDoc was, where users have been waiting a long time for .NET 2.0 support. Here we see an example of an open-source product being replaced by a project that is being developed by a regular company. In recent time, we have been seeing a lot of stories that are the other way around. Kevin mentions in his "resignation letter" that if donations had been bigger he would have had an incentive to continue with the project. That leads me to ask why he not changes the license of nDoc and starts to charge for it?

Tuesday, August 1, 2006

Promoting FeedJournal

Small software businesses, or µ-ISVs, are cropping up everywhere nowadays. A big challenge for them is to get a foothold in the industry and claim a piece of the market. Then they need to keep that attention.

In Bob Walsh's excellent " Micro-ISV: From Vision to Reality", I learned that a blog can be an excellent vehicle for spreading the word about your product. It can also help to make sure you are keeping your customer's attention focused, by having them subscribe to your blog's RSS feed. The Blogosphere is a fast-moving media where the attention span sometimes lasts shorter than it takes to read a headline. The cross-pollination in the blogosphere is an interesting phenomenon which I hope to be able to leverage some more in the future.

For now, I decided to add a new section to FeedJournal's web site. The new section is called "In Blogs", with the obvious allusion to "In the Press", and will contain interesting mentions about my application from the blogosphere. I know, FeedJournal is not even out for beta testing yet, but it is never too early to start marketing, right? And besides, I can't resist the kick I get out of seeing my name mentioned in other people's blogs!

As a side note, after months of owning the domain feedjournal.com, I finally figured out how to configure the DNS so that I can use my hosting service with the domain. Until now I was using GoDaddy's forwarding functionality together with a masking technique. Now the hosting is set up like it should.

Monday, July 31, 2006

Bots Soon to High-Card Humans

The online poker rooms are flourishing in what seems to be the Eldorado of our time. But not for long. Around the corner lurk the bots, or computer programs designed for playing poker, currently in hard training to win your hard-earned cash.

Ten years ago I was an avid poker player, constantly on the lookout for new games. Most of my friends that I used to play for nickels and dimes are still playing today. They have taken their chip stacks online, and the limits have increased, but from the look of it they are doing well financially. Online poker ten years back consisted of a yearly e-mail tournament and games played over Internet Relay Chat (IRC), including first-generation bots. Online discussions took place on a spam-filled USENET newsgroup; in short, the situation wasn't very exciting. Today, you can hardly enter any web site without seeing advertising for online poker, with poker sites and fora mushrooming. According to Party Gaming, online poker generated $2.6 billion in gross gaming yield and represented 20% of global online gaming revenue during 2005. To call the development during these ten years an explosion would be an understatement.

But artificial intelligence is about to take over the tables. We have already seen it happen in chess, Deep Blue beat world champion Gary Kasparov in 1997; in checkers; and in backgammon. In these games it is believed that the best software program is superior to, or at least on par with, the world's best human players. Poker is somewhat different than chess and backgammon, but they do share a lot of common ground. In poker the cards decide the outcome of a single hand, and in backgammon the dice decide the outcome of a single game. But in the long run the winner is the one who makes the best choices. The skill level of the computer players are steadily improving, but it is not only smart algorithms that make them a tough opponent for a human. Poker players are notorious for playing long sessions and in the wee hours, the quality of play is decreasing at the same rate as the players' eyelids are closing. Poker bots don't have this problem, nor are they affected by the other major shortcoming of a human poker player: being on tilt, or playing suboptimal out of anger from losing a recent pot.

The game of online poker, with its huge revenue, is an attractive market for bot writers. Sure, online poker rooms prohibit bots; but in reality, there are a lot of poker bots that go undetected. With software dominating the world of chess, checkers and backgammon; poker is the next game. Online poker is not the same lucrative business it was a few years ago, the competition has stiffened and I am convinced that bots already have started to take a piece of the action. I predict that in just a few years a majority of the big money winners in online poker are bots. When that situation occurs it is questionable if online poker can survive at the same level as we see today. With more poker bots getting closer and closer to an optimal game, the playing field will be more even, and the earnings will not be enough to beat the poker rooms' fees, unless some unwary humans will stick around to feed them.

Building a poker bot to play in an online poker room where its participation is banned requires more than writing logic needed at the poker table. The poker servers are fighting tooth and nail in a war for their very existence. They are adopting multiple measures of defense: spyware-like functionality that monitors running processes on your computer, pop-up screens (a.k.a. bot challenges), playing patterns, etc. This war between sites and bots is not fought in the open, both sides prefer to keep a low profile here. The sites do not want to scare away their human clientele, while the bots are fighting detection. Because of their clandestine existence, it is difficult to evaluate the exact state of poker bots today. Some universities are doing research in the field and the University of Alberta seems to lead the way.

It is exciting to know that my fellow finalist Daniel Crenna is writing a framework for hooking up poker bots to play against each other. I hope that his endeavor will help budding poker bot authors to improve their software. It will be very exciting to see the final results of this project! A similar commercial product, Poker Academy, is also available on the market.

Sunday, July 30, 2006

Writing Documentation

Writing software documentation is probably the most boring part of a project for a developer. However, having blogged during the development process makes it easier. I am able to take some blog entries and paste them into the help files with very little editing. Also, by continuously writing blog articles during the past months, it is easier to fight writer's block.

I am using the free Shalom Help Maker to generate a standard CHM-file, easily accessible from within FeedJournal. Writing the help files is instructive because it places you in the user's shoes, and any design flaw becomes much more apparent. However, I have been working hard to keep the application design simple, and I hope that it is intuitive enough for users, so that they will not need to resort to the help system.

Saturday, July 29, 2006

Deep Linking from RSS

One of the more unique and perhaps controversial features of FeedJournal is that it can filter out the meat of an article published on the web.

How does it accomplish this? FeedJournal has four ways of retrieving the actual content for the next issue.

Actual Content
In the trivial case, a site (like this blog for example) decides to include the full article text within its RSS feed. FeedJournal simply published the content; no surprises here. By the way, this is how all standard RSS aggregators work. The problem is when a site decides to only publish summaries or teasers of the full article text. FeedJournal needs to deal with this because it is an offline RSS reader, users cannot click on their printed newspaper to read the full article.

Linked Content
The <link> tag inside the RSS feed specifies the URL for the full article. In case the RSS only includes summaries of the full articles, FeedJournal retrieves the text from this URL.

Rewritten Link
In most cases, just following this link is not a good solution. The web page typically includes lots of irrelevant content, like a navigation menu, a blogroll, or other articles. FeedJournal lets the user write a regular expression for each feed, automatically rewriting the article’s URL to the URL of the printer-friendly version. As an example the URL to a full article in International Herald Tribune is http://www.iht.com/articles/2006/07/28/news/mideast.php while the link to the printer-friendly version is http://www.iht.com/bin/print_ipub.php?file=/articles/2006/07/28/news/mideast.php By inserting bin/print_ipub.php?file=/ in the middle of the URL we will reach the printer-friendly article. This article is much more suitable for publishing in FeedJournal, because it more or less only contains the meat of the article.

Filtered Content
“More or less”, I said in the last sentence. There are usually some unwanted elements left in the printer-friendly version, like a header and a footer. These can be filtered out by letting FeedJournal begin the article after a specified substring in the HTML document source. Likewise, another substring can be selected as ending the relevant content.

By applying these functions it is possible to scoop, or extract, the meat of almost any web published article. Of course it is only necessary to do this once for every feed. To my knowledge, FeedJournal is the only aggregator who has the functionality described in the last three sections.

Is this legal, you ask? Wouldn’t a site owner require each user to actually visit the web site to read the content and click on all those fancy ads sprinkled all over? Well, my stance is that if the content is freely available on the web, I am free to do whatever I want with it for my own purposes. Keep in mind that we are not actually republishing the site’s content, we are only filtering it for our own use. Essentially, I think of this as a pop-up or ad blocker running in your browser.

What is interesting to note is that some web sites have tried to include in their copyright notice a paragraph limiting the usage of their content. Digg.com, for example, initially had a clause in the their copyright effectively prohibiting RSS aggregators from using their RSS feeds! Today, it is removed.

As long as FeedJournal is used for personal use, and the issues are not sold or made available publicly, I do not see any legal problems with the deep linking.

Friday, July 28, 2006

Time for Code Freeze

Time, quality, resources and scope. Those are the four variables in software project management. As the deadline closes in I only have the luxury to change scope. Sure, there are more features I planned to get into this version, but the scope will be cut in order to make the release stable and have a timely delivery. Time is a rare resource for me these days with being a new father , having a full-time job, following the latest news about the regional conflict, and blogging/developing FeedJournal . Despite that, I am proud of what I have accomplished so far with my project in Visual C# 2005 Express Edition.

One week remains until release, and the time has come for Code Freeze: no more new features. Until August 6th I will work on finalizing documentation, web site, and of course testing.

FeedJournal will become a commercial project in version 2.0. Until then the fully functional version 1.0 will be the one submitted for the Made In Express Contest under a shared source license. That basically means that the source is available but there are no rights to use this source code in your own projects. I plan to add plenty of cool features before a commercial release plus some optimizations under the hood. I would like to thank everyone who contacted me with feature requests or comments. What you should expect to see in future versions are:

  • Sections
  • Layout templates
  • Images
  • Browser integration for publishing a selected web page in the next issue
  • PDF import (nice for those online crossword puzzles and Sudokus)
  • Advanced article scoring using user-defined keywords and extended RSS tags
  • Scheduled publishing and printing
  • HTTP authentication and cookie support
  • Improved throttling support and adhering to servers’ TTL setting

There are also some ideas I had envisioned early on in the project, prior to starting implementation, that have been moved to the recycle bin. Nothing strange with this, it is a normal reality check once you get down to the fine points of how things are supposed to work. For example, I had planned to rank articles according to web popularity (Technorati, Digg, delicious, Google, Yahoo, etc.). After much research of the various service APIs it is clear to me that this is simply not possible. Having x articles would mean sending x web requests to the various services. Until they support a technique for bundling together multiple requests into one, this feature will not be a part of FeedJournal.

In the meantime, I am looking for serious beta testers for future FeedJournal versions who will be rewarded for constructive feedback and testing.

Sunday, July 23, 2006

Test-Driven Development

Test-Driven Development is a paradigm shift with its novel approach to software development. It puts the fun back in development, while improving quality and end-user satisfaction.

Unit testing is one of the cornerstones in agile development. A comprehensive suite of automatic tests for your source code generates many benefits. Your confidence in modifying the source code will skyrocket because you know that if you unintentionally break something the tests will catch it.

But this is just the first step. By writing a test for a new feature before the actual implementation, you are set up to reap additional benefits. For most developers uninitiated in this technique, it sounds counterintuitive and like a big waste of time. Still, this is the way that I have developed software for the last couple of years, and I really can't see myself writing a substantial amount of code not using this technique.

The technique I described above is called Test-Driven Development (TDD) and is steadily gaining popularity. It stems from one of twelve extreme programming practices, and many friends and colleagues to whom I introduced it swear by TDD today. The main benefit gained from a test-driven approach is that you are approaching the solution from the top, from the user’s perspective.

Too many potential killer apps are destroyed by programmers who develop bottom up. When it comes to designing the interface (like a GUI or API), they find themselves tied down to their early ill-informed low-level design choices. By doing TDD you will let the requirements drive the development. As a positive side-effect it is a thrill to develop software this way, you are always focused on reaching one specific goal, usually not that far away. It is difficult to lose focus on what you are out to accomplish in the source code while trying to get a test to pass.

Automatic tests can also be used to specify programming assignments. You hand your colleague a set of tests that lack implementation and ask him to implement the required classes so that the tests will pass.

So how do you do this in practice? Well, if I were you I would head straight over to xUnit’s Wikipedia entry where free tools are available for almost any language/platform. For .NET development, nUnit is the testing framework of choice. Good luck with your tests!

Friday, July 21, 2006

FeedJournal Sample Issue


Yes folks, we have a world premiere, the first sample of a FeedJournal issue is available for your viewing pleasure! Let me remind you that the purpose of the FeedJournal project is to generate a PDF newspaper based on RSS feeds, intended for printing. The PDF file is available for download here. In order to open it you will need Adobe Reader or Foxit Reader.

The content spans a selection of last week’s blog entries from the Made In Express Contest finalists. I chose these feeds, not because I want to plug the contest, but because I want to avoid breeching copyright law for republishing other blogs’ articles.

So what can you see in this sample issue? The following settings are in use: A4 paper size (a European standard), 4 columns, 0 points line spacing, 8 points column spacing, 30 points page margin and 10 points margin between headline and article text. Furthermore, the headline is Times New Roman (22 pt bold), article text is Times New Roman (8pt), publishing date is Lucida Console (5pt) and news source is Arial (9pt italic). All of these settings, and others, can be customized from the application’s Options dialog.

But there are also things that you cannot see in the sample. Like for example images. Beside the masthead (newspaper lingo for the first page logo), there are no images. Future versions of FeedJournal will include support for images contained in blog entries. Another thing not visible in the sample issue is the already implemented support for long articles to jump between pages if they do not fit. The reason is simply that there weren’t any long articles available in the selected time span.

And let me finally take the opportunity to congratulate my fellow finalists for getting published in the newspaper! ;-)

I would appreciate any feedback regarding the sample issue, don’t hesitate to contact me by using blog comments or e-mail me at contact@feedjournal.com.

Wednesday, July 19, 2006

The Modern Emigrant

When I decided to move to a different place of the world two and a half years ago, I knew it wouldn’t be easy. My confidence was strengthened by the knowledge that I am adapting fast to new situations. Internet has been a big help for me to stay in touch with my roots, but there are still hurdles which emigrants will always face.

Deep in Swedish culture we find Wilhelm Moberg’s classic book “The Emigrants” (in Swedish “Utvandrarna”). It tells the story of a family’s decision to move away from hard times in Sweden to try their luck in America, and their subsequent lives there. The story is written in mid-twentieth century and takes place a hundred years earlier. The framework of the story can still today be related to in many parts of the world where people flee poverty or worse, seeking new golden opportunities elsewhere.

The situation for me, and others who decide to emigrate from modern western countries, was different. I didn’t escape anything; I had a good life in Sweden with friends, family and employment. I came here for the very modern reason of having met my life companion over the Internet. Coming here I left my entire family behind. In the days of Moberg’s story, moving to another continent basically meant being cut off entirely from relations with your old country. News and other communications traveled at a laughable speed compared with today’s global broadband networks.

Internet as a communications media has really transformed the life and experiences of the modern emigrant. Living in a different continent, I still have the possibility to listen to live Swedish radio, watch the latest newscasts and read the latest local news from my old hometown. I don’t miss one episode of my favorite Swedish reality TV show. I strike up a text, voice or video conversation with old buddies no matter if they are back home in Sweden or playing poker in Las Vegas. Tools like Miranda (IM), Skype (VOIP), Juice (podcast), µTorrent (BitTorrent), Firefox (web browser) are closing the distance between being home and away. All of this is of major importance because it lets me stay in touch with my roots and also use my mother tongue, to which I will always return for inner peace.

Internet as an e-commerce tool is growing slower but at a steady rate. I still buy my books from Amazon, just as I did before I emigrated. Amazon’s price, service and delivery time are the same here and there. I spent considerable time in my new country trying to locate book shops which carried the right books for me, but in the end it was a waste of my time. Amazon is simply what I am used to and where I feel comfortable browsing and buying books.

Still, some of the problems emigrants face are eternal. The language barrier is a major obstacle for every emigrant. Adapting to a new language is a hurdle that you got to pass in order to assimilate into your new society. Going to the supermarket and asking them in English (assuming it is not the country’s native tongue) where to find the mayonnaise is like putting a huge stamp on your forehead saying: “I don’t belong here”. Belonging and assimilation are equivalent for the emigrant, and the answer lies in mastering the language. And by language, I also include body language, which is just as hard to master as the spoken language.

There is still another hurdle the emigrant must pass in order to assimilate, and it’s a tough one once you have passed a certain age. You are not familiar with local celebrities in your new country, no matter if it is sports stars, singers, TV hosts, authors, business men, politicians or actors; you are simply clueless. It is similar to trying to solve a New York Times crossword puzzle for a non-American or a Guardian puzzle for a non-Brit. All those clues about “Jeopardy host” or “Folk singer Guthrie” make you put your pen down in despair.

What all of this boils down to is that emigration is and continues to be a great adventure and learning experience for me. Looking back upon my decision to live in Israel, I don’t regret it for a second.

Monday, July 17, 2006

Rockets and Progress

In an instant the situation here has deteriorated. Rockets explode closer and closer to our home (so far a safe distance away), and it will surely take time before we will see and end to it all. Native Israelis are more relaxed about the situation, more adapted, or perhaps it's just an image they are putting up. Having recently become a father makes me worry about my family's security. Between closely monitoring the latest headlines, spending time with our 1.5 month old daughter Noa and working my butt off at my day-job, the contest deadline is slowly closing in.

I started to write the FeedJournal help file but I haven't decided on a format yet. HTML is attractive because I can easily host an online version of the help files, while keeping them up to date with minimal maintenance. CHM files are more standard and look more professional though. The jury is still out...

The application itself is starting to be finalized and I haven't forgotten my promise to submit a sample PDF newspaper issue here. Patience! For now here is a screenshot of the main window.

Tuesday, July 11, 2006

SQL Server 2005 - Everywhere Edition

Microsoft recently announced a new edition in their SQL Server 2005 family of products: Everywhere Edition. This is a free and lightweight version of SQL Server 2005.

So what is different from the Express Editions that is required for us Made In Express Finalists? I can only talk for myself but the Everywhere Edition would be more suitable than the Express Edition for my Windows Forms application for a number of reasons (source: Steel Price's blog):

  • runtime size is only 1.4MB (in-process),
  • single data file without transition log,
  • smaller redistributable package,
  • embeddable in applications.

In short, Everywhere Edition is more system resource friendly! Of course, there are some limitations in Everywhere, compared with Express, for example it cannot run as a service and lacks multiuser support. These issues are not relevant for my project FeedJournal though.

So what do you say Microsoft: can we use the Everywhere Edition in Made In Express Contest?

Sunday, July 9, 2006

Creativity as Driving Force

Take a minute to remember the last project you completed alone. Can you remember the satisfaction of seeing the pieces fall into place to build a greater whole, to put the finishing touches and perhaps launch it publicly? This satisfaction, in its best moments, defines one of greatest feelings in life. It is the driving force for artists, hackers, bloggers, journalists, and anyone who lets their creativity be a central part of their day-to-day activities.

Creativity can be manifested in different ways for different people. The force of it is just as powerful though, no matter if it is being used to cook, do gardening, writing, drawing, composing music, or anything else. I am a software developer, and my choice of profession has a lot to do with getting an outlet for my desire to be creative. It is my firm belief that people gain happiness and satisfaction from nurturing and giving in to their creative impulses.

Society brings with it social pressures and expectations as well as stereotypes we are expected to fit into. These are stifling our creativity, and it is up to each and every one of us to find our own way. To find our own way is not an easy thing and we must constantly fight this war, in order not to fall back into stereotypical behavior and dissatisfaction. It is by leveraging our creativity that we can force this issue to our advantage. The war against stereotypical behavior must be fought on many fronts: professionally, as a family, in your relations with close ones, and of course in your dealings with yourself.

A personal example: Last year I decided that I wanted to start my own software development business. This decision stemmed from the fact that I had always had creative positions in my professional life until I emigrated from Sweden to Israel. Here in my new country I started to work in a position where my creative juices weren’t flowing like I was used to. I was more and more missing the development work I always had been doing in the corporate world. I decided that the best way for me to express my creativity by building software applications on my own time.

It is the first time I am creating a large software project on my own, including marketing and selling it. It is nothing short of amazing. Everyday I am learning something new and the fact that I am my own boss means that I can focus my creativity in the direction where I am feeling most productive that day. One day it means writing articles or blog entries, another day it means coding or web site building.

Going it alone in the software business is of course not a new phenomenon (small shareware shops were heard of decades ago), but there is a rather recent term for it: micro-ISV (Independent Software Vendor). It connotes to one or a few individuals who are building and selling software products. The term was coined by Eric Sink in an MSDN Magazine article, and it stuck in the industry. Today, there are books, active forums, podcasts and web sites dedicated to help out the budding or already blossoming micro-ISV entrepreneur. These micro-ISV and shareware people who are going it alone have all made a proactive choice about using their creativity daily.

I think there is a reason we are seeing a entrepreneurial boom in the software industry today. The growth and acceptance of e-commerce along with more powerful and affordable Rapid Application Development tools (Visual Studio Express comes to mind), makes it much easier for the single software developer to make a living today. It’s a beautiful world where creativity can pay the bills!

Wednesday, July 5, 2006

Why FeedJournal? (or why the information age matters)

The idea of an RSS syndicated newspaper came to me when I was subscribing to a morning newspaper last year. I hadn't had a morning paper for years then, so it was all a bit new to me. I really enjoyed to have access to news hot off the press, which I could read without having to stare into the computer monitor; for example in the comfort of my bed, sofa, or while traveling. But there were two things I strongly disliked about it: the monthly subscription was fairly expensive and I didn't really care for a majority of the content in the newspaper. The competing newspaper had a few sections that I would much rather read, but I couldn't afford to spend my time reading more than one morning newspaper. I knew that there were better ways out there for accessing relevant news in a comfortable way. I just needed to find them.

Content is king. There are no two ways about it. When people were talking about the information age ten-fifteen years ago I didn't get it. I didn't see how the management and distribution of content could become so central in a society that it would name a whole time period. But I am starting to see it now, how a low signal-to-noise ratio can kill the greatest endeavor; how the delivery of timely and to the point information can be of extreme value; and how the production of high quality content in itself can form an outstanding business plan.

I’ll say it again, the "production of high quality content in itself can form an outstanding business plan". Traditionally and historically the great content producers also had to be great content deliverers in order to survive. They had to make sure that the newspapers or books were printed and delivered to make any kind of business. Today, all of this has changed. Today, we have electronic delivery of the same content that used to make up newspapers and books, through for example the World Wide Web.

But along with the change of delivery method we as customers are losing out on some of the great and time-proven ways of accessing the content. We need to make a compromise between reading a newspaper online with all the latest events, or in paper format using news that in our fast-paced life are already old (just by a few hours but still old). This is where FeedJournal comes into play. FeedJournal serves as a content deliverer and presents information from whichever sources you want in a traditional format that was the default way of reading news for a very, very long time.

Of course, this is just one out of many of FeedJournal’s benefits over a traditional newspaper. It also empowers the user with the option of collecting multiple feeds to create a newspaper that is tailored for her own needs: with the local team’s results, the stock portfolio’s development or even personal e-mail. It gives the user the possibility to choose the deadline to be the exact moment she wants, not six hours before it will actually be read. And of course the paper size can be decided: A4, A3, letter size or why not an index card version that you can put in your Hipster-PDA? Gone are the monthly subscription fees for delivery, you only need to pay for the actual content in case your favorite news source doesn’t provide it for free on the web already.

Saturday, July 1, 2006

Microsoft CodePlex

A few days ago Microsoft officially launched their open-source project hosting web site CodePlex. It is great to see Microsoft finally embracing and supporting the open-source community with an initiative like this. Like all web launches these days CodePlex is a work in progress, and even though the functionality is still a little thin, I see great projects coming out of it very soon. What makes CodePlex stand out compared to the established player, Sourceforge, is the user interface and user friendliness. Sure, it is limited to .NET projects but isn't that what we all are passionate about?

FeedJournal will not be hosted on CodePlex, but I will definitely consider submitting other projects of mine there, or joining something interesting. The reason I will keep FeedJournal off CodePlex is that I plan to take FeedJournal commercial after the publication of the free 1.0 version, which I will submit to Made In Express Contest.

Sunday, June 25, 2006

Newspaper Design Algorithm

As I was mentioning in an earlier blog entry, the part of the FeedJournal project which I have been feeling most insecure about is how to design the algorithm for laying out the articles in the newspaper. This is a critical step for a number of reasons: it has to look like a newspaper, it has to read like a newspaper, and it has to be pretty (the output PDF is essentially a part of the FeedJournal GUI).

Anyway, I am happy to report that significant progress have been in this area. I developed an algorithm which dynamically creates a newspaper with customizable:

  • number of paragraphs
  • margins
  • paper size
  • font
  • spacing between rows and various article elements

I have also implemented support for a headline font size which is a function of the article's importance/size.

Together with the masthead (newspaper lingo for the first page logotype) the whole creation starts to look pretty snazzy, if I get to say it myself.

The algorithm implementing the layout is pretty simple, but efficient. First, I gather the collection of articles which are due to be published in the upcoming issue. I sort these according to size/importance; this step is made very simple by the new Generics classes in .NET 2.0. Then I take the first article which fits into the next available space on the current page and remove the article from the collection and mark the page space as occupied. If no article fits the remaining space I will publish what fits on the page and add a page jump to another page where the article is continued. Basically that's all there is too it, and this algorithm works very well so far.

In one of the coming blog posts I will attach a sample PDF file to showcase FeedJournal.

Monday, June 19, 2006

SQL Server Strangeness

So I got up at 4:30 today in order to get some serious work done on FeedJournal before going to work or the baby wakes up. Well that was my plan at least. The first part went fine; I got out of bed, went for a short run and showered. By then the baby was awake though so I had to do some multitasking with one arm holding the baby, while the other hacking away at the keyboard. But that's actually much nicer than it sounds. Seriously.

Pretty soon I run into problems with my SQL database that has been working flawlessly until now. Whenever I tried to connect to it I was thrown an SqlException: "Failed to generate a user instance of SQL Server due to a failure in starting the process for the user instance. The connection will be closed." At first I thought it was due to an incorrect connection string but everything seemed fine and the database was in the right location. So I hit the waves of the WWW to try to find anyone with similar problems out there. Loads of people had run into the same problem, but in most cases they were using Remote Desktop, which was the root of their problems. I'm not using that, so I was left to my own devices again.

I tried to restart the development environment. I tried to manually restart the SQL Server services, but to no avail. It wasn't until I did a reboot that the problem went away, and now everything is working fine again. Crossing my fingers.

Sunday, June 18, 2006

NP-Complete

I have been sick with the flu for the last week and still don't feel so great. For this reason the programming hasn't really proceeded as I expected. However, I have been doing a lot of thinking in my head about the database and class designs. As soon as I feel better I will work on laying out the PDF newspaper dynamically, which I realize will be a tough nut to crack.

Basically the problem is related to the classic computer science problem of bin packing, which is NP-complete. NP-complete is a computer science term, standing for "non-deterministic polynomial time". It basically means that there is no simple solution to the problem. My approach will be to take some shortcuts and make compromises so that the layout will be acceptable from a design viewpoint, while not digging myself into a hole with a too complex layout algorithm

In the meantime, while waiting for the fever to go away, I am reading some academic papers on newspaper layout and bin packing solutions. I don't think it will help my sickness, but it does make me sleepy.

Sunday, June 11, 2006

.NET multithreading

FeedJournal, like any RSS aggregator, needs to be efficient when it is updating the list of subscribed feeds. It is obvious that a sequential polling of feeds (check each feed and proceed to the next after finishing with the previous) will be sub-optimal in terms of performance and user experience. The internet requests will need to occur in parallel for optimal performance. However, if your feed subscription list contains more than a trivial amount of feeds, you don't want to congest your Internet line with all of these request at the same time.

IE7's RSS infrastructure calls this throttling, and it limits the number of concurrent web requests to 4. I don't see a reason to differ from this approach and implemented the same system.

One of the great things about .NET 2.0 is the easy-to-use infrastructure for multithreading and thread synchronization. By just dragging the BackgroundWorker component to the main form of my application I have all the threading support I will ever need. Starting a new thread in the application's process is then as easy as calling RunWorkerAsync() on the BackgroundWorker object. This will queue a new thread to be executed as soon as there is an available slot.

In FeedJournal's case the scenario becomes a little bit more complicated since if I let the method that iterates the feed updates run in the same thread as the GUI, it will become unresponsive. Therefore the main thread calls RunWorkerAsync(). The background worker iterates over all feeds and calls ThreadPool.QueueUserWorkItem for each item.

Throttling the maximum number of concurrent downloads is then simply achieved by the line:

ThreadPool.SetMaxThreads(4, 1000);

telling the ThreadPool to have a maximum of 4 actively executing threads at any given time.

Wednesday, June 7, 2006

FontDialog and Font Paths

One of FeedJournal's system requirements is to be able to customize the fonts in the PDF newspaper. Honesty I thought that this would be a piece of cake. But, I run into some problems...

In the PDF file you can specify Type 1 and Type 2 fonts. Type 1 are common fonts, such as Courier, Helvetica and Times Roman. Adding these fonts are very straightforward since the PDF format supports them natively.

However the difficulties begin when the user should be able to select any font. The Type 2 fonts have to be specified using an absolute path to the font (which can be either TrueType or OpenType). No problem right? Yeah, that's what I said yesterday too. I tried to simply add a FontDialog to my settings form. From the control I wanted to get the selected font's absolute path. No dice... No matter how hard I looked for the suitable property in the .NET's Font class, it simply didn't exist. Actually I didn't find any property in the Font object from which I could deduct the correct path (there is not necessarily a correlation between the font's name and filename). I was scratching my head for a long time until I cam up with a solution, which is working good .

I created a static class called InstalledFonts, which upon startup gets the path in the SystemRoot environment variable, and iterates over all *.ttf files in the Fonts subdirectory. For each file it finds, it tries to load it into a PrivateFontCollection and checks which styles are associated to it. Each font found is added to a Dictionary mapping fonts to their system path. Later on I simply use this dictionary to make the mapping between installed fonts and their path.

Monday, June 5, 2006

Project Management with ToDoList

Reading my fellow finalist Douglas Steen's entry about bug tracking tools, I am totally agreeing with him that it would be great to have a lightweight bug-tracking tool built into Express. Sure enough, we have the Task List pane where tasks can be sorted and having a priority but that's not really accomplishing anything substantial.

Douglas chose a web-based bug tracking system and he mentioned another web-based system. Hunting the Internet will lead you to yet other web-based systems. Why does 99% of bug-tracking systems have to be run in the browser? I hate the browser: it is less responsive than a native Windows application as well as usually lacking a menu and having quirky keyboard support.

Just because a system is multiuser doesn't mean that the browser is the only interface. The large advantage I see of using the browser is that no client software will need to be installed and we will support multiple operating systems, but I would happily trade this for a native Windows interface.

I was hunting high and low for the Holy Grail of bug tracking systems until a couple of months ago, when I finally discovered a wonderful freeware application called ToDoList.

ToDoList is the perfect application for a single developer who wants to manage any project. The interface is a bit on the complicated side, but can be customized it to suit your own requirements. For each hierarchical item you can add formatted comments, priority, estimation, tags, dependencies, etc etc. There is also a possibility to export the task list to XML for web publication along with a zillion other neat features.

ToDoList is hosted on CodeProject and is being actively developed with new features at a continuous pace. Try it, you won't regret it! I am actually writing each draft of my blog entries inside ToDoList.

The Feed Format Jungle

I have started the implementation of my project in C# Express Edition, and one of the first things I have stumbled upon is the frustration of having to deal with many different XML feed standards. There are RSS and Atom, each of them with several different sub-versions. But that's not all. We also have a slew of Internet cowboy hackers who don't have any desire at all to follow these standards. In short, RSS/Atom land is a jungle. Time to take out the machete! When researching the options of a suitable machete for the feed jungle, the following 3 caught my attention:

  1. Atom.NET + RSS.NET
  2. IP*Works
  3. Microsoft's RSS library, included in IE7
  4. Rolling my own component based on .NET's XML support

Atom.NET + RSS.NET

These are two separate open-source libraries, implemented in C# .NET, which enables users to work with the two feed standards and all of their sub-standards through a .NET programming interface. Unfortunately the two components expose two interfaces without much similarity. In addition to this the program is not in active development any longer Instead the author is creating a commercial closed source version of the components.

IP*Works

When registering the copy of Visual Studio 2005 Express Edition, one of the freebies that Microsoft offer you is a license of IP*Works' RSS component. The word free was misleading me for a while, until I realized that I was being offered a free developer license only, without any rights to distribute the component with the applications you are building in Express.

Microsoft's RSS library, included in IE7

With the upcoming Internet Explorer 7 (included in Beta2), Microsoft has really outdone themselves with the RSS/Atom support. Included in the browser will be a feed repository that any application can use to know which feeds are of interest to a user. Also articles and their read/unread state will be stored here. However, IE7 requires Windows XP or above, cutting off a large piece of the current end-user segment.

Rolling my own component based on .NET's XML support

Of course, being a developer, you are always attracted by the possibility of rolling everything yourself. However, considering the abundance of RSS/Atom formats out there, this would be suicide if I attempted this during the short time available to build FeedJournal within the contest.

Conclusion

After some prototyping with the different options I decided to go with the open-source Atom.NET and RSS.NET components. However, I quickly noticed some bugs and limitations, that I fixed in the components (the wonder of open-source!). I am wrapping Atom.NET and RSS.NET in my own classes "Article" and "Feed" which have different constructors for the different feed types.

Sunday, June 4, 2006

Ode to Visual Studio Express Edition

Using the Visual Studio Express editions to build a software product is a delight. I have been using Visual Studio for years, and can testify to the great quality of Microsoft's development tools. When asked about my favorite application all categories, I always answer VS. With the latest Express editions, Microsoft have outdone themselves again. Beside making the IDE available for free, there are many important new features in this package.

My hands-down favorite feature must be the built-in refactoring support. I have been a huge fan of Martin Fowler's landbreaking book "Refactoring", since its publication in 1999. Since I have been mainly developing in C/C++ during my development career, I have not had the privilege of using any refactoring tool professionally. (refactoring is dependent on reflection support, which is difficult to achieve, if not impossible, in C++ with all of its powerful features). With the advent of .NET and the initial versions of Visual Studio .NET, came the first 3rd party commercial refactoring tools, which were pretty decent but costly. I am very pleased to see Microsoft taking this step and integrating refactoring support within the IDE. The most common refactoring, "Extract Method" (to make a selected part of a method a new method) is included as well as "Rename class/method/variable". The only refactorings I am really missing from this basic package are "Extract Subclass" (to create a new class from a set of class methods) and "Move Method" (to move a method to a different class).

Other neat new things I like about the Express edition are the keyboard customizations, code snippets and code templates.

OK, that's all fine and dandy, but what can be improved? Well, I realize we are talking about first-class software that is being given away free of charge here, but it is still annoying me to see that there is no way to integrate source control in the Express editions. I would have liked to run the free Subversion system integrated in C# Express. It is also annoying that add-ons are not officially supported, although a few notable exceptions exist: nUnit and SQLite are both using unofficial workarounds to enable their components to integrate with the Express Editions.

Friday, June 2, 2006

Domain Names

OK, time to return to the blogosphere after my honeyweek with the baby.

I have set up a web site at feedjournal.com where all things related to my project will be collected and presented. In the meantime I have put up some basic information together with the project goals. I bought the domain from GoDaddy.com, and it was a very straightforward process.

feedjournal.com was actually not my first choice of product/domain name. I was initially having my eyes set on a different name but the .com name was taken. Or rather not taken, but parked, like almost all decent .com domains today. It's pretty frustrating to see that one after the other of all your candidate names are taken, and when you try the more esoteric names you find them taken as well. And then you try the really absurd names, and sure enough, none is available. Not that these domain names are in use, many are just bought by companies who sell them on for much higher prices.

Sunday, May 28, 2006

I am a Father!

Today, my wife gave birth to a beautiful baby girl weighing in at 3,276g. Both she, and her mother are well.

This also answers Kim's question about my sleeping patterns: I count on getting no sleep in the coming months...

Wednesday, May 24, 2006

Choosing FeedJournal Output Format

When I first started spawning ideas about an RSS reader that would print the articles as a regular newspaper, I had a tough choice to make between output formats. My main options were:

  • HTML with CSS
  • Microsoft Word
  • Adobe's PDF format

There are also other document formats (RTF, etc) I considered but quickly rejected.

Let's look at each of these formats in order to see how I came to my final decision. The main factor guiding my choice was having the result look professional, with justified multicolumn paragraphs for instance.

The thing is that I would love to be creating an HTML page with CSS styling because of the portability. Basically the full published issue would be contained in one HTML page (with a few hyperlinked image files). This package would open on any computer with a decent web browser. Also, page breaks are readily available using the <br style="page-break-before:always;"> tag. However, the problem comes when trying to figure out the size a chunk of text will use when creating the pages.

The MS Word or RTF choices are immediately more attractive because they expose an API to create the documents, which should produce more maintainable source code. On the other hand the Word format is a closed format as well as the API.

Then we have the third option, PDF, which on the surface doesn't offer any benefits over MS Word (besides being an open format), only a more quirky client which by default takes ages to start up. But some research-hours later and after finding iTextSharp I reached the conclusion that PDF is the way to go for FeedJournal! iTextSharp is an excellent open-source component written in C# for generating PDF files using the .NET platform. Using an open-source API for creating the PDFs is a significant improvement for a developer, allowing deep debugging of code sections and finding the root cause of exceptions. And should I find a bug or limitation in the component I have full control over the source and can fix it without being dependent on others.

Besides, the startup performance of Adobe Reader is easy to cure. And if you are completely allergic to Adobe Reader there is a beautiful lightweight freeware alternative in Foxit Reader.

Then of course there is the additional benefit of supporting the new ubercool eInk gadgets hitting the market right now, with all of them supporting PDF natively. More about these in future blog posts.

Saturday, May 20, 2006

FeedJournal.com

As I have mentioned on the blog before, the big project I am working on right now is a feed aggregator in the form of a paper newspaper. This application is currently being developed using the .NET 2.0 framework. By using this development environment I automatically qualified to enter Microsoft's $10,000 Made In Express Contest where the idea was picked along with 11 other finalists.

I have previously used the name "RSS Star" for the project, but from now on the name will be FeedJournal. Information about this project is available at www.feedjournal.com - and as part of Microsoft's contest I will also be blogging at http://spaces.msn.com/madeinexpress6

Saturday, May 13, 2006

I'm in!

I got an e-mail from Microsoft letting me know that I will be one of the 12 finalists in the Made In Express Contest. That's way cool! I will keep a blog updated at the contest site but I intend to double-post the entries hare as well.

I am thrilled to get the privilege of competing as a finalist in the "Made In Express Contest!" with my vision of an RSS aggregator in the form of a paper-based newspaper or magazine. What is most exciting for me is the opportunity I am getting to build the project within this contest, with all its opportunities of making it visible to the public.

Wednesday, May 10, 2006

Made In Express Contest

Microsoft called me up on the phone today to discuss my submission for the "Made In Express Contest". The newspaper project I submitted for the contest seems to have grabbed their attention, and I am now a finalist candidate. Apparently we are down to 30 contestants now, out of the original 1500 submissions. The finalists should be published in about a week and a half, if everything goes according to plan.

Anyway, this is a very good sign that my newspaper project can find a niche in the market. Now, I just have to wait for Microsoft to make their final choice...the suspense is unbearable!