My name is Eric Pruitt, and I currently work as a Site Reliability Engineer at Google. This page discusses the various tools I use be productive. It contains a lot of technical terms and jargon, but I've tried to make it more accessible by providing links with more exhaustive explanations of various terms.
Around the Web:
- GitHub: https://github.com/ericpruitt/
- LinkedIn: https://www.linkedin.com/in/epruitt
- Google+: Eric Pruitt
- Keybase: https://keybase.io/ericpruitt
Operating Systems and Hardware
I use Debian Linux on my desktop and laptop, and I run whatever the most recent stable release is. I have a virtual machine running OpenBSD that I use primarily for cross-compilation to help ensure C programs I write with the intent of being POSIX compliant actually work as expected on operating systems other than Linux. A lot of the Windows applications I use work well in Wine, but for those that don't, I use a VirtualBox virtual machine.
Below is a picture of my old desk last used in August of 2016. It has since been replaced by a collapsible table. Beneath the desk is my subwoofer, and the device with the green lights sitting on top of that is my router. The shelf on the right has various books with a TI-84+ SE, TI-83 and TI-89 Titanium at the front to the left. Although the blinds to the right are closed in the picture, I generally keep them open during the day; I enjoy working in a well-lit environment, and the view outside is nice.
Personal Workstation: Custom Build
- Monitor: 24 in. Dell U2412M
- CPU: 8 core AMD FX-8350 running at the default clock speed of 4 GHz.
- RAM: 32 GB
- Disks: 2x500 GB SSDs (Linux Software RAID 0) and a 1 TB HDD for local backups.
- Video Card: nVidia GeForce GTX 560 Ti
- Keyboard: CM Storm QuickFire Rapid with CHERRY MX Blue Switches
- Mouse: Razer Death Adder 2013
I run my workstation without a swap partition because I grew tired of waking up to a system that was sluggish because all of my applications had be paged to the disk. Short of fork bombing myself, I never run out of physical memory, and there's no good reason for my operating system to ever swap out pages of physical memory to disk.
I rely solely on visual notifications for things like instant messaging and email alerts. Toaster notifications are disabled in favor of status bar indicators. I used to use auditory alerts, but I eventually realized that the noises were significant stressors for me. This may have developed in part as a Pavlovian response to dealing with fires at work where sudden barrages of instant messages were often heralds of something being terribly broken.
I look at a fair amount of content that contains Chinese, Japanese and Korean (CJK) characters even though I neither speak nor read any of those languages. The font I use for Japanese characters is VL Gothic, and for Chinese characters, I like to use Wen Quan Yi Zen Hei which also has coverage of Korean characters. Both of these fonts have similar weights, so when characters from either set are juxtaposed, there is no stark contrast within the text. Outside of those fonts, I tend to stick with Debian's defaults (DejaVu Sans, DejaVu Mono and DejaVu Serif) for everything else.
I use dwm which is a tiling window manager. I usually have one window on each tag (similar to workspaces in other window managers) with one notable exception: all instant messaging windows are placed on one tag which I then toggle on and off with a keyboard shortcut to read and respond to instant messages.
Click here to see a full-size screenshot of my monitor.
Most of my time outside of a browser is spent in a terminal using Text User Interface (TUI) / Command Line Interface (CLI) applications. My terminal emulator of choice is st. It's fast and more importantly, has excellent support for fallback fonts; when my primary font, DejaVu Mono, is missing a character (most commonly CJK characters), st will search through all of my installed fonts to find a font that does have the character and temporarily use that font instead. I have previously used xterm, urxvt and GNOME Terminal, but my reasons for abandoning each of them probably deserves a page of its own.
I typically have no more than one terminal emulator window open and use tmux to multiplex shells. My tmux configuration has two modes. In the default mode, tmux is setup in such a way that I can use Ctrl+T and Ctrl+(Shift)+Tab to create and jump between tmux panes as though they were tabs in a GUI application.
However, if I split a view so I can see multiple panes at once, Ctrl+Tab and Ctrl+Shift+Tab change behaviours and cycle between visible panes. If I temporarily need to cycle between a hidden pane, I can use Ctrl+F then "n" and Ctrl+F then "p" which are shorthand for "next" and "previous," respectively.
My shell of choice is Bash. I played with Z shell, but I didn't find any of its fancy features particularly enticing and went back to Bash. I keep my Bash configuration fairly simple. My prompt does nothing more than indicate the name of the folder I am in, the number of programs suspended in the background and, when I'm accessing a computer remotely, the name of the machine I'm logged into. Here's what a typical Bash session looks like for me:
~$ cd ~/projects/website/ website$ vi pages/about-me.md + Stopped vim -X pages/about-me.md (148) website $ make [...] website $ fg vim -X pages/about-me.md
In the example above, I enter the directory containing my website's files, edit this page, suspend my text editor, re-build my website, then re-open the text editor. The number in parentheses is the exit status of the last executed command.
Mutt (Email Client)
Since Mutt does not have the ability to handle HTML-only emails on its own, I farm out the work of rendering those messages to links, a CLI web browser. Although links' rendering is not as good as elinks', it renders much more quickly and generally does a good-enough job. If I have trouble reading an email with links, I will fall back to using elinks or, as an absolute last resort, view the email in a browser after manually verifying it contains no malicious content.
At work, Google Chrome is the only browser I use.
I write all my code using the terminal version of Vim. I don't use many plugins, and my configuration is fairly minimal. Right now, the only languages I spend any notable amount of time developing for are C and Python which I debug using gdb and pdb respectively. When I do develop in PHP, I rely on logging statements to debug code since very few things I write in PHP take longer than a few hundred milliseconds to execute from start to finish.
My personal email is downloaded from Gmail with fetchmail which is in turn processed and sorted into folders by procmail. After noticing a number of legitimate emails landing in my Spam folder each month, I configured my message processing to chain to also download messages Google classified as Spam. To reduce the number of false-positives, some local checks are performed to decide if Google's classification was correct. All outgoing messages are composed in Vim then passed to a script written in Python. The script does three things: it first scans the contents of the email and checks to see if there's anything indicating I forgot an attachment. After that, it feeds the message to msmtp which in turn delivers the email to Google's servers. Once the email has been accepted for delivery by Google's servers, a copy of the message is fed back into procmail to be archived locally.
As of late 2016, my corporate Gmail account receives 3,000 to 4,000 emails per week. I access my work email using the Gmail web interface and my cell phone. Since my work email needs to be accessible and synchronized across multiple devices, I use a different approach for organizing emails at work. I wrote a tool called EIML that I use in conjunction with a Go program to organize my email: EIML downloads emails from Google's servers, feeds them to the Go program and applies any labels that the Go program emits. Most of the emails I receive never even land in my inbox.
I use rsync to backup my data to a remote server and a local hard disk drive, and I rarely have less than two copies of any of my data. When Amazon glacier was announced, I evaluated using it for remote backups, but I found its retrieval times unappealing. Google recently announced Nearline Storage which offers much faster retrieval times than Amazon Glacier while remaining competitive with respect to costs, and at some point, I'd like to create a Nearline-based backup solution.