Reading about Writing

I think it was as shocking to me as it was to Garrett when I confessed “I really want to be a writer,” on our second date. It was one of those thoughts that you’re not really aware of until it leaves your mouth. The really suprising part is that after it was out there, and I realized what I’d just said, I did nothing to back pedal. It was just out there, and Garrett accepted it as one of my dreams, one that he’s supported, quietly, ever since.

Shortly after “the confession” I heard Stephen King interviewed on Fresh Air, talking about his book, “On Writing.” I rushed out, picked it up and read it cover to cover, twice. I’d never really considered what being an author entailed and King’s discussion of the process and the pitfalls made it a little more real to me. It also began to disabuse me of the notion that the only way to be a writer was to be an Author, capital “A”, words for the ages. Lately I’ve been thinking more about writing and, as a result, reading about it as well.

First, there’s William Zinsser’s On Writing Well, with it’s subtitle of “the classic guide to writing nonfiction.” I didn’t notice the subtitle when I picked it up on a whim, and it’s probably a good thing. The back compares the book to The Elements of Style, which is a bold assertion. Zinsser lives up to the claim with a practical and readable volume. Zinsser divides the book into four parts, but he ends up talking about two themes: how to write and what to write. While the focus is definitly non-fiction, I think the principles can be applied to all writing. I finished the book feeling like I could tackle any writing assignment, all the while plotting revenge on my middle school english teachers for making grammer and syntax seem so, well, difficult.

While I was still working my way through On Writing Well I heard Chris Baty as a guest on NPR’s Talk of the Nation. Baty, for those unfamiliar, is the founder of National Novel Writing Month, or “NaNoWriMo”. NaNoWriMo participants committ to writing a 50,000 word novel in the space of 30 days. Baty is the first to admit that some of the results are real pieces of shit, but the focus has never been on quality. Baty’s theory goes something like this:

* Lots of people say they want to write a novel. * Far fewer people do it. * People work better under deadline. * If you force 50,000 words out of someone, at least some of them will be interesting. * The point isn’t to be a published author, but to gain the confidence that comes from saying, “I wrote a novel.”

So while in San Francisco earlier this month, I wandered through Borders and picked up No Plot? No Problem!, Baty’s “low stress, high velocity guide to writing a novel in 30 days.” I finished reading NP?NP! by the time I returned to Indiana, and was really inspired by Baty. After reading the book, and thinking about it some more, it seems to me that too often we’re cowed by our fear of failure into believing that we can’t or shouldn’t try something new. I know I am. The local Civic Theatre was in desperate need of actors for a production of “Footloose” last year. I’ve never acted in my life, but the idea really appealed to me. But I didn’t even audition. And I regret that.

I don’t remember how, but shortly after finishing NP!NP? I ran across Believer, an “an amiable yet rigorous forum for writing about books”. And it is. It’s published by McSweeny’s, the same folks who bring you the quarterly short story collections. I can’t even told you why, but I ordered a subscription, probably convinced by the promise of a free copy of Nick Hornby’s new collection of essays, The Polysyllabic Spree. The essays first appears as his monthly column in The Believer, and all center around the books he bought versus the books he read during the month. As someone who can only be described as a hoarder of books, I definitly sympathized with his struggle to read all he bought. I also felt validated by his honesty in admitting that with certain books, he wasn’t going to read them. Not any time soon. Anyway, regardless of your authorly aspirations, TPS is a funny, charming read, and it’s already changed my book buying habits. I’ve taken the time to investiage the local used book store, Hyde Brothers, and predict I’ll be spending lots of time and money there in the future.

So there you have it. What I’ve been reading the last 30 days. The theme has been writing, but it’s got me thinking about creativity and creation more generally. And yes, I’ve started some writing and plan to do National Novel Writing Month this year. It’s November, by the way, although I’m a little more anxious, so I may make an early attempt. I’ll be sure to let you know.

date:2005-01-28 15:55:55
category:my life, reading

Python For Epiphany

Epiphany is a light-weight browser for Gnome built on the same rendering engine that powers Mozilla. Wednesday Christian announced the addition of Python bindings for their extensions. Very cool.

date:2005-01-28 14:48:57

New Hosting, Again

