Sunday, February 7, 2016

Success of Senators Voting against the Will of their own Party

A few months ago, a friend was wondering if there were any bellwether US Senators for determining if a bill would pass. It sounded like an interesting question, so I went about trying to find an answer. The code I ended up with is here, and it includes a Code Book for those who want to understand how the code works without reading python code.

Fortunately, I found the great resources available at govtrack very quickly, but even after cursory examination, I realized there were quite a few difficulties. First almost all votes are along party lines. I would therefore not be able to do any simple comparison of the success rates of senators, as those would clearly map to the success rates of their respective parties. Second, very few roll calls relate to bills, as most of them are procedural. Unfortunately, I could not figure out any way to include or exclude a given roll call based on its type or its potential importance that made sense. For all I know, something that looks trivial like a move to table an issue could be very important, while the passage of a bill might have unanimous support and thus be irrelevant to my investigation.

I therefore decided to look at votes by senators when the majority of the senators' fellow party members voted the other way. Roll calls under such conditions become prima facie important, as breaking party lines suggests the potential disruption under which a bellwether senator could be useful.

So here are some tables highlighting the discoveries I have made in the analysis of this question. The date ranges are from 1989 through 2016, as the data from before 1989 is formatted slightly differently and I would need to write more code to handle it.

Notes on column headings:
  1. All: all of the votes made by this Senator. This value is not used in any subsequent calculation but is offered for scale.
  2. Total: Number of times the Senator voted against the will of the party.
  3. Successful: Number of times the Senator voted against the will of the party and the roll call resolved in the manner the Senator voted.
  4. Success Pct: Number of successful votes against the will of the party divided by all the votes against the will of the party.
  5. Senator: The name, party, and state of the Senator. If the Senator belonged to more than one party or represented more than one state, all are listed. All votes indicate the party to which the Senator belonged at the time of the vote, and that is the party used to determine if the Senator voted with or against the will of his or her party.

Top 20 Senators with the most votes against their own party: 1989-2015

AllTotalSuccessfulSuccess PctSenator
717317869000.50 Arlen Specter (Republican,Democrat - PA)
6089163110720.66 Susan M. Collins (Republican - ME)
597515328560.56 Olympia J. Snowe (Republican - ME)
581813756710.49 James Jeffords (Independent,Republican) - VT
875212495140.41 Richard C. Shelby (Republican,Democrat - AL)
808511657740.66 Max Baucus (Democrat - MT)
799211394060.36 John McCain (Republican - AZ)
693210985300.48 Robert Byrd (Democrat - WV)
532310837540.70 John Breaux (Democrat - LA)
77989945090.51 Kent Conrad (Democrat - ND)
62219912220.22 Russell Feingold (Democrat - WI)
37529885820.59 Ben Nelson (Democrat - NE)
36969665060.52 John Chafee (Republican - RI)
77899345750.62 Richard G. Lugar (Republican - IN)
52738984000.45 Ernest Hollings (Democrat - SC)
78358674040.47 Herb Kohl (Democrat - WI)
26828644440.51 Mark Hatfield (Republican - OR)
27678354420.53 Howell Heflin (Democrat - AL)
89158333460.42 Chuck Grassley (Republican - IA)
87118255950.72 Thad Cochran (Republican - MS)

Top 20 Senators with the most successful votes against their own party: 1989-2015


