RSS Mix

Mix ID 4035

XML

You can use the feeds in this mix as the basis for a new mix - create a new mix from this mix.

BleakHouse [New Window]
Ive officially added Evan Weaver to my feeds.

Form Widgets [New Window]
I think we can safely skip text fields and text areas, and get down to something a little more interesting.Boolean DataIn my mind, Boolean data (true or false, yes or no, on or off) is best handled with a checkbox, yet its quite common to see two radio buttons or a select widget with two options instead. Checkboxes represent the smallest number of elements on the page the user needs to absorb or interpretthe current state of the checkbox (checked or unchecked), and the text associated with that checkbox. Changing the state of the checkbox requires minimal use of the mouse or keyboard and can be done with one click in one place. As an added bonus, the text is usually positioned right next to the checkbox itself, providing a close visual association.Radio buttons on the other hand require the user to absorb perhaps five elements on the page the text associated with the radio button group, the state of the two radio buttons, and the two text labels associated with the radio buttons. Changing the state of the radio button group requires a bit more movement of the mouse or a few more keystrokes to achieve the same result. The final blow for radio buttons is that theyll take up 23 lines of vertical space on the form, and the checkbox will only need one.I dont really see select boxes as a contender at all they require far too much mouse or keyboard interaction to make a selection and you cant see the possible values until you activate the widget.So, if the checkbox is such a clear winner, why do some designers and developers stray from the path? I think it all depends on how you label the Boolean field. If the text label can be written as a true/false statement (like I agree to the terms and conditions or Make this article visible on the website), then everything makes more sense. Article Status requires the user to answer live or draft, but This Article is visible simply requires a yes or no.Id love to see some examples of a Boolean field where a checkbox doesnt work, but in my mind, its a winner.One-to-one RelationshipsAn article belongs to a particular section of the website, a weblog post belongs to an author, a page belongs to a book, a video belongs to a user, etc.My knee-jerk reaction here has always been a box, and in most cases I believe its the right choice. They take up very little vertical space, can be styled to fit in almost any amount of horizontal space, only allow one item to be selected at any time and arent difficult for users to understand and absorb.The alternative is a group of radio buttons. What I really like about radio buttons is that for a small group of options (like the status of an article progressing from draft to waiting for approval, approved and finally published) the user can easily see all the options available to them. But for long lists, theyre prohibitive.So, could we agree on an arbitrary number of options (like 5) for which we automatically know to use one or the other, or is it really the combination of the number of options and the context in which theyre being used that dictates what we do?One-to-many RelationshipsWhen you look at the standard HTML form widget set (yes, I plan to look at non-standard widgets in a future article), the only real contenders for classic problems such as an article belonging to many categories, a programmer knowing many languages or a building servicing many suburbs is a group checkboxes or a combination select box.The fact that most websites that use combo select boxes usually have to include a line or two of text explaining how to use it should be a dead give away that these things are awkward. You have to hold down particular key combinations to make multiple selections and its far too easy to make mistakes.In contrast, a group of checkboxes are much easier to use, understand and interpret. Theyre much for forgiving of mistakes, and since theres no scrolling, its easy to absorb the current state of the entire group.But a list of 200 checkboxes for book categories just isnt going to work. Itll overwhelm the user with information and take up a prohibitive amount of real estate within the interface. Despite their awkward nature, a combination select box showing the options in a scrollable widget is really the only viable standard solution for large collections.So if we can agree that checkboxes work best for small sets of options, and combination select boxes work best for large sets, can we agree on an arbitrary number of items that helps us decide which widget to use?I personally think combination select boxes are particularly awkward to use if theres any less than 10 items showing (using the size attribute), so perhaps the magic number is 10?Its worth pointing out that there are many many other solutions to this problem, including Flickrs use of a regular plain text field which allows the user to both create and select new relationships by parsing a string of text for the tagging of photos, which I do think works well in this case. Im going to explore some of these in more detail in a future article.Dates & TimesThe three popular solutions to this problem are:a rigid set of select boxes for the year, month, day, hour, minute and seconds (which Rails uses by default)a single text field that accepts/expects the the date (and time) in a particular pattern (like 7/21/2006)a single text field that accepts almost any human date string (like next tuesday 5pm) and converts it to a real date and time on the server-sideWithout a doubt, its much easier for the user to type 7/21/2006 or next tuesday than it is to manipulate 36 select widgets with the keyboard or mouse, but you have less control over the quality of the data input (does 6/7/06 mean July 6th or June 7th?), and have to do a lot more work elsewhere.Pop-up calendars and clocks to help the user select the right date and time are quite popular, but Im trying to focus on standard HTML widgets for the moment. Where am I headed with this?We each have our own particular way of building interfaces and forms. Im working on some yet-to-be-announced-at-all open source software which could greatly benefit from the collective knowledge and opinions of my readers, but I also just enjoy watching patterns emerge and solidify.Id also like to analyse the plethora one-to-many relationship solutions out there in much greater detail (especially tagging), explore & propose a solution or two of my own, and maybe even try to agree on some basic guidelines.Your comments, opinions, experiences and examples are warmly welcomed.

Number 5 [New Window]
Australia is number 5 in the number of Rails developers per capita, according to Aslak and Working with Rails.Where are you all hiding?

Stupid Bash Tricks [New Window]
So, Im lazy. Koz says I way overuse Bash aliases, but if Im going to run rake test one hundred times a day, Id much rather just type rt. For what its worth, I also had rtf for functionals and rtu for units.But what I really wanted was rtu to run all the unit tests, and rtu foo to run ruby test/unit/foo_test.rb. So good bye bash aliases and hello bash functions! alias rt='rake test' rtu() { if [ "$#" = 1 ]; then ruby test/unit/$1_test.rb; else rake test:units; fi } rtf() { if [ "$#" = 1 ]; then ruby test/functional/$1_controller_test.rb; else rake test:functionals; fi }Throw that stuff into ~/.bash_profile, open a new Terminal, cd into the RAILS_ROOT for one of your Rails projects and enjoy!While we were experimenting with all this, Grant and Mark pulled out a few more things from their bag of tricks, so I went and bought yet another domain Ill never do anything with.Oh, and the new job is going really well, thanks for asking!

A small, small announcement [New Window]
Im certain hardly any one cares, but Ive made a decision. If you want me to buy things from your online store, I should be able to do it without signing up for an account, agreeing to a 3000-word legal document or fighting to ensure you dont add me to your email lists.What is this, the 90s?

Optionally Nested Controllers [New Window]
Ive seen this asked a few times in #rubyonrails and #roro IRC channels, so rather than knock up a code example every time, maybe I can just point people here.The ProblemSome people like nested resource URLs like /people/21/images/45, instead of flat URLs like /images/45, and some people like to have both accessible as options. Rails Routing can do this easy. Some people consider these two different resources, so theyll have an ImagesController and a PeopleImagesController. Others think thats horribly repetitive for what theyre doing with their code, so they want it all to go through one ImagesController with an optional parent object or scoping.This is for those people, scratching their heads, wondering how thats done cleanly.A Solution (though most certainly not the only solution) class ImagesController < ApplicationController def index @images = parent.find(:all) end def show @image = parent.find(params[:id]) end def new @image = parent.new end # ... protected def parent params[:person_id] ? Person.find(params[:person_id]).images : Image end endBut what does it do?Given the URL /people/24/images/..., params[:person_id] will be set. If it's found @parent returns an images collection scoped to that person upon which we can perform our find, new, create (etc) methods on. If its not present, we just do them directly on the Image class.Its scoped to the person if there is one in the URL, and isnt if there isnt.There are many ways to tackle this kind of problem, and plugins like make_resourceful do similar things and are a great kick in the right direction.

You Don't Need a Development Manager [New Window]
Some interesting things have happened at RedBubble over the last year (already?). One thats been at the forefront of my thinking over the last few weeks is how we dont seem to need a Development Manager at all.We had one. It wasnt me, but Ive been there before. It was the typical role, with the usual stuff:know the system, be sure it workslead the team & make sure things get donemake sure the business doesnt hassle the developers with crazy ideas and scope creepmake sure the dev team is happy and productivemanage the project timeline and backlogestimate and plan out the dev teams timeargue over deadlinestranslate requirements into tasks and stories that can be implementedmanage expectationsAdopting a more agile development process (Scrum, or something like it, if youre interested) certainly removed a lot of the crap from this role and pushed things in the right direction, but it still didnt work out.Really, this is far too much work for one person to do well, so whats the point? The role stinks of big business, it gets in the way of actually doing stuff, it frustrates the shit out of everyone and its absolutely destined to fail in a start-up environment.None of this is the managers fault, by the way.What do we do instead? As a team, we manage the team. We have smart people with a complimentary and multidisciplinary skill set, so we farm out different parts of the role amongst ourselves.Pete (the boss) took on all the human resources stuff and assumed. I took on a lot of the iteration planning & day-to-day leadership. John and Dave took on the systems architecture. Grant , Kath and Xavier all pushed in new directions to pick up the slack. The entire team helps with bugs, planning and estimation. We basically self-organise and keep each other in line.No-one stands between the person who needs stuff done and the person who can do it, no one holds everything in their head, no one plays the role of the gatekeeper and no one has the impressive title on their business card.Were getting things done faster this way, no doubt, and thats incredibly important for a start-up.However, this huge pay-off would not be possible without some boundaries and an open, honest dialogue we know how much work we can do in an average week, so were not asked to commit to anything unrealistic, and were quite comfortable telling Pete that hes asking us to build something far too vague, or that his cheeky 1 hour simple text changes card was incredibly optimistic.Theres an overhead to this of course. The time we spend managing ourselves is time we dont spend writing code or pushing pixels around, but Im convinced were still way in front.If youre looking to hire a manager, I can highly recommend sniffing around inside your own team first. Or if your manager is overloaded (they all are, right?) dont tell them to suck it up ask them what they can offload to others in the team to free up some time.

"Mind the Gap Please" [New Window]
So here we are in London. We had a one night stopover in Singapore which was great (call me crazy, but it felt just like Melbourne, only bigger), then a 13 hour flight to Heathrow.We spent a few days hanging out with Nat (the wonderful Aussie ex-pat who set Kate and me up about 4 years back), looked at lots of old buildings Cantebury and Rochester, and now were here in the middle of an absolutely amazing city with so much history.Were here for a few more days (Portabello Market tomorrow, and a bus tour out to Stone Henge on Monday), then we get the Eurostar across to Paris for a few days of awkwardness (neither of us can speak a word of French, which is probably even more confusing given my surname), shortly followed by a flight to Berlin for a few days of sightseeing and RailsConf Europe.Yes, the credit card is going to get a work-out.See (some of) you in Berlin for beers and geek stuff.

Comments are off for a bit [New Window]
Hooray for spammers. Ive never been a big fan of comments anyway, so maybe Ill accidentally leave them off for good. Who knows.

An Introduction to RDoc [New Window]

Here's what not to do if you want to hire me [New Window]
Weve got a rails/ajax project and found your name on rubyonrails.org. Email me if youre interested.I dont care about the technology. Of course I want to work with Ruby/Rails, of course a little bit of AJAX here and there would probably help the user experience, but thats all tech. Youve told me nothing about the company, its goals, the value proposition or anything of real substance.Oh, and youve also made it seem like youve basically screen-scraped the Rails wiki and chosen to email everyone available for hire because you havent shown any indication that you know me or my work, in which case I can only assume its not me you want to hire at all its someone.Maybe thats the problem. They want people to work for them, and Im used to working with them. Perhaps Im spoilt.

What's up with the Safari 3 Beta? [New Window]
It actually installs over the top of Safari 2, which means without two computers, you cant compare the two rendering engines side by side or retain Safari 2 as your browser whilst checking out the progress of Safari 3.It also means that I had to uninstall incompatible plugins (Saft, for example), and I think it crapped on other WebKit-based applications on my system (like Pyro). And it required a restart (gasp!).Im sure theres a sufficient excuse, but why couldnt it be a stand-alone application?Its at least a little amusing that it was easier for me to check out Safari 3 on Windows XP than it was on OS X, and that I was looking at Safari inside Windows inside a Mac via Parallels.Oh well. The Windows version looks pretty damn slick, and Im pretty impressed they went the whole way on things like font rendering WebKit for Windows in general is exciting.

