this space intentionally left blank

April 17, 2013

Filed under: meta»announce»delays

The Cruelty of One's Early Thirties

Normally, I try to have something written and posted here by Wednesday night each week, because I feel like that's the minimum I can write and still call myself a blogger. This week, unfortunately, between writing my textbook (highly recommended!) and trudging through Bioshock Infinite (not at all recommended!), my right wrist is probably in the worst shape it's been in for about five years now. To recover, I'm giving myself the week off from computers outside of work.

I figure you don't really need to know this, but if I write it up here, I'm more likely to stick to it.

While I'm complaining, my knees hurt and these kids won't stay off my lawn.

October 18, 2012

Filed under: meta»announce

idclev

I went back and forth on a number of ways to write this up, and eventually decided to just keep it simple: on Monday, I'll be starting a new position on the web team at ArenaNet, developers of Guild Wars 2.

It's funny: I've never actually played Guild Wars or its sequel. They're not really my bag (although I guess I'll have to spend some time in them, now). But ArenaNet, like all MMO developers, generates a terrific amount of data from its simulated world, and I find that potentially fascinating. Along with typical web development (and non-typical--GW2 uses an embedded WebKit view for a number of in-game functions), I'll hopefully be taking a crack at ways to expose and visualize that data for players. I'm looking forward to it.

June 1, 2012

Filed under: meta»announce»delays

Play It Cool

Did you know? If you buy a fan for a laptop, you should make sure to get the right one for the machine, so your video card doesn't start shutting down at 105° C (hopefully before causing permanent--and expensive--damage).

Back in a bit.

April 26, 2012

Filed under: meta»announce»delays

Delayed on Account of Soul

Soul Society, that is. Back next week.

April 4, 2012

Filed under: meta»announce

School In Session

This week, once again, I'm starting a new quarter of teaching at Seattle Central Community College, for Intro to Programming and Intro to JavaScript. If you're one of my students looking for my class materials, or if you're just interested in what I'm teaching, head over to my SCCC portal and check out the classes and the new student forum.

February 5, 2012

Filed under: meta»announce

UA All Day

While I've been waiting on my background check to clear for new day job, when I'm not teaching and/or working on lesson plans, and clearly in lieu of blogging, I've been working on improving the Urban Artistry web site. A lot of it has been rearranged and re-written, with the goal of making it punchier, with stronger calls to action on every page. It's also mobile-friendly, has more modern CSS, and removes about 6 years of accumulated detritus.

The other big initiative I've been working on for UA since the new year is this year's International Soul Society Festival. Last year's Soul Society page was a last-minute effort--we got the job done despite short deadlines and unreliable resources. This time, I wanted to fix some of the problems it had with print-oriented design, with mobile, and with being a high-maintenance, single-page site.

If you're in the DC area come late April, Soul Society is the place to be. Last year's festival had popping and b-boy battles, all-styles cyphers, great music and art, and some incredible judges' exhibitions. I'll be heading back to Virginia to attend myself. Hope to see you there!

May 3, 2011

Filed under: meta»announce»delays

Seattle Freeze

On vacation in the Pacific Northwest. Back next week.

October 26, 2010

Filed under: meta»blosxom

The PHP Version

About a year back, Mile Zero started to seriously drag in terms of performance, taking more than two seconds to render the page. The problem seemed to be a combination of things: the CGI interface was slow, it didn't run under mod_perl, and I had accumulated a vast number of posts it was having to sift through--which, given that my Blosxom CMS uses the file system as its database, meant lots of drive I/O.

Since I needed to dip my feet into server-side coding anyway, I rewrote Blosxom in PHP. There are a few PHP versions of the script online, but they seemed like a hassle to install, and none of them had support for the plugins I was using--it was almost easier to just do it myself. The result was faster, smaller, and proved to be a great first programming project. Since it's also proved basically stable over the last year, I've decided to go ahead and post the source code in case anyone else wants it (consider it released under the WTF Public License). I suspect the market for file-based blogging scripts is fairly small at this point, but you never know.

HOW IT WORKS

Essentially, both versions of Blosxom work the same way: they recurse through the contents of your blog folder, looking for text files with a certain extension (.txt by default) and building a list. Then they sort the list by reverse-chron date and insert the contents of the first N entries into a set of templates (head, foot, story, and date). Using a REST-like URL scheme, you can change templates (helpful for mobile or RSS) or filter entries by subfolder. It's primitive, but it's also practically unhackable, and it's an awesome way to blog if you like text files. Turns out that I like text files a lot.

Original Blosxom boasted an impressive plugin collection, which it implemented via a package system: plugins exposed a function for each stage of the page assembly process where they wanted to get involved, and the main script would call out to them during those actions, passing in various parameters depending on the task. This being Perl, the whole thing was a weird approximation of object-oriented code that looked like a string of constant cartoon profanity.

PHP provided, I think, better tools. So a plugin for my new version of Blosxom does three things: it sets up its class definition, which should include the appropriate methods for its type, as well as any class or static properties it might need, then it instantiates itself, and finally adds itself to one of several global arrays by plugin type. During execution, the main script iterates through these arrays at the proper time, calling each plugin object's processing method in turn. At least, that's how it works in theory. In practice, I've only implemented plugins for entry text manipulation, because that's all I needed. But the pattern should carry forward without problems to other parts of the process, although you might want to rename the existing process() API method to something more specific, like processEntry(). That way a single plugin could register to handle multiple stages of rendering.

