<?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>Calling Shotgun &#187; Geekery</title>
	<atom:link href="http://www.callingshotgun.net/category/geekery/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.callingshotgun.net</link>
	<description>Hitching a ride on the information superhighway.</description>
	<lastBuildDate>Tue, 13 Oct 2009 03:48:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Contacts Evolved &#8211; My first Android Project</title>
		<link>http://www.callingshotgun.net/geekery/contacts-evolved-my-first-android-project/</link>
		<comments>http://www.callingshotgun.net/geekery/contacts-evolved-my-first-android-project/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 07:02:08 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Geekery]]></category>

		<guid isPermaLink="false">http://www.callingshotgun.net/?p=99</guid>
		<description><![CDATA[Just completed my first project for the android, and submitted to the ADC2 with about 12 minutes to spare. Last minute bugs are dangerous things. Oh, man. Observe! Details later. For now, sleep.]]></description>
			<content:encoded><![CDATA[<p>Just completed my first project for the android, and submitted to the ADC2 with about 12 minutes to spare.  Last minute bugs are dangerous things.  Oh, man.</p>
<p>Observe!</p>
<p><img src="http://www.callingshotgun.net/wp-content/uploads/2009/08/submission_screenshot.png" alt="Screenshot of my submission" title="Screenshot of my submission" width="570" height="248" class="size-full wp-image-100" /></p>
<p>Details later.  For now, sleep.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.callingshotgun.net/geekery/contacts-evolved-my-first-android-project/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Mixed Feelings on The Sumo Omni Plus</title>
		<link>http://www.callingshotgun.net/uncategorized/mixed-feelings-on-the-sumo-omni-plus/</link>
		<comments>http://www.callingshotgun.net/uncategorized/mixed-feelings-on-the-sumo-omni-plus/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 20:22:17 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Geekery]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.callingshotgun.net/?p=92</guid>
		<description><![CDATA[I just received my Sumo Omni Plus yesterday. I&#8217;ve been excited about getting this thing for weeks, but after setting everything up, I noticed it was missing something- The straps. If you go to the website, you&#8217;ll notice that in the pictures of the product, this monstrous beast of a pillow-chair-thing has straps on the [...]]]></description>
			<content:encoded><![CDATA[<p>I just received my <a href="http://www.sumolounge.com/omniPlus.php?re=na">Sumo Omni Plus</a> yesterday.  I&#8217;ve been excited about getting this thing for weeks, but after setting everything up, I noticed it was missing something-  The straps.</p>
<p>If you go to the website, you&#8217;ll notice that in the pictures of the product, this monstrous beast of a pillow-chair-thing has straps on the corners which snap together, allowing you to make it form into a chair.  This is why I&#8217;d chosen this product.  The versatility of having a crash pillow that turns into a chair, that can be picked up and chucked in a closet when not in use (so as to free up room), so that you can optimize for space or seating in the living room on the fly depending on how many people are over.  This is what made the Sumo Omni Plus a theoretical masterpeice-  All the reviews I read touted those straps as the killer feature, the thing that really set it apart from the regular omni.  But what I received in the mail wasn&#8217;t that masterpeice.  Instead, I got what amounts to a giant freakin&#8217; pillow.  Not that it isn&#8217;t an AWESOME pillow.  It&#8217;s still comfortable (even though the foam inside hasn&#8217;t finished expanding/settling-  it&#8217;s been less than 24 hours), and you can flip it on it&#8217;s side and sit on it in a comfortable, slightly goofy fashion.</p>
<p>After going over all the packaging twice to make sure that it wasn&#8217;t simply an external set of straps that I&#8217;d tossed aside accidentally, I called customer support this morning, and was pretty surprised to hear their explanation.</p>
<p>&#8220;The new model doesn&#8217;t come with straps.&#8221;</p>
<p>Excuse me?  So I basically just paid 50 bucks more for a regular Omni, only a little smaller and with a microsuade cover instead of rip-proof nylon?  The pictures on the website were still the model with straps.  This is where I honestly started to feel gipped, as we were pretty much matching the definition of &#8220;not as advertised&#8221;.  The next words out of my mouth were, as a software developer, words I never thought I&#8217;d ask.  &#8220;Can I exchange it for the older version, then?&#8221;  She said that the old version was sold out, but that she&#8217;d check with shipping to see if they had any left, and call me back.  I specified that I didn&#8217;t actually need them to send me a full new Omni Plus-  I only wanted a new cover, the one that came with straps.</p>
<p>I suppose, worst-case scenario, I can just exchange it for a Gamer instead.  Since the primary role is going to be as a chair and not a pillow, this seems like the logical substitute (also since it&#8217;s the exact same price).  However, I&#8217;m a little worried about the return policy, which states that returns must be pre-approved by the Customer Service Department (is &#8220;I was expecting your older model, not the new one where you took away the feature I most cared about&#8221;), not to mention instructions, which state that all returns must be made in original packaging.  This is a problem because the original packaging was vacuum-sealed, and the exposure to air has ballooned the end product into something much larger than one could ever hope to fit back into the box without the proper machinery.  To give you an idea, here&#8217;s a picture of the Omni, standing next to the box it was shipped in.</p>
<p><img src="http://farm4.static.flickr.com/3614/3316380609_86597b97cb.jpg" /></p>
<p>At the very least, I think they need to update the pictures on the website, and throw an article into their &#8220;news&#8221; section that specifies the change to the omni.  I have no idea what else is different in the &#8220;new version&#8221; of the omni plus-  God knows why they removed those straps, but having done so they at least have a responsibility to not advertise something with more features than what they&#8217;re actually providing.  As for sumo customers out there-  I&#8217;d ignore the omni plus until this gets addressed.  If what you want is primarily a crash mat, rock the straight Omni and save yourself 50 bucks.  If you want something that&#8217;ll primarily be used as a chair, you should probably lean toward the &#8220;gamer&#8221; model.</p>
<p>Still waiting on a response from customer service as to whether I can get the old cover, straps attached, that actually makes it worthy of the &#8220;Plus&#8221; moniker, or not.  I&#8217;ll let you know how that turns out.</p>
<p>-Alex</p>
]]></content:encoded>
			<wfw:commentRss>http://www.callingshotgun.net/uncategorized/mixed-feelings-on-the-sumo-omni-plus/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Top 5 signs you&#8217;re an internet cliche</title>
		<link>http://www.callingshotgun.net/geekery/top-5-signs-youre-an-internet-cliche/</link>
		<comments>http://www.callingshotgun.net/geekery/top-5-signs-youre-an-internet-cliche/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 18:08:13 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Geekery]]></category>

		<guid isPermaLink="false">http://www.callingshotgun.net/?p=84</guid>
		<description><![CDATA[You think being smart makes you better than everyone on the internet. You get angry and mean when others don&#8217;t acknowledge it. We all know the internet is full of dumbasses. Newsflash, you&#8217;re one of them. Being smart isn&#8217;t enough to set you apart around here. Welcome to the party. You type &#8220;M$&#8221; when referring [...]]]></description>
			<content:encoded><![CDATA[<h4>You think being smart makes you better than everyone on the internet.  You get angry and mean when others don&#8217;t acknowledge it.</h4>
<p>We all know the internet is full of dumbasses.  Newsflash, you&#8217;re one of them.  Being smart isn&#8217;t enough to set you apart around here.  Welcome to the party.</p>
<h4>You type &#8220;M$&#8221; when referring to Microsoft.</h4>
<p>Congratulations, you&#8217;re against the establishment!  Way to be a rebel, just like everyone else.  Showing contempt for a company that charges you for use of their hard work is kind of ridiculous, so if you&#8217;re a consumer, you&#8217;re being lame.  If you&#8217;re a linux hacker, you&#8217;ve got a leg to stand on, but you&#8217;ve also got a day job where they pay your salary by charging other people money.  And if you&#8217;re an Apple user, then, let&#8217;s face it, you&#8217;re being an epic hypocrite.  Before you go off on another rant about how bloated a Microsoft OS is, check out your mac&#8217;s price tag.</p>
<h4>You make constant references to anything someone with &#8220;geek cred&#8221; would know, in parantheses, ending in &#8220;anyone?&#8221; (slashdot/reddit commentors, anyone?)</h4>
<p>Often the committer of this particular sin is masking it as an on-topic reference.  This is not impressive.  But it is annoying.  It is especially egregious if you do this during one-on-one conversation.</p>
<p>BTW, I consider this to be <a href="http://www.codinghorror.com/">Jeff Atwood&#8217;s</a> only serious blogging sin.  I love that blog, but every time he does that I wince a little, just because I think he&#8217;s better than that.</p>
<h4>You Namedrop e-famous bloggers like Yegge, Atwood or Spolsky</h4>
<p>I just got called out on this one, by a friend who saw point #3.  Look, none of us are perfect.  That&#8217;s why it&#8217;s a cliche :D</p>
<h4>You&#8217;ve actually answered a &#8220;How do I do (this) in (this environment)?&#8221; question with &#8220;switch to (my environment of choice)&#8221;.</h4>
<p>This one is pretty generic.  So, examples!</p>
<p>Q:  How do I do (x) in PHP?<br />
A:  Switch to Rails  (In the history of the internet, the person who asked this one has never once gone &#8220;I talked to my boss, and convinced him you were right!  We&#8217;re scrapping 3 years of development to switch to a language/framework none of us know, on your say-so!  Everyone&#8217;s cool with it!  Hooray!&#8221;)</p>
<p>Q:  How do I do (x) in Windows?<br />
A:  Switch to *nix  (Because there&#8217;s no way the learning curve is going to become a bigger issue than the original problem, right?)<br />
Alternate A:  Switch to Mac (Often, in this case, the real answer in windows is to right click on something.  HA! I&#8217;m mostly kidding, though I&#8217;ve witnessed it in the wild)<br />
Non-existent A:  Worth mentioning, I&#8217;ve never seen anyone say &#8220;switch to windows&#8221; when asked the question in linux or apple forums.  You can interpret that any way you want, but I think it&#8217;s at least partially because the reaction of a windows user is something along the lines of &#8220;I don&#8217;t know.  I&#8217;m a windows user.&#8221;</p>
<p>Q:  How do I make my ford truck stop making this noise?<br />
A:  Switch to Chevy<br />
I&#8217;m not a car guy, but from I understand, in certain parts of the country, saying this out loud is a really bad idea.  Ah, the anonymizing power of the interwebs.</p>
<p>We&#8217;re all guilty of something.  Be it namedropping, inappropriate evangalizing, self-important rambling (Yeah, I&#8217;m talking to <a href="http://www.callingshotgun.net/geekery/top-5-signs-youre-an-internet-cliche/">you!</a>), none of us are perfect.  But I think a goal we can all agree on, an ideal we should continue to strive for, is this.</p>
<p>Don&#8217;t be <i>that guy</i></p>
<p>-Alex</p>
]]></content:encoded>
			<wfw:commentRss>http://www.callingshotgun.net/geekery/top-5-signs-youre-an-internet-cliche/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Making Your Webservice More Developer Friendly</title>
		<link>http://www.callingshotgun.net/geekery/making-your-webservice-more-developer-friendly/</link>
		<comments>http://www.callingshotgun.net/geekery/making-your-webservice-more-developer-friendly/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 23:43:53 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Geekery]]></category>

		<guid isPermaLink="false">http://www.callingshotgun.net/?p=77</guid>
		<description><![CDATA[I&#8217;ve been working on Migratr for around a year and a half now, and in that time have added support for 11 different webservices. Sometimes I&#8217;ve grabbed third party libraries designed for interacting with those API&#8217;s, other times I coded up the service-interaction layer myself, and I&#8217;ve gone through SOAP, Rest (via URL munging or [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working on <a href="http://www.callingshotgun.net/about/migratr/">Migratr </a>for around a year and a half now, and in that time have added support for 11 different webservices.  Sometimes I&#8217;ve grabbed third party libraries designed for interacting with those API&#8217;s, other times I coded up the service-interaction layer myself, and I&#8217;ve gone through SOAP, Rest (via URL munging or XML via post), JSON and in one case, even webscraping.  It&#8217;s been an immensely educational and rewarding experience, with degrees of difficulty varying from totally easy (23HQ, by copying the flickr API verbatim and changing only URL endpoints, took about an hour including testing) to ridiculously difficult (AOL Pictures might have been more popular if their API was more than lipservice).</p>
<p />
I can only speak to Photo-related web services, as that would be the area where I have the most experience.  But I think most web services &#8220;get it&#8221; with regards to an API-  By publishing an API, and enabling and encouraging developers to interact with your webservice, you&#8217;ve effectively given yourself a dev team larger than you could ever hope to afford.  Users passionate about your services, with ideas on how to extend and improve it, and the know-how to implement those great ideas.  More applications related to your website means more ways for users to interact with it, which means more chance of a &#8220;killer feature&#8221; written by a user of your service that ends up driving thousands of new users to you, any one of which can be a developer that continues the cycle.  It&#8217;s an upward spiral.</p>
<p />
But it takes more than just publishing an API.  You have to make your developers WANT to write stuff for your service.  Make it easy and enjoyable for them, and remove as many roadblocks and speedbumps as you possibly can so that they can complete their brilliant idea before throwing up their hands in frustration, or slowly, quietly losing motivation amidst a sea of vicious bugs, counter-intuitive behavior and documentation that either looks like it was written by Hemingway or run through babelfish.</p>
<p />
Given my relative experience in dealing with API&#8217;s en masse, I decided to compile a checklist for being developer-friendly.  Some of it is necessary.  Some of it is more along the lines of &#8220;helpful&#8221;.  Some of it is just wishful thinking.  But these steps will help you tenfold.</p>
<p />
<h2>Let developers know your API exists</h2>
<p>Publish a listing for your API on <a href="http://www.programmableweb.com">Programmable Web</a>, effectively giving the internet a cheat-sheet for your API-  Protocols (soap, json, etc), documentation links, fee information (free non-commercial, pay commercial?), 1st and 3rd party libraries.  You&#8217;ll get legions of volunteer devs through this site, who might not have even known your service existed.  Also, a &#8220;developers&#8221; link in the footer of your website is like gold.  It should link to a page providing the basic information:  API Sign-up process, documentation, etc. I don&#8217;t want to go trolling through support documentation or chat live with a customer service rep.  Just let me hit the ground running.</p>
<p />
<h2>The developer section of your site should be more than a couple pages.  It should be a microsite.</h2>
<p>In no particular order, this should include most (if not all) of:</p>
<ul>
<li>developer forums</li>
<li>some of your own developers monitoring and answering questions in the forums</li>
<li>API documentation</li>
<li>links to working third-party applications that use your API, or third-party libraries that access it</li>
<li>API news and updates, blog-style</li>
<li>a &#8220;My Profile&#8221; section showing me my own API keys, stored app descriptions and (unusual, but I consider this a bonus) usage statistics.</li>
</ul>
<h2>Don&#8217;t half-ass your API</h2>
<p>AOL Pictures API was little more than &#8220;Look at us, we have an API!&#8221; lipservice.  There&#8217;s no way to programmatically log-in and access private pictures, there&#8217;s no way to upload via the API, and the system for returning information about those pictures was unintuitive bordering on useless.  The API should be a programmatic reflection of what your web service is capable of.  On the complete opposite end of the spectrum from AOL, Flickr has an AMAZINGLY comprehensive API.  You can fine-tune not only what data, but how much of it you want returned. You could practically create a flickr clone using the flickr API as a backend.  (Disclaimer:  Morally and legally, that&#8217;s a really bad idea.)  Another bonus-points case:  Kristopher Tate (of <a href="http://www.zooomr.com">Zooomr</a> fame) once told me that the Zooomr website was a display layer built on top of the API.  I&#8217;m not asking you to do that, it&#8217;s a decision you have to make.  But we know for a fact that, in this case, it&#8217;s well-tested:D  It&#8217;s also based off the Flickr API, which means it&#8217;s super-easy to modify a Flickr app to make it Zooomr-compatible.  </p>
<p />
Another point, try to provide a few different options in terms of protocol.  At least two of SOAP, JSON, or straight-up REST.  Recently I came across an API that&#8217;s accessed via SOAP, but doesn&#8217;t provide a WSDL file.  That&#8217;s cruel.  I mean it, it gives me the distinct impression they dislike me personally:P  Seriously, though, different languages a way of making different protocols easier/harder.  Giving the option of parsing XML vs JSON, or providing a WSDL file and letting a code generator handle all that for you (a serious perk of client development in .NET) makes your API more language-agnostic and universally accessible. To summarize, the API should be stable, complete, flexible, and not counter-intuitive.</p>
<h2>API Documentation:  People actually read it.</h2>
<p>Again, Flickr comes to mind as a shining example.  Every method you call via their API has documented behavior on whether it needs the user to be authenticated, parameters, example of the response sent from the server, and possible error codes.  There should be a TOC of methods split up by category (for example: photos, albums, user groups, friend list, authentication) so I can quickly and easily hone in on exactly what I&#8217;m looking for.  Provide links to every third-party library that someone has written for accessing your service in a particular language.  </p>
<p />
Provide tutorials and walkthroughs, and if a third-party dev writes one too, link to that.  Throw in some sample code in a few popular languages (Java, c#, python, ruby, perl) so people know what the code should look like.  You don&#8217;t have to do this for every method.  I&#8217;d recommend doing this for the authentication step, as developers will be able to test this without getting anything else right first.  The net idea is that I should be able to get rocking with your API as soon as possible in the language of my choice, provided it&#8217;s a relatively common language (I don&#8217;t expect there to be a &#8220;Flickr Haskell Library&#8221;, for instance.  But I do expect a Java one).  Good documentation means your dev forums will be manageable.</p>
<h2>Dev Accounts</h2>
<p>I&#8217;m a little biased on this one, given that I interact with so many different webservices.  But of all the services I use, most have &#8220;pro&#8221; accounts that I need to be able to test against.  Some sites (major props to <a href="http://www.smugmug.com">SmugMug </a>and <a href="http://www.zenfolio.com">Zenfolio</a>) comp pro accounts to developers who have written software that interacts with their services, as a matter of practice.  Others will give the developer a one-year coupon upon request, while others don&#8217;t give us anything at all.  Software is going to need testing, and if I run into a free-account limit for uploading data to your webservice while testing my software, I&#8217;m either going to have to cough up money for the right to add value to your service, go through the lengthy process of clogging your database with test accounts, or wait a month until I can do more testing.  These are all roadblocks.  I&#8217;m trying to write something your users will appreciate.  Please don&#8217;t leave me hanging like this!  </p>
<p>One thing that I would *like* to see, that I haven&#8217;t yet, is a special developer account-  Not just a comped pro account, but a user account specific to developers.  This account could have behavior specific to testing my software, like</p>
<ul>
<li>API-Accessible switch between account types, like &#8220;free&#8221;,&#8221;standard&#8221;,&#8221;pro&#8221;,&#8221;super-mega-expensive-awesome-pro-account-of-extreme-justice&#8221;, in terms of toggling things like upload/download limitation that vary from account to account, to reproduce errors my users are seeing and test for different errors that might come up</li>
<li>None of the things I do via the API show up in &#8220;Latest activity&#8221; bar on front of site.  If I&#8217;m running tests, it would be good etiquette for me to be able to avoid what could be considered spamming</li>
<li>24-hour deletes or auto-rollbacks:  If it&#8217;s a test account, It&#8217;d be nice for me to be able to keep the account empty when I&#8217;m done testing, without writing housekeeping code on my end that just deletes everything.  This means I&#8217;m trying to take up less space on your servers.  I&#8217;m not saying this should be automatic, just we&#8217;d both be happier if I had the option.</li>
</ul>
<p>Sites that don&#8217;t hand out free pro accounts to developers could offer these up instead, and just cripple the accounts in ways that would only matter to an active user:  the 24 hour deletes could be mandatory, all data posted on a social site could be kept private and not visible to the community, etc.  The main point here is that while I totally dig on the incentives provided by the services whose API&#8217;s I interact with, it&#8217;s more important that I be able to test my software against theirs, fully and comprehensively.</p>
<h2>All this really matters, and so do your developer-users</h2>
<p>I know it sounds pretentious and self-important when I say that as a third-party developer, I&#8217;m adding value to your service just by coding something against your API, and thus you should make things as easy for me as possible.  Like I&#8217;m the kind of guy who always types &#8220;M$&#8221; when I mean Microsoft, or leaves obscure, nerdy references in parentheses followed by &#8220;anyone?&#8221; (Slashdot/Reddit commenters, anyone?).  But I swear I&#8217;m not being that guy.  I&#8217;m basing the idea that I&#8217;m adding value (or, in the case that I suck, the idea that someone else is adding value) off of the services I&#8217;ve seen flourish, and the ones I&#8217;ve seen wither and die.</p>
<p />
Yahoo Photos and AOL Pictures:  Half-assed API (Yahoo&#8217;s was even web-only, so you couldn&#8217;t write a desktop application for it).  Both deadpooled.</p>
<p />
Imagestation and Epson Photos:  No API.  Both Deadpooled.</p>
<p />
Flickr, SmugMug, Zenfolio, Phanfare, PicassaWeb:  Comprehensive, well-documented API&#8217;s with active developer communities, responsive staff and a wealth of resources for helping you get stuff done. Thriving.</p>
<p>In summation, in the words of Jerry McGuire, &#8220;Help me help you.&#8221;</p>
<p>Come on. I had to say it.  You know I did.</p>
<p>-Alex</p>
]]></content:encoded>
			<wfw:commentRss>http://www.callingshotgun.net/geekery/making-your-webservice-more-developer-friendly/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Migratr Reviewed on PCWorld.com!</title>
		<link>http://www.callingshotgun.net/geekery/migratr-reviewed-on-pcworldcom/</link>
		<comments>http://www.callingshotgun.net/geekery/migratr-reviewed-on-pcworldcom/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 16:50:22 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Geekery]]></category>
		<category><![CDATA[Migratr]]></category>

		<guid isPermaLink="false">http://www.callingshotgun.net/?p=68</guid>
		<description><![CDATA[Hello there friends! A bit of good news, Migratr got a very nice review on the pcworld.com website! Check it out here. Sorry for the lack of updates lately. I&#8217;ve been plugging away, but sometimes it&#8217;s hard to get to a stopping point where I can say &#8220;this is ready for release&#8221;. Will prob. have [...]]]></description>
			<content:encoded><![CDATA[<p>Hello there friends!  A bit of good news, Migratr got a very nice review on the pcworld.com website!  Check it out <a href="http://www.pcworld.com/downloads/file/fid,74309-order,1-page,1/description.html">here</a>.</p>
<p>Sorry for the lack of updates lately.  I&#8217;ve been plugging away, but sometimes it&#8217;s hard to get to a stopping point where I can say &#8220;this is ready for release&#8221;.  Will prob. have something up before the end of the year.  And, as a sidenote / friendly reminder, AOL Pictures closes on Dec. 31, so all you who use that service have just under a month to get your pictures and get out:)</p>
<p>-Alex</p>
]]></content:encoded>
			<wfw:commentRss>http://www.callingshotgun.net/geekery/migratr-reviewed-on-pcworldcom/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Killing the Fencepost in C#:  A handy code snippet</title>
		<link>http://www.callingshotgun.net/geekery/killing-the-fencepost-in-c-a-handy-code-snippet/</link>
		<comments>http://www.callingshotgun.net/geekery/killing-the-fencepost-in-c-a-handy-code-snippet/#comments</comments>
		<pubDate>Wed, 20 Aug 2008 04:11:06 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Geekery]]></category>

		<guid isPermaLink="false">http://www.callingshotgun.net/?p=39</guid>
		<description><![CDATA[A short while ago, a buddy was saying how learning Lisp had made him start thinking of everything in terms of map/reduce. As an example he gave me an example of a recent python snippet he&#8217;d written. return reduce(lambda l, r: l + seperator + r, (str(s) for s in values)) While I&#8217;m not going [...]]]></description>
			<content:encoded><![CDATA[<p>A short while ago, a buddy was saying how learning Lisp had made him start thinking of everything in terms of map/reduce.  As an example he gave me an example of a recent python snippet he&#8217;d written. </p>
<pre lang="python" style="margin:15px; height: 50px">
return reduce(lambda l, r: l + seperator + r, (str(s) for s in values))
</pre>
<p>While I&#8217;m not going to claim to be some sort of industry expert on the subject, and there are probably wikipedia entries and blog posts and Knuthian essays I haven&#8217;t read on the subject, this is pretty easily the most simple, elegant fencepost solution I&#8217;ve ever seen in my life.  There are no special cases, boundary case handling, seeding (ie, initialize the final string to the first element, then start the loop at the second).  It&#8217;s flexible, straightforward, relatively easy to understand to someone with a sufficient familiarity of lambdas.  It just does its thing and disappears.  </p>
<p>And then it occurred to me, since lambdas had been brought to c#, that this was suddenly within my power to accomplish as well.</p>
<p>I had certain goals in mind, as the snippet provided to me had set a serious benchmark.  I wanted it to be as general and flexible as possible-  It shouldn&#8217;t take only arrays, or only lists.  You should be able to throw any sort of collection at it that you want.  You also shouldn&#8217;t be restricted to only sending it Strings-  Might as well make it possible to send it a collection of numbers, or people, or pretty much anything you want.  This was more of a &#8220;hey, while we&#8217;re at it.&#8221;  Feature creep, I know, I know.  But it&#8217;s my exercise, and I&#8217;ll rock it as I see fit:D</p>
<p>Next, I wanted it to be as simple, elegant, and straightforward as possible.  To me, the most significant thing about the snippet was, as stated above, that there was no special case code, and no seeding.  You can develop an inferiority complex trying to make c# code as elegant as python code, because c# is a more verbose language.  It just requires you to be much more explicit about everything than python does-  Especially when it comes to LINQ and collections.  Brackets, parentheses and curly braces everywhere.  Still, I felt a degree of elegance was possible, and I was determined to find it.  What can I say, I was bored, have had minimal exposure to functional programming, and the idea intrigued me&#8230;</p>
<p>Here&#8217;s what I came up with.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">String</span> fencepost<span style="color: #000000;">&#40;</span>IEnumerable values, <span style="color: #FF0000;">String</span> seperator<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    IEnumerable<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">String</span><span style="color: #008000;">&gt;</span> strings <span style="color: #008000;">=</span> values.<span style="color: #0000FF;">Cast</span><span style="color: #008000;">&lt;</span><span style="color: #FF0000;">Object</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF;">return</span> strings.<span style="color: #0000FF;">Aggregate</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>x, y<span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> x <span style="color: #008000;">+</span> seperator <span style="color: #008000;">+</span> y<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>By way of explanation, LINQ is more an attempt at emulating SQL than functional programming.  So the rough FP -> .NET corollaries are &#8220;Map&#8221; -> &#8220;Select&#8221;, &#8220;Reduce&#8221; -> &#8220;Aggregate&#8221;.  Also, as a one liner it got way too complex to really be readable, so I split it up into two-  The first line creates a typed Enumerable of type String from a typed or untyped collection, for the second line to work with.</p>
<p>I also somewhat bundled up the whole thing as a full method, which you can copy-paste somewhere and call whenever you need it, choosing your seperator token on the fly (comma, period, space, whatever).  If, on the other hand, an in-line snippet is more your style, here&#8217;s a very straightforward one-liner (that assumes you have a typed collection)</p>
<pre lang="csharp" style="margin: 15px; height:70px">
  string seperator = ","; //Or whatever else you want to use
  string result = (String)foo.Aggregate((x, y) => x.ToString() + seperator + y.ToString());
</pre>
<p>Not quite as zen-like as the python version, but it has it&#8217;s own strongly-typed schwerve to it.  I consider this &#8220;Garage Sale&#8221; code- Not really complicated enough to license it, so just copy/paste to your heart&#8217;s content.  Enjoy:)</p>
<p>-Alex<br />
 <script type="text/javascript">var dzone_url = 'http://www.callingshotgun.net/geekery/killing-the-fencepost-in-c-a-handy-code-snippet/'; var dzone_title = 'Killing The Fencepost in C#:  A handy Code Snippet'; var dzone_blurb = 'A simple, straightforward example of how to use Functional Programming facilities in .NET to provide an elegant, generic, one-size-fits-all fencepost solution'; var dzone_style = '1';</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.callingshotgun.net/geekery/killing-the-fencepost-in-c-a-handy-code-snippet/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Lines Of Code &#8211; Dispelling The Myths</title>
		<link>http://www.callingshotgun.net/geekery/lines-of-code-dispelling-the-myths/</link>
		<comments>http://www.callingshotgun.net/geekery/lines-of-code-dispelling-the-myths/#comments</comments>
		<pubDate>Sun, 23 Mar 2008 17:39:19 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Geekery]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[lines of code]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.callingshotgun.net/geekery/lines-of-code-dispelling-the-myths/</guid>
		<description><![CDATA[You see stuff related to Lines Of Code (LOC) everywhere on programming blogs. People discussing it as a metric of project size, or of programmer productivity, often drawing conclusions in absolutist tones such as &#8220;fewer lines of code means less bugs&#8221;. I&#8217;m writing today to dispute the idea that anything related to LOC is absolute. [...]]]></description>
			<content:encoded><![CDATA[<p>You see stuff related to Lines Of Code (LOC) everywhere on programming blogs.  People discussing it as a metric of project size, or of programmer productivity, often drawing conclusions in absolutist tones such as &#8220;fewer lines of code means less bugs&#8221;.  I&#8217;m writing today to dispute the idea that anything related to LOC is absolute.  And I&#8217;m going to do it one myth at a time.</p>
<h4 style="text-align: center">LOC As A Metric of Accomplishment or Project Size</h4>
<p>This one is old, and most experienced programmers now officially reject it outright.  But still, I feel it worth repeating:  The number of LOC you write in a single day is worthless as a metric of what you accomplished that day.  After all-  If someone wrote a 1000 line class in a single day, and you wrote the same class in 500 lines (and maybe tossed in a little extra functionality while you were at it), who was more productive?</p>
<p>As a metric of project size,  it makes a little more sense, but just barely- The <a href="http://en.wikipedia.org/wiki/Source_lines_of_code" title="Wikipedia:  Lines Of Code">Wikipedia article</a> on LOC mentions that &#8220;Many useful comparisons involve only the order of magnitude of lines of code in a project.&#8221;  That at least makes a little sense.  One can reasonably assume that the  same set of programmers, using the same language, will be able to accomplish more with 10000 lines of code than with 1000.</p>
<h4 style="text-align: center">Ambiguity:  Too Many Ways To Count</h4>
<p>The next issue is this:  How do you COUNT lines of code?  That same Wikipedia article linked above has an interesting example:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">100</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;hello&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* How many lines of code is this? */</span></pre></div></div>

<p>How many lines is that?  One for the line?  Two for logical seperation of forloop and print statement?  What if you  wrap the line in curly braces, one on each line, and move the comment to it&#8217;s own line, so it looks more like</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">100</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #808080; font-style: italic;">/* How many lines of code is this? */</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;hello&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Did you see that?  I just took one line of code, and turned it into 5!  Things get so much more confusing than stylistic issues like this, though.  What about libraries?  What about frameworks?  Jeff Atwood wrote a post a couple of months ago wherein he mentioned that the original version of Basecamp had been written in <a href="http://www.codinghorror.com/blog/archives/001043.html" title="Basecamp in 600 Lines">only 600 lines of code.</a>  Given that Basecamp was written using Ruby on Rails, which handles all sorts of crazy things for you, I think the more honest metric would have to be the 600 lines of basecamp, plus however large the RoR framework is,  plus the code RoR generated for them when they started the project.  Money says it&#8217;s more than 600 lines.</p>
<p>I&#8217;ll give you another example.  Currently, the amount of code I&#8217;ve written for Migratr is 5000 lines and change.  However, Migratr uses <a href="http://www.codeplex.com/flickrnet/" title="FlickrNet .NET Library">FlickrNet</a>, a popular .NET library for interacting with the Flickr API.  FlickrNet, if you download the source, is more than 12,371 lines of code (according to the unix util &#8220;wc&#8221;).  I&#8217;ve also incorporated a few other libraries, all of which are linked in Migratr&#8217;s &#8220;about&#8221; page.  Why?  Because I didn&#8217;t want to write those 12,000 lines.  Someone already had, and they did a fantastic job of it, and I didn&#8217;t see any point in re-inventing the wheel.  So the total code involved in Migratr is, at this point, more than 17,000 lines.  I&#8217;ve written 5,000 of them, and I&#8217;m the sole developer of Migratr.  But I wouldn&#8217;t dream of saying &#8220;I built this application that interacts with a whole slew of online photo services and migrates all your photos and does all this neat stuff, and it was only 5,000 lines!&#8221;  No.  MY contribution was 5000 lines, but Migratr depends on a lot more than that.</p>
<p>The point being, <em>where do you draw the line</em>?  Is Migratr a 5000+ LOC project?  or 17,000+?  Do you only count LOC if you have access to the source of the library you&#8217;re using?  Do you only count the code written for your specific project?  Could I export Migratr&#8217;s backend as a library and let someone write</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> migrate<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">String</span> filepath<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
ImportFromSource<span style="color: #000000;">&#40;</span>Services.<span style="color: #0000FF;">Flickr</span>, filepath<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
exportToDestination<span style="color: #000000;">&#40;</span>Services.<span style="color: #0000FF;">SmugMug</span>, filepath<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Did you see that?  My whole project was just replaced!  Some twerp in a garage somewhere just re-wrote Migratr in 5 lines of code!  It doesn&#8217;t matter that it depended on my 5,000 line library, which depends on (among others) 12,000 lines of the Flickrnet library.  You only saw 5 lines.  It was only 5 lines.<br />
But clearly, since 5,000 is more than 5, I can at least say that I was more productive.</p>
<h4 style="text-align: center">The relationship between line count and bug count only goes so far</h4>
<p>The idea that &#8220;Less lines of code mean less bugs&#8221; is some sort of universal absolute is the biggest of all the LOC myths.  In a desperate effort to nullify your &#8220;oh snap, time for a flamewar&#8221; reflex, I&#8217;m going to add a couple of disclaimers before I get into this.  Any reference I make to a programming language is not an attack on that programming language, just an attack on the abuse of that language.  Also, I realize that reducing the amount of code required for a specific task can help reduce the bug count, but only so far.  I&#8217;m saying there&#8217;s a limit to this.  Here&#8217;s the line I want to draw for you.</p>
<p><strong>Reducing the code involved in a task will only help reduce the bug count IF THE PROCESS MAKES THE CODE MORE READABLE.</strong>   Past that, you&#8217;re probably creating lines of code that do more than one thing per line, and thus increasing the number of bugs possible per line of code.</p>
<p>Perl programmers are especially frightening in this regard.  I really love PERL and use it instead of shell scripting languages such as BASH whenever possible, but there&#8217;s something in the PERL culture that demands it&#8217;s programmers to try and do something in the fewest number of characters possible.  There&#8217;s even a name for this as a sport-  It&#8217;s referred to as &#8220;Perl Golf&#8221;.</p>
<p>Really quick, can you tell me what this is?</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #339933;">-</span>pl <span style="color: #000066;">s</span><span style="color: #339933;">!.!</span><span style="color: #000066;">y</span><span style="color: #0000ff;">$IVCXL426</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">-:</span><span style="color: #0000ff;">$XLMCDIVX</span><span style="color: #0000ff;">$dfor</span>$<span style="color: #0000ff;">$_</span><span style="color: #339933;">.=</span>5x<span style="color: #0000ff;">$&amp;</span><span style="color: #339933;">*</span><span style="color: #cc66cc;">8</span><span style="color: #339933;">%</span>29628<span style="color: #339933;">;</span><span style="color: #0000ff;">$$</span><span style="color: #0000ff;">$_</span><span style="color: #339933;">=</span><span style="color: #0000ff;">$_</span><span style="color: #339933;">!</span>egfor<span style="color: #339933;">-</span>4e3<span style="color: #339933;">..</span><span style="color: #000066;">y</span><span style="color: #339933;">/</span>iul<span style="color: #339933;">-</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">/-</span><span style="color: #0000ff;">$+</span> <span style="color: #339933;">/</span><span style="color: #0000ff;">%s</span><span style="color: #ff0000;">''</span><span style="color: #0000ff;">$'</span><span style="color: #339933;">;</span><span style="color: #0000ff;">*_</span><span style="color: #339933;">=</span><span style="color: #000066;">eval</span></pre></div></div>

<p>I&#8217;ll give you a hint-  It&#8217;s not a cat walking across my keyboard.  If that was your first guess, though, we&#8217;re at least on the same page.   This was the winning entry in a game of Perl Golf:  The problem was to write a Roman Numeral Calculator in the fewest characters possible.  Submissions can be found <a href="http://www.fonality.com/golf/post_mortem.cgi?id=1" title="Perl Golf:  The Roman Numeral Calculator">here</a>.  Now, this is an amazing piece of code.  The person who wrote it is clearly very skilled.  The fact that Perl makes code like that possible is pretty impressive.  The problem here is that people write code like this outside of PERL golf, and think to themselves, &#8220;it&#8217;s only one line, so it must have fewer bugs than a 50 line solution&#8221;.  Really?  Because if I had to debug one, I&#8217;d have definitely gone with the 50 line solution.  And don&#8217;t tell me that that one line of code worked on the first, second, or 5th try.  The 50+ line solutions might have, but not that catwalk.<br />
Writing unmaintanable code does not reduce the bug count for a project.  A friend of mine coined a term for code like that-  &#8220;Write-Only Code&#8221;- a takeoff on the permissions you can set with chmod.  Think about it:  Readable, writeable, and executable.  Shouldn&#8217;t code be all three?</p>
<p>Another quick example:</p>
<pre>(0/:l)(_+_)</pre>
<p>The first time I saw this snippet, I thought someone was, via emoticons, trying to re-enact the facial expression one wore when seeing &#8220;Goatse&#8221; for the first time.  It&#8217;s not actually a story told by emoticon.  It&#8217;s a piece of scala code that sums the elements in a list.  And I just don&#8217;t see it as having been easier to write than a forloop.  It&#8217;s definitely not as maintainable.  This piece of code, actually, prompted a conversation with a friend about holding a &#8220;code or emoticon&#8221; contest, but we really couldn&#8217;t come up with any serious contenders to this one.  Maybe some Perl Golfers could throw their hat in the ring?</p>
<p>I want to state too, that for this section, I&#8217;m well aware that I didn&#8217;t provide buggy one-liners.  I provided working one-liners.  This is because I was trying to emphasize, the point isn&#8217;t if it works or not-  The point is if you can tell by looking at it what it should do.  If you can&#8217;t, it&#8217;s unmaintainable.  If it&#8217;s unmaintanable, then even if it works the first time, it&#8217;ll produce a slew of bugs as soon as anyone tries to modify it.</p>
<p>So, in essence-  Stop paying attention to Lines of Code.  They&#8217;re impossible to count in any useful way.  They&#8217;re a crappy metric of project size or personal accomplishment.  And they don&#8217;t control how many bugs your code has.  You do.</p>
<p>-Alex</p>
]]></content:encoded>
			<wfw:commentRss>http://www.callingshotgun.net/geekery/lines-of-code-dispelling-the-myths/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>The Software Approach to Flyswatters.</title>
		<link>http://www.callingshotgun.net/geekery/the-software-approach-to-flyswatters/</link>
		<comments>http://www.callingshotgun.net/geekery/the-software-approach-to-flyswatters/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 19:16:19 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Geekery]]></category>

		<guid isPermaLink="false">http://www.callingshotgun.net/geekery/the-software-approach-to-flyswatters/</guid>
		<description><![CDATA[Adam: in other words it&#8217;s a sledgehammer for swatting flies. A sledgehammer with lots of knobs and dials on it that all must be set for its user&#8217;s height and weight, and the age in hours and zodiac sign of the fly you&#8217;re swatting. Adam: This seems to be common in microsoft tools and APIs. [...]]]></description>
			<content:encoded><![CDATA[<p><!-- google_ad_section_start(weight=ignore) --><br />
 <span style="color: red">Adam:</span> in other words it&#8217;s a sledgehammer for swatting flies. A sledgehammer with lots of knobs and dials on it that all must be set for its user&#8217;s height and weight, and the age in hours and zodiac sign of the fly you&#8217;re swatting.</p>
<p><span style="color: red">Adam:</span> This seems to be common in microsoft tools and APIs.</p>
<p><span style="color: blue">Alex:</span> With random pitfalls.  &#8220;I&#8217;m sorry, but you&#8217;re exactly 2^8 &#8211; 1 pounds and the fly is a gemini.  Please update your sledgehammer for compatibility.&#8221;</p>
<p><span style="color: red">Adam:</span> hahah</p>
<p><span style="color: red">Adam:</span> yeah</p>
<p><span style="color: red">Adam:</span> or worse, &#8220;Yeah that&#8217;s a known issue, but we&#8217;ll have it fixed for the next version and you can buy that.&#8221;</p>
<p><span style="color: blue">Alex:</span> Months later Linus Torvalds posts an essay on his new project, a normal-sized hammer for swatting flies, which can easily be modified for swatting mosquitos, provided the mosquitos astrological sign has a compatible license, therefor sledgehammers are evil.</p>
<p><span style="color: red">Adam:</span> There&#8217;s also question of whether or not the normal-sized hammer infringes on one or more hammer-related patents, but nobody will talk about what those patents are. Flames fly, large businesses invest in the continued future of the normal-sized hammer. Meanwhile users and developers alike still don&#8217;t have what they need: a flyswatter.</p>
<p><span style="color: blue">Alex:</span> lol</p>
<p><span style="color: red">Adam:</span> Bloggers claim the normal-sized hammer isn&#8217;t ready for the workshop.</p>
<p><span style="color: blue">Alex:</span> Usability questions arise.  The normal-hammer camp will cry that theirs is a &#8220;More lightweight solution&#8221;, and while normal users don&#8217;t have nearly the level of accuracy required to use it effectively without smashing their thumbs, evangelists will claim that &#8220;Well, they just need to bite the bullet and learn to swing a hammer effectively.&#8221;  The sledgehammer camp will point out the greater surface area and imply that if you can&#8217;t swing it, you need to work out more until you have the necessary muscle mass to swing the sledgehammer effectively.  At which point, as an added feature, you&#8217;ll be able to smash everything around you into oblivion.</p>
<p><span style="color: blue">Alex:</span> They will also point out that flyswatters do not have this property.</p>
<p><span style="color: blue">Alex:</span> And, through clever marketing, imply that all walls need smashing, and thus flyswatters simply don&#8217;t fulfill the user&#8217;s needs.</p>
<p><span style="color: red">Adam:</span> Plus, as everyone currently uses sledgehammers, they become frustrated when the normal-sized hammer doesn&#8217;t work quite the same way, yet they constantly complain about their sledgehammers holding their hands too much.</p>
<p><span style="color: red">Adam:</span> Sledgehammer &#8220;power users&#8221; are known for circumventing the thumb-smashing protections because they think it makes them work more effectively.</p>
<p><span style="color: red">Adam:</span> They complain that the thumb-protections are included at all because they don&#8217;t use them and things like that are why the sledgehammer is so bloated.</p>
<p><span style="color: blue">Alex:</span> Apple will release homes outfitted with mosquito nets.  Elitists will smugly claim that the problem has been solved.  Both hammer camps will roll their eyes at the idea that buying a new house is the solution to a fly problem</p>
<p><span style="color: red">Adam:</span> The mosquito-net houses aren&#8217;t compatible with the new sledgehammer addon. Mosquito-net house owners don&#8217;t care because they don&#8217;t need it, but hammer aficionados continue to cite this incompatibility as a reason why mosquito-net houses are, and always have been toys.</p>
<p><span style="color: blue">Alex:</span> Eventually a small independant developer releases a flyswatter.  Panic-stricken, the sledgehammer company purchases the flyswatter IP from the developer, and adds the flyswatter mesh to the handle of the hammer.  Evangelists rejoice, competitors once again roll their eyes.  Users wonder what the hell just happened.</p>
<p><span style="color: red">Adam:</span> Meanwhile some guy in his basement publishes blueprints of how to build a normal-hammer modification making it compatible with the new sledgehammer accessory. Normal-hammer users rejoice and claim this as a strength of their platform. Sledgehammer users scoff and say, &#8220;you have to build it yourself?? Not ready for workshop!&#8221;</p>
<p><span style="color: red">Adam:</span> Mosquito-net house owners have been in their houses watching fly-free movies this whole time, but nobody listens to those elitist pricks anyway.</p>
<p><span style="color: blue">Alex:</span> Normal hammer users ask the honest question of how the hammer head flying lose from the handle when swung can possibly be classified as &#8220;ready for workshop&#8221; in the first place.  They are immediately dismissed as trolls</p>
<p><span style="color: red">Adam:</span> Because after all, if the hammer head flies loose from the handle you&#8217;re clearly an idiot for not knowing that you had to hold the third switch from the bottom with your pinky finger as you swing in order to make the hammer head stay in place.</p>
<p><span style="color: red">Adam:</span> Because come on, you&#8217;d have to be a total hammer n00b to not know that.</p>
<p><span style="color: blue">Alex:</span> The normal-hammer camp announces that their hammer has no buttons.  The sledgehammer camp cites this as a missing feature</p>
<p><span style="color: blue">Alex:</span> After all, how do you keep the head on the handle without that button?</p>
<p><span style="color: red">Adam:</span> The button by the way is a third-party addon. Usually there&#8217;s a trial button shipped with new sledgehammers, but you have to pay a yearly subscription to keep it working right. The sledgehammer manufacturer would include the button to begin with if it weren&#8217;t for the fact that the third party would sue for abusing monopoly power.</p>
<p><span style="color: red">Adam:</span> Many sledgehammer users in practice don&#8217;t know this and continue to use their trial buttons past the expiration date, blaming the sledgehammer manufacturer when the hammer head flies off.</p>
<p><span style="color: red">Adam:</span> Sledgehammer power users dismiss them as idiots and say it&#8217;s not the sledgehammer&#8217;s fault.</p>
<p><span style="color: blue">Alex:</span> The modding community releases an intriguing solution involving duct tape and industrial strength rubber bands.  This leads to the sledgehammer company suing rubber band manufacturers</p>
<p><span style="color: blue">Alex:</span> The duct tape community, on the other hand, is purchased.  A layer of duct tape now covers the flyswatter mesh in the sledgehammer handle, or will once you upgrade to the next version.</p>
<p><span style="color: blue">Alex:</span> The mosquito net manufacturer, to everyone&#8217;s surprise, releases a flyswatter.  Unfortunately, you can only use it in a mosquito-net home.</p>
<p><span style="color: red">Adam:</span> Someone comes out of the woodwork claiming that he has a patent on wooden handles. The sledgehammer has long used wooden handles and faces a problem. The normal-hammer camp releases instructions the next day about how to replace your wooden handle with a piece of steel pipe from home depot, and all new normal-hammers will use this new method. Normal-hammer users complain that the slick metal gets sweaty and is hard to hold, but these claims are dismissed with, &#8220;if you want a hand grip, make it yourself.&#8221;</p>
<p><span style="color: blue">Alex:</span> Everyone, the normal-camp-hammer users decide, either has the proper machining in their garage to make a decent rubber grip, or shouldn&#8217;t be using normal-hammers in the first place.</p>
<p><span style="color: blue">Alex:</span> This is in direct conflict with &#8220;Everyone needs to bite the bullet and switch over to normal hammers because they&#8217;re free.&#8221;</p>
<p><span style="color: red">Adam:</span> Somehow normal-hammer users don&#8217;t see these two things as being mutually exclusive though and don&#8217;t see what the big deal is.</p>
<p><span style="color: blue">Alex:</span> Cost-analysis by several third parties takes place, as a result of curiosity as to if, at this point, normal hammers are still a cost effective solution.</p>
<p><span style="color: blue">Alex:</span> Everyone looks to the flyswatters that can only be used in mosquito-netted homes.  Crumbling under public pressure, the license is reconsidered.  You can now use the flyswatter in non-mosquito-net homes, but only three designated homes per flyswatter.</p>
<p><span style="color: red">Adam:</span> Cost analysis is later made even more muddled by the fact that the sledgehammer manufacturer has been selling &#8220;upgrade insurance&#8221;, promising &#8216;free&#8217; upgrades to your sledgehammer for the life of the policy. Sledgehammer manufacturer then proceeds to release no new sledgehammer revisions for the life of a policy cycle.</p>
<p><span style="color: blue">Alex:</span> Mosquito-net-home users rejoice and evangelize this as the perfect solution, because having no social lives (as a tragic side effect of being elitist wankers), they&#8217;ve never been to more than three homes.</p>
<p><span style="color: blue">Alex:</span> Hammer optimization continues.<br />
<!-- google_ad_section_end --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.callingshotgun.net/geekery/the-software-approach-to-flyswatters/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Potential of OpenID, why we&#8217;re not there yet, and why Videntity is close.</title>
		<link>http://www.callingshotgun.net/geekery/the-potential-of-openid-why-were-not-there-yet-and-why-videntity-is-close/</link>
		<comments>http://www.callingshotgun.net/geekery/the-potential-of-openid-why-were-not-there-yet-and-why-videntity-is-close/#comments</comments>
		<pubDate>Mon, 04 Jun 2007 21:47:47 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Geekery]]></category>

		<guid isPermaLink="false">http://www.callingshotgun.net/geekery/the-potential-of-openid-why-were-not-there-yet-and-why-videntity-is-close/</guid>
		<description><![CDATA[I recently fell in love with OpenID. Or at least, what I believe OpenID could _someday be_. The essential idea, decentralized identity management- Being constantly signed in to all your services at once, being able to sign up for new services on the fly without keeping track of yet another username/password, and most important of [...]]]></description>
			<content:encoded><![CDATA[<p>I recently fell in love with OpenID.  Or at least, what I believe OpenID could _someday be_.   The essential idea, decentralized identity management-  Being constantly signed in to all your services at once, being able to sign up for new services on the fly without keeping track of yet another username/password, and most important of all, biggest of all&#8230; Being able to take your reputation with you.  Being able to to say, &#8220;Yes, I&#8217;m that guy from that service.  No, I&#8217;m not just ripping off his username and pretending.&#8221;  Being defined by something you take with you.  I mean, crap, man!  That&#8217;s amazing!</p>
<p>Or, it would be.  I think, soon, it will be.  But there are two major hurdles that need to be addressed before OpenID is free to fulfill its potential and change the way we use the internet.  And I really mean that.  Not in that AJAX way where &#8220;change the way we use the internet&#8221; meant we could finally stop hitting the refresh button.  That was awesome.  But that just changed the way we use our _browser_.  I&#8217;m talking the internet.</p>
<p>ANYWAY:  The two things that need amending.</p>
<p>* Sites need to step up and become consumers, not just providers.</p>
<p>* They need to understand the potential of decentralized</p>
<p>It seems like there are more OpenID providers out there than consumers.  I think I have 4 at this point.  &#8220;ClaimID&#8221;:http://www.claimid.com  gave me one when I signed up for their service, whereas &#8220;Livejournal&#8221;:http://www.livejournal.com  and &#8220;AOL&#8221;:http://www.aol.com simultaneously decided, &#8220;You can use us as your universal identity!&#8221;.  ClaimID is the only one of the lot that&#8217;s a consumer.  They&#8217;re the weirdest one.  You sign up with an OpenID, get your account, and they GIVE you an OpenID.  The openid I actually use is hosted &#8220;elsewhere&#8221;:http://www.myopenid.com and proxied through so I can use this site as my ID.  But I can&#8217;t use it to login to the aol website.  I can&#8217;t use it to login to my livejournal account and make posts (though I can set it up as a seperate identity to leave comments).  Someday, I&#8217;d like to be able to write my posts in livejournal (or, WordPress, which thusfar has the same attitude on being a &#8220;consumer&#8221;.  Etc.</p>
<p>The other major thing.  This decentralized identity system, as awesome as it is&#8230;  has so far been used primarily in a bunch of centralized services.  Think how awesome it would be to create a decentralized social network.  Have a list of people you know, and how you know them, attached to your OpenID.  Then when you register for facebook, or myspace, or Vox, or Orkut, you login with your OpenID.  And the service goes to that page, scans for your friend network, spiders a little to make sure the relationship is mutual, and BAM-  All the friends who use that service are automatically added as your friends.  Of course, some small degree of centralization is required.  Myspace, for instance, would have to store how much you trust these people, to determine if they can view your private blog posts, whatever.  But by and large, your network exists outside, and the service imports it.   Possible.  VERY possible.  Not yet implemented.    &#8220;Videntity&#8221;:http://www.videntity.org is one service that&#8217;s come close.  They let you store your relationships with people WITH THEM.  And that&#8217;s after you sign up for an account.  Will they accept OpenID?  No.  But they&#8217;ll give you one.</p>
<p>But that goes against the _style_ of OpenID.  You&#8217;re supposed to be able to store it where you want.  Provide it yourself, or backend the technical side away.  If Videntity were to adopt a more &#8220;WordPress&#8221; attitude towards the whole thing&#8230; You know, &#8220;Host it yourself.  If that&#8217;s over your head, we&#8217;ll take care of it for ya.&#8221;, that would be a vast improvement.   If Videntity let you log in to their service with someone else&#8217;s OpenID and didn&#8217;t try to make you use theirs-  Another improvement.  If their social network system (which you point out from the inside, but not in from the outside) could interact with other servers according to some api or protocol (Perhaps something more decentralized&#8230; But where, were would we find a decentralized authentication system?)&#8230; Than that would be perfect.  That, that I would use.</p>
<p>If I&#8217;m wrong on any of this (As is often the case), please assault me in the comments below.  Especially if you know of any services out there which utterly disprove my arguments.  I really wouldn&#8217;t mind being wrong, here:P</p>
<p>Cheers,</p>
<p>-Alex</p>
]]></content:encoded>
			<wfw:commentRss>http://www.callingshotgun.net/geekery/the-potential-of-openid-why-were-not-there-yet-and-why-videntity-is-close/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>5 proprietary apps:  An update</title>
		<link>http://www.callingshotgun.net/geekery/5-proprietary-apps-an-update/</link>
		<comments>http://www.callingshotgun.net/geekery/5-proprietary-apps-an-update/#comments</comments>
		<pubDate>Fri, 01 Jun 2007 05:04:33 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Geekery]]></category>

		<guid isPermaLink="false">http://www.callingshotgun.net/uncategorized/5-proprietary-apps-an-update/</guid>
		<description><![CDATA[I knew that my last post was bound to inspire some criticism. However, I&#8217;m new enough at this that I haven&#8217;t yet adopted the jaded &#8220;everyone who disagrees is a troll, so I should just ignore them and move on&#8221; attitude. At least not yet, no promises for the future:) Actually, some of you had [...]]]></description>
			<content:encoded><![CDATA[<p>I knew that my last post was bound to inspire some criticism.  However, I&#8217;m new enough at this that I haven&#8217;t yet adopted the jaded &#8220;everyone who disagrees is a troll, so I should just ignore them and move on&#8221; attitude.  At least not yet, no promises for the future:)</p>
<p>Actually, some of you had some really good points, and I&#8217;d like to address those.  I&#8217;m going to combine hear and there, because some of the arguments are related.</p>
<p>_I never defined &#8220;better&#8221;, better is subjective, and ultimately this is really just my opinion_</p>
<p>This is all absolutely correct.  I think I missed the mark on conveying my original intention, which was this:  There are a lot of lists out there exactly like mine, but in the opposite direction.  I&#8217;ve never seen a &#8220;top 5 alternatives to open source software&#8221; before, and had been noticing an increase in the amount of closed-source-company bashing that takes place, with claims of &#8220;buggy&#8221;, &#8220;bloated&#8221;, etc, and then listing, as an alternative, open source applications which were just as bad.  It felt like people had stopped looking at the software, and just at the license.  Judging the book by it&#8217;s cover, if you will.  I thought it would be fun to parodize the trend a little bit, while simultaneously getting to play the devil&#8217;s advocate and rise to the defense of what I genuinely believe to be quality software.</p>
<p>_OpenOffice isn&#8217;t written in Java.  Do your homework, you moron._</p>
<p>Okay, nobody called me a moron.  Though, still, I kind of felt like one.  In my defense, though, it&#8217;s a pretty widely spread rumor.  Yes, I should have done my homework.  But all I can ask is, if it had been suggested to you that you download &#8220;OpenOffice, written in Java&#8221;, OO&#8217;s wikipedia page had a section on Java controversy, and there were links on the OO website to Java API, and you didn&#8217;t know it was written in C++&#8230;  Would you have looked at the source code to verify that it was, in fact, written in Java?  Think about it.  And not just in a &#8220;If I say yes, then you&#8217;re wrong, so, yes&#8221; kind of way.  Really, in your head, go through the paces.  If you still say yes at the end of it, then, well, I fold.  You&#8217;re better than I.</p>
<p>_&#8221;Better Than I&#8221; doesn&#8217;t mean anything if you still haven&#8217;t defined better._</p>
<p>Shut up.  Troll.</p>
<p>_I&#8217;m a troll_</p>
<p>You&#8217;re a troll times 10.</p>
<p>_Comparing Windows and *nix is like comparing apples and headphones, and I didn&#8217;t really explain Windows over OS X_</p>
<p>First, Windows VS *nix.  Several compelling arguments, here.   Some of this was a failing on my part-  By trying to suppress a rant (I _did_ believe I said I could write a whole other entry on this) I didn&#8217;t convey my point in all this properly.  When I chose Windows over unix/linux, I neglected to mention that I meant for the desktop, for day-to-day-use.  As pointed out in comments, Linux is a great environment for developers.  I&#8217;ll agree with that-  It&#8217;s a very developer-centric platform.  I&#8217;d go so far as to say Linux is like a virtual playground for developers.  Its uptime and stability also lend itself exceptionally well to running servers.  However, there are several elements of the user experience where it doesn&#8217;t measure up to Windows.  While Gentoo might have me a little biased, it really feels like hardware support in Linux is a crapshoot, where you can tilt the odds slightly in your favor with a few hours trolling user forums and recompiling the kernel.  With Windows, you look for the &#8220;Windows&#8221; symbol on the box, and you install the drivers that came in the box.  3rd party software installation is also a trip- You can either only use software popular enough to be in that distro&#8217;s repository, or you can download and compile source code through some arcane commandline voodoo unknown to non-developers.  With Windows?  You download the setup file.  You execute it, you click okay a lot.  And at the end of it all, there are no library conflicts.  You can double click it.  With Windows, you can do a whole lot and never, ever have to see a command line again.   My reasons for choosing Windows over OS X, as pointed out, were more or less arbitrary.  I&#8217;ll say it again&#8230; Like the lists I set out to parody, this one WAS subjective.  There are a lot of things to like about OS X, but I find the implementation of Finder genuinely painful.  I don&#8217;t like having to hit 3 or 4 buttons in order to copy the screen to the clipboard.  I can&#8217;t copy/paste with my pinky and forefinger, and neither double-finger-tapping the touchpad nor command-click pass for (or even remotely excuse the lack of) a right mouse button on the laptop.  Which would be okay if I could install OS X on a dell or something, but, so far, that&#8217;s just not possible.</p>
<p>_Textpad is not, in fact, the Bee&#8217;s Knees._</p>
<p>Lies and misconceptions!  Kidding.  I really did claim that I was a Textpad zealout.  I know I&#8217;m totally biased in the matter, and I also know that when it comes to a &#8220;Programmer&#8217;s Editor&#8221;, every programmer has a favorite, and we all think that ours is somehow empirically the best.  Aside from the swath of features considered prerequisite for any good &#8220;Programmer&#8217;s Text Editor&#8221;(syntax highlighting, multiple document support, line numbering, what have you), The main reasons I find Textpad superior are it&#8217;s _slick_ multiple document interface, multiple file search-and-replace, and above all, that external tool support.  There was a little confusion on this last one, so pardon the zealoutry while I elaborate.  I&#8217;ll try not to go all mac-zealout &#8220;shepard the lost&#8221; on you.  The external tool support isn&#8217;t JUST compiling/running java with one click.  It&#8217;s that you can point Textpad to any executable on your system, and have Textpad open the currently open file with that external tool.  So if you have gcc, you can compile in textpad.  If you have python/ruby, you can run a python or a ruby script from textpad.  Not to mention it captures the output as a seperate textfile for you.  And best of all, you can save that &#8220;run open file with this program&#8221; thing to a shortcut.  Ctrl+number.  It&#8217;s an amazing contribution to workflow.  Vim is great if you don&#8217;t have a mouse.  JEdit is, actually, pretty slick, and I think I&#8217;m going to look into it a little more.  But my top spot for text editor really has to go to Textpad, for interface, featureset, simplicity and power.  If you don&#8217;t agree, I totally understand.  Feel free to write your own list:P</p>
<p>-Alex</p>
]]></content:encoded>
			<wfw:commentRss>http://www.callingshotgun.net/geekery/5-proprietary-apps-an-update/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