Photoshop/mouse help, please! (fixed) [New Window]
So, something strange started happening in Photoshop (7.01, yes Im old school) over the past few days, and Ive run out of possible causes and solutions.In short, when I single click on a tool in the Tools pallet that has more than one option (like the Marquee selection tool), it instantly shows me all choices for that tool (elliptical, single column, single row, etc) rather than just selecting the top tool. Until recently, Id have to click-and-hold to get these options and indeed thats still the behaviour I get in illustrator.At first I thought it was the new Microsoft mouse, so I unplugged that and switched back to the Mighty Mouse. No luck. I uninstalled the Microsoft mouse software, no luck. I then noticed that I get the same behaviour using the Powerbooks built-in mouse button (but interestingly, not when tapping the trackpad itself).I trashed any Photoshop related preference and setting files I could find in ~/Library/ and ~/Library/Preferences/, I upgraded from Photoshop 7.0 to 7.0.1, I did some rudimentary Googling, I stared at the Photoshop and OS X preferences and restarted the system many many times along the way.No such luck.Yes, Ill be grabbing the universal binary Photoshop CS3 when its released, but (with the exception of the new Microsoft mouse) this is a hardware and software set-up Ive been using for months on end without any trouble.Any ideas on where I should be looking or what it might be, Id really love to hear from you in the comments of by email.Update: Ok, went to the Adobe site and downloaded any plugin or update that they have for Photoshop 7.0.x, and one of them (the AltivecCore Update, which is for G4 processors was the one, I think) managed to fix the problem. Dont look at me for answers, and Im reluctant to go tinkering if it aint broke, dont fix it.

Wanted [New Window]
I bought oneI really like itIt works greatIt doesnt hurt my hand after 12 hours workI got a real job in an officeI need a second mouse for the real jobMicrosoft has discontinued the IntellimouseMicrosoft has replaced it with another mouseI dont really like the replacement mouse, but thats kind of irrelevantThe replacement mouse (and the Mighty Mouse, and most new mice on the market) have a higher resolution than the Intellimouse I love so muchI cant use a different resolution mouse at home and at work because it affects the track speedI really dont feel like buying two new mice with matching resolutionsFailing that, if I really have to go and buy two friggin matching mice, can anyone recommend the Logitech MX Revolution or perhaps something else I should take a look at?

Hello, Install This Plugin Now [New Window]
Courtesy of Robby Russell, I just stumbled upon Josh Goebels dev_mode_performance_fixes plugin, which really does seem to work as advertised.Clicking around the RedBubble application in development mode feels way faster 6x faster at least, mainly because we have stacks of image-heavy pages, with each image passed through the Rails stack on every request (yeah, theyre cached in production, but development mode is just painfully slow out-of-the-box).So far, so good. Most changes seem to be picked up without restarting Mongrel (although a few random changes to inherited controllers needed a restart).Three cheers!

Australian Ruby and Rails Communities [New Window]
There was/is a Sydney-centric discussion list on rubyonrails.com.au, but I believe theyre hoping to migrate everyone over toRuby on Rails Oceania Google Group freshly created, its A forum for Ruby on Rails developers in Australia and New Zealand. which I found viaMelbourne Ruby Google GroupRailsCamp 07 a Webjam and Barcamp inspired weekend of Rails hacking one hour north of Sydney June 1518, 2007Sydney Ruby User GroupBRRB: Brisbane Ruby User GroupPort80 Ruby on Rails forum

It Only Takes a Minute [New Window]
Next week, amongst many other far more interesting things, RedBubble will be rolling out a small change asking our artists to specify the currency in which they wish to be paid.We started out just using their browsing preference (show me prices in USD), but it turns out that if they change this along the way, it creates major accounting headaches which wed rather not write software to dance around right now (bigger fish, etc).So, the solution is a browsing preference (change it as often as you like) and a payment preference (cant be easily changed).Xavier could have easily pushed it out the door with some dry cannot be changed text, but it only took him a few seconds longer to go the extra mile and make that text a little warmer, informative and personal:Which currency would you like to be paid in? For reasons only our accountant understands, this cannot be changed after you have set it.Copywriting is Interface Design, and I think its really important that teams are encouraged to inject a little bit of their own personality and natural language into their work wherever possible.

26 hours of waiting [New Window]

Hotspotr Wifi Cafes and Hotspots [New Window]

Design Police [New Window]
(Via co-worker Ben)

Ruby Newbie Night Success [New Window]
Last nights Ruby Newbie Night organised by the Melbourne Ruby Group was a great success, and Im going to try much harder to attend the monthly meetings.Thanks (and perhaps sorry!) for letting me speak about rake, helpers and layouts/views.

The Leopard upgrade, and the stuff I still can't live without [New Window]
I finally dusted off that Leopard disc on my desk and installed it yesterday. Rather than an upgrade, I choose to clone Tiger onto an external drive with SuperDuper!, then installed Leopard on a clean hard drive.Much like renting (where youre forced to contemplate the value of everything you own every year or two as you move around), I really love the opportunity to start fresh with a new OS, ensuring that (at least for a while) everything you install is something you really need.The results are pretty interesting after 24 hours.my Applications folder is just 499mb, down from 2.3GB (!) with at least 20 fewer apps installedmy Library is less than half its original 3GB of bloatthe system Library is nearly 5GB, but its dropped down from 14in total, Ive got an extra 50GB of disk space I didnt have yesterdayWhat survived? With some obvious exceptions, its mostly stuff from indie developers:Installed within 5 minutes:QuicksilverTextMateLittle Secrets (it holds all my usernames, passwords and miscellaneous details for pretty much everything in my life)Installed within an hour:Things (it now rules my life)AppZapper (it was handy for tracking down files on my Tiger install that my favorite apps depended on, like preference files and bundles)iLife 08iWork 08Installed within 24 hours:CocoaMySQL-SBGLinotype FontExplorer XNetNewsWireAdobe CS3Predicted installs in the next week:OmniGraffleQuinnParallelsSuperDuper!Flip4MacSome other things I had to do really quick:I dont even use the scroll arrows much, but I still had to move them to the top and bottom (rather than both at the bottom) because even after all this time, they still distract meAllans tips for getting option-left and option-right to act like the rest of OS X when using Terminal (skipping back and forward one word) is pretty much all need to do to feel at home in Terminal

Me, RedBubble and You [New Window]
Back in late September or early October sometime I was surfing the 37signals job board researching Rails jobs in Australia (no, I wasnt actually looking for a new gig), when I recognised a name in one of the ads, James Pierce.After a quick chat about the company, culture & development environment, it became quite clear that this wasnt the sort of opportunity that presents itself very often in Australia (let alone on my doorstep in Melbourne), and Id be a fool not to take it.Of course the downside of taking up the position at RedBubble was that Id be waving good bye to nearly 2 years of blood, sweat and tears invested in Joyent/TextDrive. Id be saying good bye to some amazing people, a strong community, good friends, a talented development team and things like Strongspace, (essentially my first born child).But I can comfortably say it was all worth it. Change is an amazing thing, and I couldnt be happier.The good news for you (if youre a talented web developer located in Melbourne, Australia) is that were hiring. So what is RedBubble? I think Ill just borrow a few lines from the job posting:Redbubble is small but well funded Australian company building a web site where designers, authors, illustrators, musicians and other creative people can upload their work to share and sell online. We take care of the logistics, production and distribution.Well be launching in Australia very soon, but in the meantime, theres a short video on YouTube if you want to learn a bit more.

Floating legends in Firefox. Fail. [New Window]
So I was trying to get a legend inside a fieldset to float left, so that I could float some radio inputs against it for a pretty standard horizontal form layout.Works fine in Safari, wont do it in Firefox. Replacing the legend with a div or a p or pretty much any block level element works, but Im trying to be semantic if possible,Finally, I search Bugzilla, and woop, there it is. The built-in browser stylesheet uses !important in two of its declarations:legend { padding-left: 2px; padding-right: 2px; border: none; position: static ! important; float: none ! important;}!important is the necessary evil of CSS, but Im pretty sure it has no place in a base browser stylesheet (upon which all author and user stylesheets cascade).So I started experimenting:nesting a span inside the legend and styling that didnt work outnesting a div inside the legend and styling that worked in Firefox, but broke Safariwrapping the legend in a div with styling worked in Safari, but no love from FirefoxAnd then Grant reminds me that youre supposed to be able to override !important styles with new !important styles if you match (or better) the specificity of the rule. Tried that, still no love from Firefox.So this is about the point where I assume theres something special going on in Firefox, or something swept under the carpet, turn to the wider internet for help, and probably use something less semantic like a h2 or a p.Any ideas?

Balanced Iteration Planning [New Window]
RedBubble does agile development its our own blend, but I guess it aligns best with the goals of Scrum).Both myself (something like a team leader) and Pete (something like a product owner) both independently came up with an interesting proposal for creating a balanced iteration, so were going to give it a try.Our backlog is overflowing with stories that were itching to build, and they each represent real value to the business. We cant do them all, its hard to stay focused, and its hard to say no to things we obviously need.Typically the backlog consists of three types of stories:big things that will win the war and align well with our long-term goals as a companyuseful things that the community has been asking for (and which we agree they need)shitty things that we arent excited about, but we have to doIn any given iteration (in our case, a week) were going to try to deliver a balance of the three.stay on trackshow some lovedo what we have to doUpdate: An iChat conversation with James led us to the idea that its quite similar to a balanced diet everyone knows what it is, and everyone knows why its a good idea, but occasionally (or frequently for some) the lure of tasty snacks and sugary treats pulls us away from things we know were supposed to be eating for our long-term health.Ill let you know how it goes in a few weeks.

Introducing Meta Serif [New Window]
The most influential sans serif of the digital revolution now has a serif companion. November Font Shop newsletter

HTTP Errors [New Window]
HTTP Errors via Dave Cheney, our fearless sysadmin.

RedBubble is Hiring a Web Designer [New Window]
Copied straight from our ad on 37signals Job Board:RedBubble is looking for a standards-based web designer to help create polished user interfaces. Wed really like to meet someone with strong front-end development skills (youll know what that entails), as well as the visual design nous required to create usable and elegant screens.Standards-based CSS & XHTML, and an eye for visual design are required. Exposure to SEO techniques, Unix command line skillz and source control are all nice to have. Experience with scripting languages is a plus. Our sites built with Rails, so experience with Ruby would have us doing backflips, though its not a requirement. If youre an experienced designer, and you know your HEAD from your POST, get in touch with Pete at jobs@redbubble.com.About us: RedBubble is an Australian company building a web site where creative people can share and sell their work online. Location: Melbourne, Australia.

Web Directions 07: The Myths of Innovation [New Window]
Ah screw it its much easier to just write about all these Web Directions things individually, rather than some mythical mega-post.Scott Berkun gave another great presentation on The Myths of Innovation. Ive placed an order for his book and subscribed to his feed.

Multi Safari [New Window]
In the comments on my previous Safari 3 rant, Michel Fortin points out that he has a bunch of stand-alone Safari builds available for download:These special versions of Safari use the original Web Kit framework that came with them, bundled inside the application. They will mimic original Safari rendering and javascript behaviours. HTTP requests and cookies however are still handled by the system and may not work exactly the same.Thank you!This leaves me wondering why the Safari 3 Beta couldnt have been made available as a stand-alone app with its own embedded Web Kit, or at least that this was available as an option.

Overheard [New Window]
I reckon we apply the 80/20 rule to this IE bug on writing its 80% working, and well fix it in about 20 iterations Grant Bissett, RedBubble

Wouldn't it be great [New Window]
Now, Im just thinking out loud here, but maybe this (imaginary CSS): #people { border:1px solid #000; padding:10px; .person { margin-bottom:10px; padding:10px; border:1px solid red; h3 { font-weight:bold; margin-bottom:.5em; } p { color:white; font-size:.9em; } } }Would make more sense than this (legit CSS): #people { border:1px solid #000; padding:10px; } #people .person { margin-bottom:10px; padding:10px; border:1px solid red; } #people .person h3 { font-weight:bold; margin-bottom:.5em; } #people .person p { color:white; font-size:.9em; }Just askin

Rituals [New Window]
Rituals have become a massive part of RedBubble culture over the last few months. Our build cycles are based loosely around one month chunks of work, with weekly iterations inside them, with daily bursts of work inside each of those.Each of them is punctuated by some form of gathering a 5 minute daily standup, an hour-long weekly demo/review of the work weve done, and a longer monthly get together to talk about where weve been, and where were headed.That probably sounds like a whole lot of meetings, but theyre typically not the toxic kind of meeting that everyone hates. Especially the daily stand-up.The beauty of all these rituals is that they add some form of structure to the whirlwind of chaos were working in. You vent, complain, boast, clear your mind, reset your focus and get back to it.And the RedBubble community is picking up on these rituals and embracing them wholeheartedly. We release whatever weve done almost every week, so Thursday has become RedBubble Thursday a celebration of what weve delivered, and what were doing next.The wow, yay and thank you comments flood in just seconds after we announce the changes, and it seems to inject a massive dose of energy into the community. They see this thing changing and evolving in front of them, they see us responding to their needs and they see us pull out a few tricks and surprises they never expected.Most agile development books go into these rituals in much more detail, and Im almost certain most books about communities on the web would have plenty to say about it too.