AllTotalSuccessfulSuccess PctSenator
6089163110720.66Susan M. Collins (Republican - ME)
717317869000.50Arlen Specter (Republican,Democrat - PA)
597515328560.56Olympia J. Snowe (Republican - ME)
808511657740.66Max Baucus (Democrat - MT)
532310837540.70John Breaux (Democrat - LA)
581813756710.49James Jeffords (Independent,Republican) - VT
39727526210.83Lisa Murkowski (Republican - AK)
87118255950.72Thad Cochran (Republican - MS)
37529885820.59Ben Nelson (Democrat - NE)
77899345750.62Richard G. Lugar (Republican - IN)
693210985300.48Robert Byrd (Democrat - WV)
65307615220.69Ted Stevens (Republican - AK)
875212495140.41Richard C. Shelby (Republican,Democrat - AL)
77989945090.51Kent Conrad (Democrat - ND)
36969665060.52John Chafee (Republican - RI)
87848224910.60Harry Reid (Democrat - NV)
55256604580.69Mary L. Landrieu (Democrat - LA)
74227574520.60Joseph I. Lieberman (Independent,Democrat) - CT
65647344500.61John Warner (Republican - VA)
26828644440.51Mark Hatfield (Republican - OR)

Top 20 Senators with the highest success rates voting against their own party: 1989-2015

Note: only showing senators with more than 5 votes against their own parties

AllTotalSuccessfulSuccess PctSenator
7012121.00Jeff Chiesa (Republican - NJ)
35423200.87Mike Rounds (Republican - SD)
100349420.86Tim Kaine (Democrat - VA)
14811471260.86John Hoeven (Republican - ND)
39727526210.83Lisa Murkowski (Republican - AK)
7612121750.83Scott P. Brown (Republican - MA)
3511190.82Gary Peters (Democrat - MI)
1294116930.80Ken Salazar (Democrat - CO)
12155474310.79Zell Miller (Democrat - GA)
40334323370.78Lamar Alexander (Republican - TN)
35436280.78Shelley Moore Capito (Republican - WV)
41535260.74George LeMieux (Republican - FL)
35519140.74Thom Tillis (Republican - NC)
9771501090.73Jeff Flake (Republican - AZ)
14832301670.73Kelly Ayotte (Republican - NH)
17691621170.72Mike Johanns (Republican - NE)
87118255950.72Thad Cochran (Republican - MS)
64245984290.72Pete Domenici (Republican - NM)
23562171550.71Roger F. Wicker (Republican - MS)
12072091480.71Mark Kirk (Republican - IL)

Top 20 Senators with the highest success rates voting against their own party when it counted: 1989-2015

By "when it counted", I mean that these calculations are made in situations that required one or more Senators to vote against his or her own party for the result to have been what it was. For a detailed discussion of what this means, see the Code Book.

Note: only showing senators with more than 5 votes against their own parties

AllTotalSuccessfulSuccess PctSenator
3612121.00Heidi Heitkamp (Democrat - ND)
3119180.95Scott P. Brown (Republican - MA)
5617160.94John Hoeven (Republican - ND)
371090.90Tim Kaine (Democrat - VA)
24234300.88Lamar Alexander (Republican - TN)
9716140.88Roger F. Wicker (Republican - MS)
5615130.87Roy Blunt (Republican - MO)
5314120.86Dean Heller (Republican - NV)
18656480.86Wyche Fowler (Democrat - GA)
18820170.85Johnny Isakson (Republican - GA)
11113110.85John Barrasso (Republican - WY)
54650.83John Boozman (Republican - AR)
4812100.83Mark Kirk (Republican - IL)
6951251040.83Daniel K. Inouye (Democrat - HI)
38134280.82Pat Roberts (Republican - KS)
19287710.82Lloyd Bentsen (Democrat - TX)
16837300.81Albert Gore (Democrat - TN)
28737300.81George Mitchell (Democrat - ME)
24163510.81Lisa Murkowski (Republican - AK)
37540.80Brian Schatz (Democrat - HI)

Top 20 Current Senators with the most votes against their own party: 1989-2015