ENOUGH OF THAT, HOW DO I INSTALL IT?

Just copy the script to a publicly-accessible directory, and edit the configuration variables to point it toward your content directory. The part that tends to be confusing is the $datadir variable, which needs to be set to your internal server path (what you see if you log in via FTP or SSH), not the external URL path.

Next, you'll need to set up your templates. For each flavor, Blosxom loads a series of template files and inserts your content. These files are:

  • content_type.flavor - Allows you to mess with the HTTP content-type, if you really want to.
  • head.flavor - Everything that comes before your entries
  • date.flavor - Format for the date subhead
  • story.flavor - Template for each story, including its title and metadata
  • foot.flavor - Everything that comes after your entries
  • 404.flavor - What to display instead of an entry if no content is found
In each of these templates, you simply write standard HTML, inserting a placeholder variable where the actual content will go. This process is identical to original Blosxom theming system, including most of the supported variable names.

At that point, when you put text files in the data directory, they'll be assembled into blog entries based on the file modification time. The first line becomes the title of the entry. You can categorize entries by putting them in subfolders, or subfolders of subfolders, and then appending the path after the Blosxom script URL.

I've included a couple of entry plugins, as well, just to show how they generally work. One is a comment counter for the old Pollxn comment system that I still use--the CGI script works fine for comments, but the Perl can't interface with the new PHP script to say how many comments there are on any given entry. The other is a port of the directorybrowse plugin, which creates the little broken-up paths at the end of each entry, so people can jump up to a different level of the category heirarchy. They're short and mostly self-explanatory.

LESSONS LEARNED

At this point, I've been blogging on Blosxom, either the original or this custom version, for slightly more than five years. During that time, I've had all the dates wiped out during a bad server transition, I've moved hosts two or three times, and I've tweaked the site constantly. I think the level of effort is comparable to people I know on more traditional blogging platforms like Wordpress or Movable Type. Of course, the art of writing online isn't really about the tools. But there are some ways that Blosxom has its own quirks--for better and for worse.

The big hassle has been the folder system, especially for a personal blog like this one, where I may ramble across any number of loosely-connected topics from day to day. Basing a taxonomy on folders means that posts can't span multiple categories--I can't have something that's both /journalism and /gaming, for example, which is unfortunate when writing about something like incentive systems for news sites. And once it's been created, you're pretty much stuck with a category, since most of the old links will target the old folder. There aren't many reasons I would want to switch to a database CMS, but the ability to categorize by tags tops the list.

On the other hand, there's something to be said as a writer for the flat-file approach. It has an immediacy to it that a database layer can't duplicate. I don't have to sign into an admin page, visit the "create post" section, type my code into one of those text-mangling rich editing forms, select "publish," and then watch it validate and republish the whole blog. I just open a text editor and start typing, and when I save it somewhere, it's live. Working this way is great for eliminating distractions and obstacles. There's no abstraction between what my fingers and the end product.

And while working via individual files is probably less safe or reliable compared to a SQL store, it benefits from easy hackability. I don't have to understand the CMS schema to fix anything that goes wrong, or add new features, or make wide changes. If I decided to change where my linked images are located tomorrow, I'd have all the power of UNIX's text-obsessed command line at my fingertips for propagating those changes. For an organization, that'd be insane. But it works pretty well as long as it's just me tinkering around on the server in my spare time.

Blosxom also ended up being a pretty decent content framework when I recoded my portfolio earlier this year as a single-page JQuery interactive. I tweaked a couple of themes, added a client URL parameter and a teaser plugin, and within a day had it serving up the desired HTML snippets in response to my AJAX calls, while still providing a low-fidelity version for JavaScript-disabled browsers. I'm sure you could do the same kind of thing with a serious CMS like Drupal or Django, but I don't know that I could have done it as quickly or simply.

I don't recommend that anyone else try running a web page this way. But as a learning experience, writing your own tiny server framework serves pretty well. It's a good challenge that covers the broadest parts of Internet programming--file access, data structures, sorting, filtering, caching, HTTP requests, and output. And hey, it works for me. Maybe it'll work for you too.

June 28, 2010

Filed under: meta»announce»delays

idnoclip

I woke up this morning to hear that Robert Byrd had died, and that I needed to fix the timeline we had made of his life. As I logged into the VPN, the screen went oddly pink and blue, like Doom's old Hall of Mirrors effect if you cheated your way out of a valid sector. Then it went black, and then it refused to boot to anything but an external monitor in Psychedelic Snow VGA Mode. The video card, it would seem, is fried. Luckily, I'm just barely within the three-year extended service plan (good until August!), so Lenovo is sending a box and will fix it for no extra cost. But I'll be without hardware for probably three to five days.

I've been on a vaguely weekly schedule here for a while now, so I figure going quite for another week won't shock anyone too much. I had planned, starting today or tomorrow, to write my one-year look back at b-boying, but it looks like that will have to wait. I'll also have to hold off on playing through more of Planescape: Torment, which is too bad since it was just starting to get pretty good, and I'm looking forward to rambling a little on its relationship with death and meta-gaming when I get a chance. And finally, I hope I've gotten the database bugs straightened out on NPR's client now, because it'll be a lot harder to debug and fix them on my lunch hour at work. Still, it's not all bad: forced breaks like this are no doubt good for my tendonitis, and maybe it'll give me some extra incentive to drill footwork for Crafty Bastards if the heat lets up. Here's to a productive week, and a speedy return of my soon-to-be-repaired Thinkpad.

Past - Present