<?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>incompl - Greg Smith&#039;s Web Design and JavaScript Blog</title>
	<atom:link href="http://incompl.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://incompl.com</link>
	<description>Design, Programming and the Web</description>
	<lastBuildDate>Thu, 20 Oct 2011 03:40:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>__proto__ is not constructor.prototype</title>
		<link>http://incompl.com/2011/__proto__-is-not-constructor-prototype/</link>
		<comments>http://incompl.com/2011/__proto__-is-not-constructor-prototype/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 03:38:09 +0000</pubDate>
		<dc:creator>gsmith</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://incompl.com/?p=1147</guid>
		<description><![CDATA[JavaScript&#8217;s __proto__ property is extremely handy but non-standard and deprecated. I&#8217;ve seen a lot of people around the net saying that constructor.prototype can be used as an alternative to __proto__. At first they seem to be the same: function Foo() {} var foo = new Foo(); console.log(foo.__proto__ == Foo.prototype); // true console.log(foo.constructor.prototype == Foo.prototype);  //<br/><a href="http://incompl.com/2011/__proto__-is-not-constructor-prototype/"> [read more] </a>]]></description>
			<content:encoded><![CDATA[<p>JavaScript&#8217;s <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/Proto">__proto__</a> property is extremely handy but non-standard and deprecated. I&#8217;ve seen a lot of people around the net saying that constructor.prototype can be used as an alternative to __proto__. At first they seem to be the same:</p>
<blockquote><p>function Foo() {}<br />
var foo = new Foo();<br />
console.log(foo.__proto__ == Foo.prototype); // true<br />
console.log(foo.constructor.prototype == Foo.prototype);  // true</p></blockquote>
<p>Unfortunately when you really start to dig in you find that they&#8217;re not equivalent:</p>
<blockquote><p>function Parent() {}<br />
var parent = new Parent();<br />
function Child() {}<br />
Child.prototype = parent;<br />
var child = new Child();</p>
<p>// child inherits directly from parent. this makes sense.<br />
console.log(child.__proto__ === parent); // true<br />
console.log(child.__proto__ === Parent.prototype); // false</p>
<p>// you might think child&#8217;s constructor would be Child, but it&#8217;s Parent.<br />
console.log(child.constructor === Parent); // true</p>
<p>// as a result, you get this<br />
console.log(child.constructor.prototype === parent); // false<br />
console.log(child.constructor.prototype === Parent.prototype); // true</p></blockquote>
<p>This has become especially relevant lately with the introduction of __proto__&#8217;s weaker successor, <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/GetPrototypeOf">getPrototypeOf</a>. It does what __proto__ does, but it&#8217;s read-only, while setting the __proto__ property of an object is one of __proto&#8217;s__ handy little charms.</p>
<p>Since not everyone supports getPrototypeOf yet, polyfills have been <a href="https://gist.github.com/1052392">popping</a> <a href="https://gist.github.com/1022883">up</a> around the net that fall back to __proto__ and constructor.prototype. However, these polyfills are broken, because constructor.prototype just isn&#8217;t the same thing. Adding to the confusion, <a href="http://ejohn.org/blog/objectgetprototypeof/">John Resig&#8217;s post</a> on getPrototypeOf insinuates that they&#8217;re the same thing as well.</p>
<p>I&#8217;m glad that we&#8217;re getting a standard way to access an object&#8217;s prototype with getPrototypeOf. It&#8217;s unfortunate all the polyfills I&#8217;ve seen aren&#8217;t correct and I can&#8217;t think of a way to polyfill below IE9. Anyone have any clever ideas?</p>
]]></content:encoded>
			<wfw:commentRss>http://incompl.com/2011/__proto__-is-not-constructor-prototype/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JavaScript: Inheriting names from constructors</title>
		<link>http://incompl.com/2011/javascript-inheriting-names-from-constructors/</link>
		<comments>http://incompl.com/2011/javascript-inheriting-names-from-constructors/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 00:02:11 +0000</pubDate>
		<dc:creator>gsmith</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://incompl.com/?p=1132</guid>
		<description><![CDATA[Over the course of a project I&#8217;m working on I&#8217;ve run into a few really weird JavaScript behaviors. This is one of them. It only happens with the name property, probably because of how names are handled for constructor functions. function Foo() {} // This should be Object.prototype, or {}, or omitted completely, // but certainly<br/><a href="http://incompl.com/2011/javascript-inheriting-names-from-constructors/"> [read more] </a>]]></description>
			<content:encoded><![CDATA[<p>Over the course of a project I&#8217;m working on I&#8217;ve run into a few really weird JavaScript behaviors. This is one of them. It only happens with the <em>name</em> property, probably because of how names are handled for constructor functions.</p>
<blockquote><p>function Foo() {}</p>
<p>// This should be Object.prototype, or {}, or omitted completely,<br />
// but certainly not the Object constructor. Still, what follows<br />
// isn&#8217;t exactly what you&#8217;d expect&#8230;<br />
Foo.prototype = Object;</p>
<p>var foo = new Foo();</p>
<p>function Bar() {}</p>
<p>Bar.prototype = foo;</p>
<p>var bar = new Bar();</p>
<p>bar.name = &#8216;hello&#8217;;</p>
<p>bar.name // &#8216;hello&#8217; in chrome, &#8216;Object&#8217; in firefox</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://incompl.com/2011/javascript-inheriting-names-from-constructors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mixcloud</title>
		<link>http://incompl.com/2011/mixcloud/</link>
		<comments>http://incompl.com/2011/mixcloud/#comments</comments>
		<pubDate>Thu, 07 Apr 2011 04:04:12 +0000</pubDate>
		<dc:creator>gsmith</dc:creator>
				<category><![CDATA[the web]]></category>

		<guid isPermaLink="false">http://incompl.com/?p=1110</guid>
		<description><![CDATA[I like to make DJ sets: compilations of electronic music combined into long seamless compositions. Though the individual songs are edited, warped, and layered, they are still copyrighted works by other artists, so distributing these sets is not necessarily legal. The powers that be seem to ignore the prevalent sharing of DJ sets online, but<br/><a href="http://incompl.com/2011/mixcloud/"> [read more] </a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://incompl.com/wp-content/uploads/2011/04/mixcloud_logo-300x981.png"><img class="alignright size-full wp-image-1113" title="mixcloud_logo-300x98" src="http://incompl.com/wp-content/uploads/2011/04/mixcloud_logo-300x981.png" alt="" width="300" height="81" /></a></p>
<p>I like to make DJ sets: compilations of electronic music combined into long seamless compositions. Though the individual songs are edited, warped, and layered, they are still copyrighted works by other artists, so distributing these sets is not necessarily legal. The powers that be seem to ignore the prevalent sharing of DJ sets online, but it has always bothered me that there isn&#8217;t a legitimate way to share my work.</p>
<p>Enter <a href="http://mixcloud.com">Mixcloud</a>, which promises to solve this problem. Mixcloud allows users to upload and share podcasts, radio shows, and DJ sets. Impressively, <em>Mixcloud itself foots the bill for royalties</em>. They pay <strong>PRS for Music</strong> and <strong>PPL</strong> on behalf of their users.</p>
<p>In order to make this legally possible, there are a few reasonable restrictions:</p>
<ul>
<li>audio can only be streamed, not downloaded</li>
<li>sets must have at least  8 tracks</li>
<li>full track lists must be provided</li>
</ul>
<div style="float: right; margin: 0 0 .5em .5em;"><object width="300" height="300"><param name="movie" value="http://www.mixcloud.com/media/swf/player/mixcloudLoader.swf?v=106" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="flashVars" value="feed=http://www.mixcloud.com/api/1/cloudcast/akelon/through-the-darker-places.json&amp;embed_uuid=f848702d-2579-4047-8ab5-89e5151be62b&amp;embed_type=widget_standard" /><embed type="application/x-shockwave-flash" width="300" height="300" src="http://www.mixcloud.com/media/swf/player/mixcloudLoader.swf?v=106" flashvars="feed=http://www.mixcloud.com/api/1/cloudcast/akelon/through-the-darker-places.json&amp;embed_uuid=f848702d-2579-4047-8ab5-89e5151be62b&amp;embed_type=widget_standard" allowfullscreen="true" allowscriptaccess="always"></embed></object>&nbsp;</p>
<p style="display: block; font-size: 12px; font-family: Helvetica, Arial, sans-serif; margin: 0; padding: 3px 4px 3px 4px; color: #999;"><a style="color: #02a0c7; font-weight: bold;" href="http://www.mixcloud.com/akelon/through-the-darker-places/?utm_source=widget&amp;utm_medium=web&amp;utm_campaign=base_links&amp;utm_term=cloudcast_link" target="_blank">Through The Darker Places</a> by <a style="color: #02a0c7; font-weight: bold;" href="http://www.mixcloud.com/akelon/?utm_source=widget&amp;utm_medium=web&amp;utm_campaign=base_links&amp;utm_term=profile_link" target="_blank">Akelon</a> on <a style="color: #02a0c7; font-weight: bold;" href="http://www.mixcloud.com/?utm_source=widget&amp;utm_medium=web&amp;utm_campaign=base_links&amp;utm_term=homepage_link" target="_blank"> Mixcloud</a></p>
</div>
<p>In addition to these limits, there was a 100 mb limit on uploads, which did limit me on my audio quality. Still, the service is free, so it&#8217;s pretty impressive that this is viable.</p>
<p>The requirement to include full track lists is not just a burden. This required metadata allows for some interesting features, such as the ability to search for DJ sets that include a particular song. This is not something I&#8217;ve seen before and it certainly is a fun way to search for new music. Additionally, an uploader can easily mark the start times of each track in a set, and the player helpfully highlights the currently playing song.</p>
<p>How does Mixcloud make money from this? Two ways that I can see:</p>
<ul>
<li>Ads. The site has ugly banner ads, but hey, at least they&#8217;re not kidding themselves about the need to generate revenue.</li>
<li>Affiliates? Mixcloud puts &#8220;Buy&#8221; links in track lists, allowing you to buy individual songs from sites such as Amazon, iTunes, Beatport, and Juno. It&#8217;s possible they make money from these referrals.</li>
</ul>
<p>Founded in 2008, Mixcloud has received two grants from the <a href="http://www.innovateuk.org/">Technology Strategy Board</a>, the UK’s national innovation agency. They&#8217;re still running lean with only 4 employees, but if this business model is sustainable, they&#8217;re really onto something here.</p>
<p><a href="http://www.mixcloud.com/akelon/">My Mixcloud profile</a></p>
]]></content:encoded>
			<wfw:commentRss>http://incompl.com/2011/mixcloud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My Experience with Kickstarter</title>
		<link>http://incompl.com/2011/my-experience-with-kickstarter/</link>
		<comments>http://incompl.com/2011/my-experience-with-kickstarter/#comments</comments>
		<pubDate>Sun, 20 Feb 2011 01:54:10 +0000</pubDate>
		<dc:creator>gsmith</dc:creator>
				<category><![CDATA[the web]]></category>

		<guid isPermaLink="false">http://incompl.com/?p=1049</guid>
		<description><![CDATA[I recently raised $743 in donations to my side-project, a web-based game titled 91. I used the fund-raising site Kickstarter and the experience was delightful and fascinating. Here is how it happened. I’ve been working on 91 for about a year. The first post on the game’s blog was on 11/27/2009 but I had been<br/><a href="http://incompl.com/2011/my-experience-with-kickstarter/"> [read more] </a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://incompl.com/wp-content/uploads/2011/02/Kickstarter_logo.jpg"><img class="alignright size-medium wp-image-1050" title="Kickstarter_logo" src="http://incompl.com/wp-content/uploads/2011/02/Kickstarter_logo-300x81.jpg" alt="Kickstarter logo" width="240" height="65" /></a>I recently raised $743 in donations to my side-project, a web-based game titled <a href="http://startcontinue.com">91</a>. I used the fund-raising site <a href="http://kickstarter.com">Kickstarter</a> and the experience was delightful and fascinating. Here is how it happened.</p>
<p>I’ve been working on 91 for about a year. The first post on the game’s blog was on 11/27/2009 but I had been working on the game before that, though I’m not sure when coding actually began. Many of the ideas present in the game have been brewing in my head for several years.</p>
<p>I had been looking at Kickstarter just out of curiosity. It’s an interesting site: users create projects that they want to get funded by donations. These projects are usually creative and include art, theater, music, writing, and of course games. Each project has a deadline and a funding goal, usually measured in thousands of dollars. Each project is funded only if the goal is met. If the goal is not met, no money changes hands. The idea here is that if a project requires the full amount in order to become reality, then no one should have to donate to a project that doesn’t meet its goal and cannot be completed.</p>
<p>An additional feature is that projects are required to have rewards. If a project is successfully funded, donors may receive a reward based on how much they donated. This adds an additional incentive and personal touch to each project. Project creators can choose whatever rewards they’d like.</p>
<p>It seems to me that Kickstarter has several functions. One, they handle all the money, which is nice. Second, they’re a trusted name, so having a Kickstarter project gives you a certain authenticity that makes people less skeptical about donating. Further, they’re offering their promotion and their marketing smarts. It’s not arbitrary that Kickstarter requires deadlines and rewards. These are known to be successful ways to raise money, and Kickstarter wants you to succeed. Kickstarter offers great advice throughout the process, and they also drive a fair amount of traffic to your project, especially if you’re featured on their home page. In exchange, Kickstarter takes 5% of what you raise.</p>
<p>So, I decided to raise some money. There is one little inconsistency here: isn’t Kickstarter for potential projects that need money to begin? My game isn&#8217;t complete, but it&#8217;s already underway. Well, my idea passed Kickstater’s approval process, so they seem to be flexible. My goal was to cover costs I’ve incurred while developing the game, which are not completely negligible. This money isn&#8217;t for personal use, excluding of course pizza deliveries during late-night coding sessions. My costs for my first year developing 91 look like this:</p>
<ul>
<li>LunarPages Hosting (12 months) $107</li>
<li>LunarPages Domain Registration (1 year) $20</li>
<li>Github (12 months) $84</li>
<li>Coda (software) $99</li>
<li>iShowU HD (software) $30</li>
<li>12 silly sunglasses (Kickstarter reward) $13</li>
<li>20 custom postcards from <a href="http://moo.com">moo.com</a> (Kickstarter reward) $20</li>
<li>VectorDesigner (software to create postcard graphics) $30</li>
<li>12 custom booklets from <a href="http://lulu.com">lulu.com</a> (Kickstarter reward) $64</li>
<li>Concept art commission (Kickstarter promotion) $60</li>
</ul>
<p>Total: $527</p>
<p>This works out to be very close to what I chose as my project goal, $500. I decided to see if I could raise this much money in 30 days, from 1/8/2011 to 2/7/2011.</p>
<p>The question of what to offer as rewards was an interesting one. I looked at other successful projects for ideas. The sunglasses were the idea of a friend of mine. Here are the rewards I used. Each reward includes all the rewards from the lower tiers.</p>
<p><strong>$10 or more: Get your name / url posted on http://startcontinue.com/community/thanks</strong></p>
<p>The idea here was to try to get people to donate at least $10. There were still 5 people who donated less than $10 and didn’t get any reward.</p>
<p><a href="http://incompl.com/wp-content/uploads/2011/02/rewards.jpg"><img class="alignright size-medium wp-image-1059" title="rewards" src="http://incompl.com/wp-content/uploads/2011/02/rewards-300x226.jpg" alt="A photo of the rewards I sent out to Kickstarter supporters" width="300" height="226" /></a></p>
<p><strong>$25 or more: A booklet with a short story about the game and a postcard with a map of the city the game takes place in.</strong></p>
<p>This seemed to be the reward people were most interested in. I believe that in general Kickstarter backers want creative and personalized rewards related to the project they’re donating to.</p>
<p><strong>$50 or more: In addition, get sweet neon sunglasses, and your character in-game starts with sweet sunglasses.</strong></p>
<p>Either because the reward was lame or because $50 is not a compelling donation quantity, only one person donated at this level.</p>
<p><strong>$100 or more: In addition, you get an NPC named after you in the game, and your name/link goes in the startcontinue.com footer.</strong></p>
<p>To my surprise and delight, four people donated at this level. It’s hard to say if the rewards were a factor, because these are some awesome and generous people either way.</p>
<p><strong>$500 or more: I’ll fly to wherever you are and buy you a beer in person. Limit 1, first come first serve.</strong></p>
<p>This wasn’t my idea, there actually was another project that offered this reward. It was a sort of a joke to begin with, honestly. No one donated at this level.</p>
<p>Another thing Kickstarter suggests is making a video to explain your project. Your video is featured right at the top of your project page. I thought about taking a lot of time to make a high-quality video, but I didn’t want to waste the effort if I was only going to get $30 of pledges. I made a quick video demonstrating the game, figuring that I could always make a better one later, which I never did. Besides, the game can speak for itself. People know a game they want to play if they see it, right?</p>
<p>With that all determined I started the project, totally unsure of if anyone would be interested in donating. I wouldn’t have been surprised if the project received no attention and ended with mere pocket-change in pledges.</p>
<p>Donations trickled in for the first week. I posted the project on social media sites such as <a href="http://reddit.com">Reddit</a> and <a href="http://digg.com">Digg</a> and some forums such as <a href="http://roguetemple.com/forums/">Roguetemple</a>. This generated enough interest to raise my first $100. During this time it looked like the I may or may not make my goal, depending on if I could keep up the pace.</p>
<p>During the second week, the project stagnated. I had posted to all the forums and sites I thought were relevant, and didn’t want to get spammy. I considered making a new, better video to promote the game, and probably would have if this kept up. I also commissioned some concept art to help promote the game and make the project more eye-catching.</p>
<p>After January 18th something interesting happened. People started to notice 91. There was some discussion about the game on <a href="http://www.rockpapershotgun.com/">rockpapershotgun.com</a>’s forums around this time, which drove more interest and traffic than I expected. Also, a couple more predominant members of the gaming community started to donate generously and help promote the game. It seems that the best way to get attention is to get mentioned in the right forums or social news sites, and to get noticed by the right people. With new people helping to promote, 91 was mentioned in new places and new avenues of traffic opened up. Not just that, it was the right kind of traffic, as these people were donating at higher levels.</p>
<p>Thanks to this, I suddenly met my goal in a matter of days. It was a really exciting time! This is where I stopped worrying about promotion and started working on the rewards I’d need to send out.</p>
<p><a href="http://incompl.com/wp-content/uploads/2011/02/91-on-kickstarter-home-page.png"><img class="alignright size-full wp-image-1053" title="91 on kickstarter home page" src="http://incompl.com/wp-content/uploads/2011/02/91-on-kickstarter-home-page.png" alt="Screen shot of 91 on the kickstarter.com home page" width="262" height="238" /></a>On January 28th another interesting thing happened. 91 was featured on the kickstarter.com home page. This drove a great amount of traffic. During this time I got around 250 referrals to startcontinue.com from Kickstarter, which is only a subset of the number of people who visited the Kickstarter project page. Since these are people who clicked-through from the project page, these were 250 people who had looked at the project page and wanted to learn more.</p>
<p>91 was featured on Kickstarter’s home page again a few days later, driving another 150 referrals to startcontinue.com.</p>
<p>On February 1st 91 was featured in an article on <a href="http://www.pcgamer.com/">pcgamer.com</a> titled “10 games you can help fund now.” The article was later taken down; I’m not sure why. I do have a backup of it. The article was very sarcastic, probably in response to some of the projects that were featured, some of which were asking for a lot of money with little to show for themselves. One commenter went so far as to suggest that all of these projects were scams. Well, maybe some of them were, if they weren’t simply misled or overly-ambitious. At least I felt vindicated by this: the author starts describing 91 by saying “You’ve got to have a soft spot for roguelikes, and developers who aren’t deluded, greedy bastards.” They give a quick overview of the game and seem generally positive. However, they switch back to sarcasm, and conjecture that my reward of flying out to buy a beer for the $500 donor was an attempt to get a free holiday. The article ends: “Greedy bastard!” I have the feeling that this was all in good fun, but I admit I was a little confused at the time, especially given the more earnest disdain being doled out nearby. It’s not clear to me if this exposure led to any contributions.</p>
<p>On February 7th the funding period closed. The project was a great success, reaching 149% of its goal (yes, you keep whatever you raise above the goal) with $743 total. I was quite pleased, but actually felt a bit pressured too. Suddenly my little side-project had actual expectations attached to it for the first time.</p>
<p>Once the funding period closed I started organizing my rewards. Kickstarter lets you send out surveys to automatically collect the information needed from backers, such as their shipping addresses. The sunglasses I ordered on Amazon: that was easy.  I ordered the custom postcards from moo.com, which prints them in multiples of 20, so I have some extras. I ordered the booklets from lulu.com and they turned out beautiful. I had everything shipped to my apartment so I could combine them, add some personal touches, and ship a single packet to each backer. One thing I didn’t think about was international shipping costs, but only a couple of backers were international so it was manageable.</p>
<p>One lesson I learned is that I’m not much of a marketer. 91 is a unique game and it’s hard to tell exactly who would be interested in it, but I missed the mark, and never thought to post in some of the forums that ended up being very interested in the game. Also, since certain people ended up being extremely helpful in promoting the game, if I did this again I’d send emails (or maybe tweets?) to influential members of the gaming community right off the bat, telling them about the game and asking not for donations but for help promoting the project. Of course, I’d send personal emails only to people I thought would be genuinely interested in the game based on what I knew about them. I don’t think any less personal emails or mass-marketing is likely to work and could even harm goodwill.</p>
<p>Another thing I learned is that having a working demo was crucial to my success. Many people are skeptical of Kickstarter projects that promise the world but don’t have convincing credentials suggesting that the project will be a success. I didn’t have to prove much to anyone: people who wanted to know what I was capable of could just play the work-in-progress and see it for themselves.</p>
<p>Another interesting fact is that some people thought I was being greedy. My Kickstarter page mentioned that I do this in my spare time and that I do have a day job, so some people said they saw no reason to donate to me since I didn’t need the money. That’s true, I’m not a starving artist trying to put food on the table. And certainly, those types of people should get money before I should. But still, I think anyone who creates art, be it video games or novels or paintings, is putting their heart and soul into their work, not to mention their time and money. There is nothing wrong with people who enjoy such art giving something back. Would these people think any differently if I charged for the game instead of asking for donations? Would it be different if I was making a different type of game than a roguelike, most of which are free? It’s hard to say.</p>
<p>Overall this was a great experience. At this point I’m not developing 91 at a personal financial loss. Much better, though, is all the people I’ve met and talked to throughout the process. I’ve gotten a lot of great feedback on the game and it’s really encouraging seeing that people are interested in my work. My plan now is to keep at it. The game came a long way in its first year. I’m hoping that in another year it’ll be done. We’ll see how it goes! If you want to learn more about 91, visit <a href="http://startcontinue.com">http://startcontinue.com</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://incompl.com/2011/my-experience-with-kickstarter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Boston Blizzard January 12, 2011</title>
		<link>http://incompl.com/2011/boston-blizzard-january-12-2011/</link>
		<comments>http://incompl.com/2011/boston-blizzard-january-12-2011/#comments</comments>
		<pubDate>Thu, 13 Jan 2011 00:11:57 +0000</pubDate>
		<dc:creator>gsmith</dc:creator>
				<category><![CDATA[digression]]></category>

		<guid isPermaLink="false">http://incompl.com/?p=1033</guid>
		<description><![CDATA[And a video of people sledding:]]></description>
			<content:encoded><![CDATA[<div class="photosmash_gallery"><span style='float:right;'><a class="piclenselink" href="javascript:PicLensLite.start({feedUrl:'http://incompl.com/wp-content/plugins/photosmash-galleries/bwbps-media-rss.php?layout=media_rss&id=2&gallery_type=0&tags=&thumb_height=150&thumb_width=150&no_pagination=1&no_form=true&no_gallery_header=true'});">
			Start Slideshow 
  <img src="http://lite.piclens.com/images/PicLensButton.png"
  alt="PicLens" width="16" height="12" border="0" align="absmiddle"> </a>
			</span><div class='clear'></div>
<h3>Gallery: Boston Blizzard January 12, 2011</h3>
<div class='bwbps_gallery_container0'>
<ul class='bwbps_gallery'>

<li class='psgal_2'>
	<div class='bwbps_image bwbps_relative'>
		<a rel='lightbox[album_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_03891-800x1066.jpg' title='Paul Revere'><img src='http://incompl.com/wp-content/uploads/2011/01/IMG_03891-800x1066-150x150.jpg' class='ps_images' alt='Paul Revere'  height='150' width='150' /></a>

		<div class='bwbps_postlink_top_rt bwbps_postlink'>
			<a href='http://incompl.com/wp-content/uploads/2011/01/IMG_03891-800x1066.jpg' title='Visit image page.'>
				<img src='http://incompl.com/wp-content/plugins/photosmash-galleries/images/post-out.png' />
			</a>
		</div>
	</div>
	<div style='clear: both;'>
		<a rel='lightbox[caption_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_03891-800x1066.jpg' title='Paul Revere'>
			Paul Revere
		</a>
	</div>
</li>
			
<li class='psgal_2'>
	<div class='bwbps_image bwbps_relative'>
		<a rel='lightbox[album_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_0405-800x600.jpg' title='Arlington Church'><img src='http://incompl.com/wp-content/uploads/2011/01/IMG_0405-800x600-150x150.jpg' class='ps_images' alt='Arlington Church'  height='150' width='150' /></a>

		<div class='bwbps_postlink_top_rt bwbps_postlink'>
			<a href='http://incompl.com/wp-content/uploads/2011/01/IMG_0405-800x600.jpg' title='Visit image page.'>
				<img src='http://incompl.com/wp-content/plugins/photosmash-galleries/images/post-out.png' />
			</a>
		</div>
	</div>
	<div style='clear: both;'>
		<a rel='lightbox[caption_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_0405-800x600.jpg' title='Arlington Church'>
			Arlington Church
		</a>
	</div>
</li>
			
<li class='psgal_2'>
	<div class='bwbps_image bwbps_relative'>
		<a rel='lightbox[album_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_0404-800x600.jpg' title='Newbury Street'><img src='http://incompl.com/wp-content/uploads/2011/01/IMG_0404-800x600-150x150.jpg' class='ps_images' alt='Newbury Street'  height='150' width='150' /></a>

		<div class='bwbps_postlink_top_rt bwbps_postlink'>
			<a href='http://incompl.com/wp-content/uploads/2011/01/IMG_0404-800x600.jpg' title='Visit image page.'>
				<img src='http://incompl.com/wp-content/plugins/photosmash-galleries/images/post-out.png' />
			</a>
		</div>
	</div>
	<div style='clear: both;'>
		<a rel='lightbox[caption_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_0404-800x600.jpg' title='Newbury Street'>
			Newbury Street
		</a>
	</div>
</li>
			
<li class='psgal_2'>
	<div class='bwbps_image bwbps_relative'>
		<a rel='lightbox[album_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_0400-800x600.jpg' title='Comm Ave'><img src='http://incompl.com/wp-content/uploads/2011/01/IMG_0400-800x600-150x150.jpg' class='ps_images' alt='Comm Ave'  height='150' width='150' /></a>

		<div class='bwbps_postlink_top_rt bwbps_postlink'>
			<a href='http://incompl.com/wp-content/uploads/2011/01/IMG_0400-800x600.jpg' title='Visit image page.'>
				<img src='http://incompl.com/wp-content/plugins/photosmash-galleries/images/post-out.png' />
			</a>
		</div>
	</div>
	<div style='clear: both;'>
		<a rel='lightbox[caption_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_0400-800x600.jpg' title='Comm Ave'>
			Comm Ave
		</a>
	</div>
</li>
			
<li class='psgal_2'>
	<div class='bwbps_image bwbps_relative'>
		<a rel='lightbox[album_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_0396-800x600.jpg' title='Arlington st. facing Garden'><img src='http://incompl.com/wp-content/uploads/2011/01/IMG_0396-800x600-150x150.jpg' class='ps_images' alt='Arlington st. facing Garden'  height='150' width='150' /></a>

		<div class='bwbps_postlink_top_rt bwbps_postlink'>
			<a href='http://incompl.com/wp-content/uploads/2011/01/IMG_0396-800x600.jpg' title='Visit image page.'>
				<img src='http://incompl.com/wp-content/plugins/photosmash-galleries/images/post-out.png' />
			</a>
		</div>
	</div>
	<div style='clear: both;'>
		<a rel='lightbox[caption_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_0396-800x600.jpg' title='Arlington st. facing Garden'>
			Arlington st. facing&#8230;
		</a>
	</div>
</li>
			
<li class='psgal_2'>
	<div class='bwbps_image bwbps_relative'>
		<a rel='lightbox[album_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_0393-800x600.jpg' title='Arlington st. facing Comm'><img src='http://incompl.com/wp-content/uploads/2011/01/IMG_0393-800x600-150x150.jpg' class='ps_images' alt='Arlington st. facing Comm'  height='150' width='150' /></a>

		<div class='bwbps_postlink_top_rt bwbps_postlink'>
			<a href='http://incompl.com/wp-content/uploads/2011/01/IMG_0393-800x600.jpg' title='Visit image page.'>
				<img src='http://incompl.com/wp-content/plugins/photosmash-galleries/images/post-out.png' />
			</a>
		</div>
	</div>
	<div style='clear: both;'>
		<a rel='lightbox[caption_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_0393-800x600.jpg' title='Arlington st. facing Comm'>
			Arlington st. facing&#8230;
		</a>
	</div>
</li>
			
<li class='psgal_2'>
	<div class='bwbps_image bwbps_relative'>
		<a rel='lightbox[album_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_0385-800x600.jpg' title='Newbury st. from Garden'><img src='http://incompl.com/wp-content/uploads/2011/01/IMG_0385-800x600-150x150.jpg' class='ps_images' alt='Newbury st. from Garden'  height='150' width='150' /></a>

		<div class='bwbps_postlink_top_rt bwbps_postlink'>
			<a href='http://incompl.com/wp-content/uploads/2011/01/IMG_0385-800x600.jpg' title='Visit image page.'>
				<img src='http://incompl.com/wp-content/plugins/photosmash-galleries/images/post-out.png' />
			</a>
		</div>
	</div>
	<div style='clear: both;'>
		<a rel='lightbox[caption_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_0385-800x600.jpg' title='Newbury st. from Garden'>
			Newbury st. from Gar&#8230;
		</a>
	</div>
</li>
			
<li class='psgal_2'>
	<div class='bwbps_image bwbps_relative'>
		<a rel='lightbox[album_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_0384-800x600.jpg' title='Comm from Garden'><img src='http://incompl.com/wp-content/uploads/2011/01/IMG_0384-800x600-150x150.jpg' class='ps_images' alt='Comm from Garden'  height='150' width='150' /></a>

		<div class='bwbps_postlink_top_rt bwbps_postlink'>
			<a href='http://incompl.com/wp-content/uploads/2011/01/IMG_0384-800x600.jpg' title='Visit image page.'>
				<img src='http://incompl.com/wp-content/plugins/photosmash-galleries/images/post-out.png' />
			</a>
		</div>
	</div>
	<div style='clear: both;'>
		<a rel='lightbox[caption_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_0384-800x600.jpg' title='Comm from Garden'>
			Comm from Garden
		</a>
	</div>
</li>
			
<li class='psgal_2'>
	<div class='bwbps_image bwbps_relative'>
		<a rel='lightbox[album_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_0378-800x600.jpg' title='Me!'><img src='http://incompl.com/wp-content/uploads/2011/01/IMG_0378-800x600-150x150.jpg' class='ps_images' alt='Me!'  height='150' width='150' /></a>

		<div class='bwbps_postlink_top_rt bwbps_postlink'>
			<a href='http://incompl.com/wp-content/uploads/2011/01/IMG_0378-800x600.jpg' title='Visit image page.'>
				<img src='http://incompl.com/wp-content/plugins/photosmash-galleries/images/post-out.png' />
			</a>
		</div>
	</div>
	<div style='clear: both;'>
		<a rel='lightbox[caption_2]' href='http://incompl.com/wp-content/uploads/2011/01/IMG_0378-800x600.jpg' title='Me!'>
			Me!
		</a>
	</div>
</li>
			
</ul>
<div style='clear:both;'></div>
</div>
<div class='bwbps_pag_2'><span>1</span><a href="http://incompl.com/feed/?bwbps_page_2=2">2</a><a href="http://incompl.com/feed/?bwbps_page_2=3">3</a><a href="http://incompl.com/feed/?bwbps_page_2=4">4</a><a href="http://incompl.com/feed/?bwbps_page_2=5">5</a><a href="http://incompl.com/feed/?bwbps_page_2=2">&#9658;</a></div><div id='bwbpsInsertBox_2' class='bwbps-insert-box'></div></div>
			<div class='bwbps_clear'></div>
					<script type='text/javascript'>
						displayedGalleries += '|2';
					</script>
				
<p>And a video of people sledding:</p>
<p><object width="480" height="290"><param name="movie" value="http://www.youtube.com/v/mYGqGGJXdy4?fs=1&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/mYGqGGJXdy4?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="290"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://incompl.com/2011/boston-blizzard-january-12-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Concise JavaScript Image Preloading</title>
		<link>http://incompl.com/2010/concise-javascript-image-preloading/</link>
		<comments>http://incompl.com/2010/concise-javascript-image-preloading/#comments</comments>
		<pubDate>Mon, 20 Sep 2010 17:29:06 +0000</pubDate>
		<dc:creator>gsmith</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://incompl.com/?p=972</guid>
		<description><![CDATA[For some reason, all over the Internet people preload images like this: var img = new Image(); img.src = "image.jpg"; There is no reason for this code to be two lines. I preload my images like this: new Image().src = "image.jpg"; It would be hard to come up with a more minor nitpick than this,<br/><a href="http://incompl.com/2010/concise-javascript-image-preloading/"> [read more] </a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://incompl.com/wp-content/uploads/2010/09/fireman-clock.jpg"><img class="alignright size-medium wp-image-976" title="fireman clock" src="http://incompl.com/wp-content/uploads/2010/09/fireman-clock-300x300.jpg" alt="A photo of a fireman fixing a large clock" width="173" height="173" /></a></p>
<p>For some reason, all over the Internet people preload images like this:</p>
<blockquote>
<pre>var img = new Image();
img.src = "image.jpg";</pre>
</blockquote>
<p>There is no reason for this code to be two lines. I preload my images like this:</p>
<blockquote>
<pre>new Image().src = "image.jpg";</pre>
</blockquote>
<p>It would be hard to come up with a more minor nitpick than this, but if we&#8217;re going to write this code hundreds of times during our lives, why not keep it simple?</p>
<p><a href="http://www.flickr.com/photos/roberto_ferrari/281640001/">[image credit]</a></p>
]]></content:encoded>
			<wfw:commentRss>http://incompl.com/2010/concise-javascript-image-preloading/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Catching jQuery AJAX JSON Parse Error</title>
		<link>http://incompl.com/2010/catching-jquery-ajax-json-parse-error/</link>
		<comments>http://incompl.com/2010/catching-jquery-ajax-json-parse-error/#comments</comments>
		<pubDate>Mon, 20 Sep 2010 02:03:41 +0000</pubDate>
		<dc:creator>gsmith</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://incompl.com/?p=959</guid>
		<description><![CDATA[Today I found an interesting bug in my jQuery code. My app was reporting &#8220;You are offline: check your Internet connection&#8221; but Firebug was reporting the 200 success status code for the request. Turns out that I had a syntax error in the JSON file I was pulling down. Fair enough, that is certainly an<br/><a href="http://incompl.com/2010/catching-jquery-ajax-json-parse-error/"> [read more] </a>]]></description>
			<content:encoded><![CDATA[<p>Today I found an interesting bug in my jQuery code. My app was reporting &#8220;You are offline: check your Internet connection&#8221; but Firebug was reporting the 200 success status code for the request. Turns out that I had a syntax error in the JSON file I was pulling down. Fair enough, that is certainly an error, it&#8217;s just that my log message was wrong. So I went into my <a href="http://api.jquery.com/ajaxError/"><em>ajaxError</em></a> function to fix it.</p>
<p>Here is where I got a bit confused. Though <em>ajaxError</em> has several helpful arguments, none of them seemed to identify when a JSON parse error had occurred. After Googling around a bit, I found <a href="http://www.maheshchari.com/jquery-ajax-error-handling/">a helpful example</a> of the <a href="http://api.jquery.com/jQuery.ajaxSetup/"><em>ajaxSetup</em></a> function. <em>ajaxSetup</em> lets you define an error function too. At first I assumed this was the same as <em>ajaxError</em>, but it turns out that the <em>ajaxSetup</em> error function is called, then the <em>ajaxError</em> function is called, on each AJAX error.</p>
<p>More importantly, the error function defined in <em>ajaxSetup</em> does more to identify the source of the problem. Here is the gist of the code I ended up writing:</p>
<blockquote>
<pre> $.ajaxSetup({
        error:function(x, e){
            if (x.status === 0){
                journal.post("You are offline.", "bad");
            }
            else if(x.status === 404){
                journal.post("404 file not found error", "bad");
            }
            else if(x.status === 500){
                journal.post("500 internal server error", "bad");
            }
            else if(e === 'parsererror'){
                journal.post("200 but can't parse json response", "bad");
            }
            else if(e === 'timeout'){
                journal.post("Request timed out.", "bad");
            }
            else {
                journal.post("Unknown AJAX error", "bad");
            }
        }
    });</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://incompl.com/2010/catching-jquery-ajax-json-parse-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Checking JavaScript Function Argument Types</title>
		<link>http://incompl.com/2010/checking-javascript-function-argument-types/</link>
		<comments>http://incompl.com/2010/checking-javascript-function-argument-types/#comments</comments>
		<pubDate>Sun, 19 Sep 2010 06:39:33 +0000</pubDate>
		<dc:creator>gsmith</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://incompl.com/?p=935</guid>
		<description><![CDATA[The typeof operator in JavaScript can be a little misleading. Here is an example of using it to check the type of a function argument. function foo(str) { if (typeof str === "string") { return "foo " + str; } else { throw "Can only foo a string"; } } foo("dog") === "foo dog"; //<br/><a href="http://incompl.com/2010/checking-javascript-function-argument-types/"> [read more] </a>]]></description>
			<content:encoded><![CDATA[<p>The <em><a href="https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/typeof_Operator">typeof</a></em> operator in JavaScript can be a little misleading. Here is an example of using it to check the type of a function argument.</p>
<blockquote>
<pre>function foo(str) {
    if (typeof str === "string") {
        return "foo " + str;
    }
    else {
        throw "Can only foo a string";
    }
}
foo("dog") === "foo dog"; // true</pre>
</blockquote>
<p>So far so good. However, in JavaScript a &#8220;String&#8221; can be either a value <em>or</em> a String object. What happens if we pass in a String object?</p>
<blockquote>
<pre>foo(new String("dog")) === "foo dog"; // exception thrown!</pre>
</blockquote>
<p>Woops! That is definitely not what we want.</p>
<p>Sadly, there is nothing built into JavaScript that is perfect for this situation. But consider the following alternative. This version was borrowed from  <a href="http://dmitry.baranovskiy.com/post/typeof-and-friends">Dmitry Baranovskiy</a> but there are a few similar functions around the net.</p>
<blockquote>
<pre>function is(o, type) {
    type = String(type).toLowerCase();
    return  (type == "null" &amp;&amp; o === null) ||
            (type == typeof o) ||
            (type == "object" &amp;&amp; o === Object(o)) ||
            (type == "array" &amp;&amp; Array.isArray &amp;&amp; Array.isArray(o)) ||
            Object.prototype.toString.call(o).slice(8, -1).toLowerCase() == type;
}</pre>
</blockquote>
<p>Let&#8217;s rewrite our <em>foo</em> function using this new <em>is </em>function.</p>
<blockquote>
<pre>function foo(str) {
    if (is(str, "string")) {
        return "foo " + str;
    }
    else {
        throw "Can only foo a string";
    }
}
foo("dog") === "foo dog"; // true
foo(new String("dog")) === "foo dog"; // true</pre>
</blockquote>
<p>Now we&#8217;re getting what we want! As with <a href="http://javascript.crockford.com/prototypal.html">object instantiation</a>, this is a case where what&#8217;s built into the language just doesn&#8217;t cut it, but if you understand what you&#8217;d prefer and why, you can definitely get what you need.</p>
]]></content:encoded>
			<wfw:commentRss>http://incompl.com/2010/checking-javascript-function-argument-types/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Autofocus vs. Shortcuts</title>
		<link>http://incompl.com/2010/autofocus-vs-shortcuts/</link>
		<comments>http://incompl.com/2010/autofocus-vs-shortcuts/#comments</comments>
		<pubDate>Sat, 24 Jul 2010 16:31:07 +0000</pubDate>
		<dc:creator>gsmith</dc:creator>
				<category><![CDATA[the web]]></category>

		<guid isPermaLink="false">http://incompl.com/?p=925</guid>
		<description><![CDATA[I was reading HTML5 for Web Designers and was reminded again of the interesting debate about autofocus and keyboard shortcuts. If you&#8217;re unfamiliar, autofocus is a JavaScript technique for automatically putting the cursor in a particular form element when a user visits a web page. This happens when you visit Google: notice that you can<br/><a href="http://incompl.com/2010/autofocus-vs-shortcuts/"> [read more] </a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://incompl.com/wp-content/uploads/2010/07/shortcut.jpg"><img class="alignright size-full wp-image-928" title="Shortcut" src="http://incompl.com/wp-content/uploads/2010/07/shortcut.jpg" alt="A photograph of a street sign that reads &quot;Short Cut&quot;" width="146" height="320" /></a></p>
<p>I was reading <a href="http://books.alistapart.com/product/html5-for-web-designers">HTML5 for Web Designers</a> and was reminded again of the interesting debate about autofocus and keyboard shortcuts. If you&#8217;re unfamiliar, autofocus is a JavaScript technique for automatically putting the cursor in a particular form element when a user visits a web page. This happens when you visit <a href="http://www.google.com/">Google</a>: notice that you can just start typing without manually clicking in the search box first.</p>
<p>The concern that many people have is that autofocus impedes the use of certain keyboard shortcuts. Awhile ago on Twitter I noticed that <a href="http://perfectionkills.com/">Juriy Zaytsev</a> (a prolific JavaScript blogger and <a href="http://www.prototypejs.org/">Prototype.js</a> core developer)  <a href="http://twitter.com/kangax/status/15114069104">said</a> that autofocus breaks the <em>backspace</em> button, which is a shortcut for <em>back</em>. In the aforementioned book I&#8217;m reading, the author suggests that you should think long and hard before using autofocus, since it breaks use of the <em>space</em> key to scroll down the page. In both cases, autofocus causes these keys to type or delete in the selected form element instead of executing the shortcut&#8217;s intended function.</p>
<p>It&#8217;s a shame that these prominent folks are dissuading people from using autofocus. Autofocus really is a time-saver. The real problem is <strong>bad keyboard shortcuts</strong>.</p>
<p>Keyboard shortcuts that are too likely to confuse the user and produce the wrong result are a bad idea. I&#8217;d argue that using <em>backspace</em> or <em>spacebar</em> as a keyboard shortcut is almost as harmful as using <em>p</em> or <em>b</em>. <em>Keys that indicate that the user may be trying to type something should not be used as shortcuts</em>. Unless paired with one of alt, control, option, etc.</p>
<p>The good news is that although there are some very common but very bad keyboard shortcuts available, you don&#8217;t have to use them. If you want to stop being bothered by autofocus, I have found that Firefox, Opera, Chrome, and Safari all support <em>command-[</em> as an alternative to <em>backspace</em> that works even if a form element has focus. Further, <em>fn-downarrow</em> is a good alternatives to <em>spacebar</em> for scrolling down.</p>
<p>Start using good keyboard shortcuts! It'll keep you sane, and let web designers make use of helpful features like autofocus!</p>
<p><a href="http://www.flickr.com/photos/matt_lee/418275873/">[image credit]</a></p>
<p><em>Note: All keyboard shortcuts tested on a Mac only. Though I assume in Windows you have similar options.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://incompl.com/2010/autofocus-vs-shortcuts/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Chrome Web Store &#8211; I like it, though I may never use it.</title>
		<link>http://incompl.com/2010/chrome-web-store/</link>
		<comments>http://incompl.com/2010/chrome-web-store/#comments</comments>
		<pubDate>Wed, 19 May 2010 23:47:57 +0000</pubDate>
		<dc:creator>gsmith</dc:creator>
				<category><![CDATA[the web]]></category>

		<guid isPermaLink="false">http://incompl.com/?p=887</guid>
		<description><![CDATA[I like the idea behind the newly-announced Chrome Web Store. It&#8217;s a store for web apps, which technically aren&#8217;t different from any other web sites like Google Docs. At first it feels like Google is just out to make a quick buck by mimicking Apple&#8217;s successful App Store. However, I think something more subtle is<br/><a href="http://incompl.com/2010/chrome-web-store/"> [read more] </a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://incompl.com/wp-content/uploads/2010/05/cwslogo-chrome.png"><img class="alignright size-full wp-image-918" title="Chrome Web Store Logo" src="http://incompl.com/wp-content/uploads/2010/05/cwslogo-chrome.png" alt="The Chrome Web Store Logo" width="251" height="46" /></a></p>
<p>I like the idea behind the newly-announced <a href="https://chrome.google.com/webstore">Chrome Web Store</a>. It&#8217;s a store for web apps, which technically aren&#8217;t different from any other web sites like <a href="http://docs.google.com">Google Docs</a>. At first it feels like Google is just out to make a quick buck by mimicking Apple&#8217;s successful <a href="http://www.apple.com/iphone/apps-for-iphone/">App Store</a>. However, I think something more subtle is going on here. This is a a totally different approach to making money on the web.</p>
<p>Every now and then I think about making money from my side projects, but I&#8217;ve never done it. Why? Because making money on the web is called &#8220;ads&#8221;. If you&#8217;re selling t-shirts you probably don&#8217;t need ads, but if you want to make a website that&#8217;s fun or useful on its own merits, you don&#8217;t have a lot of options. <a href="http://en.wikipedia.org/wiki/Google#Advertising">Google makes 99% of its money from ads</a>. The problem? I hate ads.</p>
<p>Ads pit you against your users. A user&#8217;s goal is just to use the app and have fun or perform some task. An advertiser&#8217;s goal is to get impressions. Do you hate the new ad overlays in Youtube? We all do, but Google has to pay the bills for Youtube to be free. Ever clicked a link, only to discover it wasn&#8217;t a link at all, it just triggered an irrelevant ad pop-up? They generate impressions. It&#8217;s a bait and switch, but someone is willing to pay for it, and someone has to write a check to Bob&#8217;s Discount Hosting at the end of the day.</p>
<p>Google has always known that people hate ads. That&#8217;s why they&#8217;ve put so much work into making ads painless. Their text ads are low-bandwidth and unobtrusive. Now and then, they can even be useful. That&#8217;s why Google is <a href="http://www.marketingvox.com/googles-ad-server-market-share-at-57-042692/">the clear leader in web advertising market share</a>. Though now Google is asking themselves a few questions. What would the web be like without ads? And where would Google fit into such a web?</p>
<p>Are there websites don&#8217;t sell a more tangible product, don&#8217;t have ads, and exist only to be fun or useful? Sure. <a href="http://jsregex.com">I made one</a>, but the cost to run it is negligible. What would happen if it started generating millions of views a day, and my hosting company raised my rate? I&#8217;d need to take the site down, or find a way to make money. Inevitably, this would mean slapping ads on it. Yuck. Tons of <a href="http://twitter.com/">interesting startups</a> live in the same bubble I live in. Let&#8217;s just make a useful or fun app, and worry about money later, and only if we have to. With venture capital, you can live in this bubble for a long time. Sooner or later, though, reality sets in. Does this mean Twitter is going to have ads some day? Well, <a href="http://blog.twitter.com/2010/04/hello-world.html">yes</a>. They&#8217;re wrapping it up in a nice package, painfully aware of how much users hate ads, but that&#8217;s what they&#8217;re doing. That&#8217;s what you <em>have</em> to do.</p>
<p>This is why iPhone development is so appealing. <a href="http://www.edibleapple.com/ifart-developer-makes-40000-in-2-days/">You can make money without ads</a>. Your app is just your app. I don&#8217;t understand in the least why Apple thinks creating <a href="http://developer.apple.com/technologies/iphone/whats-new.html#iAd">an ad platform for iPhone apps</a> is a good idea. They must underestimate how much people hate ads. I cringed when Steve Jobs acted genuinely excited when announcing this stuff. iPhone developers will continue to make it big when they make good software at a good price point. It&#8217;s such a better way.</p>
<p>As you think about all this, eventually you have to ask, why don&#8217;t web apps work like iPhone apps? Why are the choices &#8220;free&#8221; or &#8220;ads&#8221;? 37signals is pretty vocal in saying that <a href="http://37signals.com/svn/posts/1366-a-radical-idea-charge-people-for-your-product">you have to charge for your product</a>. That works pretty well for the small-business collaboration and project management software that 37signals makes. But it doesn&#8217;t work as well the smaller the app is. On the iPhone, you can sell <a href="http://www.taptaptap.com/#convert">a nifty unit converter</a> for $0.99. On the web? Not a chance. <a href="http://www.google.com/landing/searchtips/#unitconversion">Google does it for free</a>, as do countless other sites. Even if you have the best unit converter on the entire Internet that you spent weeks on developing and doing usability studies and designing gorgeous graphics for. The Internet just doesn&#8217;t sell web apps in that price range. You come across as a greedy jerk, even if you have a great product.</p>
<p>Can that be changed? Can we make it so that nifty bite-size web apps can be sold for a buck or two? How do you change it? Well, here are my guesses as to what you&#8217;d have to change:</p>
<ul>
<li>Safer and faster payment system. People hate putting in credit card information on some unknown website. They&#8217;d rather just pass than take the risk for a small app that isn&#8217;t such a big deal after all.</li>
<li>Sense of ownership. A Tetris bookmark on a toolbar doesn&#8217;t feel like a product. It feels the same as all the free Tetris apps out there.</li>
<li>Pay once. Periodic billing doesn&#8217;t make sense for small apps. What is the periodic equivalent of a $0.99? $0.05 / month? It&#8217;s silly. But still, not a lot of webapps work on a pay-once system. Why not? Well, at that price point, wouldn&#8217;t it be easier to just throw some ads on there? A pay-once model for apps should be simpler to set up.</li>
</ul>
<p>I think the Chrome Web Store is an attempt to fix these problems. You buy apps quickly and safely through Google, you get a <a href="http://code.google.com/chrome/apps/docs/index.html">nifty apps tray in Chrome</a> that makes it feel like you actually own something tangible, and you only pay once.</p>
<p><a href="http://incompl.com/wp-content/uploads/2010/05/tabstrip-apps.png"><img class="alignnone size-full wp-image-890" title="Chrome Apps Tray" src="http://incompl.com/wp-content/uploads/2010/05/tabstrip-apps.png" alt="Screen shot of Chrome's upcoming apps tray" width="584" height="84" /></a></p>
<p>I don&#8217;t think that the Chrome Web Store is the future of web application development. On the other hand, I do think Google&#8217;s efforts will make it more acceptable to make money by selling your web apps instead of by tacking on ads. Once people get used to the idea of buying access to a tic-tac-toe website, web developers will have an easier time selling such apps outside of Google&#8217;s ecosystem. And that&#8217;s great.</p>
<p>It makes me wonder what Google&#8217;s perspective is on this. They&#8217;re an ad empire, and here is their product supporting a different revenue model. Are they worried about what the web would be like without ads, or even, without Google? Would Google start charging for their own apps if things went this direction? You have to evolve to survive on the web, and maybe even Google needs a plan for survival.</p>
<p>I&#8217;m currently developing <a href="http://startcontinue.com/">a game using HTML5 technologies</a>. I always knew I&#8217;d never put ads on it, so I assumed it&#8217;d just always be free. Though now I have to wonder. Can I sell it for a buck? It&#8217;s starting to look like it might be an interesting experiment.</p>
]]></content:encoded>
			<wfw:commentRss>http://incompl.com/2010/chrome-web-store/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
