<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0" xml:base="http://raygunrobot.com">
<channel>
 <title>Ray Gun Robot</title>
 <link>http://raygunrobot.com</link>
 <description />
 <language>en</language>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/RayGunRobot" type="application/rss+xml" /><item>
 <title>Site limbo syndrome</title>
 <link>http://feedproxy.google.com/~r/RayGunRobot/~3/2A9jIvv-2rU/168</link>
 <description>&lt;p&gt;It happens a little too often than I&amp;#8217;d like. I build a killer web site for a client; it&amp;#8217;s so much better than the site they already have (if they have one at all). I meet with them for their training meeting and show them how to add and edit content. They&amp;#8217;re generally happy with how easy it is, and they seem ready to get rocking on their site. And then…&lt;/p&gt;

&lt;p&gt;I never hear from them again. And occasionally I&amp;#8217;ll go back to the site to see if there&amp;#8217;s been any progress on it, but no. And I&amp;#8217;ll send them an email or two asking if they need help or if they&amp;#8217;re making any progress, and my boss will send the bill for the services which more often than not will get paid, but… the site just won&amp;#8217;t progress. It&amp;#8217;s in web limbo; fully built, but lacking in content; ready to conquer the world if it just knew what to say.&lt;/p&gt;

&lt;p&gt;Sometimes the client comes back and resurrects things to the point where the site is taken live; one such site will likely finally be going live early next week if not sooner. But it seems like maybe as many as a quarter of the sites I build will never see the light of day.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s kind of depressing. I&amp;#8217;m not really sure if there&amp;#8217;s anything I can do about it… Are my training sessions too complicated? Most of the time the clients seem to understand me as I&amp;#8217;m doing them… Is it just that the clients find themselves unexpectedly overwhelmed when they come face-to-face with the realization that &lt;em&gt;they&lt;/em&gt; will have to do some work on their site, even if that&amp;#8217;s what they thought they wanted all along? In my more recent early meetings with clients, before they sign the contract, I&amp;#8217;ve been trying to make sure that the clients are absolutely aware of that and its implications; it&amp;#8217;s been too soon for results to be conclusive.&lt;/p&gt;

&lt;p&gt;Arg.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RayGunRobot/~4/2A9jIvv-2rU" height="1" width="1"/&gt;</description>
 <comments>http://raygunrobot.com/node/168#comments</comments>
 <pubDate>Fri, 05 Jun 2009 02:14:06 +0000</pubDate>
 <dc:creator>Garrett Albright</dc:creator>
 <guid isPermaLink="false">168 at http://raygunrobot.com</guid>
<feedburner:origLink>http://raygunrobot.com/node/168</feedburner:origLink></item>
<item>
 <title>Fatbluepost</title>
 <link>http://feedproxy.google.com/~r/RayGunRobot/~3/PJflXAnDf2I/fatbluepost</link>
 <description>&lt;p&gt;Clearly, I haven&amp;#8217;t found much motivation to complete a blog post lately. In my defense, I haven&amp;#8217;t been entirely idle. Recently I&amp;#8217;ve released two projects related to the excellent &lt;a href="http://drupal.org/project/zen"&gt;Zen starter theme&lt;/a&gt; for Drupal: &lt;a href="http://drupal.org/project/zenophile"&gt;Zenophile&lt;/a&gt; lets you create Zen subthemes quickly, and &lt;a href="http://drupal.org/project/zen_midnight"&gt;Zen Midnight&lt;/a&gt; is a starter theme for themes which will use a light-on-dark color scheme (such as white text on a black background). There&amp;#8217;s also been the utilitarian boringness of &lt;a href="http://drupal.org/project/menu_clone"&gt;Menu Clone&lt;/a&gt; and &lt;a href="http://drupal.org/project/ce"&gt;Compound Eye&lt;/a&gt; (which lets you monitor the status of several Drupal sites at once - or will some day, anyway). Then there&amp;#8217;s activities at work; we&amp;#8217;ve finally got our own private server (of the virtual sort, for now), so I&amp;#8217;ve been having a lot of fun and learning a lot as I&amp;#8217;m getting it set up. Linux and Apache? That&amp;#8217;s for wussies! We&amp;#8217;re running &lt;a href="http://freebsd.org/"&gt;FreeBSD&lt;/a&gt; and &lt;a href="http://lighttpd.net/"&gt;Lighty&lt;/a&gt;! Having full control of HTTP headers and being able to install things like &lt;a href="http://xcache.lighttpd.net/"&gt;Xcache&lt;/a&gt; means that we&amp;#8217;re able to serve pages faster than ever before.&lt;/p&gt;

&lt;p&gt;On a decidedly less nerdy note, I&amp;#8217;ve also created a mini-fansite (it&amp;#8217;s only one page long) for one of my favorite new bands, &lt;a href="http://www.fatblueman.net/"&gt;Fatblueman&lt;/a&gt;. &lt;a href="http://raygunrobot.com/fatblueman"&gt;Check it out here&lt;/a&gt;. I&amp;#8217;ve included a list of all of their music I could find on YouTube - which is a heck of a lot - so if you&amp;#8217;re interested in finding some new candy for your ears, check it out and give some of the vids a lesson. You can even download their albums (legally) for free! Give &amp;#8216;em a try - maybe they&amp;#8217;ll become one of your favorite new bands too.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RayGunRobot/~4/PJflXAnDf2I" height="1" width="1"/&gt;</description>
 <comments>http://raygunrobot.com/fatbluepost#comments</comments>
 <category domain="http://raygunrobot.com/category/tags/drupal">Drupal</category>
 <category domain="http://raygunrobot.com/category/tags/fatblueman">Fatblueman</category>
 <category domain="http://raygunrobot.com/category/tags/music">Music</category>
 <pubDate>Wed, 20 May 2009 03:43:47 +0000</pubDate>
 <dc:creator>Garrett Albright</dc:creator>
 <guid isPermaLink="false">162 at http://raygunrobot.com</guid>
<feedburner:origLink>http://raygunrobot.com/fatbluepost</feedburner:origLink></item>
<item>
 <title>Search results via Ajax &amp; JSON: Yahoo, Live deliver; Google fails it</title>
 <link>http://feedproxy.google.com/~r/RayGunRobot/~3/XdB50Hnt9-U/search-results-via-ajax-json-yahoo-live-deliver-google-fails-it</link>
 <description>&lt;p&gt;&lt;em&gt;Warning: This will be the most technical and nerdy article I&amp;#8217;ve posted to RGR in quite a while. Those friends of mine who didn&amp;#8217;t understand the title of this post might as well go ahead and skip the whole thing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On Friday, my boss brought up the idea of building a system which we could use to check and track our clients&amp;#8217; sites&amp;#8217; search engine ranking performance for various keywords. He&amp;#8217;s been coming up with a lot of these sorts of ideas lately - sometimes I wonder if he realizes he&amp;#8217;s only hired one of me - but this idea struck me as particularly interesting. After doing some research on it, I found other tools online which do this task, but they all required payment and registration and other unpleasantness. And yet Google and Yahoo seem to offer their search results via JSON, so how difficult or expensive could this be? So I told my boss this seemed like something we could do, then went home for the weekend. Hey, quittin&amp;#8217; time is quittin&amp;#8217; time…&lt;/p&gt;

