<?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>Mr Blog &#187; software development</title>
	<atom:link href="http://mrblog.org/category/software-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://mrblog.org</link>
	<description>Mr Blog.  Very technical, or silly, sometimes absurd.</description>
	<lastBuildDate>Wed, 16 May 2012 21:16:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Forbes: Android is shipping more phones but Apple is still the logical choice for mobile development</title>
		<link>http://mrblog.org/2012/05/16/forbes-android-is-shipping-more-phones-but-apple-is-still-the-logical-choice-for-mobile-development/</link>
		<comments>http://mrblog.org/2012/05/16/forbes-android-is-shipping-more-phones-but-apple-is-still-the-logical-choice-for-mobile-development/#comments</comments>
		<pubDate>Wed, 16 May 2012 18:11:08 +0000</pubDate>
		<dc:creator>MrBlog</dc:creator>
				<category><![CDATA[business models]]></category>
		<category><![CDATA[future]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://mrblog.org/?p=1646</guid>
		<description><![CDATA[The title to this May 9 story, suggests another Apple bashing: &#8220;Is Apple’s dominance of Mobile Development on the Wane?&#8221; It appears to be an old editorial trick, the classic alarmist headline, because the article itself goes on to answer in the negative: Apple is the logical choice for mobile development today Where is market share going? The best bet is still targeting the Apple iPhone This, providing further evidence for my calling BS on “Android Dominance” post last month. I completely agree with author, Todd Warren, when he says &#8220;there are so many things wrong with developing on iPhone.&#8221;  From a purely technical standpoint, developing for Android (or perhaps even, cough, Windows Phone) is a much more pleasant experience. However, from a business standpoint, the cold hard fact is: one can completely ignore Android, Samsung, and Windows Phone without consequence. Again, quoting the Forbes story: As the success of Instagram shows, the iPhone market is big enough to bootstrap an application to millions of users. I would take this a step further and say that not only is Apple iOS the logical choice for &#8220;mobile development&#8221; but that iOS is the choice for all future development, other than niche enterprise [...]]]></description>
			<content:encoded><![CDATA[<p>The title to this <a href="http://www.forbes.com/sites/startupviews/2012/05/09/is-apples-dominance-of-mobile-development-on-the-wane/" target="_blank">May 9 story</a>, suggests another Apple bashing:</p>
<p><strong>&#8220;Is Apple’s dominance of Mobile Development on the Wane?&#8221;</strong></p>
<p>It appears to be an old editorial trick, the classic <em>alarmist headline</em>, because the article itself goes on to answer in the negative:</p>
<blockquote><p>Apple is the logical choice for mobile development today</p>
<p>Where is market share going? The best bet is still targeting the Apple iPhone</p></blockquote>
<p>This, providing further evidence for my <a href="http://mrblog.org/2012/04/02/im-calling-bs-on-android-dominance-meme/" target="_blank">calling BS on “Android Dominance”</a> post last month.</p>
<p>I completely agree with author, Todd Warren, when he says &#8220;there are so many things wrong with developing on iPhone.&#8221;  From a purely technical standpoint, developing for Android (or perhaps even, cough, Windows Phone) is a much more pleasant experience. However, from a business standpoint, the cold hard fact is: one can <strong>completely ignore Android, Samsung, and Windows Phone without consequence</strong>. Again, quoting the Forbes story:</p>
<blockquote><p>As the success of Instagram shows, the iPhone market is big enough to bootstrap an application to millions of users.</p></blockquote>
<p>I would take this a step further and say that not only is Apple iOS the logical choice for &#8220;mobile development&#8221; but that iOS is the choice for all future development, other than niche enterprise apps. In other words, the whole term &#8220;mobile development&#8221; as an exception is itself an archaic model. Non-mobile is now the exception.</p>
]]></content:encoded>
			<wfw:commentRss>http://mrblog.org/2012/05/16/forbes-android-is-shipping-more-phones-but-apple-is-still-the-logical-choice-for-mobile-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wow am I happy now that I didn&#8217;t deploy serious apps on Google App Engine</title>
		<link>http://mrblog.org/2011/09/13/wow-am-i-happy-now-that-i-didnt-deploy-serious-apps-on-google-app-engine/</link>
		<comments>http://mrblog.org/2011/09/13/wow-am-i-happy-now-that-i-didnt-deploy-serious-apps-on-google-app-engine/#comments</comments>
		<pubDate>Tue, 13 Sep 2011 20:54:46 +0000</pubDate>
		<dc:creator>MrBlog</dc:creator>
				<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[appengine]]></category>
		<category><![CDATA[google app engine]]></category>

		<guid isPermaLink="false">http://mrblog.org/?p=1435</guid>
		<description><![CDATA[First released in 2008, Google App Engine (GAE or AppEngine) was Google&#8217;s first attempt to compete with Amazon Web Services in providing cloud computing platform services for developers. In earlier posts, I took some heat for concluding that Google App Engine was not ready for &#8220;serious&#8221; applications, even when it was &#8220;free&#8221;. Recently, Google announced shocking new pricing for appengine that has its users reeling. In short, the new pricing means: “Free” quotas have been drastically reduced Pricing of paid apps increased significantly SLA and operational support available for a premium Google has provided a tool so customers can compare their current bills versus expected billis under the new pricing and customers report anywhere from 3x to 30x price increases, leaving many scrambling for alternatives. Two of the most common complaints from customers are lack of notice and the uncertainty of the pricing (lack of control over costs). In terms of cost control, the only way to know how much your costs are, is to ask Google, after you have already incurred those costs (and built and deployed your app). It&#8217;s impossible to map users or usage directly to cost. Google&#8217;s pricing scheme is as inscrutible as the worst telephone company billing. The pricing [...]]]></description>
			<content:encoded><![CDATA[<p>First released in 2008, <strong>Google App Engine</strong> (GAE or AppEngine) was Google&#8217;s first attempt to compete with <a title="Amazon Web Services" href="http://en.wikipedia.org/wiki/Amazon_Web_Services">Amazon Web Services</a> in providing cloud computing platform services for developers. In earlier <a href="http://mrblog.org/2009/10/16/twitmart-ported-off-of-google-app-engine/">posts</a>, I took some heat for concluding that Google App Engine was not ready for &#8220;serious&#8221; applications, even when it was &#8220;free&#8221;.</p>
<p>Recently, Google announced shocking new pricing for appengine that has its <a title="Keep it short: Who is forced to leave GAE?" href="https://groups.google.com/d/topic/google-appengine/obfGjbIkOTI/discussion" target="_blank">users reeling</a>. In short, the new pricing means:</p>
<ul>
<li>“Free” quotas have been drastically reduced</li>
<li>Pricing of paid apps increased significantly</li>
<li>SLA and operational support available for a premium</li>
</ul>
<p>Google has provided a tool so customers can compare their current bills versus expected billis under the new pricing and customers report anywhere from 3x to 30x price increases, leaving many scrambling for alternatives.</p>
<p>Two of the most common complaints from customers are lack of notice and the uncertainty of the pricing (lack of control over costs).</p>
<p>In terms of cost control, the only way to know how much your costs are, is to ask Google, after you have already incurred those costs (and built and deployed your app). It&#8217;s impossible to map users or usage directly to cost. Google&#8217;s pricing scheme is as inscrutible as the worst telephone company billing.</p>
<p>The pricing was originally planned to take effect in September, which only gave customers a few weeks to react. Google has provided optimization guidelines for customers to try to reduce their costs, but given the short notice, customers simply do not have time to make major changes to their apps. Companies already had their development resources planned out. They aren&#8217;t sitting around waiting for Google to throw a wrench at them. And it&#8217;s not clear how much further optimization will really save you anyway since a lot of apps have already received cost-cutting optimizations.</p>
<p>To me, I think this goes a long way to confirm some of my concerns about Google as a cloud platform vendor and as an enterprise vendor in general. A lot of people think anything Google touches is golden (especially Google, just ask them), but I think this shows how they still just don&#8217;t get it when it comes to providing commercial grade services. I have asked before, regarding many Google products, whether Google was serious this time. This is the risk to me of doing any business with Google. All these other non-search products are simply &#8220;tests&#8221; for them. A few billion here, a few billion there, throw it out and see what sticks. The problem is, if you latch on to one of these products and then it becomes critical to your business, you just never know when Google might, on a whim, go in a different direction, hanging you out to dry.</p>
<p>And that appears to be how a lot of customers feel about this move by Google, such as expressed in this <a title="App Engine is finished, here's why" href="http://groups.google.com/group/google-appengine/browse_thread/thread/9a20d89a23ea18e0/695c8642e4fbb703?lnk=raot&amp;pli=1" target="_blank">post</a> on the mailing list:</p>
<blockquote><p><strong>App Engine is finished, here&#8217;s why</strong></p>
<p>What has always been the biggest concern about App Engine? Lock-in. You&#8217;re at the mercy of Google. Sure there&#8217;s TyphoonAE etc&#8230; but really those are not alternatives.</p>
<p>What does Google go ahead and do? They do exactly what their critics said they would do and what us GAE adopters hoped like hell they would never do, screw us over.</p>
<p>App Engine is finished not because we&#8217;re all going to move off to EC2, but because people who are considering using App Engine will see exactly what has gone on here with the pricing, think about the lock-in argument against GAE, and decide not to use GAE. There will be a drop off in new apps, and eventually Google is going to see GAE isn&#8217;t really panning out and pull the 3 year plug.</p></blockquote>
<p>Thankfully, I don&#8217;t operate any services on GAE with high costs, but even as it is, I feel ripped-off for my investment in AppEngine. I do run some services on it, some of which I would rather not have to shut down, so I might have to move those elsewhere. And there are some apps I will simply shut down because they are not worth the trouble to port elsewhere. Some of those apps were potentially interesting and gathering users &#8211; in that sense, I&#8217;m glad this move by Google is happening now, before these apps got big enough to have to now decide what to do with them.</p>
<p>What&#8217;s worse for me though, is simply all the time invested in learning AppEngine. What a waste of time that appears to have been. As one developer <a href="http://news.ycombinator.com/item?id=2955813">says</a>:</p>
<blockquote><p>The biggest complaint is that when my friends and peers objected to App Engine, its strange requirements and its potential lock in, <em>they were right and I am a fucking naive idiot</em>. And I really don&#8217;t like to be proven a naive idiot. I put my faith in Google&#8217;s engineers and they have <em>utterly destroyed my credibility</em>. THIS more than anything is the <em>cost</em> to me.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://mrblog.org/2011/09/13/wow-am-i-happy-now-that-i-didnt-deploy-serious-apps-on-google-app-engine/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Apple&#8217;s great Mac OS X bait and switch</title>
		<link>http://mrblog.org/2010/10/26/apples-great-mac-os-x-bait-and-switch/</link>
		<comments>http://mrblog.org/2010/10/26/apples-great-mac-os-x-bait-and-switch/#comments</comments>
		<pubDate>Wed, 27 Oct 2010 05:59:22 +0000</pubDate>
		<dc:creator>MrBlog</dc:creator>
				<category><![CDATA[business models]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://mrblog.org/?p=1260</guid>
		<description><![CDATA[It&#8217;s been almost three years now since, with great fanfare , I switched from a UNIX Workstation to a Mac as my primary desktop workstation. That change was many years in the making &#8211; I worked with Mac OS X along side my trusty UNIX workstations for several years before making the complete jump. Apple baited me, and a lot of us Linux and UNIX developers, with the charm of a real UNIX OS underneath &#8211; more or less everything one gets with a typical modern Linux distribution simply by opening a Terminal window &#8211; while being wrapped in a nice modern GUI supporting tons of &#8220;mainstream&#8221; Apps, like MS Office and Adobe Photoshop. No more dual-booting. No more firing up a Linux VM to do development. It was glorious, while it lasted&#8230; With Apple&#8217;s deprecation of Java, with no warning at all last week, we have to accept that the &#8220;switch&#8221; part of the bait and switch may now be on. As Paul Rubens says in Apple Tells Developers, &#8216;Mac OS X, Hold the Java&#8217;: If you&#8217;re a developer that relies on having access to Java and you happen to like the Mac platform, then don&#8217;t expect your treatment [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been almost three years now since, with <a href="http://mrblog.org/2008/01/14/the-end-of-an-era/">great fanfare</a> <img src='http://mrblog.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  , I switched from a UNIX Workstation to a Mac as my primary desktop workstation. That change was many years in the making &#8211; I worked with Mac OS X along side my trusty UNIX workstations for several years before making the complete jump.</p>
<p>Apple <strong>baited</strong> me, and <em>a lot </em>of us Linux and UNIX developers, with the charm of a real UNIX OS underneath &#8211; more or less everything one gets with a typical modern Linux distribution simply by opening a Terminal window &#8211; while being wrapped in a nice modern GUI supporting tons of &#8220;mainstream&#8221; Apps, like MS Office and Adobe Photoshop. No more dual-booting. No more firing up a Linux VM to do development. It was glorious, while it lasted&#8230;</p>
<p>With Apple&#8217;s <a href="http://developer.apple.com/library/mac/#releasenotes/Java/JavaSnowLeopardUpdate3LeopardUpdate8RN/NewandNoteworthy/NewandNoteworthy.html#//apple_ref/doc/uid/TP40010380-CH4-SW1">deprecation of Java</a>, with no warning at all last week, we have to accept that the <strong>&#8220;switch&#8221;</strong> part of the <strong>bait and switch</strong> may now be on. As Paul Rubens says in <a href="http://www.serverwatch.com/trends/article.php/3910016/Apple-Tells-Developers-Mac-OS-X-Hold-the-Java.htm" target="_blank">Apple Tells Developers, &#8216;Mac OS X, Hold the Java&#8217;</a>:</p>
<blockquote><p>If you&#8217;re a developer that relies on having access to Java and you happen to like the Mac platform, then don&#8217;t expect your treatment at the hands of Apple to be any better. Apple is making it quite clear that it&#8217;s not the slightest bit interested in repaying your investment in it.</p></blockquote>
<p>Around the net, this is being passed off as a minor issue, but as <em>The Register</em> <a href="http://www.theregister.co.uk/2010/10/21/apple_threatens_to_kill_java_on_the_mac/" target="_blank">notes</a>:</p>
<blockquote><p>&#8230;the further implication is that [Apple] will halt all development of Java for Mac. If this happens, it will be left for someone else to provide a viable version of the platform for Macs. And if Apple doesn&#8217;t open source its existing work, that&#8217;s no easy task.</p>
<p>&#8230;We stand by our claim that if Java suddenly disappeared from all desktops, relatively few people would actually notice. But those few include Java developers, which includes, well, Android developers.</p></blockquote>
<p>That may be what Apple&#8217;s real motivation is here, to somehow attack Android (and further alienate Android developers in the process).</p>
<p><a href="http://mrblog.org/wp-content/uploads/2010/10/macguy-finger.jpg"><img class="aligncenter size-full wp-image-1267" title="macguy-finger" src="http://mrblog.org/wp-content/uploads/2010/10/macguy-finger.jpg" alt="" width="100" height="200" /></a></p>
<p>No matter what their motivation, the fact is, Apple appears to be giving some of their most persuasive evangelists the finger. It&#8217;s difficult to say how many former UNIX nerds like myself jumped to Apple over the past 10 years and how many countless &#8220;regular users&#8221; they brought with them, but regardless of the actual absolute number, there is no doubt that this segment was a critical factor to the turn around of Apple&#8217;s image from &#8220;toy&#8221; to &#8220;serious&#8221; machine. Apple has probably decided that they don&#8217;t need us anymore, and they could be right. You never know though &#8211; beware the power of the nerds and geeks, I always say.</p>
]]></content:encoded>
			<wfw:commentRss>http://mrblog.org/2010/10/26/apples-great-mac-os-x-bait-and-switch/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>An Answer for Twitter OAuth-pacalypse</title>
		<link>http://mrblog.org/2010/05/20/an-answer-for-twitter-oauth-pacalypse/</link>
		<comments>http://mrblog.org/2010/05/20/an-answer-for-twitter-oauth-pacalypse/#comments</comments>
		<pubDate>Thu, 20 May 2010 21:42:29 +0000</pubDate>
		<dc:creator>MrBlog</dc:creator>
				<category><![CDATA[protocols]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[mashups]]></category>
		<category><![CDATA[oauth]]></category>

		<guid isPermaLink="false">http://mrblog.org/?p=1170</guid>
		<description><![CDATA[For your smaller Twitter API projects, bash scripts etc, we have launched SuperTweet.net in case you don&#8217;t get OAuth implemented by the time Basic Auth goes away June 30, 2010. It&#8217;s a Twitter proxy &#8211; you use Basic Auth to talk to the proxy, and it uses OAuth to talk to Twitter. For example, to send a tweet, use the http://api.supertweet.net/1/statuses/update.format such as: curl -u user:password -d "status=playing with cURL and the SuperTweet.net API" http://api.supertweet.net/1/statuses/update.xml The password shown in the example above is never your real Twitter password, but a separate password you set up just for use with the SuperTweet.net API &#8211; As with Twitter OAuth, you can revoke, change, or disable that password without any impact to your real Twitter password or Twitter account.  Also, you can deauthorize the SuperTweet.net API application itself on Twitter.com if you think it&#8217;s being bad, again, without affecting your real Twitter password or other Twitter applications. Learn more: http://www.supertweet.net/]]></description>
			<content:encoded><![CDATA[<p>For your smaller Twitter API projects, bash scripts etc, we have launched <a href="http://www.supertweet.net/">SuperTweet.net</a> in case you don&#8217;t get OAuth implemented by the time Basic Auth goes away June 30, 2010. It&#8217;s a Twitter proxy &#8211; you use Basic Auth to talk to the proxy, and it uses OAuth to talk to Twitter.</p>
<div class="wp-caption alignnone" style="width: 530px"><img class=" " title="Simply Sign-In to SuperTweet.net and you will see a list of your Access Credentials" src="http://www.supertweet.net/images/supertweet_homecreds.png" alt="SuperTweet.net Access Credentials" width="520" height="90" /><p class="wp-caption-text">SuperTweet.net Access Credentials</p></div>
<p>For example, to send a tweet, use the <span style="font-family: Courier New;">http://api.supertweet.net/1/statuses/update<em>.format</em></span> such as:</p>
<p style="margin-left: 40px;"><code>curl -u user:password -d  "status=playing with cURL and the SuperTweet.net  API" http://api.supertweet.net/1/statuses/update.xml</code></p>
<p>The password shown in the example above is never your real Twitter password, but a separate password you set up just for use with the SuperTweet.net API &#8211; As with Twitter OAuth, you can revoke, change, or disable that password without any impact to your real Twitter password or Twitter account.  Also, you can deauthorize the SuperTweet.net API application itself on Twitter.com if you think it&#8217;s being bad, again, without affecting your real Twitter password or other Twitter applications.</p>
<p>Learn more: <a title="It's a Twitter proxy - you use Basic Auth to talk to the proxy, and it uses OAuth to talk to Twitter. Easy peasy." href="http://www.supertweet.net/">http://www.supertweet.net/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mrblog.org/2010/05/20/an-answer-for-twitter-oauth-pacalypse/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Some iPad thoughts</title>
		<link>http://mrblog.org/2010/04/13/some-ipad-thoughts/</link>
		<comments>http://mrblog.org/2010/04/13/some-ipad-thoughts/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 22:09:00 +0000</pubDate>
		<dc:creator>MrBlog</dc:creator>
				<category><![CDATA[future]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://mrblog.org/?p=1136</guid>
		<description><![CDATA[A little birdie told me that you (all seven of you) have been waiting anxiously for my thoughts on the iPad &#8211; the definitive iPad perspective. Here you go. First, I don&#8217;t have one myself yet, but I have had a chance to play on friends&#8217; iPads. Second, while I don&#8217;t consider myself an Apple apologist, some of my friends accuse me of being so. And, finally, before you think I&#8217;m an iPad hater, I want to preface this whole thing with the fact that I do believe that iPad represents a step into the future and while I might not be ready to pay $600 for one today, I expect to have a device like this in my household sometime in the not too distant future. A few jabs&#8230; look away if you can&#8217;t stand anything negative about iPad Upon finally getting my hands on a real iPad to play with for the first time, my first reaction was disappointment in the display quality.  I had been pumped up to expect pictures, video and web sites to be &#8220;gorgeous&#8221; and &#8220;stunning&#8221;, but for me it was more meh.  Perhaps my expectations were just too high. Some examples: Video. Maybe [...]]]></description>
			<content:encoded><![CDATA[<p>A little birdie told me that you (all seven of you) have been waiting anxiously for my thoughts on the iPad &#8211; the definitive iPad perspective. <img src='http://mrblog.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Here you go.</p>
<p>First, I don&#8217;t have one myself yet, but I have had a chance to play on friends&#8217; iPads. Second, while I don&#8217;t consider myself an Apple apologist, some of my friends accuse me of being so. And, finally, before you think I&#8217;m an iPad hater, I want to preface this whole thing with the fact that I do believe that iPad represents a step into the future and while I might not be ready to pay $600 for one today, I expect to have a device like this in my household sometime in the not too distant future.</p>
<p><strong>A few jabs&#8230; </strong><em>look away if you can&#8217;t stand anything negative about iPad</em><strong><br />
</strong></p>
<p>Upon finally getting my hands on a real iPad to play with for the first time, my first reaction was disappointment in the display quality.  I had been pumped up to expect pictures, video and web sites to be &#8220;gorgeous&#8221; and &#8220;stunning&#8221;, but for me it was more <em>meh</em>.  Perhaps my expectations were just too high. Some examples:</p>
<p style="padding-left: 30px;"><strong>Video. </strong>Maybe it&#8217;s just me, but I thought the video in particular was okay,  but not stellar or HDTV beautiful. It looked to me like typical medium-rez PC video, pixelated, blurry, and laced with digital artifacts &#8211; granted, on a bright and glossy screen.</p>
<p style="padding-left: 30px;"><strong>Games.</strong> I was also not that impressed with games.  iPad doesn&#8217;t compare to a <span style="text-decoration: line-through;">$300</span> $159 Xbox and $150 HDTV. My son is a gamer and he wasn&#8217;t impressed at all either.</p>
<p style="padding-left: 30px;"><strong>Web pages. </strong>The browsing experience is fast with a nice UI generally. But, <a href="http://fontfeed.com/archives/ipad-typography/" target="_blank">as others have noted</a>, the typography could be better.</p>
<h2><strong>So how does it change the world?</strong></h2>
<p>In what could be characterized as <em>&#8220;flame-bait&#8221;</em>, Daniel Eran Dilger names <a href="http://www.roughlydrafted.com/2010/04/02/ipad-the-destroyer-19-things-it-will-kill/" target="_blank">19 things iPad will kill</a> including: <strong>Kindle, Netbook PCs, PSP, DS, Flash, Silverlight, MS Office, Windows Media Center, set-top boxes, TiVo, Chrome OS, </strong>and<strong> Android</strong>. While I take issue with some of the history and reasoning in Dilger&#8217;s post, I generally agree with the conclusions. That&#8217;s a lot of carnage.</p>
<p>But that&#8217;s already been said.  Probably every idea regarding iPad has already been said somewhere out there in the Internets, but here are a few ideas I haven&#8217;t seen yet.</p>
<h2><strong>Does it spell the end of open-computing?</strong></h2>
<p>There are a lot of fears that iPad marks the beginning of the end for computers as we know them. That is, the kind of computers that let us download and buy software from wherever we want. I think this is <strong>partially true</strong>. I don&#8217;t think &#8220;real computers&#8221; go away, but iPad (and its future offspring) certainly change the role of real computers. It won&#8217;t happen overnight, but they will be shifting into a niche role, for high-end verticals. For one thing, you still need a &#8220;real computer&#8221; to develop the software that runs on the closed systems like iPad.  These old-school type machines will still be used for other high-end applications, like professional photo work, video etc.  They won&#8217;t go away completely, but over time, &#8220;real computers&#8221; become less mainstream and most people get all they need from &#8220;closed&#8221; machines like iPad.</p>
<p>I think there will be room for <strong>hybrids</strong>, computers that can act like iPads, and iPads than can act like computers. Consider an <strong>iPad-pro</strong> that is essentially a <a href="http://www.tuaw.com/2010/04/05/the-ipad-has-been-jailbroken/" target="_blank">jailbroken iPad</a>. I think iPad will (or should) become an App on Macs (essentially an end-user version of the iPad emulator we have in Xcode) &#8211; sort of analogous to how <em>Front Row</em> makes AppleTV an App on Macs &#8211; oh yeah, and Macs will have multi-touch touchscreens.</p>
<h2><strong>Does it replace the laptop?</strong></h2>
<p>Here&#8217;s my take. <strong>Yes</strong>, for most people&#8230; but not entirely.  Or, in other words, maybe my answer is really &#8220;well, sorta.&#8221;  You see, I think <strong>the laptop and the iPad will converge</strong>, into a spectrum of machines ranging from, on the low-end, closed devices that look like the iPad of today and, on the high-end, devices that look a bit more like a laptop of today, or more like the tablet-PC type machines.  But these higher-end machines will be more niche, less mainstream.</p>
<p>The iPad type device will be the core device and there will be a range from more phone-like ones, smaller and more portable, to larger, more &#8220;coffee-table&#8221; ones.</p>
<p>You&#8217;ll drop this semi-portable iPad type device on your desk and it will sync up to your bigger HD monitor and physical keyboard (for those that want the old school type PC) and will act mostly like a PC as we know it today.  You&#8217;ll do all the stuff people do, web surfing, documents, presentations, music, video, greeting cards (yes it will sync to a printer too) and of course email, chat (and blogging) etc.  For most people, this is all they&#8217;ll ever need and the iPad becomes their laptop, desktop, mobile, coffee table, and multimedia home entertainment device. Done.</p>
<p>In a desktop mode, the iPad may physically also serve as the equivalent of the mouse, or i.e. one of the input devices of this &#8220;docking station&#8221; computer-like setup.  There may even be docking stations that look like a laptop as we know them today. Some peripherals will connect physically. Most will connect wirelessly (finally, Bill Joy&#8217;s <a title="How does Bill Joy feel about this 1999 article stamped with an Oracle brand?" href="http://java.sun.com/developer/technicalArticles/jini/JiniVision/jiniology.html" target="_blank">Jini dream</a> comes to life).</p>
<p>This future is a docking station, cloud-computing, traditional computing hybrid model.  Some data and apps are in the could. Some are local, or cached in a hybrid cloud model. Some computing tasks happen on the iPad &#8220;core&#8221; device. Others occur within separate CPUs in the linked up and networked peripherals (this already happens today, with routers, network storage, our TVs, Bluray players, etc).</p>
<p>At the low-end (and the largest mainstream segment) it&#8217;s a <strong>closed world</strong>, where people get Apps from approved app stores and that&#8217;s fine with them.  For a price, on the high-end there will be more &#8220;open&#8221; platforms, all the way up to the top of the stack, the platforms used to develop the code for the &#8220;closed&#8221; platforms.  There will be some layers in between: iPads that are more &#8220;open&#8221;  as well as traditional-style computers that are more &#8220;closed&#8221; and some hybrids in between.</p>
<p>So, in the end, I don&#8217;t think iPad spells doom and gloom or the end of software innovation. Things are going to change. There will be winners and there will be losers. But I think there will be opportunity throughout the value chain with wealth spread around in a long-tail manner. Yes, the vast majority mainstream users will be on &#8220;closed&#8221; platforms (by today&#8217;s definition) but that may be a good thing, in some ways &#8211; and the iPad is certainly not really &#8220;closed&#8221; compared to, say, a cable TV set-top box. People can still get third-party apps, and (probably) users will still be able to use web apps without Apple approval.</p>
<h2><strong>Final thoughts, Immediate uses for iPad</strong></h2>
<p><strong>On the coffee-table</strong>.<strong> </strong>For me, the first use is as a living room device, a coffee-table browser basically. This is particularly true of this first generation of iPad that doesn&#8217;t have cellular data, so it will only work in Wifi hotspots, making it somewhat less useful as a mobile device. I think before long, we are just going to <em>expect</em> to find an iPad on the coffee table.</p>
<p><strong>Laptop substitute</strong>. There&#8217;s also the &#8220;almost laptop&#8221; role.  I&#8217;ve tried countless devices over the years for this purpose (including the <a title="Zaurus post from 2003" href="http://mrblog.org/2003/10/18/using-sprint-1xrtt-service-with-zaurus/">Sharp Zaurus</a> and <a title="N800 post from 2007" href="http://mrblog.org/2007/06/05/nokia-n800-a-pleastant-surprise/">Nokia N800</a>) and I&#8217;ve always come back to a real laptop. For everything I can&#8217;t do on my iPhone, I pretty much need a real laptop, particularly if it involves connecting to external hardware, like flashdrives, printers or VGA/DVI video projectors. For me, the iPad in its current form may not be adequate, sitting in limbo between the iPhone and a real laptop, but there may be some times when it would work for me as a substitute for a laptop. I think for a lot of people, <a href="http://www.huffingtonpost.com/larry-magid/can-an-ipad-replace-a-lap_b_524318.html" target="_blank">including journalist Larry Magid</a>, the iPad serves this role just fine already, in its current form.</p>
<p><strong>Demos</strong>. I think the iPad will be the new hand-held interactive brochure. I don&#8217;t do a lot of this kind of activity myself, but I think these will be all over trade-show floors, showrooms, etc.</p>
<p>Contrary to the views of many, I don&#8217;t think the iPad, or at least not this first version, will be that huge of an eBook reader&#8230; yet. I think it will get there, but I think initially people will use it, especially the first wifi-only iPads, in the above roles more than as an eBook reader.  Nor do I think it will be a big game machine &#8211; people will play games on it for sure, and eventually it surpasses PSP, DS etc. &#8211; but in the near term, partially due to cost, pure gamers will stick with other platforms/devices.</p>
<p>Any bets on how soon before I get an iPad?  When are you getting yours?</p>
]]></content:encoded>
			<wfw:commentRss>http://mrblog.org/2010/04/13/some-ipad-thoughts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java culture rant</title>
		<link>http://mrblog.org/2010/02/04/java-culture-rant/</link>
		<comments>http://mrblog.org/2010/02/04/java-culture-rant/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 20:42:50 +0000</pubDate>
		<dc:creator>MrBlog</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://mrblog.org/?p=1081</guid>
		<description><![CDATA[As some of you may know, over the last year or so I&#8217;ve been spending more time with larger and larger Java-based server-side projects (including Quick Bit Notes, Twitmart, Litetext, and iSpykee). In this process, I&#8217;ve had to &#8220;catch up&#8221; to the Java state-of-the-art and get reacquainted with the Java culture. Much of this has come with the great patience of my friend Mark Petrovic who has helped me immensely in this endeavor. It has been an overall very positive experience, to the point that Java is now my first choice starting point for server-side and web-app projects. So here&#8217;s the rant: What is it with Java tool developers that they like to &#8220;improve&#8221; their APIs in non-backwards compatible ways on a semi-regular basis? Perhaps I&#8217;ve just been &#8220;lucky&#8221; but I&#8217;ve experienced this with many of the key packages I&#8217;m using, such as Jetty, Twitter4J, and Lucene.  It&#8217;s almost like it&#8217;s part of the culture to break things, just to shake things up.  Maybe it&#8217;s a &#8220;purity&#8221; thing and they always think their API needs to be cleaner and the only way to get there is to break it (again). One of the biggest hassles that come with this culture [...]]]></description>
			<content:encoded><![CDATA[<p>As some of you may know, over the last year or so I&#8217;ve been spending more time with larger and larger Java-based server-side projects (including <a href="http://mrblog.org/2009/10/12/introducing-quick-bit-notes/">Quick Bit Notes</a>, <a href="http://twitmart.org/">Twitmart</a>, <a href="http://mrblog.org/2009/10/26/litetext-for-rendering-text-into-a-bitmap-on-google-app-engine-java/">Litetext</a>, and <a href="http://mrblog.org/2009/03/15/ispykee-open-source-spykee-for-iphone/">iSpykee</a>).  In this process, I&#8217;ve had to &#8220;catch up&#8221; to the Java state-of-the-art and get reacquainted with the Java culture.</p>
<p>Much of this has come with the great patience of my friend <a href="http://radioae6rt.wordpress.com/">Mark Petrovic</a> who has helped me immensely in this endeavor. It has been an overall very positive experience, to the point that Java is now my first choice starting point for server-side and web-app projects.</p>
<p><strong>So here&#8217;s the rant:</strong></p>
<p><em>What is it with Java tool developers that they like to &#8220;improve&#8221; their APIs in non-backwards compatible ways on a semi-regular basis?</em></p>
<p>Perhaps I&#8217;ve just been &#8220;lucky&#8221; but I&#8217;ve experienced this with many of the key packages I&#8217;m using, such as Jetty, Twitter4J, and Lucene.  It&#8217;s almost like it&#8217;s part of the culture to break things, just to shake things up.  Maybe it&#8217;s a &#8220;purity&#8221; thing and they always think their API needs to be cleaner and the only way to get there is to break it (again).</p>
<p>One of the biggest hassles that come with this culture is that it makes it really hard to come up to speed on a tool because you have to also study the full history of it, scattered across countless message boards, blogs, and websites (oh my!).  When you run across examples showing use of the package, they often only work with the specific version of the package/tool from some point in the past. Of course these examples seldom state which version they were written for nor are they updated to bring them current to the latest version. Coming out of the blue, being new to one of these packages, it&#8217;s really hard to tell when the package diverged and in what way the rules changed.</p>
<p>It seems like every Java tool developer thinks their users are, or should be, spending every waking minute on <em>their</em> specific development-talk forum.</p>
<p>Is it just me? Am I really the only one who struggles with this?</p>
]]></content:encoded>
			<wfw:commentRss>http://mrblog.org/2010/02/04/java-culture-rant/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Litetext for rendering text into a bitmap on Google App Engine Java</title>
		<link>http://mrblog.org/2009/10/26/litetext-for-rendering-text-into-a-bitmap-on-google-app-engine-java/</link>
		<comments>http://mrblog.org/2009/10/26/litetext-for-rendering-text-into-a-bitmap-on-google-app-engine-java/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 03:21:08 +0000</pubDate>
		<dc:creator>MrBlog</dc:creator>
				<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://mrblog.org/?p=1015</guid>
		<description><![CDATA[While developing Quick Bit Notes, I realized that the Google App Engine &#8220;sandbox&#8221; for Java doesn&#8217;t support AWT or other graphics Java classes, so I put together a simple &#8220;old-school&#8221; text rendering class that&#8217;s compatible with App Engine, called litetext. This small package (less than 1000 lines of Java code) was developed to provide a small and simple package for rendering text into an image (bitmap). It was developed for Google App Engine use where AWT and BufferedImage et al do not exist. This small utility can be used to render text on App Engine within the constraints of the JRE Class White List. This is derived from the &#8220;pbmtext&#8221; utility from NETpbm Copyright (C) 1991 by Jef Poskanzer. These are crude black-and-white bitmap fonts &#8211; no anti-aliasing. A small number of BDF fonts in fixed-sizes are bundled into the package: Courier, Lucida-Bold-Italic, Lucida-Medium, Lucida-Medium-Italic, LucidaBright-DemiBold, LucidaTypewriter, LucidaTypewriter-Bold, and a default serif font. The following code snippet demonstrates use of litetext on App Engine: byte[] bmp_data = fm.doRender(inputText, fontname); ImagesService imagesService = ImagesServiceFactory.getImagesService(); Image bmpImage = ImagesServiceFactory.makeImage(bmp_data); Transform flipit = ImagesServiceFactory.makeVerticalFlip(); Image newImage = imagesService.applyTransform(flipit, bmpImage, com.google.appengine.api.images.ImagesService.OutputEncoding.JPEG); You can grab it via SVN at http://code.google.com/p/litetext/ There are docs on the [...]]]></description>
			<content:encoded><![CDATA[<p>While developing <a href="http://appgallery.appspot.com/about_app?app_id=agphcHBnYWxsZXJ5chQLEgxBcHBsaWNhdGlvbnMYxcEXDA" target="_blank">Quick Bit Notes,</a> I realized that the Google App Engine &#8220;sandbox&#8221; for Java doesn&#8217;t support AWT or other graphics Java classes, so I put together a simple &#8220;old-school&#8221; text rendering class that&#8217;s compatible with App Engine, called <a href="http://code.google.com/p/litetext/" target="_blank">litetext</a>.</p>
<blockquote><p>This small package (less than 1000 lines of Java code) was developed to provide a small and simple package for rendering text into an image (bitmap). It was developed for Google App Engine use where AWT and BufferedImage et al do not exist. This small utility can be used to render text on App Engine within the constraints of the JRE Class White List. This is derived from the &#8220;pbmtext&#8221; utility from NETpbm Copyright (C) 1991 by Jef Poskanzer.</p>
<p>These are crude black-and-white bitmap fonts &#8211; no anti-aliasing. A small number of BDF fonts in fixed-sizes are bundled into the package: Courier, Lucida-Bold-Italic, Lucida-Medium, Lucida-Medium-Italic, LucidaBright-DemiBold, LucidaTypewriter, LucidaTypewriter-Bold, and a default serif font.</p></blockquote>
<p>The following code snippet demonstrates use of litetext on App Engine:</p>
<div style="margin: 0 20px 6px 20px 0; padding: 6px 20px 6px 20px; background: #e5ecf9"><code> byte[] bmp_data = fm.doRender(inputText, fontname);<br />
ImagesService imagesService = ImagesServiceFactory.getImagesService();<br />
Image bmpImage = ImagesServiceFactory.makeImage(bmp_data);<br />
Transform flipit = ImagesServiceFactory.makeVerticalFlip();<br />
Image newImage = imagesService.applyTransform(flipit, bmpImage, com.google.appengine.api.images.ImagesService.OutputEncoding.JPEG);<br />
</code></div>
<p>You can grab it via SVN at <a title=" litetext Lite Java package for rendering of text into a bitmap using simple bitmap fonts " href="http://code.google.com/p/litetext/">http://code.google.com/p/litetext/</a></p>
<p>There are docs on the project site for <a href="http://code.google.com/p/litetext/wiki/FontDetails" target="_blank">adding fonts</a> and an <a href="http://code.google.com/p/litetext/wiki/AppEngineServelet" target="_blank">example demo servlet</a> is included. See the <a href="http://quickbitnotes.appspot.com/litetextform.html" target="_blank">Live Demo</a>.</p>
<p>Use this command to check out the latest project source code anonymously over HTTP:</p>
<div style="margin: 0 20px 0 20px 0; padding: 6px 20px 6px 20px; background: #e5ecf9"><code>svn checkout http://litetext.googlecode.com/svn/trunk/ litetext-read-only<br />
</code></div>
]]></content:encoded>
			<wfw:commentRss>http://mrblog.org/2009/10/26/litetext-for-rendering-text-into-a-bitmap-on-google-app-engine-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Introducing Quick Bit Notes</title>
		<link>http://mrblog.org/2009/10/12/introducing-quick-bit-notes/</link>
		<comments>http://mrblog.org/2009/10/12/introducing-quick-bit-notes/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 04:59:15 +0000</pubDate>
		<dc:creator>MrBlog</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[appengine]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://mrblog.org/?p=970</guid>
		<description><![CDATA[I&#8217;ve released Quick Bit Notes (QBN) as an experiment in an unconventional method of person-to-person asynchronous communication. One person drops off a personal note for another person. That note is stored and presented in image form to the recipient. The actual text is never stored on QBN and never transferred over the wire when the recipient views the message. QBN offers an alternative to complicated software, shared keys, and so on. All one needs to use the service is a browser and Gmail email account. The service is running on Google App Engine for Java and is available as open-source on Google code: http://code.google.com/p/quickbitnotes. It should be relatively easy to deploy in your own App Engine appspot &#8220;slot&#8221; (refer to the README in the source archive).  If you want to be an SVN contributor to the code, just let me know. In the process of developing Quick Bit Notes, I also created a small Java text-rendering library, based on NETpbm, that operates within the constraints of the Google App Engine JRE &#8220;white list&#8221;. This is a stand-alone JAR that can be used with other App Engine projects and is also available as open source on Google Code: http://code.google.com/p/litetext/ If you&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve released <a href="http://quickbitnotes.appspot.com/">Quick Bit Notes </a> (QBN) as an experiment in an unconventional method of person-to-person asynchronous communication. One person drops off a personal note for another person. That note is stored and presented in image form to the recipient. The actual text is never stored on QBN and never transferred over the wire when the recipient views the message.</p>
<p><img class="alignnone size-full wp-image-978" title="twoposts" src="http://mrblog.org/wp-content/uploads/2009/10/twoposts.png" alt="twoposts" width="472" height="49" /></p>
<p>QBN offers an alternative to complicated software, shared keys, and so on. All one needs to use the service is a browser and Gmail email account.</p>
<p><img class="alignnone size-full wp-image-980" title="personal" src="http://mrblog.org/wp-content/uploads/2009/10/personal.png" alt="personal" width="548" height="90" /></p>
<p>The service is running on <a href="http://mrblog.org/2009/10/01/experimenting-with-google-appengine-for-java/">Google App Engine for Java</a> and is available as open-source on Google code: <a title="Quick notes-as-images messaging system" href="http://code.google.com/p/quickbitnotes" target="_blank">http://code.google.com/p/quickbitnotes</a>. It should be relatively easy to deploy in your own App Engine appspot &#8220;slot&#8221; (refer to the README in the source archive).  If you want to be an SVN contributor to the code, just let me know.</p>
<p><img class="alignnone size-full wp-image-985" title="encryption" src="http://mrblog.org/wp-content/uploads/2009/10/encryption.png" alt="encryption" width="526" height="76" /></p>
<p>In the process of developing Quick Bit Notes, I also created a small Java text-rendering library, based on NETpbm, that operates within the constraints of the Google App Engine JRE &#8220;white list&#8221;.  This is a stand-alone JAR that can be used with other App Engine projects and is also available as open source on Google Code: <a title="Lite Java package for rendering of text into a bitmap using simple bitmap fonts" href="http://code.google.com/p/litetext/" target="_blank">http://code.google.com/p/litetext/</a></p>
<p><img class="alignnone size-full wp-image-993" title="madrid" src="http://mrblog.org/wp-content/uploads/2009/10/madrid.png" alt="madrid" width="563" height="220" /></p>
<p>If you&#8217;ve followed along, by now you may see some applications of QBN for your own personal communications.  If you&#8217;re not seeing it yet, QBN is probably not for you, so please don&#8217;t waste your time or mine spending time on it. And, please, dear god, don&#8217;t ask me questions like &#8220;what&#8217;s the distribution strategy&#8221; or tell me all the reasons why this service will never take off and how Twitter is so much better. <img src='http://mrblog.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://mrblog.org/2009/10/12/introducing-quick-bit-notes/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Experimenting with Google AppEngine for Java</title>
		<link>http://mrblog.org/2009/10/01/experimenting-with-google-appengine-for-java/</link>
		<comments>http://mrblog.org/2009/10/01/experimenting-with-google-appengine-for-java/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 00:10:12 +0000</pubDate>
		<dc:creator>MrBlog</dc:creator>
				<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[appengine]]></category>

		<guid isPermaLink="false">http://mrblog.org/?p=933</guid>
		<description><![CDATA[A while back, I noted that Google had announced that they would be supporting Java on their AppEngine cloud computing platform. I finally got around to working on a significant AppEngine for Java project (something beyond &#8220;hello world&#8221; or the demo &#8220;Guestbook&#8221; app). Working with my friend and colleague, and serious Java guru, Mark Petrovic we decided that a good &#8220;Goldilocks&#8221; candidate, that was neither too big, nor too trivial, was the experimental service Twitmart.org, a classifieds marketplace mashup, using Twitter APIs. We decided that &#8220;porting&#8221; an existing web-based application rather than inventing a new one made more sense because this way we really didn&#8217;t have to think a lot about the design or functional specifications.  We already had them. We just had to think about how to implement to those specifications on a Java-based web application platform, and specifically, the Google AppEngine for Java platform. With the Twitmart application, the first thing to address was that the site uses Restful-style urls (as opposed to a fully Restful architecture, for you Rest weenies). This introduces a number of issues. The AppEngine for Java platform implements the venerable, but now decade-old, Java Servlet API. Servlets don&#8217;t naturally support the clean urls [...]]]></description>
			<content:encoded><![CDATA[<p>A while back, I noted that Google had announced that they would be supporting Java on their AppEngine cloud computing platform. I finally got around to working on a significant AppEngine for Java project (something beyond &#8220;hello world&#8221; or the demo &#8220;Guestbook&#8221; app).</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://www.youtube.com/v/4nqMmG3TYtM&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/4nqMmG3TYtM&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Working with my friend and colleague, and serious Java guru, <a href="http://radioae6rt.wordpress.com/" target="_blank">Mark Petrovic </a> we decided that a good &#8220;Goldilocks&#8221; candidate, that was neither too big, nor too trivial, was the experimental service <a title="Twitmart is a free classifieds marketplace using Twitter." href="http://www.twitmart.org/about/factsheet" target="_blank">Twitmart.org</a>, a classifieds marketplace mashup, using Twitter APIs.</p>
<p>We decided that &#8220;porting&#8221; an existing web-based application rather than inventing a new one made more sense because this way we really didn&#8217;t have to think a lot about the design or functional specifications.  We already had them. We just had to think about how to implement to those specifications on a Java-based web application platform, and specifically, the Google AppEngine for Java platform.</p>
<p>With the <strong>Twitmart</strong> application, the first thing to address was that the site uses Restful-style urls (as opposed to a fully Restful architecture, for you Rest weenies). This introduces a number of issues. The AppEngine for Java platform implements the venerable, but now decade-old, <a title="the Java Servlet standard " href="http://java.sun.com/products/servlet/" target="_blank">Java Servlet API</a>. Servlets don&#8217;t naturally support the clean urls that are essential in modern web applications.</p>
<p>Bad =&gt; <code>/post.jsp?type=area&amp;hash=forsale&amp;postid=hKqo1</code><br />
Good =&gt; <code>/post/area/forsale/hKqo1</code></p>
<p>One way to go about this is to do it the old fashioned hard-coded way and manually parse urls and forward to servlets for the action. We considered doing so, as a last resort, but it would be painful and potentially a maintenance nightmare.</p>
<p>We had hoped to use <a title="Reference Implementation for building RESTful Web services" href="https://jersey.dev.java.net/" target="_blank">Jersey </a>but found that it was <a title="Thread on Jersey and Google App Engine" href="http://n2.nabble.com/Jersey-and-Google-App-Engine-update-td3668720.html" target="_blank">not quite there yet</a> in terms of compatibility with Google AppAngine, although it looks like there is progress and we will see at least a subset of Jersey supported on AppEngine at some point. For this project, we decided that the outstanding issues with Jersey on AppEngine were more than we wanted to deal with. Since <strong>Twitmart</strong> is a <em>web site</em> rather than a <em>web service API</em>, perhaps Jersey isn&#8217;t quite the right platform anyway.</p>
<p>Regardless, we went with <a title="Restlet Lightweight REST framework" href="http://www.restlet.org/" target="_blank">Restlet</a>, which does <a title="Restlet edition for Google App Engine" href="http://wiki.restlet.org/docs_2.0/13-restlet/275-restlet/252-restlet.html" target="_blank">support AppEngine in their latest unstable releases</a>. Going with Restlet meant that we also needed a compatible template engine to replace JSP. We went with <a href="http://freemarker.org/" target="_blank">Freemarker</a> which is supported as a <a href="http://www.restlet.org/documentation/snapshot/jse/ext/org/restlet/ext/freemarker/package-summary.html" target="_blank">Restlet extension</a>.</p>
<p>There are many Java libraries for accessing Twitter APIs. We went with <a href="http://yusuke.homeip.net/twitter4j/en/index.html" target="_blank">Twitter4J</a> which appears to be the most AppEngine friendly (and it&#8217;s a nice, clean API too).</p>
<p>With all of these building blocks in place, the port of <strong>Twitmart</strong> to AppEngine for Java was mostly a matter of grinding it out. Here&#8217;s a bunch of stuff we learned in the process:</p>
<p style="padding-left: 30px;"><strong>Restlet, Freemarker, and Twitter4J work on AppEngine</strong></p>
<p style="padding-left: 30px;">The <strong>Twitmart</strong> application doesn&#8217;t exercise every part of any of these tools, but the basics clearly work. That&#8217;s nice to know. We will use these again on future projects.</p>
<p style="padding-left: 30px;"><strong>Servlets and Restlets can co-exist</strong></p>
<p style="padding-left: 30px;">A few of the operations that <strong>Twitmart</strong> does were better suited to traditional servlets. With some effort, we probably could have made them work as Restlets, but it was much quicker and easier to make them servlets, so that&#8217;s what we did. And it works. Servlet urls are directed to servlet classes in the usual way in the <code>web.xml</code> config while everything else is passed through the Restlet adapter/router class.</p>
<p style="padding-left: 30px;"><strong>The AppEngine Text class overcomes the 500-character limit of Strings in the datastore</strong></p>
<p style="padding-left: 30px;">The datastore will only accept Strings of up to 500 characters. To store larger text, one must use blobs. AppEngine provides a Text class that makes this pretty easy &#8211; but it does make your application more AppEngine specific. A Text object cannot be viewed in the datastore viewer (admin panel) and they cannot be indexed or queried.</p>
<div style="margin: 10px 60px 10px 60px; padding: 20px; background: #E0EEB6; border: 2px solid #666"><code>@Persistent(defaultFetchGroup = "true")<br />
private Text desc;</code></div>
<p style="padding-left: 30px;"><strong>It&#8217;s not that hard to put arbitrary Java objects into the datastore</strong></p>
<p style="padding-left: 30px;">The <strong>Twitmart</strong> application accepts images uploaded by users to display with classified ad postings. Since AppEngine has no writeable file system, these &#8220;image files&#8221; must be placed into (and retrieved from) the datastore.  This turns out to be pretty easy, as long as the size of the data conforms to AppEngine&#8217;s limits &#8211; e.g. 1MB per datastore entity (see <a href="http://code.google.com/appengine/docs/java/datastore/overview.html" target="_blank">http://code.google.com/appengine/docs/java/datastore/overview.html</a>)</p>
<div style="margin: 10px 60px 10px 60px; padding: 20px; background: #E0EEB6; border: 2px solid #666"><code>@Persistent(serialized = "true")<br />
private ImageFile imgfile1;</code></div>
<p style="padding-left: 30px;"><strong>Objects in the datastore have unexpecetd dependencies</strong></p>
<p style="padding-left: 30px;">I don&#8217;t know if  Java bytecode ends up in the datastore or not, but it kind of feels like it does. When we rearranged some classes, we discovered that datastore records using those classes failed with <code>ClassNotFound</code> errors. I guess we should have expected this, but it&#8217;s something to keep in mind &#8211; once something is written to the datastore, never move the class.</p>
<p>As I&#8217;ve <a href="http://mrblog.org/2009/01/30/google-app-engine-teases-but-ultimately-doesnt-deliver/">noted before</a>, the AppEngine datastore is not an RDBMS, despite providing a query capability that might make you think otherwise at first glance. The AppEngine datastore is based on the <a href="http://labs.google.com/papers/bigtable.html" target="_blank">BigTable</a> storage system. BigTable follows a very different philosophy than traditional RDBMS and, as a result, imposes <a href="http://code.google.com/appengine/docs/java/datastore/queriesandindexes.html" target="_blank">many important restrictions</a>. Knowing this from prior work on <a href="http://www.taglets.org">Taglets.org</a> and <a href="http://www.facebook.com/apps/application.php?id=75215734266">other projects</a> on AppEngine for Python, I knew about these restrictions and, in fact, the <strong>Twitmart</strong> application <strong>doesn&#8217;t make any queries at all</strong>; it always <a href="http://code.google.com/appengine/docs/java/datastore/creatinggettinganddeletingdata.html#Getting_an_Object_By_Key" target="_blank">retrieves objects (records) by key</a> and never via query.</p>
<p>Another lesson from our experience with the Python AppEngine was <em>&#8220;be prepared to move off AppEngine&#8221;</em> (for any number of reasons). This means trying to structure your application such that moving to a standard platform will not require a complete re-write. One place to start is to avoid any <code>com.google.appengine.*</code> imports. In the case of this <strong>Twitmart</strong> app, the only place we do that is for the special <code>com.google.appengine.api.datastore.Text</code> class (in order to store text strings larger than 500 characters). This is isolated to a couple of Java classes in this application, but in a larger app, or if such things found their way into too many places, it would be best to write abstraction libraries of some kind to make it easier to separate out AppEngine dependencies later.</p>
<p>The <strong>Twitmart</strong> app, as written, should run on any standard Java web application platform, such as Jetty, pretty easily. However, that said, while using JDO as the data management interface works, in theory, as a way to make your application work on AppEngine and on a standard platform, it might not turn out to be the best way, or the most common technique for managing data on standard web application platforms, in practice. In many cases, you would probably want to add an abstraction layer around your data models to make it easier to swap in different low-level APIs. I think in general, the AppEngine for Java platform makes this easier and more natural than the AppEngine for Python platform, where it takes a lot more effort to keep your app standard-platform ready.</p>
<p>The <strong>Twitmart</strong> port is not done. There are few functions left to implement and a few things still to fix in terms of better exception handling and related cleanup and enhancement, but the primary functionality is operational.  In practice, even with light usage, it is slower on AppEngine than it was on my own server, but I guess that&#8217;s the price you pay for &#8220;free&#8221; &#8211; so much for scaleable. I guess the theory is, on AppEngine it will show similarly poor performance for a dozen users as it does for 100,000 users. <img src='http://mrblog.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Summary</strong></p>
<p>If I develop more AppEngine apps, I&#8217;m going to use the Java AppEngine for sure over the Python AppEngine. Unless there is some really compelling reason (like a specific library I want to use) I don&#8217;t see me writing another App Engine app in Python ever again.</p>
<p>While I still don&#8217;t think Google AppEngine is ready for anything too important yet, if it ever will be, having a Java version is a big step in expanding the possible uses of Google&#8217;s cloud computing platform, IMHO, and I will almost certainly deploy more experimental applications like <a href="http://twitmart.org">Twitmart</a> using AppEngine for Java in the future.</p>
<p><strong>References:</strong></p>
<ul>
<li> <a href="http://code.google.com/appengine/docs/java/overview.html">Google App Engine for Java</a></li>
<li><a href="http://www.restlet.org/">Restlet</a></li>
<li><a href="http://wiki.restlet.org/docs_2.0/13-restlet/275-restlet/252-restlet.html">Restlet edition for Google App Engine</a></li>
<li><a href="http://freemarker.org/">Freemarker</a></li>
<li> <a href="http://www.restlet.org/documentation/snapshot/jse/ext/org/restlet/ext/freemarker/package-summary.html">Freemarker extension for Restlet</a></li>
<li><a href="http://yusuke.homeip.net/twitter4j/en/index.html">Twitter4J</a></li>
<li><a href="http://twitmart.org">Twitmart.org</a></li>
</ul>
<p><strong>UPDATE October 16, 2009:</strong> The performance on App Engine was so poor that we had to move the Twitmart.org site off of App Engine and back to one of our own servers.  Details <a href="http://mrblog.org/2009/10/16/twitmart-ported-off-of-google-app-engine/">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mrblog.org/2009/10/01/experimenting-with-google-appengine-for-java/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Google App Engine adds Cron and Java</title>
		<link>http://mrblog.org/2009/04/08/google-app-engine-adds-cron-and-java/</link>
		<comments>http://mrblog.org/2009/04/08/google-app-engine-adds-cron-and-java/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 23:53:34 +0000</pubDate>
		<dc:creator>MrBlog</dc:creator>
				<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://mrblog.org/?p=704</guid>
		<description><![CDATA[Google today announced that they will be supporting Java on their GAE cloud computing platform.  I signed up for the beta, but don&#8217;t know when/if I&#8217;ll be approved. I also saw that the platform also now includes a cron mechanism to run scheduled &#8220;jobs&#8221;, see: http://code.google.com/appengine/docs/python/config/cron.html This could change things.  It will be interesting to see how (if?) Amazon responds.]]></description>
			<content:encoded><![CDATA[<p>Google today announced that they will be supporting Java on their GAE cloud computing platform.  I signed up for the beta, but don&#8217;t know when/if I&#8217;ll be approved.</p>
<p>I also saw that the platform also now includes a cron mechanism to run scheduled &#8220;jobs&#8221;, see: <a href="http://code.google.com/appengine/docs/python/config/cron.html">http://code.google.com/appengine/docs/python/config/cron.html</a></p>
<p>This could change things.  It will be interesting to see how (if?) Amazon responds.</p>
]]></content:encoded>
			<wfw:commentRss>http://mrblog.org/2009/04/08/google-app-engine-adds-cron-and-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

