Stephen’s Statements A little bit of everything from Stephen Duncan Jr, a Software Developer in Portland, Oregon

Update: Converted to Jekyll.

Monday, June 4, 2018

Really Overdue Update

It only took 9 years, but I finally updated my whole site to use a static generator tool. In the meantime, Webby has been discontinued, and Jekyll has become the dominant tool of choice. It took a little while, but I’m happy to feel full in control of things again.

In the process of converting I’ve fixed a few broken links, removed several that couldn’t be fixed (Unmaintained Web Applications strikes again) and removed Google Analytics (sorry for contributing to privacy erosion for the sake of vanity stats).

It’s been fun (and occasionally cringe-inducing) to scan over the blog history while I was doing tweaks on the conversion to Jekyll. Knowing my history, I won’t try to claim that I’ll start updating the site regularly now, but I’ll probably make an attempt for a little while, at least.

Friday, August 17, 2012

Programming and Skepticism

Managing your own skepticism is a major part of being a software developer. It’s important to be skeptical sometimes. It’s always tempting to spend all your time playing with new tools, frameworks, and technologies. But that’s not what you’re getting paid for, and you can only spend some much of your own time learning. On the other hand, being too skeptical can lead you to be inefficient and behind the times.

I’ve had a history of being very skeptical about technologies that I’ve later come to embrace. While this has inevitably lead to being made fun of by a coworker who’s been there to observe this trend, I’m confident that thinking critically about each new thing before accepting has been a good thing, and I’m sure that I’ve avoided countless wrong paths that I can’t even remember. To catalog my mistakes: I scoffed at XML, I constantly questioned unit testing, and I dismissed Ruby. I’m still skeptical about Ruby on Rails though.

I’ve also had a few successes. Though I’m certainly no visionary, I picked up on Hibernate, Spring, Maven 2, and EasyMock without going through a long period of doubt.

So, how do you know when to give a technology a try? Don’t say ‘experience’: experience is just a proxy term because you haven’t consciously figured out what your techniques are. Do you follow certain people you consider experts? I was certainly more willing to try Ruby after reading essays by Steve Yegge, but I’m still not looking to use Emacs. Do you prefer to take it slow, and wait for the bandwagon to get big enough before even looking at it? Are there times when you can’t skip ahead, because you first need to do things the hard way, to feel the pain that some new tool fixes?

Tuesday, June 26, 2012

Turntable Bookmarklets

I’ve created two turntable bookmarklets to help you pick random songs from your playlist (Note: these have now been updated to match the new Turntable UI 2012AUG17, and can only select from the top 300 songs in your queue):

pick a random song

pick a random song from the top ‘x’

How to install a bookmarklet for those who aren’t familiar with them.

Tuesday, June 12, 2012

ColdFusion Security Fix

Adobe has released a fix for a ColdFusion security vulnerability that I helped investigate and report:

Friday, May 13, 2011


I’ve updated my commenting system to use Disqus. Let me know if there are any issues. Other than comments looking a bit ugly; I’m aware of that, and I might work on it later.

Tuesday, May 10, 2011


I’ve just created a project at github for the timetracker I wrote, with some help from Chris Snapp, that he and I have been using to keep track of the time we work for timesheets for several years now. Check it out:

Sunday, October 3, 2010

New Job At ISS

In a blog tradition, here’s my very late announcement that I’ve started a new job. After Cormine Intelligent Data closed its doors, I joined Intelligent Software Solutions at the beginning of May.

Sunday, September 26, 2010

Say Anything

I meant to post about this a long time ago, but when Blogger discontinued publishing via FTP, I hit some snags trying to create a new setup for my blog and website. If you see this, then I guess I’ve got it working now; the blog is hosted by Google, and the non-blog parts of the site are served up from an EC2 server at Amazon.