&lt;p&gt;But after I got some work done for our clients Monday morning, I got started on it soon after. By lunchtime, I had Yahoo working, and got Google hammered out when I came back. I then looked into Live Search&amp;#8217;s options and found them sufficient, so I added support for them too.&lt;/p&gt;

&lt;p&gt;Basically, how it works is that you enter a search query in one field and a web address in another. When you submit the form, the system uses Ajax to submit the query to and fetch search results in &lt;a href="http://json.org/"&gt;JSON&lt;/a&gt; format from the three engines, then runs a regular expression on the web addresses in the results to see if they match the web address appropriately and reports on the results. It&amp;#8217;s pretty slick, and I&amp;#8217;d love to release it to the public, but it was made on my boss&amp;#8217;s time, so I don&amp;#8217;t know if he&amp;#8217;d be cool with that…&lt;/p&gt;

&lt;p&gt;Anyway, it was interesting to play with the differences between the three major engines with regards to their support for all this stuff. Long story short: Yahoo and Live Search were great to work with, but Google&amp;#8217;s solution just ain&amp;#8217;t cuttin&amp;#8217; it. Let&amp;#8217;s go into more depth, shall we?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The XSS problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I started with Yahoo first since they seemed the most developer-friendly for reasons I&amp;#8217;ll get into later. My first problem with getting their feeds was… getting their feeds. When I just tried using &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;&amp;#8217;s standard &lt;a href="http://docs.jquery.com/Ajax/jQuery.ajax"&gt;$.ajax()&lt;/a&gt; function, I got a cryptic error about Yahoo&amp;#8217;s address being illegal or something like that. I kept checking the format of the address I was using for the request, but I couldn&amp;#8217;t find anything wrong with it… after doing a bit of searching in the manual sense, I found out that it turns out this is just the browsers being paranoid about requesting and executing scripts from &amp;#8220;foreign&amp;#8221; servers.&lt;/p&gt;

&lt;p&gt;It turns out there&amp;#8217;s a workaround, though. Instead of doing a standard Ajax call, what you actually do is inject a new &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag into your DOM with an SRC attribute which requests a script on the search service via GET, with a variable specifying a callback function. The service then returns a script which calls the callback with the JSON results. In practice, it works something like this: You add&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;script src="http://search.example.com/search?q=searchquery&amp;amp;callback=myCallback"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;…to your DOM, and the script that the search service returns looks like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;myCallback({/* the search results as a JS object */});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;…which then gets executed. This is a Grade AAA Prime Hack, 100% Certified. But it works and is supported by all three engines equally well.&lt;/p&gt;

&lt;p&gt;Both Yahoo and MSN are capable of offering results in XML format instead of JSON with the change of a single query particle - I bet you can figure it out. But, guys… XML is a language for marking up documents, and JSON is a system for serializing data. And we&amp;#8217;re working with data. Sorry, but the &amp;#8220;let&amp;#8217;s use XML for friggin&amp;#8217; &lt;em&gt;everything!&amp;#8221;&lt;/em&gt; crew annoy me.&lt;/p&gt;

&lt;p&gt;Anyway. Let&amp;#8217;s look at the services individually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yahoo!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yahoo seems to really be putting a lot of effort into making their various services developer-friendly, and it shows. Check out the &lt;a href="http://developer.yahoo.com/everything.html"&gt;Everything YDN&lt;/a&gt; page on Yahoo&amp;#8217;s &lt;a href="http://developer.yahoo.com/"&gt;Yahoo Developer Network&lt;/a&gt; site and check out all the stuff you can play with!&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s take a look at a GET query to Yahoo&amp;#8217;s servers. Note that I&amp;#8217;m going to leave the URLs in these examples unencoded for easier readability; they won&amp;#8217;t actually work until you run encodeURIComponent() or something on them.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://query.yahooapis.com/v1/public/yql?format=json&amp;amp;callback=myCallback&amp;amp;q='select * from search.web(100) where query = "bananas"'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Woah, what the crap? Is that SQL? Nope, that&amp;#8217;s &lt;a href="http://developer.yahoo.com/yql/"&gt;Yahoo! Query Language&lt;/a&gt;, an SQL-inspired language for querying Yahoo services - including Flickr, Delicious, and so on in addition to just standard web search. Like SQL, you can &amp;#8220;select&amp;#8221; only certain &amp;#8220;fields&amp;#8221; from the results, and you can even do WHERE clauses to a certain extent. No sorting, though. It&amp;#8217;s pretty trippy. &lt;a href="http://developer.yahoo.com/yql/console/"&gt;Try the interactive console&lt;/a&gt; for some ideas of what it can do.&lt;/p&gt;

&lt;p&gt;Notice the parenthesized (100) after search.web? That&amp;#8217;s where we tell Yahoo how many results we want back. As far as I can tell, there&amp;#8217;s no hard limit to this… I once upped it to 1000, and Yahoo dutifully gave me 1000 results, which is really a magnitude more than our project really needs to use. I didn&amp;#8217;t bother asking for more, but it seemed like the system was ready to give me more if I asked. Wow.&lt;/p&gt;

