I think I'm in love with Olive. This isn't because I wrote it; in fact I was getting really nonplussed with it as the final pieces came together. I was really starting to wonder if an RSS reader was something I wanted at all, since I'd never used one before sitting down and writing this one. Even as the last bits of code (as it happened, the ones responsible for periodic feed polling) went in, I was kind distinctly blah: Whee. I've created an alternate way to have a big list of websites to look at every day.
Then I marked all the stories as read and walked off. Lo and behold! upon my return there was pure, sweet, fresh, new news from several sites, sorted by age and ready to read. It was like magic.
On a somewhat different (but very related) note, writing this was really important for me. I have sich a tendancy to come up with an idea and then just think about it forever, or partially implement it before deciding to think/redesign/research it some more. Eventually the ideas begin to approach nearly perfectly formed ultraflexable supremely generic solutions to an entire class of related problems, which renders me completely incapable of executing them.
So I started writing Olive on a whim, but soon I got really obsessive about it. I decided I was going to write a curses-based newsreader that worked the way I wanted, and that I was going to do it well, do it completely, and do it as fast as possible.
"As fast as possible" turned out to be the span of time from just after midnight on Sunday until about 1530h Thursday afternoon. That's not bad. And it's a little bit rough in places, but I believe it definitely also has a good amount of polish and elegance to it. It's not a barely-working hack. And it's not quite totally "complete" in the sense that I do still have a TODO list of small improvements and corrections, but it undeniably does everything neccessary to be classified as "a newsreader". So I am proud, and happy. It feels good.
One last tangent: I was worried about leaking memory. There is an absolute ton of stuff being shuttled around inside Olive to make it all work. Objects and references flying every which way...this is an inescapable fact of writing a Curses::UI app which is broken up into modules, all running with warnings and strict on. But to get some of the UI effects working the way I wanted, there are actually conditions created where widget callbacks trigger each other in loops. I just knew I'd not think something out well enough and end up losing a call somewhere in the stack. Miraculously, though, memory usage appears to stabilize once everything gets worked through (i.e. after all known feeds have been run through the XML parser and db populator once), even after hours of runtime and lots of purposeful banging about on the widgets with the tricksy callbacks.