JavaScript hoisting, the short version

I’ve received several explanations of the idea of “hoisting” with several of them being wrong. Some people think it has to do with closures, or is just a synonym for function scoping. Here’s my ultra-short version of hoisting as I understand it.

Hoisting involves the interplay of just a few concepts:

  1. JavaScript variables are function scoped. Not block, not statement. Function.

  2. As an implementation detail of function scoping, all variable declarations are “hoisted” to the top of their scope.

  3. Variable assignments are not hoisted.

  4. Named function declarations are considered variable declarations.

The trivial upshot of this is that if you declare var x = 1; in the middle of a function, it’ll actually be run as if there was a var x; at the top of the enclosing function, and a x = 1; where you wrote it.

The same thing goes for inner functions you define except that, as I mentioned, named function declarations are considered variable declarations, not assignments. Here’s the fastest way to see how that works out:

The first example, noBar works pretty much as you’d expect: it throws an error because there’s a problem trying to invoke bar(). But notice the error: bar is not defined.

The second example hoistedVar, works similarly but throws a different error! This is because the definition var bar has been quietly hoisted to the top of the function (above the console.log call). So bar exists, but has not been assigned to yet. Its current value is undefined. See bullet points 2 and 3.

The last example works, somewhat unexpectedly. However, if you realize that named functions are considered variable declarations (see point 4) you’ll be able to see that the whole definition has been hoisted to the top of the function (again, above the console.log call).

So that’s what hoisting means. It is left as an exercise for the reader to figure out how this affects the well-intentioned late variable declaration you may do and why that code that you didn’t think should’ve worked actually worked that one time.

Foggy sponges and kittens

Sponges are easy. Nobody likes to write loops with lots of error handling for IOError or trying to figure out what exactly rewind() does. Plus, we can’t write our favorite dot-chain-of-death map/select/flatten/zip monstrosity until that file’s contents are in something that implements Enumerable, right? As a result of this type of Ruby-think, I’ve seen far too many “working with files” examples that boil down to contents ="something.txt").readlines or"blah.txt") and should instead be correctly titled “files are hard, let’s go sponging”.

Sadly, sponges also kill kittens. Not really, but they get pretty close. When you are dealing with file input and write a sponge, what you’re really saying is “I can’t wait until this grows, consumes all memory, and gets OOM killed!” It’s a false economy: you’re trading superficial Ruby idiom simplicity for a design that is built to fail as your data set grows.

If you write a sponge today, you will almost surely rewrite it tomorrow.

This came up again recently with respect to dealing with Amazon S3 and a rewrite we had to do because (surprise) it was consuming all the memory on a Resque machine and getting killed. The engineers assigned solved some of the hard problems (dealing with the core algorithm that is spongy), but left an obvious sponge right at the center of things, ensuring the “fix the OOM” branch would suffer a different but related OOM once merged.

This is where we get to Fog. Fog is a really impressive gem and you should probably be using it if you’re dealing with any cloud services and writing Ruby. But we were creating a sponge with Fog when putting and getting potentially large files from S3. The seductive “one clean line” solution was staring at me from yet another pull request.

It seemed odd to me. I know Wes. He and the others that work on Fog are really smart people. The gem is widely used and contributed to. It’s unlikely that nobody has noticed it is impossible to use Fog::Storage unless you can fit the file into local memory. That’d be a silly design deficiency.

And here’s where the corollary to “A bad workman blames his tools” should kick in: “A good workman blames himself.” There had to be something I was missing. I either skipped some documentation or am too stupid to fully understand the very clever (and beautiful) code that makes up Fog. As it turns out, both were true. In the process of digging, code reading, and thinking I found my answers. It’s not particularly well documented nor code-obvious, but Fog supports streaming instead of sponging. Briefly:

The “create” example is right there in the Fog::Storage docs, but is easy to look past if you’re not used to dealing with IO-like objects. The “get” example, however, is not documented in a clear place, nor is it obvious from a cursory reading of the code that it takes a block variation (the implementation is actually over in Wes’s similarly excellent Excon library).

Consider sponges an anti-pattern. Watch for them. Avoid them. Get comfortable with chunked or line-based processing. Add StringIO or thorough mocks to your TDD toolkit for testing things that expect IO-like objects.

And for goodness sake, think of the kittens.

Capybara, synchronize, and monkeys that climb ivory towers

I like Capybara. It’s is an incredibly cool tool. Gone are the days where you need an army of bleary-eyed QA team members following Word document scripts for click testing. Now it is possible to grab Capybara, and optionally something like Cucumber, to develop your QA team into a true automation team without having to also include an engineering resource to build a whole tool chain on-site.

But there is a certain ivory-tower idealism to Capybara that can make it difficult to use with some applications. The authors believe that pretty much all browser testing should be via the DOM. If you click a button or load a page and can’t assert something about its content, selectors, appearance or other properties via XPath- or CSS-driven finders, there is probably something wrong with your your application.

And they’re absolutely right. If the results of clicking on a button doesn’t fire and event that comes back and modifies your DOM, how is your feature remotely useable? If Capybara can’t detect success of an Ajax call as reflected in your DOM, how the heck is your user getting feedback? The DOM should have mutated, a class should now be present on that button that turned it green, or the word “Success” should now appear at the top. The Capybara authors are dead on: this is how it should be.

But, this isn’t how it is. Sometime’s life gets in the way of ideology.

In a particular case I encountered it was simply more efficient to do a little page tweaking with jQuery rather than insisting the new feature’s MVP adhere to Capybara’s ivory tower proscriptions. Normally that wouldn’t be a big deal, but we have an additional wrinkle: All our JavaScript is loaded in a non-blocking, asynchronous manner to improve page render time. That means the much-beloved $ may not exist right when your test code runs.

We’ve already artfully dealt with the complexities of asynchronous JS loading in our application, but it still meant intermittent failures in our black box suite when the network was more sluggish than Capybara could run execute_script. If you poke around the Internet for categories of problems with asynchronous JS or Ajax, you’ll end up in a mire of nearly identical Stack Exchange answers citing how people “fixed” their problems with wait_until. I’d argue most of these people made things worse for their app without having realized it.

Noting the trend, the Capybara authors have removed wait_until and replaced it with a harder to reach synchronize in the 2.0.x releases. Rightly, they’ve asserted that you shouldn’t ever really need to use it since Capybara has a system of waiting and retrying built into all its query code; if you’re wrapping a DOM search in your own timer, you’ve probably failed to understand something fundamental about Capybara.

In our case, however, I need to loop back to the fact that we’re not dealing with the DOM here: the presence of jQuery is not at all a DOM event. Either $ is or isn’t defined. Try as I might, I couldn’t play nice with Capybara testing philosophy and get work done.

So, I reached for my least favorite tool: the monkey patch. Ugh, I feel dirty just typing the name…

Essentially these two new methods on Capybara::Session brings the characteristic Capybara zen-like calm to my jQuery execution. Just as Capybara will patiently let your Ajax calls complete while watching for “Success” to appear, calls to execute_jquery will run little jQuery scripts after waiting patiently for $ to be defined.

It really is grotesque and I don’t like it. But it works. Perhaps in the near future I can modify our JS loader to indicate various states via hints in the DOM. Or I can take the time to rewrite the problem assertions in pure JavaScript instead of jQuery (though I’m not inclined to take the “don’t use that useful tool” route). But maybe it is time to have a bit of a tussle with the Capybara folks and find out if a facility like this might be a worthwhile addition to the framework.

They’ve built a timeout-driven system for DOM testing. Why isn’t a similar timeout system available to evaluate_script?

Mongo Mapper and hybrid deployments: a first hack

At work we’re using RoR atop MySQL to build our core web application. As with many companies, we’re realizing that certain types of scaling problems may be better solved in the NoSQL world. While looking into MongoDB, I’ve found it somewhat surprising that the two dominant Rails-ready adapters (mongo_mapper and Mongoid) don’t really answer the question of hybrid deployments. In fact, much of the “getting started” documentation includes a section on ripping out ActiveRecord (since you obviously won’t need it now that you’re playing with a new NoSQL data store).

Similarly, there are few, if any, stories of people migrating just parts of their schema into MongoDB. Either people aren’t doing this or nobody is blogging about it. I found several conversations about people just abandoning the idea and converting wholesale to MongoDB. Given the 40-minute time span between some of these postings, these are either the greatest coders ever or they’re converting toys/demos/explorations rather than years-old applications with dozens of tables and tens of thousands of regular users.

As I started to work on things, it became clear that the document oriented nature of MongoDB was going to necessitate some changes in how we do things. Gone (in some ways) are a number of the easy and familiar ActiveRecord methods for associations between records. This goes double for a system with some parts in a relational database and other parts in a document store. Rather than just typing belongs_to and moving on, you end up having to write your own accessors and mutators over and over again.

This, of course, is silly. I’ve only been coding Ruby for a little while but it was clear that I should be able to DRY this up a little. Plus mongo_mapper (which I’m currently tentatively useing) provides plugins as a way to provide core functionality, making it easy to extend.

I’m still not great at Ruby, Rails, or some of the idioms that are standard to development with this world, but it didn’t take me long to write something that provides belongs_to_ar, a convenience variation to a key that creates a new key field and automatically handles loading/storing references to ActiveRecord (the objects still in your relational database).

module MongoAdapt
  module ExternalKey

    def self.included(model)
      model.plugin MongoAdapt::ExternalKey

    module ClassMethods
      def belongs_to_ar(name, *args)
        key :"#{name}_id", Integer

        def create_link_methods_for(name)
          # See MongoMapper::Plugin::Keys
          class_name = name.to_s.classify
          key_name = :"#{name.to_s}_id"
          accessors_module.module_eval <<-end_eval
            def #{name}

            def #{name}=(value)

            def #{name}?

          include accessors_module


With this loaded, I can now do belongs_to_ar :user on a MongoMapper::Document and get a user_id field in the underlying document as well as user and user= methods that operate with User objects. This, of course, only handles a single direction for the relationship (going from a Mongo Mapper document to a ActiveRecord object).

I imagine I’ll refine this a bit further and post some more about the challenges of a hybrid deployment as I go along. For one thing, it needs a more Ruby-ish (what the hell is the equivalent term to python-ic?) name.

Stupid Ruby tricks

Over at work, I’m rapidly getting up to speed on Ruby and Rails. It’s fun and a little wacky (and, not to mention, very fast-paced for us right now). This snipped cracked me up when I saw Jared use it while debugging.

Totally unnecessary, but man is it fun to type! when doing initial debugging on a controller.

In support of BYOBW 2010

Easter is fast approaching and that can mean only one thing: a few people are trying to block the Bring Your Own Big Wheel event that has happened for the last few years on my street. This year, several people have undertaken the work required to make this a legal, permitted, and insured event for the whole family. There’s a permit hearing coming up and here is the letter I’m filing in support of the event.

My name is Kyle VanderBeek and I reside at 8xx Vermont Street, the last turn on the curvy portion of Vermont Street in Potrero Hill. I am writing this letter to express my support for the Bring Your Own Big Wheel (BYOBW) event being considered for April 4, 2010. I moved into my current apartment just before the BYOBW event in 2008. When I heard it was happening, I was incredibly pleased and decided to turn it into an opportunity to gather with my friends. These events transform an otherwise normal Sunday into a time of celebration and community. I get to make food, be a host, and join my friends on the balcony to watch the spectacle. Many of us also choose to participate in what is truly a uniquely San Francisco experience; one that is family-friendly, joyous, and wacky. I have enjoyed BYOBW for the last two years, and am encouraged by the additional organizational efforts being put forth this year (including more portable restroom facilities and monitors along the course). It has always been a low impact event, and I anticipate that being true this year as well. As a directly-impacted neighbor, I urge the City of San Francisco to allow this annual event to continue and by doing so support the right of the people to assemble and be silly. Thank you.

I really hope everything goes well. I can’t wait to throw a party!

Finding my first Python reference cycle

I’ve worked in Python for nearly six years now and, up to this point, I’ve not had to deal with the king of memory-related gotchas: the reference cycle. Simply put, a reference cycle happens when two or more objects create a cyclic directed graph in their path of references (ok, not that simple). The simplest form is the “I point to you, you point to me, neither of our reference counts get to zero” scenario.

Usually, this isn’t a big deal. Although objects don’t get immediately collected when dereferenced, the garbage collector will eventually notice that there is some wasted memory, do the more expensive cycle detection work, and free the objects. In many scenarios like single-run scripts, cron jobs, or low-load applications you’ll never notice; Python does it’s job, keeps things clean, and stays out of your way. If, however, you’re writing a high performance internet server intended to handle the ever increasing demands of the modern Internet, you just might be screwed. That GC work will cost you desired though-put and scalability. In the worst case, the GC won’t be invoked in time and you’ll hemorrhage memory (or at least gobble it up in competition with other things your system might need to do). I this case, initial numbers left us with a customer-detectable throughput degradation when a particular security feature was enabled.

Without further ado, here is the distilled pattern that ran us into trouble.

class Filter:
    def __init__(self, callback):
        self._callback = callback

    def update(self, data):
        """Override and call parent."""

class AddLF(Filter):
    def update(self, data):
        data = data + '\n'
        Filter.update(self, data)

class AddCRLF(Filter):
    def update(self, data):
        data = data + '\r\n'
        Filter.update(self, data)

class Foo:
    def __init__(self, dos_mode=False):
        if dos_mode:
            self._filter = AddCRLF(self.the_callback)
            self._filter = AddLF(self.the_callback)
        self._filtered_data = list()

    def update(self, data):

    def the_callback(self, data):

    def all_data(self):
        return ''.join(self._filtered_data)

At a glance, this isn’t an unreasonable design pattern. If you’re writing a cross platform tool, or something that needs to listen on a socket and account for variations and flaws in protocol implementations, passing the input through a filter to clean it up is reasonable. It’s even somewhat pythonic in that a call-back is used, allowing for various patterns of code re-use and subclassing in both the filters and the consumer.

The usage pattern is something like this: for each chunk of data you receive, call update(), the main class hands the data off to the filter, the filter does its thing, and uses the callback to pass the data back up.

# Many of you will recognize this pattern from crypto digests
f = Foo()
print f.all_data()
f = None
# At this point ref-counting could have reclaimed the object

Pay attention to that last line: when we assign f = None, under normal circumstances the reference count would hit zero, and all objects should be collected. Here this is not the case!

Once I realized this region of code was the likely culprit, I started playing with the [gc]( module and its debugging abilities. Most importantly, using the gc.DEBUG_SAVEALL setting causes the garbage collector to (instead of completing collection) store all unreachable objects in a list named gc.garbage. This can be examined for hints.

import gc, pprint

print gc.get_count()
print gc.collect()

Here is the output from that single object creation.

(249, 5, 0)
[{'_filter': <__main__.AddLF instance at 0x7f23ec3261b8>,
  '_filtered_data': ['asdf\n', 'jkl;\n']},
 <__main__.Foo instance at 0x7f23ec326170>,
 <bound method Foo.the_callback of <__main__.Foo instance at 0x7f23ec326170>>,
 {'_callback': <bound method Foo.the_callback of <__main__.Foo instance at 0x7f23ec326170>>},
 <__main__.AddLF instance at 0x7f23ec3261b8>,
 ['asdf\n', 'jkl;\n']]

You might be able to see the loop already. We have, left over, a Foo instance, an AddLF instance (which we know is stored as a member variable of Foo), and (most importantly) a reference to a bound method on Foo. This bound method holds a reference back to the Foo instance, completing the cycle.

What the original designer of this code probably didn’t realize is that passing that callback when instantiating a Filter would create that loop (via the bound instance method, which has a reference to the instance). After a minor refactoring, I’ve gotten rid of the cycle and reference counts hit zero when the last external reference to a Foo object is eliminated. Most importantly all the related data is freed as well; in this case Foo._filtered_data (which could grow to be very large) will get freed up as well.

This anti-pattern is only one step away from the simplest case reference cycle, but it had real consequences. With it gone, memory is managed far more efficiently and this feature is usable in a demanding, high-performance environment.

_I do not host comments due to spam and abuse. Discuss this post at reddit_.

My first time being censored

I’m not terribly active on the “public” Internet. I have my blog, which I suspect is mostly read by my friends and a few seekers of Python knowledge. I belong to a forum here or comment on a favorite blog there. I use Facebook quite a bit to keep up with friends and pass things I’ve found among my social circle. I just don’t bother much with public discussions since they seem to devolve into nonsense and I just don’t see the point in playing that game. I don’t even allow comments on this blog since I don’t see the need to host other people’s idiocy or vitriol. About the only place you’d find me with any sort of regularity is reddit, but even that is sporadic.

I’m even a fairly quiet skeptic, preferring to share what I’m learning with those around me rather than engaging in public text-based shouting matches. The events of this past weekend started out that way: an old friend of mine from massage school, Sam, posted a link to that erroniously claimed that home birth was proven as safe as hospital birth. Since many medical studies are badly reported, I checked the article.

I immediately recognized the study from the University of BC in Canada. I’d already read it, and it had been similarly misrepresented elsewhere. It’s not that the study’s conclusions are false, it’s that they are narrow. Home birth has similar infant mortality rates only in Canada where a single type of certification exists: the Nurse Midwife. This is a college-educated position with clinic hours, lots of training, and a great deal of time spent doing both hospital and home births. They’re full-on nurses. That’s not the case in the US where we have several different types of midwives, some with surprisingly little training (and potentially zero clinic hours). The Skeptical OB is where I’d seen the study before, and she covers it well. The bottom line is that these lesser trained midwives have an infant mortality rate triple that of the highly trained Canadian midwives.

So it’s fair to say that the result isn’t intended to be assumed in the general case, right? I recognized the over-zealous rhetoric of someone who really wants to believe that all things natural are automatically better. The author on was calling herself the “natural parenting examiner”, so that’s to be expected. But it doesn’t excuse misreporting a study, especially since the original authors specifically warn against over-generalizing the result beyond its intended scope.

So I commented. I asked her to cite her sources (she had not linked, a clue that she might be getting her information third-hand). I provided a link to the Skeptical OB coverage. I was polite and brief.

But then curiosity got the best of me. Having spent a considerable amount of time reading all sides of various health issues, I suspected I was reading the work of another enthusiastic but careless advocate. So I clicked on her bio and found this:

Katie Drinkard is a self-proclaimed natural parenting guru who has done extensive research on natural pregnancy and parenting. Katie presents vital information in a personal manner while providing the latest research on natural parenting topics - ranging from birth through the childhood years.

Right. Well, that’s not exactly a stellar CV. Lack of formal training certainly doesn’t make one wrong (remember, I’m a software engineer commenting on health issues), but dropping words like “guru” has always unnerved me. I already suspected what I was going to find when I clicked on her other articles, but I had to be sure.

Naturally, one title that jumped out at me was “Swine Flu vaccine contains diseased flesh of African Monkeys”. No, I’m not kidding, she actually wrote this. Surely she was just being hyperbolic! Nope. Another predictive sense was tingling in my brain as I read this gem of a final paragraph:

Scientists create the Swine Flu vaccine (and other vaccines) by injecting monkeys with the virus and allowing the disease to take over. Later, the monkey is then killed and its diseased organs are used to make the ingredients of vaccines given to the public.

Oh, the stupid, it burns! I just knew this sort of wrong-headed nonsense could only come from a single source: Mike Adams at Natural News. Sure enough, in seconds I’d found his article making the same bogus claim.

What makes it bogus? In the process of seeking the “truth” in the text of a vaccine patent, Mr. Adams (not a doctor in any sense) inferred from the line “producing said virus using a cell line isolated from the kidney of an African Green Monkey” that there must exist a warehouse of angry, sick monkeys being fed into a meat grinder. Well, that’s not the case. Anyone who has spent more than an hour actually trying to understand vaccines will key on the words “cell line” and know that they’re referring to some laboratory-grade line of perpetually grown cells that can be used as a growth medium. Sure enough, again within seconds, I’d found that there is a widely used line named “Vero” that was isolated from African Green Monkey kidney epithelial cells way back in 1962.

So I made my way back to the article and assured the author that there was no monkey holocaust. I quickly pointed out how she was in error, and provided an explanation of cell lines and how they’re used. Four or five sentences and I was done.

A day later, both of my comments were gone. They appear to have been deleted. Granted, there is no way I can prove this to anyone since I don’t have access to the site’s history or databases. I can, however, say that Ms. Drinkard did update her birthing post using the link I provided. I suppose that’s something, but she didn’t correct or clarify anything.

I’m disappointed.

Love/Hate and Good Wood Mods

I play too much Rock Band. My music game affliction started back with the original Guitar Hero on the PS/2. I was doing the mega-geek rounds around Fry’s one day and saw it on the demo stand. I played a single song and knew this was something I wanted at home. Mitch had the PS/2 already, so I went for it. We played for hours and he quickly started kicking my ass. But, damn, it was fun to get awarded points and stars for being good at not actually playing music.

Fast forward a couple of years, an update to an Xbox 360, and a few finger strains battling through “Rein in Blood”, and I was still having fun. I’m not great at it (I’m really not even a full-fledged “Hard” player with the guitar), but who cares? I get better here and there, and keep enjoying myself. I picked up Rock Band and drooled over the DLC, still content playing the guitar. But, oh, the temptation. I’d tried the drums elsewhere. I wanted them…

Eventually I gave in and bought the Rock Band drum kit and started wailing away trying to teach myself a new skill. Even though it had never really waned, my interest was renewed. Bit by bit I got my hands and foot to do the right things in the right order. Granted, having moved into an apartment, I had to get my drum fix when the downstairs neighbor was out. I was like a fiend, sneaking a hit whenever I could.

Sadly, my enthusiasm took a toll on the drum kit (as many people have found). After seeing them used by YouTube drum stud azuritereaction, I chose and ordered a set of Good Wood Mods (their first, extremely home-made variant).

In April (after a long wait) they arrived. I giggled at the simple packing material. I installed them. I played them. I loved them! Immediately I realized why several of the best players use Good Wood Mods: they’re insanely fast. Compared to the plastic-backed gum rubber pads, they’re a dream to play and take far less effort. If you stay relaxed, you can play entire songs on “Expert” while barely moving your wrists. The bounce you feel in the sticks is much less jarring and closer to that of a real drum head. There’s none of that dead thud at all. And, most importantly, they’re quiet. Very quiet.

Since I work at a place that also loves Rock Band (and houses a 360), I couldn’t wait to show the guys. Only two days into owning the kit, I brought it into work. As we gathered in our game room at the end of the day, several guys lined up to give them a whirl. They got rave reviews. Rave, I say! Everyone agreed with me that they are a huge leap forward over the stock heads.

Then it all came unraveled. One of the people who loves playing the game but still plays stiffly (and hits hard) sat down. Part way through his first song, bang, the blue pad tanked. It became intermittent and only registered some of the strikes. Damnit! I took the set home to test it a little more and, bang, the yellow pad suffered the same fate. Damnit again! Fortunately, I’m a geek (as are the makers, which is awesome). I broke out the soldering iron, exchanged some emails with the guys who make them, dismantled the heads, and fixed the broken connections (just solder welds on the piezo sensors).

Sadly, this hasn’t been an isolated issue. I trust my repairs, but I’ve had to do or re-do this same sort of fix on all but one of the heads. There is something fundamentally flawed in the way their design works. I suspect it’s the combination of foam inserts and floating piezo mounts that result in friction at the edge of the wire’s jacket, creating a tugging movement that strains the braided wire. I fully expect to do this repair again, though I’m trying various applications of glue as protective covering at the edge of the weld.

Now, the big question… would I recommend these to other people? In three words: Yes and No. I absolutely love playing these over the standard pads. However, their initial build quality was questionable and I continue to have to make repairs (usually with a couple of months of playing in between). However, the guys that make them have scaled up and found a manufacturing partner. Apparently, gone is the questionable-but-endearing use of plywood, varied screws, and slices of PVC pipe. If you buy a set now, I suspect you’ll get a fundamentally similar but massively revised product built to higher standards. If you play a lot and have a few spare dollars, go for it. I’m even eying a second set.

If you’re curious, I also took few pictures of my Good Woods Mod install and repairs.

Start your Python project with optparse and logging

Python continues to be my favorite language to hack in. It’s useful for tasks big and small and has the advantage of being more readable and maintainable than a lot of other scripting languages. I remember when, having learned the basics of Python, I decided to rewrite my home-built CD-to-MP3 script suite from its perl incarnation (perl was my previous favorite language for system programming projects). I knocked that project out in only about 2 hours, including a major redesign made easy by Python’s object syntax and built in “pickle” for serialization.

Since then, I’ve usually chosen Python for a variety of system programming tasks. This includes things like making backups, deploying software, configuration file templating, web site scraping, health monitoring, and some bigger data crunching/graphing. Time after time, these quick projects (often at work) turned into something bigger. Eventually they get rolled into a product or adopted by the production operations group as standard kit.

At some point I realized that there was something that I was doing that made this transition from “quick hack” to “standard tool” easy: I always start my projects with logging and optparse in place from day zero. During development, this means that I don’t have to scatter print-style debugging statements throughout the code, I can just use logging.debug() and turn them on and off at will (via command line flags). Once deployed or passed on, it means other people using it can immediately start interacting with my script just like other familiar Unix utilities.

So, here is a variation on what my typical python script starts out with.


import logging

def foo():
    """These will only get output if you turn up verbosity."""
    logging.debug("This is debug.")"This is info.")

def bar():
    """These will all be output a default logging levels."""
    logging.warn("Warning!  Things are getting scary.")
    logging.error("Uh-oh, something is wrong.")
        raise Exception("ZOMG tacos.")
        logging.exception("Just like error, but with a traceback.")