&lt;p&gt;Yahoo&amp;#8217;s response looks something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;myCallback({
  "query": {
    "count": "10",
    "created": "2009-03-31T05:21:37Z",
    "lang": "en-US",
    "updated": "2009-03-31T05:21:37Z",
    "uri": "http://query.yahooapis.com/v1/yql?q=select+*+from+search.web%2810%29+where+query+%3D+%22bananas%22",
    "diagnostics": {
      "publiclyCallable": "true",
      "url": {
        "execution-time": "285",
        "content": "http://boss.yahooapis.com/ysearch/web/v1/bananas?format=xml&amp;amp;start=0&amp;amp;count=10"
      },
      "user-time": "287",
      "service-time": "285",
      "build-version": "911"
    },
    "results": {
      "result": [
        {
          "abstract": "Information from Wikipedia on this fruit, including its description, world trade, &amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt; &amp;lt;b&amp;gt;Bananas&amp;lt;/b&amp;gt; are a valuable source of vitamin B6, vitamin C, and potassium. &amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt;",
          "clickurl": "http://lrd.yahooapis.com/_ylc=X3oDMTQ4amI4Z25zBF9TAzIwMjMxNTI3MDIEYXBwaWQDb0pfTWdwbklrWW5CMWhTZnFUZEd5TkouTXNxZlNMQmkEY2xpZW50A2Jvc3MEc2VydmljZQNCT1NTBHNsawN0aXRsZQRzcmNwdmlkA3QxM1lUVWdlQXUyM1JXRVZyVEpybXdzS1N6N3VQVW5ScUdFQUFrUTM-/SIG=118hrpqt5/**http%3A//en.wikipedia.org/wiki/Banana",
          "date": "2009/03/19",
          "dispurl": "&amp;lt;b&amp;gt;en.wikipedia.org&amp;lt;/b&amp;gt;/wiki/Banana",
          "size": "140417",
          "title": "Banana - Wikipedia, the free encyclopedia",
          "url": "http://en.wikipedia.org/wiki/Banana"
        },
        {
          "abstract": "&amp;lt;b&amp;gt;bananas&amp;lt;/b&amp;gt;, fruit, healthy &amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt; has proved that just two &amp;lt;b&amp;gt;bananas&amp;lt;/b&amp;gt; provide enough energy for a &amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt; This is because &amp;lt;b&amp;gt;bananas&amp;lt;/b&amp;gt; contain tryptophan, one of the twenty &amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt;",
          "clickurl": "http://lrd.yahooapis.com/_ylc=X3oDMTQ4amI4Z25zBF9TAzIwMjMxNTI3MDIEYXBwaWQDb0pfTWdwbklrWW5CMWhTZnFUZEd5TkouTXNxZlNMQmkEY2xpZW50A2Jvc3MEc2VydmljZQNCT1NTBHNsawN0aXRsZQRzcmNwdmlkA3QxM1lUVWdlQXUyM1JXRVZyVEpybXdzS1N6N3VQVW5ScUdFQUFrUTM-/SIG=11c59h9ug/**http%3A//www.finetuneyou.com/Bananas.html",
          "date": "2009/03/22",
          "dispurl": "www.&amp;lt;b&amp;gt;finetuneyou.com&amp;lt;/b&amp;gt;/&amp;lt;b&amp;gt;Bananas&amp;lt;/b&amp;gt;.html",
          "size": "16271",
          "title": "&amp;lt;b&amp;gt;Bananas&amp;lt;/b&amp;gt;",
          "url": "http://www.finetuneyou.com/Bananas.html"
        },
        /* …snip… */
      ]
    }
  }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ah, it&amp;#8217;s glorious. Nicely formatted, with all that meta-info… Well, both query.uri or query.url.content are wrong, but oh well, close enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Search&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Live Search, which is what Microsoft is calling its search service this week, was surprisingly forward with its results as well. To read up on Microsoft&amp;#8217;s documentation for this, &lt;a href="http://msdn.microsoft.com/en-us/library/dd250846.aspx"&gt;start here&lt;/a&gt;. Unlike the other two services, you have to sign up for an API key before you can even make some test queries against the service, but doing so is free, quick and relatively painless. I already have a &amp;#8220;Live ID&amp;#8221; thanks to my Xbox Live subscription, so I didn&amp;#8217;t even have to create a new account. A query looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://api.search.live.net/json.aspx?Sources=web&amp;amp;Web.Count=50&amp;amp;JsonType=callback&amp;amp;JsonCallback=myCallback&amp;amp;AppId=0123456789ABCDEF&amp;amp;Query=banana
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can probably guess that I faked in that AppId. (Hey, I don&amp;#8217;t want you associatin&amp;#8217; my good ID with whatever sicko queries you&amp;#8217;re going to be makin&amp;#8217;.) The number of results that we can fetch is set by the Web.Count parameter; through trial and error, I found that it seems to max out at fifty, which was sufficient enough for our task. (If you need more, Live Search lets you specify an offset parameter to fetch the next &amp;#8220;page&amp;#8221; of results.) Also note the use of TitleCase all over the place; not only in the query, but as you&amp;#8217;re about to see, in the response as well. On a one-to-ten scale of annoyingness, that&amp;#8217;s about a four.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if(typeof myCallback == 'function') myCallback({
  "SearchResponse": {
    "Version": "2.1",
    "Query": {
      "SearchTerms":"banana"
    },
    "Web": {
      "Total": 29500000,
      "Offset": 0,
      "Results": [
        {
          "Title": "Banana - Wikipedia, the free encyclopedia",
          "Description": "Banana is the common name for a type of fruit and also the herbaceous plants of the genus Musa which produce this commonly eaten fruit. They are native to the tropical region of ... ",
          "Url": "http:\/\/en.wikipedia.org\/wiki\/Banana",
          "CacheUrl": "http:\/\/cc.msnscache.com\/cache.aspx?q=banana&amp;amp;d=75747133304431&amp;amp;w=5ffa56e8,3e149266",
          "DisplayUrl": "http:\/\/en.wikipedia.org\/wiki\/Banana",
          "DateTime": "2009-03-27T12:31:49Z"
        },
        {
          "Title": "Guide to Bananas - History - Recipes - Nutrition - Banana.com",
          "Description": "Complete Guide to Bananas features the history of bananas, banana recipes, the purchase and storage of bananas, how to grow bananas, medicinal uses of bananas, the nutritional ... ",
          "Url": "http:\/\/www.banana.com\/",
          "CacheUrl": "http:\/\/cc.msnscache.com\/cache.aspx?q=banana&amp;amp;d=75708296684832&amp;amp;w=14416f13,fb67564f",
          "DisplayUrl": "http:\/\/www.banana.com\/",
          "DateTime": "2009-03-22T05:56:53Z"
        },
        /* …snip… */
      ]
    }
  }
} /* pageview_candidate */);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Live Search&amp;#8217;s results do something unusual in checking for the existence of the callback function before calling it. I&amp;#8217;m not sure I like that - if something goes wrong, raising an execption is often better than failing silently. Hmm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google. Google Google Google Google Google… tsk tsk tsk.&lt;/p&gt;

&lt;p&gt;Whereas Yahoo is gloriously generous with the data it&amp;#8217;s providing us, Google seems downright stingy. Most of &lt;a href="http://code.google.com/apis/ajaxsearch/documentation/"&gt;their &amp;#8220;AJAX Search API&amp;#8221; documentation&lt;/a&gt; is geared more around the idea of drawing a pretty little search form and pretty little search results on the page, not providing raw data to work with - for info on getting that, you have to read the section annoyingly titled &lt;a href="http://code.google.com/apis/ajaxsearch/documentation/#fonje"&gt;&amp;#8220;Flash and other non-Javascript [sic] Environments&amp;#8221;&lt;/a&gt;, even if you really are working entirely in JavaScript. Additionally, they &amp;#8220;ask, but do not require, that each request contains a valid API Key&amp;#8221; without providing any information as to just how that API key should be passed to the server. In the data passed back, there&amp;#8217;s no explicit search result offset value as there is with the other services&amp;#8217; data; you can find it doing simple arithmetic with other values, but it&amp;#8217;s still annoying that you have to do it at all. They also make a lot of demands about preserving the Google branding and such when the results are displayed (which I gloriously ignored since technically we&amp;#8217;re not displaying results and really only a couple people in the office are ever going to use this anyway… Perhaps the other services make demands like this too, but are less obnoxious about them).&lt;/p&gt;

