Recently in Software Category

Speaking of git esoterica (and my Git Fundamentals talk), one of the questions during Part 1 was “what about the new switch and restore commands?”

The … uh … what now? So I did a quick search and, lo and behold, they were added late last year in version 2.23. The goal is help new users confused about the two most common uses of git checkout: switching branches and restoring files from the index, which admittedly have nothing to do with one-another, why are they managed by the same command?[*]

I see this as a definite positive development, and I wanted practice with them, so I could promote using them when I’m teaching folks, because I’m sure it will reduce confusion and improve velocity. I knew I had to go cold-turkey, so I deleted my git co alias and added a git sw alias to replace it.

It worked well enough, though I am still overcoming years of ossified motor-memory. But there was one glaring omission: my shell stopped tab-completing branch names. A minor annoyance, to be sure. But I didn’t realize how much I used it until it was gone. So I eventually went digging, and discovered this patch that added these commands (and a few other updates for 2.23) to zsh’s git completion.

I was not looking forward to trying to apply a patch across versions when I stumbled upon items in the base _git file that reminded me that zsh completion is handled via autoloaded functions. 💡 I might be able to extract them into files in my own autoload directory, and then I don’t have to muck with applying the patch at all!

Long story short(er), it works perfectly! You can drop these files into any directory in your zsh $fpath and if you open a new shell[**], git restore will tab complete command-line arguments and file names in the index / staging area, and git switch (or any aliased you’ve added to it) will complete its command-line arguments and branch names. Huzzah!


[*] Fun fact: in the very early days of git they were different commands, git checkout only switched branches, git checkout-index was how you restored files. But there was a clamor to make things “easier,” and the user experience never recovered. I see the new names as a huge step forward.

[**] Or run autoload -U _git-switch && autoload -U _git-restore in a shell you do not want to close.

This may be somewhere in 4D space, since it’s a bit of a corner case on a corner case, but I wrote a pre-commit hook plugin to handle a bit manual work required when dealing with git reverts.

Introducing: reinstate-revert-revert.

It automates the manual leg-work I would do when reverting a revert commit. Typically this is when I’m reinstating a merge commit that had to be reverted, usually as the first step toward fixing the bug that caused the initial revert in the first place.

This is definitely not something that comes up very often, but the amount of effor required was just annoying enough to make me want to automate it. It only took me, er, several years to sit down and do it. This was inspired by my most recent presentation of my two-part Git Fundamentals talk.

Hopefully it will save someone else a bit of time as well, and the savings can compound.

Thoughts on the Demise of Flash


[When I posted my glee at this announcement, a friend asked: “Could you explain what this means in English? How is it going to change what I can do on my Blackberry?”]

TL;DR? Jump to the direct impact on you.

It has been a crazy week. I have composed pieces of this in my head in spare moments, so hopefully it’s just a matter of getting them down and tying them together. Hopefully the days of rumination will have distilled out some of the prosthelytizing I will inevitably do.

So, assuming you haven’t already figured it out, what does [Adobe killing [mobile] Flash] mean for you and your Crackberry? I’m honestly not sure, but I have some thoughts:

Taking a step back, it is a tacit admission (murky marketing-speak notwithstanding) that Flash1, would take too much (additional) effort to shoehorn onto mobile platforms. And also that the few abortive forays into the mobile space have not really been viable. (Which is interesting given the PlayBook, which we’ll get to in a moment)

It is also an admission that everyone’s energy is better spent developing open-standards based web applications. This is something that many of us have been saying for a while, but only recently has it even partially viable2. And it is to Adobe’s immense credit that they’ve seen the handwriting on the wall and have taken the hard turn. So many companies who “own” a technology that defines, for better or worse, a space are more likely to bury their head in the sand and plow along insisting they’re still relevant. Right up until they fold.

But what does this mean to you, a Blackberry user? I don’t think it means much in the short term. It means you won’t see a Flash player on your device, but I don’t think that you have one now.

It also means that app developers can focus attention on building HTML 5-based applications/sites that degrade gracefully, yet consistently for less capable browsers (like, quite frankly, the BB browser), are much better adapted for accessibility (and by extension search engines and possibly the Semantic Web). And that browser developers can focus on delivering a consistent, standards-compliant experience (which RIM needs to do in a hurry, but more on that in a moment)

As for the longer term? That’s trickier, and a further twist was introduced within the last few days: See, RIM bet the farm on Flash with the PlayBook, and this announcement put them between a rock & a hard place. A few days afterward they announced that they were licensing the source from Adobe to continue updating it for the PlayBook.

In the long run this could be better for the PlayBook: they can customize it more for their particular hardware, and they don’t have to wait for Adobe to fix bugs.

But it is by no means a guaranteed win. And it definitely means that they’ll need more resources in the project (either people or time, and I know what I’d bet on), and the most likely source of those is the BB browser team, which will likely cause it to lag even further behind everyone else.

And none of this mentions the very (thoughtful) analysis in past months on the less-than-rosy outlook for RIM and the head-in-the-sand mentality of their co-CEOs. But I have babbled enough.

1 Flash, a technology designed for desktops (originally a stripped-down version of Shockwave for the web)