Back to what I meant to post about so very long ago: Say Anything’s new self-titled album came out November 2009. It’s an excellent album. I was going to link to a track-by-track explanation of the songs that Max Bemis provided in an interview with AltPress, but apparently it’s dropped off the internet. Instead, I guess I’ll just say: check out the album.

Sunday, October 25, 2009

Brand New Eyes

I recently bought three albums: Paramore’s “Brand New Eyes”, Rise Against’s “Appeal To Reason”, and Kings of Leon’s “Only By The Night”. So far, “Brand New Eyes” is the one grabbing my attention with several good songs and some variety of style. And, as always with Paramore, Hayley Williams’ voice is amazing.

After “Ignorance”, the angry song getting play on radio (angry songs are always fun to get into and sing along with), “Brick By Boring Brick” is my next favorite on the album. After listening the song and going over the lyrics on Friday night, we watched Dollhouse, and the ending of the show reminded me strongly of one verse:

Well, if it's not real
You can't hold it in your hand
You can't feel it with your heart
And I won't believe it
But if it's true
You can see it with your eyes
Oh, even in the dark
And that's where I want to be, yeah

While it doesn’t match the song overall (on Dollhouse, it wasn’t Sierra’s choice to be in a “relationship” that wasn’t real), the match up of Sierra recognizing her love for Victor even without any memory of him and “if it’s true, you can see it with your eyes, oh, even in the dark” connected to me. Especially as Diane and I had been discussing how much to read into the “even in the dark” part of the song (balancing the fantasy/escapism the song is against vs “true/real” dreams/faith).

We watched Gran Torino last night, which was better than I thought it would be. Now I’m looking forward to watching a football match (Arsenal v West Ham) and a football game (Dallas Cowboys v Atlanta Falcons) today.

Sunday, March 15, 2009

JQuery For Archives

Instead of working on the conversion of the blog to Webby, I spent much of the day playing with jQuery and JavaScript. A good portion was mostly wasted time attempting to make the loading of the syntax-highlighting scripts more dynamic. While this ultimately failed, it did get me to re-learn a lot of JavaScript and jQuery.

Rather than put that time completely to waste, I decided to prettify the archives section. Without JavaScript enabled, you get a linked list of links for each month of each year that I’ve published something. Now, with JavaScript, I transform that list of links into drop-downs for each year, where you can select the month within the year, and it will take you to the archive page for that month.

Now, for the code. First, on each blog page (via the template), I load my JavaScript file, and I load jQuery via Google AJAX Libraries API:

<script type="text/javascript" src="/js/main.js"></script>
<script type="text/javascript" src=""></script>
<script type="text/javascript">
    google.load('jquery', '1.3.2');

    google.setOnLoadCallback(function() {

This runs prettify_archives function:

function prettify_archives() {
    var years = [];

    $("#archives > ul > li").each(function() {
        var year = new RegExp(/\s(\d{4})/).exec($(this).text())[1];

        if ($.inArray(year, years) == -1) {


    var html = ['<h4 style="margin:0;">Archives</h4>'];

    $(years).each(function() {
        html.push('<select style="width: 11em;" ' +
        html.push('<option selected="selected">' + this + '</option>');
        $("#archives > ul > li:contains('" + this + "') > a").each(function() {
            html.push('<option value="' +
                + '">'
                + $(this).text()
                + '</option>');

        html.push('</select><br />');

    $('#archives > ul').replaceWith(html.join("\n"));

Minor Website Updates

So, I stayed up way too late last night uploading version after version of this website. I updated the version of the syntax-highlighter I used on the one code sample I’ve posted. Nothing special there, but the fall-back when Javascript isn’t enabled is nicer, as it’s a pre-tag, instead of a text-area like before.

I fixed all the pages to have the extension .html instead of .shtml. The .shtml was leftover from when I used to use server-side-includes instead of a combination of Blogger templates & Webby layouts to handle common layout issues. Here’s the content of the .htaccess file I used to make sure old links are given a permanent (301) redirect to the new extension:

RewriteEngine On
RewriteBase /
RewriteRule ^(.*)\.shtml$ /$1.html [R=301,L]

During the process, I noticed that Blogger wasn’t producing an archive index page anymore. So I added archives to the sidebar for each blog. I made my css rules a bit more generic by making sidebar sections a class, instead of duplicating rules for different ids.

All of this took a bit longer than it should because any changes on the Blogger side required republishing the whole site (actually twice, once for the main blog, once for the politics blog). Whereas, for the non-blog content, I could run Webby locally, rsync it to my VirtualBox Ubuntu Server VM, and test it locally. So my next task is to figure out how to turn an export of this blog into Webby source files so that I can manage the whole process locally (and get my blog posts into version control as a bonus).

Thursday, October 16, 2008


Despite the utter wasteland that is this blog, I’ve decided to start posting to yet another place on the internet: Twitter. The theory goes that if you’re interested in knowing the minutiae of my life, you can follow me on Twitter (or subscribe to my Twitter feed or what have you). I, knowing that everyone looking at my Twitter posts has implicitly consented to being bombarded with inane details about my day, can safely post such details with the concern of them being “blog-worthy”, or even “Facebook-status-worthy”.

Now, if only I can do something interesting, I may have a reason to post something to my blog again…

Thursday, June 19, 2008

Unmaintained Web Applications

This week I’m having to finally end my use of two web applications from major vendors. Bloglines had several of my feeds not update properly from June 3 through June 17th. I still haven’t received any follow-up e-mail regarding the issue. Besides, for a feed-reading application, you’d think Bloglines could manage to communicate to its users through, I don’t know, some kind of syndicated XML feed? On the 16th I was fed up with the lack of a fix, and the lack of a response, so I switched over to Google Reader. Sure, on the 17th Bloglines finally fixed the issue, but it was way too late by then. Getting my 309 feeds into Google Reader went fairly smoothly; a few folders weren’t created so I had make the folders and place the feeds back into them. I’ll miss Bloglines true “keep unread” or “pinning” feature, as well as the ability to group posts by the feed when reading a folder. But I’ll get used to Google Reader’s way of doing things if it means a reliable service that doesn’t feel abandoned, despite its ownership by Plus I’ll also get a better feed sharing mechanism, and finally have a Feed Search that works (despite Bloglines being owned by a search company, there’s was never helpful).

The same basic experience repeated itself this week, this time from Yahoo. While the majority of people use for online bookmarking, I’d jumped on Yahoo’s other service: My Web, mostly because it saved the page contents for you to search through in addition to the page title and tagging. However, a month or so ago, the RSS feed for my public bookmarks started showing junk. That was fixed within a week, but it started happening again this week. Now I can’t even log in to the site. I filled out some tech support form I found on Yahoo (not that easy to find), but I’ve gotten no response. I’ve been able to access the bookmarks through another view (Yahoo’s “My Bookmarks”), exported them, and am now importing them to Hopefully Yahoo will maintain that a little better.

I guess in once sense this is same feeling everyone who bet on one of several competing technologies and lost feels. There were real benefits that led me to pick the apps I did, but the world didn’t agree, and now I’ve paid the price for sticking with losers too long. Luckily some level of data portability has made that price a lot lower than it could have been.

Update: There are two new feeds you might want to track due to this change:

You can also get these changes automatically using my all-in-one Yahoo Pipes feed.

Saturday, February 23, 2008

Job Change

You know my blog’s neglected when I don’t even think to announce a change of job until the weekend after starting at the new place. On Monday I started working at Cormine Intelligent Data.

Thursday, February 14, 2008

Definitely, Maybe

I just watched Definitely, Maybe with Diane as our Valentine’s day thing. It was fantastically cute and sweet. Ryan Reynolds was funny and charming, as usual. Isla Fischer was very likeable and adorable. Abigail Breslin, however, stole the show as the precocious and completely sweet daughter. I found the movie very enjoyable, though I am a total sucker for all forms of romantic comedies.