&lt;p&gt;Worst of all… the amount of results you can fetch at once maxes out at eight. Eight! To work around this limitation, I scripted the system to check through the first page of results for a match, and if none is found, to get the next eight, and so on, up to eight times (sixty-four results). The result is that querying Google takes up to ten connections to Google&amp;#8217;s server, whereas the rest only take one (possibly two in the case of Live Search if the boss decides the first fifty results aren&amp;#8217;t enough). Fail!&lt;/p&gt;

&lt;p&gt;Well, anyway. A query:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://ajax.googleapis.com/ajax/services/search/web?v=1.0&amp;amp;callback=myCallback&amp;amp;rsz=large&amp;amp;q=bananas
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Simple enough. The &amp;#8220;rsz&amp;#8221; attribute is what tells the servers to send us eight results - the default is only four!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;myCallback({
  "responseData": {
    "results": [
      {
        "GsearchResultClass": "GwebSearch",
        "unescapedUrl": "http://en.wikipedia.org/wiki/Banana",
        "url": "http://en.wikipedia.org/wiki/Banana",
        "visibleUrl": "en.wikipedia.org",
        "cacheUrl": "http://www.google.com/search?q\u003dcache:Gdi1ltWHn3UJ:en.wikipedia.org",
        "title": "\u003cb\u003eBanana\u003c/b\u003e - Wikipedia, the free encyclopedia",
        "titleNoFormatting": "Banana - Wikipedia, the free encyclopedia",
        "content": "\u003cb\u003eBanana\u003c/b\u003e is the common name for a type of fruit and also the herbaceous plants of   the genus Musa which produce this commonly eaten fruit. \u003cb\u003e...\u003c/b\u003e"
      },
      {
        "GsearchResultClass": "GwebSearch",
        "unescapedUrl": "http://www.bananasinc.org/",
        "url": "http://www.bananasinc.org/",
        "visibleUrl": "www.bananasinc.org",
        "cacheUrl": "http://www.google.com/search?q\u003dcache:paffpacthUcJ:www.bananasinc.org",
        "title": "\u003cb\u003eBANANAS\u003c/b\u003e Home Page",
        "titleNoFormatting": "BANANAS Home Page",
        "content": "\u003cb\u003eBANANAS\u003c/b\u003e specializes in childcare, daycare \u0026amp; babysitting referrals for parents   and childcare providers in Alameda County, California."
      },
      /* …snip… */
    ],
    "cursor": {
      "pages": [
        {
          "start": "0",
          "label": 1
        },
        {
          "start": "8",
          "label": 2
        },
        /* …snip… */
      ],
      "estimatedResultCount": "16400000",
      "currentPageIndex": 0,
      "moreResultsUrl": "http://www.google.com/search?oe\u003dutf8\u0026ie\u003dutf8\u0026source\u003duds\u0026start\u003d0\u0026hl\u003den\u0026q\u003dbananas"
    }
  },
  "responseDetails": null,
  "responseStatus": 200
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can see that Google provides this curious responseData.cursor.pages array which I guess is supposed to be used to build a &amp;#8220;Goooooooogle&amp;#8221;-like pager for the results. It seems useless, but it sort of comes in handy when a URL matches and I have to calculate &lt;code&gt;parseInt(json.responseData.cursor.pages[json.responseData.cursor.currentPageIndex].start) + i + 1&lt;/code&gt; to find out which result it was. Barf.&lt;/p&gt;

&lt;p&gt;So well on Microsoft and especially Yahoo for making their search data so accessible like this. The potential for building some really great &amp;#8220;mash-up&amp;#8221;-style apps with search result data is nearly limitless. I know that Google is the go-to search engine for everyone from n00bs to l33ts, but I think developers really should take a second look at what Yahoo offers for them - they&amp;#8217;re really doing some great work in terms of developer outreach. I didn&amp;#8217;t look into it as deeply, but it seems Microsoft has made some great steps in that direction too.&lt;/p&gt;

&lt;p&gt;But all shame upon Google for providing poorly-formatted, restriction-heavy data. Clearly their focus is not upon us, the developers itching to use their data in a sweet new web app. They haven&amp;#8217;t had anything to fear from the competition in a while, but if they don&amp;#8217;t watch their back, it may come back to bite them…&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RayGunRobot/~4/XdB50Hnt9-U" height="1" width="1"/&gt;</description>
 <comments>http://raygunrobot.com/search-results-via-ajax-json-yahoo-live-deliver-google-fails-it#comments</comments>
 <category domain="http://raygunrobot.com/category/tags/ajaj">AJAJ</category>
 <category domain="http://raygunrobot.com/category/tags/ajax">Ajax</category>
 <category domain="http://raygunrobot.com/category/tags/google">Google</category>
 <category domain="http://raygunrobot.com/category/tags/javascript">JavaScript</category>
 <category domain="http://raygunrobot.com/category/tags/json">JSON</category>
 <category domain="http://raygunrobot.com/category/tags/live-search">Live Search</category>
 <category domain="http://raygunrobot.com/category/tags/microsoft">Microsoft</category>
 <category domain="http://raygunrobot.com/category/tags/yahoo">Yahoo!</category>
 <pubDate>Tue, 31 Mar 2009 06:18:59 +0000</pubDate>
 <dc:creator>Garrett Albright</dc:creator>
 <guid isPermaLink="false">158 at http://raygunrobot.com</guid>
<feedburner:origLink>http://raygunrobot.com/search-results-via-ajax-json-yahoo-live-deliver-google-fails-it</feedburner:origLink></item>
<item>
 <title>More deductions, less stress: TurboTax delivers</title>
 <link>http://feedproxy.google.com/~r/RayGunRobot/~3/geBLTddzRIk/more-deductions-less-stress-turbotax-delivers</link>
 <description>&lt;p&gt;While searching for help on a vexing programming problem I was having earlier today, Yahoo threw me an ad for Intuit&amp;#8217;s &lt;a href="http://turbotax.intuit.com/"&gt;TurboTax online service&lt;/a&gt;, promising to let me file my taxes for free. I knew the hook of these services - your &lt;em&gt;federal&lt;/em&gt; taxes are free, but they&amp;#8217;ll charge you a fee to transfer over your data and file your &lt;em&gt;state&lt;/em&gt; taxes - but, since I was already at that point ready for a distraction from my programming problem at that point, I took the bait and clicked the ad.&lt;/p&gt;