Well if you can see this post, the DNS changes have propogated, and has safely arrived at it’s new home. I’ve moved the domain to TextDrive, and not just because they seem really geeky. More importantly, they have amazing support, really smart people working for them, and Python 2.4 already on their web servers.

Of course, not everything’s quite up to speed yet. The photo albums are offline, as is the CVS repository. They should both be back real soon now, although CVS will be converted to Subversion. If you find something seriously amiss, let me know.

date:2005-01-26 07:05:11

Mr. CC Goes to Washington… and Oxford

It’s time for that annual rite of Python: PyCon. Once again scheduled for late March in Washington, DC, this year I’ll be pulling out two dogs and ponies (or is it one of each?). First, and most importantly in my mind, I’ll be presenting on our experiences developing ccPublisher and ccLookup. More to the point, I’ll be taking a pragmatic look at cross-platform development and deployment with Python and wxPython. Should be a good time.

My second presentation is going to be on using RDF with Python. It’s considerably less fleshed out than the former, but I hope to communicate what I’ve learned about RDF in Python. Things which would have been useful to have laid out in a straightforward, pragmatic manner when I started working on Creative Commons projects.

In other, slightly more exciting news, my Desktop Applications talk has also been picked up for the PyUK conference, otherwise known as the Python track of the ACCU 2005 Conference, taking place in April in Oxford, UK. If you’re located near Oxford and want to meet up to chat about CC, Python or both, drop me a line.

date:2005-01-18 15:35:40
category:geek, pycon2005, pyuk2005

ccValidator Updated

Looking in the archive, I see that I haven’t blogged about ccValidator in over six months. Because there was nothing to blog about. Today I updated ccValidator with a handful of bug fixes and a nifty make over. The bugs generally surrounded the decoding and detection of Unicode character sets. Several caused the validator to crash, and a couple just made the output, well, ugly. There’s a report floating around that ccValidator stil strips characters of their accents and other markings, but I haven’t had time to track it down yet (and don’t anticipate being able to do so for a bit).

In addition to the bug fixes, the most visible change is that now uses the same style sheet and layout as the A minor (and some would argue irrelevant) change, to be sure, but the difference has been bothering me for a while, so I took great pleasure in crossing that particular task off my list.

If you do find a bug in ccValidator, you can email me, just be sure to include the RDF or URI you’re trying to validate.

date:2005-01-14 11:04:34

“This means something”

Last night in my Computer Language Design class I tuned out the professor after the first 5 minutes. It’s not that the class doesn’t interest me, it’s just that an involved discussion of the taxonomy of languages (presented by a man I can only describe as the stereotypical aging CPA) puts me to sleep. So instead I read ahead in the textbook. Actually I read the end of the textbook, the section on functional and logical languages.

So it suprised me this morning when reading the Python Daily URL to see Bill talking about guards .

Bill points to Erlang as a model for guards and generics. I have to confess complete ignorance regarding erlang. But I like what I saw in Haskell. A brief example, defining the fact (factorial) function:

fact 0 = 1 -- zero step
fact n = n * fact (n-1) -- induction step

Haskell also has cool pattern matching and lazy evaluation. For example, you can create an infinite length list of even, positive integers with the following:

pos_ints = [2,4..]

I’m not sure what the “Pythonic” version of Haskell guards looks like, but the simplicity and elegance really appeals to me. And it seems sorta weird (in a cool way) that less than 12 hours after reading about functional languages, guards and generics, I find others talking about the same thing.

date:2005-01-14 08:00:00

ccP 1.0 Post Mortem, plus 2.0 Preview

So I spent the last week working from the CC San Francisco offices. During that time I did some planning, and started hacking on what will become ccPublisher 2.0. So it seems like as good a time as any to go over the process that was 1.0, and look ahead to what will become 2.0.

ccPublisher 1.0 Overview ccPublisher (ccP8 from here on out) went from nothing to production in six months. Not bad, if you ask me (although I’ll admit I’m more than a little biased). During that time we developed quite a few pieces of infrastructure, as well of interconnecting pieces. Not only did we develop ccP8, we also developed and accelerated several other Creative Commons related pieces of code. So the purpose of this piece is to review what we did right, wrong and otherwise, in an attempt to further improve the 2.0 development process.

What went right

