Jeff

annual resolution post

So every year, I try to come up with some big resolutions for the new year. Every time after that I begin to fail at most of the resolutions, but the key here is most of them. This past year, Kim and I decided to try to overhaul our diet by limiting our intake of beef to once a week. This was a mix of both diversifying our diet and decreasing our red meat intake. We stopped paying attention around September, but overall (I, at least) have continued to eat red meat only once a week. My efforts of reading became secondary as I have spent more of my train rides coding, but I continue to read to some degree. I got married, which pretty much blew everything else that happened this year out of the water. I will probably write a 2012 wrap up post in the next day or so… I really need to write on this more. I have a recoded version of the admin side which should make it easier for me write more (since it is a pain to auth with the current system).

So anyways, onto the resolutions for next year. Every time I begin to think about the next year’s resolutions, I often put some through a sort of trial. In toying with some of the ideas, I think I have ironed out a few to stick with (for now). They are:

  • Keep a “lab notebook” This is something I have been trying for the past month, I am keeping an electronic journal of notes and daily work done in my professional field (both for work and for fun). I have been noting information related to various projects or technologies and keeping a daily summary of what I have accomplished and various thoughts on what I am working on. I hope to continue keeping this going, to track my progress and document my thoughts on stuff.
  • Take care of my photography I have written and worked on gallery uploads and taken pictures, yet none of the pictures have made it onto my site. I am debating switching from self hosting to something like flickr, but am not sure (they have a free 3 month trial of their pro service). I will probably take that for a spin and decide whether to trash or modify my current gallery code.
  • Finish some projects I have a good deal written for two of my projects (tamari and cimera) but have yet to finish them to a point where they are feasible. I also have a project related to work that is fairly far along, yet I have all but abandoned at this point. I really need to bite down and get these to a state where I can call them something other than alpha. I also need to put my admin page code up (it has been done for months and I have yet to stamp it down and start using it). I may also try to rewrite the site code at some point, as it has become more and more bloated and I have become more and more unsatisfied with messing with it.
  • Diversify my technology stack I have become fairly complacent in the languages and technologies I use. I could use for a change in window manager, major language(s), try to improve various application set ups, etc. I am becoming lazy when it comes to trying to improve the tools that I use, it makes me more and more dependent on a single application and not the knowledge I have in doing the task (example: I have been trying to write an application using pure JS, i.e. no jQuery, and it has been very tough).
  • Read I need to push the habit of reading more fiction and emphasize reading non fiction. I spend more time dicking around on my computer or watching TV when I get home, there is definitely room to improve that. (Maybe we will cancel our cable subscription ?)

So overall, a bunch of random efforts, most will probably not see the light of day. But my main goal is really just for me to adopt 1 or 2 of these and make them real habits I continue to follow for years to come (previously: giving up soda, diversifying my diet, switching to Linux, or giving up fast food). Maybe I will even write about my progress (and other things going on in my life.)


environment

The environment of a software developer is a very personal thing. It is where we spend a majority of our time working, it is our kitchen, our car shop, our workbench. Like how a chef likes to have everything in its place (mise en place), developers like to have everything in its place. I have become very specific about things like directory structure, command shortcuts, keybindings, etc. Some people prefer Windows, others OS X, and even others Linux, each for their own reason: comfort, customization, community, etc. Then within those systems, people prefer different tools, things like web browser, editor, window manager (for Linux users), languages, etc. The longer you spend time developing, the more your environment evolves. The speed in which I use my system is very efficient for me, but probably not much for anyone else. It is my kitchen, everything is mise en place.

In my “kitchen” I use Linux, specifically Arch Linux. I like this distro/flavor of Linux because it is pretty vanilla, meaning it doesn’t change a whole lot. It plays by normal conventions and relies on standard systems (if I want to install a python library, I will use pip, if I want to build something from source, it plays nicely and may even have a Arch specific make script). I also like that it comes with nothing out of the box. Just a TTY into the base OS. I can install the xorg server and setup the window manager I want, I don’t have to live with GNOME living and updating because the distro comes with it. The window manager I use is XMonad, a tiling manager written in Haskell. I was turned onto this by a former coworker who used it. A tiling manager (as opposed to a stacking window manager that most people are used to, where you normally drag, resize, and stack windows as desired) naturally splits the window between windows as they form tiles. So if I have two windows open, it will split the screen in half and give each window half the screen (vertically split or horizontally split, I can change with a simple keybinding). I can hop to a specific screen, workspace, and window with the press of a few keys, never needing to grab the mouse (this will be a big theme). The window manager and OS are my kitchen, they are the core of where I work, but not the tools I work with, not my knives and cutting board.

