My name is Eric Pruitt, and I currently work at Pinterest as a Site Reliability Engineer. 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:
- Q: What does "codevat(.com)" mean?
A: It's two words: "code" as in software source code and "vat" as in an industrial storage tank or chemical mixing vat.
Table of Contents
- Operating Systems and Hardware
- Graphical Environment
- Terminal Emulation
- Web Browsing
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 virtual machines running OpenBSD and FreeBSD that I use 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.
- CPU: 8 core AMD FX-8350 running at the default clock speed of 4 GHz.
- RAM: 32 GB (4x 8GB 1333MHz DDR3 SDRAM)
- 2x 500GB SSD; configured with Linux Software RAID 0
- 1x 1TB HDD; used for backups
- Video Card: 8 GB nVidia GeForce GTX 1080
- Keyboard: CM Storm QuickFire Rapid with CHERRY MX Blue Switches
- Monitor: 24 inch Dell U2412M
- Mouse: Logitech M500
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.
Mac Mini (Late 2014 Model)
- CPU: 3.0GHz Dual-Core Intel Core i7
- Operating System: macOS Sierra (10.12)
- RAM: 16GB 1600MHz LPDDR3 SDRAM
- 1x 512GB OEM SSD
- Video Card: Intel Iris Graphics
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)
I use Mutt for reading and sending email with Vim acting as the editor when I compose messages.
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.
I use Git for revision control in my personal projects, but I keep other applications like Subversion, and Mercurial installed since there are still a lot of popular projects using these systems.
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.
When I worked at Google, my corporate Gmail account received 3,000 to 4,000 emails per week at its peak. I accessed my work email using the Gmail web interface and my cell phone. Since my work email needed to be accessible and synchronized across multiple devices, I used 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 received never even land in my inbox. I will probably use a similar approach at Pinterest once I have settled in.