2 HTML5, while still very immature shows great, great promise. But I am not so idealistic (anymore) to believe that it will pan out exactly as we hope.

MovableType 5 and PostgreSQL 9

[Note to LiveJournal readers: this post is a week or so old, but I think I’ve finally vanquished the cross-posting demons]

When MovableType 5 was announced, there was a bit of a brouhaha about its lack of PostgreSQL support. Though it was completely unclear from the language of the announcement, all that meant was that PostgreSQL would not be officially supported and tested. The files would still ship with the distribution.

I discovered this fact just after the Slackers’ Network machine explosion, as we rebuilt from the ground up. Still, in the interest of the expedience of the restoration, we opted to install the latest version of MovableType 4, since our RDBMS of choice is still “supported.”

But when it finally came time to turn my attention to MovableType, I discovered it worked haltingly, throwing cryptic error after error (Can’t use string (“x42494e3a53455247000000000000000”) as an ARRAY ref while “strict refs” in use), with little else to go on. Well, that string is clearly not an array ref, but where is it coming from?

So, I rolled up my sleeves and dusted off the debugging tricks I’d learned when building my custom MovableType plugins (before there was much in the way of documentation for MT4)

…And I got nowhere fast. I figured out quickly that the string in question was ASCII (possibly UTF-8) encoded as a hexadecimal string. But the deeper I went, the more sure I became that this was some kind of decoding bug, because the data seemed to go into the database just fine, but it was being garbled on the way out.

A few weeks ago I sat down with Matt and we tried to puzzle it out. I'd done a lot of work to characterize the bug, but was stumped. With a fresh pair of eyes, rather than getting wrapped up in debugging MovableType’s own serialization logic, he had the epiphany to go look at PostgreSQL’s own encoding formats.

Lo, and behold! There is a new, improved output encoding format in PostgreSQL 9.0. So much improved it has been made the default. What's more, it looks suspiciously like the strings I've been looking at in the debugger.

Armed with that information, it didn't take us long to track down the means to revert a client connection to the old format, and apply it to our MovableType instance.

In our case, adding Setenv PGOPTIONS "-c bytea_output=escape" to the right portion of our Apache configuration was all it took.

TL;DR : PostgreSQL 9 changed bytea encoding defaults, if you’re having trouble with MovableType, try setting connection options for your client.

Native RPMs for Phusion Passenger


Recently, I was asked to ghostwrite a blog post on the Phusion corporate blog. I’ll excerpt the relevant portions:

We are pleased to announce native Linux packages for RedHat / Fedora derived RPM distributions, including RHEL, Fedora, CentOS, and ScientificLinux.

…And the note at the end…

These packages are currently being maintained by Erik Ogan and Stealthy Monkeys Consulting. Questions, comments, patches, and pull requests are always welcome.

I’m pleased to finally be able to announce this project. I’ve been noodling on it since October. I’m also looking forward to working with them in the future to keep the packages clean and up to date!


I have a project I call “Clubcar.” It had its genesis in my frustration at the pathological inability of a group of coworkers to chose a lunch destination, coupled with our general dissatisfaction with the day-to-day functioning of most other automated decision systems.

It was also a complex enough problem that it seemed a good way to learn Rails. Because it was my first Rails project I was as yet unfamiliar with many Rails idioms and practices. I reinvented a few wheels that really should have been patterns.

I am now going back and spending time cleaning up the code base and extending it to allow more than just the original group to use it, since several people have expressed interest in it.