AllTotalSuccessfulSuccess PctSenator
6089163110720.66Susan M. Collins (Republican - ME)
875212495140.41Richard C. Shelby (Republican,Democrat - AL)
799211394060.36John McCain (Republican - AZ)
89158333460.42Chuck Grassley (Republican - IA)
87118255950.72Thad Cochran (Republican - MS)
87848224910.60Harry Reid (Democrat - NV)
39727526210.83Lisa Murkowski (Republican - AK)
86767094040.57Orrin G. Hatch (Republican - UT)
75586073910.64Dianne Feinstein (Democrat - CA)
87775921960.33Patrick J. Leahy (Democrat - VT)
67065731020.18James M. Inhofe (Republican - OK)
88545652440.43Mitch McConnell (Republican - KY)
59625191210.23Jeff Sessions (Republican - AL)
86154752320.49Barbara A. Mikulski (Democrat - MD)
48424721960.42Daniel Coats (Republican - IN)
47654703240.69Thomas R. Carper (Democrat - DE)
59504541070.24Michael B. Enzi (Republican - WY)
74024471060.24Barbara Boxer (Democrat - CA)
40334323370.78Lamar Alexander (Republican - TN)
62994302040.47Ron Wyden (Democrat - OR)

Top 20 Current Senators with the most successful votes against their own party: 1989-2015


AllTotalSuccessfulSuccess PctSenator
6089163110720.66Susan M. Collins (Republican - ME)
39727526210.83Lisa Murkowski (Republican - AK)
87118255950.72Thad Cochran (Republican - MS)
875212495140.41Richard C. Shelby (Republican,Democrat - AL)
87848224910.60Harry Reid (Democrat - NV)
799211394060.36John McCain (Republican - AZ)
86767094040.57Orrin G. Hatch (Republican - UT)
75586073910.64Dianne Feinstein (Democrat - CA)
89158333460.42Chuck Grassley (Republican - IA)
40334323370.78Lamar Alexander (Republican - TN)
47654703240.69Thomas R. Carper (Democrat - DE)
39094162440.59Lindsey Graham (Republican - SC)
88545652440.43Mitch McConnell (Republican - KY)
86154752320.49Barbara A. Mikulski (Democrat - MD)
59194212260.54Pat Roberts (Republican - KS)
28003332250.68Bob Corker (Republican - TN)
75754122120.51Patty Murray (Democrat - WA)
47033622120.59Bill Nelson (Democrat - FL)
62994302040.47Ron Wyden (Democrat - OR)
87775921960.33Patrick J. Leahy (Democrat - VT)

Top 20 Current Senators with the highest success rates voting against their own party: 1989-2015

Note: only senators with more than 5 votes against their own party

AllTotalSuccessfulSuccess PctSenator
35423200.87Mike Rounds (Republican - SD)
100349420.86Tim Kaine (Democrat - VA)
14811471260.86John Hoeven (Republican - ND)
39727526210.83Lisa Murkowski (Republican - AK)
3511190.82Gary Peters (Democrat - MI)
40334323370.78Lamar Alexander (Republican - TN)
35436280.78Shelley Moore Capito (Republican - WV)
35519140.74Thom Tillis (Republican - NC)
9771501090.73Jeff Flake (Republican - AZ)
14832301670.73Kelly Ayotte (Republican - NH)
87118255950.72Thad Cochran (Republican - MS)
23562171550.71Roger F. Wicker (Republican - MS)
12072091480.71Mark Kirk (Republican - IL)
14731541080.70Rob Portman (Republican - OH)
47654703240.69Thomas R. Carper (Democrat - DE)
28003332250.68Bob Corker (Republican - TN)
6089163110720.66Susan M. Collins (Republican - ME)
75586073910.64Dianne Feinstein (Democrat - CA)
14341681080.64Roy Blunt (Republican - MO)
33572551630.64Johnny Isakson (Republican - GA)

Top 20 Current Senators with the highest success rates voting against their own party when it counted: 1989-2015

By "when it counted", I mean that these calculations are made in situations that required one or more Senators to vote against his or her own party for the result to have been what it was. For a detailed discussion of what this means, see the Code Book.

Note: only senators with more than 5 votes against their own party