&lt;p&gt;It must be said that I hate doing my taxes. Not so much to see how much the government has leeched out of me - though of course that blows too - but because it involves getting together papers from one place and papers from another place and putting them all together and copying numbers from one piece of paper to another… Paperwork. Empty formality. It&amp;#8217;s not my style.&lt;/p&gt;

&lt;p&gt;So I played around with TurboTax, seeing if it would be a better experience than filling out a 1024ASDF form. At the end, I&amp;#8217;d have to say that it was, and that I was generally satisfied with the experience.&lt;/p&gt;

&lt;p&gt;TurboTax works through a series of screens with various questions, most of which accept a yes or no answer. You&amp;#8217;ll also have to copy over values from your W2 and other such forms, but the system does all the math for you. The system will ask you questions about your situation first and only ask you for your name, address and such near the end, which I think is an interesting choice psychologically… Thinking about it, I probably would have been more dissuaded to try the service if it asked me for those things up front.&lt;/p&gt;

&lt;p&gt;I started out filling forms on the free plan, but, of course, eventually I got the pitch for an upsell. Would I like to use the &amp;#8220;Basic Plus&amp;#8221; plan for an extra $15 and have it maximize my deductions or some such language? At this point, I still hadn&amp;#8217;t given Intuit my credit card number, so I accepted the offer to see if it would suggest anything I missed. Indeed, it did - specifically, the interest I paid on my student loan (which I finally paid off just a couple weeks ago) was deductible, something I didn&amp;#8217;t know I could deduct for the past three tax years I&amp;#8217;ve had since graduating. Damn! I was also able to deduct the tuition I paid for the classes I took at the local community college, something else I wouldn&amp;#8217;t have considered. In the end, my tax burden was lowered by a couple dozen dollars - enough for the premium service to pay for itself, if not spectacularly.&lt;/p&gt;

&lt;p&gt;And then there was the pitch I knew was coming - file your state taxes too for $35. Okay, fine. You&amp;#8217;ve got a deal.&lt;/p&gt;

&lt;p&gt;In the end, it turns out I wasn&amp;#8217;t able to file electronically, because apparently they need some security number that was on my 2007 return statement or something like that - I don&amp;#8217;t know, exactly. Just that it involved paperwork. So instead TurboTax created a multi-page PDF of the various tax forms with values already filled in, ready to print out and mail along with my federal and state ransoms (no return for me).&lt;/p&gt;

&lt;p&gt;In the end, I paid $50 for something I could have done for free - for free, and not enjoyed it one bit. And I know for sure that TurboTax&amp;#8217;s suggestions for deductions saved me a few bucks - not quite $50, but the resultant decreased tax fee plus the reduced stress of not having to do the paperwork manually makes me believe I got my money&amp;#8217;s worth. I&amp;#8217;ll definitely look to use this tool next year, and for those still procrastinating on their taxes, I&amp;#8217;d recommend giving &lt;a href="http://turbotax.intuit.com/"&gt;TurboTax&lt;/a&gt; a look, especially if you hate paperwork too.&lt;/p&gt;

&lt;p&gt;Now if you all would have just voted for &lt;a href="http://www.mikehuckabee.com/index.cfm?fa=Home.Biography"&gt;Huckabee&lt;/a&gt; in &amp;#8216;08, maybe 2009 would have been the year of the &lt;a href="http://www.fairtax.org/site/PageServer"&gt;FairTax&lt;/a&gt; and all this stupid paperwork would be just a bad memory…&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RayGunRobot/~4/geBLTddzRIk" height="1" width="1"/&gt;</description>
 <comments>http://raygunrobot.com/more-deductions-less-stress-turbotax-delivers#comments</comments>
 <category domain="http://raygunrobot.com/category/tags/intuit">Intuit</category>
 <category domain="http://raygunrobot.com/category/tags/taxes">Taxes</category>
 <category domain="http://raygunrobot.com/category/tags/turbotax">TurboTax</category>
 <category domain="http://raygunrobot.com/category/tags/united-states">United States</category>
 <pubDate>Sun, 22 Mar 2009 06:41:28 +0000</pubDate>
 <dc:creator>Garrett Albright</dc:creator>
 <guid isPermaLink="false">156 at http://raygunrobot.com</guid>
<feedburner:origLink>http://raygunrobot.com/more-deductions-less-stress-turbotax-delivers</feedburner:origLink></item>
<item>
 <title>The fallacy of trust</title>
 <link>http://feedproxy.google.com/~r/RayGunRobot/~3/TYGxolwQ_iI/the-fallacy-of-trust</link>
 <description>&lt;p&gt;I&amp;#8217;ve recently been reading &lt;a href="http://absolutefreebsd.com/"&gt;Absolute FreeBSD: The Complete Guide to FreeBSD&lt;/a&gt; by Michael W Lucas. The book is packed with info about using &lt;a href="http://freebsd.org/"&gt;FreeBSD&lt;/a&gt;, mostly from a server perspective; it has a lot of information related to keeping server boxes secure (as it should). In a footnote in Chapter 9, Lucas provides the web address to &lt;a href="http://www.acm.org/classics/sep95/"&gt;an article&lt;/a&gt; which is no longer available at that address; &lt;a href="http://archive.org"&gt;Archive.org&lt;/a&gt; saves the day with a &lt;a href="http://web.archive.org/web/20021205031445/www.acm.org/classics/sep95/"&gt;cached version&lt;/a&gt; of the article.&lt;/p&gt;

&lt;p&gt;Entitled &amp;#8220;Reflections on Trusting Trust,&amp;#8221; it&amp;#8217;s a transcript of a speech given by Ken Thompson, one of the graybeards behind Unix as well as a few other neat technologies including UTF-8. It describes a security breach involving an operating system&amp;#8217;s compiler - the program which takes program source code and turns it into an executable program. The speech goes into detail, but to sum it up, the breach works like this.&lt;/p&gt;

&lt;p&gt;The attacker modifies the source code of a compiler, adding two new instructions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;If the compiler is compiling the Unix &lt;code&gt;login&lt;/code&gt; program, and the password provided is a certain password, allow the user full access rights to the computer. Otherwise, behave as normal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the compiler is compiling the compiler (another copy of itself), add these two new instructions to the compiler.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The attacker then compiles the code to produce a tainted compiler, then removes the two instructions above from the compiler&amp;#8217;s source code to cover their tracks. But it doesn&amp;#8217;t matter, because from now on, any copies of the &lt;code&gt;login&lt;/code&gt; or compiler programs the compiler creates, or that a compiler created by the compiler creates, etc, will be &amp;#8220;tainted.&amp;#8221; If the compiler is then distributed in binary form to a wide number of systems - say, as an operating system release - then you&amp;#8217;ve suddenly got a wide range of systems out in the wild which one hacker can gain root access to with a single password.&lt;/p&gt;