if '__main__' == __name__:
    # Late import, in case this project becomes a library, never to be run as main again.
    import optparse

    # Populate our options, -h/--help is already there for you.
    optp = optparse.OptionParser()
    optp.add_option('-v', '--verbose', dest='verbose', action='count',
                    help="Increase verbosity (specify multiple times for more)")
    # Parse the arguments (defaults to parsing sys.argv).
    opts, args = optp.parse_args()

    # Here would be a good place to check what came in on the command line and
    # call optp.error("Useful message") to exit if all it not well.

    log_level = logging.WARNING # default
    if opts.verbose == 1:
        log_level = logging.INFO
    elif opts.verbose >= 2:
        log_level = logging.DEBUG

    # Set up basic configuration, out to stderr with a reasonable default format.

    # Do some actual work.

This is obviously a pretty minimal setup, but it achieves what most people need. You get option parsing and checking along with usage information. You get warnings and errors spat out to sys.stderr (leaving sys.stdout for actual program output). You can specify -v to crank up verbosity.

More than once, I’ve had a pager-frazzled sysadmin ask me how the heck to use the new tool. I get to reply, “Just run it with --help, it has full usage instructions built in.” This makes sysadmins happy; really happy. It means they don’t have to remember odd semantics or dig around for the how-to page on the internal wiki at 3:00am when they need to use it. Culturally, there is almost nothing more valuable than a sysadmin who has had success with your code, and nothing worse than one that has had trouble with it. To me, the first step in granting a sysadmin that sort of success is to make your code act like everything else in /usr/bin and that’s why I’ll continue starting my projects in this manner.

Caching WordPress content to appease Google Page Speed

I installed the new Google Page Speed plug-in for Firebug (under Firefox) and played with it a little. I’m impressed. It takes a number of ideas from the similarly awesome YSlow plug-in and goes a few steps further, plus adds a cleaner UI. Of course, I found a couple of really obvious things I could fix.

One of the easiest things is to make sure that your static content is cache-friendly. It’s one of those simple tricks that really does have an impact both on the number of bits you have to serve and on the perceived speed of your pages. Sadly, it gets left out of a lot of CMS/Blog systems (including WordPress). To speed things up, I created an Apache .htaccess file with the following:

<FilesMatch "\.(gif|jpe?g|png|css|js)$">
ExpiresActive On
ExpiresDefault "access plus 2 months"
Header set Cache-Control "max-age=5184000, public"

For my purposes, I put this particular set of directives in wordpress/wp-content/.htaccess which means that all my theme and plug-in resources (including images, JavaScript, and CSS) get an Expires header 2 months into the future. It also includes a matching 2-month Cache-Control “public” header to let caches know that shared object caching is fine. With this, both web caches and the browser cache are far more likely to use the copy of these resources they have laying around.

Your mileage may vary (YMMV), but this is good placement for my particular purposes. It may be safe to put these directives all the way at the top of your document root. As with any caching, be prepared to pay some mild penalty whenever these resources actually do change; you’re ceding precise control over when a new version gets served up in order to gain performance (a trade-off you’ll have to weigh). Granted, there are cache-busting strategies (such as versioned file names) that you can use to get around this, too.

The other thing that impresses me about Page Speed is that it actually provides you with better versions of things you have, no extra software required! If it notices you could have a better-compressed image or min-ified JavaScript file, it’ll tell you how much you could be saving and provide it for you at a single click. Very slick.

Next I have to figure out if DreamHost can help me support gzip’ed content…

Update: Bah! I should have just poked around a little. I found a page regarding turning on more DEFLATE functionality from DreamHost’s Apache 2.2 setup. They already automatically deflate several types, but this doesn’t include CSS or JavaScript. It’s a pretty easy addition to the .haccess file I already have.

# gzip more stuff
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/css application/x-javascript application/javascript

Unlike the way I did the Expires headers above, this particular technique uses the content’s MIME type when choosing when to apply the DEFLATE output filter. And just like that, I’ve got smaller content!

A brief Python decorator primer

My last post looked at easing a common database idiom using a decorator. Interestingly, the brief discussion on reddit regarding the post had a number of people remarking that the coverage of decorators was more interesting than the SQL-related bits. Curious, that.

It seems I’m not alone in being occasionally puzzled by the way decorators work. It took me a little while to comprehend them. I’m still not a huge fan of how they work, but I can see their utility and do use them when appropriate. Almost without fail I end up heading over to PEP-318 and puzzling over the variations. The PEP isn’t terribly helpful since it is dominated by historical discussion rather than examples or instructions.

So let’s start with the basic no-argument decorator. It doesn’t take any declarative arguments when decorating a function; you just type @some_deco without parenthesis when using it.

def some_deco(f):
    def _inner(*args, **kwargs):
        print "Decorated!"
        return f(*args, **kwargs)

    return _inner

def some_func(a, b):
    return a + b

print some_func(1, 2)

This will print out:


According to the PEP, if you wrap some_func with @some_deco, it is the equivalent of some_func = some_deco(some_func). What it fails to call out is that this happens at load time. What we’re returning from the decorator function is a new function or callable that will be bound to the name some_func when this module is loaded. Subsequent run-time calls to some_func are actually calling the _inner function we defined on the fly when the decorator was called. Thanks to Python’s scoping rules and closures, we have access to the passed f parameter from the inner function, so we can call it.

Lovely. Now you have the power to tack on any sort of things you want to around a given function. Print a log message before or after, spawn a thread, add some exception handling. Whatever you want.

Things get a little more hairy if we want our decorators themselves to take parameters. According to the PEP, if was want parameters on the decorator to take parameters it’s the equivalent of func = decomaker(argA, argB, ...)(func). Again, this happens at load time, so it’s worth staring at for a moment. In plain English, this is saying that decomaker will be called with some arguments, and then the result of that will be called with a function reference. This is key! There are actually two invocations happening. The first will need to return a callable that accepts a function as it’s argument. That will then be called, and the result bound to the name func, so it better be callable as well. Let’s try it.

def log_wrap(message):
    """Print `message` each time the decorated function is called."""
    def _second(f):
        def _inner(*args, **kwargs):
            print message
            return f(*args, **kwargs)

        # This is called second, so return a callable that takes arguments
        # like the first example.
        return _inner

    # This is called first, so we want to pass back our inner function that accepts
    # a function as argument
    return _second

@log_wrap("Called it!")
def func(a, b):
    return a + b

print func(1, 2)

This will output:

Called it!

Ok, ok, that’s not terribly useful, but it illustrates the point (and expands on the first example by being a parameterized version). It requires that we construct two callable items inside our decorator, and that each will be called in turn during load time. Let’s quick dissect what happens at load time. When python gets to the declaration of func with the decorator sitting on top of it, it calls the decorator function with its argument (in this case, the string “Called!”). What is returned is a function reference to _second. Next, that just-returned reference to _second is invoked with a single argument: a function pointer to func, which is what we’re actually trying to decorate. The return value of _second is a reference to _inner, which will be bound to the name func, ready for run-time invocation.

Yeah, I’m a little dizzy, too. But if you practice this a couple times, it’ll start to make sense. Again, the key to getting this second form working is to recognize that two calls are happening at load time and returning the appropriate callable references at the right time.

Once you have it down, use this new hammer when it serves you, remembering that not every problem is a nail.

Python, decorators, and database idioms

Now that I’m a co-maintainer of the MySQL driver for Python I get to see a lot of confused people pop in on the support forums with some elementary problems. These seem to be mostly young developers who haven’t quite mastered the “start transaction, work with the database, commit” pattern that so many of us have become used to after a few years.

I still find the overhead of doing that sort of thing repeatedly to be tiresome. It doesn’t take long for your code to become a mess of try/except blocks, making code reading confusing and arduous. To avoid this, I’ve been using a Python decorator to wrap my SQL functions. It goes a little something like this (simplified form):

