For the last 8 months or so, I've been contributing to Thomas Reynolds' open source project Middleman. Middleman is a Ruby framework for building static websites using all the nice tools (Haml, Sass, Compass, CoffeeScript, partials, layouts, etc.) that we're used to from the Ruby on Rails world, and then some. This website is built with Middleman, and I think it's the best way to put together a site that doesn't need dynamic content. Since I started working on Middleman in November 2011, I've been contributing to the as-yet-unreleased version 3.0, which overhauls almost every part of the framework. Today, after many betas and release candidates, Middleman 3.0 is finally released and ready for general use, and I'm really proud of what I've been able to help build.more
As an emacs user, I've found iswitchb (interactive-switch-buffers) to be a huge time saver. Basically, to switch files (buffers) you enter a typically byzantine key combination and then type to search through your open files - as less and less files...more
Back in the days of OS X 10.1 I wasn't a really big fan of the striped backgrounds, overblown transparency, and over-the-top animations Apple was using to show off their new desktop. However, in the last few releases they've tightened up the look of...more
I haven't been updating this blog too much recently. I never meant for this blog to run on a schedule, but I did intend to post more frequently than this. My original idea was that the blog would serve two major purposes. First, it is a place for me to announce new projects or updates to software and websites I've already released. It's done that quite well, though I haven't had much to announce recently. My job has been taking the majority of my development time, and most of the projects I've been working on at home are either private or haven't been released in the form I'd like to because my employer hasn't approved them for release yet.
The second major purpose for my blog is as a place for me to record the solution to problems I run across while developing software, so that others won't have to spend hours Googling or using trial and error to come to the same conclusion. I didn't intend to rehash things that were easily found or that had already been discussed - only to post when I felt it was something that added value to the internet that hadn't been there before. So a lot of the blog posts are not really a narrative or running commentary - they're not meant to be subscribed to, but found individually. It's for this reason that my most popular posts tend to include the exact text of error messages. This type of post has suffered both because I haven't been doing as much development, because I can't discuss a lot of what I've learned due to the nature of the projects I'm working on, and because I've been learning new stuff (like Ruby on Rails) and haven't done enough to have solved problems others haven't already posted solutions for.
The third reason I have this blog is to occasionally talk about my thoughts on different technical topics, from web development to video games. Again, I don't like to make a post unless I think I'm adding something new, and most of the topics I've wanted to talk about have already been covered. I had a lot of draft posts sitting around about web development, web standards, and the evolution of browsers, but then I discovered Alex Russell's blog and it turns out he's already said most of what I wanted to say, and better than I could. Other stuff, like my impressions of Windows Vista, critique of stackoverflow.com and suggestions for the Xbox Live Arcade lineup, have been covered to my satisfaction in plenty of places. Maybe some of them will end up posted, but probably not.
Another part of the reason I haven't posted much is the sheer weight of unfinished posts I have. Right now I have 64 drafts and only 52 real posts! So I'm going to attempt to clear things out by writing a little about what I haven't posted. A lot of this stuff wasn't posted because it fell under that third point above, but some of it I was just too lazy to flesh out into real posts. Some of it's just random stuff. So here's what's been happening in the last year:more
Every time I try to set up IIS7 on a Windows Vista machine I run into the same series of problems. You'd think I'd have learned by now, but I usually just struggle through the cryptic error messages and get it working one way or another, then forget about it until the next time I need IIS7 on a machine that doesn't have it. Finally I'd had enough and so I decided to write myself a little guide here so I won't waste as much time next time. These instructions are basically the same as these, but with additional detail and screenshots.more
I was working on a web app a couple weeks ago when I hit a weird problem. I had a sidebar floated right, and an unordered list right next to it. What was weird is that each list item was getting “pushed aside” by the floated sidebar. This went against...more
Like most Americans, I've been using the AOL Instant Messenger IM network for the last 10 years or so. As I've made more friends who prefer other networks, I expanded to multi-platform IM clients that let me sign into all the major IM networks at once...more
This weekend I decided to go through the hodgepodge of common code that's shared between a lot of my ASP.NET websites and refactor it a bit. I'd only just learned about the magic of HttpModules and HttpHandlers, and I immediately saw a lot of canidates in my copy-paste code and global.asax handlers where a HttpModule would be a better solution. One of these was the code I was using to redirect old pages to new pages whenever I moved them. For example, at some point I had moved http://www.numbera.com/rome/tools.aspx to http://www.numbera.com/rome/tools/, and I wanted anyone who visited the old URL to get redirected to the new one. Previously, I just had some code in global.asax that hooked Application_OnError, checked to see if it was an HttpException (a 404 file not found, specifically), and then redirected if it knew where the file really was. Pretty simple, but not very general. So I broke it out into an HttpModule that basically did the same thing, but no longer required me to cut and paste code into my global.asax. However, one improvement I wanted to make was to allow for configuration through my web.config file, instead of having to hardcode an if/else tree for each redirect. I basically wanted to have a section in my web.config like this:
<configSections> <sectionGroup name="brh.web"> <section name="redirectOldUrls" type="Brh.Web.RedirectConfigurationHandler, Brh.Web.Utility" /> </sectionGroup> </configSections> <brh.web> <redirectOldUrls> <redirect filePattern="tools.aspx" url="~/tools/" /> <redirect filePattern="strategy.aspx" url="~/strategy/" /> <redirect filePattern="military_people.aspx" url="~/people/" /> <redirect filePattern="history.aspx" url="~/history/" /> <redirect filePattern="teacher.aspx" url="~/teacher/" /> </redirectOldUrls> </brh.web>more
It seems these days that everyone has a blog (or two). There are big news blogs, little blogs with useful articles (such as the many C# blogs I read), the countless teenagers with MySpace or livejournal blogs. There are blogs about tech, politics,...more