Everyone else seems to be blogging about their project presentations, so I shall leap onto the bandwagon and also use this as an opportunity to pretend that this counts as a proper progress update.
I’ve uploaded my PDF slides which are rather brief, but give the general gist of the main features. What amazed me when I was creating them was the number of smaller features in Ephemera that I find really useful, but which didn’t warrant being mentioned in the presentation.
I really need to get organised enough to switch my subscriptions over from Gregarius to Ephemera and start using it properly - I’m really looking forward to it :-)
I’ve made a fair bit of progress since the last update (as I should, since that was 6 weeks ago). The first milestone after having a basically functional application was that of having a usable (and functional) application, and since then I’ve been adding features and tweaking code to broaden the scope a little.
One of the features I like, and the lack of which in other feedreaders is one reason I wanted to do this project, is demonstrated in this (large) screenshot of three entries that originate from aggregated feeds (i.e. a feed which republishes items from a number of other feeds, making a group feed). (Linked to is a screenshot of the whole screen for context; below are just the relevant portions if you prefer.)
One of the aggregated feeds I subscribe to is Planet Intertwingly. It’s interesting, but because it averages over 50 items every day I tend to skim a lot of the items, and thus am also subscribed to some of the individual feeds within which are deserving of more of my attention and whose entries I might skip over if I only had the aggregated feed. Because I read everything one feed at a time, with aggregated feeds coming last, when I get to Planet Intertwingly I always have to skip over a bunch of duplicated entries that I’ve just read.
So, Ephemera has the general principle that you should never have to see an unread entry more than once. If it comes across a feed item with a guid that it’s already seen in a different feed, it recognises that fact and doesn’t store a duplicate entry.
Related to this is checking Atom and RSS feeds for an Atom or RSS source element to see where the item has come from. You don’t even have to be subscribed to the second feed:

(Or the third.)

In the above example, the user was subscribed to Planet Intertwingly and Planet Perl, and the original source of the entry was found from the source element in Planet Intertwingly’s feed.
Below you can see that the article “More Progress?” was found in the subscribed-to aggregated feeds Warwick Blogs and Planet 3YP, but since neither feed identifies the source of the entry we cannot tell that it comes from Transport Tycoon 3D. (Incidentally, the entry has a different title in each of those two feeds and in the original RSS feed. I don’t intend to support that, except insofar as whichever feed gets there first wins.)

Happy to say, I not only finished my progress report on Thursday night (a full 3.5 days before it was due), I handed it in yesterday morning and everything. I’m still in a state of shock, given that this is the earliest I’ve finished an assignment while at university, if not ever. Sadly the only purpose of my industriousness was to free up some time for me to do that business assignment for Wednesday, but it’s still a nice feeling.
The report ran long, at about 3000 words instead of the recommended 2000, but my supervisor saw the first two-thirds of it and apparently didn’t think it was overly wordy or waffly, so I think it was justified. My major problem was that my appendices totaled about 5 times more pages than the report itself, thus making it impossible for the DCS stapler to force staples through the entirety of my work. I ended up with a strange hybrid beastie where two stapled halves were then stapled together; it seemed to do the trick though.
And then from Wednesday I get to start coding again! Hopefully I can get a lot done over the Christmas holidays because, let’s face it, it’s fun.
I started doing actual coding on Monday, save for a brief initial spurt last Friday afternoon, and by last night I had a basic application up, running and working. It’s very rough around the edges, has some hard-coded values that need replacing with actual lookups, needs much code tidying, but I can download feed data, parse it, store it, and display it appropriately for each user, all with my nicely normalized database. Yay.
The fun thing is that I’m actively working on two computers with two different databases; my laptop with SQLite and my desktop with MySQL. Luckily Django abstracts everything between the two, so I don’t have to change anything, but I have to stop and re-sync code and data every now and again. I think things are relatively stable now though; both databases finally have the same schemas and base data (namely: users, feeds, and who subscribes to what). It’s a good ongoing compatibility test.
One thing I probably should do is run Django on Apache on my desktop rather than just using the built-in development server: yet more diverse environments.
Having reached a first milestone of having the application actually functional, I’m going to stop coding until the Christmas holidays. Not that I don’t want to continue, but I have to do my progress report in less than two weeks, and also a business assignment that I know nothing about…
This is the formal specification that I submitted for my project, Ephemera.
I spent altogether too much time this weekend picking a theme for this blog. I have quite a lot of them installed at the moment, and because of the nice dynamic nature of Wordpress (which beats rebuilding your entire statically-paged-Movable-Type weblog) I’ve been changing the theme every few hours. Don’t blink, the stylesheet’ll hit you on the way out.
Unfortunately none of them are exactly what I want, so whichever one I pick I’ll have to tweak a bit, so really I could pick any of them… and so my indecisive nature won’t allow me to choose. I thought I had chosen one yesterday, but then I found that the comments.php file didn’t work (apparently it works under PHP 4 but not PHP 5), and, armed only with my very rusty PHP skills, I spent over an hour trying to determine why there was an “unexpected ‘}’ on line 64″ when it was just a simple if/then/else that looked absolutely fine in every detail to me. (I gave up.)
Down to actual work. I had finished writing a functional specification, which clarified my database design in my mind. I wrote out my database design, ready to translate into Django models, and along the way had a revelation about how the application would function, which unfortunately outdated half of my functional specification. So now I have to rewrite a lot of that, and add in some more detailed behaviour that I hadn’t got round to yet, in the next few days. Never fear.
Translating the database design into Django models made me think harder about some of the finer details of the data storage, and how the models related to each other. Luckily it didn’t leave me needing to re-think my design yet again! I think I have it now.
Well, as it says on my About page:
I am Cathy Young, a 3rd year Computer Science student at Warwick University in the UK. This blog chronicles the development of my third-year project, a web-based RSS/Atom reader called Ephemera. My other blog is bent back tulips.
Of course, in my mind Ephemera is going to be the greatest feedreader ever (well, perhaps second-greatest). Whilst restrictions of time and expertise will necessarily limit that end result rather dramatically, I still hope it will be able to stand out amongst the current small crowd of home-server feedreader applications. I have a couple of fun features up my sleeves, which I’ll reveal in the next post (rather fewer innovations than there used to be — I conceived of this project last year and several other people have since implemented novel features that I had been planning to incorporate first!)
Why “Ephemera”?
e‧phem‧er‧a [i-fem-er-uh]
1. something short-lived or transitory; lasting a very short time
I feel that describes the ever-changing face of a personal feedreader (items continually falling off the bottom, and new ones appearing) as well as most feed items rather well.