<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Evilsoft.org</title>
	<atom:link href="http://www.evilsoft.org/feed" rel="self" type="application/rss+xml" />
	<link>http://www.evilsoft.org</link>
	<description>We&#039;re everywhere....</description>
	<lastBuildDate>Sun, 20 Sep 2015 23:42:44 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.3.1</generator>
	<item>
		<title>I don&#8217;t often chat with AIM bots</title>
		<link>http://www.evilsoft.org/2011/05/12/i-dont-often-chat-with-aim-bots</link>
		<comments>http://www.evilsoft.org/2011/05/12/i-dont-often-chat-with-aim-bots#comments</comments>
		<pubDate>Thu, 12 May 2011 21:28:21 +0000</pubDate>
		<dc:creator><![CDATA[Administrator]]></dc:creator>
				<category><![CDATA[Sarcasm]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.evilsoft.org/?p=315</guid>
		<description><![CDATA[So it happened again today. A totally different aim bot started bothering me to look at it&#8217;s webcam or something or other. My second round with an aim bot took a couple more tries, but in the end, it too ceased conversing with me. Was it something I said? Oh, yes, it was, it was [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.evilsoft.org/wordpress/wp-content/uploads/2011/05/aim_bot.png"><img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2011/05/aim_bot.png" alt="" title="aim_bot" width="400" height="501" class="alignleft size-full wp-image-317" /></a></p>
<p>So it <a href="http://www.evilsoft.org/2011/05/12/little-cheerleader4901-tables">happened again today</a>.  A totally different aim bot started bothering me to look at it&#8217;s webcam or something or other.  My second round with an aim bot took a couple more tries, but in the end, it too ceased conversing with me.  Was it something I said?  Oh, yes, it was, it was <strong>&#8216;) drop table logs; &#8212;</strong>.  Perhaps I need to be a better conversationalist, I keep driving these web cam girls away.</p>
<p>This has me wondering.  Maybe I can create an aim bot honeypot that is actually it&#8217;s own bot, chatting in sql injection.  It&#8217;s a thought&#8230;.</p>
<div id="attachment_316" style="width: 494px" class="wp-caption alignleft"><a href="http://www.evilsoft.org/wordpress/wp-content/uploads/2011/05/xocheeroxchicox4.png"><img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2011/05/xocheeroxchicox4.png" alt="" title="xocheeroxchicox4" width="484" height="775" class="size-full wp-image-316" /></a><p class="wp-caption-text">Oops, I did it again</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.evilsoft.org/2011/05/12/i-dont-often-chat-with-aim-bots/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Little cheerleader4901 tables</title>
		<link>http://www.evilsoft.org/2011/05/12/little-cheerleader4901-tables</link>
		<comments>http://www.evilsoft.org/2011/05/12/little-cheerleader4901-tables#comments</comments>
		<pubDate>Thu, 12 May 2011 15:22:19 +0000</pubDate>
		<dc:creator><![CDATA[Administrator]]></dc:creator>
				<category><![CDATA[Sarcasm]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.evilsoft.org/?p=304</guid>
		<description><![CDATA[So I&#8217;m sure many of you have experienced the flood of bots on AIM that are trying to phish or convince you to go to this or that porn site. Well, I believe that for now there is at least one less phishbot riding the tubes. After one started pestering me today, I gave a [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>So I&#8217;m sure many of you have experienced the flood of bots on AIM that are trying to phish or convince you to go to this or that porn site.  Well, I believe that for now there is at least one less phishbot riding the tubes.</p>
<p>After one started pestering me today, I gave a shot at the <a href="http://xkcd.com/327/">little bobby tables</a> technique (sql injection).  It started to reply immediately and then just kind of sat there.  I&#8217;ve even tried a few more normal responses, and it just doesn&#8217;t seem like it wants to talk to me anymore.  How sad.</p>
<div id="attachment_309" style="width: 547px" class="wp-caption alignleft"><a href="http://www.evilsoft.org/wordpress/wp-content/uploads/2011/05/little_cheerleader4901_tables_2.png"><img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2011/05/little_cheerleader4901_tables_2.png" alt="" title="little cheerleader4901 tables" width="537" height="290" class="size-full wp-image-309" /></a><p class="wp-caption-text">Cat got your tongue?</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.evilsoft.org/2011/05/12/little-cheerleader4901-tables/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hacking the Nook Color: Notes</title>
		<link>http://www.evilsoft.org/2011/01/19/hacking-the-nook-color-notes</link>
		<comments>http://www.evilsoft.org/2011/01/19/hacking-the-nook-color-notes#comments</comments>
		<pubDate>Wed, 19 Jan 2011 22:36:51 +0000</pubDate>
		<dc:creator><![CDATA[Administrator]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.evilsoft.org/?p=276</guid>
		<description><![CDATA[I recently purchased a Nook Color with the full intention of rooting it for use as an android tablet. This post logs my experiences so that other people who face some of the same problems I did have to do a little less leg work. So far I&#8217;m very happy with the device, and aside [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I recently purchased a Nook Color with the full intention of rooting it for use as an android tablet.  This post logs my experiences so that other people who face some of the same problems I did have to do a little less leg work.  So far I&#8217;m very happy with the device, and aside from a few interface foibles based around the lack of buttons I find it to be equal to and in some cases surpassing the Samsung Galaxy Tab (we have some at the office, so I can do a direct comparison).  As time goes on, I&#8217;ll continue to edit this post as I figure out new things, or old issues in here cease to make sense.<br />
<a href="http://www.galaxytabwallpaper.com/view/android-eating-apple"><img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2011/01/android_eating_apple_small.png" alt="Android Eating An Apple" title="Android Eating An Apple" width="280" height="296" class="alignright size-full wp-image-286" /></a><br />
<span id="more-276"></span></p>
<h2>Hacking</h2>
<p>I followed the <a href="http://nookdevs.com/NookColor_Rooting">instructions listed at the nookdevs site</a>.  I have a few minor notes about the process.</p>
<ul>
<li>In step 1, I highly recommend just doing the B&#038;N <a href="http://www.barnesandnoble.com/u/nookcolor-support-software-update/379002520/?cds2Pid=35758">1.0.1 upgrade</a> first then rooting.</li>
<li>Once the nook rebooted, it caused the windows 7 box it was attached to blue screen (Guess this is what I get for using windows from time to time, back to Ubuntu).  For about a week after the rooting, any time I would connect the nook up to my laptop it would immediately blue screen.  I&#8217;m frankly not sure what I did to resolve this, but the problem has gone away.  I did follow <a href="http://www.petri.co.il/removing-old-drivers-from-vista-and-windows7.htm">these instructions on how to remove old device drivers</a>, but only go so far as enabling myself to view hidden devices before it stopped causing the crash.  ¯\(°_o)/¯</li>
<li>After the rooting, the nook asked me to put in my gmail account.  No matter what I did with my account (I tried changing the password, etc), it would not let me connect it.  So I created a new gmail account from the screen and that worked fine.  Immediately afterwords I added my gmail account and it added no problem.  So it&#8217;s only the onboarding screen that gave me trouble.  Following this, all the apps and such on my real account transferred over, so we&#8217;ll just call this a minor hiccup.  Probably this is just my failure to follow the instructions under Enable Market.</li>
<li>Install Root Explorer.  You&#8217;ll find you&#8217;ll need it for a number of other steps, and it really is worth it to make those steps faster.</li>
<li><a href="http://forum.xda-developers.com/showthread.php?t=910008">Get ADB working</a>.</li>
</ul>
<h2>Usability</h2>
<p><b>Hardware</b></p>
<ul>
<li>Wifi turns off whenever the screen does.  I tried <a href="http://forum.androidcentral.com/barnes-noble-nook-color/52190-how-work-arounds-issues-stock-nook-color-rom.html">on solution (under #1)</a> of downloading Spare Parts and setting wifi sleep policy to never, but that only seems to make it that wifi stays on when plugged in.</li>
<li>B&#038;N kept the nook on some pretty conservative settings for CPU scaling.  <a href="http://forum.androidcentral.com/barnes-noble-nook-color/52190-how-work-arounds-issues-stock-nook-color-rom.html">try setting the scaling to some better defaults (under #10)</a></li>
<li>You can also <a href="http://forum.xda-developers.com/showthread.php?t=908515">overclock the processor</a>.  I have not done this (yet) but when I do I&#8217;ll post the speed I was able to get mine up to.</li>
<li>There are some applications that are installed by default and are even running that are of no use on this device.  Specifically the phone.  Remove the apps, and word on the street is that it expands the <a href="http://forum.androidcentral.com/barnes-noble-nook-color/52190-how-work-arounds-issues-stock-nook-color-rom.html">battery life (under #11)</a>.</li>
<li>The nook has a special charging cable, and it will only tell you that it is charging when using that cable.  That being said, plugging it in via usb with a standard micro usb cable does in fact charge the nook.  It just won&#8217;t /say/ it&#8217;s being charged.</li>
</ul>
<p><b>Launcher</b></p>
<ul>
<li>Without the normal buttons, most software doesn&#8217;t work well on the nook. The rooted setup comes with a pieces of software called softkeys to resolve this.  You should follow the instructions for <a href="http://nookdevs.com/NookColor_Default_Launcher">setting softkeys as your default launcher</a>.  After you have that working, I highly recommend swapping it out for Button Savior, as I found it to be a much more usable piece of software.</li>
<li>Install Home Switcher from the market as this is a great way to switch out your default launcher.</li>
<li>Launcher Pro was my first choice for a launcher for the nook.  It had a few minor issues like the set of buttons at the bottom are not particularly useful given that they are designed for a phone.  I switched to Zeam which makes swapping the bottom buttons out trivial.  It also feels a lot more responsive.</li>
<li>Softkeys/Button Savior is a good quick way to get moving, but to make the nook into a more usable tablet I really recommend you <a href="http://forum.androidcentral.com/barnes-noble-nook-color/52190-how-work-arounds-issues-stock-nook-color-rom.html">remap the volume keys (under #7)</a> to back and menu.  You can put volume in the task bar.  How often do you really need to change the volume and not have access to the task bar anyway?</li>
<li>I didn&#8217;t really care for the nook lock screen, so I used WidgetLocker.  Here are some notes <a href="http://forum.androidcentral.com/barnes-noble-nook-color/52190-how-work-arounds-issues-stock-nook-color-rom.html">(under #9)</a></li>
</ul>
<p><b>Environment</b></p>
<ul>
<li>Some people are bothered that stuff on the screen is really small.  Personally I prefer it as it gives me more screen real estate if everything stays small.  But, if you want to fatten things up a bit you can by changing the <a href="http://forum.androidcentral.com/barnes-noble-nook-color/52190-how-work-arounds-issues-stock-nook-color-rom.html">LCD Density (under #6)</a>.</li>
<li>So the default wallpaper really doesn&#8217;t fit the device anymore. You can pick up the original <a href="http://galaxytabwallpapers.net/original-galaxy-tab/">Galaxy Tab wallpapers</a> as well as a bunch more <a href="http://www.galaxytabwallpaper.com/">here</a> and <a href="http://galaxytabwallpapers.net/">here</a>.
</ul>
<h2>Software</h2>
<p>Most software has worked fine, some of it is terrible.  I&#8217;ll summarize the software that I have tried, focusing on stuff I have paid for so others can have a good idea if their favorite apps work or not before they take the plunge (assuming of course that they care about any of the same software that I do).<br />
<b>Applications</b></p>
<p>Almost all applications have worked fine.  I&#8217;ll only keep notes on those that had any issues.  Here&#8217;s a short list of apps that are known working: Adobe Reader, Advanced Task Manager, Aldiko Premium, Dropbox, Gmail, Google Maps, Home Switcher, IM+ Pro, Kindle, Mozilla Firefox, RealCalc Scientific Calculator, Repligo Reader, Todo.txt touch</p>
<dl>
<dt>Market</dt>
<dd>I upgraded to the 2.2 market.  I basically followed the <a href="http://nookdevs.com/Market_Update_2.2">nook devs approach</a> but synced it to my device via dropbox.</dd>
<dt>LauncherPro (0.8.2)</dt>
<dd>Works, don&#8217;t see a way to get rid of phone button which is worthless.</dd>
<dt>Quadrant</dt>
<dd>Works, Just noting that the nook benchmarks between the Samsung Galaxy S and the Moto Droid X at 944 which makes it the second fastest listed 2.1 device.  It will be interesting to see how fast it is on 2.2 whenever that happens.</dd>
<dt>Swype</dt>
<dd>So far no one has this working.  Frankly, I love swype on my phone but I don&#8217;t feel like the stock keyboard is so bad in the tablet form factor.  Slide It keyboard has been recommended as a replacement.</dd>
</dl>
<p><b>Games</b><br />
More games are broken then applications, but most have worked fine.  I&#8217;ll only keep notes on those that had any issues.  Here&#8217;s a short list of games that are known working: Angry Birds, Archipeligo, Crusade of Destiny, Spira Defence Pro, Tower Raiders GOLD, Void Defence, Wave Defence Pro</p>
<dl>
<dt>Dungeon Defenders (2.0)</dt>
<dd>Initial install worked fine and it downloaded the content, but then it just dropped back to the Launcher.  I needed to manually download the content pack from the dungeon defenders site following <a href="http://dungeondefenders.com/androidmobile">these instructions</a>.  I used DD_2.0_Android_PVR.zip.  After this, it worked fine.</dd>
<dt>Retro Defense (1.25)</dt>
<dd>Playable but surrounded by black bars on all sides.  Not recommended.</dd>
<dt>Robo Defense (1.4.1 Build 2071)</dt>
<dd>Unplayable.  Lots of buttons are missing, and it looks terrible, scrunched to the center of the screen.</dd>
<dt>Symbolism (2.1)</dt>
<dd>Surrounded on 3 sides with black bars, feint connection attempt never came back.  Functionally works but looks terrible.</dd>
</dl>
<h2>Misc</h2>
<p>These are a set of notes and pointers that I have found that I didn&#8217;t really care much about, but since I did the leg work they may be of use to you.</p>
<ul>
<li>I restored and re-rooted, now I can&#8217;t log in to my B&#038;N account <a href="http://forum.androidcentral.com/barnes-noble-nook-color/52190-how-work-arounds-issues-stock-nook-color-rom.html">(under #2)</a></li>
<li>Copy and Paste doesn&#8217;t work <a href="http://forum.androidcentral.com/barnes-noble-nook-color/52190-how-work-arounds-issues-stock-nook-color-rom.html">(under #5)</a></li>
<li>How to make your own wallpapers <a href="http://forum.androidcentral.com/barnes-noble-nook-color/52190-how-work-arounds-issues-stock-nook-color-rom.html">(under #8)</a></li>
<li>How to fix live wallpapers <a href="http://forum.androidcentral.com/barnes-noble-nook-color/52190-how-work-arounds-issues-stock-nook-color-rom.html">(under #12)</a></li>
<li>How to import your google contacts <a href="http://forum.androidcentral.com/barnes-noble-nook-color/52190-how-work-arounds-issues-stock-nook-color-rom.html">(under #13)</a></li>
</ul>
<p><H2>History</H2></p>
<ul>
<li>2011/01/24 &#8211; Removed recommendation for Launcher Pro, added Zeam, removed recommendation for Softkeys added Button Savior.  Cleaned up games section</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.evilsoft.org/2011/01/19/hacking-the-nook-color-notes/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Inside Hypocrisy</title>
		<link>http://www.evilsoft.org/2010/09/03/inside-hypocrisy</link>
		<comments>http://www.evilsoft.org/2010/09/03/inside-hypocrisy#comments</comments>
		<pubDate>Fri, 03 Sep 2010 20:06:52 +0000</pubDate>
		<dc:creator><![CDATA[Administrator]]></dc:creator>
				<category><![CDATA[Sarcasm]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.evilsoft.org/?p=267</guid>
		<description><![CDATA[Yesterday, Consumer Watchdog launched it&#8217;s Inside Google campaign with a daemonizing video of Google Eric Schmidt suggesting that he&#8217;s secretly and evilly trying to find people&#8217;s deepest, darkest secrets. This over the top video has him giving children full body scans and telling them about their parents doing things like surfing Porn and getting in [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Yesterday, <a href="http://bits.blogs.nytimes.com/2010/09/02/consumer-watchdog-group-goes-after-google/">Consumer Watchdog launched it&#8217;s Inside Google campaign</a> with a daemonizing video of Google Eric Schmidt suggesting that he&#8217;s secretly and evilly trying to find people&#8217;s deepest, darkest secrets.  This over the top video has him giving children full body scans and telling them about their parents doing things like surfing Porn and getting in touch with old paramours.  Further, they create a clearly &#8220;evil&#8221; caricature of Schmidt with a big head, beady eyes, arched, villainous eyebrows and an evil laugh, a technique that&#8217;s been tried a few times before I might add.</p>
<p>This is all part of their drive to create a &#8220;Do not track me&#8221; list.  Well, apparently Consumer Watchdog only wants <em>other</em> people to not track you, because the web site hosting their anti-google campaign is using what?  They are using Google Analytics to track visitors:</p>
<div id="attachment_266" style="width: 1090px" class="wp-caption alignleft"><a href="http://www.evilsoft.org/wordpress/wp-content/uploads/2010/09/hypocrite1.png"><img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2010/09/hypocrite2.png" alt="hypocrite2" title="hypocrite2" width="465" height="294" class="alignleft size-full wp-image-271" /></a><p class="wp-caption-text">Do Not Track Me uses Google Analytics</p></div>
<p>This whole argument is hyperbole.  Fundamentally networks track usage, logs are created.  The simple fact is, the vast majority of websites track to do one thing, and one thing only: to be able to tell which of their marketing partners are delivering value, and which ones are not.  No company cares if you are having affairs on the sly or any of the other garbage that this video suggests.  Consumer Watchdog, if you want to be taken seriously, grow up!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evilsoft.org/2010/09/03/inside-hypocrisy/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Why I view ruby as immature</title>
		<link>http://www.evilsoft.org/2010/06/30/why-i-view-ruby-as-immature</link>
		<comments>http://www.evilsoft.org/2010/06/30/why-i-view-ruby-as-immature#comments</comments>
		<pubDate>Wed, 30 Jun 2010 15:54:18 +0000</pubDate>
		<dc:creator><![CDATA[Administrator]]></dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[RoR]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.evilsoft.org/?p=253</guid>
		<description><![CDATA[In 2006 I was introduced to ruby, and for a time I found it to be a fun language to work with. After about 6 months, I started to notice problems and shortcomings in the ruby/rails stack and went on to bigger and better things. The problem is that to this day I have to [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>In 2006 I was introduced to ruby, and for a time I found it to be a fun language to work with.  After about 6 months, I started to notice problems and shortcomings in the ruby/rails stack and went on to bigger and better things.  The problem is that to this day I have to defend myself to legions of ruby/rails faithful who seem to think that it&#8217;s sacrilege to ever leave the faith. (That makes me what, an apostate?)  A friend recently asked on a <a href="http://mail.evilsoft.org/mailman/listinfo/tangent">mailing list I regularly traffic</a> why a person would consider ruby to be flawed.  The best way I can express this is in some code.<br />
<span id="more-253"></span></p>
<p>As a note, this isn&#8217;t about these specific flaws: It&#8217;s that these kinds of flaws are endemic in ruby and particularly rails.</p>
<p><strong>Set Processing</strong><br />
<code><br />
devon@chronos ~/Projects/sets $ cat sets1.rb<br />
#!/usr/bin/env ruby<br />
require 'set'<br />
require 'pp'<br />
large = Set.new(Range.new(1,10000000))<br />
small = Set.new(Range.new(1,10))<br />
pp small.intersection(large)</p>
<p>devon@chronos ~/Projects/sets $ time ./sets1.rb<br />
#&lt;Set: {5, 6, 1, 7, 2, 8, 3, 9, 4, 10}&gt;</p>
<p>real 0m35.421s<br />
user 0m23.900s<br />
sys 0m9.910s<br />
</code></p>
<p><code><br />
devon@chronos ~/Projects/sets $ cat sets2.rb<br />
#!/usr/bin/env ruby<br />
require 'set'<br />
require 'pp'<br />
large = Set.new(Range.new(1,10000000))<br />
small = Set.new(Range.new(1,10))<br />
pp large.intersection(small)</p>
<p>devon@chronos ~/Projects/sets $ time ./sets2.rb<br />
#&lt;Set: {5, 6, 1, 7, 2, 8, 3, 9, 4, 10}%gt;</p>
<p>real 0m16.917s<br />
user 0m12.720s<br />
sys 0m3.430s<br />
</code></p>
<p>So the order that I intersect the sets drastically impacts the speed of the algorithm (2x).  Let&#8217;s take a look at python to see whether a language in the same class behaves similarly.</p>
<p><code><br />
devon@chronos ~/Projects/sets $ cat sets1.py<br />
#!/usr/bin/env python</p>
<p>large = set(range(1,10000000))<br />
small = set(range(1,10))</p>
<p>print large.intersection(small)</p>
<p>devon@chronos ~/Projects/sets $ time ./sets1.py<br />
set([1, 2, 3, 4, 5, 6, 7, 8, 9])</p>
<p>real 0m2.583s<br />
user 0m1.850s<br />
sys 0m0.670s<br />
</code></p>
<p><code><br />
devon@chronos ~/Projects/sets $ cat sets2.py<br />
#!/usr/bin/env python</p>
<p>large = set(range(1,10000000))<br />
small = set(range(1,10))</p>
<p>print large.intersection(small)</p>
<p>devon@chronos ~/Projects/sets $ time ./sets2.py<br />
set([1, 2, 3, 4, 5, 6, 7, 8, 9])</p>
<p>real 0m2.598s<br />
user 0m1.760s<br />
sys 0m0.710s<br />
</code></p>
<p>So no, python handles the choice of which set to intersect with the other gracefully.  This is a good example of how the ruby set api is immature.  I&#8217;m ignoring that it&#8217;s taking between 13.7 and 6.5 times as long to execute, because I think that it&#8217;s reasonable for people to do code in something that is easier for them to work in and then optimize.  My problem here is that based on the direction you do the intersection, it can take 2x longer in ruby.  This is shoddy engineering and is the kind of thing that gets solved in a language as it matures.  The problem is that the language was immature when it exploded into widespread use, and no one seems to be doing anything to make it ready for prime time. </p>
<p>So what about 1.9?  1.9 is supposed to be where the energy is going to make the language faster and more mature.<br />
<code><br />
devon@chronos ~/Projects/sets $ cat sets1.rb<br />
#!/usr/bin/env ruby1.9<br />
require 'set'<br />
require 'pp'<br />
large = Set.new(Range.new(1,10000000))<br />
small = Set.new(Range.new(1,10))<br />
pp small.intersection(large)</p>
<p>devon@chronos ~/Projects/sets $ time ./sets1.rb<br />
#&lt;Set: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}&gt;</p>
<p>real    0m13.310s<br />
user    0m11.240s<br />
sys    0m0.680s<br />
</code></p>
<p><code><br />
devon@chronos ~/Projects/sets $ cat sets2.rb<br />
#!/usr/bin/env ruby1.9<br />
require 'set'<br />
require 'pp'<br />
large = Set.new(Range.new(1,10000000))<br />
small = Set.new(Range.new(1,10))<br />
pp large.intersection(small)</p>
<p>devon@chronos ~/Projects/sets $ time ./sets2.rb<br />
#&lt;Set: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}&gt;</p>
<p>real    0m9.181s<br />
user    0m8.280s<br />
sys    0m0.480s<br />
</code></p>
<p>While it&#8217;s faster (which wasn&#8217;t really my complaint anyway), it still is very different based on which direction you do your intersection from.  I see evidence of speed work being done on ruby, but not on maturing the language so that it meets tried and true engineering principals like the <a href="http://www.faqs.org/docs/artu/ch01s06.html">rule of least surprise.</a>  (Yes, code is a user interface for coders, so the rule of least surprise applies) <strong><em>(1)</em></strong> </p>
<p><strong>Nil as an object</strong><br />
How about this one that has actually done damage to our database:</p>
<p><code><br />
devon@chronos ~/Projects/sets $ irb<br />
irb(main):001:0> nil.id<br />
(irb):1: warning: Object#id will be deprecated; use Object#object_id<br />
=> 4<br />
</code></p>
<p>It certainly explains why we have a bizarrely large number of items in our database with foreign keys set to 4.  This conflicts directly with the rails standard for naming a database primary key as &#8216;id&#8217;, which you assess on a model at obj.id.  Yes, code should have lots of null checks, but real world code has flaws.  Sure it throws a warning, but since it doesn&#8217;t break on nil when you call .id, you get data corruption.  Gee, thanks, ruby.</p>
<p><strong>Ruby in general</strong><br />
These are just a few examples, but ruby is <em>rife</em> with happy path coding.  The language needed another 5 years of development before going into widespread use.  Instead, I think it&#8217;s getting worse because a set of rails engineers who don&#8217;t know anything about languages are at the helm, adding lots of syntactic sugar but with a distinct lack of substance behind that candied shell.</p>
<p><sub><strong><em>1.</em></strong> Perhaps it&#8217;s not fair to compare ruby to the unix philosophy, because the ruby design philosophy violates the 17 rules in ways that are clearly intentional.  Specifically, ruby and rails egregiously violate the rules of clarity and transparency, and rails in particular violates the rules of separation, composition and representation.</sub></p>
]]></content:encoded>
			<wfw:commentRss>http://www.evilsoft.org/2010/06/30/why-i-view-ruby-as-immature/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Pakistan: Ban this site!</title>
		<link>http://www.evilsoft.org/2010/05/20/pakistan-ban-this-site</link>
		<comments>http://www.evilsoft.org/2010/05/20/pakistan-ban-this-site#comments</comments>
		<pubDate>Thu, 20 May 2010 15:13:11 +0000</pubDate>
		<dc:creator><![CDATA[Administrator]]></dc:creator>
				<category><![CDATA[Musings]]></category>

		<guid isPermaLink="false">http://www.evilsoft.org/?p=245</guid>
		<description><![CDATA[I don&#8217;t normally go political on this site, but this images of the prophet Muhammed thing is just insane. Fist Comedy Central capitulates to censorship, and Flickr follows suit, and now the entirety of facebook and youtube has been banned in Pakistan because of cartoons. Well, I&#8217;m picking my side, standing with free speech and [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I don&#8217;t normally go political on this site, but this images of the prophet Muhammed thing is just insane.  Fist <a href="http://www.outsidethebeltway.com/comedy_central_censored_mohammed_south_park">Comedy Central capitulates to censorship</a>, and <a href="http://flapsblog.com/2006/02/10/muhammad-caricature-watch-internet-t-shirt-vendor-metrospy-profits-from-muhammad-caricature-conflict/">Flickr follows suit</a>, and now the entirety of <a href="http://www.washingtonpost.com/wp-dyn/content/article/2010/05/20/AR2010052002023.html">facebook and youtube</a> has been banned in Pakistan because of cartoons.</p>
<p>Well, I&#8217;m picking my side, standing with free speech and joining <a href="http://www.facebook.com/pages/Everybody-Draw-Mohammed-Day/121369914543425">Everyone Draw Mohammed Day</a>.  Pakistan, I&#8217;m calling your government out.  Ban me.</p>
<p><img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2010/05/muhammad.jpg" alt="Muhammad Caricature" title="Muhammad Caricature" width="320" height="320" class="alignleft size-full wp-image-244" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.evilsoft.org/2010/05/20/pakistan-ban-this-site/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Parallel Manhattan</title>
		<link>http://www.evilsoft.org/2009/11/20/parallel-manhattan</link>
		<comments>http://www.evilsoft.org/2009/11/20/parallel-manhattan#comments</comments>
		<pubDate>Fri, 20 Nov 2009 16:48:21 +0000</pubDate>
		<dc:creator><![CDATA[Administrator]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.evilsoft.org/?p=236</guid>
		<description><![CDATA[I&#8217;ve always been a fan of RPGs, so of course as soon as I got my G1 last year, I started scouring the market for anyone making a good RPG or MMORPG on the phone. Just a bit over a month after the phone came out, Parallel Kingdom was released. The game managed not just [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve always been a fan of RPGs, so of course as soon as I got my G1 last year, I started scouring the market for anyone making a good RPG or MMORPG on the phone.  Just a bit over a month after the phone came out, <a href="http://www.parallelkingdom.com/">Parallel Kingdom</a> was released.  The game managed not just to fill the need of an RPG, but it also managed to hit on one of my other interests: Consensual Reality.  See, the game places you in another reality smack dab on top of the one we are in.  It uses the GPS to position you in the game world based on where you are in the real one.  Personally I expect this to be the first of many realities we layer across the face of the planet, and so I follow the improvements in this game with much excitement, because in many ways they are the first ones to attack solving some of these layered reality problems.</p>
<p>One of the things that this game does is that it lets you create in game territory with real world boundaries.  Since I&#8217;ve been playing it from the start, as soon as they offered the ability to claim territory, I jumped at the chance and started placing flags in lower Manhattan near my office, and some more at my apartment at the time in Brooklyn.  Eventually I merged my two kingdoms, giving me a domain that starts in brooklyn, crosses the east river, covers nearly all of lower Manhattan as far north as 40th st.</p>
<p>Recently they just released a new version of the game that adds a ton of new features, and as a trailer for it, they released this <a href="http://www.youtube.com/watch?v=po0MrvJS1SM">video</a>.  Much to my surprise and pleasure, it shows the rampant growth of territory in the game with lower Manhattan the area in the video.  The video centers on my territory not once, but four separate times.  The coolest part for me is that in game, you can only see things that are very close to you, so this is the first time I have ever had a chance to actually see my whole kingdom all at once.</p>
<p>This is my parallel manhattan in the green:<br />
<img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/11/pk1.png" alt="Kingdom" title="Kingdom" width="628" height="352" class="alignleft size-full wp-image-237" /></p>
<p>This is a much broader view showing much more of the area: (I&#8217;m still the light green in lower manhattan, the top of the screen is south)<br />
<img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/11/pk2.png" alt="Kingdom 2" title="Kingdom 2" width="640" height="352" class="alignleft size-full wp-image-238" /></p>
<p>Now with the new release, the game lets you found cities, and you can only do so where there is a city in real life.  If I can find 2 others who will join me, I fully intend to found Parallel Manhattan.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evilsoft.org/2009/11/20/parallel-manhattan/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Stupid SSH config tricks</title>
		<link>http://www.evilsoft.org/2009/10/23/stupid-ssh-config-tricks</link>
		<comments>http://www.evilsoft.org/2009/10/23/stupid-ssh-config-tricks#comments</comments>
		<pubDate>Fri, 23 Oct 2009 18:03:29 +0000</pubDate>
		<dc:creator><![CDATA[Administrator]]></dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.evilsoft.org/?p=225</guid>
		<description><![CDATA[So I use ssh a lot. And this is one damn powerful little program. I decided to write up a log of some of my favorite ssh tricks. Using ssh as a proxy server (to avoid your company&#8217;s/country&#8217;s anal probeware) SSH has a built in SOCKS proxy that you can use in any program that [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>So I use ssh a lot.  And this is one damn powerful little program.  I decided to write up a log of some of my favorite ssh tricks.</p>
<p><span id="more-225"></span></p>
<p><strong>Using ssh as a proxy server (to avoid your company&#8217;s/country&#8217;s anal probeware)</strong><br />
SSH has a built in SOCKS proxy that you can use in any program that can run over a SOCKS proxy.  This includes Firefox (really, all browsers), Thunderbird, Pidgin/Adium (as well as almost all other IM clients like Google Talk, AIM, etc) and a ton of other networking programs we all use.  Using SSH with the -D flag lets you create a dynamic ssh tunnel that acts as a SOCKS proxy, and sends all your traffic from the endpoint of your ssh connection.</p>
<p>To run ssh as a proxy, you need to run it like this:<br />
<code>ssh -D 127.0.0.1:3128 someserver.com</code></p>
<p>This command says you want to run a dynamic port forward, and it should be available on your local computer on port 3128 (default for SOCKS).  All traffic that runs through this will appear to be coming from someserver.com (where you need to have an ssh account).  Further, all traffic that you send through this tunnel will enter the tunnel without ever leaving your box, travel over that tunnel using ssh&#8217;s crypto, then exit at it&#8217;s endpoint where it can connect to whatever you want it to connect to.  Return traffic follows the same path but in reverse.  This is a great trick not only for avoiding firewalls (so long as your firewall does allow port 22 traffic), but also for surfing the web on any network that you don&#8217;t trust.  Instead you can browse the web/read your email from a server you control and trust by doing all your networking via an encrypted ssh proxy.</p>
<p>To configure Firefox to use this crypted tunnel, click on Edit->Preferences, and select Advanced.  From there, under Connection, click on Settings.  You will want to select Manual proxy configuraion.  Leave everything blank except SOCKS Host: localhost and Port: 3128.  Check SOCKS v5.  If you want to be able to access any resources that are on your local network without using the proxy, enter the local addresses or networks into the No Proxy For: box.</p>
<p><strong>Using a single connection (and only having to enter in the password once)</strong><br />
If you want to be able to make connections to a box, and are sick of typing in the password multiple times for multiple connections, you can use ControlMaster.  This allows you to have multiple ssh terminal sessions shared over one connection.  This means that you only establish one connection, and one consequence of that is you also only need to do auth once when you establish the connection. You can enable this by editing ~/.ssh/config and adding *:</p>
<p><code>Host *<br />
	ControlMaster auto<br />
	ControlPath ~/.ssh/master-%r@%h:%p</code></p>
<p>One nice side effect of this is that you can do an ls ~/.ssh and see exactly which boxes you are connected to presently.</p>
<p><strong>Using multiple ssh keys transparently</strong><br />
When I started at my present job, everyone was using keychain to manage the large number of ssh keys they had to deal with from our various servers.  You don&#8217;t need a key manager to transparently utilize multiple ssh keys. Once again pop open ~/.ssh/config, and now instead of workign with the Host * section, you can create sections for each class of server you access (or individual servers).  If you have multiple ssh keys that need to be used on multiple servers, you can avoid using -i and instead add a section for a class of server, and declare the ssh key inside of that via IdentityFile.  Example:</p>
<p><code>Host *.production.somedomain.com<br />
	IdentityFile ~/.ssh/id_rsa_production</code></p>
<p><code>Host *.staging.somedomain.com<br />
	IdentityFile ~/.ssh/id_rsa_staging</code></p>
<p>Now, whenever you ssh to any box in the staging subdomain, it will use the staging key, and when you ssh to any box in the production subdomain, it will use the production key.</p>
<p><strong>Keepalive</strong><br />
Some firewalls regularly snip idle connections.  If you regularly find ssh sessions that you have left idle for a while to be unresponsive when you come back to them you are suffering from this.  Not only is it irritating to lose your connection, but you may even find the whole terminal unresponsive, forcing you to close the terminal as well.  Well, ssh config has an answer for you for this as well.</p>
<p><code>Host *<br />
	ServerAliveInterval 15</code></p>
<p>ServerAliveInterval is normally off, but when you turn it on, ssh will start sending a packet every n seconds to try to keep the connection open.  Even better, now that it&#8217;s testing, if the connection truly did go away without being closed, SSH will automatically close the session if 3 of these keep alive packets go unresponded to. (you can set that to a different number by setting ServerAliveCountMax).  This means that even when connections get snipped, you won&#8217;t come back to find an unresponsive terminal.  Either the connection will be alive, or the connection will have closed, none of these unresponsive zombie connections.</p>
<p><strong>Defaulting your remote user</strong><br />
Few people are lucky enough to have the same username on all the servers they regularly visit.  Just as you can set the identity file on a per domain basis, you can also set username:</p>
<p><code>Host somedomain.com<br />
	User foo</code></p>
<p><code>Host someotherdimain.com<br />
	User bar</code></p>
<p>Now when you ssh to somedomain.com, unless you specify the username at the prompt (baz@somedomain.com) it will use foo.  This overrides the default of using your logged in username.</p>
<p><strong>Server aliases</strong><br />
Do you have a lot of domains you ssh to that you wish you had shorter names for?  Do you have some things that you ssh only to via IP address?  Both of these can be solved with the HostName directive.  For example, if your gateway accepts ssh traffic, and your internal domain doesn&#8217;t use dns, you can use ssh config to give in an alias for ssh.</p>
<p><code>Host router<br />
	HostName 192.168.1.1</code></p>
<p>Now it&#8217;s as simple as typing <code>ssh router</code> to get to the gateway.  This trick works with ip addresses or dns names.</p>
<p><strong>Executing remote commands with ssh</strong><br />
Sometimes you only need to get a small piece of information from a server, and don&#8217;t want to bother with a full ssh session.  Sometimes you may want to have a process that goes out to a server and runs a command as a part of a bigger script.  Either way, you can use ssh to run individual commands on other boxes, and get the results on stdout and stderr.  Give this a try:</p>
<p><code>devon@chronos ~ $ ssh evilsoft.org "uptime"<br />
 14:00:23 up  7:38,  1 user,  load average: 0.84, 0.34, 0.22<br />
</code></p>
<p><strong>Others</strong><br />
SSH is a powerful toolkit, and I have only scratched the surface of it&#8217;s possibilities.  Spend some time reading <code>man ssh_config</code> and you&#8217;ll be amazed at some of the incredibly cool stuff in there for you to find.<br />
* note, you only need one Host * section in your ssh config.  All the variables I am discussing can be consolidated into one Host * section.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evilsoft.org/2009/10/23/stupid-ssh-config-tricks/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Libertarians are just crazy for firefox (and other observations)</title>
		<link>http://www.evilsoft.org/2009/08/25/libertarians-are-just-crazy-for-firefox-and-other-observations</link>
		<comments>http://www.evilsoft.org/2009/08/25/libertarians-are-just-crazy-for-firefox-and-other-observations#comments</comments>
		<pubDate>Tue, 25 Aug 2009 21:22:18 +0000</pubDate>
		<dc:creator><![CDATA[Administrator]]></dc:creator>
				<category><![CDATA[awesomeaugust]]></category>
		<category><![CDATA[NYCResistor]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.evilsoft.org/?p=151</guid>
		<description><![CDATA[A few weeks ago, a video was passed around our office that was about Google interviewing people in Times Square about what a browser is. The results were fairly appalling. For the most part, people responded with various portal and search web sites instead of something like &#8220;IE&#8221; or &#8220;Firefox&#8221;. This coincided with a conversation [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>A few weeks ago, a video was passed around our office that was about <a href="http://thenextweb.com/2009/06/19/google-asked-people-times-square-browser-responses-shock/">Google interviewing people in Times Square about what a browser is</a>.  The results were fairly appalling.  For the most part, people responded with various portal and search web sites instead of something like &#8220;IE&#8221; or &#8220;Firefox&#8221;.  This coincided with a conversation I was having with someone in which I posited the hypothesis that IE as a browser would bias to the political right, and other browsers (specifically firefox) would bias to the political left.  My reasoning was:</p>
<ol>
<li>Conservatives would be more comfortable with a browser delivered by a major corporation that has faced antitrust charges over that browser then liberals would.</li>
<li>Liberals anecdotally are more prone to counter-cultural choices, and thus would be more likely to seek out an alternative to the default browser.</li>
</ol>
<p>The Google interviews made me realize one other thing.  In testing for this kind of effect, you would need to eliminate people who didn&#8217;t know what a browser was.  Clearly, a person who doesn&#8217;t even know what a browser is is highly unlikely to proactively switch from their system&#8217;s default browser.  Further, if a person&#8217;s political views are correlated at all with their likelihood of understanding what a browser is, not eliminating people who don&#8217;t understand could hide real results.</p>
<p>The company I work for, <a href="http://www.knewton.com">Knewton Inc</a>, is becoming known in certain circles of its clever usage for the vastly underused (IMHO) <a href="https://www.mturk.com/mturk/welcome">Amazon Mechanical Turk</a> service.  When I mentioned my contention to our guy who&#8217;s been pioneering our MTurk usage, Dahn Tamir, he suggested that we build an MTurk task and get some real data to find out whether my hypothesis had any basis in reality. The rest of this post represents my findings.</p>
<p><span id="more-151"></span></p>
<p><strong>The Experiment</strong><br />
We posted the following poll to MTurk, allowing users the ability to do the task only once (making it a lot harder to stuff the ballot box, or, at the very least, require a hell of a lot more effort on the part of the users):</p>
<p><img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/poll.png" alt="The Poll" title="The Poll" width="500" height="436" class="alignleft size-full wp-image-168" /></p>
<p>The options for political affiliation were:</p>
<ul>
<li>Republican</li>
<li>Independant</li>
<li>Democrat</li>
</ul>
<p>The options for political philosophy were:</p>
<ul>
<li>Strongly Liberal</li>
<li>Liberal</li>
<li>Moderately Liberal</li>
<li>Moderate</li>
<li>Moderately Conservative</li>
<li>Conservative</li>
<li>Strongly Conservative</li>
<li>Socialist</li>
<li>Libertarian</li>
</ul>
<p>For the web browser, we considered a person to have passed the test if he or she answered Internet Explorer or Firefox, but no others.  We considered them to have failed if they answered Yahoo, Google or MSN.  It was pointed out that AOL did have a browser that could be reasonably referred to as AOL, so we ignored this field.  Finally, we recorded the workers&#8217; User Agent, letting us see what browser/os they were using.</p>
<p><strong>Raw Results</strong><br />
Observations:</p>
<ul>
<li>Clearly, MTurkers are going to be more likely to know what a browser is, and it shows in the data.  Google found that 8% of people in Times Square knew what a browser was, but 86% of respondents here did.</li>
<li>We appear to have more Democrats/Liberals than Republicans/Conservatives one would expect in the normal population.</li>
<li>I only added Socialist on a lark, and I was pretty amazed to see that it still got 2.24% in a poll of Americans</li>
<li>Firefox polled a lot higher here than one would expect in the wild. This should make it a lot easier to see any effects, along with the high pass rate of the test.</li>
</ul>
<table>
<tr>
<th colspan=2 align='center'>Party Affiliation</th>
</tr>
<tr>
<td valign=top>
<table>
<tr>
<td></td>
<th>Total</th>
<th>%</th>
</tr>
<tr>
<th>Republican</th>
<td>244</td>
<td>23.71%</td>
</tr>
<tr>
<th>Independent</th>
<td>397</td>
<td>38.58%</td>
</tr>
<tr>
<th>Democrat</th>
<td>388</td>
<td>37.71%</td>
</tr>
</table>
</td>
<td valign=top>
<a href="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/affiliation_distribution-150x150.png"><img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/affiliation_distribution.png" alt="Distribution by Party Affiliation" title="Distribution by Party Affiliation" width="239" height="266" class="alignleft size-full wp-image-152" /></a>
</td>
</table>
<table>
<tr>
<th colspan=2 align='center'>Political Philosophy</th>
</tr>
<tr>
<td valign=top>
<table>
<tr>
<td></td>
<th>Total</th>
<th>%</th>
</tr>
<tr>
<th>Strongly Liberal</th>
<td>92</td>
<td>8.94%</td>
</tr>
<tr>
<th>Liberal</th>
<td>188</td>
<td>18.27%</td>
</tr>
<tr>
<th>Moderately Liberal</th>
<td>169</td>
<td>16.42%</td>
</tr>
<tr>
<th>Moderate</th>
<td>197</td>
<td>19.14%</td>
</tr>
<tr>
<th>Moderately Conservative</th>
<td>157</td>
<td>15.26%</td>
</tr>
<tr>
<th>Conservative</th>
<td>105</td>
<td>10.20%</td>
</tr>
<tr>
<th>Strongly Conservative</th>
<td>34</td>
<td>3.30%</td>
</tr>
<tr>
<th>Socialist</th>
<td>23</td>
<td>2.24%</td>
</tr>
<tr>
<th>Libertarian</th>
<td>64</td>
<td>6.22%</td>
</tr>
</table>
</td>
<td valign=top>
<a href="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/philosophy_distribution.png"><img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/philosophy_distribution-300x167.png" alt="Distribution of Political Philosophies" title="Distribution of Political Philosophies" width="300" height="167" class="alignleft size-medium wp-image-158" /></a>
</td>
</table>
<table>
<tr>
<th colspan=2 align='center'>Browsers</th>
</tr>
<tr>
<td valign=top>
<table>
<tr>
<td></td>
<th>Total</th>
<th>%</th>
</tr>
<tr>
<th>Firefox</th>
<td>479</td>
<td>46.55%</td>
</tr>
<tr>
<th>Internet Explorer</th>
<td>439</td>
<td>42.66%</td>
</tr>
<tr>
<th>Safari</th>
<td>63</td>
<td>6.12%</td>
</tr>
<tr>
<th>Chrome</th>
<td>41</td>
<td>3.98%</td>
</tr>
<tr>
<th>Opera</th>
<td>7</td>
<td>0.68%</td>
</tr>
</table>
</td>
<td valign=top>
<a href="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/browser_distribution-150x150.png"><img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/browser_distribution.png" alt="Distribution of Browsers" title="Distribution of Browsers" width="237" height="265" class="alignleft size-full wp-image-156" /></a>
</td>
</table>
<table>
<tr>
<th colspan=2 align='center'>Browser Test Results</th>
</tr>
<tr>
<td valign=top>
<table>
<tr>
<td></td>
<th>Total</th>
<th>%</th>
</tr>
<tr>
<th>Pass</th>
<td>886</td>
<td>86.10%</td>
</tr>
<tr>
<th>Fail</th>
<td>143</td>
<td>13.90%</td>
</tr>
</table>
</td>
<td valign=top>
<a href="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/test_distribution-150x150.png"><img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/test_distribution.png" alt="Distribution of Test Results" title="Distribution of Test Results" width="210" height="265" class="alignleft size-full wp-image-159" /></a>
</td>
</table>
<p><strong>Test Results</strong><br />
Next, after pulling in the raw results, we compared browser, affiliation and philosophy to the test results.</p>
<p>Observations:</p>
<ul>
<li>Unsurprisingly, IE fared better amongst people who failed the test.  Firefox did substantially better amongst people who passed the test. Safari also did better amongst people who passed the test, which was a little surprising, because we expected all default browsers to do better with people who failed.  The sample, however, is small enough that the Safari factor could just be noise.  It has been mentioned that this could have been caused by Safari for windows.  That supposition can potentially be answered in the data.</li>
<li>Democrats did worse on the test, while Republicans and Independents did basically the same.  We see the likely reason why in the political philosophy section. The further left you go, the worse you tend to do on the browser test, until you hit strongly liberal. Strong Liberals reversed the trend entirely and tested better than any other group.</li>
</ul>
<table>
<tr>
<th colspan=2 align='center'>Test Results by Party Affiliation</th>
</tr>
<tr>
<td valign=top>
<table>
<tr>
<td></td>
<th>Pass %</th>
<th>Fail %</th>
</tr>
<tr>
<th>Republican</th>
<td>87.70%</td>
<td>12.30%</td>
</tr>
<tr>
<th>Independent</th>
<td>88.16%</td>
<td>11.84%</td>
</tr>
<tr>
<th>Democrat</th>
<td>82.99%</td>
<td>17.01%</td>
</tr>
</table>
</td>
<td valign=top>
<a href="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/test_result_by_affiliation1-268x300.png"><img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/test_result_by_affiliation1.png" alt="Test Results by Party Affiliation" title="Test Results by Party Affiliation" width="364" height="406" class="alignleft size-full wp-image-191" /></a>
</td>
</table>
<table>
<tr>
<th colspan=2 align='center'>Test Results By Political Philosophy</th>
</tr>
<tr>
<td valign=top>
<table>
<tr>
<td></td>
<th>Pass %</th>
<th>Fail %</th>
</tr>
<tr>
<th>Strongly Liberal</th>
<td>91.30%</td>
<td>8.70%</td>
</tr>
<tr>
<th>Liberal</th>
<td>81.91%</td>
<td>18.09%</td>
</tr>
<tr>
<th>Moderately Liberal</th>
<td>84.62%</td>
<td>15.38%</td>
</tr>
<tr>
<th>Moderate</th>
<td>86.29%</td>
<td>13.71%</td>
</tr>
<tr>
<th>Moderately Conservative</th>
<td>86.62%</td>
<td>13.38%</td>
</tr>
<tr>
<th>Conservative</th>
<td>87.62%</td>
<td>12.38%</td>
</tr>
<tr>
<th>Strongly Conservative</th>
<td>88.24%</td>
<td>11.76%</td>
</tr>
<tr>
<th>Socialist</th>
<td>86.96%</td>
<td>13.04%</td>
</tr>
<tr>
<th>Libertarian</th>
<td>89.06%</td>
<td>10.94%</td>
</tr>
</table>
</td>
<td valign=top>
<a href="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/test_result_by_philosophy1.png"><br />
<img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/test_result_by_philosophy1-300x199.png" alt="Test Results By Political Philosophy" title="Test Results By Political Philosophy" width="300" height="199" class="alignleft size-medium wp-image-192" /></a>
</td>
</table>
<table>
<tr>
<th colspan=2 align='center'>Browser by Test Results</th>
</tr>
<tr>
<td valign=top>
<table>
<tr>
<td></td>
<th>Pass %</th>
<th>Fail %</th>
</tr>
<tr>
<th>Internet Explorer</th>
<td>39.16%</td>
<td>64.34%</td>
</tr>
<tr>
<th>Firefox</th>
<td>49.89%</td>
<td>25.87%</td>
</tr>
<tr>
<th>Safari</th>
<td>6.21%</td>
<td>5.59%</td>
</tr>
<tr>
<th>Chrome</th>
<td>4.06%</td>
<td>3.50%</td>
</tr>
<tr>
<th>Opera</th>
<td>0.68%</td>
<td>0.70%</td>
</tr>
</table>
</td>
<td valign=top>
<a href="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/browser_by_test_result1.png"><img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/browser_by_test_result1-300x237.png" alt="Browser by Test Results" title="Browser by Test Results" width="300" height="237" class="alignleft size-medium wp-image-162" /></a></td>
</table>
<p><strong>Browser choice by political opinion</strong><br />
Here we have the final analysis.  Looking at how browser choice changes across the political spectrum.</p>
<p>Observations:</p>
<ul>
<li>My initial hypothesis appears to be supported by this data set. IE falls off sharply the further left you go on the spectrum from Moderate.  Strong liberals use IE at <strong>half</strong> the rate of strong conservatives.</li>
<li>Both Libertarians and Socialists appear to fit in on the left end of the spectrum at least where browser choice is concerned.  Libertarians appear to loath IE and  are nuts for Firefox. They have the highest Firefox rating of anyone with an astounding 70.18%</li>
<li>Firefox’s fall as you go to the right is less pronounced as IE’s fall as you go to the left. This is probably caused by the generally higher likelyhood of picking Safari as you go leftward.</li>
<li>Opera appears to have its ’stronghold’ with Socialists, who were as likely to pick it as Chrome or Safari.</li>
<li>Libertarians also appear to have an exaggerated preference for Opera, Safari and Chrome. Basically, Libertarians really don’t like IE.</li>
</ul>
<table>
<tr>
<th align='center'>Browser by Party Affiliation</th>
</tr>
<tr>
<td valign=top>
<table>
<tr>
<td></td>
<th>IE %</th>
<th>Firefox %</th>
<th>Safari %</th>
<th>Chrome %</th>
<th>Opera %</th>
</tr>
<tr>
<th>Republican</th>
<td>45.33%</td>
<td>45.79%</td>
<td>5.14%</td>
<td>3.27%</td>
<td>0.47%</td>
</tr>
<tr>
<th>Independent</th>
<td>36.00%</td>
<td>52.86%</td>
<td>6.57%</td>
<td>3.71%</td>
<td>0.86%</td>
</tr>
<tr>
<th>Democrat</th>
<td>38.51%</td>
<td>49.38%</td>
<td>6.52%</td>
<td>4.97%</td>
<td>0.62%</td>
</tr>
</table>
</td>
</tr>
<tr>
<td valign=top>
<img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/browser_by_affiliation.png" alt="Browser By party Affiliation" title="Browser By party Affiliation" width="491" height="365" class="alignleft size-full wp-image-153" />
</td>
</table>
<table>
<tr>
<th align='center'>Browser By Political Philosophy</th>
</tr>
<tr>
<td valign=top>
<table>
<tr>
<td></td>
<th>IE %</th>
<th>Firefox %</th>
<th>Safari %</th>
<th>Chrome %</th>
<th>Opera %</th>
</tr>
<tr>
<th>Strongly Liberal</th>
<td>25.00%</td>
<td>63.10%</td>
<td>8.33%</td>
<td>3.57%</td>
<td>0.00%</td>
</tr>
<tr>
<th>Liberal</th>
<td>35.71%</td>
<td>50.65%</td>
<td>9.74%</td>
<td>2.60%</td>
<td>1.30%</td>
</tr>
<tr>
<th>Moderately Liberal</th>
<td>41.96%</td>
<td>48.25%</td>
<td>4.20%</td>
<td>5.59%</td>
<td>0.00%</td>
</tr>
<tr>
<th>Moderate</th>
<td>45.88%	44.12%</td>
<td>4.12%</td>
<td>5.88%</td>
<td>0.00%</td>
</tr>
<tr>
<th>Moderately Conservative</th>
<td>47.06%</td>
<td>43.38%</td>
<td>7.35%</td>
<td>2.21%</td>
<td>0.00%</td>
</tr>
<tr>
<th>Conservative</th>
<td>44.57%</td>
<td>46.74%</td>
<td>4.35%</td>
<td>3.26%</td>
<td>1.09%</td>
</tr>
<tr>
<th>Strongly Conservative</th>
<td>50.00%</td>
<td>46.67%</td>
<td>0.00%</td>
<td>3.33%</td>
<td>0.00%</td>
</tr>
<tr>
<th>Socalist</th>
<td>30.00%</td>
<td>55.00%</td>
<td>5.00%</td>
<td>5.00%</td>
<td>5.00%</td>
</tr>
<tr>
<th>Libertarian</th>
<td>12.28%</td>
<td>70.18%</td>
<td>8.77%</td>
<td>5.26%</td>
<td>3.51%</td>
</tr>
</table>
</td>
</tr>
<tr>
<td valign=top>
<img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/browser_by_philosophy2.png" alt="Browser By Political Philosophy" title="Browser By Political Philosophy" width="500" height="705" class="alignleft size-full wp-image-202" />
</td>
</table>
<p><strong>Edit</strong><br />
Some have found the graph confusing, so here are two other versions.  Both horizontal, showing the data in one by browser, and in the other by political philosophy.  Click on them to enlarge</p>
<p><a href="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/affiliation_by_browser.png" border=1 color="blue"><img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/affiliation_by_browser-300x161.png" alt="Affiliation By Browser" title="Affiliation By Browser" width="300" height="161" class="alignleft size-medium wp-image-222" /><br />(enlarge)</a></p>
<p><a href="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/browser_by_affiliation2.png" alt="Browser By Affiliation" title="Browser By Affiliation" width="1048" height="492" class="alignleft size-full wp-image-223"><img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/08/browser_by_affiliation2-300x140.png" alt="Browser By Affiliation" title="Browser By Affiliation" width="300" height="140" class="alignleft size-medium wp-image-223" /><br />(enlarge)</a></p>
<p><strong>Conclusion</strong><br />
There appear to be a few strong correlations in data between a person’s political thinking and his or her browser choice.  Still, this data is not representative of the population as a whole.  It is, instead, a sample of people who are web savvy enough to use MTurk and who are motivated to take polls like this for small amounts of money.  Also, the strong bias of the tech and open source communities toward libertarianism is probably causing the strong bias of libertarianism toward Firefox in this sample.  Still, I thought these results were too interesting to keep to myself.  Enjoy.</p>
<p><strong>Notes</strong><br />
If you want to toy with the raw data and get access to the source I used for experimenting with the data, as well as my analysis spreadsheets, those are available <a href="http://www.evilsoft.org/blogfiles/the_experiment.tar.gz">here</a>.  We did this in 3 separate data gatherings, and those samples are still separated into 3 data files the raw data.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evilsoft.org/2009/08/25/libertarians-are-just-crazy-for-firefox-and-other-observations/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Runaway Train</title>
		<link>http://www.evilsoft.org/2009/07/13/106</link>
		<comments>http://www.evilsoft.org/2009/07/13/106#comments</comments>
		<pubDate>Mon, 13 Jul 2009 20:26:51 +0000</pubDate>
		<dc:creator><![CDATA[Administrator]]></dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[RoR]]></category>
		<category><![CDATA[Sarcasm]]></category>

		<guid isPermaLink="false">http://www.evilsoft.org/?p=106</guid>
		<description><![CDATA[I got involved with a back and forth on twitter today about rails, and ultimately I realized that there was no way to give my full opinion of the problems facing the rails community in 140 byte snippets. I&#8217;m not saying my opinion is the end all be all, but I have lead probably half [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.imdb.com/title/tt0089941/"><img src="http://www.evilsoft.org/wordpress/wp-content/uploads/2009/07/runaway_train.jpg" alt="runaway_train" title="runaway_train" width="97" height="140" style="float:left; padding-right: 1em; border-style: None" /></a> I got involved with a back and forth on twitter today about rails, and ultimately I realized that there was no way to give my full opinion of the problems facing the rails community in 140 byte snippets.  I&#8217;m not saying my opinion is the end all be all, but I have lead probably half a dozen rails projects and I did speak at <a href="http://www.evilsoft.org/?p=78">RailsConf 2007</a>.</p>
<p>So here goes, my unvarnished opinion of the problems facing the rails community:</p>
<ol>
<li>The community</li>
<p>The community is the single most ego centric community I have ever seen in a decade and a half hanging around the greater free/open source movement.  Everyone remembers <a href="http://www.zedshaw.com/">Zed Shaw</a> ironically (but deservedly) ripping into the rails community for it&#8217;s overblown personalities. But numerous other examples abound.  How can I possibly view the authors of a monitoring framework with the name <strong>God</strong> (and a tagline &#8220;like monit only awesome&#8221;) as anything other then a people with enormously expanded and wholly unjustified egos?  How can I possibly take HAML seriously when the main <a href="http://hamptoncatlin.com/">dev</a>&#8216;s bio starts off with &#8220;Hampton Catlin is one of the best people in the world. Flat out.&#8221;  Seriously?  One has to know that this guy is going to give any production problem you have <em>very</em> serious attention&lt;/wry&gt; </p>
<li>Totally decentralized, egocentric documentation</li>
<p>No other way to say it, the rails community is obsessed with personal branding, not with being a helpful community. Is there any centralized site that has a good set of user commentable docs covering most extensions? Php has that, and it&#8217;s part of why it&#8217;s still a defensible choice for writing web apps despite its numerous other flaws.  The end result is that when you google for just about anything having to do with rails code, the first five items are all personal blogs</p>
<p>With rails, the community doesn&#8217;t build any sort of centralized corpus of knowledge, what they all do is write a blog entry about such and such technique, or how they fixed a problem.  The problem here is that nearly all of this knowledge is outdated, and impossible to tie to any one version of the application stack.  So instead we get <a href="http://www.rubyhead.com/">tons of blogs</a> with <a href="http://weblog.rubyonrails.org/">disjointed suggestions</a> that take you in the <a href="http://blog.jayfields.com/">wrong direction</a> whenever you google about an issue (sure, this solution worked in 2.1, but not in 2.0 or 2.3).  Too bad it&#8217;s in a blog without with the applicable version number instead of in a comment at the end of the documentation like <a href="http://www.php.net/manual/en/class.datetime.php">mysql</a> or <a href="http://www.php.net/manual/en/class.datetime.php">php</a>.</p>
<li>Excessive reliance on ORM</li>
<p>I&#8217;m sure you have all heard of the N+1 problem.  Sure, lots of devs will tell you that it&#8217;s simple to avoid, but based on all the teams I&#8217;ve evern worked on, all it takes is one lazy programmer and all of a sudden your templates are taking 7000+ queries to render.  It&#8217;s no wonder the rails community seems to think sql is slow.  Hint: the answer isn&#8217;t memcached, the reason your rails site is slow is because the sql it&#8217;s running is craptastic.  99.999% of rails sites could be vastly improved by just hiring one or two people who actually understand relational databases.  The part that I really just don&#8217;t get is that sql is much <em>easier</em> then coding, and RDBMS is not rocket science, but it&#8217;s treated like this big hideous bear that your developers have to hide from.</p>
<li>Pure ruby is the answer to everything</li>
<p>The community is utterly obsessed with pure ruby, and looks down on impure extensions that are wrappers around solid C libraries.  This results in a general race to the bottom for speed, stability and maturity.  The unix world is packed with easy to integrate, solid libraries.  Libxml-ruby is nearly two orders of magnitude faster then rexml, and has top notch compliance with the xml spec. Yet somehow rexml is the standard and libxml-ruby is the red headed step child.</p>
<li>Fragile ecosystem</li>
<p>Now, I&#8217;ll be the first to admit that the rails maintainers shout far and wide that rails isn&#8217;t enterprise ready, and it really truly is not.  Over and over I have gotten bitten by the myriad of flaws in the rails ecosystem.  Any one specific issue I&#8217;ve dealt with could have been fixed in version such and such of some gem (or it&#8217;s even worse with rails plugins.)  This complaint is not about specific flaws so much as the whole ecosystem feels like it&#8217;s standing on a very fragile foundation.  Some examples of the ways we have gotten bitten over the life of the multiple rails projects I have been involved with are:</p>
<ul>
<li>rexml violating the xml spec by totally ignoring the encoding of documents parsed by it.</li>
<li>gem silently failing (not returning the proper unix return code) and thus allowing some of our instance launches to blow up without a reasonable way to catch it.  (And as a note, when you have to automatically install large amounts of gems from rubyforge, it chokes a *lot*).</li>
<li>Innumerable gems regularly break api compatibility even in minor releases (I&#8217;m looking at you Rack).  When you add calls, you can&#8217;t just remove them between 0.9.2 and 0.9.3, it&#8217;s damn unprofessional.</li>
<li>i18n has been a real problem right from the beginning.</li>
<li><a href="http://code.google.com/p/phusion-passenger/issues/detail?id=199">Passenger&#8217;s ApplicationPool</a> choking and never coming back, forcing you to restart apache once a month</li>
<li>Constant movement from one webserver to another.  It&#8217;s damn frustrating to have to switch web servers every 3 months as the community hops from one the the next, as everything else gets filed in the community folder for utter crap.  At that point it becomes damn hard to find support for problems.  First it&#8217;s lighttpd, with mongrel, then thin, then nginx with thin and on and on.  Somehow people need to support this mess.  Apache works, is well supported, can be very lean, and basically every systems person on the planet knows how to work with it.  Hint: as a programmer, it&#8217;s not all about you.  Your applications need to be supportable; running away from standards for the sake of being different is dumb.</li>
</ul>
<p>And just to reiterate, some of these could be actually fixed, or hell, they may have always had a *way* to work right, but the default was broken, and caused project problems that never should have existed if the rails community could ever get around to implementing a spec as it is written.</p>
<li>Generates bad, bad habits in devs</li>
<ul>
<li>Creates a view of the world that implicit is good.  This goes all the way to the language itself and the silly fact that explicit returns use more processor power then implicit returns.</li>
<li>Creates a view of the world that clever is good.  Anyone who has maintained software for a few years should be able to tell you, clever is bad, very bad.</li>
<li>My personal least favorite, the technological abortion known as Single Table Inheritance.  Admittedly, even the community is now arguing for people to not use this.  STI is a wretched way to bind a database with an object model, it encourages sparse tables as well as overloading of tables.  Both of these things <em>will</em> bite you in the ass down the road.</li>
</ul>
<li>Convention magic</li>
<p>Magic is the core of rails, and seems to be one of it&#8217;s biggest selling points.  The problem is, there&#8217;s simply no place for magic in a world where people need to actually support your code. Explicit configuration and code is much more useful to operations folks who aren&#8217;t familiar with the codebase, framework, and language.  Even if you use your developers to support your app, when they rely on a bunch of clever magic it can make for longer outages while people have to figure out what implicit thing they are failing to take into account.</p>
<li>Rails hype will kill ruby</li>
<p>Ruby could be a decent language.  It has a lot of awesome things going for it.  In a few years it really will be ready for real heavy lifting.  At least that <em>was</em> ruby&#8217;s future.  Rails has taken over the show.  The Rails community <strong>is</strong> the ruby community, and it has not set ruby on a course to be a truly dependable language.  Instead as rails project after rails project fails in all sorts of business environments, it is creating a permanent bias against the language in the management staff that oversees projects in american business.  I&#8217;ve personally seen it in multiple companies, and expect to see it in most shops that are today fiddling with rails.
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.evilsoft.org/2009/07/13/106/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