* CC Web Services: ccP8 uses the nascent Creative Commons web services to render our license chooser interface. While we had begun the discussion of providing a web-service alternative to the partner interface, things hadn’t moved forward that quickly. With the immediate need of ccP8, we developed the first working beta of our web services. You can find more information here, and we’re hoping to refine the API further in the near future to make them more generally usable for our partners. * PyArchive: A key driver of ccP8 was a need to mask the cumbersome, onerous upload process at the Internet Archive. The Archive has an “advanced” contribution engine available, and that was what we used for ccP8. PyArchive is as Python package which wraps this process. While not perfect (and currently being improved), PyArchive stands out an example of what we did right for ccP8 1.0. Nearly completely independent from the rest of the ccP8 code base, I found it easy and managable to implement changes and improvments to the code base. Look for a standalone release of PyArchive in the near future. * Coordination with IA: The Internet Archive, and the help they provided me, can not go unnoticed. ccP8 would not have hit 1.0 without their help and cooperation. Props to Jon, Parker and the gang. * Crossplatform support: ccP8 grew from the ccTag codebase. ccTag was initially developed as a one-off contract project with Creative Commons, and part of that contract was support of both Mac OS X and Windows (and Linux, if possible) from a single code base. This drove many early decisions, and was carried over to the ccPublisher project. And I think on this point we did fairly well. The codebase has very little in the way of platform specific work arounds (mostly just pathing for things like preferences) and I don’t recall a point where we really broke it on one platform in favor of another, something that’s happened at times on other projects I’ve worked on (you know, “well, to do it ‘right’ we’ll make it work on Win32, and go back and fix OSX in the next iteration”).

What went wrong

* The wizard framework wxWidgets and wxPython provide a basic “wizard” widget: a set of pages with sequencing support. These work pretty well, but have a few inherent problems. First, you can’t add or remove buttons from the bottom; it’s always Previous, Next and Quit. Second, there are properties of the window you just can’t change, like whether resize is enabled, etc. We decided this wasn’t desirable. Finally, the wizard buttons don’t space right on Mac OS X. I’m sure Robin or someone is working on that (if it’s not fixed already; we did the initial development with 2.4 and are using 2.5 now), but we knew that OS X users were a core audience for us, so it needed to look “right”. These problems, coupled with a desire to load the Wizard from an XRC file, prompted me to develop the XrcWizard and XrcWizardPage classes. These classes simply provide wizard-like semantics to a sequence of panels, along with page changing notification. And that’s where I went wrong. ccP8 contains lots of sequencing decisions based on what the user entered in a previous panel. As the application grew, I did a really poor job of keeping the semantics straight. As a result, the XrcWizardPage and XrcWizard classes have lots of overlap right now. Either one can do validation of a page’s contents, and in some cases (I’m embarassed to admit) both validate the same page (although not the same aspects of it; things aren’t that bad). Additionally, the application “business logic” (for lack of a better term) is tied very closely to the user interface, making it more difficult to customize ccP8 than it should be. * Metadata collection Metadata collection in ccP8 sucks for two reasons. First, some background. An important goal of ccP8 is simplicity. To our way of thinking, the simpler the “basic” process, the better. I think this is an important goal; a big barrier to getting non-geeks to contribute to the Internet Archive is the current upload and import process. Early versions of ccP8 placed equal emphasis on either uploading to the Internet Archive or hosting the file on your own web site. This later changed to a focus on uploading to the Archive, with the self-hosting option considered an “advanced” path. So we made a few decisions, which weren’t all good. First, the metadata collection was split between several non-contiguous pages in the wizard. This decision was made because some was only used for the Internet Archive. A better decision would have been to simply include the Archive-specific metadata in the self-hosting RDF (mapped to Dublin Core or something). In our quest for simplicity, we also hid certain metadata fields under “advanced” buttons. I think there are 2 (if not 3) places you can enter “advanced” metadata. What really distinguishes these two pools of metadata? Is one more advanced than the other? In reality it’s an artificial distinction which only serves to confuse users. Finally, and related to the problems mentioned with the wizard framework, there’s no central data structure for storing metadata in the application. As a result, every place we want to use a particular piece of metadata we reach into the UI and read the value from it. Again, this makes customization harder than necessary (not to mention incremental changes).