&lt;p&gt;Once I wrapped my head around how the attack works, I was struck by both its simplicity and its practicality. Who&amp;#8217;s to say such an attack isn&amp;#8217;t already happening, really? Maybe not by a malicious hacker, but by a government interested on keeping tabs on its citizens and/or international neighbors…&lt;/p&gt;

&lt;p&gt;Or think of other instructions which could be added to the list. If the compiler is compiling PHP or some other interpreter often used for the deployment of web sites, it could add instructions that, whenever the system accepts a number which looks like a credit card number, it emails that number off to the hacker. This would obviously be a huge breach for online shopping sites, and one that, I imagine, they&amp;#8217;d have a very hard time to track down themselves.&lt;/p&gt;

&lt;p&gt;The gist is that it&amp;#8217;s impossible to trust any code that you didn&amp;#8217;t write yourself. But, of course, it&amp;#8217;s impractical to write an entire functioning computer&amp;#8217;s code all by yourself, end to end, and would probably cause more problems than it would fix anyway, since often the bugs and security issues you&amp;#8217;ve created which are obvious to others can be easily skipped over or &amp;#8220;invisible&amp;#8221; to yourself. At some point, you just have to trust - or at least hope - that someone else&amp;#8217;s code will be safe and sane.&lt;/p&gt;

&lt;p&gt;If I were the paranoid type, I might even lose sleep over this…&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RayGunRobot/~4/TYGxolwQ_iI" height="1" width="1"/&gt;</description>
 <comments>http://raygunrobot.com/the-fallacy-of-trust#comments</comments>
 <category domain="http://raygunrobot.com/category/tags/security">Security</category>
 <pubDate>Mon, 09 Mar 2009 01:24:43 +0000</pubDate>
 <dc:creator>Garrett Albright</dc:creator>
 <guid isPermaLink="false">149 at http://raygunrobot.com</guid>
<feedburner:origLink>http://raygunrobot.com/the-fallacy-of-trust</feedburner:origLink></item>
<item>
 <title>Sickly</title>
 <link>http://feedproxy.google.com/~r/RayGunRobot/~3/cx9qNBo8qaQ/sickly</link>
 <description>&lt;p&gt;Remember a few weeks ago when I posted an article about &lt;a href="http://raygunrobot.com/getting-my-vein-tapped"&gt;my blood donation&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;A couple weeks later, I got a notice in my mailbox that my postman had tried to drop off a certified letter from the blood bank, but I wasn&amp;#8217;t there to receive it (I was working). That made me a little bit nervous. Why would the blood bank need to send me something so securely and confidentially? Maybe they found HIV in my blood, ha ha. No, that couldn&amp;#8217;t be it, ha ha ha.&lt;/p&gt;

&lt;p&gt;So the next day I swung by the post office and picked up the letter. Darn, it was a thick envelope, as it would be if it included brochures and stuff about how to deal with my recent HIV contraction, ha ha ha. I opened it up and read through the letter. Ah, thank God, they didn&amp;#8217;t find HIV in my blood. Phew.&lt;/p&gt;

&lt;p&gt;No, they found &lt;a href="http://en.wikipedia.org/wiki/Hepatitis_C"&gt;hepatitis C&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Yeah, and the rest of the envelope was sure enough filled with brochures and stuff about what hep C is and how to deal with it and stuff. Well, they found hep C in their first test, but then tested it again and couldn&amp;#8217;t find it the second time, so they think that the first test was a false positive… but here&amp;#8217;s a bunch of information about it and maybe you should see a real doctor about this, and also, sorry, but you&amp;#8217;re off the donor list for six months even if you don&amp;#8217;t have it.&lt;/p&gt;

&lt;p&gt;Ha.&lt;/p&gt;

&lt;p&gt;Now, you may find this hard to believe, but I don&amp;#8217;t exactly live the hardcore life. I don&amp;#8217;t shoot meth and I don&amp;#8217;t patronize prostitutes. If I really did have the hep, I probably would have got it by giving blood… But, I mean, the letter was kinda clear that I probably didn&amp;#8217;t have it, but it was still hella scary, ya know?&lt;/p&gt;

&lt;p&gt;So I called the clinic and made an appointment to get blood drawn and tested. I got the phone call with the results today. Would this story end up being a comedy or a tragedy? Was I positive or negative for hepatitis C?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(suspenseful pause)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Well, I was negative, of course. I probably really had nothing to fear all along, but of course it&amp;#8217;s good to get a definitive answer to the question, and not have the nagging feeling that maybe, &lt;em&gt;maybe,&lt;/em&gt; it was the &lt;em&gt;second&lt;/em&gt; test the blood bank did which was actually wrong. So for that it was worth the cost and trouble (especially if my insurance ends up covering the former - jury&amp;#8217;s still out on that).&lt;/p&gt;

&lt;p&gt;More long tech-related postings coming… eventually, I promise. Until then (and well after), keep giving blood for as long as your local bank lets you…&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RayGunRobot/~4/cx9qNBo8qaQ" height="1" width="1"/&gt;</description>
 <comments>http://raygunrobot.com/sickly#comments</comments>
 <category domain="http://raygunrobot.com/category/tags/blood-donation">Blood donation</category>
 <category domain="http://raygunrobot.com/category/tags/disease">Disease</category>
 <category domain="http://raygunrobot.com/category/tags/hepatitis-c">Hepatitis C</category>
 <pubDate>Thu, 26 Feb 2009 05:44:02 +0000</pubDate>
 <dc:creator>Garrett Albright</dc:creator>
 <guid isPermaLink="false">146 at http://raygunrobot.com</guid>
<feedburner:origLink>http://raygunrobot.com/sickly</feedburner:origLink></item>
<item>
 <title>The vicious license</title>
 <link>http://feedproxy.google.com/~r/RayGunRobot/~3/8uaeqzNdWj4/the-vicious-license</link>
 <description>&lt;p&gt;No major updates recently because my innernets was down at home thanks to a failed Motorola DSL modem. Now that things are working again, I&amp;#8217;m going to waste &lt;em&gt;so&lt;/em&gt; much time tonight, let me tell you…&lt;/p&gt;