AllTotalSuccessfulSuccess PctSenator
3612121.00Heidi Heitkamp (Democrat - ND)
5617160.94John Hoeven (Republican - ND)
371090.90Tim Kaine (Democrat - VA)
24234300.88Lamar Alexander (Republican - TN)
9716140.88Roger F. Wicker (Republican - MS)
5615130.87Roy Blunt (Republican - MO)
5314120.86Dean Heller (Republican - NV)
18820170.85Johnny Isakson (Republican - GA)
11113110.85John Barrasso (Republican - WY)
54650.83John Boozman (Republican - AR)
4812100.83Mark Kirk (Republican - IL)
38134280.82Pat Roberts (Republican - KS)
24163510.81Lisa Murkowski (Republican - AK)
37540.80Brian Schatz (Democrat - HI)
18540.80Shelley Moore Capito (Republican - WV)
767122940.77Thad Cochran (Republican - MS)
75785650.76Barbara A. Mikulski (Democrat - MD)
5617130.76Kelly Ayotte (Republican - NH)
19021160.76Richard Burr (Republican - NC)
511290.75Marco Rubio (Republican - FL)

Senators who are 2016 Presidential Candidates

Although all of Bernard Sanders votes were made as an Independent, I ran these calculations considering his vote as if he were a Democrat.

All Votes considered

AllTotalSuccessfulSuccess Pct
2367121470.39Hillary Clinton (Democrat - NY)
873118150.13Ted Cruz (Republican - TX)
1287161610.38Marco Rubio (Republican - FL)
2734000.00Bernard Sanders (Democrat - VT)

Only when it counted

AllTotalSuccessfulSuccess Pct
197740.57Hillary Clinton (Democrat - NY)
32720.29Ted Cruz (Republican - TX)
501290.75Marco Rubio (Republican - FL)
131000.00Bernard Sanders (Democrat - VT)

Friday, August 26, 2011

Adium Join Group on Startup

Adium allows you to run commands on startup, which I use to join various chat rooms.

To get there Preferences > Account > Edit > Options

the /join #whatever

Saturday, December 11, 2010

Command line simple examples

I like to use the command line a lot, but for many tools, it is hard to find the most basic, common uses. Here is a list of examples I have found to get started.


awk

# print the owner, update time, and filename of all postscript files in a directory
ls -l | awk '$8 ~ /.*\.ps/ {print $3 " " $7 " " $8}'

find

# find all files beginning with "bob" in the current directory and its subdirectories
find . -name "bob*"
# don't show the files in the .svn directories
find . -name "bob*" | grep -v ".svn"

grep

# find an email address in all the files in a directory
grep "bob@example.com" *

rsync

# push a bunch of files to a remote server
rsync -avz --no-t --no-p --no-g --exclude=.svn/ --exclude=*~ --bwlimit=50 /home/bob/localdir/ bob@example.com:/home/bob/remotedir
# pull a bunch of files from a remote server
rsync -avz --no-t --no-p --no-g --exclude=.svn/ --exclude=*~ --bwlimit=50 bob@example.com:/home/bob/remotedir/ /home/bob/localdir

sed

# change all email addresses in a file and make a backup myfile.txt.bu
sed -i.bu -e 's/bob@example\.com/robert@example\.com/g' myfile.txt

tar

# tarball up a directory
tar -cvf tarball.tar *
# list the files in a directory
tar -lvf tarball.tar
# untar a tarball
tar -xvf tarball.tar

zip

# zip all the files in the current directory and its subdirectories
find . -type f | zip files.zip -@

Sunday, February 28, 2010

Wikipedia to pamphlet with Firebug

I wanted to make converting the articles to pamphlets less cumbersome, and I found the following method.

After you find the article on wikipedia using Firefox, get the printable version (click the "Printable version" link in the left nav).

Open up Firebug and click the "CSS" tab.

Make sure you are using the commonPrint.css file and click "Edit".

Scroll slightly down and change the declaration for #toc to "display: none".