Too Close to Call

* ID3: I didn’t really believe Mike when he told me that any task involving ID3v2 was a complete and total pain in the ass. I should know by now to listen to him. You’d think something so widely used would have standardized, complete libraries. It doesn’t. Right now we use two different tagging libraries in ccP8. One (eyeD3) does the actual tagging of MP3s, and the other (pyTagger) is used for upgrading files from ID3v1/2.2 to 2.3. Why not just one? Well eyeD3 only supports ID3v2.3, and pyTagger writes 2.3 tags in “compressed” form. This wouldn’t be so big a deal, except that Windows Media Player can’t handle compressed tags properly, refusing to play the file, and QuickTime Player won’t display the tag contents (which sorta freaks people out). So two libraries it is.

What’s coming Up

A big focus on 2.0 is on correcting the problems I identified above. There are a couple of overriding goals. First, I want to separate the user interface from the actual archive submission code as much as possible. Learning from what we did right (particularly with PyArchive), this should make life easier. Much easier. We also want to clean up the metadata storage and collection. Finally, we want to make customization of ccP8 (and derivative works) as easy as possible. This goal is going to drive several features, including modular metadata and modular backend implementations which will further reinforce the other goals (code separation, etc). I guess I don’t have lots of details to write about right now, but work has already begun in this area. Hopefully we’ll have a “preview” release real soon now. This preview won’t do anything except replicate existing functionality using the new code base. It should provide some good examples for people looking to customize the app, as well as give us a base to build new features on.

In the meantime, if you have suggestions or features you’d like to see in ccPublisher, write them down. Seriously.

date:2005-01-12 08:48:10

Best Buy Redeemed?

Bryan, Best Buy may have redeemed themselves in your eyes, but they’re still pure evil. Their employees, whether by ignorance or training, can be “considered harmful” to technology consumers who aren’t necessarily that tech savvy.

Consider this exchange: a woman is buying an iPod for her son. Employee: “Well you’ll definitly want the protection plan; the batteries don’t last more than a year, tops, and Apple can take up to two months to replace them, even though you have to pay for it.” Huh, that’s news to me, considering I have an older iPod that’s still going strong. With the original battery.

Or how about this. My sister was considering buying some home theatre equipment, and while a Samsung model fit her price range better, she was concerned about the audio quality compared to the Sony. “Well,” answered the [STRIKEOUT:snake oil salesman] “associate”, “no reason to worry; Sony bought Samsung, so they’re really the same now.”

Thanks, but no; I’d rather support a store which doesn’t out right lie to customers.

date:2005-01-07 17:06:34
category:my life

Happy New Year (and once again, where have I been?)

I rang in the New Year with friends in Milwaukee. Garrett and I drove up the 30th, and stayed with our friend Jeanie. New Year’s Eve Jeanie and Rich showed us a slice of Milwaukee, starting with the amazing Alterra coffee shop and concluding with a tour of the Milwaukee Art Museam.

Alterra is located in the former Lake Michigan Pump Station, which the signage helpfully informs was used to pump raw sewage out of Lake Michigan. Whatever its former use, the atmosphere is amazing inside: exposed brick, huge windows, and an almost library-like feel (in the best way possible). It probably helped that it was a clear, Midwest winter day, but I still felt an immediate connection.

The Milwaukee Museum of Art was also a really nice surprise. Rich said they’d recently renovated it, and I was very impressed with the modern and contemporary art collections. Not that I’m an expert, it just was more than I expected (for whatever reason).

That evening watched Hedwig and the Angry Inch. Once again I’m apparently the last to know about something good (witness my ignorant disdain for REM’s Automatic for the People in high school, only to discover it a couple years ago). Suffice to say, Hedwig is an amazing film. Visually, musically, everything. I wish I had followed up on Mark’s recommendation of over a year ago and watched it then.

So that leads me to my single New Year’s resolution. This year, I will live more. I’ll stop waiting to feel comfortable before putting myself out there: I’ll do it just because it is uncomfortable. I’ll go to the Avante Garde gallery openings, not in spite of not knowing “the crowd” but because I don’t know them — and because I want to know them. I’ll let you know how it goes.

date:2005-01-02 21:46:35