&lt;p&gt;I do want to share this, though. There&amp;#8217;s a program out there called &lt;a href="http://carl.kenner.googlepages.com/glovepie"&gt;GlovePIE&lt;/a&gt; which basically aids in using various unusual input devices, such as Wii remotes and virtual reality gloves, with the PC. It turns out it has some rather strict and unusual licensing terms. Now this surely isn&amp;#8217;t the first piece of software out there that has tried to make some sort of political statement in its licensing terms, but this one is just plain vicious. Check it out:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;This software is copyright (c) Carl Kenner, except for scripts by other authors.&lt;br /&gt;
  By using this software you agree to obey the following license conditions:[…]&lt;/p&gt;
  
  &lt;ul&gt;
  &lt;li&gt;&lt;p&gt;You may not use this software directly or indirectly for any military purpose. This includes, but is not limited to, training, research and development, controlling military hardware, directing military personel, or troop entertainment. You may not use this software anywhere on a military base or vessel. This applies to all versions of PIE.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;You may not export this software to Israel, or use it in Israel (including the occupied territories), until Israel has ended its occupation of the West Bank, Gaza Strip, Lebanon, Syria, and anywhere else it may occupy. If you try to run it in Israel it will give you an error.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Missionaries may not use this software. It may not be used for any missionary purpose. Or any other genocidal purpose.&lt;/p&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;…Wow. I&amp;#8217;ll have to keep that in mind if I ever become a soldier, missionary or Israeli and ever find a need to use a &lt;a href="http://www.youtube.com/watch?v=MYDuy7wM8Gk"&gt;Power Glove&lt;/a&gt; (NSFW language) with my PC.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RayGunRobot/~4/8uaeqzNdWj4" height="1" width="1"/&gt;</description>
 <comments>http://raygunrobot.com/the-vicious-license#comments</comments>
 <category domain="http://raygunrobot.com/category/tags/licensing">Licensing</category>
 <pubDate>Wed, 25 Feb 2009 01:56:14 +0000</pubDate>
 <dc:creator>Garrett Albright</dc:creator>
 <guid isPermaLink="false">140 at http://raygunrobot.com</guid>
<feedburner:origLink>http://raygunrobot.com/the-vicious-license</feedburner:origLink></item>
<item>
 <title>Looking forward to going back</title>
 <link>http://feedproxy.google.com/~r/RayGunRobot/~3/FX-NJYKfnA8/looking-forward-to-going-back</link>
 <description>&lt;p&gt;Dear innernets;&lt;/p&gt;

&lt;p&gt;I apologize for my &lt;a href="http://raygunrobot.com/to-twits-todays-tweets-are-tomorrows-retweets"&gt;last crappy post&lt;/a&gt;. I thought it was really funny at the time. I mean, I was cracking myself up while typing it. Looking at it now, though… hoo boy, yeah, I laid an egg. But, I mean, won&amp;#8217;t the internet please just shut up about Twitter for a little bit? Seriously.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve got a more interesting post (to me, anyway, but hey, that&amp;#8217;s what blogging&amp;#8217;s all about) about a third of the way done and saved in a text file to finish tomorrow (maybe). Before that, I&amp;#8217;d like to do a little lazywebbing and ask if anyone out there has ever gone back to college. Now that I&amp;#8217;ve got my debts from the first go-round almost paid off, I&amp;#8217;m considering heading back to get a degree in something less worthless than friggin&amp;#8217; English Literature. Possibly a CS one; I feel I have a good amount of practical knowledge about development at this point, but I know I&amp;#8217;m still lacking a lot of the theoretical stuff they teach in classrooms. I wouldn&amp;#8217;t mind taking my Japanese studies beyond the just-for-fun level either.&lt;/p&gt;

&lt;p&gt;Anyway, trying to search for info about going back to school seems to return a lot of spammy-looking sites for study-at-home programs and chain trade schools like University of Phoenix… not what I&amp;#8217;m looking for at all. I&amp;#8217;m talking about going to an actual university campus and taking classes for four hours a day or so. Not quite sure how a job will factor into that just yet, but I think I can find a way somehow.&lt;/p&gt;

&lt;p&gt;So please, if you have done this and can share your story, please post in the comments - and then come back, because I&amp;#8217;ll likely have some follow-up questions for ya. If you can just link to some sites with more info about the process which aren&amp;#8217;t trying to sell me anything, that&amp;#8217;d be appreciated too.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RayGunRobot/~4/FX-NJYKfnA8" height="1" width="1"/&gt;</description>
 <comments>http://raygunrobot.com/looking-forward-to-going-back#comments</comments>
 <category domain="http://raygunrobot.com/category/tags/college">College</category>
 <pubDate>Tue, 17 Feb 2009 06:27:26 +0000</pubDate>
 <dc:creator>Garrett Albright</dc:creator>
 <guid isPermaLink="false">136 at http://raygunrobot.com</guid>
<feedburner:origLink>http://raygunrobot.com/looking-forward-to-going-back</feedburner:origLink></item>
<item>
 <title>To twits: Today's tweets are tomorrow's retweets.</title>
 <link>http://feedproxy.google.com/~r/RayGunRobot/~3/lXrQDrmNy5s/to-twits-todays-tweets-are-tomorrows-retweets</link>
 <description>&lt;p&gt;This Tuesday, Twitter&amp;#8217;s twits tweeted a retweet of a Twitterer&amp;#8217;s tweet. The text of the tweet tweeted that Twitter&amp;#8217;s common tweets and retweets made the twit in question titter. Ten tweets later, a Twitterer named Travis tweeted that the twit that tweeted the first tragic tweet was a tit. &lt;a href="http://tinyurl.com/5blkcl"&gt;http://tinyurl.com/5blkcl&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Personally, after seeing the Fail Whale, I retweeted a retweet of a tweet that Tanya Twittered. Twelve tweets do not a typical twit make, but Tanya tweeted otherwise. &lt;a href="http://bit.ly/sfTyx"&gt;http://bit.ly/sfTyx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Taking the drama out of the whole equation, I somehow found emotions I couldn&amp;#8217;t summarize in one hundred forty characters. So I lazyweb&amp;#8217;d my followers with a tweet asking how many twits&amp;#8217; tweets can truly be tolerable in these Web 2.0 days. Ping &lt;a href="http://twitter.com/enterprisey"&gt;@enterprisey&lt;/a&gt; on this. &lt;a href="http://is.gd/jnHY"&gt;http://is.gd/jnHY&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Take the time to tweet me a tweet or two and let me know your thoughts.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RayGunRobot/~4/lXrQDrmNy5s" height="1" width="1"/&gt;</description>
 <comments>http://raygunrobot.com/to-twits-todays-tweets-are-tomorrows-retweets#comments</comments>
 <category domain="http://raygunrobot.com/category/tags/twitter">Twitter</category>
 <pubDate>Fri, 13 Feb 2009 05:25:29 +0000</pubDate>
 <dc:creator>Garrett Albright</dc:creator>
 <guid isPermaLink="false">134 at http://raygunrobot.com</guid>
