# אליהו א. סולטניק, Ph.D.

Evan's First Name @ Sultanik .com

Computer Security Researcher
Trail of Bits

מרצה מן החוץ
אוניברסיטת דרכסל
החוג למדעי המחשב

## On the Economics of Higher Education

### In which I apply flimsy math and hand-waving to justify the time I’ve wasted in school.

There has been much “messaging on twitter” [sic] and “posting to blogs” [sic] of late regarding the economic benefit of pursuing a graduate degree in Computer Science. For example, there are claims, among other things, that a masters degree will require 10 years to earn back the income lost during study. A Ph.D. will require a staggering 50 years. Most everything I’ve read cites this article based upon Dr. Norman Matloff’s testimony to the U.S. House Judiciary Committee Subcommittee on Immigration. Curiously, the article everyone seems to cite does not itself have a bibliography. It does, however, credit “a highly biased pro-industry National Research Council committee” for calculating these numbers. Five to ten minutes of “searching on Google” [sic] and I was unable to find a report from the National Research Council corroborating such a claim. Can anyone point me to a link?

I do not dispute that these numbers may be correct; the purpose of this blog entry is to point out that, at least in the case of most with whom I’ve matriculated, it is flat out false.

Here is my (admittedly simple) mathematical model:

$n=\frac{t ( E[s_w] + c )}{E[s_a]-E[s_w]},$
where,
• $t$ is the number of years spent in school;
• $E[s_w]$ is the expected salary one would have earned if one did not attend school;
• $c$ is the net monetary cost of attending school per year, such as tuition paid, books purchased, &c. This value should also take into account any income earned during a school year (e.g., one’s stipend) and in many cases will be a negative number;
• $E[s_a]$ one’s expected salary after graduating school; and
• $n$ is the number of years one would have to work after graduating to make up for lost income.

Note that this model does not take attrition into account.

## Flexitarded

### In which I blatantly offend yet another group of people.

I’d like to begin with a simple analogy that expresses my feelings on the subject at hand:

aborted llama fœti : Perestroika :: Flexitarianism : this analogy.

In other words, flexitarianism makes as much sense as grooming one’s pubic hair with a rusty vegetable peeler. I fail to see how flexitarianism is any different than, oh, say, being an omnivore. “I am a vegetarian… except for when consumption of animal products is required socially, nutritionally, culturally, or pragmatically.” STFU. In other words, you’re a normal omnivore who cannot always stomach eating meat for some reason, most likely due to moral dissonance. I have no problem with vegetarianism—or any other diet, for that matter—as long as its practitioners do not proselytize. I don’t care if you deprive yourself of certain foods on moral, religious, or nutritional grounds. What does offend me is the addition of a new word to our vernacular that adds little or nothing semantically. Also, it is concerning that those in moral conflict about eating meat are given a new term to legitimize their ethical limbo, thus postponing their decision about whether or not to give up being an omnivore.

I only drink to excess when it is socially acceptable.

The flexoholic.

I only cheat on my spouse pragmatically.

## Dictionary and Thesaurus Lookup in Emacs

### Or, adding a feature to a piece of software that already has too many features.

Emacs is my preferred tool for editing LATEX documents. A few years ago I got tired of switching back and forth to a terminal or web browser every time I wanted to look up a word in the dictionary or thesaurus. To remedy this, I wrote a simple, 100-line Emacs Lisp plugin to look up words using the DICT protocol.

One can simply cut/paste this into their .emacs file or make it a separate file in their elisp directory.

; -*-Emacs-Lisp-*-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; File:         dict.el
; Description:  Dict access functions
; Author:       Evan Sultanik
; Created:      Sun Aug 14 15:44:57 2005
; Modified:     Thu Nov 15 08:45:48 2007
; Language:     Emacs-Lisp
; Package:      N/A
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; *******************************************************
;; ***** THIS IS AN ALPHA TEST VERSION (Version 0.2) *****
;; *******************************************************
;;
;; dict.el
;; Copyright (C) 2005 Evan Sultanik (http://www.sultanik.com/)
;;
;; This program is free software; you can redistribute it and/or modify
;; the Free Software Foundation; either version 1, or (at your option)
;; any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program; if not, write to the Free Software
;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defvar dict-protocol-client “dict”
“This is the name and/or path to the local copy of the DICT protocol client.”)

(defconst dict-scratch-buffer-name “*dict*”
“This is the name of the buffer in which the dict output is displayed.”)

(defun dict-extract-word ()
“From the current buffer, extract and return the word under the cursor.”
(let (start word)
(save-excursion
(forward-char 1)
(backward-word 1)
(setq start (point))
(forward-char 1)
(if (not (re-search-forward “\\b”))
(error “Can’t find end of word”))
(buffer-substring start (point))
)))

(defun dict-lookup-word (word dict)
“Look up the word WORD using the client, given by
dict-protocol-client’.  The results will be displayed in the buffer
given by dict-scratch-buffer-name’.  If DICT is nil, WORD is looked
up from a thesaurus only.”
(interactive “sWord to lookup? \nP”)
(let ((dict-buffer (get-buffer-create dict-scratch-buffer-name)))
(save-excursion
(buffer-disable-undo (set-buffer dict-buffer))
(erase-buffer)
(display-buffer dict-buffer)
(if (null dict)
(call-process dict-protocol-client
nil ;; no infile
t   ;; put output in the current buffer
t   ;; re-display as we get more output
“-P” “-” “-d” “moby-thes” word)
(call-process dict-protocol-client
nil ;; no infile
t   ;; put output in the current buffer
t   ;; re-display as we get more output
“-P” “-” word)
)
(goto-char (point-min))
)
))

(defun thesaurus-lookup-word (word)
(dict-lookup-word word nil))

(defun dictionary-lookup-word (word)
(dict-lookup-word word t))

(defun thesaurus-lookup-word-in-text (exact)
“Like dict-lookup-word’, but uses the word under the cursor.”
(interactive “P”)
(thesaurus-lookup-word (dict-extract-word)))

(defun dictionary-lookup-word-in-text (exact)
“Like dict-lookup-word’, but uses the word under the cursor.”
(interactive “P”)
(dictionary-lookup-word (dict-extract-word)))


This code assumes that you have the command dict available.

You can set a keyboard shortcut as follows:

(global-set-key (quote [f7]) ‘thesaurus-lookup-word-in-text)
(global-set-key (quote [f8]) ‘dictionary-lookup-word-in-text)


Pressing the F7 and F8 keys will then look up the word under the cursor in the thesaurus or dictionary, respectively.