Scroll down about a quarter and change div.tright from "float:right; clear:right;" to "float:left;" leaving the rest of the declaration alone.

[Edit] Or you can create a bookmark of the following javascript to do this automatically:

javascript:function%20addCss(cssCode)%20{var%20styleElement%20=%20document.createElement("style");%20%20styleElement.type%20=%20"text/css";%20%20if%20(styleElement.styleSheet)%20{%20%20%20%20styleElement.styleSheet.cssText%20=%20cssCode;%20%20}%20else%20{%20%20%20%20styleElement.appendChild(document.createTextNode(cssCode));%20%20}%20%20document.getElementsByTagName("head")[0].appendChild(styleElement);};%20addCss('#toc%20{display:%20none}\n%20div.tright%20{float:left;%20clear:%20none;}\np%20{line-height:1.5}');

[/Edit]

Create a custom print setting by choosing File > Page Setup > Paper size > Manage Custom Settings. Set the attributes to:
* Width: 8.5 inch
* Height: 11.00 inch
* Top: 0
* Bottom: 0
* Left: 0
* Right: 1.9 in

Apply these settings before closing.

Print to postscript file (eg output.ps).

Convert this file to an imposed postscript file with the following script:

pstops
"4:1L@0.68(8in,.5in)+2L@0.68(8in,6in),0L@0.68(8in,6in)+3L@0.68(8in,.5in)"
output.ps outputImp.ps


Convert outputImp.ps to pdf with

ps2pdf outputImp.ps


And you are done!
[Edit]

You can also use the following Python script to get imposition of greater than 4 pages:

#!/usr/bin/python
import os, sys

ratio = '0.68'
x = '8'
top_y = '.5'
bottom_y = '6'

def get_page_count(file_name):
if not os.path.exists(file_name):
raise Exception(file_name + " is not a file")
file = open(file_name, 'r')
cnt = 0;
for line in file:
if '%%Page:' in line:
cnt += 1
return cnt

def best_modulus(x, y, m):
least, most = min(x,y), max(x,y)

if m % most == 0:
return most
if (m % least == 0) or (least - (m % least) < most - (m % most)):
return least
return most

def best_modulus_of_list(list, m):
best = list[0]
for item in list:
best = best_modulus(best, item, m)
return best


if __name__ == '__main__':
if len(sys.argv) < 2:
raise Exception("please give the postscript file name")
filename = sys.argv[1]
if filename.endswith('.ps'):
filename = filename[0:-3]

ps_name = filename + '.ps'
pages = get_page_count(ps_name)

best_mod = best_modulus_of_list((4,8,12,16),pages)
print pages

imp_name = filename + 'Imp.ps'
pdf_name = filename + 'Imp.pdf'

if os.path.exists(imp_name):
os.system('rm ' + filename + 'Imp.*')

pstops_cmd = 'pstops "' + str(best_mod) + ':'

for i in xrange(0, best_mod, 4):
if i > 0:
pstops_cmd += ','
increment = i / 2
pstops_cmd += '%sL@%s(%sin,%sin)' % (increment, ratio, x, bottom_y)
pstops_cmd += '+%sL@%s(%sin,%sin)' % (best_mod - 1 - increment, ratio, x, top_y)
pstops_cmd += ',%sL@%s(%sin,%sin)' % (increment + 1, ratio, x, top_y)
pstops_cmd += '+%sL@%s(%sin,%sin)' % (best_mod - 2 - increment, ratio, x, bottom_y)

pstops_cmd += '" ' + ps_name + ' ' + imp_name
print pstops_cmd
os.system(pstops_cmd)

os.system('ps2pdf ' + imp_name)


[/Edit]

Thursday, May 14, 2009

Wikipedia to Pamphlet using Hardy

I have been perpetually annoyed by having to print things out on full size pieces of paper instead of in smaller, book-sized, pamphlet size for some time, and I finally learned how to do it. Here is a brief tutorial that assumes the following tools:
* Open Office
* Psutils (contains pstops)
* Ps2pdf

