-
View this repository in my editor, and I don’t care about keeping it
My current job has me doing a lot of node.js. The documentation story in most of the community is very much “read the source”.
This is a little bit of a contrast to the Rails community, where, even in Rails 1.2.3 (when I entered the scene) I rarely had to dig through source code to find an answer to a question.
Anyway, I find myself reading a lot of node package code. Viewing the code directly on Github is OK for a simple package, but I usually want to be in my editor.
I also want these packages I download to go away, eventually. I could use Hazel, or I could shove things in
/tmp/and let the system clean it up eventually.So I wrote a script:
This script is great coupled with LaunchBar’s Unix Executable support. I can select this script from my Launchbar, SPACE, paste a git clone path, option-return and half a second later I have the project in my editor (BBEdit).
If the package means my needs I may add it to my node project. Once I do that viewing the code is just a
node editaway, but when trying to choose between 2 different-but-providing-similar-functionality packages, making a temporary clone is great. -
Open Source
I often find myself doing open source work. Mostly this is small improvements to already existing projects, but sometimes there are projects I’ll open source from scratch.
However, most of my work is using an open source project, and find a way to improve it. This improvement could be a bug fix, or better error messages, or improvements I’ve needed to get my job done. Sometimes clients even pay me to implement some features in an open source projects.
For the last 4 years or so most of my contributions have been via Github.
Github works by people “forking” (copying) an open source repo to their own user account, making changes, then submitting those changes back to the main project repository. This works great, except sometimes people fork projects to their user account simply to have a copy of the code.
So, you could have an account with a ton of forks - as a person browsing the account you don’t know if they’ve made contributions to the project or if they just want a copy of the code for their own.
Projects I’ve contributed to
I don’t know how to solve this problem, but I do know that I can list projects that I’ve made non-trivial contributions to, and where my code was accepted:
- Bundler, a Ruby gem
- libgit2, a C library implementation of Git
- objective-git, a Cocoa framework over libgit2
- Paver, a Python package
- twitter-bootstrap-markup-rails, a Ruby gem
My Github page shows other contributions to the open source community in large: examples, tools, things for text editors, and some original libraries of code. However, I really do enjoy the times when I can contribute a small change to an open source project that makes everyone’s life a little better.
My own projects that I’ve worked on
In addition to improving other people’s projects, Github also lets you publish your own projects. Most of mine are small projects, but I have published a few larger projects:
- the school_days gem: because some days you need to know if
Date.today.school_night? - the delegate_presenter gem: a gem based on Avdi Grimm’s thoughts on presenters. This was before the release of Objects on Rails.
- RunningBalance: a checkbook example app with API and mobile browsing considerations
- ChatChat, a Meteor play project: woh, I played with Meteor once
-
(natural) Handwriting Recognition on your iOS device
Goal: Creeping towards the paperless lifestyle
I’m trying to get into the paperless lifestyle this year. I’m making small changes to facilitate this.
I keep a paper notebook for scratch writing while I work. Mostly the notebook contains things I need to remember for the next 5 minutes, but can forget afterwards. Sometimes it contains more permanent notes: TODO times, thoughts, things to research
I want to be able to make these thoughts paperless. Yesterday I stumbled on a workflow that works for me.
My Workflow
Use MyScript Memo - this will do handwriting recognition and give you the text to be copied.
Send it over to the Mac via PasteBot, or save it via a Dropbox editor
But it can not do handwriting recognition on pictures
So when get idea need to save grab my iPad and stylus and enter it!!
Questions and Answers
Q: Why not Evernote?
A: I want to get the translated text, so I can make corrections to it. Evernote translates the text but I can’t go back and edit the guessed at text. I can’t even export the text: exporting the image gives me an XML document with the image data and each translated word in it’s own XML element with coordinates. I can see why this (for highlighting the text on the image), but seriously I don’t care.
Between my bad handwriting and all the technical terms I use, I really need to be able to go back and correct my text.
Also, with this workflow, the only thing that matters is the text: I don’t care about the
.jpgof a picture of my writing. Evernote sees the picture as the thing that has text metadata - I want the text as the thing, with the image being metadata.Q: Why MyScript Memo?
A: I want to be able to handwrite my notes THEN trigger recognition. I don’t want to fight with computers when I’m taking notes in a meeting.
I also want a full page to write on - not just some small 3”x3” space at the bottom of the screen. I want a notebook page that works like a notebook page in the real world.
Q: What sucks about MyScript Memo?
A: I want a bigger digital canvas. Infinite Sketchpad is awesome at this, but there’s no recognition. But Myspace Memo I can get about half a page of physical notepaper (I rewrote some notes I had laying around) so I guess that’s OK.
I believe some of these concerns are addressed in another MyScript product: MyScript notes mobile. While I get a new iPad I’ll try it out (I have an iPad 1).
I’ll probably still use Infinite Sketchpad when I’m mapping out processes or code or something.
MyScript Memo seems a little slow on my iPad 1, but is quite snappy on my iPhone 4S. I’m looking forward to when I upgrade my work iPad.
Q: But why do this in the first place? Why write something?
A: when I’m in a formal and scheduled meeting I will often take notes on my computer. I have a special document for these notes so this has become second habit to me. However there are two places where I want to use handwriting:
- Random thoughts I have while working on something. I normally put these ideas in my scratch notebook - a 8.5x11 school notebook - but now I can put them in my iPad without swithving modes from “writing with pens on paper” to “pull up my notes file and start typing.” I’m aiming for low friction data entry.
- I can write faster than I can type on the iOS keyboard
I’ve recently purchased a Bluetooth keyboard to try and fix issue 2, but that’s useful when I’m writing an important email on my phone or writing text longer than a tweet.
It’s still early in the process - it’ll be another week before I know if I can stick with this workflow. I use my iPad to read technical books/PDFs, sometimes as a fourth screen, and as a tool when I’m brainstorming at my whiteboard. I look forward to seeing how handwritting turned into searchable text changes how I work
-
We need to celebrate those with 20 years experience
A recent tweet by a SF tech recruiter put down those with 20 years experience as “[it]… only means you’re forty”
Instead of decrying 20 years experience (“Go home, old man!”) we should celebrate it.
Because 20 years experience as a computer programmer means:
- 20 years of too much stress (At least once a year or so I’m on projects that require me to work at 150% capacity for 3-5 months).
- 20 years of late projects being “solved” by adding more people, or (better yet) adding more features.
- 20 years of weekly or biweekly drama, either in your development community of choice, or internal company drama.
- 20 years of explaining to your new manager (who used to be a secretary, long haul truck driver, or sales person) how software development works and how to manage a dev team.
- 20 years of trying to follow “just make it work” orders from a manager, when the technical debt of the codebase fights you every step of the way (while said manager breaths down your neck for status updates).
- 20 years of blame.
- 20 years of fighting bugs that happened when you upgrade from one version of something to the next.
- 20 years of dealing with ever changing (potentially contradictory!) demands.
- 20 years of software cycles (server -> desktop -> server ->…)
- 20 years of refining requirements into something that can be implemented.
- 20 years of too many deadlines.
- 20 years of job requirements that boil down to “want 25 year old willing to work for peanuts and move to San Francisco”.
- 20 years of explaining things and getting rebuffed because the manager “knows better”/thinks you are just being cranky/is “willing to take that chance”/tuned out after you said the word “problem”.
- 20 years of explaining that lines of code is not a good productivity measure (nor is individual completed agile story points per iteration, or pretty much anything else).
- 20 years of dealing with cranky nerds (who are sometimes cranky at you)
- 20 years of learning to dealing with, and questioning, recruiting pitches.
If you’ve been programming for 20 years you’ve seen all of these things and probably much more. Even if you’ve been working away in some state’s IT department, migrating some legacy system from Cobol to Java for the last 6 years your experience is still valuable. Because you’ve seen it all before, and picked up programming languages like normal people pick up how to use applications.
Managers and recruiters: if you can keep your ego in check a little bit, these people can be awesome to have on your team. Why? Because:
- They know what’s going to happen after that “crunch” weekend of people pulling 20 hour days for 3 days straight
- They know that your application internally is a buggy version of half of a 50 year old programming language
- They can sometimes take a super hard problem, solve it and prove the solution by relational calculus, or graph theory, or other really hard math.
- They are probably more willing to speak up than the young guns on your team.
- They’ve seen many things before: “Oh, reactor pattern framework? Oh, been there done that, 15 some years ago!”
- They can sometimes manage working on projects with 3 near-simultaneous deadlines.
- They probably have fulfilled more roles than just developer: product development person, client relations, recruiting, evaluating new hires, coach, manager, QA tester, conference organizer, salesman.
While years of experience isn’t a great measure of how good a programmer a person is, you know the person has been around the block and (probably) experienced the majority of things on this list — they certainly deserve better than, “get off my lawn, old man!” that the recruiting/startup community seems to exude.
-
My new IPad stand.
Yes those are eraser covers. Works pretty well. My iPad case has good landscape support but not portrait. Yet I was reading a portrait document.
-