My tools of choice vary and evolve a lot more. They are a lot more modular, you can take a seasoned chef and give him a new knife and he will function with little change, but you put him in a new kitchen, with a new layout, and he will slow significantly. My tools of choice are vim for my text editor (I am still learning), tmux for my multiplexing (I just switched from GNUScreen) which allows for me to keep a bunch of stuff in a single terminal (and detach it if needed), Chromium as my browser (learning luakit, but not good enough to use it regularly, soon hopefully), irssi as my IRC client (weechat is looking really awesome, have been using it on the train, need to customize some more and it’ll take over), mutt as my e-mail reader (this is new and is not replacing anything, has a lot of work needed still), and zsh as my shell along with urxvt (or rxvt-unicode) for my terminal emulator.

With these “tools” in this “kitchen” I have become a fairly efficient and capable software developer, but I am continually learning new tools and techniques to streamline my development. I am trying to use TDD principles in my personal projects right now, which is hard because I really don’t have interfaces figured out for what I am writing, but I am continually trying to upkeep unit tests to simplify the testing of what I write. Hopefully this gives some insight into thinking about how to streamline your workspace both physically and digitally. You would be surprised some of the quick shortcuts you can learn/setup and how much it will speed up your usage of your computer.

The configs should all be on my github (link at the bottom).


ideal setup

I always question myself what my “ideal” setup would be (in terms of a computer). It has changed a lot over the years as my priorities have changed and my interests evolved. I used to want a multi-monitor desktop with tons of power so I could do whatever I wanted (like gaming).

A few years ago, I made the jump to using Linux, so the gaming ideal started to die (I rarely play games these days, preferring to spend time with Kim or read). With my move to Linux, the choice of OS became a trait in my ideal setup. That has grown more so with my move to Arch and the barebones build up I have grown used to with it. I now have many tools of choice and a window manager of choice (which can change whenever) that I want to be free to choose and customize as my needs require.

Starting when I was visiting Kim at school every few weekends, and much more now with my commute to and from downtown for work, a desktop is no longer satisfactory as I am not right at it most of the time (I was a lot more in college), so portability became part of this. But not just portable (I have a netbook that I used while I was visiting on weekends), I also want it to be able to do things. It doesn’t need to be a powerhouse (I still have my powerful desktop I can connect to for the heavy lifting) but perform admirably (Things like watching movies, listening to music, loading a webpage).

With the requirement of portability comes a trouble, connectivity. A desktop is always in a location that is (preferably) connected all the time. The portable laptop is not always online (no WiFi on train, at restaurant, etc.) so the resources of the internet and the more powerful desktop at home are lost. Connectivity becomes a factor with the need for portability (but connectivity that is affordable for the need).

This brings me to my current setup, which is (for now) around what I consider ideal. With the latest round of Ultraportable laptops, I saw the idea of a portable (for me weight is an issue, I don’t like lugging around a heavy brick of a machine) laptop that could perform as a reality. The OS factor jumps up a lot with laptops though, as Linux compatibility is not complete on most laptops, especially brand new ones (they use new chipsets that haven’t been developed against). So I had to do some research in the plausibility of my distro of choice (Arch) or any other distro working on the desired hardware. In terms of hardware for this class, the MacBook Air (laugh, it is ironic that I use Apple hardware) is the best (everything else is first gen, lacking in various small areas that build up). But it is naturally proprietary everything from the bootloader to OS, so I found some information on getting Arch running on MacBooks and spent a week backing up the OS X partition and getting Arch running (and then fixing the various issues, such as bad support for the i915 chipset, since fixed in the kernel). I spent a few months with that, taking train rides and trying to save reading and documentation on the system so that I could access it while unconnected.

This gave me the portable, powerful, Linux based system I wanted, but I lacked the connectivity. Recently, I setup my phone to tether internet to my laptop (as in 2 days ago) and am now writing this entry from the laptop, while pulling into the station. So, for now, I am where I believe I want to be, but this all may change.