<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8916545447803472659</id><updated>2011-11-27T15:15:05.348-08:00</updated><category term='dontstealthis'/><category term='logging'/><category term='happs'/><category term='dataflow'/><category term='cryptography'/><category term='emacs'/><category term='text editors'/><category term='sysadmin'/><category term='funny'/><category term='default keybindings'/><category term='english'/><category term='organization'/><category term='security'/><category term='programming'/><category term='short'/><category term='hashes'/><category term='ssh'/><category term='sunk costs'/><category term='hash functions'/><category term='prices'/><category term='philosophy'/><category term='bash'/><category term='debate'/><category term='ideas'/><category term='hoarding'/><category term='grammar'/><category term='economics'/><category term='housing'/><category term='clutter'/><category term='web-apps'/><category term='git'/><category term='telephony'/><category term='steve jobs'/><category term='languages'/><category term='internet'/><category term='project management'/><category term='code'/><category term='mashup'/><category term='maps'/><category term='dilemmas'/><category term='bureaucracy'/><category term='drugs'/><category term='medicine'/><category term='logical fallacies'/><category term='google'/><category term='notes'/><title type='text'>Illicit Technology</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>32</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-372709538308775617</id><published>2009-01-04T02:26:00.000-08:00</published><updated>2009-01-04T02:43:29.079-08:00</updated><title type='text'>Pretty (or ugly, depending on your outlook) pictures of the current state of unemployment in the US</title><content type='html'>&lt;p&gt;Combined 3-colors: Lighter is higher unemployment (i.e. dark is good) Red is change, Green is current, Blue is old:&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kGioHHKLi7M/SWCPCRy0THI/AAAAAAAAAA4/wmMm0MWhgC4/s1600-h/color.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 253px;" src="http://4.bp.blogspot.com/_kGioHHKLi7M/SWCPCRy0THI/AAAAAAAAAA4/wmMm0MWhgC4/s400/color.png" alt="" id="BLOGGER_PHOTO_ID_5287383231832018034" border="0" /&gt;&lt;/a&gt;&lt;p&gt;Old (lighter = worse):&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kGioHHKLi7M/SWCPXg-efyI/AAAAAAAAABQ/RP_axh7WSq8/s1600-h/old.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 253px;" src="http://3.bp.blogspot.com/_kGioHHKLi7M/SWCPXg-efyI/AAAAAAAAABQ/RP_axh7WSq8/s400/old.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5287383596684705570" /&gt;&lt;/a&gt;&lt;p&gt;Change (lighter = worse):&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kGioHHKLi7M/SWCPXAvFLTI/AAAAAAAAABI/H-iTm6y2fnY/s1600-h/change.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 253px;" src="http://4.bp.blogspot.com/_kGioHHKLi7M/SWCPXAvFLTI/AAAAAAAAABI/H-iTm6y2fnY/s400/change.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5287383588030197042" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Now (lighter = worse, and note Michegan and Rhode Island are light enough they have to be bordered to be visible):&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kGioHHKLi7M/SWCPYCKHwLI/AAAAAAAAABY/uTC45V_VxMM/s1600-h/total.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 253px;" src="http://2.bp.blogspot.com/_kGioHHKLi7M/SWCPYCKHwLI/AAAAAAAAABY/uTC45V_VxMM/s400/total.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5287383605591916722" /&gt;&lt;/a&gt;&lt;p&gt;Data from &lt;a href="http://www.bls.gov/web/laumstch.htm"&gt;Bureau of Labor Statistics&lt;/a&gt;, blank map from &lt;a href="http://commons.wikimedia.org/wiki/File:Blank_US_Map.svg"&gt;Wikimedia Commons - Blank US Map.svg&lt;/a&gt;, shading/edits by &lt;a href="http://www.jaggederest.com/"&gt;Justin George&lt;/a&gt;(me). Images &lt;a href="http://commons.wikimedia.org/wiki/Commons:GNU_Free_Documentation_License"&gt;GFDL licensed&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-372709538308775617?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/372709538308775617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=372709538308775617' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/372709538308775617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/372709538308775617'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2009/01/pretty-or-ugly-depending-on-your.html' title='Pretty (or ugly, depending on your outlook) pictures of the current state of unemployment in the US'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kGioHHKLi7M/SWCPCRy0THI/AAAAAAAAAA4/wmMm0MWhgC4/s72-c/color.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-669795978278407216</id><published>2008-07-23T23:26:00.001-07:00</published><updated>2008-07-23T23:27:11.782-07:00</updated><title type='text'>Amusing side effects of popular culture</title><content type='html'>As a result of Dark Knight, I'm now getting 40-50 hits a day to my personal site, featuring the joker cheesehead down on the left side there.&lt;br /&gt;&lt;br /&gt;I was very confused as I watched the traffic spike, then I realized the movie came out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-669795978278407216?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/669795978278407216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=669795978278407216' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/669795978278407216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/669795978278407216'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2008/07/amusing-side-effects-of-popular-culture.html' title='Amusing side effects of popular culture'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-1823256536516400368</id><published>2008-07-22T10:23:00.001-07:00</published><updated>2008-07-22T10:24:31.953-07:00</updated><title type='text'>Real-life Superpowers, part 1</title><content type='html'>Horses store up to 50% of their red blood cells and can release them during endurance running. Self-doping, with the larger hearts needed to deal with the thicker blood that results.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-1823256536516400368?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/1823256536516400368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=1823256536516400368' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/1823256536516400368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/1823256536516400368'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2008/07/real-life-superpowers-part-1.html' title='Real-life Superpowers, part 1'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-3116373389322145514</id><published>2008-07-18T01:05:00.000-07:00</published><updated>2008-07-18T01:06:22.135-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='notes'/><category scheme='http://www.blogger.com/atom/ns#' term='telephony'/><category scheme='http://www.blogger.com/atom/ns#' term='logging'/><title type='text'>Ubiquitous call recording, finally.</title><content type='html'>https://www.speechtrack.com&lt;br /&gt;&lt;br /&gt;I've been wanting a service like this for as long as I can remember. Now they just need to offer inbound phone numbers that auto-record, and maybe a transcription service or speech-to-text.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-3116373389322145514?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/3116373389322145514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=3116373389322145514' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/3116373389322145514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/3116373389322145514'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2008/07/ubiquitous-call-recording-finally.html' title='Ubiquitous call recording, finally.'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-1071903267570512120</id><published>2008-06-28T01:17:00.000-07:00</published><updated>2008-06-28T01:41:15.577-07:00</updated><title type='text'>Git tricks I've been using a lot</title><content type='html'>&lt;ul&gt;&lt;li&gt;&lt;h3&gt;&lt;code&gt;git add --patch&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;Incredibly helpful for splitting up your patches into atomic commits.&lt;/p&gt;&lt;p&gt; I use this like mad when I've made a few different types of changes between committing. &lt;small&gt;(e.g. I find something that needs refactoring in the middle of adding a feature)&lt;/small&gt;&lt;/p&gt;&lt;p&gt;For hairier tasks, don't forget it's older brother, &lt;code&gt;git add --interactive&lt;/code&gt;, which launches a file manager shell with more options and better status info&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h3&gt;&lt;code&gt;git stash apply&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;Git stash is a wonderful thing, but people often don't realize that the stash is a stack, not just a single object.&lt;/p&gt;&lt;p&gt;Using apply with an optional ref argument, you can pop things off the stack that date from before the most recent stash.&lt;/p&gt;&lt;p&gt; I use this as a whole project undo/redo for things not worth creating a branch for&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h3&gt;&lt;code&gt;git rebase --interactive&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;Oh the power. If you pass the right revisions into git rebase --interactive, you can essentially go back and edit every single commit made in the repo.&lt;/p&gt;&lt;p&gt; For extra fun, try nonlinear editing or cross-branch interactive rebasing.&lt;/p&gt;&lt;p&gt;My primary use for this is to squash commits into useful units of functionality, particularly when updating a production branch or the equivalent.&lt;/p&gt;&lt;p&gt;Caution: if you're publishing your changes to other people, using this can really piss them off. You can also drastically break your repo, so make sure you know what you're doing, or try it on a fresh clone&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h3&gt;&lt;code&gt;git checkout -b branch_name remote/branch&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;This is an interesting trick: you can create a local branch named something different than a remote branch, and set it to track the remote. Makes git pull work without having to specify a remote and branch to merge.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h3&gt;&lt;code&gt;git diff -Sstr&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;This lets you pull out a change that relates to the string. If you want to see whole patches, play with &lt;code&gt;--pickaxe-all&lt;/code&gt;, and for POSIX regex support use &lt;code&gt;--pickaxe-regex&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Useful if you ever want to see who's using that bad idiom that you want to crush out of existence, or if you need to go back and find a chunk of lost code.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-1071903267570512120?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/1071903267570512120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=1071903267570512120' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/1071903267570512120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/1071903267570512120'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2008/06/git-tricks-ive-been-using-lot.html' title='Git tricks I&apos;ve been using a lot'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-4769332950861764841</id><published>2008-06-05T12:35:00.000-07:00</published><updated>2008-06-05T12:42:54.134-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cryptography'/><category scheme='http://www.blogger.com/atom/ns#' term='sysadmin'/><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><title type='text'>Why you should always use SSH keys, not passwords</title><content type='html'>There are three main reasons for using SSH keys over passwords:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;h2&gt;Security&lt;/h2&gt;&lt;p&gt;Since SSH keys are stored on your computer and never go over the wire, they are inherently more secure than passwords. Even if you pick a terrible passphrase for your SSH keys (or none at all), an attacker still has to get ahold of that key &lt;span style="font-size: small"&gt;(barring someone patching your random number generator to return one of 2^10 numbers...)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h2&gt;Segmentation&lt;/h2&gt;&lt;p&gt;With passwords, if everyone needs access to an account on one of your servers, then everyone has to know the same password. If one of your coworkers goes insane, you have to change the password (and probably a lot more than one) whereas with SSH keys, you just remove their key from the authorized_keys file and they're gone, nobody else has to worry about it.&lt;/p&gt;&lt;p&gt;Similarly, if people need access to some accounts and not others, you can segment access with keys much more easily than with passwords&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h2&gt;Speed&lt;/h2&gt;&lt;p&gt;Entering passwords gets old really quick. With the superb ssh-agent in use, you shouldn't ever have to do that, and as long as you remember to lock your computer when you leave it, you're as secure as if you were typing your password in every time&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-4769332950861764841?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/4769332950861764841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=4769332950861764841' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/4769332950861764841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/4769332950861764841'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2008/06/why-you-should-always-use-ssh-keys-not.html' title='Why you should always use SSH keys, not passwords'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-6944112351229144049</id><published>2008-05-28T23:19:00.000-07:00</published><updated>2008-05-29T00:19:49.202-07:00</updated><title type='text'>Recommendation Letter redux: how to write a letter of recommendation for a friend</title><content type='html'>&lt;p&gt;Since I wrote this short joking post about &lt;a href="http://illicittech.blogspot.com/2007/08/from-friends-recommendation-letter.html"&gt;faux pas in a friend's recommendation letter&lt;/a&gt;, I've been getting people asking me how to write a good recommendation letter.&lt;/p&gt;&lt;p&gt;For posterity and the Internet, here you go:&lt;/p&gt;&lt;div&gt;&lt;h2&gt;Content:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;h3&gt;Above all, be professional.&lt;/h3&gt;&lt;p&gt;Remember, your friend / colleague / student is submitting this for something that is very important to them. Probably the most important part is making sure that it reads like something you'd submit to a scholarly journal, not something you'd comment on their myspace page with.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h3&gt;Be real.&lt;/h3&gt;&lt;p&gt;Talk about them as you know them: write about the qualities they've shown through the experiences you've had with them. Don't fluff, bullshit, or otherwise go further than your experiences can warrant.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h3&gt;Advocate&lt;/h3&gt;&lt;p&gt;Remember, they're trying to get something from someone with this. That job, college admission, or grad school means a lot to your friend, and you have the ability to directly affect their chances. On the other hand, don't advocate so much that you're written off as a cheerleader.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h3&gt;Be specific&lt;/h3&gt;&lt;p&gt;If prompts are provided, make sure you nail every one of them. If they aren't, think about what you'd want in someone working or studying with you, and nail those points. Particularly, make sure you talk about communication skills, work ethic, and creativity, since those are pretty universally applicable.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h3&gt;Don't just talk about the good things&lt;/h3&gt;&lt;p&gt;Make sure you discuss ways in which they're not perfect. Talk about how they worked on their problems, how they changed for the better, and how they overcame obstacles.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h3&gt;Get other eyes on it&lt;/h3&gt;&lt;p&gt;Before you send that make-or-break document off, have other people read it and give you feedback. A fresh set of eyes can catch possibly credibility-damaging errors before you have to apologize for them.&lt;/p&gt;&lt;p&gt;In a pinch, drop me (&lt;a href="mailto:justin.george@gmail.com?subject=Recommendation Letter Review"&gt;Justin George&lt;/a&gt;) a note and I'll do a brain-dead check on it for you.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;h2&gt;Style:&lt;/h2&gt;&lt;p&gt;Stylistically, there are a couple things you want to make sure you do:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;h3&gt;Succinctness&lt;/h3&gt;&lt;p&gt;Write in short, complete paragraphs, and make sure each one has a topic. Limit yourself to a few sentences for each, and keep it punchy.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h3&gt;Length&lt;/h3&gt;&lt;p&gt;Take the space you need, but don't be verbose. Imagine yourself in the shoes of the reviewer: you don't want to waste time, neither do they. I usually suggest that people aim for a page, two or three if you've known them for a long time or in multiple roles.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h3&gt;Quality&lt;/h3&gt;&lt;p&gt;Sign it with real pen, on real paper, and mail it to them. People are silly creatures, and an authentic signature on good stationery will make it clear that you mean it.&lt;/p&gt;&lt;p&gt;You do have good stationery, don't you? Everyone should have a few sheets of quality personal stationery for just such an occasion. Rag paper with a heavy feel shows you care enough to spend money on the people you're writing &lt;em&gt;to&lt;/em&gt;, as well as the person you're writing &lt;em&gt;for&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;These are, generally, the same rules you should follow for all good writing. In fact, you'd do well to follow them for all official correspondence, including admissions letters and particularly thank-you letters.&lt;/p&gt;&lt;p&gt;If you're the one &lt;em&gt;getting&lt;/em&gt; a recommendation, remember that it takes a &lt;em&gt;lot&lt;/em&gt; of time and effort to write a really stellar one, so make sure you write them two letters: One to ask for a recommendation letter (Even if you're asking for a recommendation letter in person, it's a nice touch to follow up) and a second as a thank-you letter (both on real paper, following the rules above) and &lt;em&gt;mean it&lt;/em&gt;. It will make you memorable in the future, and that can mean jobs, referrals, and other benefits, as well as a lasting friendship.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-6944112351229144049?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/6944112351229144049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=6944112351229144049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/6944112351229144049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/6944112351229144049'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2008/05/recommendation-letter-redux-how-to.html' title='Recommendation Letter redux: how to write a letter of recommendation for a friend'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-2307909104927032184</id><published>2008-05-24T23:00:00.000-07:00</published><updated>2008-05-25T09:32:06.203-07:00</updated><title type='text'>Bouncy visitors</title><content type='html'>&lt;a href="http://www.jaggederest.com"&gt;&lt;img src="http://img406.imageshack.us/img406/1940/37022789ue3.png" alt="Ouch! That's a low bounce rate!"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Most simple websites and blogs have a really high bounce rate. Mine hovers around 95%.&lt;br /&gt;&lt;br /&gt;So we lost 95% of the folks in the first three words of that sentence. Ouch.&lt;br /&gt;&lt;br /&gt;Thus, you need to make the first words of the page good ones. One of the Portland bloggers I know just swapped out his &lt;del&gt;Wordpress&lt;/del&gt; [Edit: Blogger! my bad.] default title text with a custom image and cut his bounce rate to one-tenth what it was.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.agoodhusband.net/"&gt;&lt;img src="http://img149.imageshack.us/img149/4300/goodhusbandheader251508vt0.jpg" alt="The blog header in question"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So, that being said:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If you have a site, think about the first thing people see.&lt;/li&gt;&lt;li&gt;I'm going to go get myself a custom header&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-2307909104927032184?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/2307909104927032184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=2307909104927032184' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/2307909104927032184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/2307909104927032184'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2008/05/bouncy-visitors.html' title='Bouncy visitors'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-2335397294243779610</id><published>2008-04-15T10:23:00.001-07:00</published><updated>2008-04-15T10:31:06.405-07:00</updated><title type='text'>Migraine treatment tips</title><content type='html'>&lt;p&gt;So I've learned (possibly more than I ever wanted to know) about migraines lately. Here's some tips if you're getting them:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Everyone is different, so this list isn't anywhere near definitive.&lt;/li&gt;&lt;li&gt;Nasal sprays don't work.&lt;/li&gt;&lt;li&gt;Neither do (normal) antidepressants. e.g. Prozac, Zoloft, Celexa, etc&lt;/li&gt;&lt;li&gt;Opiates (vicodin, percocet, oxycontin, etc) don't work. But they do make you &lt;em&gt;not care&lt;/em&gt; which can be your last option at times.&lt;/li&gt;&lt;li&gt;Maxalt (rizatriptan) is pretty effective and works quickly. Maybe 3/4 of the time it can kill a migraine.&lt;/li&gt;&lt;li&gt;Supplements apparently &lt;em&gt;can&lt;/em&gt; help prevent migraines. If you're getting more than eight a month, try petadolex / butterbur, riboflavin, coenzyme Q, or magnesium. Petadolex is sold in approximately the right doses (usually with riboflavin). Riboflavin you want 200mg/day twice a day. Ditto Coenzyme Q. Magnesium I'm not as clear what works.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-2335397294243779610?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/2335397294243779610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=2335397294243779610' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/2335397294243779610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/2335397294243779610'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2008/04/migraine-treatment-tips.html' title='Migraine treatment tips'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-5833901010502679356</id><published>2008-04-13T01:11:00.000-07:00</published><updated>2008-04-14T10:20:49.250-07:00</updated><title type='text'>Efficiency vs Efficacy</title><content type='html'>&lt;ul&gt;&lt;li&gt;&lt;h2&gt;Efficiency&lt;/h2&gt;&lt;p&gt;Efficiency is &lt;em&gt;lack of waste&lt;/em&gt;. In some cases, it can mean "lack of waste of money" or "lack of waste of energy".&lt;/p&gt;&lt;p&gt;Example: You're selling widgets, and you want to make the most money possible. This is an efficiency goal. Widget production cost = waste + materials + labor.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h2&gt;Efficacy&lt;/h2&gt;&lt;p&gt;Efficacy is &lt;em&gt;effectiveness&lt;/em&gt;. It can mean "level of coverage" or "level of positive outcome".&lt;/p&gt;&lt;p&gt;Example: You're making a vaccine, and you want to make sure everyone gets it. Price is no longer particularly important, only the level of coverage. This is an efficacy goal. &lt;code&gt;Number of people dead = ((people in population) / (people covered))^2&lt;/code&gt; &lt;small&gt;(since transmission is reduced, it's square-law-type)&lt;/small&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;For example, you want these to be efficient:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Tax collection&lt;/li&gt;&lt;li&gt;Luxury good distribution&lt;/li&gt;&lt;li&gt;Financial services&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;You want these to be efficacious:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Medical care&lt;/li&gt;&lt;li&gt;Car safety&lt;/li&gt;&lt;li&gt;Welfare services&lt;/li&gt;&lt;li&gt;Fire and police services&lt;/li&gt;&lt;li&gt;Education&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-5833901010502679356?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/5833901010502679356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=5833901010502679356' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/5833901010502679356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/5833901010502679356'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2008/04/efficiency-vs-efficacy.html' title='Efficiency vs Efficacy'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-103166734207138847</id><published>2008-04-10T00:39:00.000-07:00</published><updated>2008-04-10T20:32:49.723-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dataflow'/><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='housing'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='prices'/><category scheme='http://www.blogger.com/atom/ns#' term='mashup'/><title type='text'>Yahoo Pipes (Dataflow programming, but don't call it that!)</title><content type='html'>Pretty interesting stuff. If you've ever worked with &lt;a href="http://www.ni.com/labview/"&gt;LabView&lt;/a&gt; or &lt;a href="http://www.vvvv.org/"&gt;VVVV&lt;/a&gt; &lt;small&gt;(Windows-only, but a toolkit that deserves many posts of its own)&lt;/small&gt;, you know how nifty dataflow programming can be.&lt;br /&gt;&lt;br /&gt;I've just started playing around with Yahoo Pipes, late to the party again by about a year, and it's pretty interesting stuff.&lt;br /&gt;&lt;br /&gt;As an example, I improved the Craigslist / Zillow mashup that was already on there to do multisegmented feeds (since craigslist limits you to 25 per feed) and to add query, min/max price, and county indicators, since I was interested in those as well.&lt;br /&gt;&lt;br /&gt;Right now, it's pretty useful for comparing the real value of houses with the listings on Craigslist. If it's significantly different, be on the lookout for a bargain or a ripoff, or at least ask why it's different &lt;small&gt;(remodels often mess up Zestimates)&lt;/small&gt;.&lt;br /&gt;&lt;br /&gt;Here's the link: &lt;a href="http://pipes.yahoo.com/jaggederest/clpricecheckv2"&gt;Craigslist / Zillow mashup version 2&lt;/a&gt; ( http://pipes.yahoo.com/jaggederest/clpricecheckv2 )&lt;br /&gt;&lt;br /&gt;It's pretty typical of dataflow: It's easy to toss things together, but to really get into it you need to build new components, and apparently the only way to do that is via importing pipes, which is nice, but doesn't let me build 'if' statements as I'd like.&lt;br /&gt;&lt;br /&gt;As a side note, dataflow is one of the other ways to achieve low-cost parallelism, and one that's often overlooked, I think. People concentrate on actor-model or locks far too often.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-103166734207138847?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/103166734207138847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=103166734207138847' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/103166734207138847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/103166734207138847'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2008/04/yahoo-pipes-dataflow-programming-but.html' title='Yahoo Pipes (Dataflow programming, but don&apos;t call it that!)'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-2118202874155375203</id><published>2008-04-08T21:55:00.000-07:00</published><updated>2008-04-09T12:45:15.689-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='organization'/><category scheme='http://www.blogger.com/atom/ns#' term='hoarding'/><category scheme='http://www.blogger.com/atom/ns#' term='clutter'/><title type='text'>Tendency to Hoard stuff? A plan for piles.</title><content type='html'>I know I tend to pack-rat things. I often find it difficult to clear things up or clean an area out, even when I know most of the stuff in it is junk, or even just something I won't need right away.&lt;br /&gt;Here's my method:&lt;ol&gt;&lt;li&gt; &lt;h3&gt;Clear it all out.&lt;/h3&gt;  &lt;p&gt;It doesn't matter if it goes in a big pile in the middle of the room, just get it out of there. Put it someplace you can't stop until you're done.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;h3&gt;Sort them out by quality or usefulness&lt;/h3&gt;  &lt;p&gt;Ambiguous, yes, but it's really up to the person doing the sorting. Whatever criteria you use to decide whether to keep things when it's one-by-one, use it here, to group things into a set of piles.&lt;/p&gt;  &lt;p&gt;I usually use at least five. The goal is to have &lt;em&gt;equal sized&lt;/em&gt; piles. &lt;small&gt;(If you've heard of the bond market, they call this 'tranches', say AAA, AA, A, B, C, etc)&lt;/small&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;h3&gt;Put the first pile back&lt;/h3&gt;  &lt;p&gt;Take the pile that is the top shelf stuff, and put it back where you started from. Make it nice, neat, and clean (good time to get dirt off, while it's empty).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;h3&gt;Assess the situation&lt;/h3&gt;  &lt;p&gt;Don't worry about all the other piles, just honestly assess the situation. Is the space clean? Is it clear? Does it have all the things you'd commonly use there?&lt;/p&gt;  &lt;p&gt;Sometimes with this part, it helps to get an outside opinion. Have someone you trust tell you whether it looks good, is cluttered, or is empty. If it's cluttered, split the pile.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;h3&gt;If it needs &lt;em&gt;more&lt;/em&gt;, go to step 3.&lt;/h3&gt;  &lt;p&gt;Say you're organizing your drawing desk. Are all your favorite pastels still sitting behind you? Maybe you still need that ruler or the pens that haven't made it in yet. Time to go back, get another pile (the next-best one) and put it away as well.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;h3&gt;Clean up the other piles&lt;/h3&gt;  &lt;p&gt;Here's the fun part: By process of elimination, you've just decide what to store/give away/recycle without ever having to agonize over your favorite pincushion. You can trick yourself into realizing that you don't need so much stuff.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;h3&gt;You're done.&lt;/h3&gt;  &lt;p&gt;You've just reclaimed usable space, and, if you're like me, given away quite a bit to charity, which can take a nice bite out of your tax liabilities.&lt;/p&gt;&lt;p&gt;Do this often enough, you'll realize how many of the things you thought were 'vital' to have out are really once-a-month or once-a-year items, too.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-2118202874155375203?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/2118202874155375203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=2118202874155375203' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/2118202874155375203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/2118202874155375203'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2008/04/tendency-to-hoard-stuff-plan-for-piles.html' title='Tendency to Hoard stuff? A plan for piles.'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-1635893632154949530</id><published>2008-02-25T15:03:00.000-08:00</published><updated>2008-02-25T19:18:54.109-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Git is amazing</title><content type='html'>So, today, I'm working on a project, I've got it all mocked out with some sample forms and some throwaway objects to play with.&lt;br /&gt;&lt;br /&gt;I realize 'Hey, I need an authorization/authentication system', so I have a dilemma.&lt;br /&gt;&lt;br /&gt;On the one hand, my code is throwaway that I plan to evolve to fit what I end up actually doing with it long term.&lt;br /&gt;&lt;br /&gt;On the other hand, I really don't want to have to redo it later, since I'll probably want to come back here after I build out the auth/auth system.&lt;br /&gt;&lt;br /&gt;Git to the rescue.&lt;br /&gt;&lt;br /&gt;I've been doing all my development on the 'experimental' branch locally, as one ought to do.&lt;br /&gt;&lt;br /&gt;git commit -m 'End of tinkering, time to get serious'&lt;br /&gt;&lt;br /&gt;git checkout master #Back to the beginning, &lt;br /&gt;#or you can use git checkout HEAD~x where x is how many commits you want to go back&lt;br /&gt;&lt;br /&gt;#create the new branch and check it out&lt;br /&gt;#equivalent of git branch restful_auth; git checkout restful_auth&lt;br /&gt;git checkout -b restful_auth #which is a wonderful plugin, btw&lt;br /&gt;&lt;br /&gt;# do your install here...&lt;br /&gt;&lt;br /&gt;git commit -m 'All restful, now lets go back to the other'&lt;br /&gt;&lt;br /&gt;git checkout experimental&lt;br /&gt;&lt;br /&gt;git rebase restful_auth&lt;br /&gt;&lt;br /&gt;# fix the conflicts, I had three&lt;br /&gt;&lt;br /&gt;And you're done. You just saved yourself a couple hours of rewriting throw-away bits of your app. And of course, this is completely doable with pretty much any type of edit. You can go back into the past and effectively 'redo it right' without having to worry about the time it takes up front.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-1635893632154949530?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/1635893632154949530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=1635893632154949530' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/1635893632154949530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/1635893632154949530'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2008/02/git-is-amazing.html' title='Git is amazing'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-2063630507913660853</id><published>2008-01-17T23:25:00.001-08:00</published><updated>2008-06-28T01:16:40.658-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='medicine'/><title type='text'>Ibuprofen, Naproxsyn/Naproxsen, and Aspirin: Don't overdo it.</title><content type='html'>My girlfriend just got out of the hospital after having a bleeding ulcer as a result of taking ibuprofen, among other stressors.&lt;br /&gt;&lt;br /&gt;Just a heads up, any of you who read this, go easy on the ibuprofen, because the effects can be &lt;i&gt;very bad&lt;/i&gt; if you are unlucky, and it is surprisingly common.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-2063630507913660853?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/2063630507913660853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=2063630507913660853' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/2063630507913660853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/2063630507913660853'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2008/01/ibuprofen-naproxsyn-and-aspirin-dont.html' title='Ibuprofen, Naproxsyn/Naproxsen, and Aspirin: Don&apos;t overdo it.'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-280642384743042915</id><published>2008-01-11T02:55:00.000-08:00</published><updated>2008-01-11T03:29:43.547-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dontstealthis'/><category scheme='http://www.blogger.com/atom/ns#' term='ideas'/><category scheme='http://www.blogger.com/atom/ns#' term='short'/><title type='text'>multiurl</title><content type='html'>like tinyurl but with multiple pages. Pop page with previews, ask users if they want to open all, one, some, or play slideshow-style in frame?&lt;br /&gt;&lt;br /&gt;Perhaps a bookmarklet interface, along the standard HTML paste-in-urls.&lt;br /&gt;&lt;br /&gt;Edit: Already exists, &lt;a href="http://www.manyurl.com/"&gt;ManyURL&lt;/a&gt;, works nice from what I see. Could use a bit more, though! Too simple, not complicated enough.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-280642384743042915?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/280642384743042915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=280642384743042915' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/280642384743042915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/280642384743042915'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2008/01/multiurl.html' title='multiurl'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-8802027414402188901</id><published>2007-12-14T00:09:00.000-08:00</published><updated>2008-01-28T11:15:32.852-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hash functions'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='hashes'/><title type='text'>When you're serving static files...</title><content type='html'>Never link http://yoursite.com/foo/bar/x to: &lt;br /&gt;&lt;br /&gt;A) plain http://static.yoursite.com/foo_bar_x.ext&lt;br /&gt;&lt;br /&gt;B) Never use plain hashes of the ID. e.g. .../hash_of_id_here.ext&lt;br /&gt;&lt;br /&gt;C) Borderline, but even static salts are bad: .../hash_of_id_plus_'foobar'_here.ext&lt;br /&gt;&lt;br /&gt;Basic is, use a variable salt for every item. It can ever be public info, like the title, creation time, or anything that varies sufficiently per-item. That's the beauty of salts.&lt;br /&gt;&lt;br /&gt;Or, alternatively, as better people than I have mentioned, use bcrypt with a set difficulty value, and all your rainbow table type fears go away.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-8802027414402188901?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/8802027414402188901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=8802027414402188901' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/8802027414402188901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/8802027414402188901'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2007/12/when-youre-serving-static-files.html' title='When you&apos;re serving static files...'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-8766157482833302939</id><published>2007-10-18T17:17:00.000-07:00</published><updated>2007-10-18T17:21:20.611-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='default keybindings'/><category scheme='http://www.blogger.com/atom/ns#' term='text editors'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Emacs...</title><content type='html'>Biggest reason to switch to emacs I've found so far is that the commands work by default in bash, too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-8766157482833302939?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/8766157482833302939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=8766157482833302939' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/8766157482833302939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/8766157482833302939'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2007/10/emacs.html' title='Emacs...'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-8133903431606571640</id><published>2007-09-07T11:31:00.000-07:00</published><updated>2007-09-07T11:41:31.478-07:00</updated><title type='text'>Code on the Road: Navigating The Minefield that is Visual Source Safe</title><content type='html'>&lt;a href="http://www.expatsoftware.com/articles/2007/09/minefield-that-is-visual-source-safe.html"&gt;Code on the Road: Navigating The Minefield that is Visual Source Safe&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Such a no-brainer. Why do you even try VSS to begin with? Get the Subversion plugin, grab SVN, and 99% of these things go away.&lt;br /&gt;&lt;br /&gt;If that's not enough, &lt;a href="http://git.or.cz/"&gt;git&lt;/a&gt;, &lt;a href="http://darcs.net/"&gt;darcs&lt;/a&gt;, &lt;a href="http://bazaar-vcs.org/"&gt;bzr&lt;/a&gt;, and &lt;a href="http://www.selenic.com/mercurial/wiki/"&gt;mercurial&lt;/a&gt; provide reasonable distributed solutions. Miles ahead of VSS (Actually, three generations, but who's counting.)&lt;br /&gt;&lt;br /&gt;Seems to me, if you're really running an 'ex-pat' office, you'd want distributed. That way you can all trade changes around without having to fight conflicts. Best part is, you can stage to production without branch/tag.&lt;br /&gt;&lt;br /&gt;Basically, there's no excuse these days for using an old VCS. Or, dare I say, a Microsoft VCS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-8133903431606571640?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/8133903431606571640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=8133903431606571640' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/8133903431606571640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/8133903431606571640'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2007/09/code-on-road-navigating-minefield-that.html' title='Code on the Road: Navigating The Minefield that is Visual Source Safe'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-3709633262627991630</id><published>2007-09-06T15:55:00.001-07:00</published><updated>2007-09-06T22:55:39.151-07:00</updated><title type='text'>On convergent evolution, and the invocation of holy wars.</title><content type='html'>Python and Ruby are the same thing.&lt;br /&gt;&lt;br /&gt;There, with that out of the way, let me explain myself.&lt;br /&gt;&lt;br /&gt;I was looking at &lt;a href="http://blog.eikke.com/index.php/ikke/2007/09/02/seam_carving_content_aware_image_resizin"&gt;a post about scene carving image retargeting&lt;/a&gt; which thoughtfully includes a link to &lt;a href="http://git.nicolast.be/?p=scarving.git;a=summary"&gt;his python implementation of scene carving&lt;/a&gt; all nicely packaged into git.&lt;br /&gt;&lt;br /&gt;So I grabbed it, used emacs to import it into a new file, and started converting it to Ruby, since that's the language which is hitting my happy button right now (&lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt; is for when I want to hurt myself). (NB said conversion I plan to post here, or at least, link to SVN for it.)&lt;br /&gt;&lt;br /&gt;Take a look at an excerpt:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;class CostMatrix(ndarray):&lt;br /&gt;        def calculate(self, energy_map):&lt;br /&gt;                if not energy_map.shape == self.shape:&lt;br /&gt;                        raise Exception, "Wrong shape"&lt;br /&gt;                (h, w) = self.shape&lt;br /&gt;                self[0] = energy_map[0].copy()&lt;br /&gt;                self[0] = self[0]&lt;br /&gt;                for y in range(1, h):&lt;br /&gt;                        for x in range(0, w):&lt;br /&gt;                                bestcost = inf&lt;br /&gt;                                bestx = x&lt;br /&gt;                                for dx in range(x - 1, x + 2):&lt;br /&gt;                                        if dx &gt;= 0 and dx &lt; w:&lt;br /&gt;                                                if self[y - 1, dx] &lt; bestcost:&lt;br /&gt;                                                        bestcost = self[y - 1, dx]&lt;br /&gt;                                                        bestx = dx&lt;br /&gt;                                self[y, x] = self[y - 1, bestx] + energy_map[y, x]&lt;br /&gt;                self._calculated = True&lt;br /&gt;&lt;br /&gt;        def _get_max_index(self, row, startcol = 0):&lt;br /&gt;                maxx = startcol&lt;br /&gt;                maxval = self[row, maxx]&lt;br /&gt;                &lt;br /&gt;                for x in range(0, len(self[row])):&lt;br /&gt;                        if self[row, x] &gt; maxval:&lt;br /&gt;                                maxx = x&lt;br /&gt;                                maxval = self[row, x]&lt;br /&gt;&lt;br /&gt;                return maxx&lt;br /&gt;&lt;br /&gt;        def find_shortest_path(self):&lt;br /&gt;                (h, w) = self.shape&lt;br /&gt;                &lt;br /&gt;                x = self._get_max_index(-1)&lt;br /&gt;                path = [x]&lt;br /&gt;                for y in range(h - 2, -1, -1):&lt;br /&gt;                        bestcost = inf&lt;br /&gt;                        for dx in range(x - 1, x + 2):&lt;br /&gt;                                if dx &gt;= 0 and dx &lt; w:&lt;br /&gt;                                        if self[y, dx] &lt; bestcost:&lt;br /&gt;                                                bestcost = self[y, dx]&lt;br /&gt;                                                x = dx&lt;br /&gt;                        path.append(x)&lt;br /&gt;&lt;br /&gt;                path.reverse()&lt;br /&gt;                return path&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        def get_image(self):&lt;br /&gt;                scaling = 0.03&lt;br /&gt;                (h, w) = self.shape&lt;br /&gt;                im = Image.new("L", (w, h))&lt;br /&gt;                im.putdata(self.flatten() * scaling)&lt;br /&gt;                return im&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Now, if you're a python person, that should be fine. But what if you're a ruby person? That looks like ruby, where someone added in a lot of colons, and didn't remember their end tags. Oh, and someone's using paretheses oddly.&lt;br /&gt;&lt;br /&gt;So, having converted those things, I'm confronted with a syntactically valid chunk of ruby code. It no longer throws parse errors.&lt;br /&gt;&lt;br /&gt;This is pretty mindblowing, to me. Maybe it's something that's long since been obvious to the old hands...&lt;br /&gt;&lt;br /&gt;Anyway, this makes me wonder why Python and Ruby aren't implemented on the same core compiler/interpreter. I know Microsoft is doing something akin to this with their &lt;a href="http://en.wikipedia.org/wiki/Dynamic_Language_Runtime"&gt;Dynamic Language Runtime&lt;/a&gt;, but why aren't the &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; people stealing like mad from the &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; people, and vice versa? &lt;br /&gt;&lt;br /&gt;That said, this, to me, is only the midway step between Python and Haskell. Ruby will probably take a week to do anything fun with it, so, much as I might like to throw up a free image resizing service, I'm thinking I'd rather do it in HAppS, where at least it will be fast.&lt;br /&gt;&lt;br /&gt;Any thoughts? Am I an idiot for not seeing this already?&lt;br /&gt;&lt;br /&gt;PS there's also &lt;a href="http://www.thegedanken.com/retarget/"&gt;another implementation of scene carving based resizing&lt;/a&gt; that I've been looking at.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-3709633262627991630?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/3709633262627991630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=3709633262627991630' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/3709633262627991630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/3709633262627991630'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2007/09/on-convergent-evolution-and-invocation.html' title='On convergent evolution, and the invocation of holy wars.'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-1441675745757344335</id><published>2007-08-28T09:55:00.000-07:00</published><updated>2007-08-28T09:59:27.058-07:00</updated><title type='text'>Lunar Eclipse</title><content type='html'>&lt;img src="http://img209.imageshack.us/img209/7582/moonzj4.jpg" border="0" alt="Total Eclipse" title="Partial Eclipse" /&gt;&lt;br /&gt;&lt;img src="http://img515.imageshack.us/img515/7538/totalmc5.jpg" border="0" alt="Total Eclipse" title="Total Eclipse" /&gt;&lt;br /&gt;&lt;br /&gt;Taken last night. If I had a better camera, I'd have taken Mars during the eclipse too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-1441675745757344335?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/1441675745757344335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=1441675745757344335' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/1441675745757344335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/1441675745757344335'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2007/08/lunar-eclipse.html' title='Lunar Eclipse'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-6262371984830564322</id><published>2007-08-10T00:16:00.000-07:00</published><updated>2007-08-10T00:48:17.319-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debate'/><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='internet'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Eliciting rational thought on the internet</title><content type='html'>&lt;span style="font-size:130%;"&gt;Ok, this is very much a work in progress at the moment, I'd appreciate feedback a lot.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'd like to take some time today to write about the way I &lt;a href="http://slashdot.org/~Baddas/"&gt;interact&lt;/a&gt; on &lt;a href="http://news.ycombinator.com/user?id=jaggederest"&gt;the&lt;/a&gt; &lt;a href="http://reddit.com/user/jaggederest"&gt;internet&lt;/a&gt;. I'm doing this partly as a way of clarifying to myself the goals that I'm pursuing. Another part is, when people accuse me of being deliberately obtuse, argumentative, or 'debating unfairly', I can point them here, as not a means of excusing myself, but rather a means of explaining the reasons. Finally, I think the world would be a better place if people examined the way they interact with others more often, so I'd like to be less of a hypocrite by spending some time in the pursuit of that goal.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Firstly, let me lay out my goals:&lt;/span&gt;&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt; Learning.&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;This is always high on the list. Everyone teaches you things.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Teaching others.&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Again, I'm not sure this is as noble as all that, given that most people don't like to be taught a lesson even if it's good for them.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Developing communication skills.&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;This is something that I, as with, I think, most technical people, have problems with.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Getting others to think before they comment.&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;I'd like to see more people think to themselves 'No, that's silly, I shouldn't say that' or 'Hmm, is that really true?' before they spout off about the topic du jour.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;So in pursuit of these, I do a few 'not so nice' things, though I believe, as is the call of petty tyrants throughout the ages, 'the ends justify the means'.&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;Feigned ignorance.&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;This is probably my favorite thing to do. Most people, in the course of explaining what 'everybody knows' will end up realizing that they don't have a firm grasp on the topic at hand. I end up doing more research myself this way...&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Questioning of basis.&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;I've been accused of being a dirty debater for asking people a pretty simple question: "Why do you think that? Do you have any evidence or proof?"  People come up with the most marvelous sources when you ask them this, especially when they're experts in the field.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Employing logical fallacies.&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;This is almost a test: Do you recognize when someone is using these? I wrote about one that always bothers me in &lt;a href="http://illicittech.blogspot.com/2007/05/sunk-cost-fallacy-and-dilemma.html"&gt;Sunk Cost: Fallacy and Dilemma&lt;/a&gt;, but there are &lt;a href="http://en.wikipedia.org/wiki/Category:Logical_fallacies"&gt;many more&lt;/a&gt;. People don't seem to realize that this is one of the key tools of a demagogue. Immunizing people against them should be one of the key tasks of education, but I'm fairly sure my school didn't even mention them once.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Playing Devil's Advocate.&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;This is the classic trick of the &lt;a href="http://www.gnaa.us/"&gt;troll&lt;/a&gt;. Take a deliberately extreme position, and defend it well. In doing so, you're far more likely to solidify people's current beliefs than change minds. In a lively debate, often both sides come away better educated, perhaps having gained a modicum of respect for their opponents. &lt;br /&gt;&lt;br /&gt;(This is one of the key problems with politics now: nobody can put themselves in the other person's shoes, everything is a life or death issue)&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;Anyway, I've got to sleep now, but there it is: When I talk to people on the internet, it's often with goals in mind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-6262371984830564322?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/6262371984830564322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=6262371984830564322' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/6262371984830564322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/6262371984830564322'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2007/08/eliciting-rational-thought-on-internet.html' title='Eliciting rational thought on the internet'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-3870881198449143053</id><published>2007-08-07T18:57:00.000-07:00</published><updated>2008-06-18T17:55:56.700-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grammar'/><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>From a friend's recommendation letter...</title><content type='html'>&lt;h3&gt;New post on this subject: &lt;a href="http://illicittech.blogspot.com/2008/05/recommendation-letter-redux-how-to.html"&gt;How to write a letter of recommendation&lt;/a&gt;&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;I was helping a friend write a recommendation letter and came across these gems:&lt;br /&gt;&lt;br /&gt;- "Self Goal Oriented"&lt;br /&gt;&lt;br /&gt;- "Most plausible vehicle for my goals"&lt;br /&gt;&lt;br /&gt;- "Practice my compassion"&lt;br /&gt;&lt;br /&gt;Yep, lessons in what to avoid when talking to literate people.&lt;br /&gt;&lt;br /&gt;Also, I'm still alive out here and plan to have another post up with real content soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-3870881198449143053?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/3870881198449143053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=3870881198449143053' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/3870881198449143053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/3870881198449143053'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2007/08/from-friends-recommendation-letter.html' title='From a friend&apos;s recommendation letter...'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-7770337815589536243</id><published>2007-06-08T11:45:00.000-07:00</published><updated>2007-06-08T14:00:51.057-07:00</updated><title type='text'>Trendlines and Musings</title><content type='html'>It seems that there have been several general and successive &lt;span style="font-weight: bold;"&gt;trends online&lt;/span&gt; over the last few years, each driving a certain type of success story (and yes, some overlap exists):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Search (Google, Ask.com, Y!, tagging on Flickr, etc)&lt;/li&gt;&lt;li&gt;Share (del.icio.us, Digg, YouTube, Reddit, etc)&lt;/li&gt;&lt;li&gt;Create ... this one is still in its nascent phase, but is cropping up more and more, often in conjunction with the first two&lt;/li&gt;&lt;li&gt;???&lt;/li&gt;&lt;/ol&gt;My lines of inquiry here are: what is the eventual trajectory for the "create" modality, what comes after it, how can these work together, and what technologies/techniques might offer the best fit in pursuing these new projects?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Create&lt;/span&gt;&lt;br /&gt;The creation modality of the net is nothing truly new. We've long seen services that allow users to create and customize their own home pages, and blog services that allow people to post and host their own content.&lt;br /&gt;&lt;br /&gt;This creation trend has been expanding into other areas more recently, pulling more varied media types and methods into the fray. &lt;a href="http://www.deliciousdesigner.com/"&gt;Delicious:designer&lt;/a&gt;, for example, is an intriguing new tool that gives a pretty slick graphic design interface to its users. There have been spin offs of the "picture a day" internet meme that use Flash to pull images directly from connected web cams into the internet application, automating the creation of an image stream. There are similar services available for creating music mashups or playlists to share with friends (both through links and via p2p, but the discussion of technology will come later).&lt;br /&gt;&lt;br /&gt;There have also been some pushes to create services that allow people to create dynamic content, like &lt;a href="http://www.sploder.com/"&gt;web games&lt;/a&gt; and other small apps, all through simple interfaces. I know that HAppS has some interesting potential here, as do things like Flash, Flex and possibly even Laszlo.&lt;br /&gt;&lt;br /&gt;Looking at the progression of create-style web apps, we see a trend of offering more and more control in creating more rich content. The examples that seem to be most successful, in my experience, are those that offer the simplest interfaces, and the simplest hooks to allow people to integrate their creations into the search/share spaces.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Search/Share&lt;/span&gt;&lt;br /&gt;Uptake of content is the name of the game. Anyone can "publish" these days. Getting content online takes about half a moment, and even less thought. Getting that content into the hands/eyes/minds of others is the trick. Getting that same content to your &lt;span style="font-style: italic;"&gt;desired&lt;/span&gt; audience is the holy grail of search/share, and it's why companies have been able to pull in hundreds of millions of dollars in that space.&lt;br /&gt;&lt;br /&gt;As more dynamic content is created, there is more noise added to the search/share channels for those media types. Let's face it - it's not all good content that's being produced. So how do end users find good content - and the converse - how do content producers get their content into the channels that will get to good audiences? Well, most of that discussion is for another time and place, but from a create-mode product view, there are several emerging strategies that seem to be doing well:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the aggregate and vote system (ie, Digg and Reddit) allows a wide pool of users to filter material, giving exposure to a lot of content, but pushing a certain amount to the top&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the "email to share" system allows people to push interesting content directly to their friends (making this *easy* and non-intrusive is key, though)&lt;/li&gt;&lt;li&gt;social network messaging systems allow people to post to a focused group of consumers, who can then propagate the message further through their networks if they find the content appealing&lt;/li&gt;&lt;/ul&gt;There are more methods, to be certain, and it will be interesting to watch them as they continue to evolve.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Technologies/Techniques&lt;br /&gt;&lt;/span&gt;Speed. Simplicity. Engaging.&lt;br /&gt;&lt;br /&gt;These concepts have really been at the forefront of the current trend cycle. Agile development and rapid application development help get things from concept to reality in short, repeatable cycles, allowing things to grow organically and respond to feedback quickly. Simple focus - doing one thing really well - has made the use cases for products really clear. This lets their utility shine through, promotes ease of use, and keeps things focused on what works and what's needed. Finally, keeping people &lt;span style="font-style: italic;"&gt;engaged &lt;/span&gt;has been critical. This is no longer a broadcast world. Commentary, dialogue, edits, versions, iterations - these all form the critical feedback that keeps the system evolving.&lt;br /&gt;&lt;br /&gt;The tool sets and technologies that really respond to these things have definitely seen a lot of attention in recent years. Agile has taken off like a rocket. Rails has been going gangbusters, maturing by leaps and bounds. Languages with high ability for concurrent execution have been getting more attention. Tool sets that allow for mixed online/offline utility have been popping up like mushrooms.&lt;br /&gt;&lt;br /&gt;... to be concluded in next post.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-7770337815589536243?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/7770337815589536243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=7770337815589536243' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/7770337815589536243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/7770337815589536243'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2007/06/trendlines-and-musings.html' title='Trendlines and Musings'/><author><name>Rand</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-5486216434907286572</id><published>2007-06-05T22:38:00.000-07:00</published><updated>2007-06-07T11:16:29.908-07:00</updated><title type='text'>Travelling Salesman Problem: Introduction (in Haskell)</title><content type='html'>&lt;a href="http://psychicorigami.com/2007/04/17/tackling-the-travelling-salesman-problem-part-one/"&gt;Here's&lt;/a&gt; the original link.&lt;br /&gt;&lt;br /&gt;The task here is a setup for some stochastic methods of solving the &lt;a href="http://en.wikipedia.org/wiki/Traveling_Salesman_Problem"&gt;Travelling Salesman Problem&lt;/a&gt;. I'm doing it in &lt;a href="http://haskell.org"&gt;Haskell&lt;/a&gt; since my skills here need work.&lt;br /&gt;&lt;br /&gt;basic.lhs:&lt;br /&gt;&lt;br /&gt;Set up a coordinate string. These are the cities in our routes.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt; coordinates :: [(Float,Float)]&lt;br /&gt;&gt; coordinates = [(0,1),(1,2),(2,3),(2,4),(0,6)]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is a simple function that takes two 'cities' and returns the floating-point distance between them using the &lt;a href="http://en.wikipedia.org/wiki/Pythagorean_Theorem"&gt;Pythagorean Theorem&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt; distance :: (Float, Float) -&gt; (Float, Float) -&gt; Float&lt;br /&gt;&gt; distance (x1,y1) (x2,y2) = sqrt ((x1-x2)^2 + (y1-y2)^2)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This allows us to determine the actual length of a list of cities ('tour'). Note that it's not circular, unlike in the linked article. &lt;br /&gt;&lt;br /&gt;The 'let' statement looks up the city in question from the list above and inserts it into an equivalent list.&lt;br /&gt;&lt;br /&gt;zipWith is like map, except it takes a two-argument function, and two lists of arguments which are 'zipped' together into a result list.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt; tourLength :: [(Float, Float)] -&gt; [Int] -&gt; Float&lt;br /&gt;&gt; tourLength pairs tour = let coords = map (pairs !!) tour &lt;br /&gt;&gt;                         in sum $ zipWith distance coords (tail coords)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A wrapper, if you'd like to have all tours be circular.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt; tourLength' :: [(Float, Float)] -&gt; [Int] -&gt; Float&lt;br /&gt;&gt; tourLength' pairs tour = tourLength pairs (tour ++ (head tour))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The main testing function, which prints the specified tour's length&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt; main :: IO ()&lt;br /&gt;&gt; main = print $ tourLength' coordinates [2,1,0,3,4]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One thing you'll notice here, is that I'm eliding the matrix calculation in the original source. One of the nice things about Haskell is that a later date, should I choose to do some &lt;a href="http://en.wikipedia.org/wiki/memoization"&gt;memoization&lt;/a&gt;, there's very little work to be done. Only one of these functions would need to change. &lt;br /&gt;&lt;br /&gt;Another nice thing is that if a given pair of cities is not ever used, Haskell (due to it's &lt;a href="http://en.wikipedia.org/wiki/Lazy_evaluation"&gt;laziness&lt;/a&gt;) won't ever bother to actually calculate the value, even if I do go back and add memoization.&lt;br /&gt;&lt;br /&gt;There's more to this, especially the shuffling functions (I'll get to introduce Monads!). That'll have to wait for another day soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-5486216434907286572?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/5486216434907286572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=5486216434907286572' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/5486216434907286572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/5486216434907286572'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2007/06/travelling-salesman-problem.html' title='Travelling Salesman Problem: Introduction (in Haskell)'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-4419416807788184983</id><published>2007-06-04T22:32:00.000-07:00</published><updated>2007-06-04T22:33:45.862-07:00</updated><title type='text'>mimes.</title><content type='html'>&lt;a href="http://www.jaggederest.com/mime.html"&gt;Mime shouldn't be a capital crime. The first time.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-4419416807788184983?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/4419416807788184983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=4419416807788184983' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/4419416807788184983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/4419416807788184983'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2007/06/mimes.html' title='mimes.'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-7886388431469309730</id><published>2007-06-04T00:10:00.000-07:00</published><updated>2007-06-04T00:15:03.276-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><category scheme='http://www.blogger.com/atom/ns#' term='bureaucracy'/><title type='text'>Business metrics</title><content type='html'>A hypothesis for you: it seems that the more time I have to spend killing time via surfing the 'net at work, the shorter the time I can expect to remain employed there.&lt;br /&gt;&lt;br /&gt;Maybe someone should build a small aggregate logging system to determine company health this way...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-7886388431469309730?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/7886388431469309730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=7886388431469309730' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/7886388431469309730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/7886388431469309730'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2007/06/business-metrics.html' title='Business metrics'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-6638800976586078551</id><published>2007-05-30T23:13:00.000-07:00</published><updated>2007-06-04T00:14:31.909-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web-apps'/><category scheme='http://www.blogger.com/atom/ns#' term='happs'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>Alt Framework Hackfest</title><content type='html'>We here at IT appreciate the diversity of web frameworks and methodologies that have arisen or gained popularity over the last few years, and we've had our filthy paws over and into a few of them. Some we like more than others, and some of us are more vocal in our advocacy than others.&lt;br /&gt;&lt;br /&gt;What I'd like to propose to my co-conspirators here is that we have a little hackfest with some of our favorite web frameworks over the next month or two, and see what develops. I'd propose some similar goal to be developed in each framework, but that might be too constricting. I'll let you guys weigh in before we kick it off, just to get consensus, but I'm guessing spinning out a blog in each shouldn't be too hard, and it would allow for embellishment as the frameworks and time allow. &lt;span style="font-style: italic;"&gt;(note, I know we all have crazy schedules right now, which is why I think a month or two sounds good... correct me if I'm wrong)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Frameworks I'd like to see included:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://merb.rubyforge.org/files/README.html"&gt;merb&lt;/a&gt; (with maybe some Rails for support... if required)&lt;/li&gt;&lt;li&gt;&lt;a href="http://happs.org/HAppS/README.html#download"&gt;HAppS&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.seaside.st/"&gt;seaside&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.keplerproject.org/"&gt;kepler&lt;/a&gt;, anyone?&lt;/li&gt;&lt;li&gt;&lt;a href="http://erlang.org/"&gt;erlang&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;I think it would be great to show some of these frameworks side by side, performing similar tasks. Sure, the validity of the comparison would be limited by the scope of the project, but I think it would be nice to see &lt;span style="font-style: italic;"&gt;functional&lt;/span&gt; apps from each, if we're going to keep hearing the same evangelism about Framework X or System Y every damn time I log on.&lt;br /&gt;&lt;br /&gt;Cheers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-6638800976586078551?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/6638800976586078551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=6638800976586078551' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/6638800976586078551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/6638800976586078551'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2007/05/alt-framework-hackfest.html' title='Alt Framework Hackfest'/><author><name>Rand</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-1083098957181892848</id><published>2007-05-30T18:15:00.000-07:00</published><updated>2007-05-30T18:30:00.923-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web-apps'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Google Gears</title><content type='html'>Google is at it again, this time maintaining its position at or ahead of the curve with &lt;a href="http://code.google.com/apis/gears/"&gt;Google Gears&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;What is it? It's the latest in a great trend toward allowing for creating hybrid web apps that can run on- or off-line. Google Gears is by no means first to the party, however. Joyent was out the gates early with &lt;a href="http://joyeur.com/2007/03/22/joyent-slingshot"&gt;Slingshot&lt;/a&gt;, which we had the pleasure of getting a look at up at RailsConf. Adobe is also trying to get in the game (from an admittedly different angle) with its work on &lt;a href="http://labs.adobe.com/technologies/apollo/"&gt;Apollo&lt;/a&gt;. Add in to this mix the browser-as-dev-platform path that &lt;a href="http://wiki.mozilla.org/Firefox3"&gt;Firefox 3&lt;/a&gt; might be taking, and we can see that the world is moving very rapidly toward a synchronizable, online/offline world.&lt;br /&gt;&lt;br /&gt;So why do we care about Google Gears? I'm sorry, that was a stupid question. We care because it's Google, and they have the intellectual resources to really solidly address this path, coupled with their penetration into just about every technological market. Also, they're following the grand tradition of their code projects, and opening a lot of code base for use by developers. The APIs are documented and available, and they're encouraging devs to play with the beta.&lt;br /&gt;&lt;br /&gt;Gears provides the following basics, as quoted from their site:&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://code.google.com/apis/gears/api_localserver.html"&gt;&lt;img src="http://code.google.com/apis/gears/resources/localserver.gif" alt="LocalServer" style="border: medium none ;" height="35" width="43" /&gt;&lt;/a&gt;     &lt;/td&gt;     &lt;td&gt;       &lt;a href="http://code.google.com/apis/gears/api_localserver.html"&gt;LocalServer&lt;/a&gt;&lt;br /&gt;      Cache and serve application resources (HTML, JavaScript, images, etc.) locally     &lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;       &lt;a href="http://code.google.com/apis/gears/api_database.html"&gt;&lt;img src="http://code.google.com/apis/gears/resources/database.gif" alt="Database" style="border: medium none ;" height="35" width="43" /&gt;&lt;/a&gt;     &lt;/td&gt;     &lt;td&gt;       &lt;a href="http://code.google.com/apis/gears/api_database.html"&gt;Database&lt;/a&gt;&lt;br /&gt;      Store data locally in a fully-searchable relational database     &lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;       &lt;a href="http://code.google.com/apis/gears/api_workerpool.html"&gt;&lt;img src="http://code.google.com/apis/gears/resources/workerpool.gif" alt="WorkerPool" style="border: medium none ;" height="35" width="43" /&gt;&lt;/a&gt;     &lt;/td&gt;     &lt;td&gt;       &lt;a href="http://code.google.com/apis/gears/api_workerpool.html"&gt;WorkerPool&lt;/a&gt;&lt;br /&gt;      Make your web applications more responsive by performing resource-intensive operations asynchronously&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;This should be enough for any web app developer to get off the ground and running, building relatively responsive RIAs... on the desktop.&lt;br /&gt;&lt;br /&gt;Ok, enough drooling over docs. I'm going to go dig into it.&lt;br /&gt;&lt;br /&gt;I'll probably post back later with impressions, but feel free to throw your comment in, too. I'd love to see how this is responding with different frameworks and on different platforms.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-1083098957181892848?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/1083098957181892848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=1083098957181892848' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/1083098957181892848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/1083098957181892848'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2007/05/google-gears.html' title='Google Gears'/><author><name>Rand</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-914101063856840686</id><published>2007-05-29T21:17:00.000-07:00</published><updated>2007-05-29T22:00:41.515-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='economics'/><category scheme='http://www.blogger.com/atom/ns#' term='logical fallacies'/><category scheme='http://www.blogger.com/atom/ns#' term='project management'/><category scheme='http://www.blogger.com/atom/ns#' term='sunk costs'/><category scheme='http://www.blogger.com/atom/ns#' term='dilemmas'/><title type='text'>Sunk Cost - Fallacy and Dilemma</title><content type='html'>First of all, I think it's pretty funny that the first substantial post here is me, talking about project management stuff, but it's true.&lt;br /&gt;&lt;br /&gt;On to the good stuff:&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Sunk Costs&lt;/span&gt;&lt;br /&gt;The definition of a sunk cost is simple, but with some subtle points.&lt;br /&gt;&lt;span style="font-size:120;"&gt;Sunk costs are the unrecoverable past costs of an endeavor.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Examples:&lt;br /&gt;Buy a sandwich and eat it. Sunk cost: sandwich price + time spent.&lt;br /&gt;&lt;br /&gt;Buy a book, read it. Sunk cost: Difference between the retail price and the resale price, plus the time spent.&lt;br /&gt;&lt;br /&gt;Now that that is out of the way, we can talk about why they matter.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Sunk Cost Fallacy&lt;/span&gt;&lt;br /&gt;This is the formalization of the old adage about not 'throwing good money after bad'.&lt;br /&gt;&lt;br /&gt;Basically, people have an irrational tendency to count sunk costs when they make a decision. This is pretty obvious to see in the tendency to never quit on a failing project, even if it's the overwhelmingly right thing to do.&lt;br /&gt;&lt;br /&gt;As &lt;a href="http://en.wikipedia.org/wiki/Sunk_cost#Loss_aversion_and_the_sunk_cost_fallacy"&gt;wikipedia&lt;/a&gt; says, you don't see many half finished bridges.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Sunk Cost Dilemma&lt;/span&gt;&lt;br /&gt;Here's the really interesting part: due to sunk costs, always doing the right thing (in a naive setting) can result in failure.&lt;br /&gt;&lt;br /&gt;Say you estimate a time and date for a project, sign the contract, and start work with the expectation of plenty of time and resources.&lt;br /&gt;&lt;br /&gt;Midway through, your star takes sick. You have to decide whether to keep going or pay someone else to finish it. You figure there's still time, so you keep going.&lt;br /&gt;&lt;br /&gt;Now, what's the right choice if you run into another problem? If you look at it naively again, odds are good you'll keep going in hope of that payout, even if you'll lose a little money.&lt;br /&gt;&lt;br /&gt;The right answer to this problem is twofold: First, you assess the likelihood of the outcomes, and secondly, you take into account possible future costs of each outcome.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;Anyway, to relate this back to the realm of technical things, this is one of the foundation principles of Agile/Lean methods: the more risk and the more competitive the market, the shorter your feedback cycles need to be.&lt;br /&gt;&lt;br /&gt;I see this all the time, with feature creep and bloat. Once you build it, it's a sunk cost, whether or not it's at all useful to anyone.&lt;br /&gt;&lt;br /&gt;In many cases, the rational answer to feature creep and bloat is to throw many things out or start over, but people hold on to the existing features because they think the money spent on them will be 'more wasted' if they are removed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-914101063856840686?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/914101063856840686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=914101063856840686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/914101063856840686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/914101063856840686'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2007/05/sunk-cost-fallacy-and-dilemma.html' title='Sunk Cost - Fallacy and Dilemma'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-4039503974676838940</id><published>2007-05-29T00:01:00.000-07:00</published><updated>2007-05-29T22:03:53.225-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='steve jobs'/><category scheme='http://www.blogger.com/atom/ns#' term='drugs'/><title type='text'>Steve Jobs On Web 2.0</title><content type='html'>&lt;a href="http://fakesteve.blogspot.com/2007/05/thoughts-for-holiday-weekend.html"&gt;&lt;span style="font-style: italic;"&gt;Look at all these new companies in the Bay Area, all these supposed “tech” companies. God knows what they do, but it’s all some variation on the same theme and they all have names like Zizzl and Drizzl and Bizzl, so you can’t tell them apart. Can’t these kids think of anything original? Apparently not. My theory is it’s because they’ve never used psychedelics.&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-4039503974676838940?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/4039503974676838940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=4039503974676838940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/4039503974676838940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/4039503974676838940'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2007/05/steve-jobs-on-web-20.html' title='Steve Jobs On Web 2.0'/><author><name>Giles Bowkett</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_x3wLagbRIiQ/SFLyVL9Mx3I/AAAAAAAAAA0/jfa-iCuEvnI/S220/me+twitter+twitter+twitter.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-7985158388095330595</id><published>2007-05-28T23:12:00.000-07:00</published><updated>2007-05-28T23:17:30.871-07:00</updated><title type='text'>Fried Toast</title><content type='html'>Since the title of the blog is Illicit Technology, I thought I'd give my favorite example of rebel engineering, a spidercar from &lt;a href="http://burningman.com/"&gt;Burning Man&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/or_pS7c3Q_U"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/or_pS7c3Q_U" type="application/x-shockwave-flash" wmode="transparent" height="350" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;I was actually just out of sight when this was shot, off to the right, about where the blog sidebar is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-7985158388095330595?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/7985158388095330595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=7985158388095330595' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/7985158388095330595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/7985158388095330595'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2007/05/fried-toast.html' title='Fried Toast'/><author><name>Giles Bowkett</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_x3wLagbRIiQ/SFLyVL9Mx3I/AAAAAAAAAA0/jfa-iCuEvnI/S220/me+twitter+twitter+twitter.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8916545447803472659.post-7021393093014412135</id><published>2007-05-28T22:57:00.000-07:00</published><updated>2007-05-28T23:00:42.274-07:00</updated><title type='text'>Frist Poast</title><content type='html'>Hi all, first post on the new blog. Hopefully this will be a blog about tech and related idiocies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8916545447803472659-7021393093014412135?l=illicittech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://illicittech.blogspot.com/feeds/7021393093014412135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8916545447803472659&amp;postID=7021393093014412135' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/7021393093014412135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8916545447803472659/posts/default/7021393093014412135'/><link rel='alternate' type='text/html' href='http://illicittech.blogspot.com/2007/05/frist-poast.html' title='Frist Poast'/><author><name>Justin George</name><uri>http://www.blogger.com/profile/00841137599327072247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_kGioHHKLi7M/SJJhJ1zmdPI/AAAAAAAAAAM/7PvSohEn3eA/s1600-R/joker-by-namesjames.jpg'/></author><thr:total>0</thr:total></entry></feed>