This text was invaluable.


I did this on Hardy Heron.

First I copied a wikipedia article on Minoan Civilization to have something to read. I pasted it into an Open Office Document with the following margins (in inches): L 1.50, R 1.40, Top 0.79, B 0.79. I pasted it as plain text and fussed with it a little (removed the alt text), but mostly I left it alone. I then opened the Print... dialog box and used the Print to file option. This creates a postscript file that can be manipulated by psutils.

I used pstops for something called "imposition", which just means moving the logical pages around so you can fold it into a booklet. Here is the command I used to create the imposition I went with:

$pstops \
"4:1L@0.8(8.15in,0)+2L@0.8(8.15in,5.39in),3L@0.8(8.15in,0)+0L@0.8(8.15in,5.39in)" \
minoa.ps minoaImp.ps


Breaking it down:
4 means "cluster in logical pages of 4"
: separates
1 means "take the 2nd logical page (0-indexing makes it 1)"
L means "rotate it to the left (it pivots on the lower left corner)"
@ separates
0.8 means "scale it down to .8 of its normal size"
( separates
8.15in means "move it 8.15 inches back towards the physical page"
, separates
0 means "don't move it up or down"
) separates
+ means "start to work on a new logical page but stay on the same physical page"
(same deal for the third page)
, means "start to work on the next physical page

I kept fussing with the scale and the amount to move each of the pages both up and to the right until I was happy with it. The manipulation is very fast, so the iterative "move it a bit and look at it" did not take much time and was much more effective for me than measuring would have been.

After that, I ran
$ps2pdf monoaImp.ps

which creates a pdf named "monoaImp.pdf". This command takes much more time than pstops.

The printer I use at work prints duplex by flipping on the short side. If you want to flip on the long side, you will need to rotate the logical pages on the second physical page to the right and add a "-dAutoRotatePages=/None" option to the ps2pdf command. I leave this option in my script, as it does not seem to do any harm and I don't want to bother looking it up again.

After printing a few articles, I started working on pdfs. You start by converting it to ps with
$pdftops Remix.pdf

My first pdf was a 324-page book which was formatted at 7"x9.75". The ps2pdf kept outputting 8.5"x11" and it would never line up correctly. The trick I ended up using was

$pstops "2:0,1" Remix.ps Remix2.ps

This command should not have done anything (essentially it says, "work on two pages, put the first logical page on a sheet of paper and put the second logical page on the next one"), but as a side effect it converted it to 8.5"x11" (as an OO programmer, I love side effects!). Of course, the page content wasn't in the center any more, but as I was scaling and moving the content anyway, it didn't matter.

I found a second gotcha working with an A4 pdf. In this case, instead of forcing it down to 8.5"x11", I just converted the pre-imposed ps to imposed pdf by running a shell script, then kept fussing with the parameters until I was happy with the final output rather than the intermediate one.

Of course, I don't do any of the iterative work on the command line. Here is the full code of the script I use:

#!/bin/bash
rm RemixImp.*
pstops "4:1L@0.8(8.15in,0)+2L@0.8(8.15in,5.39in),3L@0.8(8.15in,0)+0L@0.8(8.15in,5.39in)" Remix.ps RemixImp.ps
ps2pdf -dAutoRotatePages=/None RemixImp.ps RemixImp.pdf


The "rm" command is probably unnecessary, but I like to pretend I start with a clean slate each time.

Saturday, March 22, 2008

Ext JS

My boss, a former Swing programmer, has decided we need to be more cutting edge (I mean, we use Rails already, how much more cutting edge can we be?), so we are incorporating the ext javascript framework into several of our applications. We are starting with the 'grid' layout, thereby getting sorting and column manipulation for 'free'.