<feedburner:origLink>http://raygunrobot.com/to-twits-todays-tweets-are-tomorrows-retweets</feedburner:origLink></item>
<item>
 <title>Know your limits</title>
 <link>http://feedproxy.google.com/~r/RayGunRobot/~3/-AuGVVmn3Hs/know-your-limits</link>
 <description>&lt;p&gt;I&amp;#8217;d like to talk to you for a moment about the web hosting industry, and dirty tricks therein.&lt;/p&gt;

&lt;p&gt;Pretty much anyone who takes their web sites seriously has a preferred shared web hosting company. I&amp;#8217;ve made no secret about my current fave, &lt;a href="http://refer.asmallorange.com/10728"&gt;A Small Orange&lt;/a&gt; (blatant referral link); their uptime is decent, their tech support is fast, and they don&amp;#8217;t nickel-and-dime you on things like domain name aliases or SSH access. However, though I think they&amp;#8217;re well worth the money, they&amp;#8217;re not the cheapest company in the game, so I won&amp;#8217;t be surprised if those of you looking for a host pass them by for a cheaper company.&lt;/p&gt;

&lt;p&gt;Let me back up and explain a bit about what you&amp;#8217;re getting when you buy web hosting. You&amp;#8217;re buying the ability to upload files on to a company&amp;#8217;s server, which will then serve those files to the web (possibly after processing them first if they&amp;#8217;re scripts written in PHP, Python, etc). When this happens, you are consuming three resources of the hosting company: the disk space to store the files you have uploaded; the bandwidth to serve those files to others; and the computer processor time it takes to process and serve your files.&lt;/p&gt;

&lt;p&gt;I won&amp;#8217;t talk about the processor time issue, because with modern servers and well-written software, it&amp;#8217;s usually not an issue. Let&amp;#8217;s talk about the disk space and bandwidth aspects.&lt;/p&gt;

&lt;p&gt;Many web hosts, like A Small Orange, offer a range of plans which allot you a certain finite limit of disk space and bandwidth; the server won&amp;#8217;t allow you to create or upload any more files if you go over the disk space limit, and you&amp;#8217;ll be charged a per-gigabyte fee if you go over the bandwidth limit. However, an increasing number of web hosting companies, including my former fave &lt;a href="http://www.dreamhost.com/"&gt;DreamHost&lt;/a&gt;, offer a single &amp;#8220;unlimited&amp;#8221; plan, where all of their customers pay a single flat monthly fee, and can use as much disk space and bandwidth they need.&lt;/p&gt;

&lt;p&gt;…Or &lt;em&gt;can&lt;/em&gt; they? The servers that are hosting their customers&amp;#8217; sites clearly don&amp;#8217;t have unlimited resources, so how can they sell that? Well…&lt;/p&gt;

&lt;p&gt;Think of it this way. Imagine you go to an all-you-can-eat buffet for breakfast. But you bring a book, and after eating breakfast, you stick around until lunchtime. Then you eat lunch. Then you maybe break out a Nintendo DS or something and hang out until dinner. Then you eat dinner. Then you crash in a booth overnight and eat breakfast the next day… Well, eventually somebody&amp;#8217;s going to catch on and ask you to leave, right? What they really mean when they say &amp;#8220;all you can eat&amp;#8221; is &amp;#8220;as much as most people who aren&amp;#8217;t training to be &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Makuuchi#Yokozuna"&gt;yokozuna&lt;/a&gt;&lt;/em&gt; could be expected to eat in a single meal.&amp;#8221; I don&amp;#8217;t think very many reasonable people would argue otherwise.&lt;/p&gt;

&lt;p&gt;Well, this is how &amp;#8220;unlimited&amp;#8221; hosting plans work. In reality, hosting companies know that their average customer will use this much disk space and this much bandwidth, and they allocate customers to their servers accordingly. Now if they have a couple customers who are using notably more than average, it&amp;#8217;s okay, because they can probably find a few customers who are using notably less than average and put them on the same servers so that they balance each other out.&lt;/p&gt;

&lt;p&gt;However, if your site becomes incredibly popular (may you - and I - ever have such a problem) and it&amp;#8217;s suddenly using astronomical amounts of server resources, you&amp;#8217;re going to find out that those &amp;#8220;unlimited&amp;#8221; plans do indeed have their limits. It&amp;#8217;s quite likely that your account will be closed and your site taken offline. The internet abounds with stories of unlimited hosting plan customers who have had this happen to them. And it&amp;#8217;s not exactly a secret; if you read the fine print of an unlimited hosting plan, it&amp;#8217;ll probably say something about how they reserve the right to shut your site down if it&amp;#8217;s using more than its fair share.&lt;/p&gt;

&lt;p&gt;So, &amp;#8220;unlimited&amp;#8221; hosting plans do have bandwidth and disk space limits, just like my A Small Orange plan does. The difference is that I &lt;em&gt;know&lt;/em&gt; what my limits are, whereas those on unlimited plans don&amp;#8217;t know what theirs are until it&amp;#8217;s too late and their sites are taken down. (I&amp;#8217;m on ASO&amp;#8217;s $10 a month plan, which currently offers 1000MB of disk space and 25GB of bandwidth monthly; I&amp;#8217;ve hit up against the disk space limit occasionally when I&amp;#8217;ve been experimenting with stuff and not cleaning up after myself, but I&amp;#8217;ve never come close on the bandwidth allotment.) And furthermore, if I ever go over my bandwidth limit, it&amp;#8217;s in ASO&amp;#8217;s best interest to keep my site online as much as possible, so that they can charge me the 50¢-per-gigabyte overage rate.&lt;/p&gt;

&lt;p&gt;So the next time you see an offer for an &amp;#8220;unlimited&amp;#8221; hosting plan, think of it as an &amp;#8220;unknown and possibly arbritrary limits&amp;#8221; plan and let it pass by. Stick with companies that lay out all the details of their plans in front of you and don&amp;#8217;t hide their intentions in fine print.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RayGunRobot/~4/-AuGVVmn3Hs" height="1" width="1"/&gt;</description>
 <comments>http://raygunrobot.com/know-your-limits#comments</comments>
 <category domain="http://raygunrobot.com/category/tags/web-hosting">Web hosting</category>
 <pubDate>Sun, 25 Jan 2009 08:03:15 +0000</pubDate>
 <dc:creator>Garrett Albright</dc:creator>
 <guid isPermaLink="false">126 at http://raygunrobot.com</guid>
<feedburner:origLink>http://raygunrobot.com/know-your-limits</feedburner:origLink></item>
</channel>
</rss>