Why Divvy
Sometimes I want a set of windows regularly across the screen, and sometimes I want the ability to resize my windows in arbitrary (but common) sizes.
With Divvy if I really want to create a 1 row size window in the middle of the screen, for Bog knows what reason I can. I have yet to see this ability in other “tiled window managers”.
With Divvy I can reposition and resize a window with a simple drag. I like it.
So, what do you want to do now?
Title my windows so there is no space left on the screen. This is partially so I can see everything at one time and be efficent. It’s also partially a work around around OS X’s fucked up desktop picture “management”, but whatever. (Seriously, try setting a desktop picture across spaces and with a 2+ monitor setup. It’s impossible.)
My Divvy Setup
Pictures of my Divvy setup are here.


I have a Microsoft 4000 with a full size keypad so I’ve set up these Divvy shortcuts to be activated via the numpad.
I also have enough oddball shortcuts to remember on my system, so these are not global shortcuts. I first bring up Divvy (Control-Shift-Space for me) then hit 9 on my numpad. Namespaces are good - let’s do more of those!
What this results in
I can quickly take two windows and tile them side by side down the full length of my screen.
I can quickly take a window and resize it to take up the top or bottom, left or right, side of my screen. I can go from “two full length side by side” windows to “four quadrant windows” in 3 seconds.
I can also mix it up: I often have 2 half length windows open on the left and one, full length, window open on the right.
Why Not?
Slate? When someone writes a 100 page PragProg book on it I’ll look into it. Trying to understand Slate I’m reminded of the last time I tried to look at X11 configure files.
Size-Up? I like to have the option to create arbitrary sizes. While my standard sizes are (now) 80% of my window management needs sometimes I want something custom.
Moom? Same thing: no arbitrary sizes.
-
Will Programmers continue to have such high wages? (TL; DR: YES)
Yes, because there’s always some new thing that’s super hard. No matter how much we advance the craft there’s always a new challenge in front of us, no matter if we conquered the previous challenges or not.
Take a flip answer to that question from various eras of computing:
- 1970s: “Yes, because structured programming”
- 1980s: “Yes, because event loop and/or graphical interfaces”
- 1990s: “Yes, because networking”
- 2000s: “Yes, because pointers”
- 2010s: “Yes, because concurrency and or asynchronicity
I can imagine the following answers for the next few decades:
- 2020s: “Yes, because gestures/motions”
- 2030s: “Yes, because genetic programming”
- 2035: “Yes, because maintenance programming”
- 2040s: “Yes because damn stupid AIs”
So yes, I see the learning curve of programming continuing to be a hocky-stick like curve. Yes, it’s relatively easy to teach yourself some HTML and Javascript and build something, then things get harder and harder as you learn more and more. Even if your able to do more and more with a lower and lower skill level there will always be hard problems to solve that need an experienced programmer, and that means well paid.
And this just rounds up the technical reasons. We’ll always have people who want software built but don’t know what they want; processes that - once you dig into them - become more and more complex; and companies that want to “push the edge of what tech can do”. These people problems - that have been the same since the early days of computing - won’t be going away.
-
Why “just teach the unemployed to program” isn’t a good answer
I hear this argument a lot:
Oh, you’re unemployeed or can’t find a job? Just learn computer programming - I hear Microsoft is gagging for people.
As a professional computer programmer, let me weigh in:
I spent 2 years during high school learning to program after school. I started consulting part time during my freshman year of college for a local programming consulting shop. The first year or two at that job I knew very little (looking back on things now), struggling to learn the trade. I’m glad my employers were OK with that.
Fast forward 4 years, and I started my own consultancy business out of college. Doing computer programming consultancy is hard: in addition to having technical chops you also have to do project management, manage cash flow, deal with clients who fight you about money, know basic accounting, you name it. In my own practice there were a lot of years that were “famine” years, and only a few that were “feast” years.
So maybe you think that you can get a job as a programmer with a startup, because startups are what everyone thinks about now. In my experience you need two things going for you to get a job at a startup: 1) living in SF or NYC and 2) having 2-3 years of professional experience in their language of choice. If you don’t have both of those things the pickings are pretty slim.
The thing about startups is because the team size is so small they can’t (or don’t think they can) deal with bringing on a newbie programmer and the slower output they will have.
Please don’t do DevBootcamp or CodeAcademy and think that you can put our your consultancy shingle, working for clients directly. If you really want to go that route find a more experienced freelancer to subcontract with for a year or two, and learn from them.
In one way, the world of web development is easier than the programming world I grew up in (writing C and C++ programs for desktop computers), and perhaps with laser focus on web development you could be a good developer in 6 months. HungryAcademy thinks it can train people to do that, and I have seen amazingly talented people go far with very little (comparatively) training. Then again, there’s at least 4 languages to any moderately complex website (CSS, HTML, JS, and a server-side language), so there’s a lot to cover.
But certainly it’s not a matter of just picking up “Learn Web Development in 24 hours” and a day later being able to charge clients $100/hour for websites. Your looking at half a year at least, if not 2 years at least before companies take you seriously. And probably 3 or 4 years before you really should be taking on clients yourself.
And this is assuming you have the personality and passion for programming. Having tried to train a number of people to be programmers…. it takes a certain type of person to be really good. I’m sure this is as true of other fields as it is of say the Marines.
So sure — certainly if your unemployeed and looking to get an edge up and make a long-term investment in yourself (or just learn something fun!) maybe spending 10-30 hours a week learning programming (between job searching) is a good idea. Maybe in 6-12 months you can make something interesting that people like or think shows enough potential that they’re willing to take a chance on you. But it’s not a panacea.
Especially not when applying to Microsoft, where they want the best of the best.
-
Replicating Github Launch with Launchbar (well, almost)
Github Launch is pretty cool - a command line interface for Github.
There are two things bad about it:
- It’s dog slow on Firefox
- It’s entirely Javascript based - I can’t build a tool that sends a command to Github launch outside the browser.
I worked around issue one by typing my command in another window, pasting the result into Github Launch, then hitting return. This kind of sucked, but whatever.
Today I realized that mostly the Github launch commands were mostly just a clean interface around the RESTful URL structure of Github.
So I wrote a search Template for LaunchBar.
The search template looks like:
http://www.github.com/*It does require a slightly different syntax than Github launch, but it’s also super easy.
Here’s how I use it:
- Type: “Github” in Launchbar
- Press spacebar to trigger the text input field
- type
rwilcox/github_my_activites - Press return, be taken to the appropriate repository.
Now, this doesn’t provide tab completion like the Github Launch bar, but tab completion didn’t work for me anyway (dog slow on Firefox).
-
Embedding images into Github Tickets
It’s hard and annoying to embed images into Github Markup renders.
The great thing is that since everything in Github is markdown, this trick will work everywhere.
The trick is to use an external host to host your images, then link to them by putting a
!in front of a normal Markdown link statement.But, ugh, external host, right?
NO
Here’s how to do it step by step:
- Put the image for Github inclusion in your Dropbox
- In the Finder (not PathFinder) right click the file and choose Dropbox -> Share File
- Close the share web dialog that your browser opens and copy the URL
- Add
?dl=1to the resulting link
I like to keep my things out of the public folder, so I just use this basic sharing feature. However, I can’t script away the annoying part as apparently part of the link is link specific, not user specific. Source: Scroll down to the ‘for our advanced users’ section of this Dropbox tech note
Alternative Way
If you have your own web space there’s the awesome Automated Transmit Uploader on Github. Although part of me would rather use Dropbox for this… MAN this workflow is really easy.
