Apple's amazing customer support system
Pick up your phone. Dial 1-800-MY-APPLE, 1-800-692-7753. Listen to the automated system tell you that he can understand complete sentences. Shake your head in disbelief. There's no way this is going to work. Say 'I want to know if I can buy an AppleCare protection plan for my Mac Mini I bought 15 months ago.' Notice how it asks you if you are asking for personal or business use. Stare in disbelief as it responds instantly and without a long awkward pause. Listen to the quick and conversational, not slow and stilted, tone of the computer voice. Let it automatically send you to the AppleCare department where you have no wait to begin speaking to someone. Best phone system ever. I understand that it is very limited, but it fools you well enough to be a pleasant experience. It's a big stepping stone to even more powerful interactive phone systems.
Poem #0
Ease, loose, lax cannot,
Cheeks and eyes they tie tight knots.
Happiness, I caught.
Hot Stock Tip #0
I’m very, very good at trading stocks. I do not gamble. I, literally, mathematically, like clockwork, always make money. I have not posted my Year 3 returns yet (I have for Years 1 and 2 ), but they are better than ever. I have surprisingly consistent annual returns in excess of 20%+ in all conditions: both boom times, flat markets, record-breakingly volatile markets, and now deep recessions. I will write about my 2008 returns as soon as I finish my taxes.
Right now, however, I do not have significant excess investment capital outside of my Roth IRA. My Roth IRA I use for long-term investments in which I do not trade in and out frequently. Therefore, I now sometimes see some trades which I may or may not have taken if I did have some capital. I want to share one idea I had today with you.
First, please note that this information is not to be construed as either an endorsement or a recommendation; as investment advice or as an offer to buy or sell securities of any kind. Please consult with your own advisor before using this information.
I read that Amazon just launched an online game trade-in system. Gamestop dropped almost 14% upon the news. I know Amazon. I love Amazon. I have made lots of money off of Amazon recently. But this will not affect GameStop’s sales in the long run. As the analyst in the article notes:
GameStop has previously tested out online trade-ins, but with limited success because of the time consumers had to wait to receive store credit, Sebastian said. The retailer’s trade-in model is successful in part because it gives gamers instant gratification.
The best products have the best design. They make customers fall in love with their simplicity and instant feedback. Amazon’s mail in system offers none of that. Netflix works because, with its queue system, you passively receive new content. Amazon’s system requires quite a bit of active involvement before you receive game credits.
If anything, GameStop will receive extra attention because of Amazon’s offering. It may even grow more quickly. I would buy GameStop right now.
Of coure, I would also hedge against the market by buying a short or double-short (more leverage!) ETF like QID. That way, you can buy into the pure alpha of GameStop, without exposing yourself to the crazy movements of the market as a whole which nobody in the world can predict or even understand. I will write more about this later.
Labmeeting rocks
I want to tell you a little about Labmeeting. I work at Labmeeting. Actually, thinking about it, I have too much to say about Labmeeting. I cannot tell you everything in one post. I will tell you a little bit at a time as I think of cool things to talk about. Let me tell you about our goals.
First, understand that science is broken. Not in the traditional sense. Science has not been speeding along the freeway and then suddenly tore a gasket and broke down. No. Science is puttering along reliably as it has for decades, centuries. Exactly as it has been. No faster.
Yes, scientists do an incredible job of being on the cutting edge of technology while simultaneously pushing that edge further and further. Nevertheless, it takes between months and years to publish interesting results. Labmates email cumbersome PDF’s back and forth. Literature search tools frustrate even the most patient of users. Conferences help disseminate knowledge quickly, but not when abstracts lose themselves amidst a shuffle of papers and when fellow scientists’ contact information evaporates. Publishers almost seem to try to restrict access to fulltext research articles, so much so that the government must force them to share knowledge. Graduate students find professors and professors find grad students by pure luck, not by targeted searches. Professors spend little time at the lab bench due to the skyscraper of paperwork required for modern research grants.
At Labmeeting, we are well on our way to solving all of these problems and many more. Science operates best when people can develop good ideas securely and communicate good ideas rapidly. We created a platform to do both like nobody has ever seen before.
Thousands of biomedical scientists, both at top US Universities and smaller ones around the world, already use and love Labmeeting. We want to help all researchers communicate and work more efficiently so that they can focus on what they do best: science.
Log Reader 3000
I wanted to show off another python script today. I think it’s pretty cool. It’s kind of like a very rudimentary version of something you might see in Iron Man. And, of course, anything in Iron Man is cool.
I dub it Log Reader 3000. It’s purpose? It helps me monitor logs. How? Well, sometimes I need to follow a log in real time as it is written, but I can quickly get bored. The log scrolls by endlessly while, very often, little new information spits itself out. I can quickly lose focus, or at the very least, damage my vision after staring at a screen intently for extended periods.
Ideally, I want the log to simply flow through me, and if my subconscious notices something odd, then I can act on it. If the log is read aloud to me, then I can work on other tasks and let my auditory memory and auditory processing take note of oddities on which I need to act.
So, I made a python script to read the log out to me as it is written. It is my first Python 2.6 script. I take advantage of the new multiprocessing module built into the standard library. I also use the open-source festival text-to-speech tool.
First, install festival. sudo apt-get install festival in Ubuntu. You probably want to set it up to work with ALSA or ESD sound. By default, festival uses /dev/dsp, which means that you can’t use festival and any other program that uses audio (like Skype) at the same time. Fortunately, and as usual, Ubuntu provides detailed, simple instructions to set up festival with ALSA: https://help.ubuntu.com/community/TextToSpeech .
Finally, just find an appropriate use case. Note that most log monitoring applications would not be improved with Log Reader 3000. If you just want to be notified of errors, you should have a program email you when an error appears in a log. If you want to understand the log output of a program that has already run, understand that Log Reader 3000 is meant for live-running programs. Yes, Log Reader 3000 can be modified to read any text file line-by-line. But, you will find that reading ends up being much faster than listening to a slow automated voice, so I recommend that you just try to skim a completed program’s output with VIM.
So then why ever use Log Reader 3000? It is useful for applications which fit all of the following criteria:
- you want to monitor a live running program
- and the debugging information is nuanced and you need a human to interpret it (i.e. it cannot be filtered programmatically) and/or you want to be able to intervene while the program is running to keep it doing what it ought to be doing in real time.
Applications:
- Say that you are spidering the web, and what the spider should and should not be spidering is not yet well-defined, but a human knows, then the Log Reader 3000 can read aloud where the spider is, and the human can correct course as he or she notices the spider going astray.
- Or, say that you are working on some kind of artificial intelligence. Perhaps, the AI program can reason aloud and a human can correct or redirect the machine’s reasoning as it goes along. I have no idea how or why an AI would do that.
- Maybe you want to protect against bot attacks, but your aggressor is particularly clever and seems to avoid looking like a bot in all of the obvious ways. You can pipe the output of your log into Log Reader 3000 and notice new kinds of suspicious patterns live while reclining in your chair or surfing the web.
- You run a securities trading program. You have numerous checks and double-checks to ensure that everything works correctly. Nevertheless, you need to have a human monitoring the system as a whole continuously anyway, so you have Log Reader 3000 read aloud total portfolio value, or live trades, or trading efficiency, or fast-moving securities, or all of the above.
- The lobby of your startup has a TV screen with graphs of user growth and interaction on the site. You want to increase the coolness factor by having a computer voice read aloud some of the searches or conversations happening on your site live.
- You make a living by selling cool techy art projects which blend absurdity with electronics. You read aloud live google searches, or live wikipedia edits, or inane YouTube comments out of what looks like a spinning vinyl record. Passersby whisper of your genius.
Once you have the application, just tail -f the log, parse out the parts you want the log reader to read (you can use awk for that, for example, or maybe a simple python script), and pipe that into the Log Reader 3000.
tail -f output.log | awk “{ print $1 }” | ./log_reader_3000.py
How does Log Reader 3000 work? The main process reads in one line at a time. As it reads in each line from stdin, it sends it to the processing queue. The child process reads the last item in the queue (it discards the items at the top of the queue because those are old and we need to catch up with the latest output line) and then calls a function to say() the line. The say() function simply uses the subprocess module to call festival in a separate process and then blocks until it is done saying it aloud.
Because having a computer voice read aloud a sentence takes a while, the log probably outputs many more lines than can be read aloud. That is why a multiprocess queue is needed, and that is why Log Reader 3000 only reads out the most recent line which has been output, which is why it is most useful for specific applications.
Here is the script, log_reader_3000.py:
#!/usr/bin/env python2.6
import sys
import subprocess
from multiprocessing import Process, Queue
def say(line):
say = '(SayText "%s")' % line
echo = subprocess.Popen(['echo', say], stdout=subprocess.PIPE)
subprocess.call(['festival'], stdin=echo.stdout)
def listen_to_lines(queue):
line = 'I am Log Reader 3000. The world is beautiful.'
while True:
while not queue.empty():
line = queue.get()
say(line)
queue = Queue()
p = Process(target=listen_to_lines, args=(queue,))
p.start()
while True:
line = sys.stdin.readline()
sys.stdout.write(line)
queue.put(line)
A Clean Python Shell Script
Guido van Rossum, the creator of Python, recently wrote a post on his blog about how Python makes great shell scripts, even (especially?) compared to shell scripts traditionally created in Bash and using purely shell commands.
Guido is absolutely correct. Shell scripts birth themselves painfully from my fingertips. Bash’s kludgy syntax irks my orderly sensibilities. Typos frequent my unreadable scripts. if…fi? Who invented this?
On the other hand, Python sticks to just a handful of language constructs, so the language does not force me to google how to create else statement every time I need to do it. Python just makes sense.
One of the comments asks if Guido can show him some “really beautiful” python shell scripts. I don’t mean to brag, and by no means do I think that my scripts in particular invite the light of the heavens to shine upon them, but I think I follow PEP 8 fairly closely and I pay attention to the brevity and clarity of my language. I find that I can quickly debug my scripts because of their transparency at run-time and their concise self-annotating source code.
So, below I show a script which I call merge_branch.py. Do
chmod +x merge_branch.py
so that you can run it from the command line with a simple ./merge_branch.py. I alias it in ~/.bashrc.
alias mb='../path/to/merge_branch.py'
The script simplifies what I would have to do manually in git many times a day. You see, git exemplifies a great version control system for keeping track of source code. I create branches instantly. This encourages me to work on bug fixes and new features separate from the main code base. As others make changes, I can easily integrate their changes by merging the changed branch into my branch. Git’s merge algorithm embarrasses any other I have ever used. Some of Subversion’s merges still haunt my nightmares to this day.
So, git rocks. Unfortunately, conflicts sometimes do occur. So, the proper procedure for merging a branch needs to be followed carefully. People are bad at doing things carefully. That’s okay. We should spend more time on making mistakes being creative. That is why we invented computers to do work for us.
For best results, merge the latest changes people made to master into your branch as often as possible. Small changes incrementally will probably mean small merge fixes. One big change will probably cause you major pains. So, merge from master into your branch often.
If you use GitHub or another central repository with a number of other people, then you must do a number of things. First, make sure that all the commits that you wanted to make are commited to your branch and that you didn’t leave any files out that you have not explicitly git-ignored. This happens a lot in SVN and Git if you are not careful, and it is the greatest source of frustration for anyone who uses a system like this. To human is to err, c’est la vie. Then, git-checkout master. Make sure that origin has the latest changes from your master. Then git-pull the latest changes form origin (github) into master. Then git-checkout your branch again. Then git-merge master into your branch. If there are any errors, fix them and commit, otherwise you are done.
Also, when you complete all the changes in your branch and all the tests pass, then you need to git-merge your branch into master and git-push it back up to origin (possibly github). You need to follow the procedure above to ensure the latest master changes are included in your branch (preferably before you run the tests). Then, you check out master, git-merge master into the branch (this will be clean since it should just be a fast forward because you already have the latest master). git-push the changes to origin. Finally, delete the branch that you just completed.
This tedium rotted my brain for weeks. Finally, I resolved to write a script to solve the tedious parts, but bring possible errors to my attention if they occur.
Please let me describe to you a few features of the script. First, I try to follow PEP 8 as much as I can. I have read it at least times; you should too. Also, recite the Zen of Python every night before you go to bed.
Notice how I start the script with a shebang line which says /usr/bin/env python, the preferred way to start Python since it is most flexible. For example, I can use Python 2.6, or my own local version of Python.
I use the logging module which is part of Python’s very large standard library. Logging gives you so much for free. For example, instead of commenting out print statements, just change the default logging level threshold. Always use the logging module instead of using print for everything. Always. It’s as easy as import logging; logging.error(’…’). Also, the logging.basicConfig(…) I use here is the same one I use everywhere. Logging the time that a message appeared saves hours and hours when I debug long-running scripts.
Use the optparse module in every Python shell script you write (getopt is too weak and will end up being much, much less simple by the end of a non-trivial program). Again, you get so much for free, like a -h help command. The documentation for optparse explains how to do everything in detail. Make sure you set the usage parameter. Also, make sure you call parser.error() for input option errors instead of raising an exception yourself.
Write utility functions. Use the power and simplicity of Python to your favor. Here, I use call_command(). I use it throughout the script and it makes the code so clean and clear.
Finally, I like to put the main() function of scripts at the top. That makes the most sense to me. If I open a file, I want to instantly read what it does, not read what its utility functions do. I put the utility functions below. Of course, at the bottom, after everything else has loaded, I place the if __name__=”__main__” code and then call main(). This way, I can import this as a module (in, for example, py.test or iPython) to test the utility functions without running the actual script. (warning: Do not put anything except the call to main() at the bottom. Otherwise, you may not realize under what circumstances you call main() and with what parameters.)
Here is the script:
#!/usr/bin/env python
import os
import re
import subprocess
import logging
import optparse
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s')
def main():
usage = "usage: %prog [options]"
parser = optparse.OptionParser(usage)
parser.add_option("-m", "--merge-master", dest="merge_master",
action="store_true",
default=False,
help="Merges the latest master into the current branch")
parser.add_option("-B", "--merge-branch", dest="merge_branch",
action="store_true",
default=False,
help="Merge the current branch into master; forces -m")
options, args = parser.parse_args()
if not options.merge_master and not options.merge_branch:
parser.error('Must choose one-- try -m or -B')
# Merging branch requires latest merged master
if options.merge_branch:
options.merge_master = True
if options.merge_master:
output,_ = call_command('git status')
match = re.search('# On branch ([^\s]*)', output)
branch = None
if match is None:
raise Exception('Could not get status')
elif match.group(1) == 'master':
raise Exception('You must be in the branch that you want to merge, not master')
else:
branch = match.group(1)
logging.info('In branch %s' % branch)
if output.endswith('nothing to commit (working directory clean)\n'):
logging.info('Directory clean in branch: %s' % branch)
else:
raise Exception('Directory not clean, must commit:\n%s' % output)
logging.info('Switching to master branch')
output,_ = call_command('git checkout master')
output,_ = call_command('git pull')
logging.info('Pulled latest changes from origin into master')
logging.info('Ensuring master has the latest changes')
output,_ = call_command('git pull')
if 'up-to-date' not in output:
raise Exception('Local copy was not up to date:\n%s' % output)
else:
logging.info('Local copy up to date')
logging.info('Switching back to branch: %s' % branch)
output,_ = call_command('git checkout %s' % branch)
output,_ = call_command('git merge master')
logging.info('Merged latest master changes into branch: %s' % branch)
logging.info('Ensuring latest master changes in branch: %s' % branch)
output,_ = call_command('git merge master')
if 'up-to-date' not in output:
raise Exception('Branch %s not up to date:\n%s' % (branch, output))
else:
logging.info('Branch %s up to date' % branch)
logging.info('Successfully merged master into branch %s' % branch)
if options.merge_branch:
logging.info('Switching to master branch')
output,_ = call_command('git checkout master')
output,_ = call_command('git merge %s' % branch)
logging.info('Merged into master latest branch changes: %s' % branch)
output,_ = call_command('git branch -d %s' % branch)
logging.info('Deleted safely branch: %s' % branch)
call_command('git push')
logging.info('Pushed master up to origin')
logging.info('Ensuring that origin has latest master')
stdout,stderr = call_command('git push')
if stderr == 'Everything up-to-date\n':
logging.info('Remote repository up to date: %s' % branch)
else:
raise Exception('Remote repository not up to date:\n%s' % output)
logging.info('Successfully merged branch %s into master and pushed to origin' % branch )
def call_command(command):
process = subprocess.Popen(command.split(' '),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
return process.communicate()
if __name__ == "__main__":
main()
Mark Zuckerberg Wears My Sandals

Valleywag reports that Facebook still has not started firing employees as every other Silicon Valley startup has. But, the most interesting part of the article lies hidden within the picture.
Mark Zuckerberg (the billionaire) wears the same sandals I do: old-school Adidas sandals . I don’t know anyone else who wears them.
I just bought these Rainbows in Miami which are pretty nice.
Ruby is a Ghetto
Zed Shaw (the creator of Mongrel) not long ago described how the Ruby on Rails community is a ghetto.
Working with both Python and Ruby now, I learn every day how much Ruby, too, is a ghetto. Nobody documents anything (e.g. solr-ruby). The few projects that have documentation do not document clearly or completely (Rails…).
Moreover, take Ruby’s standard package management system: rubygems. A simple gem install uses up 600+ MB of RAM on my SliceHost machine. But again, lack of documentation scars this project even more deeply. Take a look at its Frequenty Asked Questions Page:
[I lost my internet connection while composing the answer to this question. Unfortunately, I now no longer recall what I intended to write. The answer (or at least part of the answer) is buried deep in the RubyGems mail archive. I’ll try to update this after a bit of research. Sorry for leaving this question hanging.]
Seriously, “I now no longer recall what I intended to write.” For how many months has this lunacy been online? Ruby is a ghetto.
Redesigned the Blog
Blog redesign now enabled. Looks cleaner, fresher. Plus, it has more stuff to do in the sidebar!
Here’s what the site looks like as of today:

Switch windows quickly
I want to avoid RSI. So, I want to use the mouse as little as I possibly can while I focus on my keyboard. Unfortunately, alt+tabbing between windows takes far too long and annoys me with how much I have to think to move between the windows.
I often have several windows open. I want to switch between them very quickly. So, I created a program using Python and Xlib that generates another program.
The program moves my mouse automatically to a specific location and then clicks automatically.
The program also creates a keyboard shortcut in Gnome. So, I can type something like Alt+q which calls the program above, moves the mouse to a specific location, and then clicks.
Finally, the program also generates a program which, when called, opens up many windows at specific locations in a grid:

If I combine all of these programs, I can focus between windows very easily. I can move the mouse between 12 spots in a 4×3 grid using the keyboard letters Q,W,E,R, etc like below:

To move to the Top-Left window, I hit Alt+q, which moves my mouse to the top left and clicks, focusing the top-left window. To move to the bottom right, I press Alt+v, then the mouse moves to the bottom right and clicks, focusing into the bottom right window.
Basically, when I’m programming, I never have to move to my mouse to switch between windows very quickly. I can open up 12 files at once, and switch between them swiftly and deftly. When you work on a large application, this becomes very useful.
I’ve open-sourced the program here: http://github.com/jperla/mouse-focus-shortcuts/tree/master .
 
It’d be hilarious
As seen on Slashdot:
>Oh well. 1998 me is still pleased to hear this.
Is 1998 you still on the line? Warn him that Star Trek: Insurrection really sucks!
Kohl looking into telecom pricing practices
I have been saying for a long time that AT&T, Verizon, and others operate in a market with little real competition which allows them to charge ridiculous rates and have unfathomably bad customer service. Finally, one senator begins investigations into their text messaging pricing practices which have increased by laughable amounts: http://mobile.slashdot.org/article.pl?sid=08/09/10/1845210
Books I Read
I updated my booklist which I link at the top of my blog. Please let me tell you a little about it.
Generating the Page
Organizing the Books
I use GoodReads to organize my books. James Currier, proprietor of MedPedia, invests in GoodReads. It lets me add books quickly and easily, plus I easily export the book list. I prefer it to Shelfari or LibraryThing.
Creating the HTML
I exported my book list along with which shelves (categories/tags) each book occupies on GoodReads. I hacked up a short Python script that reorganizes the list by shelf and puts the shelves in order. The script generates HTML which I can paste into that page.
Linking and covers
I grab the images from Amazon using some great hacks I learned about recently: how to abuse Amazon product images. Nat Gertler does a great job clarifying all of the great things you can do using Amazon’s huge dynamic image generation system. It’s okay for me to use these images since I link you to the Amazon site. I refer to the Amazon pages using my Amazon Associates Referral Program Account. If you click on one of the lists and then buy something from Amazon, I get a few pennies.
The Shelves
Under this heading, I list the books that I, of course, currently read on a daily or weekly basis. Most of them I downloaded to my Kindle. I agree with myself more and more every day: the Kindle is nearly perfect.
Many people recommend different books to me. I love to hear about books that people love. If you want to recommend to me one of your favorite books, please tell me so that I can add it to this queue.
Sometimes I hear some second-hand recommendations of a book or an off-hand remark about the quality of a book. Or I might want to read one of an author’s less critically-acclaimed books. I might want to remember that book for later, in case I have extra time, so I add it to this list. For example, I loved The Scarlet Letter, so I might also enjoy The House of Seven Gables, but I have other priorities.
Sometimes I start a book, read a few chapters or get half-way through, and then never pick it up again. This happened more often in high school; most of the books here come from there. Now, I will often not finish a book when I start a book owned by someone else then fly to another city soon after. Fooled by Randomness I will finish once I can sit down for a couple of hours in a Borders or Barnes & Noble.
I have a few favorite books that I am very happy to have been fortunate to come across. Most have impacted me in a deep way or have given me knowledge that changed the way I acted in the world. They make me who I am today. The list will change with time, though, I think. For example, I forget now but why did I put The Giver here?
I loathe 5-star rating systems. I really have just 3 categories. My favorite books. Books which are worth the time it takes to read them, and books which are not worth the time it takes to read them. This can happen if the book is inordinately long or, more often, barren of content.
Any book on this list, every book really, I recommend that you read.
Every book on this list, I suggest you pass on, unless you read all of my favorites and worthwhile books.
Some of these books show up here because other books describe the same ideas more succinctly or in more interesting ways. Or more cheaply. For example, pretty much every essay in Paul Graham’s Hackers and Painters he already posts for free on his website.
Actually, looking over this list, I see that I heavily bias it toward (non-scifi) fiction and poetry. This probably reflects more my distaste (or at least the distaste I had in high school) for fiction. Maybe I would understand and appreciate more if I read these books today. Probably.
At the same time, perhaps my bias will help you identify the “greatest” classic fiction books. I really did enjoy some greatly, and put them onto my worthwhile list: The Grapes of Wrath, The Scarlet Letter, To Kill a Mockingbird, The Metamorphosis, and The Chocolate War.
At the bottom of the list are books which I wish I could erase from my memory. Never buy these books, never look at them, never gift them to a friend. These books sucked life from my veins. Let me explain why I put the current 4 there:
The Magic of Thinking Big: The book vapidly repeats the same tired aphorisms throughout its several hundred pages. It should be 1 page long or printed on the back of a cereal box. Summary: think big visions and you will try hard to achieve them. I hoped, at the least, for some fun anecdotes. No such luck. Instead, expect some general, detail-poor descriptions of general scenarios which are often either so ridiculous or common place I sincerely doubt any are based on real events. No, read How to Win Friends and Influence People instead.
Vagabonding: This books is so forgettable. It says nothing. It is so forgettable, and I’m not exaggerating, that I forgot to cross it off my list of books to read. Six months later, I bought the book from Amazon again, read through 3 chapters in agonizing pain with a slight feeling of deja vu, before finally realizing that I had already bought and “read” the book before. I tried to salvage the situation by perhaps trying to read more carefully and figuring out the meat of the content of the book only to suffer through an agonizing 3 hours skimming over jumbles of bad puns and base allusions. Avoid this book and find one with real details and advice, real meat, like the 4-Hour Workweek.
Go Green, Live Rich: So awfully terrible that Amazon had to give it away as a promotion on the Kindle. I knew after 10 pages that it was terrible, but I finished anyway for some reason. At least 60% of the book simply repeats the same thought: you should “go green”. You should go green. Tip #2. You should go green. Tip #3. You should go green. Tip #4….. It makes me want to tear the eyes out of the author. This pain would be salvaged if the author picked just a handful of actually useful tips. But he doesn’t. He goes on for hundreds of pages with useless garbage. Let me give you an example of a tip (one of the more “profitable” ones mind you): spend hundreds of dollars and who knows how many hours evaluating your home for tiny amounts of heat loss, then buy things to repair that yourself saving you a net dozens of dollars a year. Or, lower your thermostat by a few degrees and shiver with fear of anticipation every time you step up to your front door so that you can save $15 a month. The only impactful tip is to get rid of your car which is impractical for most families or working people. No, read something else, anything else.
Good to Great: Actually, a lot of people thing this is a great book. It’s not. Jim Collins pretends to be very scientific with this book (also in Built to Last), but he’s not. The methodologies are so riddled with selection bias, his sample size is so small, his comparison companies are so different. It’s amazing this became popular. He could come to any conclusion by simple manipulations of the data. More likely, he and his team saw what they wanted to see. I don’t necessarily disagree with the conclusions, but this book offers no substantive evidence of any kind toward these theories. I recommend Stocks for the Long Run instead of this pseudo-science.
Font Comic: Attempt #1
I love to read about others’ unique creations. I love to get ideas from them.
By pure chance, I happened up on David Friedman’s excellent blog called Ironic Sans where he showcases designs both illustrative and mechanical. He recently created a funny (punny) little graphic:

It reminds me of XKCD, a beautifully simple yet intellectually esoteric webcomic. David Friedman’s graphic above also reminded me of a typography exercise my friend Mason Simon recently created and posted on his blog:

I like these little designs so much. In kindergarten, I never took to drawing and coloring like everyone else. My sketches of people looked like pizzas more than faces. I think I can do a decent job at making a font comic, however. My attempt sits below. It took me half an hour to figure out how to make the black rectangle border. I ended up just making a solid black rectangle with a white rectangle on top. I need to learn Photoshop/The Gimp.

Thank you Comic Sans MS, and the Beat My Guest font from Larabie Fonts.
Blackberry Theory of Email Apathy
The Germ Theory of Disease saved billions of lives from early deaths. It identified a root cause, as well as solutions, to the population-threatening problems of contagious diseases.
 BlackBerry
Today, email apathy plagues the workforce. Whenever you send someone an email and he or she never replies to you, realize that you have been slashed by the sharp sickle of email apathy. Recently, I have noticed an upward trend of email apathy from business colleagues and others. After each click of the Send button, I think, “is my message going to a person or a black hole?”
The simpleton would argue that the large increase in the amount of both real email and spam makes it very difficult for someone to respond quickly even to legitimate emails. A busy person loses even important emails among the piles of clutter in his inbox. Certainly, the amount of email plays a factor, in the same way that stress plays a factor in exacerbating symptoms of a disease.
Blackberry Theory of Email Apathy
I hypothesize that the recent boom in handheld email devices, embodied in the Blackberry, iPhone, and other such tools, cause much email apathy. But by what process?
Nominally, the Blackberry intends to improve efficiency of communication by instantaneously notifying you of a new email as soon as the sender clicks “Send.” In fact, the recipient does feel the Blackberry gently vibrate with every incoming email, but he lacks increased communication. In practice, the Blackberry owner skims the email on a tiny screen, understanding very little of the intended meaning. If the email requires urgent action, at best the sender receives a curt reply tapped out awkwardly on a tiny keyboard by two fat thumbs.
Very often, the Blackberry user mentally notes to himself that he should reply to or act on the email at some point soon in the future, and then he forgets. The sender receives notification that the Blackberry user even received the email. Communication informational content quickly approaches zero.
How do we cure Email Apathy with knowledge of the Blackberry Theory? Proper Getting Things Done process. Perhaps non-instantaneous email triaging. Who knows. Just please reply to my email.
Heart Rate
In PE in middle and high school, I always remember taking my pulse and having a very high resting heart rate relative to others. I forget the exact number, but it might have reached 80 beats per minute or higher. I always thought I counted incorrectly or double-counted.
I’ve started running and walking almost daily recently. I feel better and more energized, especially after a run. I would like to know if my overall health improved since I started about 4-6 weeks ago. The first days, I could barely go around the block. I would come back into the house and gulp down a gallon of water in between deep panting heaves. After a couple of weeks I could run/walk a mile or two without gasping for breath by the end. Yesterday, I estimate I ran/walked 5 miles (I know that I walk 4 miles an hour) without a problem.
So, in terms of endurance, my fitness improved. But what about my heart rate? I check yesterday and today. It’s down to about 63 beats per minute. I made a graph using a short Python script, pygooglechart, and the Google Chart API. I will be plotting more data points every day:

Lance Armstrong has a resting heart rate of 32 beats per minute! On the other hand, some quick research online tells me that resting heart rate poorly correlates to fitness, although recovery rate would be a better measure. I’ll start charting my recovery rate once I figure out how to measure it easily.
YCombinator Application Guide
YCombinator, a kind of mini-venture capital firm, invests tens of thousands of dollars ($$$) into very early seed stage start-up companies run by smart technology hackers. They wanted to fund me in Summer 2008.
I applied to YCombinator two times. The first time, when I applied with my friend Mason for the Summer 2007 round, I arrogantly presumed that Paul would lavish on us praise and beg us to fly to California to work with him. I spent no more than an hour on the application. We had no passion in the idea we presented. Our projects list hinted at nothing particularly remarkable or unique. Our analysis of the idea and our competitors delved only into the shallowest parts of a deep lagoon.
The second time, when I applied alone in Summer 2008, in an inspired moment I sat down in Starbucks for a solid few hours to work on the application. I strived for excellence, not perfection. A few months prior, I had briefly glimpsed the semi-successful application of Liz Jobson and Danielle Fong. I recalled their deep detail and thoughtful writing, so I imitated that kind of deep analysis which shows off one’s mastery of logic and breadth of experience.
I wish I had known how to write a good application the first time. So, taking my cue from Brian Lash’s recent question on Hacker News, I helped him out. I write here a slightly expanded version to help out anybody else who wants Paul Graham & co. to fund his or her startup.
If I were to advise myself in 2007, I would recommend that I write briefly but write a lot. This advice seems contradictory, but I mean it in a very specific way. My first application, I kept brief. I did not want to swamp YC with a tome of text. I saved many of my accomplishments for the interview. Do not do this. Write, write, and write some more. Write everything interesting and unique about yourself. If you have doubts about a statement you made about a competitor, qualify it. Don’t vacillate, but at the same time don’t seem shallow, ignorant, and inexperienced.
Of course, once you’ve written all that, you have a very long application. Now, take out filler words. Compress ideas that take up two sentences when you can use just one. If you waste two words in a sentence, delete the whole sentence and write it again from scratch. If you see a phrase that you think an investment banker might use on his resume, nuke it. Achieve a high density. In my experience, the YC crew truly pores over these applications to understand all of the meat of it. They do not skim your application when it has rich content. Cut, cut, and cut some more.
Now, step back and look at your application. If you have very little writing left, real content, then you may not be the best fit for YCombinator this year. That’s okay. It’s good you know now. Take this year off and work on some interesting, hard projects that nobody has done before. Bounce your idea off of the smartest person you know. Hell, micro-test the idea. Then, repeat this process.
Step back, look at your tight list of accomplishments. If it’s long, that’s great, since reading something long but rich in content everyone loves to do. The length indicates strength. In my limited experience, I think this is how I made my application successful.
What is your company going to make?
I’m open to anything. Here’s one idea:
————–
Have you ever scanned a document before? How was that experience?
It was terrible for me, too. Everyone I have ever asked has agreed that it is physically painful. But, there is a solution, one based on understanding actual human needs. What is wrong with the scanners of today?:
* slow (takes time to heat up)
* slow (scanning at a high dpi takes a long time)
* complicated (please select the dpi, now select bla, now bal[sic]…)
* cumbersome (files generated at high dpi are huge, slow down system)
* cumbersome (OCR’ing a document is a whole other rigamarole)
What do people really need? Simply a decent, readable scan of the document. This should be as easy as holding the paper up to face the monitor.
Imagine that.
I propose that I sell a device which is basically just a decent-resolution CCD chip with a special lens which connects to a computer (wired at first, but v2 wireless). Scanning a document is as simple as holding the camera up to a document and clicking. In my tests, scanning a whole text books takes 5-10 minutes. This is a game-changer. I’ve worked with an ip lawyer to file the provisional patent on this and a few other aspects of the designs.
[BY THE WAY, IF ONE OF YOU WANTS TO HELP ME BUILD THIS, I'M ALL EARS. I'M AN AI HACKER NOT A HARDWARE HACKER. OH, BY THE WAY, I USED A DIFFERENT IDEA IN THE INTERVIEW ROUND, NOT THIS ONE SINCE I'M SKEPTICAL OF THE MARKET FOR THIS PRODUCT AT THIS POINT. NEVERTHELESS, IT'S VERY COOL. I WANT TO BUILD THIS FOR MYSELF!]
For each founder, please list: name, age, YC username, email address, personal url (if any), and current employer and title or school and major. List the main contact first. Separate founders with blank lines. Put an asterisk before the name of anyone not able to move to Boston June through August.
….. [Be sure to put your blog here. Don't have a blog? Make one. Blog about whatever is on your mind. Blog about your hacking.
To be honest, an Ivy League pedigree probably helped. Also, my computer science degree (as opposed to Economics or Business one) probably encouraged YC's faith in me.]
Please tell us in one or two sentences about something impressive that each founder has built or achieved.
Looking at some things in ~/projects folder: ……..
[Here I mention a few of my projects, with links to open source code, web pages, anything I can publicly show. I didn't spend more than one or two sentences describing any one project, but I listed many of my most interesting projects and why I worked on them. YC likes to see you working on real problems, so I talked about problems I solved for myself and for others directly
They want to see that you think creatively and that you actually finish things.
It goes without saying that you should list projects which uniquely describe you. Building a toy language in Programming Languages class many people probably do. Yes, it may have taken you a long time, and you may have learned a lot, but you do not necessarily stand out. Writing a CAPTCHA solver to hack Digg few people do or can do.]
Please tell us about the time you, ljlolel, most successfully hacked some (non-computer) system to your advantage.
…… [I talked about my shotgun email to dozens of startups here in Silicon Valley which gave me the opportunity to meet a lot of cool entrepreneurs. I'll probably blog about this at some point in the future.]
Please tell us about an interesting project, preferably outside of class or work, that two or more of you created together. Include urls if possible.
(see above) [I applied alone, so group projects inapplicable.]
How long have the founders known one another and how did you meet? Have any of the founders not met in person?
n/a [Again, I was a sole founder.]
What’s new about what you’re doing? What are people forced to do now because what you plan to make doesn’t exist yet?
(see above) Basically, nobody ever scans anything because it takes forever, doesn’t really do what you want (you just want a readable, small image and for the document to be searchable),
What do you understand about your business that other companies in it just don’t get?
Scanner manufacturers try to pack in the highest dpi they possibly can. They focus on resolution, when they should be focusing on the user experience. Speed is what they should optimize, but I see no scanner manufacturer doing that.
Who are your competitors, and who might become competitors? Who do you fear most?
HP, Xerox, etc, also ScanR, Qipit, Evernote …… [I go on to be brutally honest about the difficulty and vulnerability of my position as a hardware startup in a crowded field. Remember, you are writing for some very, very smart people. They want to see your analytical thinking skills here. They want to see you be realistic, not delusional.]
……. more questions, answer analytically deeply, answer honestly to the best of your ability ……
If you had any other ideas you considered applying with, feel free to list them. One may be something we’ve been waiting for.
…….. [I always think of new ideas and discuss them with friends. I chose 4 and listed them here. I crisply described each in no more than 2 brief sentences.]
Steve Yegge Rules
I stopped writing in this blog once I realized that people actually read it. I received a few comments in one technical blog post. They pushed me over a cliff. Instead of publishing whatever popped into my mind regardless of the quality of the idea or writing, I hesitated over every agonizing sentence. Every word strangled me. I began to engineer my very thoughts to match that post’s style and topic, but I often failed and quit. I have 28 abortive drafts in WordPress.
I truly enjoyed clarifying my thinking through writing. So, I will write more. Perhaps I will write something tautologically wrong or use dirty slang. Irrespective of the quality, I will write.
Incidentally, Steve Yegge inspired me to start writing again. If you program computers, you will love Steve’s Drunken Rants. With his 20 years of programming experience, he cuts down to the bone of programming problems and programming triumphs. He writes thoughtfully and completely; the rants often span several thousand words. He wrote them, he claims, while drinking wine during the time when he worked at Amazon.
Now, he works at Google and has a more current blog: http://steve-yegge.blogspot.com/ . The newer rants also require serious time commitments to read, but each one imparts to me incredible insights. For example, I now love JIT’s.
Games to play with just voice and memory
XKCD solves Ghost
The XKCD guy not long ago wrote about the game Ghost. You start the two-player game Ghost by saying one letter. Then, your opponent says another letter. Concatenate the letters together, they should not form a word. Continue adding letters to the concatenation of letters one by one until somebody forms a word and thus loses.
The XKCD guy uses the Ubuntu dictionary in /usr/bin/words and creates a short program to calculate the optimal strategy to play the game. He solves Ghost and publishes the solution. Since that game no longer yields interesting results, he asks at the end of his post for users to recommend new games that he can play just using voice and memory. None of the offered games seemed very interesting or innovative, so I will offer my own:
My brother Mark and I have spent many hours in cars together through our lives. To fight boredom, we have invented some open-ended games. I will mention only the most unique one: the Doubling Game. How about the Perla Doubling Game, yes.
Doubling Game Rules
Nobody can be confused by the simplicity of the Perla Doubling Game. Two players play, although I can easily see any number of people playing. One begins by saying, “2 + 2 = 4.” The second player takes the summand and adds it to itself, thus speaking “4 + 4 = 8.” The first player continues with “8+ 8 = 16,” and so on until a player asserts an incorrect sum and thus loses.
Importantly, the game does not encourage adversarial deceit. Once the game reaches the hundreds of millions, the digits become more difficult to store in short-term memory. I can ask my brother what he last said as a summand. We double-check the sums with each other cooperatively. Minor slip-ups slide, since continuing with ever-larger numbers exercises the brain much more than starting over at “2 + 2.”
We enforce no time penalties. When the two players match up in skill-level, they both spend all of their energy and about the same amount of time performing all of the sums. One player sums because it’s her turn, the other sums to check the other’s answer. And, cooperatively, you remember many digits together.
Variants
Yes, you can begin with other primes, such as “7 + 7″ or “53 + 53″ (exercise for the reader: why start with primes?). But, once you reach a very high level, the summands become as simple (and as difficult) as the “2 + 2″ path. Moreover, these numbers tend to repeat the same chunks of numbers no matter where you start.
Fun
The Perla Doubling Game taxes you mentally, passes the time, and inspires both a competitive and cooperative spirit (how high can you go?). I highly recommend the game to any two smart, bored car passengers.
TipJoy ingeniously simplifies and enables micro-payments
I have already written about my distaste for advertising.
Sometimes, however, these newspapers and blogs manage to make something of value. A particularly hard-hitting expose in a newspaper, or a particularly helpful guide in a blog, offers to people real value. Nobody can create this kind of content every day, or probably even every week or month. A subscription subsidizing the page-filling fodder misallocates wealth. I want to pay for the value more directly, not indirectly through ads.
Or, more commonly, a blog post provides for me a little bit of value. Not $50/month in value, but perhaps 50 cents/month. No payment system can pass around payments like that easily for the user, especially without ridiculously large credit card fees. How can I tell Michael Arrington of TechCrunch that his site I find useful sometimes? Combined with the millions of others who find his site just a little bit useful, he can make some money directly from us.
Fortunately, I think TipJoy solves many of these problems. The site only launched a few months ago, so it has to grow quite a bit before it reaches a tipping point. Nevertheless, TipJoy designed their product beautifully.
Registration
First, for new users, creating an account takes a few seconds. Just click on the TipJoy button, write in your email, quickly create a password, and finish up. No credit cards required. A new user signs up by tipping, integrating the first-use with registration. Ingenious.
They follow a model that bar’s use where you can set up a tab and pay later. Readers get drunk tipping blogs here and there all around, running up a huge tab. Users only pay once the tab gets large enough to justify the credit card fees. Their model differs from the bar, of course: just like the tips themselves, paying the tab is optional. Nevertheless, through this system, TipJoy encourages people to sign up easily, and only over time pay off their tabs.
Tipping
Second, once signed in, tipping takes just one click. No annoying confirmation steps required. No complicated questions about how much you tip. You get one choice: 10 cents. Of course, you can tip more if you want. This encourages readers to tip generously around many sites across the web. The tab builds up invisibly behind the scenes.
When I first read about TipJoy, I knew that it, or a model very similar to it, would take over the web. I think it will take time. However, I will support this service by putting it up on my blog. Maybe, one day, I will write a post that many people find just a little bit useful, and I can finally monetize this blog .
Make your own chimes
I just bought a Mac Mini. I love it. Apple spent a lot of time polishing OS X.
I configured OS X to create a chime, a 21-st century chime. In the Date & Time settings, I selected it to tell me the time every hour. At 6pm, a voice from the computer says, “It’s 6 o’clock.” At 10pm when South Park comes on, it reminds me by saying “It’s 10 o’clock.” The chime keeps me conscious of the time passing when I’m online.
I dual-boot Ubuntu on this Mac Mini. Ubuntu, unfortunately, does not have this chiming feature. However, I set it up in minutes. I installed festival, the free open-source text-to-speech synthesizer, as well as an American voice (I struggled to understand the British voice).
sudo apt-get install festival festvox-kallpc16k
Then, in crontab, I added one line:
0 * * * * echo "(SayText \\"Its`date +\%l` oclock\\")" | festival
Now I easily keep track of the time.
How to check email two times a day
Tim Ferriss popularized the idea that you should limit the amount of time you spend checking email every day. He espouses a philosophy of life called the low-information diet. By following these guidelines, you get more done and, more importantly, feel less stressed.
One of his suggestions about email spread across the blogosphere very quickly because of its simplicity and practicality. He recommends that you check email only twice a day (or preferably less often) and strictly adhere to that rule. I started following these guidelines a few days ago, but I easily relapse. Nevertheless, I do a few things to try to stay on the wagon:
- Add a message to all outgoing emails:
EXPERIMENT: I will be checking email 2 times a day at 1pm and 6pm pacific time.
If you need me earlier, then please contact me below.
And of course I put my contact information below. With this signature, I do not worry about missing out on important and urgent information or replies.
- Delete all links, shortcuts, and bookmarks to GMail
- Set up a script to automatically open up GMail at 1pm and 6pm every day. In Ubuntu, I write just one line in crontab:
0 13,18 * * * export DISPLAY=:0 && firefox https://mail.google.com/
Linux makes hard things easy.
Untenable advertising
Ads annoy me. Ads annoy everyone.

More importantly, I cannot envision building a serious business which depends on these kinds of banner ads, or even text-link ads. But many websites do: TechCrunch, Project Wedding, Reddit, MightyQuiz, Justin.TV, Scribd, Loopt, and so on.
I use many websites online every week. Many provide a lot of value to me, they help me do my job more quickly or help me live my life more easily. They offer me so much value, I would even pay to use them. Some of these services include Google, Amazon, GitHub, Bank of America, Kayak, Craigslist, and a number of blogs like Slashdot, XKCD, and so on.
Except for Google services and the content creators (the blogs), I pay directly for the value these websites give me, given how little the services cost. The smartest ones all do. Kayak, for example, makes money off of the airline and hotel referral fees, not ads.
Unfortunately, many startups think that Google’s AdWords will be their sole source of revenue for their website.
Weakness
But, advertisements as a business model suffer from a fundamental weakness: advertisements indirectly monetize a website. Sometimes, the indirect monetization means that you make more money. Often, it means you make less.
Imagine you make a technically amazing product on your site. Nothing else exists like it. I sign up, and I notice that you provide an incredible amount of value to me. I would be willing to pay a large monthly fee for that. Instead, though, you monetize the website through advertisements. I never click on the ads. I visit to your site to use your product, not to buy chainsaws. You make no money off of my use. Even if I clicked on a few ads, you still make less money than if I paid a monthly fee.
That doesn’t work. You get none of the pay off from the value you provide me, while simultaneously actively annoying me. Project Wedding offers a good example. I would use Project Wedding to review, for example, photographers and find the perfect photographer for my wedding. The Google Ads at the top for random photographers who happen to pay for the ads do not help me; they only confuse me. A referral fee model makes more sense, or preferably an even more creative never-before-seen model.
The Quintessential Advertising model
Now, for a few kinds of websites, advertising makes sense. When I’m looking for a chainsaw to buy, I google “chainsaw” to find results, but I also see “chainsaw” sponsored ads on the right. That makes perfect sense; it directly provides me value. Google search exemplifies a great use of advertising. As Google’s customer, you watch Google continually provide us a better, more targeted service. It is the Yellow Pages model.
The Common Advertising Model
Advertising does not make sense in most other models. It does not provide value any other way, but it does annoy me. Nevertheless, I would use advertising if I started a company that built one class of product: products that provide little to no value. Examples include most television programs (think “reality” TV) and online games. People spend time watching random television shows to waste time and not think. These provide little (negative?) value. You have absolutely no opportunity to get people to spend money on your silly time-wasting flash game. You can, however, put ads along the side. With this kind of advertising, you transform your customers from the people playing the games into the advertisers. The advertisers pay you to reach out to these game-players, at the expense of the already-void user experience. Advertisers pay more.
Most magazines, newspapers, and blogs also fall into this category. Reddit and Digg as well. Little to no (to negative) real value offered. Newspapers and magazines offer nominal subscription fees, not because they cover the cost of the reporting–it probably does not even cover the cost of the ink– but because advertisers demand that they know real circulation numbers. Advertisers assume that if you pay at least a little, you probably read it and look at the ads. Because content creators cannot extract enough money from you directly into paying for all of the reporting and server overhead, they resort to becoming the servants of advertisers. Digg now displays (or at least recently used to) very annoying flashing ads.
Make something useful
But if I want to create something that depends on this kind of advertising, why do I want to create it in the first place? Why do I want to make something that nobody values, that nobody finds useful? For me, I cannot do that. I want to make something great, not a time-waster.
Stanford’s Entrepreneurial Thought Leaders Series (now on your iPhone!)
The Stanford Technology Ventures Program runs a well-developed incubator for tech businesses at Stanford University.
STVP offers some very cool resources free to the world. For example, I have been listening to their Entrepreneurial Thought Leaders audio podcast. The program brings in some of the greatest entrepreneurial forces in Silicon Valley today. Some of the speakers include
and so on.
While I was listening to Mike Maples and Ron Conway give their talks about angel investing, I had trouble following along and knowing who was saying what. I had subscribed to the talks through iTunes. When I visited the site, I noticed that they published videos as well, but in a Flash format, and not available as a podcast. I followed the videos much more easily.
So, in accordance with their fair use license, I decided to scrape the video metadata, download the video files, transcode them into an iPod-acceptable format, and republish them in a simple video podcast format. I now have scores of these talks in my iPhone and on my Mac Mini to view at my leisure.
Now, you can download them to your iPod, too. Just subscribe through iTunes or any other podcatcher.
P.S. I’ve open-sourced the code (AGPLv3), in case you ever want to make a podcast yourself.
Learn 100 digits of pi at lightning speed
Learn 100 digits of pi at lightning speed.
In a previous post, I wrote about the Secret to Pi. I wrote about the method I used to learn 100 digits of pi in under an hour and remember them days later without extra practice.
While memorizing the digits of pi using this method, I realized that I was spending most of my time trying to think up words that would translate to the digits. I tried to think of the longest word I could. Sometimes I would screw up and use a word that did not translate to the correct digits. I spent 2/3rds of my time just thinking of good words, images, vivid pictures. It was hard and slow.
So, I decided to make a computer program to find the words and optimize everything for me. I did, and I’m releasing the code under Affero GP. Of course, all the code is PYthon2.5. Please allow me describe it to you. With the words precomputed, I can learn pi as quickly as I can tell a story!
At the top above, I linked to a page which I generated automatically using these libraries I’m releasing.
There are a few libraries. They all require NLTK. NLTK is an excellently-designed, well-developed, actively-maintained open-source natural language parsing library. It has many (nearly 1GB of) corpora.
First, generate_nouns.py is a script. We need to automatically generate a good, long list of concrete nouns for you to have strong images and remember the story of pi visually. It uses the CMUDict Pronunciation Corpus which is in nltk.corpus.cmudict. It also uses the wordnet corpus in nltk.wordnet. The script does some intelligent processing to filter out archaic words, curse words, and abstract nouns. Run generate_nouns.py at the command line to create a nouns.csv file, or just download my copy in the repo. 50-75% are very good, concrete, vivid nouns for this purpose. If you can help me get a higher percentage/more good nouns, please tell me.
Second, there is soundmap.py. Soundmap.py is a library (import soundmap) that you can use to convert a word or phrase into the corresponding digits. To be perfectly flexible, it loads a file which describes how to match which sounds to which digits. I provided the sounds.csv file which is the one I use. I haven’t tried to figure out what would be the optimal configuration yet, but maybe you can . This also uses the CMUDict Pronunciation corpus (of course). Call soundmap.convert_to_digits(phrase) to have it return a string of digits.
Finally, there is mapwords.py. Mapwords.py is a library that takes in a string of digits (such as the digits in pi) and uses the nouns.csv list of nouns and soundmap.py to figure out the optimal sequence of words for people to remember that sequence of digits. It also has a couple hundred digits of the famed constant inside the library: mapwords.pi. Simply call mapwords.get_best_mapping(mapwords.pi) for it to return a list of words.
You can put all these together and quickly learn thousands of digits of pi. Here’s a great page with many digits to throw into the program.
The Secret to Pi
NEW: I created a website designed designed to teach you dozens of digits of pi in minutes using this secret method. If you want more digits, I also open-sourced the code.
Tomorrow, around the country, schools and universities will be celebrating the ratio pi (π). Students and professors will eat blueberry pies, talk about math, and hold contests. The pie-eating contests look like fun.

(photo by becw)
Another large part of the festivities are pi recitation contests. In these competitions, students face off against one another attempting to see who can recite the most consecutive digits of pi starting at 3.14. A number of schools have them. The Daily Princetonian, from my alma mater, reported on a contest few years ago where one student recited a couple hundred digits of pi. Harvard’s Crimson reported on a student last year who recited more than 1000 digits of pi in one sitting. Even elementary school kids have these contests on March 14th.
Last year, FOX News interviews some students about the significance of these contests. “Bryan Owens, an MIT senior, says the ability to recite pi is a sort of bragging right, a coin of the realm.” Math geeks wear the number of digits of pi they know as a symbol of pride. Some people become obsessed: “In 2004 Umile read the digits of pi into a
tape recorder. He did it a thousand at a time and gave it a rhythm _
some numbers high-toned, some low. He listened to the tape constantly. This went on for two years. A two-year trance.”
Two years. I say, a waste. I know the Secret to Pi. I have learned 100 digits of pi in under an hour with perfect recall a day later. That includes overhead of learning the secret, so now I can learn at the rate of 100 digits of pi every 20-30 minutes.
The secret:
First, you must leverage human psychology. Understand that you can only remember so many things. Furthermore, human beings evolved an incredible capacity for remembering some pieces of information, but not others. We have a weak capacity for numbers, strings of digits. They are unnatural. However, we have a strong capability for remembering images, and a large number of images. You can close your eyes and see your childhood home, even imagine walking through it clearly. In particular, we remember vivid, unique images. You will remember and recognize the picture above with the pied woman’s face, because you do not see that everyday.
You also have good short-term auditory memory. That is why it might be easy for you to learn 10 digits of pi very quickly, since you just replay your auditory memory of the digits, but you forget them just a day (or an hour) later. Stories and images, however, stick with you. You can imagine most of Harry Potter’s long journey from beginning to end. How do we take advantage of our natural gifts?
Simple.
- Associate words and hard, concrete images with numbers.
Take any word with a strong visual image. For each hard consonant sound in the word, associate a digit to that sound. Ignore the vowel sounds. Use the key that is on Tim Ferriss’s excellent blog post on the topic.
- Associate the digits of pi with a list of words. [3.]1415 926 becomes TREADWHEEL BANJO.
- Make a story with the words, in oder. Make it wacky. The more offbeat, the easier to remember. Imagine the story vividly.
(Or use the method of loci; just don’t run out of locations!).
- Recite pi: simply remember the words in order, then translate each word into the corresponding digits.
So, instead of trying to remember chunks of numbers, and how chunks of numbers relate to other chunks of numbers, you just remember a story. Imagine you are on a farm, pushing a TREADWHEEL very hard with your own hands (for some reason, remember the zanier the easier to remember; the droll is forgettable). You’re sweating from the work, but the sweet farm fresh air keeps you going. Suddenly, somebody comes in playing a BANJO, playing your favorite song. And so on.
Instead of imagining a story, you can use the method of loci. This method involves imagining vividly a location you already know very well, such as your home. Imagine walking through, very clearly, and identify objects one by one. For example, imagine your kitchen. You start walking in, the first thing on your left is a CLOCK, then a CUTTING BOARD, then a REFRIGERATOR, then a MICROWAVE, etc. Finally, associate each word in your list of words with each word in your kitchen, in order. So imagine a TREADWHEEL CLOCK, then a BANJO where you can cut vegetables like a CUTTING BOARD. Now, to recite pi, just imagine walking through your kitchen. You will first see a CLOCK, but you will also immediately think of a TREADWHEEL. Then you take a step and see your CUTTING BOARD, reminding you of BANJO. You can use this method to remember any kind of list.
Finally, use the key to translate a word into the sequence of digits in pi. TREADWHEEL is 1415, and BANJO is 926, so those are the numbers in 3.1415926… And just continue on that way.
Not only do you learn the digits more easily, but also you remember them for weeks without a refresher, and re-learning becomes an easy game of recalling the story just once for a few minutes.
Moreover, this method is overall less taxing on your brain. You use up less of your mental space (although I think you have more than you will ever need). To memorize 100 digits of pi, you need only remember 1 story, composed of 40 words, instead of 100 digits.
Finally, learning to recite pi this way becomes useful for remembering other numbers or lists of numbers. If you ever have to remember a very long number, just break it up into a few words and remember those.
I want to demistify pi memorization. Although people may treat it that way, it is no more a measure of real intelligence than the SAT or Stanford-Binet. You can learn a few hundred digits of pi tomorrow morning, go to a pi recitation contest, and blow everyone out of the water. When people say how smart you are, just tell them you how easily you learned hundreds in a few hours, and how they can too.
Sympathy
Guess who:
Please allow me to introduce myself
I’m a man of wealth and taste
Ive been around for a long, long year
Stole many a mans soul and faith
And I was round when Jesus Christ
Had his moment of doubt and pain
Made damn sure that Pilate
Washed his hands and sealed his fate
Pleased to meet you
Hope you guess my name
But whats puzzling you
Is the nature of my game
I stuck around St. Petersburg
When I saw it was a time for a change
Killed the czar and his ministers
Anastasia screamed in vain
I rode a tank
Held a generals rank
When the blitzkrieg raged
And the bodies stank
Pleased to meet you
Hope you guess my name, oh yeah
Ah, whats puzzling you
Is the nature of my game, oh yeah
I watched with glee
While your kings and queens
Fought for ten decades
For the gods they made
I shouted out,
Who killed the Kennedys?
When after all
It was you and me
Let me please introduce myself
Im a man of wealth and taste
And I laid traps for troubadours
Who get killed before they reached Bombay
Pleased to meet you
Hope you guessed my name, oh yeah
But whats puzzling you
Is the nature of my game, oh yeah, get down, baby
Pleased to meet you
Hope you guessed my name, oh yeah
But whats confusing you
Is just the nature of my game
Just as every cop is a criminal
And all the sinners saints
As heads is tails, Just call me Lucifer
cause Im in need of some restraint
So if you meet me
Have some courtesy
Have some sympathy, and some taste
Use all your well-learned politesse
Or Ill lay your soul to waste, um yeah
Pleased to meet you
Hope you guessed my name, um yeah
But whats puzzling you
Is the nature of my game, um mean it, get down
Woo, who
Oh yeah, get on down
Oh yeah
Oh yeah!
Tell me baby, whats my name
Tell me honey, can ya guess my name
Tell me baby, whats my name
I tell you one time, you’re to blame
Ooo, who
Ooo, who
Ooo, who
Ooo, who, who
Ooo, who, who
Ooo, who, who
Ooo, who, who
Oh, yeah
Whats me name
Tell me, baby, what’s my name
Tell me, sweetie, what’s my name
Ooo, who, who
Ooo, who, who
Ooo, who, who
Ooo, who, who
Ooo, who, who
Ooo, who, who
Ooo, who, who
Oh, yeah
Dried Pineapple
BankOfAmerica.com > Mint.com
A recently-launched startup, Mint.com won the TechCrunch40 award for best new startup. TechCrunch raves incessantly about Mint.com. I had used Microsoft Money a couple of years ago, and I liked that I could sync up with some of my banks and credit cards. Unfortunately, the process was tedious, Microsoft Money did not automatically categorize my expenses. It did not do what I wanted. Because of the hype surrounding Mint, I finagled an invitation to try out the site. I used Mint.com very early on; I beta-tested their product.
I put in my bank information, which was relatively easy to do. It loaded up my credit card transactions, although that process took a long time. Mint.com showed me charts of my spending and nothing else. Mint.com, not only devoid of features, actively tolerates bugs in the website. Their product loaded the transactions from my Bank of America accounts twice. It said I was spending twice as much as I was, it said I had twice as much money in the bank as I did. Seems like a simple bug to fix, and a common one considering the popularity of Bank of America. As a beta-tester, I emailed customer service informing them about this problem. Their reply: “we know.”
So, the only feature Mint offers to me, expense tracking, I cannot use. The other major feature they claim to offer, as well as putatively their only source of revenue, lies in their “intelligent” financial recommendations. Really, they just try to get a referral fee by directing you to ING or American Express. If you have a low-yield savings or checking account, they recommend a high-yield ING account. If you use a credit card with no rewards, Mint refers you to American Express or another card with benefits. That’s it, I already have both, so Mint offers me nothing.
I closed out my account, and I can only hope they deleted all my financial information. (Either way, knowing how startups and hacking work, I think my accounts are fairly secure). I waited for another new product to rise to the challenge of managing my finances. I had tried another company, Wesabe.com, which is a well-designed website with learning algorithms to categorize expenses, plus they don’t offer to store your passwords for you. But, you have to download a client for you to download financial statement updates yourself. I tried it out to discover that I’d really rather they use up their bandwidth and their time downloading financial updates. Moreover, they didn’t have a Linux client. They recently released a Firefox client, but I prefer Opera now. Finally, on balance, my passwords on my computer have a higher chance of being stolen than my passwords on enterprise servers.
Fortunately, recently, I noticed a relatively new feature on the BankOfAmerica.com Online Banking website: My Profile. BOA offers Online Banking free to pretty much anyone with an account. When I first opened my account, the website loaded slowly, crowded text together, and thirsted for features. Hardly usable, I rarely logged in. Over the past two years, though, the website has significantly improved. Bank of America has won awards for its online banking interface. BOA could rest on its laurels, but instead the company seems to be throwing lots of money and resources at building a truly next-generation banking interface.
First, it innovated in security with its SiteKey program. Recently, they’ve launched added security with SafePass. Instead of typing in your password, potentially revealing it to malicious persons, BOA text messages you a temporary password to use to log in. This looks like a 21st-century equivalent to the old key fobs people had to carry around and click when they wanted to type in a password to a highly-secure area, except better since you can use your own cellular phone normally.
In terms of banking, they offers checking, savings, and business accounts. CD’s, and now stock investment options, IRA’s, and mutual funds. They now have a sophisticated, granularly-controlled alert system, and free online BillPay for automatic payments. I can send money to other Bank of America accounts, even recurring payments, easily at no charge. Sending money to other banks is only slightly harder. They released a new mobile banking interface that let’s you do everything from your cell phone. The site is now fast, secure, easy to use, and I love it.
Finally, my favorite new feature, My Portfolio. It does everything Mint claimed to do and more, but it does so correctly. Moreover, it’s probably more secure. This feature is powered by Yodlee, which is also used by Microsoft Money, ETrade, and many other major companies. They have to be secure.
The features of My Portfolio are extensive. I set it up to automatically update my transactions from ING, Scottrade, my other Bank of America accounts, and American Express. It even let me add my investment in Nexus Capital as a custom account. Bank of America correctly categorizes most expenses automatically, and I can set up rules easily if it doesn’t. The categories are clear and make sense. Simple, beautiful, and clear, the charts actually help me understand my expenses:

Among other charts and views, it shows me a high-level overview of my net worth and investments:

What I like best about BOA is that it constantly impoves its site. The past two years have shown me massive improvements. I do not know what to expect over the next couple of years. I do know that Mint.com still offers no new features since I tried it a few months ago. Their team is small, and they must worry about scaling more than offering useful new features. Bank of America has proven that they are fully committed to offering me more services through the website for free, and I trust they will continue to do that. I can hardly wait to see what new features the bank will be integrating next. 21st century banking is just around the corner.
Have a Happy New Year
In high school, there was a friend of mine who would send out this very cheery holiday email every year. I remember I loved to receive this little card from her. I also remember how I love to receive little warm random greetings from strangers. When I got the idea to send out a holiday greeting to my friends, to see how they are doing, I thought about it more. What if I could send out the holiday cheer to more people? So, I looked online and figured how to use the princeton.edu main site to reach out to a lot of my fellow Princetonians. I crafted a very brief message, and I attached a link to a surprising and cute little YouTube clip. Then, I made a program to send out the emails on New Year’s.
I expected to receive replies from my friends, so I could reply back. They did, of course, and I’m happy to catch up with them. However, I also received hundreds and hundreds of replies from my other fellow tigers, strangers. I didn’t expect replies, but I’m glad some did. Every reply was positive, some very positive:
Thanks! That video was really cool. Happy New Year to you too!
Sweet! I appreciate the holiday cheer!
hahaha, thanks man
Happy New Year to you too! nice video, the cat looks a bit like mine !
Each one brought a big smile to my face. Most people appreciated the video and understood that I was just a fellow tiger sending a random warm greeting. But, I also received a few dozen replies asking, basically, “who is this?” I realized I left my message too brief; I didn’t explain clearly the scope and purpose. For example,
I think maybe you sent your new years wishes to the wrong person? But this video is amazing all the same. Especially that he lets his cat knock over the first domino. 
I replied individually apologizing for my mistake and hoping it didn’t cause any them trouble. I don’t want confusion, I want smiles . Some of the re-replies really got me,
Well that’s awesome–I like to receive random little greetings as well so I appreciate it I hope you had a fantastic break and uhhhh….now it’s time to get back to work!!
and especially,
In that case thank u so much, u did brighten my day!
So overall, I’m really glad I sent this out. There was actually, however, exactly one negative response from one guy. He used the f-word in a short angry message, concerned about spamming. I thought about his perspective, and I understood where he was coming from. I replied, and so did he, and in the end he calmly showed himself to be a good concerned guy. He just wanted to make sure his and others’ Princeton e-mails stayed Princeton-related. I was surprised, but I can see why he might get annoyed by the message. I understand where he’s coming from. Because of his reaction, I will not do this again. I’m not in the business of causing even a tiny bit of pain to one person even if it brings a lot of smiles to more people. There are other ways to spread cheer.
He also said that a few people took it negatively and were negatively talking on some listservs about it. There was one other re-reply where the person mentioned at first thinking the message was “sketchy” (women aren’t usually called sketchy, if I happened to be a woman, would these same people react in the same way? interesting sociological question…). I think that’s because I wasn’t clear in the message that I was sending it to many of my fellow tigers, both friends and strangers. Again, unfortunately, far too curt a message.
I hope that those who initially took it negatively, I hope they eventually see my intention, reread the warm greeting, smile, and have a wonderful 2008.
|
|
Books
E-mail
My Amazon WishlistFavorite Posts
YCombinator Application Guide
Telecommunications
Font Comic: Attempt #1
Returns year 2
Why Plant Rights?
Popular Posts
Capturing frames from a webcam on Linux
Capturing frames from a webcam on Linux
Capturing frames from a webcam on Linux
Capturing frames from a webcam on Linux
Capturing frames from a webcam on Linux
Capturing frames from a webcam on Linux
Capturing frames from a webcam on Linux
Capturing frames from a webcam on Linux
Capturing frames from a webcam on Linux
Capturing frames from a webcam on Linux
Capturing frames from a webcam on Linux
Capturing frames from a webcam on Linux
How to Ace an IQ Test
A Clean Python Shell Script
Learn 100 digits of pi at lightning speed
BankOfAmerica.com > Mint.com
Recent Posts
Apple's amazing customer support system
Poem #0
Hot Stock Tip #0
Labmeeting rocks
Log Reader 3000
A Clean Python Shell Script
Recent Comments
Andres Garcia:
<p>Hi, im looking for “capturing images using Python under windows”, where can i fi...
Andres Garcia:
<p>Hi, im looking for “capturing images using Python under windows”, where can i fi...
Andres Garcia:
<p>Hi, im looking for “capturing images using Python under windows”, where can i fi...
Andres Garcia:
<p>Hi, im looking for “capturing images using Python under windows”, where can i fi...
Andres Garcia:
<p>Hi, im looking for “capturing images using Python under windows”, where can i fi...
Andres Garcia:
<p>Hi, im looking for “capturing images using Python under windows”, where can i fi...
Categories
Follow
|
Re:As a former Digital UNIX admin… (Score:5, Funny)