About Me and How I Work
- Last Updated:
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:
- Email: Eric Pruitt <eric.pruitt@gmail.com>
- PGP Key: F8601B5D2511B4C353523248
8DDDE2E6053692AB - Keybase: https://keybase.io/ericpruitt
- PGP Key: F8601B5D2511B4C353523248
- GitHub: https://github.com/ericpruitt/
- LinkedIn: https://www.linkedin.com/in/epruitt
FAQ:
- 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 in the same vein as a "bit bucket."
Table of Contents ¶
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.
Personal Workstation ¶
- CPU: AMD Ryzen 9 3950X 16-Core Processor
- RAM: 128 GB (4x 32GB 3200MHz DDR4 SDRAM)
- Storage:
- 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 G203
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
- Storage:
- 1x 512GB OEM SSD
- Video Card: Intel Iris Graphics
Graphical Environment ¶
Notifications ¶
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.
Fonts ¶
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.
Window Management ¶
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.
Terminal Emulation ¶
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.
tmux ¶
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.
Bash ¶
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
[1]+ Stopped vim -X pages/about-me.md
(148)
website [1]$ make
[...]
website [1]$ 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.
Web Browsing ¶
My primary browser is Firefox, but I usually keep an instance of Chromium, the open-source version of Google Chrome, running in the background. I like Firefox's interface more than Chromium's, but Chromium's JavaScript and rendering engine far outperforms Firefox making it better suited for JavaScript and CSS-heavy websites. My Chromium session is usually logged into my personal Google account so I can use the Hangouts browser plugin and quickly access things like Google Cloud Platform, Google Drive and Google Plus.
At work, Google Chrome is the only browser I use.
Productivity ¶
Coding ¶
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.
Managing Email ¶
At Home ¶
My mail processing pipeline consists of three programs I wrote: gmfetch, which downloads messages from Gmail and pipes them to siftmail; siftmail, which is responsible for sorting messages into folders; and throwmail, which is responsible for sending email. I wrote gmfetch to replace fetchmail because, due to how labels and folders work in Gmail, I was unable to configure it to move messages to Gmail's trash folder after they were downloaded. Similarly, I wrote siftmail to replace procmail. Procmail is unmaintained and makes use of a quirky, esoteric DSL, and I became increasingly concerned about its security. Throwmail is not an MTA itself but sits between one and Mutt providing the ability to generate HTML emails by parsing plaintext messages as Markdown, file local copies of outgoing messages, and it also implements forgotten attachment warnings and the ability to prevent delivery based on certain patterns. For example, with my current configuration, if the words "DRAFT" or "ON HOLD" appear in the subject line, throwmail will refuse to feed the message to the MTA.
I download all of my messages from Gmail and store them locally. After noticing a number of legitimate emails landing in my Spam folder each month, I configured my message processing 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
At Work ¶
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. At Pinterest, the volume of emails I received was low enough that I used bog-standard Gmail filters.