One of the wheels I invented was authentication. Since a wider audience needs a much more robust authentication (and authorization, but that's a separate issue) system, now is a good time to rip out my simple implementation and use one of the off-the-shelf solutions with far more features, and far fewer bugs.

And here's the rub. By far, the most popular solution, acts-as-authenticated (and its REST-ful progeny: restful-authentication) are primarily code generators. The expectation is that you'll use them in a new project to generate the models, views & controllers that make up your authentication system. This has presented two problems, one practical, and one philosophical.

The practical: since my system already has all of these things, I tried to carefully shoehorn the generated code into my existing framework. It was a mess, I felt I'd painted myself into a corner, and the project stagnated.

The philosophical: while I was despairing and frustrated over the shoehorning, I began to wonder: why is the Rails community as a whole, which has “DRY” (“Don’t Repeat Yourself”) as a mantra so enamored with code generation? Even if it's not you writing the code, it is still repetition that makes the project harder to maintain, makes it harder to incorporate fixes and features from later version of the tool, and seems to fly in the face of not only DRY but good object-oriented design as well.

I set the project aside. In returning to it (now that I need to amuse myself on the train again occasionally.) I decided to once again look for alternatives.

I have stumbled upon Authlogic, a plugin that seems to be written by someone who shares my misgivings. It's also extremely well documented, highly configurable, and has a complete API for extension.

Fair warning: I haven't actually started moving my project to Authlogic, and I may yet find some fatal flaw. But I'm very much looking forward to trying it out, and if I do happen to find a flaw, perhaps I can patch it, and everyone using it can benefit immediately, not on their next project!

ETA: I just sent the author some fan mail, because it makes me that happy!

Every few months for the last several years, this particular problem annoys me enough that I search MacOSXhints and the web in general for a possible solution. The closest thing I've ever found is this hint, but that doesn't describe the situation I've encountered. Maybe that's because the solution was obvious to everyone but myself. I find that hard to swallow.

I tend to use my Powerbook while disconnected. I also tend to "send" messages while disconnected, so they stay in my Outbox until I reconnect. Generally, it works. But every once in a while a message gets stuck. flatly refuses to try to redeliver it. "Synchronize Accounts" does nothing (and never has). It used to be that sending another message via the same server would prod it into sending both messages, but somewhere along the way Apple fixed that "feature." Usually quitting and restarting (a lame solution to my mind) would cause it to retry. Still, every once in a while I'd still have messages that defy even that treatment.

Recently, I serendipitously stumbled upon the solution: Drag the offending messages to the "Outbox" folder in the folders pane. They'll be redelivered. That's a handy little feature. Too bad it's not documented anywhere.

Yes, I am aware of the "Message -> Send Again" option. But there are times when I want/need to keep the Date: header (yes, it can be forged) and the timestamp of the cryptographic signature the same as the original send date and time.

[Also, I've given up trying to find the rhyme or reason behind the two "I can't send this message" dialog boxes has. Every time I think I've got it figured out, I get a counterexample. I just know that the one that gives you an option to try another server more often lands messages into this state, even if you choose not to.]

Jesus H. Fscking Christ!


Any MySQL fanboi who so much as insinuates that it is anything other than the half-assed, inconsistent, steaming pile of shit (in a usage that degrades the term) kludge that it is will face my wrath.

That also goes for anyone caught using the terms "MySQL" and "database" or "enterprise" in the same breath. Even with some kind of superlative negative in between. You're still suggesting that the thought entered your mind.

Edit: Yes, yes. It's my own damn fault for building a major component relying on a feature that's new in MySQL 5. They can't even do right what they claim they've always done, what was I smoking when I suggested trusting something new?

Commute (pt.3)


I'm really enjoying my commute. Having a monthly pass makes things that much easier. But it's not without peril. A (two or more zone) monthly Caltrain pass is good for free VTA rides. This caused a moment of hesitation this morning when I looked out the train window and it was POURING! In the end, I made the right decision. I had my rain-gear on already, and it's faster for me to ride than take the light rail (!!)

I had a great ride in. Some of it was the pushing through the "inclement" weather, some of it was the exercise. I felt great when I got to work. Too bad I left my wallet & badge at home. :-/

A few weeks ago I broke down and downloaded an RSS reader. After poking around a bit, I settled on BlogBridge. It's OSS, cross-platform, and it seems to have most of the features I care about. One of the other readers I saw had the ability to use XSLT to transform it's look & feel, but I don't think it was OSS.

I played with it a bit. The UI is a bit odd. The keyboard controls aren't what I expected. But still, it was a novelty. I don't think it would have progressed beyond that if I hadn't had a flash of inspiration: since it caches the RSS feeds, It basically makes a a great offline news/blog/website reader!

I'm really enjoying using the time on the train to peruse the blogs (etc.) on which I used to waste my time at work. I've even found a few new blogs along the way. The one I've most enjoyed: The Traveler's Lunchbox. I'm really loving the way she writes, and the food porn & recipes are just icing. Go, check it out, see if she doesn't suck you in!

Update: Next step: hacking something so that I can get my $#%#@ing LJ Friends Page as an RSS feed!

[ed. This should have been posted on Thursday, but werk eight my brane.]

@colin_clive(it's alive . . . It's Alive . . . IT'S ALIVE!)

A few months ago I procured two 3Ware hardware RAID cards. One for slackers (a nice SATA unit, with caching & acceleration), and one for myself (an older, lower-end unit, but probably adequate for my needs). My intention was to use mine to build a fileserver on which to store backups (primarily of my photos, but also of other important data to which I want semi-convenient, networked access).

As I was thinking about doing this, it occurred to me that I'd never named a machine "Sarnath." This is surprising, since as names go, it hits a trifecta: it is a city that is both mythical and destroyed (either one would be adequate for Slackers' Network inclusion) AND it exists(-ed) in the Dreamlands (my own personal subset of the Slackers' Network scheme)

For all of those reasons, it seemed the obvious choice for the new machine. And yet, I decided that I should not tempt fate that way, (the name of the story is "The Doom That Came to Sarnath," after all!) Naming my shiny new Athalon64 fileserver "sarnath" would be hubris: basically asking for it to be struck by lightning. (Technically, flooded and dragged to the deep by lizard-men, but that's not really likely in Northern California! Though I suppose swallowed up by an earthquake would be close enough...)

So, when I finally got around to ordering the other parts, I rejected "Sarnath" in favor of "Kiran[*]." Little did I know that the fate had already been sealed.

About this Archive

This page is a archive of recent entries in the Software category.

Politics is the previous category.

Velo-city is the next category.

Find recent entries on the main index or look in the archives to find all entries.

June 2020

Sun Mon Tue Wed Thu Fri Sat
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
Powered by Movable Type 5.04