Lilu Templating Language [New Window]
Wow. Of all the template languages Im seeing pop up for Ruby or Rails, Lilu is by far the biggest shift in thinking.You define your templates as real, valid HTML mockup that can be viewed, validated and used independently of your application (say, by your hard-core HTML/CSS guru that cant stand fiddling around with Erb), then Lilu kicks in and replaces portions of the HTML as part of the rendering process.Its a really interesting separation of design and logic, if thats what youre after. Your HTML geek sticks to HTML, your programming geek can then apply the business logic and real content to the HTML with Ruby.Quick example from the wiki: update('#username').with(@user.login) if logged_in?Theres also some slides from Yurii Rashkovskiis presentation.Thank you Yurri, and thank you Johan for the heads-up. Im definitely going to have a play with this!

Any? [New Window]
Behold! Ruby weirdness. So I was hanging out in our utterly messy views, and thought to myself what I want is the opposite of Array#empty?, and Id call it Array#any?.So I fire up the console and have a play.>> [].any?=> false>> [1,2].any?=> trueFantastic! But wait, Xavier shows me the dark side of any?:>> [false].any?=> falseGah, so any? returns true if any of the values in the Array are true, not if theres something (anything) in the Array, as Id hoped. I guess someone, at some point, had a reason for that.Of course !my_array.empty? is the answer, but I like even better answers.

New Apple Website [New Window]
Theres plenty of talk in my feeds about WWDC, Safari and iPhone, but nothing much about the new apple.com redesign which I think is utterly beautiful.Ive often looked at the old Apple site for inspiration the mini sites for things like the iPhone or Aperture but I always had to ignore the old-school plastic tabs and sub-navigation.Much in the same way that Apples experimentation with the iLife UI has led to the new UI for Leopard (very much like iTunes, very nice), its clear to see that Apples web team has been experimenting with this new layout for a long time, and this redesign ties everything together beautifully.Its also worth noting that .Mac and Quicktime have disappeared from the main navigation, and that the new set of tabs maps quite nicely to Apple as we now know them Apple, Store, Mac, iPod+iTunes, iPhone, etc. This is a great improvement to the information architecture, and really outlines Apple as a company.Id love to know whos on Apples web team, and what the workflow is like. I find it odd that I know so little about a team that produces work I respect so much.

Yahoo's UI Library [New Window]
Before I go much further, heres some links:YUI Fonts CSSYUI Grids CSSYUI Reset CSSIm not sure what to think of the fonts library right now (it seems to be based on some pretty big assumptions), but lets take a look at the other two, because they tie in nicely with my views on the reuse and separation of CSS as discussed in my Stylesheet Sanity series (1, 2).Whether you use Yahoos library, or write your own, I feel this stuff is extremely important. ResetHaving a stylesheet foundation like Yahoos reset.css that normalises1 the basic display of a page across all modern web browsers means youre throwing out assumptions about each browsers default styles, and replacing those assumptions with facts.GridsAgain, I havent studied this in detail, and my initial reaction is that they seem to favour short and cryptic class names over something more obvious and descriptive, but this looks like powerful stuff. Youre being handed the tools to deal with almost any kind of CSS layout by standardising the ids and classes of your container divs.The key here is that the library (this library, or any other library), combined with standardised naming conventions for your mark-up means you can achieve some pretty amazing results quickly and reliably.Looking back to part 2, I was able to quickly and reliably apply the TextDrive.com redesign to a range of other related sites (like our weblog, the help desk and many more) by standardising my mark-ups containers, and breaking the reusable parts of my CSS into separate files. I was also able to reuse base.css (my crappy equivalent of Yahoos reset.css) on some completely unrelated sites and save myself some time.SeriouslyJust say no to those monstrous all-in-one stylesheets you see on your favourite websites. Its madness to start with a blank canvas over and over and over again. Find or build some libraries that can give you a solid starting point.Keep them in version control so that you can easily access them or update them across multiple websites.Make a conscious effort to standardise your mark-up wherever possible.Break your styles up into separate files which can be used across many websites, across just a particular website, or across just a particular section of the site, and include them only when theyre needed.If you spend a substantial amount of time on a nice chunk of CSS that does something youre likely to do over and over and over again, break it out into its own file (eg calendar.css), make it as generic and reusable as you can, then include it, override it and build on it each time you have to solve that problem again.1 Yes, Im allowed to use an s instead of a z because Im an Australian.

DataMapper [New Window]
DataMapper is an Object Relational Mapper written in Ruby. The goal is to create an ORM which is fast, thread-safe and feature rich.Looks like something interesting to try out alongside Sinatra next time I need to hack together a quick database-backed website and would rather not eat up 60+meg of RAM for each Mongrel.Found a bug or want a feature? Tired of dealing with the bureaucracy that other ORM maintainers force upon you?Gee, I wonder which ORM theyre talking about?

Staginated [New Window]
Stageinated, verb. Used with object. The act of pushing a particular code revision or feature out to the staging server with Capistrano. Origin deep within the RedBubble development team, probably me.

Coding for Content [New Window]

Colour T-Shirts [New Window]
Heres a little something from my portfolio:Were still a little while away from being able to print the white base (that means no black tees yet, and if you print red ink on a red tee, itll just disappear), but Im a huge fan of red tees with black ink, so Im going to be spending big this week.Were also shipping globally and allowing sellers from anywhere in the world (previously it was just those of us living upside-down with a pet Kangaroo), so go buy one of my tees and make me rich!Better still, sign-up and add some of your own art and designs.

Silverlight [New Window]
Silverlight is a cross-browser, cross-platform plug-in for delivering the next generation of .NET-based media experiences and rich interactive applications (RIAs) for the Web. Silverlight offers a flexible programming model that supports AJAX, Visual Basic .NET, C#, Python, and Ruby and integrates with existing Web applications. Silverlight media capabilities include fast, cost-effective delivery of high-quality audio and video to all major browsers including Mozilla Firefox, Apple Safari, and Windows Internet Explorer running on Mac OS or Microsoft Windows. By using Microsoft Expression Studio and Microsoft Visual Studio, designers and developers can collaborate more effectively using the skills they have today to light up the Web of tomorrow.Uh huh. Good to see all the buzz-words could make it in!

Why I Think Shopify is Great [New Window]
Its been a long, long wait for this service to launch, scattered with many teasers and fragments of information along the way, and even though I have absolutely nothing to sell and no need for an online store of my own, Im quite excited.But like with any launch of a product with high expectations, there are those that are less impressed. In particular, I stumbled on this thread in the Shopify forums complaining about the 23% cut Shopify takes from your sales as a service fee (in addition to the percentage taken by PayPal or your credit card merchant).Who cares? If your store doesnt sell anything, you dont pay any fees. No hosting, no domain names, no SSL certificates, no system administrators, no security audits, etc. When you do finally sell something, Shopify (the service that helped you convert that visitor into a customer and make the sale) takes a small slice of the pie. Thats the cost of doing business through these (and similar) services.The alternative is to Do It Yourself. Find some butt-ugly open source shopping cart/e-commerce application, pay someone to install and configure it, find somewhere decent to host it, get the SSL certificates, etc. And even then, youre probably only doing a half-assed job and leaving yourself open to all sorts of security and legal concerns.Lets pluck a random number out of thin air and say that would cost $1000 to set-up one of those free shopping cart PHP monstrosities, $2050/month to host, and probably another $5001000 every year tweaking and patching the stores code base as needed.So before you even open the doors for business, the DIY store has cost $1000 more to set-up. To make that money back, youve got to make over $30,000 in sales through Shopify before that 3% even matters.Then youve got to cover the ongoing monthly costs (another $1600+ in sales each month).For those who actually manage to build an online store and customer base capable of turning over $4050k a year in sales, the 3% Shopify charges may start to seem a little steep, but for everyone else, its a great deal.Ive been freelancing and working in this industry since 1996. Ive built many websites and online stores for clients along the way. Most of them were really bad business ideas that were destined to fail. A few of them were good ideas that had some small success, and only one store made anywhere near that kind of money.In my experience, most online stores begin as either a part-time hobby, or as an experimental additional revenue stream for an established business. What Shopify does is offer a really low barrier of entry. Anyone can start up a store and dip their toes into e-commerce without any real start-up costs at all.This allows your store to prove itself in the market place for free. A year from now, if you actually have a good idea and a sound business model, found some customers and started making some serious sales, you now know that you can justify the development and infrastructure costs of running your own store, and doing it well.Until then, just remember that 3% of nothing is nothing, and that Shopify is probably saving you a truckload of cash.Whatever you or your client was going to spend on a store can now be spent on marketing, other web-related stuff, buying some more stock for the store, or even just a fancy lunch in celebration how smart you are and how much time and money you just saved.

Ruby Linguistics [New Window]
Gruber just pointed me in the direction of a very nice Ruby module called Linguistics by Michael Granger and Martin Chase.Of course it does the usual stuff like plurals, but its the Quantifications and Conjunctions that really grabbed my attention.This:animals = %w{dog cow ox chicken goose goat cow dog rooster llama pig goat dog cat cat dog cow goat goose goose ox alpaca}puts "The farm has: " + animals.en.conjunctionOutputs:The farm has: four dogs, three cows, three geese, three goats, two oxen, two cats, a chicken, a rooster, a llama, a pig, and an alpacaThoroughly impressed.

Fixtures in Rails 2.0 [New Window]
Dont know how I missed this earlier, but fixtures have had some love in Rails 2.0 this just feels so much nicer!

rbehave [New Window]
rbehave is a framework for defining and executing application requirements. Using the vocabulary of behaviour-driven development, you define a feature in terms of a Story with Scenarios that describe how the feature behaves. Using a minimum of syntax (a few quotes mostly), this becomes an executable and self-describing requirements document.That maps so incredibly close to the way we talk about our software at RedBubble, so Im very keen to have a play with this.

Write a Blogging Engine [New Window]
From Want To Learn Web Programming? Write A Blog Engine by Abhijit Nadgouda:What is the best way learning any kind of programming? Write programs! I sincerely believe that a blog engine is one of the rare pieces which employs all the basics of Web programming but can be simple enough to understand.Couldnt agree more. This is my favorite conversation point for interviewing web app developers.if you have no idea what the problem domain is (if you dont know enough about blogging), we can cut the interview short, because its clear you dont get the internet at the level I was hoping forthe problem domain is also small enough that you can hold all the pieces in your headyou can sketch the model on the back of a napkin in a Fitzroy cafEven better, we tend to interview quite a lot of PHP/Java/Python developers who want to work with the Rails framework, but if they cant talk about the model or implementation, its pretty clear to me that they havent spent much time looking into it at all. From DHHs 20-minute-video, through to Mephisto, Simplelog and even Radiant, theres plenty of resources out there.What models would we need for a simple blog? is almost a freebie, but many stumble.