def dbwrap(func):
    """Wrap a function in an idomatic SQL transaction.  The wrapped function
    should take a cursor as its first argument; other arguments will be
    def new_func(conn, *args, **kwargs):
        cursor = conn.cursor()
            retval = func(cursor, *args, **kwargs)

        return retval

    # Tidy up the help()-visible docstrings to be nice
    new_func.__name__ = func.__name__
    new_func.__doc__ = func.__doc__

    return new_func

def do_something(cursor, val1=1, val2=2):
    """Do that database thing."""
    cursor.execute("SELECT %s, %s", (val1, val2))
    return cursor.fetchall()

class SomeClass(object):
    def __init__(self):
        conn = MySQLdb.connect(db='test')
        self.instance_var = SomeClass.get_stuff(conn)
        print self.instance_var

    def get_stuff(cursor):
        """Load something meaningful from the database."""
        cursor.execute("SELECT 'blah'")
        return cursor.fetchall()[0][0]

if '__main__' == __name__:
    conn = MySQLdb.connect(db='test')
    print do_something(conn)
    print do_something(conn, 3, 4)
    print do_something(conn, 5)
    print do_something(conn, val2=6)

    s = SomeClass()

Now, there are obviously several additions you could make here. You could add retry/reconnect logic, be a little more careful when closing the cursor (which can throw exceptions), or even attempt some deadlock recovery. But I think this simple example shows how you can effectively use decorators to implement a useful DB interaction idiom on both functions and object static methods.

And, damn, if it doesn’t save a lot of typing.

BYOBW in danger?

It sounds like the BYOBW race is in danger.  The cops want permits issued for the peaceful (and fun) assembly of its citizens.  That’s absurd. Here’s the note I sent to the mayor and police chief today:

Mayor Newsom: I am writing to you in regards to the BYOBW ("Bring Your Own Big Wheel") event that has been going on in San Francisco for nearly a decade. This strange and silly event gathers a wide variety of people together for an hour or two of outright fun. People dress in costumes, bring their cameras, summon some courage, and ride a child's toy down a twisty street. Last year, the event moved to my block of Vermont St. on Potrero Hill. I have to say, I loved it! There have been indications from SFPD that they will be present and possibly issuing tickets for participation. I learned this during a BBQ that the BYOBW organizers threw last Sunday to meet and thank the neighborhood residents. It has also been [covered in local news sources]( As a resident living directly on the course, I am writing to express my support for this annual event. I hope that you and the SFPD will allow it to happen without intereference. While I welcome the presence of SFPD to enforce the law in case property damage or acute lawlessness occurs, I request that they not impede the free assembly of San Francisco's citizenry. This is a joyful gathering that causes no harm, seems to be generally enjoyed by the community, and proved itself to be organized and attended by people interested in the good stewardship of our street (the scenery was unmolested and not a scrap of litter was left behind). I believe this proven record of good behavior obviates the need for and motiviation behind permits. Government need not be involved in the amicable interactions of the citizens. Thank you for your time. And if you feel like attending the event, you are welcome to watch it from my apartment balcony. Kyle VanderBeek _(address and phone number removed)_

If you agree with me, contact the mayor and free the BYOBW!

Science Commons gets a nod

Today I managed to get a submission regarding Science Commons up to #1 on reddit, and it pulled in some good comment threads.  As if that wasn’t cool enough, the SC guys noticed and put a mention of it up on their blog.  Hopefully this will catch a few eyes in the science world (maybe) and show them that there is an army of people interested in science advocacy who want to be able to read, understand, and link to scientific papers.  I sincerely believe that opening science to more eyes can do nothing but good.

Support CC - 2008

Django and app-relative static content

This one drove me a little nuts at first, but I finally realized how to do it.  In the process of trying to write a little application using Django and jQuery, I found it to be annoyingly non-obvious how I should serve up a self contained set of graphical assets (like images) and my own application-local jQuery distribution.  Sure, I could drop stuff in the same media root as the admin app, or tell people how to create a static mapping, but that kind of defeats modularity.  I really want people to be able to drop my little application into their existing Django project or installation, add a single include() entry into their project’s and go.

I tried a couple of things including a manually constructed RegexURLPattern, but it didn’t feel very clean or pythonic. Over the weekend I realized I could just write a simple delegating view function in my application’s

import os
import django.views.static

STATIC_ROOT = os.path.dirname(os.path.normpath(__file__)) + '/static'

def static(request, path):
    """Return app-relative static resources and collateral."""
    return django.views.static.serve(request, path, STATIC_ROOT)

With this trick and the app-relative templates loaded from the templates/ directory (if you don’t waste time on the doc bug I found) it is quite possible to write a fully self-contained, drop-in application.

Not a good start

This is going to be one of those days.  I decided to install a python package called Plex that we use in a few places.  It looked like a coworker was misusing it a little, so I wanted to understand more.  I took a quick look at the tarball contents and was instantly annoyed.

[[email protected] tmp]$ tar tzf Plex-1.1.5.tar.gz
[ Bunch of stuff scrolls off]

What jumps out at me is the damn ._ files everywhere. Crud, the author did this on a Mac, which in certain cases (and versions of tar) will include these annoying extra empty files. No big deal, it’s just annoying. Maybe I’ll talk to the maintainer later and have him fix it.

Let’s get on with it and get this baby installed:

[[email protected] tmp]$ tar xzf Plex-1.1.5.tar.gz
[[email protected] tmp]$ cd Plex-1.1.5.tar.gz

Wait, what the hell? Why did tab-completion give me the tarball again? Oh, damnit! While being distracted and annoyed with the OSX dot-underscore files, I failed to notice that this tarball doesn’t have a top level container directory! Argh, it has just spewed files all over instead of being neatly contained. No big deal, I’m in my ~/tmp directory so I probably didn’t over-write anything important. Time to clean things up:

[[email protected] tmp]$ tar tzf Plex-1.1.5.tar.gz | xargs rm
rm: cannot remove `./._Iconr': No such file or directory
rm: cannot remove `Iconr': No such file or directory
rm: cannot remove `Plex/': Is a directory
rm: cannot remove `doc/': Is a directory
rm: cannot remove `examples/': Is a directory
rm: cannot remove `tests/': Is a directory

Bah, I could have used rm -rf, but I didn’t want to trash the whole examples or doc directories in case I had one not created by this package. Let’s just clean up the last bits one by one.

[[email protected] tmp]$ rmdir ._Icon^M

What did tab-completion just do with… facepalm! The tarball contained a directory with a carriage-return in the name! Time to fire up emacs dired to finish cleaning up.

That was one troublesome tarball. It can only get better from here, right?

The Gmail honeymoon is over

I work for IronPort, so I know a little about anti-spam. I also used to self-host all my email on leased Linux server, so I understand very well the volume of spam out there and just how well one can tune an anti-spam system (I used SpamAssassin) to get good results. I recently stopped running my own server because it was too expensive, so I switched my MX records to hosted Gmail and I really do like it. For the most part, it’s been great.

But today I noticed a horrifying false-positive (FP) problem. In the anti-spam world, an FP is your worst enemy: it’s the unlucky event when you mis-classify a normal email as spam. On Gmail, that means an email I actually wanted to get ended up in the “Spam” folder. That can be bad, and in some cases, catastrophic.

I got concerned when a friend of mine told me that a conversation between a few of us (all Gmail users, both hosted and regular) ended up in his Spam folder. I was appalled, and then worried. If a conversation about getting together and buying tickets for a concert got buried, what else might be going awry? It turns out, a lot. Here’s some of the legitimate email I found in my Spam folder:

  • Amazon receipts, shipping notices, newsletters, and special offers.

  • Amazon Associates (advertising) newsletters and earnings notifications.

  • All communications from the Center for Inquiry SF, so I missed several interesting events.

  • Notification of my free DLC songs from Rock Band 2.

  • A coupon from the awesome store Racks & Stands.

  • Facebook notifications.

  • Various Xbox Live items.

  • Every single communication (including a donation receipt) from the “No on 8” campaign which, ironically, Google publicly backed.

  • MySQL conference and release announcements.

What the hell, Google?  That’s a terrible FP record and a really broad list of categories to screw up, and that’s just over the last 30 days.  Please do better.

Knowledge and decision making

I’m not an Olberman fan; I find him a little too shrill and cranky to watch with any regularity. So, I embed a segment from his show with a little bit of trepidation, only using it to start making a point about science, scientific research, and how understanding these things are important in leadership.

I know everyone is on the Palin-slamming bandwagon, and with the material she provides it is all too easy to do. At this point I am, if nothing else, just in awe that she was tapped to be on the McCain ticket. I’m also blown away that her handlers and speech writers aren’t doing a better job in keeping her clear of these blunders.

But I digress. It really is stunning that a public politician seems to lack an understanding of science and would attempt to make a facile point about spending, only to shoot herself in the foot. You see, taking a cheap shot at fruit fly research makes no sense when also talking about special needs children. Fruit flies are an important tool and standard model in understanding gene-linked and developmental disorders such as autism. This sort of work is so important that the 1995 Nobel Prize in Medicine was given to a group of researchers that pretty much exclusively used fruit flies in their work.

But really, this is about big-picture thinking. It’s not enough to say something like “let’s cure autism”. You can’t just poke at autistic kids to do that. We need to increase the size of our research knowledge in areas of genetics, molecular biology, and developmental biology. We have to develop better tools to detect genetic abnormalities, toxic conditions, or other things that haven’t even been thought of yet in connection to ASD diagnoses.

All of these things can be done with a combination of public and private funds. This is the very stuff for which grants and endowments exist. It’s this search for knowledge which may not have a direct or immediate impact on health but might cascade into a sea change in the treatment of diseases. And this is precisely the type of research that we should frugally spend some funds on for the betterment of humankind and to make America a world-wide leader in science. A good leader must understand that.

Update: The research Olberman speaks of at UNC has already yielded some useful knowledge about the formation and function of neurons. The specific grant Palin was referencing is a mere $211k earmark made by California Congressman Mike Thompson for research regarding fruit fly threats California’s olive crops. It should be noted that this earmark was the first item on the 2008 awards page by the Citizens Against Government Waste, which makes it look all the more like Palin speech writers are just haphazardly grabbing info they can parrot off the internet without digging any further.

Some Obama hip-hop

Full of shallow arguments and platitudes? Sure… but it also has a funky beat. If nothing else, Obama has the coolest kids making videos.

Obama ‘08 - Vote For Hope from MC Yogi on Vimeo.

I am America

This is really starting to piss me off, and there’s nobody better to make a funny joke out of the frustration I feel than John Stewart:

I live in a big city, and I have American values, not these illusory and somehow superior small town values. Hell, I grew up in a small city, so I guess I’m some sort of mutt; do I still count? Who am I?

I am America. I pay my taxes. I believe in equality for all. I hope for peace. I work hard doing a white-collar job at a company that produces a product that the world buys. I have my hard earned money in the flailing stock market. I love my family with my whole heart. I voice both my agreement and my dissent. I would take up arms and fight to the death to defend our freedom. I lend a helping hand. I cram my brain with knowledge and then share it. I give blood. I install CFLs and recycle. I check on my friend’s cats when she’s away. I practice critical thinking. I vote.

I am America so please, please stop implying that the cleanliness of my fingernails, my geographic location, or how I conscientiously cast my vote makes me anything else.

Now, to wind down: I am drinking a beer!

Geek service

A friend of mine said something comical on IRC today.

<@rasp> the other day I have a friend of mine - an mba in finance - ask me if I'd come over to her house and try and figure out what's up with her external usb drive <@rasp> I asked her if she'd come over to my house and help me balance my check book <@rasp> she laughed and got the point

There is a tiny nugget of wisdom here.  Pretty much all of my geek friends act as tech support for their family and friends, and almost always do so begrudgingly.  How many other trained experts get asked for this sort of help on a regular basis?  Would you ask your CPA sister to do your taxes?  Or your auto mechanic cousin to fix your car for free?  Or hit up your lawyer neighbor to draw up divorce papers pro-bono?  Probably not.

I’m not quite sure what to make of this.  When it comes down to it, I don’t really mind helping out.  For me it is a service I can provide periodically that makes my friends and family happier, that’s simply being a good member of a community.  I do have to wonder if there is something a little special about that plain looking silver box on their home desk, which they’ve been repeatedly told is Easy To Use™, but turns out to be infuriatingly incomprehensible when things start to go wrong.  Most of the people I know can use a computer to do wonderful, interesting, neccessary, or creative things.  But as soon as the first error message crops up they freeze up like a unpatched copy of Windows ME and elect to call an expert.  Usually, this is a good judgement: the worst fixes I’ve had to do for people involve first undoing their attempted fixes.

I know that recovering a broken system is a long-tail problem unlikely to get much attention.  Who wants to work on making it easy to repair something that, theoretically, isn’t supposed to break?  Is it even possible to make things easier when the second click into troubleshooting a sound card displays information about IRQ conflicts and rows of hex digits?

Abusing Calvin

The false evolution debate is one thing I have a hard time ignoring. I call it “false” because there really is no debate: evolution happened. Yet there are people out there that continue to make a lot of noise and push a disturbing pseudo-scientific religious agenda in order to protect their theologically and intellectually bankrupt world views. The depth of their misunderstanding of both science and religion is often staggering to me. They truly don’t understand either and make some of the most stunning logical errors I’ve ever seen.

But now it’s gone too far. I was raised in a Christian Reformed Church by loving parents and a supportive community. I then attended Calvin College, named for one of the key figures in the denomination’s theological history, John Calvin. So old Johnny has some significance in my history. Earlier this week I noticed that the morons at Answers in Genesis have cited the book art in Calvin’s commentary on Genesis as proof that man walked the earth with dinosaurs (they didn’t). That’s right, they claim an ornate drawing as scientific proof to contradict the massive amounts of hard evidence in the fossil record. The author is clearly delusional.

I can’t understand how a person could write about dragons without understanding that they have been a part of mythic lore for centuries? How could he be so ignorant of the mundane explanation for their appearance (storytellers often create bigger scarier versions of real things we’re already scared of as villains)? And how could assert that a lovely drawing is anything more than it is? All this does is show ignorance.

Calvin was a smart guy trying to answer difficult theological questions. Leave him out of your shallow, ignorant, lazy ravings.

TAM6: Reflections

Alright, it’s been far too long since my last TAM6 post, and I never wrapped things up. I really enjoyed my time in Vegas, although I didn’t meet as many people as I had hoped. I chatted with quite a few, but never really connected with them. I also found that the “lunatic fringe” exists among skeptics just as with any other group. Every once in a while I’d run into people that were a little too certain that they had it all figured out and that skepticism and science were the only way to view the world, “damn the rest.” That’s just silly and condescending. The majority, however, were fun and smart people.

The speakers were pretty much what I expected: the famous people had their message together and presented well (although I got the feeling Shermer was presenting an early draft). The rest either did a decent job or failed catastrophically. Seriously, people: show up with the right version of your slides, and resist the urge to stand there and read them to the audience word-for-word.

At this point I’d call myself 5050 for going next year. I really loved some of the content, and was left flat by other parts of it. Frankly, the core work of Mr. Randi himself has become a bit boring to me. I don’t care as much about debunking “woo-woo” nonsense like astrology, ghosts, or faith healing (though the Sylvia Browne write-up that came after TAM6 is fairly brilliant). I get much more jazzed and happy about actual progressive science and discovery than I do about using science to battle people who are fundamentally unscientific; it’s a nearly pointless and always frustrating argument. I may look for another conference to go to that is more “pure science”, but we’ll see.

TAM6: Starting the second day

I’m sitting at a table awaiting the beginning of the second full day of presentations. Yesterday was really neat and I’m still pondering the heavy-science presentation by PZ Meyers. He simply blew my mind with a brief introduction to molecular biology and the way a particular experiment mapped a genetic growth factor between bats and mice, creating mice with forelimbs that were 6% longer. The power and subtlety of such discoveries is staggering to me.

I think I’m going to start looking for pure science conferences and talks to go to. It’s the discovery that really excites me, and I want more! Hopefully I’ll get more of that today with the likes of Phil hitting the stage.

TAM6: P&T answer questions

Penn and Teller kinda took the easy route and just did a fairly short Q&A session. The most surprising part was, of course, Teller’s voice. For some reason I assumed he’d have a smaller more typical voice, but it is quite rich and radio-worthy. The typical questions were asked, with a few bits of “dance, monkey, dance” silly baiting. Those questions always remind me of “An Evening with Kevin Smith 2: Evening Harder” which is badly marred by people trying to get Mr. Smith to simply repeat the performances on the first DVD.

Someone did ask a good question about Penn’s own “gris gris” which I think he answered well. Even skeptics must admit that we see parts of our world through biased eyes and continue to hold on to ideals or priorities that may not be perfect. We must be skeptical of ourselves lest we become myopic.

They finished their session by screening a short film called “The Cold Reader”, which plays right into the central themes that Randi has pursued throughout his debunking career. It was a very enjoyable portrayal of a psychic scam artist working a couple of his clients. It was fun to see a dramatized first-person treatment of that world. I was also struck by the potential of such a medium, making the practice of psychic readings seem terribly absurd but doing so without resorting to any sort of plain, logical argument. Drama is, in some ways and to some people, a far more effective way of making a point.

Now the auction is over and I’ve been refueled with free coffee. Next up is the brilliant PZ Meyers. Hopefully his laptop is all set up and ready. Yes, even in a room full of this many geeks, there are still presentation problems (both with the projectors and the preparation of the speakers).

TAM6: After first presentations

I’m here in Vegas for TAM6, which is rolling along now. The first day was just a few cocktails and paid sessions (which I skipped), but now we’re into the swing of the normal sessions and presentation. Neil DeGrasse Tyson, billed as the keynote speaker, was fantastic. Speaking in a much more informal fashion than his usual presentations, he provided a lot of comedy and commentary on viewing the world as a scientist, especially in the presence of conspiratorial (UFOs and the like) and plain bad thought processes. He, being a publicly known scientist, gets to hear a lot of the same dumb questions over and over again. He punctuated his talk with a cosmologist’s view of our place in the universe.

It really is a stunning place that we take in this huge expanse, isn’t it?

Penn & Teller, now starting their presentation…

Update: I forgot to mention that I spent this session sitting next to a quiet young man that, after a little conversation, I discovered was none other than Captain Disillusion!

Helicopter madness

I can’t even comprehend the reflexes and skill it takes to fly an RC helicopter like this.

Honor your father and mother

My Parents On Father’s Day I want to take a moment to do something a little odd on my blog. Most of the time I talk only of myself and my experiences. I tend to restrict myself in this way since I don’t want to assume that other people, particularly my friends, want to have a play-by-play of their life recorded by me publicly on the Internet. I don’t mention a lot of names.

But I have to call some people out on this special day: John and Bev, my dad and mom. These two people, who came together in matrimony nearly 41 years ago, chose to begin the family unit of which I am proud to be a part. Together, though thick and thin (sometimes extremely so), they raised 3 kids who have become adults and started to repeat the cycle by founding their own families. In this way they have created one of the most lasting and amazing things in his world: they have created a living legacy. The reverberations of their genetic code and, far more importantly, their personal influence will echo far into the future. When I stop to think of this and its potential, I’m awe-struck. The great men and women of history have their humble beginnings, and their myriad inspirations. My parents have touched so many people, myself included, that their scope of influence in incalculable. There is no doubt in my mind that their impact has made the world better.

So today I honor my parents. They nurtured, taught, praised, corrected, comforted, and encouraged me. They mended cuts, built tree houses, prepared meals, and helped with homework. My list could go on for pages, but the important conclusion is this: they gave me everything, and continue to affect me.

Thank you both. You’re amazing.

Dethklok concert canceled due to fire. Brutal.

Mitch and I headed over to the Fillmore tonight to catch Dethklok, the most brutal band in (animated) metal. When we got there, I saw people getting pushed out of the door instead of going in, and the line wasn’t moving. Only a few minutes later, about six fire trucks showed up, including two ladder trucks! Apparently there was a small fire in an upper room during the first few songs of the opening band.

Not long later Mitch noticed that an upstairs light previously visible through a window had gone out. I looked, and the outdoor signs were also off: they’d cut power to the building. The two ladder trucks raised their booms up to the roof and sent a few firemen up to check things about. It was about then that I figured the night was doomed. Once the power was killed, it seemed unlikely that we would be seeing a performance.

The crowd huddled on the sidewalks and passed information about who had seen what. We speculated regarding our chances. Overall, the crowd was in a decent mood and comedic relief came when someone started waving at us from the roof of an adjacent building. With characteristic brutality the chant arose, “Jump! Jump! Jump!”

After about forty minutes, as the cold wind whipped through largely t-shirt-clad mob, word started filtering back: the bouncers had announced that the concert was off. For the most part, the crowd reacted by being a little upset and bummed, but rolling with it as most people do when there’s nothing that can be done. There was a fire! The concert wasn’t going to happen unless the owners were sure it could be done safely. A couple metal-heads started getting pissed off and yelling at the staff, but were met with scores of rolling eyes that said en masse, “Dude, chill. You were here to see a cartoon band.”

The crowd got their parting comedic shot in by joining in a futile chorus of “Free shit! Free shit!”, hoping in vain for schwag.

Oh well, time to check TicketMaster and get my money back. I’m bummed I didn’t get to rock out tonight; it would’ve been fun.

Rhapsody Redux

Support is frustrating. On-line chat support goes beyond that into the realm of “infuriating” by using even less equipped employees who are given little or no training and a click driven interface for providing robotic responses that are at their best ingenuous or, at their worst, simply insulting. Rhapsody, which I love but am frequently frustrated with, uses this means of support for their web service (the only way I can use their service on my work Mac). I was feeling punchy after their player plugin, which seems to suffer frequent problems, was keeping me from repeatedly playing the songs I need to learn in order to further my Rock Band career.

After my first session was interrupted by the instructions of the support person (clearing cookies, of course, destroys the cookie the chat application depends on), I was in a poor mood. As is my tendency, I drifted toward sarcastic and cynical. So, I present to you the following complete chat log with only three minor modifications. First, I removed the email account information I use to log in. Second, I changed the named of the support engineer to “Eliza” to protect the innocent. And third, I reordered two lines so that it reads more easily (Eliza was very quick with the automated platitudes).

Eliza: Hello. Welcome to Real's Live Chat. How can I help you? Kyle: First: make a note to your colleagues that "Clear Private Data" isn't a very good answer for troubleshooting browser problems, since it disconnects the chat Kyle: Second, I still cannot log into Rhapsody online Eliza: I'm listening. Please go ahead. Eliza: Am I correct in understanding that you are having problem in sign in to the Kyle: Correct Kyle: email/password combo works fine to log into my account details via "My Account" on Eliza: Sure I can help you in providing the information regarding this issue. Eliza: Please give me a couple of minutes while I check your account. Kyle: And thank you for the dehumanizing and demoralizing use of canned, pasted responses identical to the last support person. It makes me feel like a unique and beautiful flower. Eliza: Thanks for your time and patience. Eliza: I could see an active Rhapsody Unlimited subscription under this email address: _REDACTED_ Kyle: Correct Kyle: ... though "Unlimited" seems to be a misnomer given the frequency of authentication problems. Eliza: Now can you please let me know what is the error message you get when you try to sign in Kyle: "There was a problem logging you in. Please check your username and password and try again." Eliza: Now can you please let me know the what is the web browser you are using to sign to the Rhapsody com? Kyle: Firefox 3 on a Mac, RhapsodyPlayerEngine 1.1.0 Eliza: May I know the version of Windows (98, ME, XP, 2000) that you are using? Kyle: No. Because I don't run Windows on my Mac. Kyle: It runs Mac OSX 10.5.3 Eliza: Thanks for the information. Eliza: Now in order to resolve this problem I suggest you to perform this below listed steps. Eliza: Please follow the steps for uninstalling & installing Rhapsody online in Mac operating system: > > > * Open up your Main HDD (Where OSX is Installed) > > * Find and open up the "Library" folder > > * Then open the folder "Internet Plug-Ins" > > * In this folder, locate the file "RhapsodyPlayerEngine.plugin" and drag this file to the trash > > * Once this file is deleted, please visit again and click on sign in to download the plug-in again. > Eliza: Are we in progress? Kyle: Yes. And it's working as well as my last experiences installing the plugin. Eliza: Great! I'm glad it worked. Kyle: Don't get too excited there, Eliza. Kyle: My last experience were not "good". Eliza: I see. Kyle: I shall now restart Firefox, since your guys' plugin seem to the the only .xpi packaged plugin that silently fails during install Eliza: Yes. Kyle: But restarting things several times will often do the trick. It's a very sad user experience, and great motivation for me to cancel my account. Kyle: I shall leave you now, to solve the problems of other people. Eliza: Now can you please try to sign the account and check. Kyle: And hope that someone in Rhapsody operations finally notices the giant blinking red light that says "authentication is hosed". Kyle: Thank you Eliza, it has been robotic and unfruitful. Have a great day! Eliza: You are welcome. Eliza: Is there anything else that I can help you with today? Kyle: Certainly not. _You have disconnected._

Thanks, Eliza. I know you tried. It’s your boss’s fault for providing you with bad tools and no information. Having reinstalled, restarted, rebooted and sacrificed a chicken I am again listening to music. There’s no way for me to tell if I solved a problem or if the time I wasted allowed them to fix a problem on their side. But, if history teaches me anything, I’ll get more data in a few weeks when this happens again.

Goodbye, Bill

I’m horribly saddened at the passing of Bill McCauley. I count him among my friends, and am very sad to see that he took his own life.

That really sucks, Bill. I’ll miss you.

Pylons on Fedora 8

I’ve started playing with Pylons and like it so far. It has the rails-ish routing system, but doesn’t have some of the nonsense. Additionally, it’s designed to be open and adaptable, letting you plug in your own ORM or eschew using one entirely (unlike Django which seems to really want you to use their badly crippled ORM).

To make things easier for people running Fedora 8 or other RPM-based Linux distros, I’ve created some spec files and F8 RPMs to let you install Pylons in an RPM-friendly way. The other dependencies (like python-simplejson) can be found already via yum. Try them, and let me know what you think; I may submit these for F9.

Update: These have been submitted for review.

BYOBW 2008

The Bring Your Own Big Wheel race was right in front of my house yesterday! It’s a uniquely SF sort of event, and was a lot of fun to watch. I had friends over for beers and laughs. My raw video footage is after the jump…

Basically, it’s another event for adults to behave badly and generally act like children (all in the name of fun). I’d bet more than a thousand people showed up to roll down the very-twisty Vermont Street, ending right in front of my house. People wore costumes, had customized big wheels, and generally had a jolly time for around an hour with 3 official runs and a couple extra “unsanctioned” rides.

As you can tell from the audio on the video, we had a blast watching. The majority of the giggle-track comes from AX, who is always in a good mood these days. I just can’t believe my luck in my recent apartment move; this is precisely the sort of thing I wanted to do and see in the city, and this event was delivered right to my front door.

Special thanks to everyone who organized, participated, and watched: it was a great event, and the effect on the foliage and street was nominal. Nobody really made a mess or did any damage (excepting, of course, a bunch of self-inflicted bodily harm). Several people stuck around to pick up shards of plastic and a few bits of litter, and that was very cool of them.

We had a blast watching you all!

Stick a fork in hip-hop

I have XM, and I love it. I listen to Charlie Steiner go on and on about baseball, I get my alt-rock fix when I need it, and find out what the world is up to via the BBC. But I, like the masses, enjoy a little pop music here and there. It’s popular because it’s simple and appealing, and I certainly can enjoy a little mindless pop now and again. Lately, though, I’ve been forced to change channels frequently, and not just because of those no-talent ass-clowns in Nickelback. No, the once-enjoyable and catchy world of hook-heavy, beat-driven hip-hop has degraded to a point below even the simple-minded world of pop. Take, for example, the chorus of the Top 20 hit by the self-referentially named “Will I Am”.

Baby where’d you get your body from? Tell me where’d you get your body from. Baby where’d you get your body from? Tell me where’d you get your body from. I got it from my mama. I got it from my mama. I got it from my mama. I got it got it got got it… _Repeat 2x_

Two lines, repeated a 16 times, for each chorus. Hip-hop artists have stopped even being artists: they are merely sample banks for their producers. The only requirements for being a one-hit wonder are 6-pack abs, the willingness to wear “grills” without an hint of irony, and the ability to repeat a catch phrase. That’s it.

So, I bid you adieu, hip-hop. It’s a shame your death throes may come in the form of multiple hit songs whose core message are “Let me buy you a drink” (or possibly “a drank”). May your pristine baseball cap forever be perfectly tilted. Now get off my airwaves, please.

Small victories, on paper

I’ve succeeded! I previously wrote about making an effort to reduce the amount of junk on my lawn. I put my name in a couple of registries and have a noticeable drop of in junk mail (particularly credit card applications, thank goodness). Additionally, I escalated my problem with The Examiner again and again. After four calls and emails, nothing had happened. Then I decided to go “old school”: for some reason, it seems to be the sort of thing my parents would do, but I called the Better Business Bereau. Sure enough, that got their attention and now I don’t have to throw away a soggy newspaper every day.

It’s the little victories that make one’s day a little happier.


This is the personal web space of Kyle VanderBeek. I am a software engineer, educated at Calvin College, and working in the San Francisco Bay Area of California, USA. Collected here you will find my long and sparse blog (started before anyone called such things a “blog”), a variety of pictures from my life, and some essays of both a personal and professional nature.

I have an XBox Live account: kylevb

And I’m on the Playstation Network:
Get your Portable ID!

Music continues to overcome

It’s been a good month for music. No, not music companies: music. EMI released their catalog on iTunes minus crippling and consumer-hostile DRM schemes. The RIAA has lost more cases, including one that was dismissed with prejudice (meaning the defendant may be able to recover their attorney’s fees). Plus, a home-made album is topping the charts.

My favorite part, though? General Fuzz released another album, this one called “Cool Aberrations”. And again, he’s doing it for free (as in beer). I’ve had his stuff on long-term-loop before (“Messy’s Pace” is still a favorite of mine), and it looks like I’ll be listening to this new stuff for a while too. Go Fuzz!

Update: I went to the CD release part for my friends’ band The New Up and ran into General Fuzz again. I bought him a beer to say thank you for the music. Karma++.

Less junk on my lawn

I just made finished my third contact with the wanks at The Examiner. It’s been 2 phone calls and and email trying to get them to stop delivering their crap little free paper to my house. Maybe it is because I’ve spent too much time in the anti-spam battle, but I’m just getting sick of all the clutter in my life. This one is especially annoying since I have to make extra effort to pick up, dry out (it always gets wet from sprinklers), and then recycle something every day that I have never, ever gotten value from.

It’s time to reduce my junk mail, too. When I think about it I am amazed at how much time I spend shredding credit card applications and recycling coupon mailers. What a waste of resources and my time.

Best Buy’s bait and switch

I find this reprehensible. Best Buy has gotten caught publishing prices on their web site, and having a duplicate, look-alike site that employees access from inside the store. So, if you see a deal on line and want to go pick one up in the store, it is quite possible that an employee will show you a site from one of their in-store browsers that shows a different price on what appears to be the Best Buy site. Silly consumer, you must’ve mis-read the price at home!

First, let’s call this what it is: it’s a grift. It’s a bait and switch. It’s illegal. It’s a scam to get you in the store and sell you goods at higher prices or try to get you to buy other goods. Second, let’s watch Best Buy’s executive team ‘fess up and admit what they did. From the article:

"It's unfortunate, some of the situations being described," Bryant said. "What we've learned very quickly is we have not been clear enough in communicating to our employees the policy, and how to execute it in our stores."

Woah. That’s not an admission. That’s throwing every one of your retail employees under the bus. You’re blaming 17 year old kids for not being convincing con-artists. Just think about the level of sophistication required to pull this off. It wasn’t by accident that an entire second web site and database went up and that machines deployed to the stores were configured to access it instead of the public site. The infrastructure required to make this happen isn’t accidental; it is the result of a massive, concerted effort by people very high up in the organization.

You lied. You’re crappy con-artists that got caught. And I hope you pay.

Update March 19, 2007: According to a report by The Consumerist, Best Buy is still doing this, even after an investigation was launched!

Anthony’s Tacos

I’ve come to embrace the Anthony Bourdain school of restaurant selection. Several times in his show “No Reservations” he has pointed out that the best way to find good local food is to watch where the locals are eating. No matter how “divey” the place looks, if it’s full of people, you are bound to have a good (and safe/sanitary) meal. The locals won’t keep coming back if the food was gross and gave them the runs.

In California (and elsewhere) there is what I will call the “Taco Truck Corollary” that should be fairly obvious. I like to keep an eye out for where taco trucks park near work and home. When I see that a particular truck parks in the same place repeatedly and is consistently surrounded by dirty-handed, hard-working, blue-collar Latinos grabbing a meal, I add it to my list of places to get food.

I have yet to be disappointed with the results of this technique. I’ve had many good $5 meals, and not once have I gotten food poisoning or even an upset stomach. In fact, I’ve had far more sickness after eating at chains than any rolling “roach coach”. It’s simple, tasty food made by people who are truly invested in its quality (it’s their livelihood).

Hooray for taco trucks!

Just an update

There are so many things going on. My friend KX gives me a semi-monthly reminder of the form “Did you realize it has been x months since you blogged?!”. And, yes, I totally realize that. There is so much I want to comment on, but I haven’t. The US is in a silly war. My company is being acquired by Cisco. I visited my family (including a new nephew) over Christmas. I got professional portraits taken by Loic Nicolas. I quit smoking. So much is going on that I really don’t know what to write.

I want to express outrage, joy, fear, frustration, and simple, giddy glee. The question is, though: Is a blog the right place? I really don’t know.

Cricket mysql-status Collector

I’ve written a simple Cricket data collector for MySQL. It tracks the majority (if not all) of the information provided in the MySQL “SHOW STATUS” command. You can download the current version of mysql-status here; it is distributed under the GPL. It is written in perl and requires the DBI and DBD::mysql packages from CPAN.

mysql-status is similar to Heikki Hannikainen’s cricket-mysql-dbi, but runs as an external script and only issues a single SHOW STATUS command. It does not use crickets still-experimental SQL data source support.


The recommended usage for mysql-status is to create a new heirarchy in the cricket-config directory; I recommend calling it /mysqlstatus. Place the mysql-status script in your cricket installation’s utils directory. Run it with the -c option to generate output suitable for using as a Cricket “Defaults” file for your new heirarchy. Running it with -C generates the same config with the addition of several useful graphs in the view.

Next, define hosts in the heirarchy with options set for mysql access. Example:

``` Target short-desc = "My DB Server" target-type = "mysql-basic" mysql-user = 'someuser' mysql-pass = 'thepassword' ```

The user you define needs very few access rights (only SELECT, I believe). I recommend defining limited monitoring user specifically for this purpose.

My Beloved Robot Arm

In the second episode of the first season of “Invader Zim” entitled “Parent Teacher Night”, we are given a glimpse into the birthing process for Irkin invaders. A flashback by Zim shows him being extracted from a pod, cleaned, and equipped by a series of machines. Finally a recorded voice booms, “Welcome to life, Irkin child. Report for duty.” In a moment of infantile naiveté, the young Zim leaps up to hug the mechanical arm that has given him life and exclaims, “I love you cold, unfeeling robot arm!”

It seems like a simple joke, but I recently realized that it is an apt metaphor for a disturbing element of my life. I am (in the general case) a caring and giving person, concerned about the well-being of others and giving of myself (as my friend Tim observed) “until there is no more to give.” This works fine for my relationships and friendships, though it tires me out at times and I need to remember to periodically take care of myself before giving to others.

Unfortunately, I seem to relate to my company in much the same way. I give not just work but love to an entity incapable of returning that love. My employer is that “cold, unfeeling robot arm.” Investing a soulful emotion of affection in entity that cannot return anything similar to that emotion is so absurd as to be a punch line in a cartoon. Yet I do it repeatedly. I offer up each bug fix and release as if it were a bundle of posies picked out of love and desire for approval. Without fail, each offering is acknowledged with cold indifference.

It’s not that my company is failing me. It is doing what it is supposed to do. It has one thing to offer that is love-like (money), but will withhold that as much as possible (for money is its essence of being). The ridiculous end of this exchange is my own. It is improper for me to seek the love of something that cannot give it. Certainly I will continue to seek the friendship and approval of those human beings within the company, but it is high time I discontinue this one-sided emotional relationship which causes me nothing but disappointment. I can take joy in the elegance of code, the satisfaction of a job well done, and camaraderie of coworkers. But I must not invest myself emotionally with the company itself. It is a different being altogether and I shall interact with it only according to the rules of give and take it understands.

It is time for me to “break up” with my beloved robot arm. I’m sure it won’t shed a tear.  Hopefully I’ll be able to handle having it as an employer, not a lover.

This is no Mr. Smith

I’m in favor of Net Neutrality, the concept that the Internet should be free and clear of special “deals” where network owners could charge people to carry their traffic to customers or even block access. Such deals would have crushed things like the blog explosion (a revolution in first ammendment rights) and the advent of streaming audio/video (like YouTube) and social networking (like Friendster) since the giant companies with the big coffers would be able to buy up chunks of last-mile bandwidth. Why would you read an alternative news blog if comes through 10 times faster? Why would you try out that new video service, if AOL can pay to get your attention with more money and worse technology? It’s just stupid.

And who are the people making the laws? Well, in one very prominent case: a fool. A 10 minute rambling by Senator Ted Stevens of Alaska is truly something worth hearing. This guy can’t even explain how Netflix gets to your house, and he’s supposed to understand the technologies being developed on the Internet enough to legistlate them? Good lord. If this doesn’t shatter your visions of “Mr. Smith Goes to Washington”-type elloquence, nothing will. The brightest and best are not the ones we’ve sent to Washington.

Update: Via “Throw Away Your TV”, Jon Stewart took on Net Neutrality with hilarious results, having specifically taken on Ted Stevens previously.

Update: Thank goodness someone made a Ted Stevens techno remix.  Woo!


I’ve written here a few times about DRM (specifically the Sony “root kit”) and now I realize that, as a result, I don’t quite trust my computers with music anymore. I’ve been a consumer of CD music for a long time now, with several hundred discs overflowing my current storage solution (yes, I still like having jewel cases and liner notes around). When I buy a CD, it usually makes a quick trip to my Linux box that runs custom software I wrote to rip everything to MP3s for my convenience. After that, it usually gets dropped into one of my higher-end home stereo systems for thorough CD-quality listening.

Today I got the new Tool album and was surprised to find that I was afraid to drop it in the CD tray of my Windows laptop at work. Might I be installing software unknowingly? Could listening to this new music damage my computer? What if it installs software that allows my machine to be compromised next time I fire up wireless at a coffee shop? Could that cost my company money or intellectual property?

I’m a huge music consumer, and I feel betrayed by the business that has thousands of my hard earned dollars. I feel like they’re likely to screw me, the customer, at any moment to “protect” themselves against the imagined threat of mass-piracy. Sure, music is being stolen. But does that justify what they’ve done and how that has affected me, the straight-arrow consumer?

What’s my name?

I like my names, both first and last. People seem to choke on both of them, and I don’t really understand why. Maybe I don’t speak clearly enough, but I often end up getting called “Cal” or “Karl”. One sandwich place in the city even managed to consistently write down “Todd” on my order ticket. I suppose that was better than having the immigrant fellow behind the counter puzzle at the pronunciation for a bit and then holler out, “Kill! Kill!” when trying to alert me that my meal was ready.

My last name is a whole other ball of wax. As long as I can remember, it has been mangled. VanderBeek is as phonetic and simple as can be, but people seem to panic due to the extra capitalized letter and number of letters. I’ve long since stopped using the space that should be before the “B”: too many people decided “Vander” must be my middle name. Granted, a certain no-talent ass clown has made life a little easier with respect to recognition (though I find his use of capitals and spaces gluttonous). Sadly, that comes at the cost of being asked if I’m related to dear James every time a teen-aged checker at Safeway notices the name that comes up when I swipe my card. Such is my lot.

The most puzzling thing, though, is the world’s seeming inability to believe that I can correctly spell my name on a form. I have decent print handwriting, and am especially careful on forms that will be read by scanners. Still, I get all manner of variations coming out the other end. I’ve had to correct the DMV, my bank and broker, insurance companies, and employers. Mostly they seem to think it impossible that two consecutive e’s would be in there. Almost uniformly they seem to think, “Surely he must mean ‘VanderBeck’.” And, of course, they are very wrong.

Finally, there is the category of truly random mistakes. I get email and junk mail to a variety of bizarre permutations, some more hilarious than others. However, I recently got a refund check to a name that is useful. I’d like to thank the people at Epson for making reasonably good printers with enticing rebates, and for supplying me with what I must eventually use as my stage name: VanderRock!

A Wealthy Man

I’m as wealthy as I’ve ever been. Yes, I make good money, but that’s not what I’m talking about. I’m in a place where I have the richest set of friends I’ve ever had. I have people to laugh with, buddies to veg out with on the couch, shoulders to cry on, and backs to slap at a party.

I’ve had a few little strange freak-outs and anxiety attacks. This is a strange, new, and vivid world of emotion for me. It’s fine, though painful, because it is real. I choose to experience life like this, in all its colors. And I choose to not be overly strong, but to instead rely on the wonderful people around me. This is the right thing to do as it is part a true human experience. And my friend Jeff says, “If your don’t allow people to help you, you are robbing them of something.”

I had a wonderful time last night and this morning (post crash-out) with two of my favorite friends, and I can’t help but feel blessed despite my current exhaustion.  I’m a very wealthy man.

Better emacs

I really try not to get involved in OS/distro/editor wars, but I can’t help jumping in on a little hot-advocacy-action. There is an article on 10 ways to be more effective in emacs that keeps popping up toward the top of the reddit link list that has been totally driving me nuts. So, I just can’t keep from posting a response.

I use emacs pretty much all day every day. I cut my teeth on it back in 1993 while at college, borrowing a .emacs file from an upper-classman and jotting a few important key combinations on a piece of green-bar paper. Since then, I’ve programmed in a dozen languages for a handful of companies as well as just out of pure joy. Emacs is what I choose to use (although I’m also fluent in jedit and vim). I’m also a “configuration minimalist”: I like to use programs as they come out of the box. I find it easier to adjust my brain to how a program works than forcing a program to work how I think. After trying to carry around a set of dot-files and being frustrated when a particular system lacked my particular bindings (I work with around 20 machines in a given week) it just became more time efficient for me to work within defaults with very few settings.


First, some responses to the author’s points. I won’t hit on every point, but there are a few I care about:

Item 1: Swap Caps Lock and Control - I almost agree with this. If you’re going to use emacs, you’ll live with your pinky on the Ctrl key, so it is worth it to remap it to a faster and less stressful position on the keyboard. But who actually uses Caps Lock? In the very rare instance that I need to type a few capital letters in sequence (I don’t write much Apple BASIC anymore), Shift works just fine. I say ditch the Caps Lock key altogether. Modern X servers make this easy with the XKbOptions “ctrl:nocaps” setting; one line in your X config makes this change permanent, and it’s less confusing than an xmodmap incantation (which I always have to search around the internet for). Plus, there is a very nice little utility over at Sysinternals that lets you do this on Windows (it’s called Ctrl2cap). This is an exception to my configuration minimalizism, but your hands will thank you.

Item 2: Invoke M-x without the Alt key - Seriously? I do remember back when I used a Visentech 220E that some of the older machines at school didn’t have a working termcap that let the Meta key work. But this is an artifact of a time gone by; I haven’t encountered a machine with a non-working meta key for ages. If your platform can’t map Alt to Meta, you need a better platform. Just use Alt, and you’ll be fine. The core keys you need to use are mapped to Control (which we fixed above), so grabbing the Alt key for M-x commands won’t be so bad.

Item 3: Prefer backward-kill-word over Backspace - I agree with the heading, but not the content of this item. By default, this function is mapped to M-Backspace which I find to be pretty quick, not to mention how enjoyable whacking a large Backspace key can be. You already use Backspace, cording it with the meta key should be a trivial brain-training excercise. But remapping it to C-w is right out. If you need to move code around, having quick access to C-w’s default mapping (kill-region) is critically important. Want to move a block of code? Mark the beginning with C-Space, move to the end and kill the region with C-w. Then just move the cursor to the destination and mash C-y to yank it into place from the kill ring. This key binding change is sure to drive you nuts on a new system, or cause frustration for anyone who tries to “drive” your editor for a moment or two.

Item 4: Use incremental search for navigation - Oh hell yes. Mastering the use of search to find a function, variable, or comment is incredibly useful. But don’t forget to learn how to move a line at a time (C-n, C-p), a page at a time (C-v, M-v), or to the beginning/end of a buffer (C-). I learned a few of these later in my learning curve than I should of. Also, don’t under-estimate the power of moving forward and back a character (C-f, C-b) or word (M-f, M-b) at a time without leaving the home row.

Item 5: Use temp buffers - Certainly, but you have have a scratch buffer sitting there for you automatcially: go ahead and use it. It also has the advantage of not asking if you want to save it when you exit emacs.

Item 7: Lose the UI - I’m not going to tell anyone to remove the UI. It doesn’t gain you a damn thing. If you like using the mouse, use the mouse. And in this modern GUI world I often use the mouse with other applications and have to switch to and fro. As much as I love emacs’s keyboard-centrism, I’m not going to handcuff myself from using the mouse. I work with a browser window open constantly and as a result use the mouse plenty. If I need to go back to emacs to look at something, removing the UI forces me back to the keyboard. A great amount of use efficiency comes from avoiding switching from keyboard to mouse or back, not from only ever using one.

Interestingly, the author goes on a bit of a sidebar about keyboard efficiency here and presents some examples. Sadly, his examples don’t work for me. If I want to get to the top of a buffer and add 80 hyphens, I do C-< to get there, type C-8 C-0 (to tell emacs to repeat the next thing I type 80 times) and hit “-”. I think he’s got some other custom key bindings he’s not telling us about (that’s what I call “bad advocacy”).

My Additions

There are quite a few little gems in the author’s footnotes and the comments he collected. Some are worth highlighting, and I’ve got some additions of my own.

Print a quick-ref - I you’re just getting started, or even want to brush up, it never hurts to have the quick reference card laying around. Look up a command a few times and it will quickly become a part of your arsenal. While you’re at it, a bookmark to the emacs manual never hurts.

Use fill-paragraph - This is handy, especially if you’re writing documentation in RST, HTML, a code comment or even composing an email. Sadly, the author’s binding doesn’t work. This function defaults to M-q today. Again, a binding he isn’t telling us about!

Flip buffers fast - The author mis-speaks when talking about switching buffers: to get a buffer list, use C-x C-b. C-x b just gets you access to the minibuffer where you can type the name of a buffer you want to visit. It defaults to he last buffer you visited, so hitting enter is a quick way to flip between two buffers.

Kill lines - If you aren’t already using C-k to kill to the end of a line, start now. It comes in especially handy in the mini-buffer to pick a buffer or file to go to.

Visit files - Open the wrong file? Use C-x C-v to “visit” the right file, replacing the current buffer. This will help you avoid having a too-long list of buffers open when you only need a few. And when you’re done with a file, C-x k will let you kill that buffer.

Use tab-completion in the mini-buffer - Whether you’re opening a new file or switching buffers, the mini-buffer has tab completion to help you avoid typing any more than you need to. Type part of the name, hit tab, and it’ll fill in the rest for you. If it beep at you, hit tab again to see a list of possible completions.

Try emacs-tramp - This one is a little more non-trivial. emacs-tramp is a virtual filesystem extension that lets you edit files on remote systems via the likes of ssh/scp/sftp and FTP. If you want to edit on a remote machine without suffering from terminal lag, this is a must-have. It also allows you to edit on your local machine via su or sudo, which is incredibly handy for touching up that httpd.conf.

jedit has a plugin that does this very well and is generally less of a hassle to get set up right, but don’t think emacs only has ange-ftp anymore.

Enable global-font-lock mode - Possibly the worst-named option in emacs, this is what gives you syntax highlighting. Maybe you won’t seem as hard-core with your curly braces displaying in pink, but you’ll probably catch some trivial mistakes sooner rather than later.

Learn version control commands - emacs comes with a version control mode, so you can edit and commit without leaving your little emacs world. If you’re writing code, switching over to a shell to type “cvs commit” is a waste of time. There is integration or modes for most source control packages (including the popular Subversion and Perforce), so look into it.

Geek out with M-x shell - You can get a shell prompt inside emacs and treat it just like a buffer. If you find yourself wanting to run a quick command and pull the result of it into a buffer, this is for you. Run a command, and you can trapse around the output just like any other buffer. Granted, this is the sort of thing that makes people call emacs a “great operating system”, but it’s just too handy to ignore. I’m also a command line geek, so I pull this out with some regularity for perl on-liners or MySQL queries.

Check out ispell - This really won’t make you more effective, but it will definitely annoy your pedantic cowokers less when your javadoc or pydoc only spells “ennumerate” in a single way. M-$ checks the current word, and there are also commands for checking entire buffers or selected/marked regions.

I hope you find this helpful. Give emacs a try!

More patent/copyright insanity

I really continue to be amazed by the little steps of insanity we are making in our capitalist interest. I recently found out that DC and Marvel hold a joint claim to the phrase “super-hero”. That’s right: the combination of the words “super” and “hero”, perfectly innocuous on their own, is a trademark. And the people that own it are enforcing it! They actually forced a small comic book publisher to rename their comic “Super Hero Happy Hour”.

And does our insanity end there? No. Now apparently you can patent the association of concepts. Just thinking in a certain way about related concepts might cost you royalty fees. And this particular example involves a likely diagnostic path. Can you imagine being a doctor and thinking, “Hey, this guy has low x levels, I should check on his y levels. Damnit! Now I have to send JerkCo $5 for that thought.”?

In the US we continue to find ways to ship actual jobs out of country (not including highly-skilled jobs like mine) and end up doing less and less here. Soon, we’ll just be a nation of lawyers suing each other and passing a stagnant quantity of wealth back and forth. People are getting laid off, companies don’t create they just protect their intellectual property, and nobody is keeping their books honestly. Where the hell are we headed here?

Follow-up: A nice little OpEd piece over at NYT shines a little light on “patent trolls”, another wrinkle in this mess.

Enough to make you cry

Now I give you the feel good video of the year.

The Old Man's iPod

Via BoingBoing, I love to see metion of recent discussions on the hill about the broadcast and audio flags. To sum it up, the 80-plus year-old senator Ted Stevens (R - Alaska) got an iPod for Christmas and discovered the joy of time-shifting some of his favorite radio programs. Armed with this simple experience, he asked the RIAA if the legistlation being proposed would make this illegal: would it make the senator a criminal? How about that! The RIAA lawyer had to answer truthfully that, yes, this would become illegal. Or at least manufacturers of these devices would have to make such activity impossible.

This is great stuff. Maybe they’ll finally realize that this isn’t a war on pirates. It’s simply an industry that doesn’t know how to handle an evolving world trying to hide behind laws. I hope the Senate figures it out and becomes actually insulted by what the RIAA is trying to do to normal citizens.

Update (February 1st, 2006): Sometimes I love the internet.  Think maybe more senators could learn the same lesson?  Well, heck, why not buy them all an iPod?!

The Open Source vote

Wow. This has got to be one of the most progressive things I’ve seen in a while. Wisconsin has signed into law that the source code used in touch-screen voting machines must be available to the public upon request. Wonderful! It really does make sense: democracy is supposed to be a fairly transparent process. Althought some of the rules (like the Electoral College) are complex, we can all find out how they work. The rules surrounding how a polling place works are matters of public record. Why wouldn’t the code being trusted to implement these rules also be public?

Kudos to the cheese-heads.

The EFF Risk

I have donated money to the EFF several times since I believe in much of what they stand for. We need a “rights defending” group that understands the new online and electronic world, and the EFF specializes in that. However, I have to agree somewhat with the scathing opinion piece on The Register. The EFF, despite its purpose, has really bobbled several important cases and actually hurt the causes they intend to champion. Maybe the EFF needs to examine its staff. Fighting the good fight is admirable, but you also need to fight it well to make a difference.

This sadly reminds me of a sticking point for me in Christiandom. People often feel that being “good hearted” or “on the right side” is enough. But in the service of a cause (or God), excellence is also very important. I know it is impossible, especially when relying on volunteers, to get the best of the best. But it really does bother me to see various forms of “righteous incompetence” justified purely because of the side being taken.

Just ask the Crooked Saint what he thinks of sub-par Christian music, and you’ll get what I’m saying.


I totally feel like a joiner since I’m coming late to the game, but I just love Threadless t-shirts. I have started wearing a lot less tees these days for some reason. I think it mostly has to do with feeling good about myself and looking a little better. To do that, it’s key to avoid wearing all those ugly, free vendor shirts I used to have. I’ve slowly been purging them, only keeping what I need for the gym or around the house. But I needed some good tees with a little style, and Threadless has provided just that.

Rubbed the Right Way

Today was really the “final” important practical massage class I had. At this point, I have a fairly complete set of tools for making people feel relaxed and good, and even occasionally help them heal. I still have 6 weeks of class left, but that’ll be a lot about refining my skillset. Now it’s just all about practice, practice, practice. I worked with Christine today and we gave each other a massage lasting about 50 minutes. She did great, and I felt fantastic working through my strokes. The jitters are finally gone. I even managed to gracefully do the draping work.

It’s really pretty great to get those little groans of pleasure here and there. It totally feeds some part of my psyche and brings me a great degree of joy.


What a night. I finally got to see Weezer in concert, something I’ve wanted to do for a very long time. Although I’m not really a big fan of the new album (it’s no Pinkerton) I had a great time at the show. They played very well, and the crowd just ate it up. Rivers even did a solo/accoustic rendition of Island in the Sun from a tiny little stage set up at the back of the arena. Some hoochie hopped up on the stage and did a little dance during it, but it was still cool.

They were on the bill with Foo Fighters. I haven’t kept up with their recent stuff, but they were just amazing. Dave Grohl is a fantastic front man (just ask my concert-companion Sarah, she’s in love with him). I was truly impressed with how perfect they sounded. And the drummer: wow. The man is a machine. Aaron X. tells me that there was some initial difficulty with drummers for “the foo”, and justifiably so. Grohl is a great drummer and himself, so you’re not going to get past him as a slacker.

Stopped by at Jeff’s birthday party on the way home. “The Flury” was plowed and loud, and many of my friends were in attendance. Damn, I love that bunch!

Video Game Violence

I have to give “props” (if a guy like me is allowed to give “props”) to the fellas over at CAD for dropping a funny strip today that also makes a strong declaration about video game violence. Nice work, guys. This jackass lawyer Jack Thompson seems to be at war against the right to free speech. To me he just seems like a real-life Unfrozen Caveman Lawyer who is afraid of the modern world and its myriad blinking lights and talking boxes. *[CAD]: Ctrl+Alt+Del

Demons of Loneliness

I’ve done some stuff to attempt to improve my ability to relate to the fairer sex, and am slowly getting better at it. Confidence is still a big problem for me at times. But I am still regularly pestered by the “demon” of loneliness. But I have never been able to frame the problem of loneliness as well as Waiter Rant has. Kudos, Waiter.


I’m hurt. I’ve been taking massage classes, and I think one of my partners made a bit of a mistake while palpating along my spine. She got a little sideways and pressed in a diagonal fashion on about my fourth thorasic vertibrae. Instead of sensning the muscles along my vertibrae, she “firmly discovered” my spinous process. The last two days I’ve felt real tightness in my upper rib cage and back. It’s been awful.

Who would have thought that learning massage would result in my needing massage!

Regardless, it really adds gravity to what I’m doing. I really understand now how important it is to know where you are and what you’re doing if you’re using a lot of pressure or going deep. Backrubs are fine, but there is risk and knowledge required for massage.

Serenity, you please me

My friend Katherine once said to me while discussing Firefly that “Joss Whedon gives you what you want, but not necessarily in the way you thought you wanted it.” My movie experience tonight was very much like that. I loved every moment of Serenity. It gave me all that I wanted out of the story and characters. It satisfied my desire for justice and a win by the underdogs. But it gave it to me in a bitter-sweet way that sucked me deeper into the world. Serenity is a great damn movie.

I scored tickets to tonight’s special screening thanks to this blog, so I have to write at least something about the movie. The problem is that I’m nearly speechless. That was the best movie experience I’ve had in ages. Serenity is faithful to the TV series I loved, and tells a fantastically enjoyable story standing on its own. It delivers plenty of moments where the entire theater will laugh aloud, and moments where everyone feels the need to clap or cheer. It also will land a few emotional stomach punches that will leave you stunned only to lift you higher with yet another triumph.

Go see it. And buy the DVD set of Firefly. Then go see it again. I’m going to.

(Wow, this is really uncharacteristically glowing of me.)

ESPN the Magazine: You’re cut!

For a while I subscribed to ESPN the Magazine. It’s a pretty well written rag with decent stories and a nice touch of humor. Lately, though, I haven’t had time or desire to read magazines, so I let my subscription (and a few others) expire. As I expected, I got the little set of follow-up letters offering me special pricing if I renew right away. No big deal.

But the last few of their letters have gotten odd. In fact, they’re hostile. I know I paid for a 1-year subscription, up front. I let it expire, and they stopped sending me magazines. I owe them nothing. That’s pretty much how this whole economy thing works with the exchange of monies for goods.

But now they’ve gone too far. They sound hostile, like I actually owe them something. The latest notice includes the words “final notice”, “collect payment”, and “permanent ESPN the Magazine credit record”. So I decided to use their web form to drop them the following complaint/question:

I let my subscription expire on purpose. I paid up-front for a certain number of issues and there was (to my knowledge) no stipulation about renewing. I have been getting increasingly threatening letters from your “Collections Department” which I took to be a fairly rude/clever/harmless way to attempt to get me to re-up.

The tone of these letters has become unacceptable, with talk of some sort of permanent credit record. If this is marketing, it is deplorable.

If there is indeed some actual balance left on some account (I haven’t received the magazine for many months, after the 1 year I paid for), please respond to me via email and enclose a copy of the terms.

I can also be reached on my cell phone at 650-xxx-xxxx.

Thank you.

I think that is fair. I’m willing to play ball here. But you know what? Their fucking web form is broken! They apparently have some junior asshole programmer working on their site and can’t handle a single <textarea> and file it in a database or fire off an email! Apparently, there are “Invalid Characters In Request”. It’s text! Are quotation marks too much? Maybe it’s those nasty backslashes? Nice work, jackasses.

So, this is my open letter to the apparent fucktards in ESPN the Magazine collections. If I missed something or actually owe them money, then I’ll take this down. Otherwise it stays.

Update: I just submitted the URL to this entry to their form, and it succeeded.

Update 2: I just poked at their form a little more, attempting to put a few words in to explain the URL. Well, it seems that their form can’t handle me hitting “Enter”! That’s right, “\n” is an illegal character apparently. Genius. So no complaints in proper paragraph form.


I’m in! I just got notification that I have been selected as one of the people to see Serenity on the 27th. As a part of this, I’m obligated to provide you with the following synopsis:

Joss Whedon, the Oscar® - and Emmy - nominated writer/director responsible for the worldwide television phenomena of BUFFY THE VAMPIRE, ANGEL and FIREFLY, now applies his trademark compassion and wit to a small band of galactic outcasts 500 years in the future in his feature film directorial debut, Serenity. The film centers around Captain Malcolm Reynolds, a hardened veteran (on the losing side) of a galactic civil war, who now ekes out a living pulling off small crimes and transport-for-hire aboard his ship, Serenity. He leads a small, eclectic crew who are the closest thing he has left to family -squabbling, insubordinate and undyingly loyal.

I think this is a pretty shitty synopsis. I cut ‘n pasted it exactly, only putting a little markup in place. You’ll note that it was poorly proofed: Whedon never produced a television show named “Buffy the Vampire”. I didn’t watch it, but I’m pretty sure she was quite the opposite of a vampire… a slayer of some sort. It should also be noted that his feature-film debut is based on his TV show “Firefly”. That connection is worth noting. And referring to Mal as “hardened” seems pretty inaccurate. I’d put him in the “dissolusioned” category if any. But maybe this is why nobody has asked me to proof-read a movie synopsis.

Regardless, I think it is important to note that “Firefly” and, I assume, “Serenity” is character-centric sci-fi. Sure, they have spacecraft and super-cool computers, but the show was about the interesting people, society, political sides, and their interactions. The future is just a backdrop for a real story. I enjoyed the story as it was told on “Firefly” immensely, and I look forward to seeing the movie adaptation (and hopefully get some damn closure about several of the story arcs). If the movie is told in the same spirit as the show I suspect that it will be enjoyable to people that aren’t necessarily sci-fi fans (something “Star Trek” never did).

Crashing the Weakerthans

Yay! I just noticed that one of my favorite songs by The Weakerthans, “Aside”, is on a movie soundtrack. Granted, it’s the sountrack for the sophomoric “Wedding Crashers”, but it’s a major-lavel release. It makes me happy when cool bands get a good break. Guys: I hope you keep making music. I love it.

Serenity, I hope?

A friend dropped me the URL of what is supposedly going to be a pre-screen of the soon to be released film “Serenity”, a movie built from the ashes of the show Firefly. I filled out the relevant bits and mashed submit. As far as I can tell, I’m in: two tickets for 3 days before the official release. I can hardly wait.

I have managed to drum up workplace excitement for the movie by passing my copy of the Firefly DVD set around. Without exception, each person came back and said, “Why the hell did Fox cancel this show? It’s awesome!” Nice work Fox. Excelent market research. Just at my work, I can point you too about $500k worth of household income who (a) didn’t hear of your show due to sub-par marketing and (b) would’ve watched it and been exposed to your advertisers.

This all goes back to a point I’ve made many times. There is a fundamental problem with surveys and Neilson ratings: they only measure the portion of the populace that likes to do surveys! I don’t, and neither do my friends. But, man, are we worth marketing to. So figure out how to measure us.


Tonight I had my first “skin-on” contact of my massage class. It was kind of terrifying. I think I have a reasonable aptitude for touch, but my brain really wanted to “get it right” this first time. By the end of 20 minutes worth of some basic back massage strokes my legs were on fire, my brow was dripping, and my brain was shot. Not to sound too spacey, but there really is a lot more to this stuff than just touching. There is connection, care, and an empathic tendancy to this sort of work.

Granted, there is also homework. Ick.


Screw Microsoft. I’m done with their Office products. I’ve been using OpenOffice for a while, and have now given their 2.0 beta2 a good test drive. It’s simply great. Everything almost anyone could need (including DB connectivity and presentation software) in a 75 meg download. Don’t pay for MS Office when you buy a new computer: just get OOo.

Bad English

I was eating sushi with a friend the other day. We went to the little place that is right near my new house, which is really good. Honestly, there is nothing better than having a great sushi place less than a mile away. Anyhow, they are good at carving up tasty fish, but their publishing abilities leave something to be desired. Inside the little payment folio we got with our bill was one of the most wacked-out sentences I’ve ever read. After stating that they don’t do the debit-card-thing was printed: “We’re apologized for you inconveniences.”

Seriously, you almost have to try to make that many mistakes in one sentence.

In my ear

I have new Etymotic 6i in-ear headphones. They rule. It is going to take a little bit of time to get used to having earplug-like inserts in my ears, but I really am amazed. The amount of detail I’m hearing from my MP3 sources is unreal, and CD’s are jaw-dropping. Plus, they’re white so I can maintain my iPod “white supremacy” ‘tude.

Is it just me, or are white ear-buds some sort of badge of coolness these days? I found them to be awful, and chucked them into the back of the closet and stuck with my old reliable Sonys. They’re nothing fantastic, but at least they manage to block some surrounding sound and I don’t have to constantly put them back in my ears at the gym. Stupid ear-buds!


I’m in Colorado with the Pranger clan having what should be a good time. However, it is all down the crapper now. I just talked to mitchn on the phone and we are apparently being evicted. 30 days notice. 2 well-paid engineers with unreal credit ratings and decade-long employment histories. Evicted.

I was really hoping this would be a place I could spend a lot of time in. I really like it! It’s comfy and roomy, and mitchn and I get along fine. I wanted to have housing-stability, but now I don’t get that. Again, for the 5th time in 6 years, I will be moving house within the Bay Area. Damnit!

No wammies!

Did you know that there was a Press Your Luck scandal? I didn’t until recently. The story is at first interesting, but then incredibly sad. The guy figured out the game, but couldn’t get a bit of luck going in his real life afterward.

Legally yours

In our modern litigious world, it is sometimes hard to know where the lines lie. Fortuntately, every once in a while someone will step in and help out the laypeople of the world with some plain-English guidance. Take it for what it is worth, but the EFF put out a legal guide for bloggers which I think is pretty cool. I’m only a few degrees of separation from people who have gotten sued or fired because of their personal blogs. This seems like a new, interesting realm of law. *[EFF]: Electronic Frontier Foundation

Geeks make better lovers

There is of course quite a little buzz in the nerd/geek world over the article in the NY Daily News claiming that nerds are better lovers than their pretty boy counterparts. There is a considerable amount wrong with the article, but we do have to assume it was written by a guy who was popular with the ladies in high school and thus doesn’t really know what he’s talking about. That can be forgiven.

I do feel the need (as did my buddy Jeff) to point out that there is a difference between a nerd and a geek. I’m a geek. I’m not a nerd. I get a little too excited by computers: I can go on for days about them and spend too much time with them. But I take breaks to talk to humans, go to the gym, and run through the shower periodically.

Nobody wants to hook up with an un-groomed, un-showered, socially inept nerd. But all the ladies want to get with geeks now. Oh what a cross to bear!


Just now, for what I believe to be the first time in my life, I finished a spool of floss. I didn’t lose it. I didn’t toss it out when I realized I had inexplicably ended up with 6 spools. I actually finished it: pulled out the last piece.

I shall take this as a minor victory in an otherwise difficult day.

Revenge of the Suck

I keep going on and on about how much I like working for my current company; it really is a great place. But today they did something of dubious value: they took me (and the rest of the engineering team) to see George Lucas’s latest abomination. Really, watching something that horrible as a group was an awful thing to do for morale, especially with some big release deadlines coming up. What were my bosses thinking?!

Seriously, though: I’m so glad I didn’t pay money for that. If I want to see wooden delivery and puppets I’ll glue some googley-eyes to a sock and make it lip-synch to a tape of my 7th grade play.

_Update 6/21/2005: I really enjoyed a deconstruction of the Star Wars prequels and the persistent characters therein that I found via American Idle. Very well written!_

Lost jacket

The people at my work are a bit “special”. How can you tell? Well, Scot lost his jacket; he thinks he may have dropped it on the way out to his car. Most people would send about 15 words to their coworkers to find out if anyone saw it or picked it up. Not Scot:

I am wrought most sorely vexed over the chance that my jacket may have fallen to the wayside whilst I did perambulate from the edifice in which we work to my automobile carrying several ungainly packages. Should you have encountered it this eve or should you do so in the morning, lying unattended and rumpled, heavy with night dew and abandonment, I should be most appreciative were you to give it succor and aid, bringing it once more into the friendly domain of human/jacket society. Or you could just drop it by my cube - it's dark blue corduroyish, with a reddish interior. The jacket, that is - the cube looks pretty much like all the others. Thank you, and may your own jackets ever bask in the friendly warmth of your attention and care.

I love working here.

Social metric

I’ve decided that there is an easy way to tell if I’ve been “making the effort” to go out and socialize. It can be easily gauged simply by counting the number of discarded MapQuest maps on my floor. Since I live in the Bay Area and the people I know are scattered from Santa Cruz to Salinas to Oakland, there is no way for me to know how to get everywhere.

Right now there are about 5 used maps in my car. I’ve been a busy boy. Now, off to add number six.

Engineering Essentials

I see a lot of stupid stuff while developing software. I see it professionally, I see it in the open source world. I see some things over and over again. So here we go, a bunch of key concepts, anti-patterns, and miscellaneous crap that drives me batty.

  • Source control is actually easy to use, and is useful. git is free, play with it.

  • Source control keeps old revisions of code, you don’t need to keep them in the file as commented out blocks. Or worse, enclose them in if (0) { ... } or #if 0 ... #endif blocks. Delete the damn code already.

  • A global or static hash/dict/HashTable does not a cache make. Caches have size bounding, expiration schemes, and locking semantics. What you’re creating is a memory leak and potential headache.

  • The solution in Java (or any OO language) is usually not another singleton or class method.

  • Deprecation is a nice thing to do.

  • “Fixed bug” is not a valid check-in comment. Neither is “changed code”.

  • You should do a source control update before you test/check-in, because I don’t give a flying fuck how well your new code works against the copy of the source code you updated 2 weeks ago.

  • That thing you don’t understand and are misusing? There’s a book on it. I’m sure of it.

  • That thing you couldn’t find a book about? Google knows where an article is on it. Giants exist and have amazing shoulders.

  • If you ever think, “Man, I can’t believe nobody has written a standard library to handle this problem! I’m going solve it!” you should stop coding. Someone probably already has solved it, and you just haven’t looked hard enough.

  • Not all your code is “library worthy”. Write it first as a local function. Then learn from your local version as you write another local version. If it turns out that other people can use it, then and only then should you move it to a common library area.

  • A library should never be named after your business model. If you’re writing a finacial system, libfinance is the worst thing you can start with because everyone will justify that their new function is a part of dealing with finances, and belongs in libfinance. Within a very short time, it will become an unweildy, unmaintainable mess.

  • Stop being so damn timid. You’re a developer, rewrite it already!

  • Global variables are still a bad idea. Seriously. This is something that hasn’t changed since you took your first programming class.

  • Use a logging framework and provide meaningful log messages. Otherwise the operations guys will kill you in your sleep. It’s not a big deal for them. They’re already awake and angry because your shit broke and printed the phrase, “Something bad happened” to STDERR.

  • A cron job that prints out “Completed successfully” every time it runs is against the rules. Cron emails he operations guys; they don’t like deleting messages all day that confirm that they don’t need to fix anything. How would you like it if the guy you work with stopped by every ten minutes to tell you all is well? Be silent on success, and noisy (and helpful) on failure. Also, again, use logging!

  • Write code and comments for the next person who will be in the code. If you’ve ever indignantly wondered “who wrote this code” and found it to be yourself, think how someone else would feel.

RIP Mitch Hedberg

One of my favorite comedians (probably my absolute favorite) has passed away. Mitch Hedberg died this week in his hotel room. I love his albums and the DVD I have, but I’ll never get the chance to see hime live. This makes me truly sad.

I’m against picketing, but I don’t know how to show it.
– Mitch Hedberg > >
*[DVD]: Digital Versatile Disc

rsync and vfat

It took several tries, and a lot of poking around, but I finally have my music collection mirrored to a disk I can take around (most notably to work). The hard part was getting rsync to work right. Finally I got it working after finding a helpful article on the topic. To summarize (in less than 3 pages), I used to following 2 commands:

mount -t vfat -o shortname=mixed,iocharset=utf8 /dev/sda1 /mnt rsync --modify-window=1 -rtv --delete /data/mp3/ /mnt/mp3

Now I won’t lose them, and maybe they’ll help you. The only reason for having problems is that I was using the vfat filesystem under FC3 Linux (where my custom-built audio archive exists) to make a disk I could plug in to my work laptop. Windows filesystems aren’t so great, they have problems doing mixed case and being very accurate with times. So this makes it work!

SBC sucks

Well, I think I’m officially going to try to avoid using SBC for phone service in the future. I’ve been trying to call today to make some changes to my account (since competition has made stuff cheaper) and they keep saying that they are unable to take my call. Just a recording. All their customer service lines. Great.

I fell

Yesterday was a big day for me. I started by driving down to the Monterey area and jumping out of an airplane with my best friend Liz. Then I hustled back to a dinner party at my neighbors’ that ended up being a Persian New Year celebration (amazing food and lively company). Once that was all said and done, I headed up to SF to go dancing at a psi-trance thing up at the Blue Cube. It turns out that it is pretty amazing how well you can fill your days if you really try to.

On skydiving, it was really a pretty amazing experience. It was marred a little bit by the fact that we had to wait for about 3 hours before going. As expected, people who jump out of planes aren’t real big on organization and scheduling; the “reservation time” we had was fairly pointless. But once it happened, the experience was beyond words. I was mostly dumbstruck as I hopped from a plan and just fell for 60 seconds. It was so unreal that I kind of disconnected from it. Some part of me refused to believe that it really could be happening. Except for some bruising around the shoulders and the fact that I was too big for the harness (and probably for the guy strapped to my back), it went wonderfully. I might have to do it again. Liz, ever the adrenaline junkie, is convinced that it will become her next hobby!

Oh, and it is worth noting that I didn’t bother to tell any part of my family about it until afterward. On the way back to RWC, I called the folks to let them know. I said, “Guess what, I just jumped out of an airplane.” True to form, my father immediately dead-panned, “You idiot”, and promptly laughed.

JBoss, MySQL, and CMP

Last updated November 30, 2002

Introduction and Prerequisites

A very important feature that is making it into JBoss is the use of generated primary key values (or “unknown keys”) with CMP 2.x entity beans. It is very common in the real world to use features of a backend database to create integer or time-stamped columns that can be efficiently used in indecies to uniquely identify rows (as primary keys). Anyone having experience with the MySQL database engine is familiar with their AUTO_INCREMENT fields.

The problem I was faced with was how to use this feature within JBoss. I found mention of it on the forums, but no concrete examples. Using these hints, some Sun documentation, and the power of Open Source (which allowed me to look into JBoss to see how it expected to be used), I got it working for a simple User Entity EJB.

Before we start, you’ll need the right versions of some software:

  • JBoss 3.2.0beta2 or CVS head (or newer) – this is a bleeding-edge addition to the JBoss engine, so you’ll need the bleeding edge JBoss version. You can get it from their files page at SourceForge.

  • MySQL Connector/J 3 (or newer) – as of this writing, this is the beta version of the driver, but is the only one that implements the getGeneratedKeys() method that JBoss wants.

In the example below, consider a simple User entity bean. It contains a username, password, and some name information. Even though I was going to have unique usernames, I didn’t want to use a CHAR field as an primary key; the performance gain of an integer primary key field is to great to ignore (epecially as a foreign key). The column in my database is named “id”, and I wanted an “id” field in my bean, too.

Writing Your Bean

First, while authoring your bean, you’ll want to pay attention to the specification as it relates to unknown keys. I found a page in their tutorial which mentions 3 key things that need to be done. Generally speaking, you must use java.lang.Object in your code whereever the primary key is mentioned. Specifically, all of your ejbCreate() methods of the bean implementation should return one, and findByPrimaryKey() should take one as an argument.

Secondly comes the deployment descriptor. Again, as in your code, your primary key class will be a java.lang.Object. Here is some of my ejb-jar.xml:

``` User Core user bean, CMP edition com.kylev.little.UserHomeRemote com.kylev.little.UserRemote com.kylev.little.UserBean Container java.lang.Object False 2.x User username password firstName lastName ... ```

(I left out some parts since I have a query that might confuse the example).

It is worth pointing out that I haven’t omitted things about the primary key or an “id” cmp-field. Those are actually left unspecified on purpose. With no <primkey-field> specified, it falls through to the CMP behaviour which we specified above. In this case, you end up with a field named “id”, in column named “id” of type Integer, populated via an entity-command that knows how to get the value from the backend database.

Configuring CMP

At this point you have a working bean. However, it probably won’t deploy; JBoss will probably complain about the lack of a primary key field. To avoid this problem you need to configure the JBoss CMP Container. This is done via the jbosscmp-jdbc.xml file.

In our case case, we want to have an “id” auto_increment column in the table for my the User. You have to tell CMP about this thusly (the important part is the <unknown-pk>):

``` java:/LittleDS false false java.lang.Integer id id INTEGER INT(11) ```

I’ve done this in a <defaults> section, making this unknown key behaviour applicable to all such entity beans in this application. According to the DTD, you could specify <entity> elements here if you want to, overriding this default behaviour. That local definition should override the larger defaults.

It is critical to note that my file has the current DTD at the top of it: <!DOCTYPE jbosscmp-jdbc PUBLIC "-//JBoss//DTD JBOSSCMP-JDBC 3.2//EN" "">. Without this, JBoss may default to some older DTD version and fail to verify your XML because some of the tags used are new.

Beyond the type definitions, the most important element here is the <entity-command> I used: it tells CMP what plugin to use when creating one of these Entities (this command is defined to reference a plugin in standardjbosscmp-jdbc.xml). Unless you override the JBoss default behaviour (as specified in standardjbosscmp-jdbc.xml in your conf directory), this entity command will use the org.jboss.ejb.plugins.cmp.jdbc.mysql.JDBCMySQLCreateCommand plugin to create entities. Therein lies the MySQL-specific special-sauce that uses the Connector/J getGeneratedKeys() to magically populate your unknown primary key!

This should be enough to get you started. To take this further, you’ll want to check out the other entity commands available to your in standardjbosscmp-jdbc.xml (in conf/), and the DTD for configuring CMP (included as docs/dtd/jbosscmp-jdbc_3_0.dtd in the JBoss distribution).


Crap. Some guy found one of my especially-awful old pictures (taken because it was funny) and decided to use it as fodder for a marginally funny web page that makes me look like some sort of freak. Ok, maybe it is the picture that makes me look like some sort of freak. But it’s my job to mock myself, not his! I’m under the label “Broadi”; that’s what my hair looked like after 2 hours in a convertible.

Fortunately, he was dumb enough to just point to the image on my server. Thanks to the miracles of SetEnvIf, I plan to replace the picture with something embarassing. For him, not me.

Microsoft: Doing Everything But

This essay was originally authored in September of 2000.

Microsoft (or in the lexicon of many dissidents: Micro$oft) has been a computing power for years. They, under the leadership of their founder Bill Gates, may probably be attributed with the emergence of the PC as a home staple. Using commodity components, Intel processors, and Microsoft software usability has grown by leaps and bounds. Today we are seeing the advent of the under-$1000 computer. As a computing community, we do have a lot to owe to Microsoft.

However, it’s my opinion that Microsoft has not kept up with the rest of the computing community. Although their operating systems and applications have made computers easier to use in many cases, innovation has all but stopped, and the technology has failed to evolve along the paths it ought to.

Another of the most important technologies today is the telephone. Almost every day we use telephones to communicate with each other; we depend on it to spread news, enjoy friendships, and do business. We have come to transparently expect it to work: every time we pick up the phone, we expect to hear a dial tone. In similar ways we have come to take electric power, gasoline engines, and television broadcasts for granted. They simply work.

Similarly, much of computing is expected to “just work”, and it should be. There is very little about computers that are different than the above mentioned technologies. Indeed, computing is more complex, but the theory surrounding it is sufficient to make it work. And in practice, much of it does. Modern Unix operating systems and programs have progressed to the point of staggering reliability, capable of consistent performance over periods measured in years.

This is not the case with Microsoft.

Microsoft software, in my experience, is horribly unreliable. I spent almost two years administering a network using Microsoft NT Workstation and Server, their premier, industrial strength OS’s. Over the course of that time, I had to rebuild a number of systems after they mysteriously failed, both servers and workstations. My days were filled with seemingly random BSOD’s (“Blue Screen of Death”, a term coming from the white on blue text screen that Microsoft operating systems display when they crash) which interrupted my work, and halted the productivity of my company.

This was not my experience in the 3 preceding years dealing with a network that utilized both Novell Netware and several flavors of Unix (Solaris, AIX, SCO, and Linux). Systems stayed up for months or years on end, only being restarted after upgrades or patches (which increased even more the likelihood that a system would stay up longer). Thanks to the reliability of these systems, my job as a system administrator was to improve the functionality and services available to users: to help them do their jobs better. With NT, I spent much of my time “babysitting” systems and “putting out fires”. I could not be a “good” sysadmin with NT.

I am not the only one dealing with this. A friend of mine who is a respected consultant did some worth for a large corporation as they prepared to launch their Internet store-front. Having chosen NT found that they had to change to scope of their machine room attendant’s job to a full time, 24 hours post. This was necessary to have a person available at all times to reboot parts of their server farm as it failed. The truly sad part of this is that they accepted it: they didn’t see it as a problem that their server operating system was failing on such a regular basis! Would we accept such shoddy performance from our telephones, a 5050 chance of getting a dial tone? I think not.

Today, after the release of Windows 2000, I can honestly say that Microsoft has not adequately attacked their reliability problems. Windows 2000 suffers from just as many reliability problems as NT4. I don’t have room or time to fully expose the breadth of my experiences here, but please believe me when I say they are vast.

After looking simply at the reliability aspect of computing, can we really say that Microsoft has kept up? I have to say, “No”. Programs much older than those from Microsoft prove to be far more reliable and usable. If we allow current trends to continue, we will have to lower our expectations even further to deal with the pains of software that has not kept up. As our society becomes more and more reliant on computing, as we have become reliant on telephones and electricity, we must demand greater reliability. I believe that we can have that level of reliability from places other than Microsoft.


Here are some essays. Most of them are really old since I really don’t do this much anymore.

Mind Fuck

This essay was originally authored in October of 2001.

I have a friend, a person with whom I’ve had a relationship in the past, who is a medical student. She knows me about as well as anyone can. In her semi-doctor-ness she has diagnosed me as depressed. I do have to admit that in reading descriptions of adult-onset depression, you could pretty much replace “the patient” with “Kyle” and call it a biography of my last few years of life.

The “problem”: the failure to enjoy activities that everyone else calls fun. The hyper-critical self evaluations. The inability to recall a time I would call myself “happy”. The way that happiness slips away the second a happiness-creating input is removed (I got no after-glow).

The “answer”: pop the right pills and fix your brain chemistry. Fortunately any GP/MD can perscribe Prozac or other serotonin reuptake inhibitors. Just waltz in, say you’re feeling down, and they point you to the gumball/Prozac machine in the corner without hesitation or psychological evaluation.

The initial diagnonsis itself, being done by (for lack of a better term) an “ex”, creates conflict in my head. I’m not sure how to take a diagnosis from someone who still loves me and is convinced that we could be together if I just twiddle my bio-chemical dials. Maybe I’m bummed because my life does suck, and I push her away because I resent having my mind played with. Is it worth my time to find out if I really am depressed? But maybe she’s right. Maybe a chemical imblance is what kept me from being comfortable and happy with her.

Maybe I’m supposed to be a sad/serious person! Socrates changed the world, though most historians think he was depressed and/or mad. Is this the way God made me to be?

Furthermore, should I go and muck with my brain with FDA-approved substances? Isn’t this similar set of mind-bending properties why LSD and marijuana are illegal? If I get my “fix” from a translucent brown bottle with a child-safety cap, am I any less an addict than the escapist numbing herself and drifting away in a heroin haze?

How must I decide what is the acceptable set of parameters to tweak in my head? American society has chosen to accept that replacing sadness with sourceless happiness is acceptable. Seeing dancing pink elephants is not acceptable. What if I like pink elephants (dancing or otherwise)? Would it be better to chemically fabricate a source of happiness, or should just directly fabricate happiness? Ought I binge-drink with Mickey Mouse, or take Prozac?

With as little as we know about the human mind and how it works, I’m reluctant to become a part of this American mind-fuck. “Coping” used to be a popular thing. It seems that the availabilty of a fancy molecule that side-steps the need to “deal with it” is favored by most. To me, a direct ethical question first needs to be answered about which is the right way to handle what life throws at us.

These are the seemingly unanswerable questions which steal my sleep.

WP and Amazon

I’ve decided to make the world a better place by putting out a quick little hack of a plugin for WordPress to take care of linking to ASIN numbers on Amazon for you. It’s really just a thing to handle the fact that I had a similar hack back when I was on MT. I didn’t want to go find all the occurrences of it in my post archive.

I’m also happy to note that a patch of mine made it into the SVN repository although I was not given credit by name. Hrm. That always bugs me.

WP ASIN Link Plugin

Here is my first WordPress plugin. It is a simple filter that looks for the string “asin:” followed by something that looks like an Amazon ASIN number. It replaces that string with a valid URL to that item on Amazon. It also adds a page to the Options menu that allows you to specify an associates ID if you have one. This makes it easy to link to items of interest, and get credit for it.

Download ASIN Link plugin. You will need to rename it with a .php extension.


Man, my hands are swollen again today. It’s one of those strange things that happens with some regularity and I think it relates to my workouts. I had a nice, hefty workout on my back and biceps last night. Everything involved in working on my back involves gripping something and pulling (as opposed to chest, where the weight can effectively just rest on your hands as you push). Now, this morning, my favorite little silver ring doesn’t fit.

Oh well, I jammed it on far enough to stick (and far enough that I can’t get it off). Give it a couple hours and it’ll settle into place.

Big Sets for Python

I’ve found that it is often very useful to store enourmous sets, often for IP address or cached sets of database primary keys (to avoid endless “SELECT count(*) FROM table WHERE primary_key=?” queries). However, doing this with python types is, well, evil. It gets really large, really fast due to the way python types are stored. So, I wrote an extension in C++ and pyrex to do this fast and in a space efficient manner.

This is pre-release, beta quality code, use with caution.

Download big_sets-0.3.tar.gz.

Sacrifice to the cooking gods

Well, I finally made a sacrifice to the cooking gods tonight. mitchn and I have decided to cook for ourselves lately in hopes of imroving our health, dropping a few unwanted pounds, and having some fun. Well, I was having fun right up until the point where I got a little ahead of myself during onion-chopping. Blammo, sharp knife almost a 14” into my thumb and nail. D’oh! I guess that is some sort of rite of passage. I’ve shed some virgin cook’s blood.

The beef stroganoff still turned out to be a darn good (if a little plain) meal.


Please do not contact me regarding jobs. I am very much happily employed and will not be leaving my company unless you show up with a real truckload of money. My resume is available on Google Docs.


KIPCalc is an IP address, network, and netmask calculator. I tried a little KDE programming, and this seemed like a fun project. There is a tarball of v0.6 and an obligatory screenshot:

KIPCalc screenshot

New CMS, ahoy

So, I’ve switched to the WordPress blog/CMS system. There was just something about MT that drove me nuts. So far, I like that I can everything I want in one place (both regular pages and blog-ness). It is a little awkward, but at least I can easily hack it.

Code and Geekery

Since I’m a geek, I thought I’d share some stuff that I have built or worked on. I also keep my resume here.


Oops. Looks like Cyan caught me screwing around in the office red-handed. Or at least “pink-biked.” Suffice to say, that Princess bike was not designed for my 6’4” frame.

You gotta fight … for your right … to photograph?

After reading this account of police imporpriety in the SF muni system (via BoingBoing) I gotta say I’m proud of a few citizens in our country. This guy handled himself well, didn’t give in to fear mongering, and made a clear statement to the world via his open letters and journal entry. I’m a big fan of security but I also believe in our rights. I’d rather have my rights, especially when they’re being threatened by the enforcement of dubious or non-existant laws that don’t actually gain us any safety.

More spending

Well, it’s official: XM is costing me more money. The fact that it costs about $10/month is fine with me. But the side effect I had hoped for is actually happening: I’m finding new music that I like, and am buying it. A healthy Amazon order went out last night to add some new music (like Death from Above 1979 and Breaking Laces) to my collection. Heck I even ordered a CD from one of my favorite comedians thanks to the XM comedy station reminding me of how truly funny he is.

Now I can truly say that my music collection isn’t stagnant. And I’m finding music without having to deal with stupid annoying commericals.

Also, I did have the joy of cruising down 101 last week with all the windows down, sunroof open, and the Eurythmics “Sweet Dreams” blasting off the 80’s station. Now that is a euphoric moment!

The children are our future, and we’re boned

News flash: students are morons and don’t understand basic freedom. Now, I hated history and civics type classes just as much as the next kid, but I paid a little bit of attention. I know I get to own a gun, say what I want, etc. But 13 of kids thought that the 1st ammendment goes too far in guaranteeing free speech? Come on. In the post 911 (lordy, I wish we could come up with another name for that) it is essential that we know our rights and cling to them. There are people out there that are hoping we’ll give up rights for security. It’s not worth it.

Those who desire to give up freedom in order to gain security, will not have, nor do they deserve, either one. -- Benjamin Franklin

To Steam:

Yesterday I wasted a bunch of my day trying to play Half-Life 2. However, the Steam network client wouldn’t connect. I couldn’t authenticate, thus my software sat there on my machine. Locked. Waiting. Unusable. I spent hours in support FAQ’s and trying to traverse the non-sensical horror that is their public forums. I submitted a support request which they promised to answer the next business day. Awesome, that comes after the weekend. You know, those two consecutive days where I have “free time” to play “games”?

Two key things bother me enough to mention:

  • I find the lack of fallback functionality in the Steam client to be a major design flaw. Shouldn’t the fact that I’ve authed into the network in the last month be enough to prove I own it? They must balance the needs of the consumer (and simple fairness) with their need to protect your IP. Draconian policies like this are difficult to enforce, and only serve to alienate people when enforcement takes precedence over enjoyment.

  • The lack of communication with the community was detestable. I think much of Steam is a good thing. But when it breaks, it is very bad. I spent hours reconfiguring my computer (changing myriad firewall settings, patching the OS) in attempt to make it work. They have both a “News” and “Status” page, and failed use them! Had I been informed that there was a server-side problem that you were working on, I would have done something else with my day. Instead, needlessly wasted my time on something I couldn’t fix.

Thowin’ up the horns

As much as I respect (and to a degree, observe) Christian tradition, it’s great to see it being mocked. The ability to laugh at that you hold precious is to me a sign that you are secure about it. So, I’d like to point out that the introduction of Metal Jesus (along with an early appearance and his latest cameo) is a thing of beauty. Kudos, fellas.

Granted, I really don’t think anything is funnier than Claw Shrimp.

Also, go Gabe! He’s a fellow former-Spokanite and his artwork keeps getting better over the years.

Hooray for Sage

Hooray for the existance of the very cool Sage RSS reader for Mozilla/Firefox, the best browser platform in the universe. Finally I can read all my news in brief and then click through to the stories all in one stable, open platform. I had been using SharpReader, based on evil-IE, but I’m happy to say that Sage takes its place. Now I don’t need IE for really anything at all.

Flapping in the wind

Today I rode my motorcycle into work (after some prompting from mitchn). It’s pretty fun to be able to do that in January. Beyond that, I also learned that my current beard (born partially of boredom and standard winter-geekdom) is long enough to catch the wind rushing beneath my helmet and flap around. I’m officially hairy!

All in order

I swear I have rare moments of clarity. I was really happy when I finally realized how a non-recursive in-order binary tree traversal would work. It’s a piece of CS trivia that I continually forget. I’m also pleased to realize how easy it is to write in python as an iterator class. 16 lines, with comments and some white space.

class _OrderIterator:
    """An in-order traversal iterator."""
    def __init__(self, head):
        self._stack = [head]

    def next(self):
        cur = self._stack.pop()
        while cur:
            cur = cur.left

        if not len(self._stack):
            raise StopIteration
        cur = self._stack.pop()

        return cur.value

Now that you see it, isn’t it just freaking obvious?!


Well, I got XM installed in my car today. I was finally getting sick of Bay Area radio. It’s mostly crap. Next to junk. Adjacent to stuff in Spanish with accordians. Now I have lots of radio without commercials! I’m to the point where my music collection is static because I’m not hearing enough new stuff, and I’ve almost over-listened to all I already own.

And, man, do I have to give props to the studs at Monney that did the install. “Chris” is about the least talkative SOB I’ve ever met. He answers everything as shortly as possible and quashes chit-chat with lightning precision. He listened to every (relevant) word I said, scheduled me, and delivered a killer install. It was creepy. If only all people in retail realized when a customer already knows what they want. I did, he delivered it. Bam!

Bad hearing

Just now I was heading over to the other side of the building to hit the restroom and one of our recruiters was going in the same direction, about 4 steps behind me. As I opened the secure door between halves of our office he inexplicably muttered “Gracias, Mua’dib”.

Immediately my brain went into overdrive. I got the Dune reference right away; that was easy. But why throw in the Spanish? Was there some parody floating around that he was quoting? Was he just being goofy because I share a first name with the guy who played the Quizat Haderach in the first movie adaptation of the book? What the hell? I hate it when I miss a reference!

Well, it was simpler than that. Not long ago our company suffered the common occurence of an unauthorized person wandering around the cube farm during business hours. It generally really freaks people out. They might be a common crook looking for a laptop to bolt with, or a sexual preditor following a girl from our company. It can be horrifying. So, once the incident is over, humor plays an important role in returning the office culture to normal. People deny their coworkers entrance claiming to have never seen them before. People ask their boss, “Hey, do you work here?” The most common joke is to demand proof of employment.

Glenn had mumbled, and I had mis-heard, “Got some ID?”. I’m a colossal dork.


I find the recent revelations about EA’s labor pracitices to be utterly horrifying while at the same time making me say, “Duh!” This is how the software industry was and is built. Geeks have special tendancies that make them (1) geeks and (2) highly exploitable. Give a software geek a hard question and he won’t sleep until he’s solved it. Give an art geek a curious vision and she will eschew human contact until she has drawn it in excruciating detail.

This is what a geek is, people! A geek is a person with a borderline unhealthy obsession with a particular topic. It only takes a marginally intelligent manager to see the benefits of filling a cube farm with such creatures. Let them wear jeans, bring in shitty pizza once a week and watch your empire grow.

This is really one of those places where capitalism falls down. When you hire an exempt employee a battle begins. On one side is basic human decency, on the other is your own desire for fame, fortune and advancement. Should you be a “people manager” and send your strung-out programmer home because he lacks the sense to know when to call it a day? Or should you grab the productivity gain opportunity and promise more in less time to your Corporate Evil Overlord?

I think it’s fairly apparent what should happen, and what does. It will likely continue, too, now that the threat of outsourcing looms over the increasingly anemic technical job market. Witness the most highly educated slave-class in history!

No confidence

We’re all supposed to be excited that we get all our HR benefits on-line now. That we have the convenience of doing our elections or allocating our 401k’s via a web interface. I can’t completely complain. It beats the hell out of dealing with multiple forms, finding the right person to hand them to, and waiting much longer than should be needed. But, wow. Without exception the benefits and 401k sites that I’ve experienced are the most frightening sites I’ve ever encountered. They are ages behind in design and layout with an almost indecipherable navigation system. They break. They throw errors. Heck, they even require me to type in my SSN to identify myself (isn’t that illegal now?!).

Case in point: my current employer (which otherwise rules) has a new contract broker organizing our benefits. You can’t complete your elections if you are using Mozilla, Firefox, or IE under Windows XP SP2. If you’re a geek, you probably already guessed the reason: their site uses unrequested popup windows. Yeah, popups. You know those things for which there are dozens of programs designed to stop them because the whole entire universe hates them? Apparently these people didn’t notice this trend. What kind of mickey mouse people do they have building these sites? I’m supposed to trust them? Eek.

Good weekend

Man, I had a heck of a weekend. I’m still trying to get my head around it. It involved everything I could imagine that could be packed into a weekend, done along side my two best friends. There was drinking, football, drinking, food, dancing, drinking, and even some nudity. Did I mention the drinking? I guess it is sort of justified due to the occasion for the GR visit (I’m not putting those details here, if you don’t know, it isn’t relevant to you).

But with all the partying and running around, the most amazing moment had to be on Sunday night. We’d met tdeb at Founder’s for a beer and were heading back to Kirk’s place in the bitchin’ PT Cruiser I’d rented (not by choice). We pretty much all freaked out looking up into the sky and saw the Nothern Lights going crazy. It was insane. We ended up standing outside in 34-degree weather staring into the sky until our necks were sore and hands numb. What an amazing thing to witness.

Heck of a weekend.

Go Jon!

I gotta say that this is really damn cool. I copied this off of the for posterity. Do you think that mainstream news is losing credibility? Oh, hell yeah. At least with Jon Stewart you know when he’s lying because he does it in a funny voice.

Update: my friend Mike pointed out the followup question today which also makes me laugh.

Getting older

I’m now just a bit older in year-resolution, but only if you’re rounding down. If you’re rounding normally, I’ve been 30 since mid-April.

Fun with python properties

I ran into an oddity of something I wanted to do with python properties while playing with my music server the yesterday. After a little futzing, I found a way around my problem. Read on to find out how to do python properties and inheritance. Assume we have two classes. The first, Base, provides property-style access to some attributes. Straightforward get and set. The Derived class wants the same thing, but wants to change the default “unset” value for property foo.

In the absence of property (dot-style) access, it would just be a matter of overriding getFoo(). To make property access work right, we must get a little bit clever.

At first it seems simple. Just point the arguments to property() to the get and set functions and be done with this. Seems obvious:

class Base(object):
    def __init__(self): = None

    def getFoo(self):
        return self.__foo

    def setFoo(self, val):
        self.__foo = val
    # Seemingly obvious solution:
    # foo = property(fget=getFoo, fset=setFoo)
    # Actual solution:
    foo = property(fget=lambda self: self.getFoo(),
                   fset=lambda self, v: self.setFoo(v)

class Derived(Base):
    def getFoo(self):
        """Same as in Base, but default to 0 instead of None."""
        result = super(Derived, self).getFoo()
        if result != None:
            return result
            return 0

if __name__ == "__main__":
    t1 = Base()
    print = "Something"

    t2 = Derived()
    print = "bar"

I was pretty impressed with myself for figuring this out. So I’m putting it on my site to pat myself on the back. Turns out, after my initial bitching, that python is actually pretty cool.

Shark attack!

I’m out in Salinas this morning helping my girlfriend with a garage sale. The whole block decided to have one today, so the traffic is massive. The population here is dominated by migrant agriculture workers, so a garage sale is a great way to stretch one’s wage. But what I saw this morning was completely unexpected. I can only describe it as a feeding frenzy. The moment we opened the door, a dozen heads on surrounding lawns turned our way. In most cases, we were unable to get the stuff out and even set it down. I left the house with a dowel containing about 20 pairs of pants, intending to hang it between two bar chairs for display. I never made it. The dowel was litterally stripped bare in the first 12 feet I traveled beyond the front door. Frugal mothers grabbed wads of clothing out of my hands, ran to corners and horded over them like Smegal, defending their take as they sifted through hoping for a gem: that elusive good buy.

In the first 45 minutes, we were worn out. The big ticket items were gone. Clothes were strewn across the lawn and hangers stripped bare. Then the apparent hive mind shifted. They knew we were done for. The lawn became vacant, and only a few carrion eaters are picking through the meager selection of flip-flops and t-shirts (as well as something Liz keeps in insisting is a “fertility icon”).

Whew. That was freaky.

Swaggart, you’re cut

I generally stay away from controversy, but this is too much. Check out what Jimmy Swaggart, upstanding citizen, said from the pulpit:

I'm trying to find the correct name for it ... this utter absolute, asinine, idiotic stupidity of men marrying men. ... I've never seen a man in my life I wanted to marry. And I'm gonna be blunt and plain; if one ever looks at me like that, I'm gonna kill him and tell God he died.

I have my own share of difficulties with my faith, but this is crazy. It’s hate speech. Not a boo-boo, not a poor choice of words: hate speech. It’s so clearly hate speech that a station that aired the show is under investigation for violation of hate-related broadcast laws. Know what’s worse? People laughed and/or cheered. Cheered! At the suggestion that someone be killed!

It’s time for this guy to step down. I’m just so flustered by the black-eye he puts on Christianity that I don’t know what to say. At the very least, he should go study at the feet of Tammy Faye to learn a thing or two about love. Apologize all you want but you’re still a jerk. You’ve missed a fundamental aspect of your faith, not to mention basic human civility.


Ok, if you’re going to make a Linux distribution and you’re Polish, and you want it to be “for Poles and by Poles”, try not to come up with a logo that looks like a penis.

Moron alert!

I really hope the new Navistar truck sells like gangbusters, I really do. With the ubiquity of the H2 it was getting hard to tell who the really stupid, trend following sheep on the road were. It will once again be clear!

Moron alert

According to this article Gabe Newell is a moron. Yup, the same guy who’s computer was compromised (IIRC) and allowed the Half Life 2 source code to be stolen got his forum password guessed. How? Because it was set to “gaben”. If I was on Valve’s board, I’d convene a meeting and vote him out. Someone who chooses “gaben” as a password shouldn’t be running a company.

There is no patch for human stupidity.

Poor Lamar

I just saw Lamar Odom on SportsCenter say that there were “Americans that didn’t want America to win.” When asked why that might be, he didn’t know. Maybe it’s because many of us can’t watch the NBA anymore. Maybe we don’t want to watch tattooed idiot taunt each other. Maybe the 24 second shot-clock has turned it into a repetitious run-n-chuck game. Maybe we don’t want watch for two hours to find out who gets the last shot to win the game.

And maybe we just simply wanted you to fall flat. To be humbled. To be taken down a peg. On your stage, your swagger may be justified. But it’s time to realize, just like in every other sport in the Olympics, that the US doesn’t dominate. It’s a contest for a reason. Show up, play hard. Play as a team.

Don’t tap your chest and insist that you “gots to represent.” Look at the colors on your chest, and remember who you represent. You certainly haven’t represented me as an American.

Shudder to think

Every once in a while I shudder to think that someone I used to work with (and who wasn’t very good) may now be coding on software I actually need to use. I’m no amazing super-engineer, but there are some really bad ones out there that manage to get jobs.


I’m on vacation in Seattle, hanging out with friends. I really have to remember how enjoyable it is so I do it more often than I have historically. Getting away really is good for me.

Why in the world would I forget such things?

Also of interest, I managed to easily find the magic shop I remember seeing as a pre-teen (nearly 20 years ago) in Pike Place Market. I sometimes wonder why I remember such things. Now I have foam balls to entertain my niece with if I ever remember to go visit her again (and already managed to puzzle our hosts after 20 minutes of practice).

The “Go” pedal

I have a new (to me) car. Yes, I’m one of those jerks in a BMW coupe now; deal with it. It’s no monster race car (under 200 horsies), nor do I drive it as if it is. However, it is a spirited little beast that handles well and can be a real joy to drive if you know how. However, power and skill mean nothing without open road.

After a week, I have yet to get a clear shot onto the highway coming from my house. It’s a wide open on-ramp with a fun starting turn and long straight section to drift into. It’s a place where I could legally pound through a corner under hard acceleration while getting right up to highway speed (which most days is about 75 MPH on the “280 Motor Speedway”).

Instead, I start the corner, see a cell-phone-using moron in an SUV or inattentive Jetta driver putting on makeup halfway along the ramp, and have to let up. Then I get to enjoy the horror of merging with traffic using a prayerful blinker and 45 MPH of speed, snapping my head around and frantically checking my mirrors, just like the idiot in front of me. Sigh. If only more people realized that an “on ramp” is for making a graceful transition from surface street speeds to highway speeds. On the ramp. Not before. Not after.

Alternately, you can all just stay the heck off the roads at 9:00 AM next Wednesday so I can do it the right way. Alone. Just once.

The Watchmen

I’ve been recently getting back into comics. Yeah, I know. Geeky. But one that I read recently at the recommendation of [a friend was The Watchmen. It’s fantastically good. And if you read it, or maybe if you haven’t, you will laugh until you cry while reading the treatement the Something awful goons give to it.

Just my luck

I’m finally taking a vacation (with my girlfriend, no less) to Seattle. I’ve been wanting to visit there for ages, specifically to see a Mariner’s game. I get to see them when they’re in town playing the A’s, but it’s not the same. It’s my first chance to go to Safeco Park. And what happened today? Ichiro got beaned in the head by a rookie pitcher. I hope he’s back in the lineup for Monday’s game.

Regardless, I think I’ll bring along Ball Four to re-read, just to be sure I’m fully in the baseball mood.

Big gap

It’s been far to long since my last update. I’ve not done a whole lot of interest, but I do have to say that I’ve spent far too much time listening to my favorite Weakerthans album which was in slot number one of my bedroom CD changer. The first three tracks are burned into my brain.

Oh yeah, and I became a shill for Amazon. Click. Buy. Make me money!

Wisdom and doubt

Here’s a Bertrand Russell quote for you today:

The whole problem with the world is that fools and fanatics are always so certain of themselves, and wiser people so full of doubts.

It’s kind of an analog to the “The more I know the more I realize how much I have to learn” saying. If you’re completely sure of your position or knowledge about something, you’re likely to be completely wrong and end up looking like a fool. The universe seems to revel in irony, and will eventually teach you a harsh lesson.


I’m writing a lot of python these days. However, when typing the word “python” at the command line or in an editor more than half the time I type “pythong”. Distracted? Maybe.

In the stocks

eWeek has started publishing a Top 10 Spammers List based on data collected by IronPort’s SenderBase product (more camel-case!). I enjoy it because it’s sort of a combination of pie-in-the-face and putting the dumb criminals in stocks in the town center. Everone can see the evil-doers and chuck tomatoes at them.

It’s also extra-hilarious that they try to do the fully Casey Kasem intro to it each week. “Our big mover this week, up 15 spots to number 9…” Soon you’ll be able to call in a special spam dedication.

My favorite browser

Version 0.9 of my favorite browser, Mozilla Firefox, has been released. Hooray for that! It’s really amazing to me that some truly moronic companies have stopped developing browsers almost completely, even after making considerable investments a few years ago to crush competitors. Now, even though the browser is the average Joe’s only portal to the Internet, MSIE is rapidly falling behind. If you want to use a fast browser that displays the web like it is supposed to, and doesn’t expose you to weekly security bugs, get Firefox.

Packet loss made funny

Just overheard over my cubicle wall:

"Crap. 70% packet loss to Rackspace." "What do you mean?" "You know those packet thingies we rely on? 70% of them aren't getting to Rackspace."

It doesn’t look like Tom’s day is going to go too well, but at least he has a sense of humor about it. That is why I like working here. Also, nobody here is insanely dork-tastic.

Low-tech high-tech

I’ve joined the GUI group at work to help them hit some deadlines. I’m already having fun and cranking out a little code using a cool web framework and a language that I’m still not all that familiar with. It’s a bit of an adventure. The cool thing about the group is that they have solved the documentation problem in cross-platform development. No longer does anyone need to drop piles of money on crappy software just so you can connect two boxes with an arrow. In fact, you don’t need to “learn” any new software at all. You go out, you buy a $200 4-megapixel camera, and you take pictures of the whiteboards you used to draw the flow diagrams in the first place.

JPEG’s are cross-platform, intuitive, lightweight and uber-cheap (especially next to the $500 Viso licenses). Plus, they have the added benefit of making your new team-members laugh out loud at the pure elegance of the solution the first time they see one.


Today’s frivilous lawsuit is brought to you by a moronic student from the University of Kent who pagiarized his papers and eventually got caught. His absurd argument goes like this: “I’ve been plagiarizing my papers for my whole time here. I should have been caught earlier and told it was a problem. But since they didn’t, they shouldn’t just send me away from school this close to graduation.” Amazing.

I wonder if serial killers use this same logic? Clearly, the more you get away with something, the less you should be penalized when you finally get caught.

By no means am I equating stealing academic papers and murder. But come on! You’re an English student! Your entire major is some combination of reading and writing. Do you think it’s fair that you should get a degree when you’ve admitted to only doing half the work? And don’t fake it: you knew it was wrong to plagiarize. Nobody has to explain this, although I’m sure they did repeatedly (all my profs did in every class). Suck it up, kid: you did wrong and there is a cost.

Wise words

I just read this passage from Bjorn Lomborg’s The Skeptical Environmentalist:

Legend has it that when someone remarked to Voltaire, "life is hard," he retorted, "compared to what?"

Nice. Deep, and funny.

Little Hooters

Thank God for people like this who put out a little effort and fix insanely stupid things in their communities. Did it take a giant government and more non-sensical laws that steal our freedoms? No. It just took an upset parent and a couple of phone calls to reign in this stupidity. Kudos for watching out for your own.


Clever people may now refer to Starbuck’s as “*$” in instant messenger, email and chat communications. This message was brought to you by the letter “S” and the number “f”.

Stop wasting my time

Dear No-Talent-Ass-Clowns:

Please stop applying for jobs at my company. We are good at interviewing. If you put JDBC on your resume, but haven’t ever used PreparedStatement, we’re bound to notice. If you have Oracle listed in your skillset, please be familiar with SELECT statements at a bare minimum. The ability to mention the concept of a JOIN in describing the retrieval of data from multiple tables is a real plus. Also note that being skilled with J2EE and Servlet technologies should include having used HttpSession once or twice. And when I give you a very simple method signature to fill out, don’t try to talk your way out of it. I’m interviewing you to write code, so I don’t think asking knock out a few trivial lines on the whiteboard is out of line.

Oh, and your rock called. It would like you to come home and climb back under it as soon as you can. And pick up some milk on the way.

Thank you, don’t come again.

Pat on the head

In today’s litigious America, it’s good to see judges being recognized for acting as gatekeepers on the legal system. Since so many people seem to lack common sense and will sue over anything, we really need men and women on the bench that will tell these people to take a hike and stop wasting taxpayer money. Kudos!

Perl is cool

Let’s say you work for a company that deals in email and need to look through giant mbox-format files for things. This might be hard, but with a very short perl script, you can make it easy…

#!/usr/bin/perl -w
# mboxgrep pattern file [file...]

my $pattern = shift;

my @message = ();
while (<>) {
    # Look for mbox border
    if (/^From /) {
        # Print message if pattern found
        print @message if (grep(/$pattern/, @message));
        @message = (); # Reset message

    push @message, $_;

See! In very few lines you have a program that works like grep but works on a per-message basis. Redirect the output to a file, and you have a valid, new mbox containing messages that matched the pattern.

It’s official

Just so you all know:

-!- cyantist changed the topic of #deathstick to: kyle rox0rs

Scary as hell

I have two friends who are working for a security company building infrastructure for Iraq, so the new of recent attacks scared the hell out of me. It turned out to not be my friends, but the senselessness of the attacks is boggling. I don’t understand why someone would do this. These are civilians, trying to bring essential secure and reliable communications to a country without it. Why, why, why? It makes no sense.

Putty in my hands

Seriously. It’s torture. Sometimes there are products out there that have “geek” written all over them (even literally). But the availability of silly putty in 5-pound lots is downright cruel.

Dead zone

The log of a woman riding her motorcycle through the Chernobyl disaster area is about the most interesting and disturbing thing I’ve read on the internet in a while. A part of the USSR frozen in time. Pictures of lives interrupted and abandoned taken in recognizably modern cities turned into ghost towns. All in a region that will still silently and mercilously destroy the structure of your body. Amazing.

Indecipherable “news”

What do you get if you combine absurdist comedy with real news? Why, ScrappleFace, of course. As a fan and frequent user of sarcasm, absurdism, and hyperbole I’m happy to see this site exists.

Should I care?

I haven’t decided if the makers of moronic t-shirts should be held responsible for the idiots who wear them. My bro-in-law thinks so. I gotta say, as clothing goes, this is pretty irresponsible.

I am SciFi

Having just finished watching my DVD boxed set of one of the best SciFi TV shows ever made (which was, of course, cancelled after one season), I was pretty pumped to see that a company now actually uses communicator badges (just like Star Trek, which I’m less fond of). It’s really odd to see things from SciFi coming true. It’s a strange age to live in.

I’ll refrain from any comments about the Patriot Act, RFID tags, or any other technologies that might bring to mind 1984; it’s just too creepy.

Kids say the dumbest things

Kids can be amazingly dumb. They’ll even go so far as to search Google for a term like “instant messenger question answerer” instead of asking their actual question. Then they’ll chat-up a 30 year old Canadian geek, and be surprised when he’s a both strange and helpful. Oh, the crazy things kids do!

Welcome to your 15 minutes of internet fame, Stewart. Hope you get lots of interesting fodder for your fantastic blog before the traffic forces you to pick another screen name.

(Oh, mad props to jay-to-tha-izoel for the link, delivered via the ‘stick.)

SPF, please

Alright, computer people (not to be confused with “party people”), it’s time to fix the internet. Or at least part of it. Implement SPF right now on your own domain, and start looking it up when you accept mail. I’m already so sick of getting joe-jobbed, it happens weekly to one of my older domains which I hardly use anymore for mail. I get to spend my mornings deleting bounced mail from random IP addresses of virus-infected machines and open relays.

Why has it taken until now to come up with a reasonable solution for domain forging? I don’t know. Everyone knows that SMTP is horribly broken, but it’s hard to fix something so entrenched.

There’s just no good reason not to at least publish a soft-fail SPF rule. Just do it. Right now. Well, unless a giant, slow-moving registrar is running your DNS, in which case you can’t add a TXT record to your domain. I’m sure they’re having meetings about that and you’ll see it in their web interface within the next 3 years.

Good old days

We were just reminiscing on IRC and someone brought up what has to be among the funniest things to ever happen when I worked in IT. A well-meaning marketing employee slated for a new laptop asked us to copy her files onto it. She claimed to have been faithfully backing up her files every day to floppy (we were amazed). We gladly said we could put her backups on her new laptop. She smiled and produced a single floppy for our use.

It contained a single item named “Shortcut to C:“.

Lost focus

Ok, Microsoft is just silly now. They’ve lost all perspective and are suffering from an RIAA-like obsession with piracy. It used to be that “Help” functions in software sucked: they helped generate a gigantic book industry (“Thank you for buying Office for $400, please enjoy the installation pamphlet we’ve included and hustle on over to the bookstore to drop another $60 on a book if you actually want to use it.”). Fine. Whatever. I’ve learned to accept books as a part of software cost.

But today I asked my Microsoft mail client the question “How do I change meeting reply to tentative?”, because something had changed and I didn’t know if I’d make the meeting. And, yes, I know my grammar was a little off; I typed it quickly. The first “common question” that came up in a reply was, “What should I do if I suspect I have unknowingly purchased illegal Microsoft software product(s)?”

Seriously, screw you guys.

No way

Last night while in the mall I dropped by the clothier/pornographer Abercrombie & Fitch. Are they even serious anymore? Are they now just trying to see how far they can go selling tattered crap before the sheep-like masses notice? Their entire selection of pants were “distressed”, which is to say, “ruined”. Apparently this whole tradition of using “sewing” and “seems” to keep clothing from disintegrating is very “last-week”. Now, if your $60 pants haven’t left you as the proud, naked owner of a pile of khaki colored threads within 15 minutes of putting them on, you must not be cool.

And the shirts? My mom used to dress me up in these same ugly striped knit polos back in the early 80’s, but she had the decency to wash and dry them so they weren’t all wrinkled. In those same fashions, I was a terribly unpopular child. Pardon me if I don’t rush to buy them as an adult.


Here’s another random side effect of quitting smoking: I’ve begun to remember my dreams. I’ve never dreamt before, at least not on a regular basis. Maybe one or two a year. Now, I get about 3 per week that I remember. Maybe I’m better rested or something, and my mind is having more playtime in the wee-hours. Last night’s was especially graphic (and, um, “blue”). It’s almost worth taking smoking back up so I don’t have to remember what random crud my unconscious is pumping out.


What year is it?

Wow. Turkmenistan is banning beards? Haven’t leaders learned anything? Look around! Fully grown adults resent this sort of thing, and will resent the makers of such laws. Want to foster unrest? Be sure to tell your people how to shave. Or dress. Or talk. If people can’t feel in control of the trivial parts of their life, they quickly become cranky. With crap like this, might Turkmenistan be on its way to being the next messy middle-east problem?

Evil mechanism

My chair at work is trying to kill me, but at least it’s doing it in a clever (almost Goldberg-ian) way. If I’m really concentrating I put my feet kind of back instead of out in front of the chair, on my toes. Three times now I’ve rolled forward just a touch while in this position, causing my calf to nudge the piston release, dropping me down suddenly. This also jams the tilt-release onto my heel making the seat pitch fully forward and ramming me into my desk, chest high.

Other than the bruising, the new job is pretty cool.


I’m now approved and certified to belay in two area climbing gyms. Now all I need is a partner for the other end of the rope. Granted, I won’t be doing any climbing until my hands work again. Ow.

Week 1 done

I made it through the first week at my new job and, really, there is nothing to report. I only got lost on the way to the bathroom once, and I don’t think I’ve completely made an ass of myself in any situations. At least I’m finally working for a place where I know what I’m supposed to be doing (after some initial confusion). A project, milestones, specs. Refreshing.

Google snapshot

I was really disappointed to see that Google’s first result for the search “jack the sound barrier bring the noise” is (today) an entry by some guy in the Wesley Clark campaign blog. What a crying shame. One of the greatest phrases in sci-fi literature (from Snow Crash) is associated with politics more than sci-fi.

Where did all the nerds go on the internet? It used to be full of clever manipulations of pi and other geekery, but now it’s corporate, shiney and as homogenized as any other mainstream media. Now you really have to dig to find those gems.

Also note that this means the CDI(Chicks Dig It) factor for the internet has gone to hell. “Pft. A web page? A blog? Everyone has those!” Geeks just ascended from our own primordial ooze (or at least dark basement corners in Math Department buildings), and we’re already slated for removal from the gene pool. We’ll be extinct within a generation.

But then who are you going to call when you can’t figure out how to hook up your DVD player, huh? Suckers.


After last night, I’m officially annoyed at my gym. They decided the way to improve the gym was to mount TV’s all over the place. Yay. Now it’s gone from a “gym” to a “place where I have to walk around clusters of zombies and ask people if they’re done using the machine they’ve decided to convert into a couch while watching ‘Best of UFC’ clips”.

I think the number of people in the gym has gone up lately, too. This is probably partially due to the TV’s as well. I happen to know that I’m a daydreamer, and the gym is a bad place for that. So, I went out and bought a $9 Casio with a stopwatch: when I finish a set, I start it. That way, when my brain inevitably drifts off onto random topics and suddenly snaps back to the Real World™, I can look at my wrist and know if I was flaking for seconds or minutes, and when I ought to start the next set. It doesn’t look like many other people in my gym have such discipline. Add in the TV’s, and you have people in the gym for twice as long, periodically remembering to pick up something heavy, and mostly staring up at TV’s.

And getting in my way.

TV’s don’t belong among freeweights. By the cardio stuff: fine. Cardio is long and often boring. Strength trainging is about focus and paying attention to sets, time, and the response of your body.

Uncontrolled giggling

Ok, so, Tim pointed me to this fantastic site. It has really changed my life… Pffft. No, no seriously. Snort. I mean, this guy has real insight. Did you know that UPC codes are the mark of the devil? It’s right there. Chortle. On the internet! And, I know this is a shocker, but it turns out that Santa is an anagram of Satan! Gasp. This guy meticulously researched that this is true! And, fortunately he also takes on thost blasphemers who postulated about what Jesus might drive.

I know, I shouldn’t make fun of people who are well meaning. It’s cruel. So I’ll stop. Just read the site. I don’t have to do any mocking, he does it himself.

Snowball’s chance

Thanks so much, stupid computerized dating service! According to your personality test, about 1% of single women would be attracted to me. I am now overflowing with hope and will return to my cave.


Again this week I was reminded of how stupid salespeople are. I went into a boutique electronics store to look at projection TV’s and was utterly ignored. I watched men in suits walk in and get pounced on. Apparently, my choice of jeans doesn’t make me look like a serious spender-of-dollars. You’d think that in the Bay Area, of all places, people would realize that the slightly disheveled young guy with quirky (not dirty) clothes probably has a good-paying computer job and loves toys. Treat him well, and he’ll come back again and again. Eventually the “seasoned” sales guys shoo’ed the new guy over to me. Me and Mitch talked to him again the next night and had good discussion of features and tradeoffs.

That young guy moved $11k in TV’s today. A chunk of it came from guys in jeans. Get your head out, old guys. You cannot judge a book by its cover.

Stupid human tricks

Man, every time I accidentally stumble across something pen-spinning related, I get annoyed. I haven’t the fine-control dexterity to be this cool. I also don’t know why I repeatedly run across pen-spinning related things. That’s actually more troubling.

No problem

I keep hearing people whine about how hard it is too keep up with all the new social networks and all their friends. Oh, rough. I really feel for you. How about you stay in every once in a while and leave some friends for me?

It really is odd to see how different my world is from others. I have a very small group of friends that I know well. I look at some of them who have over 100 listed connections and wonder how valuable those connections are. It makes me reflect on what the nature of frienship is. I think my assessment is more serious than “people I’ve met or know”. Only the people who I actually know will I invite into a network, and even some of those I do only cautiously.

I think some people have a bit flipped in their brain by this sort of new vogue web service. Suddenly friends can be quantified, “scored”. And people want to “win”. There’s nothing really wrong with that I guess. It just seems odd to me.


Anyone who tells you that nicotine isn’t addictive should be promptly stabbed in the face. Have them stop on by my house right about now: I’m pretty sure I’d have fun ripping their limbs clean off. The tension in my body is nearly unbearable, even with a patch on. Half of today was spent in conversation with myself. ``You don’t need a cigarette. This is the healthy thing to do. You can make it.”

Last night, I didn’t go to sleep until about 3:30, evening being the time when I used to smoke most frequently. But I got a bunch of good reading done, and my room is nice and clean.

Tonight, I’ll probably have time to keep up with Rob and his copious blogging.


With the approaching of my least-favorite February Hallmark holiday, I’m happy to say that the internet has finally come up with a good way for me to avoid looking like a pathetic, lonely wank. Granted, it’ll only work if she is truly from Canada, but I’m sure that can be arranged or at least faked.

Slightly dizzy

Just as a public service announcement, hopping on the treadmill while wearing a relatively new nicotine patch would be considered a “bad idea”. However, it is a definite rush of my favorite drug.


Sending the non-sensical “How sorry I am feeling” email reply (originally conceived by mjr) shouldn’t make me giggle as much as it does. But sending it to random people who decide to contact me via my website over petty concerns (such as the religious implications of “Hot Buttered Jesus”) is just too hard to resist.

Bonded Sender should work

There are a lot of anti-spam solutions out there, and a bothersome number of outspoken anti-spam zealots. I’m not outspoken, but I do hate spam. I use SpamAssassin to crush much of it, but for me, a huge worry is “false positives”. To me, IronPort’s Bonded Sender program is a good solution to the problem of losing solicited commercial email.

Read on to find out why. Spam, or the more descriptive name “unsolicited commercial email” (UCE) sucks. I’ve been on the Internet for a decade in various forms, and have had some of my email addresses for over 6 years (I was the first guy on my block to have a “vanity domain”). As a participant in OSS, my name is all over the darn place in everything from list archives to CVS commit messages. So, spammers definitely know how to find me. It’s an unavoidable hazard of participating visibly in the internet community.

I also use the internet for all sorts more mundane things. I buy books. I buy music. I buy plane tickets. I even buy food (well, tea). I furiously participate in the commercial side of the internet to make my life cheaper and more convenient. Frankly, I love it. Commerce is the driving force these days behind the internet. Without it, it goes back to a bunch of scientists and warez dorks.

But I have a problem: I love commerce on the internet and hate spam. I use tools to keep spam away, but I really need to get legitimate commercial email about transactions I’m participating in. Losing messages like that may cost me real money. How do I avoid such lossage?

One answer that impresses me is Bonded Sender. I found out of it primarily because my roommate’s girlfriend is part of running it. I looked at it, was initially turned off, and then reconsidered. Why? Well, that’s what I hope to explain.

First of all, Bonded Sender (I’m going to resist the urge to appreviate to “BS”, as that is counterproductive to my argument) isn’t a spam solution. Not at all, and it doesn’t claim to be. It will have absolutely zero effect on the volume of spam you receive. It is a whitelist, and is intended to deal with the email I mentioned above: legitimate/solicited commercial email. This is the stuff you want/need to get: things like professional newsletters, sale notifications, product offerings, and receipts from companies you deal with. I get a couple of newletters from because I have chosen to, and I want to see them so I can keep up on new products. They aren’t spam, although they may superficially appear similar with URLs, “remove” links (that work), and likely a few too many exclamation points thanks to an over-zealous young marketing exec. I want them in my Inbox so I can read them.

So how does Bonded Sender help with this? To state over-simply: audits. They audit the practices of a commercial email sender. They make sure of things like working unsubscription methods, legality of acquired addresses, and adherance to privacy standards. They also investigate complaints and do ongoing checks. In short, they make sure people who are participants of the program are playing fair. Then, via marginally-clever DNS trickery, they let other email servers know. They do the electronic equivalent of saying, “We checked this guy out. He’s alright.”

Like I said, initially I wasn’t impressed. Why would I trust these guys at IronPort? Well, I then realized that this is a completely old and boring model applied to the internet. It’s an effective model that most people are familiar with, understand, and use. The term for it is “trusted third party”. Almost everyone will encounter a trusted third party at some point in their life. A notary is one for official documents. A lawyer is one when she acts as executor of a will. Your buddy is one when he holds the money while you and another friend act out a drunken bet involving hammers. It’s not a new model.

It works because IronPort tells everybody what the rules of engagement are. How they can participate in conversation (including nods to CAN-SPAM and other legistlation). IronPort is essentially impartial because they don’t stand to gain if you successfully communicate. They only stand to lose if you don’t. If their role as a trusted third party isn’t validated, they lose reputation and nobody uses them. Then they don’t make money. Then they close down.

Most will immediately argue that IronPort cannot be trusted. Look at their web page. They sell mail servers for goodness sake! Doesn’t that create a conflict of interest? I have to say “no” for a few reasons. First, I’ve seen that IronPort is for real. My friend has come over at the end of a very hard day, having been yelled at by an IronPort hardware customer who she nixed from the Bonded Sender program for violations. He screamed because he believed buying IronPort servers meant he was more likely to be approved for the program. It doesn’t.

Second, it comes down to economics and community. IronPort is in the thick of the email/spam world. Their properties include SpamCop, an anti-spam solution that has built a lively community around it. It includes Bonded Sender. It includes the server hardware and software. They have to get all these things right to stay in the game because the game is based on trust. If they betray that trust, two of their properties lose all viability. Then they’re just selling mail servers (and hardware isn’t a great place to be). An company that purports to be helping with the spam problem is nothing without “street cred”. They have to prove in every transaction that they are, indeed, that trusted third party. They seem to understand that fact. And they also understand that if their reputation falters, they fail. Then they have to go to their investors and say “We ran a crooked business and lost our reputation and all your money along with it.”

So, IMHO, Bonded Sender is a good idea. It’s built on a proven model and shored up by community and economic/business pressure. If you’re a company who needs to legitimately reach customers, you should check out the program. If you’re an ISP, learn how to use their query tools for just about every MTA out there. Then go back to enjoying the benefits of legitimate commerce on the internet.

Good Gord

I just started browsing The Acts of Gord while cleaning out my inbox. A friend had sent the link to me long ago. Man, I wish I had a job where I could blog about regular people being really stupid. About the only thing that geeks get to do is send amusing, nonsensical responses to misdirected email that we get in the course of our jobs. And we don’t get to see the looks on people’s faces.

Stupid biceps

Ah, the joy of day two after your first workout in too long. The second day is always marked by complete inability to move without pain. The soreness grew all yesterday, and today my biceps refuse to move nicely. And if you want to watch me roll around on the floor in pain, feel free to come up and punch me in a pectoral muscle.

That said, I’m glad to have this pain. It’s familiar. It reminds me I’m alive. And that my physical body is doing something.


Yesterday I finally got my Triumph Daytona back out on the road. It’s been far too long with all the busy-ness and overworking. I had a surreal time whipping through light fog on Skyline (it was like being a cloud) and even took some time to jaw with other riders at Alice’s. I’d forgotten how much fun it was.

I’d also (apparently) forgotten that it takes a specific set of muscles to whip that 430 lbs. beast along the twisties. Now I’m sore!


Again I’m struck by the extreme degree of connectivity I have. I’m amazingly connected, with wireless phones, infinite email addresses, and all manners of connectivity. Yet, I’ve forgotten what my cell phone ring sounds like. I belong to a couple of email lists I’m barely active on just to be sure my mail server works. I will be spending no more money on connectivity or gadgetry (no matter how cool it may be) until I have an actual reason to be connected.

Lazyass == Litigation

Anyone who knows me knows that I hate frivilous litigation. So, from that, you can infer that I think this guy should be beaten with a rubber chicken. Yes, this is exactly what I want my legal system (yes, it’s mine, I help pay for it) spending its time on.

The good ol’ days

I heard a sound clip of Ronald Reagan on the radio this AM as I was getting ready and it really struck me as special. Reading his address after terrorist attacks in Lebanon he shows that he understands better the problem of terrorism than I think the current administration does. But what struck me more was the lack of hero-rhetoric in his statement:

I do not believe, therefore, that the local commanders on the ground, men who have already suffered quite enough, should be punished for not fully comprehending the nature of today's terrorist threat. If there is to be blame, it properly rests here in this Office and with this President. And I accept responsibility for the bad as well as the good.

He knew it was his job to make sure the people around him were doing their jobs. And he knew this represented a failure on his part to recognize, evaluate and mitigate a new kind of risk. That seems like quite a contrast to todays “evildoers” and unilateral near-war-mongering. I can’t say if Bush really needed to do what he did, but he sure doesn’t sound like the humble public servant we heard in Reagan.

Big move

I’m finally giving in and retiring my own old “blog” software. I wrote it before it was even called a “blog”, but there is no reason for me to maintain it anymore. This is my first Movable Type in “Kyle’s Thoughts”. It looks like crap, but that is hopefully temporary.

The old stuff is still around for archival purposes, but won’t be updated anymore.

Happy Holiday

I’m back to work after a nice long holiday. And for the first time in many years, I’d rather be still on holiday. I had such an amazingly good time with my family (including new bro-in-law Steve and uncle Doug for the first time) that I’d rather be back in Spokane with all of them. Usually my work obsession makes me long to be in the office, but not this year. I’m amazed that such a diverse bunch (hotel management, geek, teachers, mathemetician, full-time mom, cop, and construction guy) all fit perfectly. I haven’t had that much fun, easy conversation, and relaxation in years.

Ah nuts!

Seems I’m not going to be famous shiller of nuts. No callback. Fame will have to wait.


It was bound to happen. I’ve been discovered. I really shouldn’t walk around without dark glasses and my collar pulled up. But, I went to get a decaf cup of the steaming nectar of the gods and was approached by Margaret, a casting agent. She said I fit the “intelligent-looking” profile they were looking for; I can only assume she meant to say “unkempt”, “slovenly”, or “scary”. So watch for me hocking mixed nuts on TV sometime soon. I’ll be the unidentifiable one in the smiling, foam-rubber anthropomorphic brazil nut.


Geek alert: I’ve recently started dreaming in XML. Sadly, I’m not yet fluent enough in XSLT, so I don’t know what I’m actually dreaming.

So long, tdeb

I’m going home early today. I get to help send off my best friend in CA. I’m not looking forward to it. This, plus other recent events make me wonder why the heck I’m still in CA at all. I can be bored/annoyed at work anywhere, and could be bored for less hours per day in just about any other part of the country.

Nerve endings

Phantom buzzes are starting to drive me insane. I commonly have 2 things that vibrate on my body (phone and on-call pager) and have started noticing that I feel them vibrate when they aren’t: I grab my phone out of my pocket thinking I’m getting a call, and there isn’t one. I think my body has gotten conditioned by regular buzzing. It seems not unlike an amputee whose missing leg still itches sometimes. Creepy.


Hooray, I didn’t lose everything. Got the drive to boot enough to do a cpio. A new drive will be in order.

All is lost?

The most frustrating thing about having a drive go bad on the home-server where you’ve ripped your entire music collection to MP3 is having to fix it in silence. And I did it, knowing that every single song I might want to listen to is about 30 feet away in CD form. But WinAmp made me lazy.

Thing that make you go “hum”?

Everyone and your brother is about to mail you about the next big internet meme: DOKAKA. Be sure to grab the Smells Like Teen Spirit cover.


If you are a professional developer you should never, ever interrupt a fellow developer (specifically, “me”) and ask why the XML parser is telling you that you lack a required closing tag. It’s probably because you didn’t put in a closing tag.

Drip tip?

I have to aplogize to all the baristas in SF: I’m just not going to tip you anymore for a cup of drip coffee. It’s not personal, I just don’t think the act is worth it. If you exhibit a little expertise and build me a killer latte, you’ll get a very small tip, maybe 5%. It just doesn’t make sense that I pay you extra for pouring a few ounces of something that comes our of pre-measured bags. You may think I’m a jerk, but I think it’s just fair. Tipping for coffee belittles the effort made by my server at dinner who busts his/her ass for an hour keeping me and 20 other tables happy.


I’ve just experienced a new horror in cubicle-farm world: gas. Someone near me is clearly not feeling well and their silent emissions are pure, vaporous evil. It’s clearly not bad enough that I get to deal with cell phones ringing unattended and the occasional cow-orker that feels the need to stand while making phone calls.


Yesterday my car stereo was stolen while I was parked in the BART parking lot. The bastards didn’t even have the decency to break the window: they punched the lock with a screwdriver, ruining the lock and door panel. Doesn’t it seem insane in an age of advanced material science and mechanical engineering that my door is susceptible to the same brute-force attack that has worked for decades? Doesn’t an engineer or product manager notice this is a problem? Granted, I shouldn’t really be surprised: only in the last 2 years did someone finally design a cap to solve the “drippy, watery ketchup-stuff” problem. And that’s a problem that has been making buns soggy for eons.

Separated at birth?

From the creepy file: when using a whiteboard, my handwriting is almost identical to Nick’s.


Little sister is now married. I can’t really say much about the whole affair, as it was pretty standard (and I managed not to do anything stupid, like curse, during my scripture reading). The one thing I will say is that it makes me jealous that she’s gotten to make her absolute best friend into her lover and partner for life. The family joked that we’d never seen them kiss before the wedding. But, honestly, who cares? They’ve already got down exactly what being married is really all about.

Mitch hater

Sprite hates Mitch. Whether it be spilling on or around him, he ends up with a disproportionate amount of it not in a cup. The most angry form of Sprite comes from Wendy’s, with a Big Bacon Classic (in combo form). Sprite hates Mitch.

Spammers are monkeys

Every once in a while, monkeys typing produces something interesting. Today a spam program sent me email with the randomly-generated subject line of “disposable botujism.” I don’t have any good jokes for that. It manages to stand on its own.


It appears electronics manufacturers are helping crack addicts straighten out their lives by giving them jobs designing bookshelf stereo systems. Sadly, none seem to be able to quite kick the pipe habit. I will never buy one of these semi-futuristic plastic monstrosities. Apparently I’m not in the target demographic since I don’t want bright orange tubing, bulbous extrusions, and a 6-inch repetative lightshow panel to go with my Jill Sobule. If ever I meet the people who do want these features, I will punch them for making most of my stereo choices look like their faux race cars.

Mmm. Toasty.

As it turns out, Oven Toasted does Taste Better.

The blue kylev needs food badly!

At 6’4”, about 200lbs., it is really hard to fill up on Cream of Wheat after getting some wisdom teeth removed.

Why? Because it’s crap!

I have to wonder if Hillary Rosen watched the Grammy’s (I didn’t). Did she notice that one artist from a small label walked away with most of the awards, including ones for technical excellence? For all her whining about how the MP3 has killed the music business, she seems to be ignoring the actual product. Maybe, just maybe, people would buy CD’s if there were anything out there actually worth paying $18 for instead of the crap I currently see on shelves. If the recording industry was actually producing good music, doesn’t it make sense that the Grammy’s would’ve been more hotly contested?

Chocolate covered poopy?

Even at the ripe old age of 28, I still feel nervous about the possible results of grabbing a random chocolate out of a box. It’s strange that bad experiences with bizarre fillings as a youth still haunt me.


There is nothing more annoying than someone calling you while chewing gum.

Good news

Little sister: engaged. How wacky is that. Unless I hustle, I’ll be the only unmarried of the siblings. I’m not planning to hustle though.

Ow, my eyes!

I’m home for Christmas, and my sister “lives down the street from the Griswalds” (in her own words). Wow, that’s a lot of lights.

Drooling idiot

I’m still a moron. Two nights ago I was in my usual hangout. The usual set of people was there, plus someone I hadn’t seen before. That’s when the seemingly random attraction-bug bit: I’m around other people all the time, but suddenly I actually had an interest (which doesn’t genuinely happen to me often). Sadly, my stupid brain immediately shut down. She even tried to make a little joke with me, and I just blurted something incoherent. I had plenty of time to start a conversation with this lovely creature, but all I had running through my head was the mental equivalent of white-noise. At times, I am awkwardness personified.


I was chatting with dnm about an extremely perverse use of onLoad() and onUnload() hanlders on the Salomon-Smith-Barney web site. His reply was “Web applications are the Special Olympics of software. No offense to the Special Olympics.” Beautiful. Having spent several years competing in just such an “event” (with clients who still insist on Netscape 4.7 compatability), I have to agree.

Muadib is a DJ

I have to wonder if Fatboy Slim actually intended to make a Dune reference in his track Weapon of Choice. “Walk without rythm, and you won’t attract the worm.”?


There is almost nothing as funny as a girl dropping her own lit cigarette down her own shirt. Last night at The Duke, Jensine proved this.


Never sneeze with oatmeal in your mouth.


I’m pretty much going to boycott TV today, for obvious reasons. I don’t think I can stomache any soft-focus retrospectives from semi-sincere network representatives. I’ll remember this day in my own way, combining sadness of loss with a little bit of angry patriotism.

It Chaffs Me So

The worst thing about being on-call is the chaffing that the pager causes along my belt line when I wear a shirt that doesn’t stay tucked in.

Unexpected Compliment

I got my “Oatmeal Fantasy” this morning at Krivar, as usual. The guy there commented on my “Dork” t-shirt. He said I didn’t look like at dork and asked the lady there if she agreed. She said, “No, he looks like he should be a nude dancer.” Okay…. That was weird.

Chicks dig confidence

The CalTrain conductor stopped by my seat today to inform me that she was “impressed by my confidence” because I was doing a crossword puzzle with a pen.

Pants calling

Sweet. Two voicemails in a row of the sound of someone walking with their phone in their pocket.

Take that, tree!

Last night I bought a jug of orange juice at Safeway and was handed a receipt that measured 11.5 inches in length. One line item, a total, and an assload of ads. That’s got to be the most wanton act of waste ever.

Did I already buy this?

My CD collection has officially grown beyond my brain capacity. I can no longer cache the whole thing in my memory at one time, so I can’t actually be sure if I already own something or not while shopping (and end up buying something I already have). I need to revert to list-making now.


Well, crud. There is nothing like not sleeping to start your week!


Self-hatred will turn your life into a twisted, joyless burden. Quite often I wish I were more ignorant, less self-aware, and generally not as cerebral as I am. God gave me this mind, apparently, to torture me; and I’m none too happy about that.

Bumpy walls

Wow! Climbing yesterday was fun. A great workout, and a good mental challenge. I’d forgotten how much I enjoy it. I’d also forgotten how harsh it is on your hands. Ow. I think I’ll have to do it more, though, as there are apparently many gyms around me.

Anagram fun

It turns out that my name is an anagram for “ever naked by elk”. I hope that doesn’t mean anything.

Random nasty YIM

I guess I’ve just had a first. Some guy just offered to give me oral sex after randomly chatting me up on YIM. Only took him about 5 lines to get to the point. Wow. Yuck.


Yesterday I got free tickets from a friend for the Giants game: 3rd row on the left field line. Amazing seats. Yet, I couldn’t get anyone to go with me. I called everyone I knew, and even the unemployed people made up wacky excuses. So, I said “Screw it” and went to the park. I walked around outside for 35 minutes, asking random girls to go to the game with me (wreckless abandon + wacky mood). I even chased down a jogger. No dice. My confidence is at a new low as I take a seat on a bench facing McCovey cove. I glance over at the grandfatherly gentleman sitting next to me reading his paper. I say, “Hey, sir. You got time to watch a baseball game today?” He replies “Sure!” and I hand him the ticket, free of charge. He thanks me and I get up and head in, shouting back “I’ll see you inside in a little while!” and he smiles and waves. I watched the whole game alone; old guy never showed up. I hate this town.

Lost youth

I keep thinking of one thing as I walk to the Muni station at the end of the work day. There’s an old woman, dirty, downtrodden, and probably a bit disturbed who sits on my block each day during rush hour, hoping for handouts. There are many like her around. And I can’t help but realize that at some point in their lives they were children. The probably played in sprinklers, rode bicycles, and played house. Now all of that is just gone.

It’s a dream

Stupid brain! I have a habit of sitting outside and reading before bed, but I often do it until I’m really sleepy. Now, my subconscious has decided it would be funny to screw with me. With great regularity in the last couple of weeks, I’ve started dreaming that I’m outside reading and dozing off. So I think, “Gee, better not fall asleep outside.” and shake myself awake and close the book, only to find myself standing beside my bed. Stupid brain!

Happy night

My friends are the people with whom I forget. I forget to think, to worry, to obsess. Saturday night I was out with Tim and forgot. And I was happy, actually happy, for the first time in as long as I can remember.


I went out and bought a baseball glove this weekend, and convinced Mitch to do the same. We played “catch”. In the “sun”. I’d call it theraputic, but a finger on my left hand is still kind of jammed, and my right shoulder is sore.

More random layoffs

Another round of layoffs at my company as we change directions for the 4th time. I’m still here, but I’m not always sure why. It is becoming increasingly difficult to work, as I care about this company less and less. Actually, I’m not even sure who I work for anymore. We’re nothing of what we started out to be.


There is nothing quite as annoying as being in a brain-funk for several days. For four days, I’ve been all but worthless.

Soldering?! Me?!

It’s a good day at work when I, as a software and network geek, get to break out the soldering iron. Woo!

New soreness

Despite all the gym time I have been putting in, playing volleyball for a couple of hours uses a whole bunch of new muscles. Ow.


Must… resist… gorging on Peeps!

Great new store?

A random guy struck up conversation with me and some friends while we were helping Ryan move some stuff out of storage. The guy, something of a weenie, said, “You getting your own place? So, have you heard of this place ‘Ikea’?” I almost burst out laughing, thinking he was making a clever joke. Sadly, he continued. He was serious.

Hack it, ooooh yeah…

There is something funny about kernel hacking while listening to Barry White.

Ugh, still alone

I’m so pissed off sitting here again. Back in the Bay Area with nothing to do and no-one to meet. The slow death of the social side of my being, perhaps my only real humanity, sickens and saddens me.

Geek castration

There should be a name for the depression you feel when your internet (DSL) connection goes down.


Whodathunkit? I’m now down to a single cup of coffee per day, without headaches or weariness. Not bad for a guy that used to down about 5 per day. Turns out it is really hard to find drinks without caffeine for the rest of the day (and water gets dull after the second liter).

New Year’s anti-wish

Let another sucky year begin! Hopefully I’ll get out of my current set of ruts.

Blown vacation

Crap. My flight was cancelled today. Now I have to wait 2 days for the next available flight, greatly reducing the amount of time I get to spend with my family for the first time in over a year. And the worst part: I got up before 7:00am to get to the airport!

Ph33r teh donut holder!

I walked to the donut shop again today. While crossing the parking lot, an older gentleman who was blowing his nose while sitting in his poorly-parked blue sedan glanced up and hit his door locks as I passed. Weird.

Stupid question

Can a vegan be pro-choice?


I really can’t think of anything quite as frustrating as buying a new Leatherman. Here is the perfect, compact, cutting/slicing/sawing tool that you’ve been needing for so long. And they have packaged it inside a seemingly impermeable plastic container, heat sealed at the edges to resist any and all attempts to pull, tear, or yank. If only I had something around my cubicle that had a durable cutting edge…


I’ve rediscovered the power of absence. I now have a reasonable reputation for not being available (forgotten cell phone, on my motorcycle, etc.) and can now just leave after making a descision to make it stick. It’s a great way to make people think about what absurd thing they’re asking me to do.

A least I still have the hole

For the first time in my life, I lost a donut. I know I had some left, but I can’t find it. And this isn’t that big of a house!


Wow. That’s what I call a long day of work. Got in at around 11:00 am. It’s almost 5:00 am now (the next day). Trucked along the whole time (except for a brief Jet Grind Radio break). Looks like we got most things working right, though. What a fine way to cap off a solid month of working all day every day. I’m not doing this again, though. I am not living the American dream.

Mouse wiggle

I’m in a company meeting right now (thank goodness for wireless LAN). I just realized that to be a high level executive, you cannot be able to configure your computer. It’s not allowed. You have to sit up there, meeting after meeting, presentation after presentation, with your screen saver kicking in and your power saver shutting your screen down if you spend more than a minute without jiggling your mouse. All this, making you look foolish, while every geek in the room resists the urge to dive across the table and change just one setting on your control panel! Oops, and the current presenter just kept pushing buttons and shut his computer down. Nice.

I’m afraid

Wow. What a bizarre morning. NYC is in chaos. The Pentagon has a hole in it. And I can’t stop counting in Spanish in my head. Weird.

Dumbass on wheels

Starting the day a little irritated and then riding your motorcycle all the way to work with your backpack unzipped (containing expensive laptop) is not a good thing. I’m just sayin’…

Bourbon and Bob

The perfect combination for an evening of excessive giggling: Burbon and Bob the Angry Flower.

OSS Assholes

This officially pisses me off now: for the second time now I’ve donated effort to an open source project and not been credited for it. First, it was GAIM, but I could somehow excuse the sophmoric behavior of a couple of college students prefering to quote random song lyrics instead of credit me in theri ChangeLog (I’ve since left the project because of the lack of goal-setting, coding standards, and myriad other moronic things that were happening). Now, with SNIPS, I’m even more offended: I reported a bug and submitted a patch to fix it, yet I get no credit in the release notes (though others did for simply reporting bugs). And SNIPS is written by a guy who works in a corporate environment, a professional. Where I work, implicitly taking credit for other people’s work will get you canned. Furthermore, it makes me wonder if Open Source itself can survive if the people running projects fail to understand that they must “pay” their contributors with the one thing they desire: credit.

Ups and downs

Well, a couple of weeks have passed since my bosses fired all my friends. I’m still lonely. I’ve had lunch with a few of the other people in the company, but it is hard. It’s like suddenly getting sent to a new school and being forced to build friendships all over again. So far, it hasn’t been very productive: the differences between myself and others is all I can seem to find. On the up side, my new boss, Chee, loves to pick on marketing people as much as I do. He’s practically cruel in the way he beats them up when they try to change specifications or dates. That makes life almost tolerable.

No satisfaction

Yaga laid some people off as the result of a change in direction, a “refocus” if you will. This is my first time having those around me suddenly gone. Sadly, I think the choice of people was a bit off. Some of why I think this is that the 3 people I hang out with at work were included in the 9 laid off. Now I have increased work load, nobody to hang out with, and fear that I may be next. This is not a good state of mind to be in. On top of that, I’m writing this from my office on a Saturday, having been given a rush project to do. Argh: there is no job satisfaction in my heart.

Grape? Really?

I believe there to be no connection between the grape flavor in candy and drinks, and the flavor actually present in grapes.


It turns out that the opossum is not one of nature’s brightest animals. From recent experience (last night), I can say that they are prone to randomly changing direction even after having successfully crossed a road. It also turns out that although they make a nasty little “whump”, they deal no damage when hit by a motorcycle. Oops.

Posers and Samaratins

On my ride to work this morning, I was disturbed to notice that Calvin (friend of Hobbes) now is now available in sticker form urinating on the word “Honda”. This was, of course, on a Nissan 200SX (a discontinued economy model 4-door) with aftermarket oversized tailpipes (no other modifications). Yes sir, you are a bad-ass. At the end of my ride, though, right in front of my office building, I saw 4 birds around a clump that looked like a nest. They were in the middle of the road, and flew away as I passed. The clump of grass seemed to continue being blown down the road. Then it registered that it wasn’t being blown but dragged by bird tangled in it. I stopped, backed up my motorcycle, and got off. I sat there in the middle of the road (in full gear), doing my best to detangle a small sparrow with an injured leg from a former nest. It finally flew from my hands, able to lift the nest parts I hadn’t yet torn free. It joined its friends a short distance away and they proceeded to pick off the rest. I got back on my Honda Nighthawk, satisfied that there is no way even a mischevious Calvin would piss on the Honda of a person like me with a happy, stupid little grin on my face.

I did something in the real world

It was a good weekend. I finally replaced the thermostat on the Monte (yes, an American car in Silicon Valley) and barely touched my computer.


Nothing ruins a nice motorcycle ride to work quite like some moron in a landscaper’s pickup truck on the freeway with a less-than-secure load of “not regular dirt”. Little damp chunks hitting your neck is not pleasant.

MP3’s: Finally not painful

After hating it for several years, I finally had a positive experience with MP3s. Downloaded Media Jukebox, dropped a CD in, and had MP3 in a short time. No glurks, no failed tracks, no lockups. And all it took was a rediculously overpowered PC. Granted, now I see that my major aversion to MP3s was my past woes in creating them. I can finally see how handy it would be to have my giant CD collection randomly accessable. Time to go buy a couple of gigantic cheap hard drives….

Can it be done?

Challenge for the day: come up with a pick up line that uses the word “priapism” and doesn’t get your ass kicked. That’s one of my new pet words for no good reason, other than that I encountered it recently in William Gibson’s novel Virtual Light.


Why is it that so many men’s magazines currently look like soft-core porn? Do I really need the starlet-of-the-week wearing a barely-adequate leftover fabric swatch on the cover? I’m just trying to get an idea or two on what to look for as I revise my wardrobe! Come to think of it, women’s magazines are exactly the same (Vogue, Cosmo). Apparently both men and women need to see scantily clad women. That doen’t make any sense.

The truth about … roads

Larry and I finished dinner and he decided to drive around the new office area to take inventory of the available restaurants and services. I’d already done this to some degree. Looking past one intersection he said, “It looks like there should be more stores down there.” I replied, “No. I went back that way and it just gets all curvey and confusing.” Larry retorted, “Like women?”

K&D all night long

Wow. Kruder & Dorfmeister last night. I danced from about 9:30 to 3:00, at which point I finally started cramping. But, man, was that fun. A better, and more sweaty workout, than spending hours on a bike.


Geez. I’m still at work. It’s 3:30! AM!


Well, the first company I worked for here in the Valley is about to be bought. Feels kind of neat to know that I helped get it where it is. At the same time, I got the distinct pleasure of giving the CEO a giant middle finger. The guy came in, didn’t learn a single name in all of engineering, gave drab speeches at company meetings, and had no visible effect on operations. The only benefit to having him show up was the little hubub it created when he was hired (big name, woo-hoo). After that, he just fired some good people, and hired a few buddies. What a dud. What CEO looks at the ground when walking the halls?! Now, after a whole lot of nothing, he has the balls to include a line item on the merger to accelerate the vesting of his giant pile of shares. Come in, do nothing, fire my friends, arrange a merger, and then ask stockholders to grant you $10 million in options for free? Kiss my ass, Mr. Ariko.


Nothing ruins your weekend like sudden, exponential growth in the use of your company’s beta software. I can only call it one thing: broke-ass. We were not ready for this many users.


Just got back from the Hooker. John Lee Hooker, that is. Saw him again in a rare appearance, the second time since moving to CA. It’s fun to see him, but I really got a weird “Weekend at Bernie’s” vibe this time. The guy is old. Really old. When is it time that someone tells him to just find some new way to spend his time? His hands and voice just aren’t keeping up. Yet the crowd went wild whenever he muttered something incoherent into the mic. At one point, I think he took a little standing cat-nap while watching the keyboard player solo. It’s sad really, but neat to see a legend.


Wow. That’s a lot less hair.


Honestly, I really don’t know what I feel about the return of leather pants as acceptable fashion. Fortunately, it is so far restricted to women; guys never look good in leather pants. However, there are a lot of women that don’t look good in leather pants either. It seems like this is a fashion faux pas that we as Americans made not too long ago, and should remember.

Revenue, not profit

Wow. Today my new company Yaga posted revenue. Neat. Granted, I don’t think the actual figure is even in the thousands of dollars, but it’s a step in the right direction after sitting around burning money for several months.

Usually disappointed

I’ve almost completely lost faith in Hollywood. Nothing good is coming out of there. All I watch now is “classics” on DVD (like Pulp Fiction, Army of Darkness, Full Metal Jacket) and independent films. Even if a new release “looks good”, it inevitably isn’t, and I always feel dirty having left the left the cineplex $8 dollars poorer and 20% more annoyed. It’s clear that I’m not one of the masses for which this form of entertainment is manufactured. But what really gets me? TV Commercials. The people making these 15-45 second films are packing so much into them. They’re the best short-films out there. I still mist up when I see the OfficeMax commercial where the teacher catches her husband covertly buying school supplies to help out (and mouths “Thankyou”). It’s annoyingly touching.

Down again

I seem to be going through another valley. I’m to that point with myself that one sometimes gets to with a sub-optimal roommate that you’ve had too long. At some point in your annoyance, you start seeing the little things that bug you about a person. Eventually, you notice those things (which you’ve subconciously ennumerated) more and more. Soon, you can seen nothing but those things that annoy you: every tic, noise, and movement somehow embodies those things which bother you. I’ve been my own bad roommate in the last few days. Every mistake I make is severely bothersome: missed keystrokes, flubbed guitar notes, sub-optimal lane selection. I recognize is all as petty, stupid stuff. But somehow I can’t see past my own flaws right now, seeing myself only as the sum of my flaws. I’ve never really figured out how to get over it with a roommate, either. I usually just endure until I move out. With this, I’m kind of stuck with myself.


I’m finally taking a break from work, though I’ve been having much more fun these days as I am writing code again. It’s more exciting to me than system administration, even though it can be frustrating (especially when a PostgreSQL bug bites you). Actually, this isn’t so much a break as waiting for a new RPM to build. I spend a lot of time at work now, and something currently missing from my routine is working out. Haven’t been to the gym in months. I keep thinking about it, and realize that part of the reason is that I no longer believe in attraction. I used to think that by working out and being fit, someone might find me a little more attractive, and perhaps that would spur them to approach me. I never wanted to be really physically attractive, but I felt being marginally handsome was part of how relationships happened. However, after lots of observation, I have come to believe that finding someone has nothing to do with anything. It is completely random, or divine. It has nothing to do with attraction, fitness, beauty, or how much your life is “in order”. Its just a matter of biding your time and waiting for your number to come up. “Now serving: 41”. Aw, crap. I think my number is written in scientific notation…


Huh. I guess I’m a little cooler today. I converted one of Perforce’s little programs to work with the present Apache API, and they gave me space in the guest area on their public Perforce server. It’s little goofy stuff like this that makes me believe I actually do belong in the computer business. I’m generally very hard on myself, assuming that I’m incapable until I prove myself otherwise. I guess I’ve proved a little something that I can’t ignore. Granted, I’ve ported things from the 1.2 to 1.3 API’s before, so it really isn’t much of a feat.

Evil consumption

My greatest weakness is quickly becoming I can buy piles of CDs and DVDs, and somehow not feel guilt because they’re used (and cheap).

Color blindness

Damnit. After all these years people still don’t realize basic ideas in web design: if you’re going to specify one color for my page, specify them all! Do you think it’s safe to assume anything about my default colors? No! I’m using Konqueror, the only “good” browser that runs on any flavor of Unix, and it has themes that set my default colors. The hi-contrast scheme I have sets link color to yellow. Now, if you set your background to white, and don’t set your link colors, I can’t see anything! Your text vanishes into near-nothingness. The worst offender: Yahoo!. You’d think the pioneers of the portal/search idea would know how to write HTML.


I just realized something about this past weekend: I’m comfortable as a complete geek. When I was hanging out with my friends there, I did a lot of really strange things that made them laugh, but it never bothered me because I knew they found funny only because they know I’m quirky. I’m not a member of the social mainstream, I know it, and they know it. They still like me as Kyle, and seem to enjoy (even value?) the ways in which I’m different from them. Then, at the party on Saturday night (Ow, my liver), after a few drinks I was sitting on the floor with some younger friends of mine and freely talking about the pipelined FPU design on the Althon (among other things). It comes naturally to me, so why fight it? At the same time, I’m not one-dimensional; my friends in GR also feed those other parts of me that feel and hurt. I’m blessed to have them.

Sudden movement

Oh … my … god! I’m sitting in Grand Rapids, it’s cold out, and I’m smiling. Mark called me and decided to spend a bunch of his frequent flyer miles and put my on a plane. Friends that know who you were are a blessing. I feel very at home. It makes me think I could move back here someday. Now I have to go test more of the Jello-Shots for quality.


Wow. Superbowl ™ parties do absolutely nothing good for my digestive track. This has not been a “pleasant” day. Despite my scatelogical references, I did have a fun time watching the game. The thing I found most disturbing (other than the horrible job CBS did covering the game) was the fact that the Superbowl ™ web site had all kinds of historical information, party ideas, and multimedia content but lacked the time the game was scheduled to start! This is proof to me that the web is worthless in so many cases. “Look what I can do! Oh, wait. What were we supposed to be doing?”

Stupid welder, dead welder

If I ever give up on this computer thing, I’ve decided not to become a welder.

Pile drivers

Hell is having two pile drivers running all day in the lot next to your office.

Thus, I am in hell.

Lost my smile

A few years ago I used to walk around with a goofy grin on my face all the time. I just noticed that I don’t have that anymore. Weird.

Nasty out

It looks positively evil out today. From my office window I can hardly see other buildings, and the sound of surging, blowing rain is a little distracting. The office (and parking lots) are a little more empty than usual, too. People just can’t handle waking up to that first rainy winter morning, I guess. In the mean time, I trying to get productive again, and am trying to randomize my music a little more to help knock me out of my rut. Right now, I’ve got the Fresh Prince “Homebase” kickin’ on my speakers. “Ring my Beeee-eeee-ell….”. It’s a wonder my office mates ever talk to me.


I was just in Best Buy to pick up a scanner. I was bothered to notice a woman in front of me purchasing (on purpose) “Joe Versus the Volcano” on VHS. The US is going to hell.

Ow, my head

I’m in the middle of a snowboarding crash recovery. I probably had a minor concussion, and now I get randomly dizzy. Woo, fun. Makes for long and interesting days.

Back home

Well, I’m back in California after a long vacation with friends in Colorado. I have to say it’s great to be back, mostly because the food is good here. I’ve never tasted so much under-flavored food in my life as I did at Keystone. Blech.

New Year

Welcome to another new year. I’m sitting here at the Keystone resort in Colorado with my best friends, having snowboarded, partied, and nearly broken my neck (I’m going to get myself a helmet). It’s kind of a strange place to be, as about 15 years ago the Pranger family reunion was here. It’s been refreshing, though. I realized that my friends in California don’t laugh at me nearly as much. These college friends (especially Rob) just somehow find me endeering in my quirks, enough so to inspire myrth and laughter. And the favor is returned, as we all laugh at the others’ unique traits. It’s a strange friendship, but a great one.

Bad Christmas

Christmas alone kind of sucks. On the up side, I did get a George Foreman grill from the folks, and it looks like Windows install #9 on my new computer is stable. Just played some games, and no crashes at all. Man, does that simple fact raise my mood. I always get really angry and upset when a Windows machine is misbehaving, and now it (apparently) isn’t. Knock on wood, and go to bed.


I just realized that the chorus from the new Limp Bizkit song “Rollin’” is a vaguely disguised version of the “Hokey Pokey” concept:

Move in, move out / Hands up, hands down Back up, back up / Tell me what you gonna do now Breathe in, breathe out / Hands up, hands down Back up, back up / Tell me what you gonna do now (That's what it all about!)

Windows sucks

I really don’t know how much longer my soul can handle dealing with Windows. I found myself sitting in front of my home machine, crashing it again and again this morning while trying to make a simple change. Eventually, I realized I was screaming obscenities at the top of my lungs at every inane error message that popped up as “Wizards” tried to “help” me by automatically making changes that made things worse. Looks like time for another clean install. This is not what an OS is supposed to do.

Couldn’t find it

Got in my car this morning and started looking for the petcock before starting it. I’ve obviously been riding my motorcycle too much. With gas prices the way they are, and the gorgeous, cool fall days I hardly have a reason to drive a car. I also hardly have a reason to take the direct way to and from work.

Boppa sad

For the second year in a row, I’m going to be away from my family for Christmas. That didn’t really bum me out until my big sister wrote me. Apparently my little neice keeps asking if “Kylo” is coming. Mom replies “no” and Emily responds “Boppa sad”, apparently because my dad told the almost 2 year old Emily that he was a bit down at the prospect of another Kyle-less Christmas. Now my heart is breaking.

Not what you expect

I found out that CTO’s get really flustered when they open your office door to ask you a question and find you on your knees praying.

This is my brother, Malloc

Tim and I started playing a hilarious (though geeky) game the other day. Had us in stitches for quite a while, even though it is a little rude. Just put on your best faux-Indian accent and start making up sentences using C API calls for personal pronouns. For some reason, the likes of sprintf() and malloc(), when said with an appropiriately hilarious fake accent, just made us laugh. We felt pretty guilty though.

Gateway to hell

48 hours after first booting my new Gateway computer, I am now on my 4th Windows install. This might be considered obsessive behaviour. I just want to play a game without having it freeze up! I don’t even know how it’s possible that it still locks up when the OS install is only minutes old.


There is nothing quite as frustrating as buying a brand new, super-cool computer and having it crash out of the box. The first night, 2 of 6 boots flailed (you have to reboot a new computer this many times to install OS updates). I waited a long time to buy a nice computer. Now that I have it, I just want to shut it off. It’s amazing that consumer expectations have fallen so low that constant crashing doesn’t cause outrage. Thank you Microsoft. This machine will have Linux running on it by the end of the day. I’ll just have to write my own damn games.

Pile driving

There’s nothing quite like a pile driver in the next lot to give you a headache.

No wires

It’s the little things that make being a geek fun. Like grabbing your wireless laptop and walking over to have someone select a new password. WaveLAN is cool.

Home remedies

I’d like to endorse my new super-combo for beating a cold. I’ve managed to fight one off quite nicely with cranberry juice, Drixoral, and GNC echinacea/goldenseal (concentrated, since the have a dozen variations). Workin’ like a charm. Tuck and Tim suggested cigarettes, whisky, and “vigorous, athletic sex”, but I’m skeptical.

How does it work?

What’s the different between “letting God be in control” and just getting pushed around my circumstances (going with the flow)? I keep hearing this phrase “give it up to God”, but have no idea how to implement such a thing.


I wasn’t expecting that. I went to make myself some soup and found a note in my silverware that says “Call John for silverware.” I was only out of town for 3 days!

Me need coffee!

We’ve reached a new place in human history. While in the SeaTac airport (under construction/remodeling, as is every other airport in the universe) I noticed that a new class of necessity being pointed out. On the signs that indicate such important details as gate numbers and the location of emergency services, fire exits, baggage claim, and restrooms, a new icon has been added: Espresso. All hail caffeine, the socially acceptable addiction of the new millenium! Fortunately, it is a trend I can say I was “ahead of”. I feel like standing outside of a Starbucks leaning on a cane, and hollering at the pre-teens that come out with their fancy drinks and yelling thinks like, “You kids! I was suffering from intestinal distress and debilitating withdrawal headaches before you even could pronounce ‘Carmel Macchiato’!” I’ll have to work on a more crumudgenly voice and perfect a condecending fist-shake.

Spider attack

More strange dreams. It think this time it has to do with the fact that I’m actually eating good food on this trip home to see my family. It is the second time I’ve had dreams that in some way involve a large breed of spiders with light blue bodies with a yellow bow-tie shaped markings. They seem to lack all coloring when just born, when they have a ravenous appetite (as witnessed in both their appearances in dreams). Seems they have a tendancy to swarm-attack humans, biting them and causing a painful and gruesome death as pustules explode from each of the countless bite sites. This time, however, the dream included a group of six people (me included) about my age with various romantic entanglements and a movie trailer voice-over, just like “I Know What You Did Last Summer” or any other trite teen scream flick. I think I’m finally having freakier dreams than Kirk. I don’t recall this being one of my goals, though.


For the first time in probably 20 years I had disturbing nightmares that kept me awake last night. Bizarre images of old co-workers in death masks, police shootings, and thunderstorms kept my mind from adequate rest. I’m sure it had nothing to do with my snacking last night which included jalepeno chili, 7-Eleven vanilla capuccino (dispensed from a “whipper”), and the striped Twinkie variation known as “Tiger Tails”.

Bad acting

I’m just waiting, hoping for one of those Radio Shack commercials to end in Howie Long smacking Terri Hatcher around some. And it’s so gratifying that a former football player can consistently upstage a “real” actor in 20 second spots. Seems, after all, that a large chest and the ability to scream, “Help me, Superman” does not make one an actor.


Working for a startup in its earliest stages is like having a crack-induced myocardial infarction that lasts for months, but never quite kills you (read: fun).

Those darn kids

I swear, if Fred doesn’t get a gas gauge for that darn Mystery Machine…

Brightest bulb?

I just saw Gena Davis on “The View” (I swear, the TV was there because I’d watched Monday Night Football, grunt). That woman, a MENSA posterchild, proves that genius has little to do with test scores. I was not impressed.

Big mess

I am completely amazed and apalled by the election. Bush and Gore have guaranteed that, no matter who ends up winning, they will be the least popular president ever. The beauty of democracy has now degraded into legal posing (another thing soiled by lawyers). And what’s this “hand recount” crap? Recounting by human hands only adds errors! Put simply, the machines told Gore he lost, so his only chance for victory is that a crew of error-prone humans make about 1000 mistakes in his favor while recounting. Quite frankly, I’ve stopped caring. I’m declaring myself an independant country, no morons or lawyers allowed.


Some of the girls from the administrative departments handed out little cellophane bags filled with Halloween-themed candy to everyone in the company. Turns out, not all of it was candy. Pumpkin-and-vine shaped crayons taste terrible.


I’ve become a gas bigot. I now drive extra distance to get Chevron gas rather than settling for the seemingly omnipresent Shell. My car just seems much happier; I think Shell is generic gas corporate clothing.

Shooting stuff

I just went to Jackson Arms shooting range with Matt. I have to say that it is overwhelming to have the life destroying power of a 9mm pistol in your hand and be using it for “fun”. I really enjoyed it for the precision, technique, and and challenge. However, it’s still hard to forget that “other people” are missing the point and killing each other with these things. Also, I have a better feel for how woefully inaccurate video games are. It’s pretty much impossible to string together two or three quasi-accurate shots in rapid-fire succession, let alone a dozen. And with video games you don’t get the satisfaction of a warm shell bouncing off the wall of your range lane and tapping your shoulder.

Yet another chapter

I’ve done it again. I quit my job for the second time in two months. Now, at the age of 26, I am a founding member of a software company. This ride continues to get wilder and wilder….


There are many strange people on the internet whom I fail to understand.

I drank what?

I just took a drink from a Mountain Dew. This wouldn’t be so unusual, except that I found it in an odd place in the cafeteria fridge, and I don’t recall hearing the safety seal “crackle” when I hastily opened it. Now I have a weird headache. Will poetic justice have me killed by caffeine that has been tampered with? Will I be done in by this seeminly harmless addiction to a stimulant?

Chest hair

I have developed an ingrown hair on my chest, a nasty one. I couldn’t figure out how that happened until Monday morning when slung my my nice new Tumi messenger-bag/briefcase over my shoulder. Ow. The edge of the shoulder pad is right there. Mystery solved.


As we approach another winter with a new energy crisis staring us in the face, I’d like to request that all you status seeking, crowd following, sedan crushing, gas guzzling, space wasting, SUV-driving jerks kiss my ass. I hope you all have underinflated Firestones.

I hate Costas

I’m sorry. I just really can’t stand Bob Costas. To make it worse, I have no choice but to watch him. Apparently, Vince Carter dunked over the top of 7’2” French center Frederic Weis. Literally. Jumped right over him. But can I see it anywhere other than on NBC TV? ESPN? No. No. Thank you IOC for forcing me to watch Costas in the hopes of catching the highlight.


I, like all other Wired subscribers, got a free :CueCat in the mail. This device will help me contribute to the mass of marketing research already collected on me. I have decided to hack myself by exclusively scanning bar-codes from plush animal toys, novelty meats, and feminine hygiene products. I can’t wait to see the junk mail I get.


What the heck is “retsyn” and why am I to believe it gives Certs a competative advantage in the breath-freshening arena?


I really wish we understood dreams. Then I could explain the past two nights’ disturbingly erotic dreams, and why one of the girls in one (a former high school crush) turned around and had a goatee just like mine.

So sleepy

I’m so tired I’m hallucinating. You just can’t pay for entertainment like this!


My new rule for traveling to Asia: when selecting a beverage from a vending machine, never pick a can with asparagus in the picture. Also, be prepared for little chunks like tapioca in your beverages if they mention “pearl” or “jelly” in the name; being caught by surprise and spitting them out in public is embarassing.

Eating habits abroad

Made it to Korea, whew. My group has now entered the final stage of international eating. There are four: First, there is the “I’ll try anything” during which you willingly sample whatever is placed in front of you as a show of bravado. Second is the closet cravings, when you duck into a McDonald’s for something familiar, but don’t tell anyone. Third, you admit to your friends that you’re longing for something “normal” (we spent the evening sucking down shrimp tempura, just to have something batter-fried). Finally, there is the humiliating “beg your local colleagues to help you find anything plain and simple on the menu” stage. I hit this today, and my Korean hosts were (thankfully) very understanding.

Hell defined

Last night I saw the definition of “hell” in a Taipei street market: a turtle, still living, was hanging from a hook punched through the rear of his shell (apparently as a display to attract potential buyers). Below him were two trays containing the heads and bodies (separate) of his childhood pals. Yick.


Taiwan is pretty neat. The best part is the incredible number of scooters. Little 125cc scooters simply fill the streets, with entire families clinging to them. It’s completely unsafe (nobody wears motorcycle gear, and the helmets are only token guestures with clever designs), but just think if more countries did this. If each jerk driving a big car around the city had a little scooter instead, the parking problems would simply dissolve. I wish they would catch on in SF.

No Royal w/ Cheese

It’s the little things that are different in Hong Kong. Over here, they’ve got McDonald’s, but they don’t call it a “Quarter Pounder with Cheese.” They call it a … wait, they don’t have it at all! Had to eat a Big Mac.

Body slams and blue sparks

2 things: First, WWF Raw is even more hilarious with Cantonese commentary. Second, my borrowed power adapter literally just blew up with a nice big blue spark. Doesn’t look like it fried my laptop. Sorry Judi!


Last night I went out with guys from work into a club district of Hong Kong (Lon Kwai Fong). We spent most of the evening at a place called Insomnia listen to a cover band (all Asian) cover the likes of U2 (“Where the Streets Have No Name”), AC/DC (“You Rock Me All Night Long”), and Van Halen (“Jump”). It was like a really weird trip back to my adolecence, and I loved every minute of it. I danced and jumped around for a few ours solid. One more thing: some guy randomly walked up to me during a song, shook my hand, and said, “I’m really glad to finally meet the Messiah.” Great. Now I apparently look like Jesus. That isn’t going to help with meeting women….

Nasty delicacy

That was the weirdest lunch I’ve had since getting to Hong Kong. I’m currently gargling Coke trying to get the baby pigeon taste out of my mouth. It doesn’t taste like chicken. Oh, and we’re up to Typhoon Signal 3.


“Typhoon Signal 1 is Raised”. I assume this is one of those things you don’t want to see displayed in every major business place during a visit to Hong Kong, right? I suppose this has been a trip filled with new experiences, so what’s one more?

World traveller

In the last 24 hours I’ve added 5 stamps to my passport. I’m traveling for business, and am currently sitting in the iAsiaWorks offices in Hong Kong. This life of mine keeps getting curiouser and curiouser.

Cube-land voices

Remember that phrase “inside voices”? I only heard it used by this one crazy substitute teacher I had in the 5th grade when we got too loud. Now I sit here in cubicle world trying to resist the urge to tell the sales guys around me, “Inside voices, please!” as they yell and cavort around like the under-controlled schoolchildren I’m sure they once were.

Gimme some candy

I keep seeing these commercials for Twist-n-Fill Twizzlers; I’ve had them, and they are nasty. What’s more: if you search the web for “twist-n-fill”, you get mostly links to 3M industrial cleaning products. I do not believe this to be a coincidence.

Bad Day


Ignoring Billions

Since I started working for iAsiaWorks, I keep thinking about weird stuff. For one: which force is stronger: capitalism or myopia? Will the people who have declared the arrival of the “new world economy” actually involve the whole world. Up to this point, the internet moguls have focussed almost exclusively on the western world. Doesn’t it make sense to involve the whole world in a world economy, rather than ignoring a giant chunk of it (namely, Asia)?

Big Fat Load

I just recently bought Metallica’s Load CD. I only got it so that I would have a “complete” collection. I listened to it on the way in to work. Now I’m wondering: when did they go from writing riffs to hooks? Those sneaky, subtile bastards. I guess I can’t blame them for wanting to sell more albums, and what I think is worthwhile just doesn’t sell. I started out being annoyed at Metallica, now I just feel out of date/obsolete.