I had tried to use ext js before, and approaching it again filled me with fear and apprehension. The documentation focuses so much on what is possible, that it is easy to be overwhelmed. Fortunately, a coworker turned me on to the ext scaffold plugin, which generates working ext code based on a model. The code it generates is not meant to be used, but rather provides something to copy from the generated source and play with in the views. (I created a separate rails project for the plugin so I could keep the clutter out of my production project.) I found it much easier to play with working code than to start from scratch.

Playing around with the generated code helped me understand that grids are really just a combination of two elements: a datastore and a column model. The column model is a set of column definitions, each of which includes the label of the column header and the key to the item in the datastore. The datastore consists of the data (either an array or a 'proxy' to an http resource that will supply the data) and a 'reader' (parser) that will convert the data into a dictionary that the column model can call.

But working with generated code only gets you so far. If you want anything but default behavior, you will need to search through the discussion forums. Searching through the forums takes patience, but through them I have been able to solve some of my particular problems.

Example: I wanted to add an item to each column's "context menu". This information is nowhere in the API documentation. In fact I needed to search the forum just to find out what terms to use to search the forum effectively for this information. One post pointed me to the part of the code that sets the default elements of the context menu, and I managed to get my functionality in place by example.

FYI, the "menu" that the columns use, is available through the chain: grid.getView().hmenu. The item you need to give the menu consists of a label, a function to call when the label is clicked, and grid.getView(). This latter is the 'scope' of the menu item, which means that all of the 'this' references in the body of the function will use this object. (My JavaScript skills were insufficiently leet for me to intuit this meaning of the word 'scope'.) You call the gridview to get the hdCtxIndex and the column model, both of which are necessary to figure out which column's context menu was used.

Wednesday, January 17, 2007

Why hire a Blub?

I suppose, as I claimed that I would somehow defend Blub programmers, that I should mention why anyone would be better off hiring a Blub programmer than a Hacker.

Hackers are interested in technology rather than "the business process". This is evident in the eligibility requirements as stated by the Hacker pundits. In Raymond's essay on How to Become a Hacker, he waxes wonderful on the freedom and power of being such a person. The most motivating thing (to me) in the essay is how Hackers see the world as full of interesting problems and have a desire to solve them. Then mentions something loopy like how I should download an open-source *nix system and make changes to it. My favorite thing about programming is division of labor, and keeping the resources on my computer managed is definitely someone elses responsibility. I don't even like messing with partitions.

Peter Norvig has a nice essay called Teach Yourself Programming in Ten Years. I was rolling with it, singing along with the choir, when he suggested I memorize, "how long it takes your computer to execute an instruction, fetch a word from memory (with and without a cache miss), read consecutive words from disk, and seek to a new location on disk." I have a hard enough time remembering my passwords!

And the list goes on: Raganwald wants you to be interested in writing domain-specific-languages, and Joel thinks you have to have a firm grasp on pointers to be worthwhile. Paul Graham suggests that one base a programming language choice on the ease of use of library functions only when writing "a short, throwaway program." Bleah!

The more I look at it, the more Hacker pundits think the interesting problems are close to the metal. They are really interested in computer hardware and fundamental structure. So what to Blubs find interesting?

Blubs see computers/networks/IT in general as a means to solve interesting problems. We are "business analysts" rather than "system engineers," and we are more interested in facilitating and improving the social/organizational process via technology than in technology itself. Rails and Django are great because they accelerate the capacity to get things done for the organization, not because they are great examples for other domain-specific language development. (And yes, I realize that engagement with technological possibility is a requirement for optimizing an organization's use of technology to solve its non-technological problems.)

So why would you hire a Blub rather than a Hacker? What if your organizational problems are not technological? What if your software does not give your organization a competitive edge, but you have a jillion legacy applications that need to stay running to keep the administration of your organization afloat? What if your upper management are more interested in the comparison of the legacy app running on the mainframe with a commercial ERP than the possiblity of open-source cooperation? Then you probably need people skilled at keeping the crank turning with Blub programs than starry-eyed radicals who want to rewrite the system using DSLs they invented themselves.