Ruby-fu and Rails-fu with Err the Blog [New Window]
Theres lots of gems in here (pun intended, I guess), but some of my wow, didnt know that highlights include Day 8 (Array#to_sentence), Day 12 (Array#in_groups_of) and Day 24 (Enumerable#index_by):Man, how many times have you wanted to take an array and turn it into a hash keyed by some sort of attribute? Like maybe the ID of the element or its name? All the friggin time, right? Again, never again.Amen.Utterly worth reading, bookmarking, digging, deliciousing, passing around your development team, printing on gold leaf, miming in a game of charades, chanting, interpreting through dance and reading again.

I'll be speaking at Web Directions South [New Window]
Heres the blurb I sent them a few weeks back, from the program:Youre a great web designer. You craft beautiful interfaces, youve nailed standards based design, and youre at the top of your game. So now what? Based on real world experiences, this presentation encourages you, the modern web designer, to ignore the title on your business card and to start thinking about your real role in the development process what you have to offer, what your team really needs, and what you could do to dramatically increase your value on a daily basis.Ive tentatively titled the presentation Pushing Beyond Design, mainly because I refused to call it Designer 2.0 (or anything else with a 2.0 suffix), but Im sure you get the idea.So, I expect you all to be there in Sydney this September to heckle me from the front row.Mark Mansour (my manager at RedBubble) is also speaking and at first glance Im also looking forward to the presentations by Stephen Cox, Cameron Adams and Aaron Gustafson, but theres lots of good stuff in there.

Well, that sucked [New Window]
Man, being entertaining and interesting on stage for an hour is hard hard work. I think Ill just leave it at that!

Black Tees are Here [New Window]
Im really excited that weve finally launched black tees on RedBubble. We launched just two hours ago and the community has already started pumping out some amazing stuff.And since Im a shameless entrepreneur and want a new car, everyone should buy some of my stuff:

Frank's Compulsive Guide to Postal Addresses [New Window]

Warm and Fuzzy [New Window]
Seeing overwhelmingly positive, glowing reviews like this one of our products makes all the hard work really seem worthwhile.These are, by far, the best quality photo greeting cards I have every seen. I am pleased beyond measure. I am, in fact, tickled pink.Lessons learned? We pushed really hard to get those cards right. They consumed a lot of our resources in both tech, R&D and fulfillment and it paid off.

Web Directions 07: The Mob Rules [New Window]
The one presentation from Web Directions that remains at the very front of my mind is Mark Pesces closing keynote, The Mob Rules.I could pull a million quotes from it, or even quote the whole thing, but heres two:Google resisted the mashup. Claimed mashups violated their terms of use. Mashups come from the mob, the street finding its own use for things. The mob pushed on through; Google bowed down and obeyed. The most powerful institution of the Internet era, pushed around like a childs toy. Ponder that.Even worse, for those who are raising a hew and cry about the theft of their precious content, the more they scream, the more they thrash about, the stronger the mob becomes. Consider: filesharing has only grown more pervasive despite every attempt of every copyright holder to bring it to heel. Each move has been met with a counter-move. There is no safety in copyright, nor any arguing with the mob. Music and movies are freely and broadly available, and will remain so into the indefinite future. Sadly, were now seeing that same, sorry battle repeated in double-time as advertisers and those dependent upon them assert an authority they no longer possess.

I can't believe it took me this long to commit to Rails [New Window]
... and its only a pissy documentation patch.

It's not flattery, it's plagiarism [New Window]
Compare [site removed] to a website I designed, TextDrive.com. Looks familiar, eh? Digging through the XHTML and CSS, it clear to me that this is a derivative work.Before you go hurling email insults at them like a good little army of copyright enforcers, I have emailed them, and well see how they respond.The interesting thing really is that the visual style, XHTML and CSS for my TextDrive redesign has been stolen like this three times (that I know of) already. Each timethey claimed full copyright ownership (of course)it was for an IT or web design company claiming to offer web design servicesthey managed to take what I think (in my biassed opinion) is a quite beautiful, minimalist design and just make it so damn ugly.Its not flattering at all. I cant imagine any designer seeing variations of their stuff out there on the web and thinking hey, cool, they took hours and hours of my hard work, tweaked a few lines and claimed it as their own.Update: The redesigned website is live. Case closed. Ive removed all references to the site and company involved, because theres no point living in the past.

Stupid Browser Tricks [New Window]
javascript:window.resizeTo(923,787);window.moveTo(997,0);return;Ive saved it as the first thing in my Bookmarks Bar, so simply hitting Command-1 in Safari pushes the current window back into shape when things get a little crazy.

RailsConf 2006 [New Window]
Ill be at Joyent HQ in San Francisco from June 1522, and in Chicago for RailsConf 2006 June 2226, during which time Id really like to meet, greet, drink and eat with as many new faces as possible, so please come up and say hello.

Design, a Beautiful Web Development Bookmarklet [New Window]
This is seriously great... in-browser rulers, cross hairs, measuring things and grids. Oh yeah. For the record, I also love MRI and XRAY by John Allsop/Westciv.

Per-request Template Paths in Rails Edge (> 1.2.3) [New Window]
If youre playing with Rails edge (> 1.2.3) and want to set the template path on a per-request basis, the game has changed a little.But first, why would you want this? Lets say youre building a CMS that has to use a different set of views based on something in the request, like the host name:app views siteone.com posts index.html.erb show.html.erb ... sitetwo.com posts index.html.erb show.html.erb ...Courtesy of the ever-helpful Rick Olsen, this is how we used to do it, but recently ActionPack has been changed to support multiple view paths that act like load paths (first look here, then here, then here). Its a great addition to the framework, and really useful for plugin developers (first look for an overriding view in app/views/, then look in vendor/plugin/myplugin/views/, for example).But somewhere in the changes the old way stopped working, and theres no new way that I can find that works on edge right now, but Courtenay has a proposed fix which is a one-line change in ActionView::Base to change an attr_reader into an attr_accessor, then replace the old way with the new way:self.class.view_paths = File.expand_path("#{RAILS_ROOT}/themes/#{store.id}/views")@template.view_paths = File.expand_path("#{RAILS_ROOT}/themes/#{store.id}/views") I really hope the one-liner (or an officially supported API) makes it into trunk soon, but in the meantime (thats a great song by Helmet by the way) its nice to know the hack isnt too crazy.

8 hour school day? [New Window]
Gruber on an NY Times article about education:But she also argues that the school day should be expanded from 6.5 to 8 hours, quoting some jackass who says Trying to cram everything our 21st-century students need into a 19th-century six-and-a-half-hour day just isnt working. The last thing kids need is to be cooped up in school for more hours each day.I have no kids, so Im probably utterly under-qualified to talk about this stuff, but I was a kid once. Id actually be in favor of an 8-hour school day if it meant abolishing homework and/or letting kids explore the aspects of their learning that interest them the most.As a bonus, parents wouldnt have to spend a fortune on child care for those extra hours they were at work, and time spent at home could actually revolve around the home and family, rather than an extension of school.No idea what its like elsewhere, but in Australia, kids (especially in high school) are absolutely hammered with an incredible amount of work to be completed outside of school hours.

Better Assertions [New Window]
You write tests for your models, right? Of course. You probably have quick sanity checks all over your tests like this: assert u.valid?And when that assertion is false, you get this ultra-helpful error message: is not true.Uh-huh. Awesome, thanks. WTF?So then you go back into your code and add in a few lines to debug just before the assertion: u.valid? puts u.errors.full_messages.join("\n") assert u.valid?Waste of time, totally boring, dont do it. Test::Units assert (and most of the other assertions you see used in Rails) can accept a message when the assertion doesnt pass. So replace the awful waste of time hack above with this from day one: assert u.valid?, u.errors.full_messages.join("\n")When the record is not valid, the assertion will print the error messages along with the standard is not true. But Im telling you stuff that you dont really need to know, because the Rails framework has already wrapped up this pattern as a simple assertion: assert_valid(some_record)So I guess my point is this when youre writing tests, make sure you provide some sort of useful error message, or an inspection of the objection or something with your assertion so that you spend less time debugging.Further, if you find yourself doing the same stuff over and over, check out the Rails documentation and see if someones wrapped up the pattern as a helper or method. If they havent write your own and share it with the world.

Moving to Feedburner, please update your feed URL [New Window]
The new feed URL is http://feeds.feedburner.com/justinfrench. The old URLs should redirect for a while, but please update!

Absurd Time Extensions [New Window]
John Barton just made my afternoon 10% more awesome with his Absurd Time Extensions on Github:class Time attr_accessor :white_rapper def stop! if white_rapper "collaborate and listen" else "Hammertime!" end endendUpdate: My contribution, Time.now.coffee? with a 3pm cut-off.

MS Walk 2008 Give Me All Your Money [New Window]
Every year my wife forces me walk around Albert Park Lake for the MS Walk, and every year I complain about getting up early on a Sunday, later realizing its quite fun, and 5km is really not that far at all, and 10:30am isnt actually that early.They have a sausage sizzle, you can see dogs chasing ducks (or vice-versa) and even though youre paying $22 for the privilege of walking around a lake which is otherwise public property, its for a good cause.This year Kates putting a team together, so if youre in Melbourne, you can join us on Sunday June 1st if you like.Alternatively, theyve added the extra guilt trip of an (optional) fund raising thing where I can attempt to squeeze money out of all my friends who are too smart to get out of bed on a weekend or dont think I can actually walk 5kms without a coffee break. You may give me all your money here.Please dont feel obligated at all, Im just having a bit of fun!

Signal vs. Noise: Urgency is Poisonous [New Window]
Jason Fried nails it once again:One thing Ive come to realize is that urgency is overrated. In fact, Ive come to believe urgency is poisonous. Urgency may get things done a few days sooner, but what does it cost in morale? Few things burn morale like urgency. Urgency is acidic.

Thoughtbot standardizes on Formtastic! [New Window]
Thoughtbot on the recent updates to Suspenders (the Rails template they use in most of their projects):We added formtastic (and the validation reflection plugin, which enables automatic required field labeling), which after having spent 18 months or so talking about and never building the perfect form builder weve decided to standardize on formtastic for all new projects.This is huge news for me. We havent even reached what I consider a solid 1.0 candidate, and big firms like Thoughtbot are making Formtastic part of their default toolbox, which means its going to be in a heap of Rails projects, and probably part of their workshop curriculum.Theres an astonishing (for me) 700+ people watching the project on Github, 50+ forks, heaps of great feedback and positive buzz on Twitter.Hopefully theres a 0.9 gem in the next week or two (I know, feels like Ive been saying that forever), then were going to clean up some rough edges, remove the deprecated stuff and polish this thing up for a 1.0!After that, Ill introduce my next Rails plugin for the view layer, which seems to have a few people excited already!

Rails, Git, Github, etc [New Window]
A little collection of things Ive found useful as I dig deeper into Git, dealing with forks, branches, pull requests, patches, etc. There hasnt been one glorious moment where the penny drops and it all makes sense to me Instead, its been dropping again and again as I absorb more about peoples workflows and usage patterns.Contributing to Rails in the Rails Lighthouse systemEveryday Git with 20 Commands Git Manual PageGot Git? How to Git and github by Steven BristolThe Thing About Git by Ryan TomaykoUsing Git within a project by Dr NicGit Cheat Sheet by Err FreeGit SVN Crash Course by Petr BaudisIll add more as I find them, feel free to email me

Stupid Bash Tricks: Copy The Working Directory [New Window]
The ProblemI have a Terminal window open, Im doing stuff and I want to open another Terminal window or tab to the same current working directory.A Possible SolutionI recently added this to my ~/.bash_login file:alias cwd='pwd | pbcopy'This might be stating the obvious, but pwd outputs the current working directory, and we pipe that into pbcopy which copies that output to the paste board. I choose cwd (Copy Working Directory) as the alias, your mileage may vary.Its still a bit fiddly, but better than grabbing the mouse to copy the current working directory:type cwdtype Command-T (new tab in Terminal.app)type cd type Command-V (Paste)Can you better?Ideally Id like to get this down to one key-stroke. Automators Watch Me Do recordable action was looking promising, but it runs horribly slow. Applescript maybe? Email me or go nuts in the comments! Update 1:Benjamin Birnbaum writes in with this bash function. Theres still some lag (AppleScript lag I guess) but Im suitably impressed! Update 2:Chap Lovejoy writes in with this AppleScript which Im yet to try out:tell application "Terminal" activate set wnd to the front window set tb to the selected tab of wnd -- We don't want to clobber any running process if not busy of tb then -- Clear the current command line tell application "System Events" keystroke "a" using control down keystroke "k" using control down end tell do script "pwd | pbcopy" in tb -- The make comamnd in Terminal appears to be -- broken so generate the keystroke as a workaround tell application "System Events" keystroke "t" using command down end tell do script "cd \"`pbpaste`\"" in the selected tab of wnd end ifend tell

Formtastic 0.9.7 Released (Updated) [New Window]
Another bunch of really nice improvements and fixes have been added to the latest Formtastic gem::selected option now works on all select, radio, check_box and date/time/datetime inputs, including multiple pre-selected values for check boxes and multi selects huge thanks to grimen on this one!Localized (I18n) titles now also works for inputs with the :for option set (nested forms). Closes #135.Added detection of group association method to use when grouping options for selectsYou can now supply a custom builder on a form-by-form basis with the :builder option, rather than globally through configuration Using rspec_tag_matchers instead of rspec_hpricot_matchers (specs run faster!)./script/generator form can now be passed acontroller option to specify which controller to add the partial to (eg admin/posts instead of the default posts)We now always call label_str_method (:humanize by default), previously human_attribute_name was also used in some caseThanks to everyone for their patches and support.In more exciting news, the Button DSL branch is getting close, Ill be pushing it up to Github as a remote branch and seeking feedback very soon, but I felt it was important to tidy up these bugs and keep the plugin moving forward in the meantime.Update: Originally titled this post 0.9.5, but there was a tiny bug or two, so its now 0.9.6 0.9.7!

Flickr doing Video? [New Window]
Via Mashable:According to a dig by Dan Farber of CNET on the matter, Yahoo, working on the heels of very eager anticipation, is planning to deliver Flickr Video sometime in April.I find this really interesting. Flickr has a massive, passionate, loyal community that have obviously embraced Flickrs way of doing things.Video feels like a natural progression for that community. A large percentage of them probably dabble in video already, and theyre probably using another service to host and share that content.Most cameras do video, so it makes perfect sense if youre going to experiment with moving pictures, you may as well share it with your existing Flickr network of friends and fans.The other interesting point is that YouTube (owned by Google) is clearly has the upper hand with video. Even searching for videos on Yahoo returns more YouTube results than Yahoo Video results (no scientific poll, of course), so Yahoo (owners of Flickr) may see some success leveraging Flickrs community directly.Above all else, I embrace the fact that Flickr had the discipline to go out there and solve one problem really well. Along the way they amassed a large community, built a platform, learnt a lot and helped define the space theyre in. They can take all this and apply it to video with ease.

Git Commits That Need to be Pushed, Part 2 [New Window]
Update: FETCH_HEAD doesnt really work the way I hoped, so Ive reverted to a modified version of my previous solution.

Formtastic Sneaky Preview [New Window]
Last night at Melbourne Ruby I gave a quick presentation of the Formtastic Rails FormBuilder plugin Ive been working on, and thought it was about time I announced it here also.The README serves as a pretty good introduction to what Im trying to do, so please just go and read that instead.If youre too lazy for that, its a sweet DSL for authoring forms, a FormBuilder that goes to great lengths to provide semantically rich markup with plenty of hooks for stylesheet authors, and a (work-in-progress) set of stylesheets that make that mark-up look great For Free.Xavier Shay has been bold enough to start using it in the wonderful Enki, and Im using it on a few small projects for friends, so I hope we might be at a 1.0-ish stable and useful release in a month or two.Side note: If you havent yet discovered the bliss of Github/Git combo, please sign-up for an account, start following me, start watching Formtastic, start forking some things and it will soon become crystal clear just how well the Github team have nailed the social side of open source software development, and how much sense distributed version control makes.

The "Remember Me" Rant [New Window]
The remember me functionality, present in most web applications and web services is awesome. If you want to be remembered (and avoid logging in next time), check the box during the login process and its taken care of with a cookie. Next time you return, its like you never left. Awesome.But whats up with remember me for 2 weeks, as found in Delicious, for example. I dont get it. It helps you out for two weeks like a champion, then just when things are going so well, it screws everything up by dropping the ball. Thanks for nothin.Its broken because it feels less helpful than forcing me to login each visit at least regular logins would help me commit the login details to memory.If theres a legit reason to expire the cookie after some period of time (Im not convinced, but Im keen to hear why), perhaps an improvement would be to continue remembering me for a period of 2 weeks, resetting the expiration date on the cookie each time I return to the site.That feels like a pretty good experience to me.Perhaps this is what the original trail blazers of this pattern had in mind, and somewhere along the way it got dumbed down and recycled into this awkward anti-pattern.Optional listening material: Its the innocent smiles you get at the start of a relationship before you fuck everything up by Aussie band Laura

Geoffrey Grosenbach on mod_rails [New Window]
This is a nice little write-up worth the read. I particularly like the idea of automatically restarting the application (in development) when files inside vendor are edited, which is my number one gripe when developing or maintaining plugins or other libraries that are only loaded once by Rails.

Git Aliases Rock [New Window]
Most of you Git users probably already know about Git aliases. Typically you add a few lines to ~/.gitconfig and you can alias git co to git checkout, etc:[alias] co = checkout st = status ci = commitBut you can also use it to run shell commands by prefixing the alias with an exclamation mark (!), my first of which was aliasing git df to git diff | mate to pipe the diff into TextMate, which gives me pretty colors and a familiar environment:df = !git diff | mateMostly Im just lazy. Id prefer to type git save mystashname instead of git stash save mystashname, and git pop instead of git stash pop, because I find myself stashing a lot of stuff and like to give them proper names, etc etc. Its totally awesome that I can make Git work for me.The most crazy one Ive been experimenting with so far wraps up a common pattern I have, which isswitching back to the master branch from my generic dev branchpulling from the remoteswitching back to devrebasing dev against masterswitching back to mastermerging in the changes from devand finally running git wtf to show me what all my branches look like after the merge before I do a push.I call this git publish:publish = !git checkout master && git pull && git checkout dev && git rebase master && git checkout master && git merge dev && git wtfGet lazy! Go make Git and bash do the hard work for you!

Hello Web Developer, Goodbye Web Designer [New Window]
John Allsopp in The State of the Web survey resultsThe day of the web developer has well and truly arrived, with a significant majority of respondents describing themselves as developers rather than designers, or a combination of the two. 95% or more or respondents use JavaScript, and over 90% of their sites are database driven.Its about time! I cant remember the last time I built a static website, and more to the point, the average user doesnt give a shit how your site magically works. Its just on the internet, and we, the web developers, are simply developing some more parts of the internet, like a property developer building some new apartments down the street.

RailsCamp Project &#38; Pledgie Campaign [New Window]
Theres a RailsCamp coming up soon in Melbourne. The whole idea of RailsCamp is to immerse yourself in some Ruby for a few days without distractions, and Ive been looking around for a project to sink my teeth into.One option I have is to put some work into Formtastics button DSL. I personally havent found much need for it, but theres been plenty of people asking. The basic idea I pitched a while back was something like this:f.commit f.commit :as => :button f.commit :as => :link f.commit :as => :link, :prefix => "or" f.commit :as => :image f.commit :as => :image, :src => "save.png"f.cancel f.cancel :as => :button f.cancel :as => :link f.cancel :as => :link, :prefix => "or" f.cancel :as => :image f.cancel :as => :image, :src => "cancel.png"Theres literally hundreds of Ruby projects Id love to hack on, and hundreds of features I could be working on that scratch my own itch, so maybe its time for an experiment:Theres a Formtastic Pledgie campaign attached to the project on Github, currently sitting at $55. If the campaign reaches $555 by the time I leave for the camp on Friday November 20, Ill make sure I focus on this button DSL (and Formtastic in general) the entire weekend. The aim is to finish and release this feature. If Im done early, Ill focus on documentation.If we dont hit the target (or go over), Ill still make sure that your donations go directly towards improving Formtastic, of course!So, please tweet this, blog this and spread the word however you can. If youre able to put some cash towards the project, even better.

Rails patch: Fixing human_name [New Window]
This patch just got applied (finally!), which Im happy about because I wont have to hack around it in Formtastic any more.Old: SomeClass.human_name # => "Someclass"New: SomeClass.human_name # => "Some class"Small steps, small steps.

A screen that ships without a mouse ships broken [New Window]
Clay Shirky has an amazing post/transcript Gin, Television, and Social Surplus of which I could quote pretty much the entire thing, but Ill just urge you to find some time to read it instead.

Getting started with automated testing in Rails [New Window]
After my previous post learn to test your code, you might be wondering how to get started with automated testing. Many books have been written on the topic, but I thought it might be interesting to share how I got started.Testing in the Rails consoleOne of my favorite things about Rails is the console (a Ruby irb console with the Rails environment loaded into it). If you havent checked it out yet, go have a play. You have access to ruby, your models, the database, helpers, ActiveSupport and much more. Heres a quick example:$ ./script/consoleLoading development environment (Rails 2.3.4)>> "Hello World!".class=> String>> Post.count=> 100>> Post.published.last.title=> "Hello world!"I found I was playing around in console quite a lot when testing specific logic in my models, like validations. It was far easier to copy-and-paste a few lines of ruby over and over instead of clicking around in my browser and entering data in all those form fields.Lets say you want to confirm that a new Post is valid when given an expected hash attributes (that the browser would usually post from a form being submitted):>> Post.new.valid?=> false>> Post.new(:title => "Hello", :body => "World", :user_id => "1").valid?=> trueWhile the example may be trivial, thats actually the point. The tests I was performing in the console were exactly what I should have been automating small, isolated, repeatable chunks of Ruby that confirm my understanding of what the code does by using it in the same way that I intended it to be used in my application.In this case, Im simply confirming that a new Post without attributes is invalid, and that a new Post with a title, body and user_id is valid.A quick introduction to unit testsFor simplicity, Im going to stick with test/unit and whatever ships with Rails in the standard testing framework provided in Rails 2.3.x, but you should be able to adapt these to rspec, Rails 3 or whatever you like.If you used a generator to create your Post model in the first place, you should already have a file ready for your tests, located in RAILS_ROOT/test/unit/post_test.rb:require 'test_helper'class PostTest < ActiveSupport::TestCase # Replace this with your real tests. test "the truth" do assert true endendYou should be able to run your unit tests from the command line with this rake task:$ rake test:unitsA bunch of noise is printed onto the screen, but what youre looking for is something like this:Started.Finished in 0.12 seconds.1 tests, 1 assertions, 0 failures, 0 errors My friends, that dot is a passing test. Lets add a failing test, to check everything is working as expected:require 'test_helper'class PostTest < ActiveSupport::TestCase test "the truth" do assert true end test "cats are the same as dogs" do assert_equal "cats", "dogs" endendRun the tests, we should see a failure:Started.FFinished in 0.12 seconds.2 tests, 2 assertions, 1 failures, 0 errors1) Failure:test_cats_are_the_same_as_dogs(PostTest)[/test/unit/post_test.rb:9]: expected but was.Finally, automating our testsLets take a look at our console tests again:>> Post.new.valid?=> false>> Post.new(:title => "Hello", :body => "World", :user_id => "1").valid?=> trueThe automated unit tests for these two are dead simple:test "should be invalid with no attributes" do assert !Post.new.valid?end test "should be valid with a title, body and user_id" do assert Post.new(:title => "Hello", :body => "World", :user_id => "1").valid?endRun the tests, lets see the dots!Started..Finished in 0.12 seconds.2 tests, 2 assertions, 0 failures, 0 errors Despite being utterly simple and trivial, those two tests document my understanding of what the software does (and should do going forward):A Post with no attributes should be invalid.A Post with a title, body and user_id should be valid.When they fail, either code isnt doing what I expect, or the test is no longer valid. Ill adjust one of them accordingly.And thats how I got startedWhat about you? Itll be tempting to open every model, look at every line of code and write tests for everything. Thats an incredibly ambitious plan, especially while youre learning how to write good tests, how to structure them, etc.Instead, start with one of your most business-critical controllers. Maybe its the signup process, or the home page, or the checkout. Have a look at how youre using your models, and replicate that usage with automated tests. Start with the golden path, then add more tests for the edge cases and irregular parts.Another way to proceed is to start by writing a test to expose any bugs you come across. Write a failing test, fix the bug, watch the test pass, commit the changes.Ill cover both of these (and much more) soon.

iPhone with Vodafone in Australia [New Window]
Good stuff:Vodafone today announced it has signed an agreement with Apple to sell the iPhone in ten of its markets around the globe. Later this year, Vodafone customers in Australia, the Czech Republic, Egypt, Greece, Italy, India, Portugal, New Zealand, South Africa and Turkey will be able to purchase the iPhone for use on the Vodafone network.Via Daring Fireball.

Crunch Crunch [New Window]
Not code at all. Meg & Gus, going to town on some dog biscuits.

Formtastic 0.9.2 Released [New Window]
Ive just pushed the new Formtastic 0.9.2 gem up to Gemcutter this morning on the train. Theres a few API changes as we edge closer and closer 1.0, so I thought Id do a quick post to document it all.Changesremoved the fallback :save i18n key in commit_button and the erroneous deprecation warning use the :update and :create keys insteadremoved the generic method_name class from wrappers (f.input :title will no longer have a title class)Additions:radio inputs can now force one of the options to be pre-selected with the :selected option, just like :select inputs can:select inputs now have a :group_by option to allow option groupinga new inline error type :first (alongside :list and :sentence) was added, rendering only the first error foundFixesfixed up some README examplesadded the Formtastic::SemanticFormHelper.builder config to the example config in the generatoradded some documentation and beefed up specs for the :selected option on a :select inputUnder the hoodmade the gem post-install message a little more succincthuge refactor and reorganization of the specs under the hoodminor refactor of the code base to make it a little easier to followdeprecation errors are no longer silenced in the test suiteAssuming no serious bugs pop up, the next stop is 1.0. Ive also started a Pledgie campaign, so if Formtastic is saving you or your clients a bit of time and money, please consider donating.The current campaign is for $555 by 5pm this Friday, in exchange for which I promise to work on Formtastics new button DSL for the entire weekend on RailsCamp here in Melbourne.

When you should keep your ideas to yourself [New Window]
Rob Haggart points to an interesting article over on Harvard Business titled When you should keep your ideas to yourself. Take away quote for me is this:This could well be a case of trying to add too much value, and heres the problem: the quality of the idea may go up 5% with my suggestions, but your commitment to its execution may go down 50%. It is no longer your idea; as your manager, I have now made it my idea.Or, as Rob puts it:Taking someone elses idea and increasing the quality by 5% occurs at the price of a 50% decrease in their commitment to execution.Its utterly obvious, and I think we already know this stuff deep down, but having it packaged up in a single sentence like that is always great useful.

VCS Agnostic Bash Functions [New Window]
For the last 2 years, Ive had a bash alias st which mapped to svn status. Understandably, Ive built up significant muscle memory here, and every time I want to know the status of a project, thats what I type.Then Git came along and ruined everything (in the best possible way). Typing st just resulted in SVN errors. I made a new alias gst, but my fingers just want to type st.Problem solved with a tiny bash function: function st() { git branch &>/dev/null if [ $? -eq 0 ]; then git status; else svn status; fi }Im certain this can be improved, but its a great start. Xavier chimed in with the obvious next step: function ci() { git branch &>/dev/null if [ $? -eq 0 ]; then git commit -m; else svn ci -m; fi }And pretty soon Ill have a whole swag of them replacing my old bash aliases with functions.Anyone know a better way to test for Git? What about DRYing up the check so that I can re-use it in each function? Please email me, Im such a bash newb.Update: Ben Birnbaum writes in again with a simplification and clean-up which seems to work great.

Git Commits That Need to be Pushed [New Window]
I constantly find myself wondering what the difference is between what Ive committed to my local Git repository, and whats been pushed up to Github. Heres one way, Im sure theres others:git cherry -v origin/masterOr, how about a bash alias?alias push?='git cherry -v origin/master'Winner.Updated 21 July 2008 to use origin/master instead of just origin, which works far more reliably in my various projects, with thanks to Stefan Naewe who emailed me with this suggestion.

Open-plan offices are making workers sick [New Window]
Joel and Dan (and probably most of the internet by now) have jumped on this piece on news.com.au:Australian scientists have reviewed a global pool of research into the effect of modern office design, concluding the switch to open-plan has led to lower productivity and higher worker stress.Its fantastic to see some science and numbers to back this up, and I couldnt agree more with the findings, but whoever funded this couldve saved a few bucks by spending about 10 minutes in such an environment, which is exactly what management should do before asking their staff to do the same.If money or space is really tight, at least break it up into slightly smaller spaces. Halving or quartering the noise and distractions by halving or quartering the space will have a huge, positive impact.

Great Review of RedBubble [New Window]
Zoe Marlowe has a warm review of RedBubble alongside Flickr and others on Devlounge:Whats great and amazing about Redbubble is that it is a veritable United Nations of photographers, fine artists and writers. Everyone there has the ability to create their own personal page or gallery full of their work, whether it is art or prose, you have a place to do your thing for absolutely free. What else is fantastic about the Bubble is that you have the opportunity to actually sell your work, seriously! You can choose several different format options for your art and sell it as prints, greeting cards, or posters, whatever you want! Heck, you can even design and sell T-shirts of your art work. How cool is that?And this final:I absolutely cant say enough about this site, its really a home away from home inside my computer! This online cybercaf, art gallery and community gets the absolute most rousing, foot stomping, Bic-flicking standing ovation from me ever!I tend to get weighed down day-to-day by all the things I see on the site that we havent done, or that we did in a furious hurry, or that were still trying to find time to do, and this serves as a wonderful reminder of what we have done. Thanks Zoe!

A custom Rake task to reset and seed your database [New Window]
No matter how obvious I think this stuff is now, there was a point when it wasnt, so Im trying to share more. Heres something I do a lot during the initial development process of a Rails application:drop the current databasere-create itrun all the migrationsload in some sample data from the fixtures (or elsewhere)The good news is that Rails provides a Rake task for each of these (run $ rake --tasks | grep 'db' to see plenty more), so if you really like typing you can just run these four commands:rake db:droprake db:createrake db:migraterake db:fixtures:loadNo way, typing is for suckers. What you (should) want to do is encapsulate this thing you want to do over and over as a new custom Rake task. Lets go with rake db:seed.Create a new file application.rake (or db.rake, whatever) in RAILS_ROOT/lib/tasks with the following:namespace :db do desc "Drop, create, migrate then seed the database" task :seed => :environment do Rake::Task['db:drop'].invoke Rake::Task['db:create'].invoke Rake::Task['db:migrate'].invoke Rake::Task['db:fixtures:load'].invoke endendGive it a try, Ill wait. Warning: This will totally hose your database! And we can clean this up too. task :seed => :environment is telling rake to run the environment task (it loads the Rails environment) before running the rest of the task. We can actually pass in s set of tasks as an Array:namespace :db do desc "Drop, create, migrate then seed the database" task :seed => [ 'environment', 'db:drop', 'db:create', 'db:migrate', 'db:fixtures:load' ]endFinally, Ill sleep better tonight if you make sure this task can only run in the development environment (ensuring you cant accidentally hose your production data), so lets add another task development_environment_only and include it in the task list:namespace :db do desc "Raise an error unless the RAILS_ENV is development" task :development_environment_only do raise "Hey, development only you monkey!" unless RAILS_ENV == 'development' end desc "Drop, create, migrate then seed the development database" task :seed => [ 'environment', 'db:development_environment_only', 'db:drop', 'db:create', 'db:migrate', 'db:fixtures:load' ] endend

The Commonalities [New Window]
Ive been doing a huge purge of my feeds lately, but The Cooper Journal will be staying put! I particularly enjoyed The parable of The Homer, posted a few minutes ago: The moral is of course that designing for almost any single individual runs a huge risk of building a product around personal idiosyncrasiesthe things that are different about that person, which is a lot different than designing for personas or user archetypes where the goal is to make decisions focused on the commonalities between members of the intended audience.

Learn how to test your code [New Window]
Recently, I was asked by someone new to Ruby and Rails what advice I had for them. Other than watch all the Railscasts, I really only have one piece of advice:Learn how to test your software through automation.Learning how to write good tests for my code was the single most important step I made as a developer. I cant more strongly emphasise this.Youll wrestle with it at first. Youll be perplexed by the choices in testing frameworks and distracted by the subtle differences in terminology. Youll be frustrated that youre writing twice as much code for every feature. Youll think you can hold the whole thing in your head and catch yourself making mistakes. Your boss will complain that things are taking too long.Push through this shit. Sometimes the pay-off isnt obvious for weeks or even months, but its always there.Your tests are your safety net. Youll learn to lean on them, to trust them more than you trust yourself. Youll find youre no longer terrified by huge changes to the code base, or sudden changes in direction. Youll see the occasional false alarm too (an annoying test that fails, but only exposed a bug in your testing approach).Eventually (its only a matter of time), youll change something trivial and confidently commit to your version control system without running your tests. A few minutes later your co-workers (or even better, a continuous integration build server) will catch your mistake with a failing test. Your trivial change just busted another part of the code you werent thinking about.That code you just busted will be hidden somewhere in an obscure path through your shopping cart, and your test suite has just saved your company time, money and a loss of consumer confidence.The light bulb goes on. You get it, your boss probably gets it, but this is only the start of the journey.Eventually youll forget that you used to spend hours testing your code in a browser, and start complaining that your automated tests are taking minutes to run! Youll have intense debates with co-workers about what to test and how to test it properly. Youll start writing the test first to expose the bug or missing feature, then write the code required to pass the test.This is the moment you realise you care more about your tests than you do about the code.

Timeframe Calendar Picker [New Window]
Mental note: Start here next time I need to implement a calendar picker UI!

Coffee Chicken [New Window]
In a small office of people eager for their mid-morning coffee, participants must weigh up their strong desire for caffeine against the burden of being the first to break, becoming the Coffee Chicken.The Coffee Chicken must take complex orders, deal with handfuls of loose change, return with trays of coffee and deal with never ending complaints & commentary from those who showed greater strength of character.

Google and IE6: Put the Champagne Away [New Window]
UXMag have just published a short post with the wonderfully luring and dramatic title Google kills IE6:Google is officially phasing out their support for IE6. This means we can all start working on more important things rather than debugging for old and quirky browsers. I think champagne is in order!I wish! Lets go look at Googles actual announcement:So to help ensure your business can use the latest, most advanced web apps, we encourage you to update your browsers as soon as possible.Theyre dropping IE6 support for their most advanced web apps, starting with Google Docs and Google Sites. They arent dropping support across every Google product. You can still go to google.com in IE6 and do a search. The decision to drop IE6 needs to be made by each business individually, based on strong business intelligence and data. Google, of all companies, knows this. How many IE6 usersthe ones that wont or cant upgrade to more advanced technologiesdo you think actually use Google Docs (an advanced web app) in any significant way? I dont know, but Google knows, which is why they dropped the support.The upside to all this is that there may be a few organisations heavily invested in Google that need to upgrade. There may be a few IT departments that finally get of their ass and upgrade their work stations.This is progress, but its not magic.

Nested has_many :through associations in Rails [New Window]
It cant be done. Youre surprised, so am I. I spent a few hours looking tonight, Rails (2.3.5 at the time of writing) doesnt do this. Even the rdoc says it:You can only use a :through query through a belongs_to or has_many association on the join model.I have no idea about Rails 3 with the Arel changes to ActiveRecord, but heres everything else I picked up along the way:The Bad NewsTheres an old plugin by Matt Wescott which supported this around Rails 2.1 (I think)Theres a newer plugin by Ian White on GitHub based off Matts, which worked with Rails 2.12.2 it seems, but was busted by Rails 2.3. Theres a branch for Rails 2.3, which it looks like theyre still working on (last commit December 2009). I didnt try it.Theres an open ticket in Rails Lighthouse, everyone +1s the idea, no one has written a patch, Pratik marked it as incomplete, awaiting a patch from the community. You should try to make that patch!The Good NewsThere is something close, documented in Simulate Has Many Through HABTM by Alex Reisner.It worked for me.

Around the Corner [New Window]
I expect demos like Snow Stack to pop up more and more frequently as modern web browsers get the sort of CSS support we could only dream of a few years back.Its easy to dismiss this stuff because its Safari-only, but so many of these cutting edge CSS and HTML features will make it into modern browsers really soon, and well have some amazing opportunities to provide web-native, indexable, linkable, resource-oriented, affordable, maintainable, incredibly rich web experiences with a few lines of CSS and Javascript.No Flash, no plugins, no alternate or low-fi versions.Graceful degredation (or progressive enhancement, depending on how you want to look at this stuff) will be a conversation we have with our clients far more often and well spend a whole lot more time designing in the browser.I cant wait.

Testing Rails Plugin Config Preferences [New Window]
Time to start blogging again, I hope! Most plugins and Ruby gems have configurable preferences, and usually theyre implemented as a Module or Class attribute, something like this: class AwesomeGem cattr_accessor :something @@something = trueendIn the case of a Rails plugin or gem, these are then modified with an initializer as Rails boots up: AwesomeGem.something = falseDespite my best efforts to be opinionated, Formtastic has about 15 preferences today, and I can see another 10 or so on the horizon. They all need to be tested. For a while there, we had some pretty brittle tests that did this sort of stuff: describe AwesomeGem, "something preference" do describe "when true" do it "should..." do AwesomeGem.something = true # ... end end describe "when false" do it "should..." do AwesomeGem.something = false # ... end endendThe problem here is that weve changed AwesomeGem.somethings configuration from true (the default in the class) to false. Any tests that assume the default preference will fail. Maybe. Who knows. Depends on the order your tests run.So we need to return the preference to its default state at the end of any tests that alter it: it "should..." do AwesomeGem.something = false # ... AwesomeGem.something = trueendThis is stupid and short-sighted. Next week, someone changes the default value, and everything breaks. What you need to do is capture the value before you change it, then return it to that state at the end of the test: it "should..." do old_value = AwesomeGem.something AwesomeGem.something = false # ... AwesomeGem.something = old_valueendThis works, but its shit code, especially if youre repeating it in dozens of specs. You can DRY it up a bit by moving it to before and after blocks, but its a heap of noisy, ugly code. We can do better. How about wrapping the above pattern up in a block that temporarily changes the configuration, like this: it "should..." do with_config :something, false do # ... endendHeres the implementation, throw it in your spec_helper.rb file: def with_config(preference_name, temporary_value, &block) old_value = AwesomeGem.send(preference_name) AwesomeGem.send(:"#{preference_name}=", temporary_value) yield AwesomeGem.send(:"#{preference_name}=", old_value)endEnjoy!

Hardware and Software [New Window]
Last week my hard drive started making those wonderful clicking noises, and I started seeing way too many spinning beach balls of death. A day later, the system wouldnt start up, so that was that. Dead hard drive.I grabbed one of the emergency laptops from work (a black MacBook), plugged in the TimeMachine back-up, and was up-and-running on the new system pretty quick.Physically, this is a really different laptop than my MacBook Pro or the Powerbook I had before it the keyboard is just plain weird, the lid latches differently, the screen is glossy, the ports are all in different places, the resolution of the screen is different, the dimensions are smaller, its plastic rather than aluminum, etc.Despite this, I felt comfortable on it almost instantly. It was my computer so fast, adding weight to something Ive always suspected was true the software and settings installed my Mac is what makes me feel so at home, not really the hardware or even Mac OS X. I can jump on a friends Mac and feel almost as lost as I would jumping on a PC.The system you interact with every day is the one youre going to feel most comfortable on. Instinct takes over from logic and familiar UIs are forgiven their inadequacies.When people say I love Macs, what they really mean is I love my Mac, and when they say that, they really mean I love what Ive done with my Mac.This is also the reason why I occasionally hear the words I love my PC, as strange as it sounds to the rest of us.

Adding Empty Directories to a Git Repository [New Window]
One of the biggest WTF moments when I started using Git for version control was that it refused to add (or even recognize) empty directories in the repository.The GitFaq sums it up just fine:Currently the design of the git index (staging area) only permits files to be listed, and nobody competent enough to make the change to allow empty directories has cared enough about this situation to remedy it.The same FAQ also documents the hack that most people choose to work around this limitation:If you really need a directory to exist in checkouts you should create a file in it. .gitignore works well for this purpose; you can leave it empty, or fill in the names of files you expect to show up in the directory.Fine, but I get a little sick of adding a bunch of .gitignore files to the many nested empty folders in a Rails project, or having to add the dirs myself when cloning something.So here it is, a Bash one-liner which recursively adds an empty .gitignore file to every empty directory in the current working directory (with the exception of directories beginning with a dot, like .git for example:for i in $(find . -type d -regex ``./[^.].*'' -empty); do touch $i"/.gitignore"; done;Add it into ~/.bashrc as an alias and save yourself precious minutes in every new project!Ive added it as a gist on GitHub, so feel free to make improvements to it.

Google "Public DNS" to compete against OpenDNS [New Window]
Google have launched their "Public DNS" service - a similar service to the OpenDNS public dns resolvers. It is going to be interesting to see how much competition occurs. It is usually faster to use the OpenDNS public dns resolvers...

Firefox 3.5 Regression issues with wildcard SSL certificates [New Window]
I really hate educating people how to do the following, but a bit of an explanation around this. Mozilla Firefox 3.5 now does not play nice with wildcard SSL certificates where you do things like service.servername.example.com when you only...

Exim gotcha with SMTP Auth [New Window]
One gotcha when using exim to do authenticated SMTP one wonders why you keep seeing the following: Return-path: *snipped* Sender: "email@add.re.ss"@server.host.name *snipped* One needs to modify your acl for acl_check_rcpt for authenticated SMTP connections to contain the sender_retain bit like...

No Smarty [New Window]
If you've not heard about it yet, there is now a website advocating not using Smarty. The time for using smarty has gone - but makes one wonder if Flickr, Facebook, etc. are still using it....

SA Pro Podcast from Ben Rockwood [New Window]
One of my work colleagues, the ubergeek Ben Rockwood has started a podcast called SA Pro a podcast for Systems Administrators. In the first episode (episode zero) Ben chats together with with Joe Moore of Siemens and Mark Imbriaco of...

Patches to update rails 2.1.0 to 2.1.1 [New Window]
I've made some patches to update Ruby On Rails version 2.1.0 to 2.1.1 where you make use of the unpacked gems and a subversion repository (running 'rake rails:freeze:gems' has a bad habit of leaving your working copy in a mess...

Upgraded Movable Type [New Window]
Finally managed to get round to upgrading movable type - need to hack my wpcp function to add files that haven't been added with svn add for some odd reason. I must admit that I like the cleaner appearance of...

FreeBSD vr network card issues [New Window]
Sort of a note to self for the next time I bump into a very annoying issue with network cards that use the VIA Technologies Rhine I/II/III controller chips on network cards like the quite popular dlink (shows up under...

Twitter Search the posterchild for 500's [New Window]
One of my pet peeves is currently when Twitter Search is down - there goes being able to zone into conversations on any given topic from bsdisms, following cloud computing, etc. Tired of seeing: Status: 500 Internal Server Error Content-Type:...

MRTG missing SNMP_util [New Window]
One of the joys of installing ports on FreeBSD is the odd occasion that the dependencies list is missing a dependency. is not installed you get nice perl errors in the case of the following # cfgmaker public@127.0.0.1 Can't locate...

How many drafts do you have in your blog software? [New Window]
I currently have 43 draft entries in my blog software (movable type) that I've not yet published as I have not gotten round to posting some of the posts....

How do you use MySQL as a DBA? [New Window]
Interesting question for MySQL DBA's: do you prefer using the mysql cli interface and know the SQL statements to execute in order to do your admin work like creating databases or do you prefer using the mysqladmin interface? Personally I...

Happy New Year! [New Window]
Just a quick blog post to say Happy New Year! 2008 seems to have flow by quite quickly and at the start of 2009 I've made a resolution to not make any resolutions as I never tend to be able...

Deploying sites in seconds [New Window]
Currently playing around with the private beta of the Smart Platform from Joyent - took less than 2 minutes to deploy their hello world app (apart from me getting a bit annoyed with git). Need to still work on getting...

jot gotcha [New Window]
Seeing that I run into this jot gotcha every couple of months while writing shell scripts, I thought I would add a reminder for myself here (and so that google can pick this up for me next time). On FreeBSD,...

links for 2009-06-27 [New Window]
HowTo Achieve &quot;Ubuntu-Desktop-Minimal&quot; (tags: ubuntu minimal)

Tab Sweep [New Window]
Building iPhone Apps with HTML, CSS, and JavaScriptWorking hard is overrated:"Much more important than working hard is knowing how to find the right thing to work on. Paying attention to what is going on in the world. Seeing patterns. Seeing things as they are rather than how you want them to be. Being able to read what people want. Putting yourself in the right place where information is flowing freely and interesting new juxtapositions can be seen. But you can save yourself a lot of time by working on the right thing. Working hard, even, if that's what you like to do."Creating iPhone and Mac icons using Inkscape (Part 1 of 2)Creating iPhone and Mac icons using Inkscape (Part 2 of 2)Learning Advanced JavaScript10 Uses for Blocks in C/Objective-CDeep Tracing of Internet ExplorerEscaping hotel firewalls with ssh over port 80Underscore.js"Underscore is a utility-belt library for JavaScript that provides a lot of the functional programming support that you would expect in Prototype.js (or Ruby), but without extending any of the built-in JavaScript objects. It's the tie to go along with jQuery's tux."iPhone PhotographyTouchJSONWhen can I use...Debugging in PythonThe Three20 ProjectHow to Create a Valid Non-Javascript Lightbox

links for 2009-11-15 [New Window]
Windows 7 as an WiFi AccessPoint (tags: windows7 wifi hacks) Move Your Home Folder Off Your SSD Boot Drive in OS X (tags: mac osx tips)

links for 2009-06-15 [New Window]
Linux Commands - A practical reference (tags: linux cli reference) Rosetta Stone for Unix (tags: unix cli reference cheatsheet)

links for 2009-05-20 [New Window]
Django tip: Caching and two-phased template rendering (tags: django development tips)

links for 2010-03-10 [New Window]
How to replace default Windows 7/Server 2008 R2 Recovery Environment in Diagnostic and Recovery Toolset (tags: windows recovery)

Tab Sweep [New Window]
Because I really needed to clean these tabs out of the browser.iPhone Development Emergency GuideCS193P - iPhone Application ProgrammingSlickMap CSSGuide to CSS Font Stacks: Techniques and ResourcesThe Regex CoachSUMO Linux

links for 2010-01-30 [New Window]
ARP Networks, Inc. VPS Services FreeBSD and OpenBSD VPS Hosting (tags: vps bsd hosting openbsd freebsd)

More Tabs [New Window]
Mounting an NTFS partition with full Read-Write supportPING (Partimage Is Not Ghost)Mount a Remote Drive via SMBFS (AppleTV)Turbo's AppleTV HacksHow to install IE 7 and keep IE 6

links for 2010-01-06 [New Window]
jsCrypto Fast symmetric cryptography in Javascript (tags: javascript aes cryptography encryption webdev security)

links for 2010-01-07 [New Window]
atvusb-creator USB flash drive creator for the AppleTV (tags: appletv boxee patchstick xbmc) Using HTML Symbol Entities (tags: html symbol reference)

links for 2009-05-31 [New Window]
Mac OS X Manual Page For nfs.conf(5) (tags: osx nfs) Mac OS X Manual Page For netstat(1) (tags: osx nfs) Mac OS X Manual Page For mount(8) (tags: osx nfs) Mac OS X Manual Page For mount_nfs(8) (tags: osx nfs)

links for 2009-11-12 [New Window]
SPDY &quot;an experiment with protocols for the web. It&#039;s goal is to reduce the latency of web pages&quot; (tags: google web http speed performance)

links for 2009-11-27 [New Window]
LABjs: new hotness for script loading &quot;gives you complete control over the loading and executing behavior of your scripts&quot; (tags: javascript optimization webdev performance)

links for 2010-01-05 [New Window]
Lazy Sheep Bookmarklet I needed a delicious bookmarklet tonight and found this before I found the one on delicious.com. (tags: javascript bookmarklet del.icio.us) Windows 7 GodMode? Not Really What you get is just the Windows 7 Control Panel in a different (expanded) layout it doesnt contain any &#039;hidden&#039; tweaks. (tags: windows godmode controlpanel)

Redesign time [New Window]
Sorry for any ugliness that might be forced upon you, my lone reader. It is time to ditch this layout and do something different. In the meantime all the content will still be here for you education and puzzlement! As soon as I post this I will be deleting all the stylesheets for the whole site. w00t!
Mon, 08 Mar 2010 14:40:38 -0500

Goodbye Yahoo [New Window]

Mon, 22 Feb 2010 13:38:14 -0500

Pizza dough recipe [New Window]
Over the years I have tried dozens of recipes for pizza dough and although some were good, none ever made me shout &#8220;fucking hell!&#8221;, none until I found this one. This is the shit right here! If you are going to try it you will need a baking/pizza stone and a peel. You could manage without the peel by getting ingenius with some parchment paperbut the stone is a must. You also have to start making it the day before you plan to eat.This makes 4 12&#8221; pizzas.Ingedients:4 1/2 cups all purpose flour or bread flour but why pay double? (575g)1 3/4 teaspoons salt (12.5g)1 teaspoon instant yeast (3g)1/4 cup olive oil (60ml)1 3/4 cups ice cold water (414ml)Semolina flour or cornmeal for dusting the peel to stop the pizza from sticking to it.1. Mix the first five ingredients together. It will give you a sticky and squishy dough. Knead it for 5 minutes. Split it in to 4 equal lumps. Spray the insides of 4 plastic storage bags with some olive oil, if you can&#8217;t spray then just put a splash in each and swoosh it around some. Put a lump of dough in each bag and tie off the top. Put them in the fridge for at least over night but up to 3 days. If you are not going to need all 4, you can stick however many in the freezer until 24 hours before you need them, at which point you can move them to the fridge.Preheat your oven to 550f (pretty much as hot as your oven goes!) for at least half an hour with your stone at or close to the bottom.Put a good sprinkle of cornmeal or semolina flour on your peel. Take out your dough and shape it by hand . If you fuck it up just roll it up and have another go! I find it helps to dust my hands with some flour for thisPut your pizza base on the peel and give the top a light spray or brush of olive oil. Put your sauce, cheese and toppings on top.Slide it off the peel on to the stone and it should be in done in roughly 8 minutes but keep an eye on it.Take it out and let it cool for a few minutes on a rack before you cut and eat.Lastly, send or buy be large ammounts of beer in gratitude!
Fri, 19 Feb 2010 14:37:59 -0500

Thinking in Ribbons and Smudges [New Window]
Radio address for February 17, 2010, guest-starring my Smith-Corona Super Sterling (not, as it might sound, a gun, but a typewriter). The excerpt at the end is from Our Mutual Friend by Charles Dickens, Book I, ch. XV.
Wed, 17 Feb 2010 13:11:07 -0500

Cuban Bread Recipe (two loaves) [New Window]
5-6 cups bread or all-purpose flour2 packages dry yeast (4.5 Teaspoons)1 tablespoon salt2 tablespoons sugar2 cups hot water (125F)Sesame, poppy seeds or whatever takes your fancy (optional but do not use flax seed, we tried and they suck!)Place 4 cups flour in a large bowl, add yeast salt, &amp; sugar.Stir until well blended. Pour in water, beat 100 strokes, or3 min with mixers flat beater.Gradually work in remaining flour 1/2 cup at a time, until doughloses stickiness.Sprinkle work surface with flour. Work in flour as you knead,keep dusting work surface. Knead for 8 min, until dough is smoothand elastic.Put dough in greased, covered bowl for 15 min.Punch dough down, turn onto work surface, cut in 2. Shape eachinto round, roll it in chosen seeds or whatever and place on baking sheet covered with a sheet of parchment paperPlace baking sheet in middle of cold oven. Put a pan of hot waterin the shelf below. Turn oven to 400F and bake until loaves are deep goldenbrown, roughly 45-50 minutes should do it. Thump the bottom- if they sound hollow, they are done.This bread doesn&#8217;t stay fresh for long, but it usually gets devoured sofast that it doesn&#8217;t matter; freezes well. We have had good luckvarying the flour, although you may have to increase the rise time.We have often added garlic and various other herbs/spices to the dough with great results.
Mon, 08 Feb 2010 14:42:51 -0500

The Voice of the Bard [New Window]
Some things are hidden from your senses until you say &#8220;yes.&#8221;
Sun, 07 Feb 2010 21:15:09 -0500

A Hand Up on Deck [New Window]
How far apart we are when we start; how good it really is to come on board!
Sat, 30 Jan 2010 22:12:02 -0500

Breaking A Four Decade Hex [New Window]

Sun, 03 Jan 2010 23:37:50 -0500

Make your own Irish Cream (Baileys) [New Window]
This is for Robin, I don&#8217;t like the shit! 1 Cup light cream (or heavy whipping cream, which makes it richer).14 oz sweetened condensed milk.1 2/3 Cups Irish whiskey.1 Teaspoon instant coffee.2 Tablespoons chocolate syrup.1 Teaspoon vanilla.1 Teaspoon almond extract (optional)1. Combine all ingredients well in a blender.2. Bottle and refrigerate. Shake before using.3. Keeps for 2 months.
Sun, 03 Jan 2010 13:23:30 -0500

The Original Dither [New Window]

Sun, 29 Nov 2009 12:18:29 -0500

The Not So Public Option [New Window]

Sun, 22 Nov 2009 11:57:49 -0500

I Dont Care What Your Delusion Is, Im Not Obligated To Share It [New Window]
I saw this elsewhere and wanted to share it with my reader!The earth revolves around the sun.The earth is billions, not thousands of years old.Fox News is neither fair, nor balanced &#8211; nor news.Evolution happened and is happening.Torture does not work.Bush did not keep us safe.Markets do not regulate themselves.Fascism is not the same as socialism.The world was not with us with regards to the Iraq War.Iraq never attacked us and was never a threat.Trickle-down economics is extremely insulting on its face. More so if examined.Obama is not a socialist, or a communist.A weak public option for a fraction of the country does not spell doom.Prayers in school did not avert any wrong doings. Nor are prayers prohibited now.There is no correlation between religiosity and morality.The world can be and is over-populated.Supply-side economics makes no sense, period.Lying to soldiers about why they are fighting is not equivalent to support.Supporting any war for any reason is not equivalent to patriotism.Tax cuts for the rich are not a fix-all. In fact they hurt after a certain point.Gays are not asking for special rights. They are asking for human rights.An economist from Exxon does not equal the entire peer reviewed data from the worlds climatologists.We really dont have the #1 healthcare system in the world, and pretending we do only hurts our chances of improvement.The fact is, now there really is a Northwest Passage for the first time in human history.Intelligent Design is creationism in a dress. Un-burying her and dressing her up does not make her smell any better.Facts are facts and do not have an ideology. Pretending that an impassioned denial is equal to established facts is extremely harmful. And the number of people sharing your particular delusion is irrelevant to its status as a fact.
Sun, 01 Nov 2009 19:53:31 -0500

We Are Covered In Bipartisan Bull [New Window]

Sat, 03 Oct 2009 12:46:34 -0400

A Day For Accounting, 2009 [New Window]
Anyone who really knows me also knows that lists, statistics, and &#8220;counting&#8221; are Things Reid Likes. The following is a continuation of a now six year old tradition, &#8220;A Day for Accounting.&#8221; It was inspired by this from Crystal Lyn, and something that happened 51 years ago today.
Sun, 20 Sep 2009 01:05:12 -0400

Health Prayer Reform [New Window]
Our current &#8220;health care debate&#8221; has convinced me of one thing. We, as a country, are no longer capable of civil discourse about important topics. This is a straightjacket on democracy. We are no longer capable of doing Big Things, and we give off the appearance of a rather dumb country that is consumed by pettiness and increasingly incapable of civil discourse.We, as a country, follow the examples set by our left/right leaders-celebrities, and regurgitate the ad hominem talking points they give us, or that we heard from some guy on the Internet. We try to shout each other down.Because volume is a winning policy.So many very angry people seem perfectly happy with the system we have. I know the majority of people have always been fully employed at a medium to large company that provides them with access to moderately priced insurance coverage. I know the majority of people have never run a small business, or been self-employed (two activities that allegedly cause this country to &#8220;thrive&#8221;), or wrestled with a COBRA payment after being laid off from their full time job, or worse, tried to convert COBRA to individual coverage. I know the majority of people have not encountered a major medical issue that strained or exceeded the limits of their existing coverage.I know I may not be among the majority of American people on this topic. So I might have some differing insights to provide. And I am very very angry, too. It comes from two sources, both of which ought to anger you, too, even if you have moderately priced insurance.
Thu, 17 Sep 2009 11:27:19 -0400

For Those Who Still Mourn [New Window]

Fri, 11 Sep 2009 01:05:38 -0400

Better Post and Packing [New Window]
Someone recently opined that the Postal Service is always having problems. I heartily agree. As long as we&#8217;re subsidizing a national postal service, we might as well angle for one that we, as a nation, can be proud of.
Wed, 26 Aug 2009 14:39:59 -0400

I Love Writing [New Window]
I do most of my writing by hand in my own books, or in letters, and when I have time some of it ends up here.
Fri, 14 Aug 2009 16:00:41 -0400

The One Where I Get Some Cheap Glasses [New Window]
Getting old sucks. You hit your 40&#8217;s, and the single-vision glasses you&#8217;ve worn since youth no longer cut it, now you need bifocals.Then you hit fifty, and your bifocals still work well at distance, and up close (about 12 inches or less), but your eyes have developed a new range (18&#8221;-36&#8221;) that simply isn&#8217;t covered well at all by your bifocals. Except this very narrow portion of the bifocal&#8217;s progressive transition, if you tip your head back just right.That 18 to 36 inch range is where my monitors sit. Yeah, it became a real pain in the neck. So off I went to the eye doctor, to get a new prescription, and some new glasses. But the last time I did this, the wife and I went together and $1,000 later we both had new glasses. This time, I wanted to get more for my money.And I did. For roughly the same amount of money ($561.65), I got four very nice pairs of glasses; one set by visiting a local optometrist, and three sets ordered online.
Thu, 06 Aug 2009 00:45:07 -0400

Highly Unique Time Check [New Window]

Wed, 08 Jul 2009 12:34:56 -0400

Update on My Grandfathers Health [New Window]
It&#8217;s been over a month since my previous post, where I described the aggressive bacterial infection in his left arm. My thanks to everyone who sent words of encouragement and support.He could&#8217;ve easily lost a limb or worse, but fortunately he received treatment just in time. Though the thumb where the infection started is still [...]
Tue, 21 Apr 2009 21:32:37 -0400

Canonical URLs in WordPress [New Window]
Like any good obsessive-compulsive blogger, I frequently pour over my web site statistics looking for interesting stuff. One thing that caught my eye is that search results coming in from Google tends to link to threaded comment pages for entries.For example, I&#8217;d get hits to /blog/2009/03/05/entry-slug/comment-page-1/, which is an URL that&#8217;s pretty hard to actually [...]
Thu, 05 Mar 2009 11:26:50 -0500

Prayer Request for My Grandfather [New Window]
I'm getting ready to visit my grandfather in the hospital, where he was admitted today. If you pray, please say a prayer for him. Thanks.
Mon, 02 Mar 2009 13:41:02 -0500

Spotify Bay [New Window]
Welcome to Spotify Bay.There&#8217;s an application called SpotSave making waves in the Spotify community. SpotSave lets you save music from Spotify straight to your computer, no strings attached, with the same quality you hear straight from Spotify itself.I haven&#8217;t tried it myself, because to be quite frank, Spotify stinks and doesn&#8217;t have any music I [...]
Mon, 23 Feb 2009 09:16:18 -0500

Sharing is Caring [New Window]
Public service announcement: I read my feeds in Google Reader, and I end up sharing tons of entries I find interesting and/or weird.Here&#8217;s the shared page, or go straight to the feed for it.There will be the occasional item in Swedish, but most of it is English.Addendum: I should also mention that I have a [...]
Thu, 05 Feb 2009 20:08:49 -0500

Bookmarks for 26/01 through 02/02 [New Window]
These are links I found interesting for 26/01 through 30/01
Mon, 02 Feb 2009 16:01:28 -0500

Postcards [New Window]
Ingvar kesson, chief spymaster of FRA, was on SR (Sweden&#8217;s Radio) openly declaring that citizens should consider all email sent on the internet to be &#8220;postcards,&#8221; thus making it perfectly okay for anyone who handles the postcard to read its contents.My first question here is what he thinks of people using a new technology called [...]
Sun, 01 Feb 2009 15:19:04 -0500

Bookmarks for January 25th through January 26th [New Window]
These are links I found interesting for January 25th through January 26th
Mon, 26 Jan 2009 16:19:32 -0500

OpenID Enabled [New Window]
I&#8217;ve enabled OpenID validation for comments now. Feel free to try it with a comment on this entry.
Sun, 25 Jan 2009 20:02:45 -0500

MrSvensson Scam Auctions [New Window]
So I got an unsolicited email invitation from some Maria that I&#8217;ve never heard of for an auction site called MrSvensson, that I won&#8217;t deign with a link.I&#8217;ve seen this sort of semi-scammy deal before. Sure, they have auctions. Sure, people win them and get the item. But the entire auction method is completely stacked.When [...]
Sun, 25 Jan 2009 00:02:24 -0500

Bookmarks for January 23rd [New Window]
These are my links for January 23rd from 04:38 to 04:41
Thu, 22 Jan 2009 23:49:40 -0500

Ode to Joy and Habanera by Beaker & the Swedish Chef [New Window]
Video of two classics -- Beethoven's 'Ode to Joy' and the aria 'Habanera' from Carmen -- as performed by my two favorite Muppets.
Sat, 17 Jan 2009 15:58:58 -0500

Enforcement [New Window]
Favorite quote of the month from this Techdirt article:Law enforcement isn&#8217;t supposed to be easy in a free society. If the goal of society was to make law enforcement&#8217;s life easy, we&#8217;d get rid of all privacy rights entirely. The excuse that this is somehow &#8220;necessary&#8221; for law enforcement to do their job is a [...]
Fri, 09 Jan 2009 21:14:21 -0500

Twitterpated [New Window]
I'm on Twitter now, posting interesting links and the occasional observation about the mundane details of my daily life. Follow me, if you think you can handle such excitement.
Sun, 04 Jan 2009 22:18:26 -0500

Geeks in Love Music Video [New Window]
This video is adorable, geeky, and hilarious. If you have friends like mine, it'll probably remind you of at least one couple you know.
Sun, 04 Jan 2009 21:56:27 -0500

Vocabulary Question: is Frenemiship a Word? [New Window]
What's the word for the condition of being frenemies? Frenemiship? Franimosity?
Wed, 26 Nov 2008 13:35:23 -0500

No Such Thing as Clean Coal [New Window]
Like unicorns, clean coal is a mythical creature.
Sun, 16 Nov 2008 01:19:43 -0500

icanhaz.com [New Window]
Like tinyurl, but with LOLcats. What do you mean it's not awesome?
Tue, 11 Nov 2008 12:02:15 -0500

Rings Around the World [New Window]
If this song doesn't at least make you bop around in your chair, you have no soul.
Mon, 10 Nov 2008 07:06:11 -0500

Better Than an Alarm Clock [New Window]
Drivers in New York City love their horns, and this morning I love the drivers.
Mon, 27 Oct 2008 09:12:44 -0400

 


RSS Mix Reviews [Beta]

We pick the best professionally-written reviews, and summarise them on one page.