-
Work has been insanely busy lately, but I have made some more progress with dbagg3. The code is all in CVS, so feel free to take a gander-- I don't have a ton of time for a proper write up, but I do want to spew a little bit.
As per my previous musings on XML in a SQL database, I revamped the database. Now things are sliced up by feed and entry tables, rows in each containing a few metadata columns and then one big column for an XML dump. This lets me index on date and parent feed and such, meanwhile punting on the issue of dicing things like authors or content up further. And, as extension elements start to show up, this handling is dumb enough to simply store things it doesn't know about without mangling them. This is a very good thing and one of my big goals for this beast.
The other thing that I'm getting excited about is the REST API built atop the Atom store. Rather than spend time on proper documentation, here's a quick dump from the appropriate module:
URL: GET /feeds/
URL: GET /feeds/{id}.xml
URL: GET /feeds/{id}/{yyyy}/{mm}/{dd}/{hstart}-{hend}.xml
URL: GET /feeds/{id}/{yyyy}/{mm}/{dd}/{hh}.xml
URL: GET /feeds/{id}/{yyyy}/{mm}/{dd}.xml
URL: GET /feeds/{id}/{yyyy}/{mm}.xml
URL: GET /feeds/{id}/now-{nowoff}.xml
URL: GET /feeds/{fid}/entries/{eid}.xml
URL: GET /users/
URL: GET /users/{uname}.xml
URL: POST /users/
URL: DELETE /users/{uname}.xml
URL: PUT /users/{uname}.xml
URL: GET /users/{uname}/prefs.xml
URL: GET /users/{uname}/prefs/
URL: POST /users/{uname}/prefs/{pname}.{type}
URL: PUT /users/{uname}/prefs/{pname}.{type}
URL: GET /users/{uname}/prefs/{pname}.{type}
URL: DELETE /users/{uname}/prefs/{pname}.{type}
URL: GET /users/{uname}/subscriptions.{type}
URL: GET /users/{uname}/subscriptions/
URL: POST /users/{uname}/subscriptions/
URL: DELETE /users/{uname}/subscriptions/{id}.xml
URL: GET /users/{uname}/subscriptions/{sid}/{yyyy}/{mm}/{dd}/{hstart}-{hend}.xml
URL: GET /users/{uname}/subscriptions/{sid}/{yyyy}/{mm}/{dd}/{hh}.xml
URL: GET /users/{uname}/subscriptions/{sid}/{yyyy}/{mm}/{dd}.xml
URL: GET /users/{uname}/subscriptions/{sid}/{yyyy}/{mm}.xml
URL: GET /users/{uname}/subscriptions/{sid}/now-{hours}.xml
URL: GET /users/{uname}/subscriptions/{sid}/now.xml
URL: GET /users/{uname}/subscriptions/{yyyy}/{mm}/{dd}/{hstart}-{hend}.xml
URL: GET /users/{uname}/subscriptions/{yyyy}/{mm}/{dd}/{hh}.xml
URL: GET /users/{uname}/subscriptions/{yyyy}/{mm}/{dd}.xml
URL: GET /users/{uname}/subscriptions/{yyyy}/{mm}.xml
URL: GET /users/{uname}/subscriptions/now-{hours}.xml
URL: GET /users/{uname}/subscriptions/now.xml
URL: GET /users/{uname}/subscriptions/{sid}/entries/{eid}.xml
Hopefully, the structure of these URL patterns make a little bit of sense. The too-clever thing about these is that they're both documentation in the module's docstrings, and parsed out to register methods with automagically-generated regexes applied to incoming URL requests. (I may eventually realize just how stupid an idea this is, but not yet.)
This list is nowhere near complete or final or even all that well thought out yet. But, it seems to be working out pretty well so far, and it's so easy to tinker with the API to sketch out ideas in working code. Eating my own dogfood, my first browser window of the day tends to open on this URL:
http://localhost/~deusx/dbagg3.5/api/users/default/subscriptions/
now-12.xml?xsl=xsl/full.xsl&content-type=text/html
This grabs the last 12 hours' worth of items from default's subscriptions, passing them through the XSL at xsl/full.xsl on the way to my browser with a content type of text/html. This tends to produce about 1000-1500 entries in about 15 seconds on my PowerBook, which is better than I'd expected.
Pretty soon, I'll be implementing the ability to post metadata onto feed entries under subscriptions. Then, I can mark items as seen, attach categories, tags, and notes. From there, I can exclude seen items from queries, produce new aggregate feeds based on my tagging or notes, among a few other ideas I've got stewing.
A little more work, and I think I'll be able to throw together the beginnings of a Bloglines-style three-pane browser interface, as well as improving the functionality of my own outliner-style display with XmlHTTPRequest-based calls to the API to enable refresh-free interaction. From there, I have some ideas for desktop apps and maybe even some tinkering in Flash. (Wow... has it really been over a year since I was writing about Flash & REST?)
And then, I want to implement the Atom API and allow users to create feeds to which they can post their own items and share read-only with others (or share writing with a group). From there, this thing can turn into a read/write Atom storage tank, serving both as an aggregator and a blog publishing engine, given the appropriate XSL work.
Lots of ideas stewing. Now I just have to get the time and possibly a new web server, since I'd like to eventually open up an installation of this to fellow tinkerers, but this poor little box can barely take what it's tasked with at present...
Oh yeah, and one other thing: I've been thinking about names better than dbagg3. The one that's sticking around in my head so far is feedReactor. What do you think?
[ ... 790 words ... ]
-
According to calculations, it may cost up to 200% more to develop games for the PS3 or Xbox 2 than it does for current systems.
Source: EA expresses ‘concern’ about next-gen technology
Here's some blogging for you. This article brings two thoughts to mind for me...
First is this: Of course, if you're striving for some semblance of realism in games, the costs will likely approach and exceed the cost to produce movies. It'll approach the cost because, eventually, you'll need either movie-grade animators or real actors. And then it'll exceed the cost, because who wants a game that's as linear as a 2-hour movie? If you want any replay value out of the thing, you're going to have to produce the equivalent of a 4-hour movie at least, if not a 20- to 40-hour movie. And then, you're going to have to be satisfied that many players will miss most of it. Once things reach this point, I think in some sense video games will have arrived as a "successor" to movies, as movies were a "successor" to radio plays.
This brings me to my second thought: Right now, I'm listening to a streaming radio station that's playing old sci-fi and drama radio plays, like X Minus One and The Shadow. These shows are great, and I'm thinking of buying a few box sets of them. These old radio shows get quite a bit of mileage out of their less technologically advanced medium. In contrast to this, my consumption of contemporary and popular television, movies, and music has been dropping off from year to year as I get more tired of supremely well-produced yet worthless content.
Music gets sold on anything but a good tune, movies sold on special effects over plot, and video games head toward technological supremacy over a fun hook or even an engaging story line. But, I don't want anything to do with any of these.
A few days ago, a friend of mine remarked that many "retro" video games were just as horrible as modern video games, but I have to disagree a bit. There were a lot of horrible games. But, for games to be successful back when the dazzle factor of the hardware was low, you needed the fun trick or clever twist that addicted players. The constraints called for ingenuity. Sometimes this meant pushing the hardware, and sometimes this meant coming up with a brilliant yet simple-to-implement idea. (Tetris, I'm looking at you.)
As the hardware platforms progress, we'll see more and more absolutely dazzling demos of the hardware sold as games that completely fail at being fun. But they'll have insane budgets and probably sell very well just because people want to see the pretty sparklies and foobar shaders. The increased capabilities will offer more expressive ability to interactive storytellers, but I bet it will just give even more excuse for game makers to be distracted from that and keep pumping out stories that suck carried by game play that reeks.
It all makes me almost wish for a kink in Moore's Law that stalls the progress of dazzling hardware and forces developers back to being clever with their resources and game ideas. Maybe we'll see more and more of an indie games community rise, producing genuinely fun and amusingly ingenious games. (Gish, I'm looking at you.)
Meanwhile, my girlfriend and I will be playing massive amounts of Magical Drop III.
[ ... 796 words ... ]
-
One should never think before one posts. That's been my big blunder. And one should never ever ever rewrite, fine-tune, or God forbid edit the post, either. As a blogger, you should form a picture in your mind of a man drinking a cup of coffee. Then imagine that he suddenly feels a dead fly on his tongue and here you'll see your role model. Let your words spew forth with speed and velocity, out of reflex and not reflection. Let them fly without any possibility of ever taking them back. And when challenged, insist that the challenger is lucky that you don't sue somebody, and if he or she thinks you're going to help clean that up, they're crazy.
Source: yellowtext: Oh...Hi! I didn't see you standing there!
Amen, blog brother (with thanks to Quirk Blog for the pointer). I wonder if I need to go on a Month of Blogging, complete with t-shirts, spewing here daily like a sort of NaBlogWriMo?
One should never put blogging on a pedestal, really. I mean, while I do aspire to doing some real writing (when I'm not so busy with work, as I have been of late), my blog-a-day writing shouldn't be all that painful. It looks like my server's on its last legs and the act of posting itself takes forever, so belaboring the actual content so much just puts the last straw on the shaven yak's back.
So, here goes... posty posty post, as they say on LiveJournal. (Well, I seem to remember someone saying that anyway.)
[ ... 279 words ... ]
-
[ ... 508 words ... ]
-
[ ... 1321 words ... ]
-
[ ... 170 words ... ]
-
I've just dumped what code I have into my CVS repository. So, go ahead and poke fun at it:
http://www.decafbad.com/cvs/dbagg3/
Or, fetch it from CVS:
$ cvs -d:pserver:anoncvs@www.decafbad.com:/cvsroot login
(Logging in to anoncvs@www.decafbad.com)
CVS password: anoncvs
$ cvs -d:pserver:anoncvs@www.decafbad.com:/cvsroot co dbagg3
[ ... 42 words ... ]
-
[ ... 893 words ... ]