How to use Git on Windows with PuTTY

Use PuTTY's plink.exe and Pageant to make Git work over SSH on Windows, with keys loaded from the tray agent and GIT_SSH set for command-line use.

Using RSpec's late resolving of "let" variables for cleaner specs

Lazy let evaluation keeps RSpec examples shorter when a setup call has many required arguments, and lets stubs change the result before the value is used.

How to upgrade RubyMine

Upgrading RubyMine safely keeps the previous version available and preserves settings, license data, and launchers during the switch to a newer release.

Read your mail in networks that forbid e-mail traffic

Restricted networks can block mail protocols while still allowing SSH. Tunneling the mail connection through a trusted server lets an e-mail client reach the server from localhost.

Move a Gnome panel to another monitor in Ubuntu

Moving a GNOME panel to another monitor in Ubuntu 11.04 requires disabling Expand, dragging the grip handles, then enabling Expand again.

Opening Rubymine projects from the command line

Open RubyMine projects directly from the terminal with the mine launcher, attaching to a running instance or starting the IDE if needed.

Lessons learned from implementing Highrise's custom fields feature

We recently added custom fields to Highrise which allow you to keep track of extra details beyond standard contact information like phone, email, address, etc. After the launch, we had a “looking back” conversation to see what lessons could be learned from the process.

Better is better: improving productivity through programming languages

Programming language popularity rises and falls with productivity trade-offs, tooling, and developer experience rather than technical elegance alone.

The Rise of "Worse is Better"

An ancient essay on software design that, after 20 years, should still guide you for every line of code you write.

When Google analytics won't let you add a @googlemail.com account

Google Analytics may reject older @googlemail.com accounts as invalid Google accounts; using the equivalent @gmail.com address can resolve the sign-in problem.

"no such file to load require_relative (MissingSourceFile)" after installing ruby-debug

Installing ruby-debug can trigger a MissingSourceFile error from require_relative; pinning linecache to version 0.43 resolves the load failure.

Helpers to render (money) amounts

Formatting numeric and currency values for display, with configurable decimal separators, minimum precision, and a dash for missing amounts.

Why developers should be force-fed state machines

Most web applications contain several examples of state machines, including accounts and subscriptions, invoices, orders, blog posts, and many more. The problem is that you might not necessarily think of them as state machines while designing your application. Therefore, it is good to have some indicators to recognize them early on. The easiest way is to look at your data model.

What’s Up With All These Changes in Rails?

Yesterday, there was a blog post entitled “What the Hell is Happening to Rails” that stayed at the number one spot on Hacker News for quite a while. The post and many (but not most) the comments on the post reflect deep-seated concern about the recent direction of Rails. Others have addressed the core question about change in the framework, but I’d like to address questions about specific changes that came up in the post and comments.

Unpack a .tar.gz archive

tar archives compressed with gzip can be unpacked in the current directory with -xzf; the same command style also applies to other tar formats.

Order in which RSpec processes .rb files

RSpec file loading order affects test stability only when examples depend on global state; version defaults differ between alphabetical, disk, and random execution.

Stubbed class methods in RSpec 1 remain stubbed in other examples

RSpec 1.x can leave stubbed class methods in place between examples, causing order-dependent failures when spec file evaluation changes.

New Cucumber Factory makes it easier to associate records

Cucumber Factory now links records by any string attribute, reducing the need to assign explicit names when reusing previously created objects in feature scenarios.

15 criteria for evaluating software product ideas

Choosing the right product to develop is crucial. Great execution is also very important. But if you develop a product that no-one wants or no-one is prepared to pay for, then you are going to fail, no matter how well you execute it. You can often tweak a product or its marketing to make it more successful based on market feedback (‘pivot’) . But the less pivoting you have to do, the better. Below I list some of the criteria I think are important for evaluating the potential of new commercial software products.

Example .ssh/config file

A reusable ~/.ssh/config template can simplify SSH access with host aliases and keepalive settings, then be adapted to personal needs.

A nicer way to run RSpec and/or Cucumber

Convenience scripts streamline RSpec and Cucumber runs with bundle exec, parallel execution, spinner support, and a full test check against regressions.

Don't forget to add ":dependent => :destroy" for join models

Join records can be left behind when parent records are deleted, causing orphaned data and inconsistent associations. :dependent => :destroy removes them automatically.

Dynamically skip Capistrano hooks

Avoid repeated remote database dumps during Capistrano deployments by skipping the db:dump hook with a deploy flag or environment variable.

Mark up text in Balsamiq Mockups

Inline markup in Balsamiq Mockups adds bold, italic, and hyperlink styling to editable text; bold often looks unchanged because many widgets already use bold fonts.