<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>giant dancing chipmunk &#187; Alex Leverington</title>
	<atom:link href="http://nessence.net/author/nessence/feed/" rel="self" type="application/rss+xml" />
	<link>http://nessence.net</link>
	<description>Do you remember when people used browsers?</description>
	<lastBuildDate>Fri, 18 Nov 2011 21:50:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='nessence.net' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>giant dancing chipmunk &#187; Alex Leverington</title>
		<link>http://nessence.net</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://nessence.net/osd.xml" title="giant dancing chipmunk" />
	<atom:link rel='hub' href='http://nessence.net/?pushpress=hub'/>
		<item>
		<title>Locking down Facebook Connect</title>
		<link>http://nessence.net/2010/05/20/facebook-connect-security-lockdown/</link>
		<comments>http://nessence.net/2010/05/20/facebook-connect-security-lockdown/#comments</comments>
		<pubDate>Thu, 20 May 2010 10:36:45 +0000</pubDate>
		<dc:creator>Alex Leverington</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[facebook connect]]></category>

		<guid isPermaLink="false">http://nessence.net/?p=298</guid>
		<description><![CDATA[UPDATE #2 (10-Oct 2010): Recently  there&#8217;s been a lot of talk over session hijacking, thanks to Firesheep and github. Dang. I liked the term fb-yelp-gibbed. Considerations below still apply. UPDATE: After conversations with a friend, I made a few changes. Specifically, the fbuid is usable on your site, just don&#8217;t use it together with the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=298&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>UPDATE #2 (10-Oct 2010):</strong> Recently  there&#8217;s been a lot of talk over <a title="session hijacking" href="http://github.com/blog/737-sidejack-prevention">session hijacking</a>, thanks to <a title="Firesheep" href="http://github.com/codebutler/firesheep">Firesheep</a> and github. Dang. I liked the term fb-yelp-gibbed. Considerations below still apply.</p>
<p><strong>UPDATE:</strong> After conversations with a <a href="http://rodrigofranco.com/">friend</a>, I made a few changes. Specifically, the fbuid is usable on your site, just don&#8217;t use it together with the JS library and don&#8217;t trust the browser.</p>
<p>User privacy is non-negotiable and developers should be as responsible as Facebook.</p>
<p>How to secure your FB Connect Implementation (so your users don&#8217;t get fb-yelp-gibbed):</p>
<p><strong>OLD REST API</strong></p>
<ol>
<li><strong>DON&#8217;T</strong> use the JS library (violating this amplifies your users&#8217; exposure; see EXCEPTION below)</li>
<li>Push all FB connect requests through your backend</li>
<li><strong>DON&#8217;T</strong> STORE a userid or fbid in a cookie (only use fbuid client-side for externals; server should never trust browser-supplied fbuid)</li>
<li><strong>DON&#8217;T</strong> STORE your app&#8217;s FB API &#8220;secret&#8221; client-side (in javascript, in device app, etc.; NO EXCEPTIONS)</li>
<li>DO store your user&#8217;s fbid and/or userid, only, on your server</li>
<li>Never give client-side (JS, scripts, etc.) access to userid or fbid</li>
</ol>
<p>When appropriate, verify the FB user is who they say they are by using auth.* methods, linked below; if you&#8217;re not sure what these do or what they&#8217;re for, give yourself 2-4 weeks to understand the ins and outs. OR, See OAuth comments below (and transition to OAuth).</p>
<p><a href="http://developers.facebook.com/docs/reference/rest/auth.getSession">http://developers.facebook.com/docs/reference/rest/auth.getSession</a></p>
<p>For iPhone/Android, learn how to proxy FB connect requests so you NEVER store your API &#8220;secret&#8221; on the phone.</p>
<p>The only communication between your users browser or device and your fb-app should be whether or not the user has been authenticated. Even then you should also utilize the rest/auth.* (server-side) methods to ensure the user actually authenticated.</p>
<p><strong>NEW OAUTH API</strong><br />
Same as above. NEVER send API calls from JS in the browser! Read the authentication guide and understand every concept:</p>
<p><a href="http://developers.facebook.com/docs/authentication/">http://developers.facebook.com/docs/authentication/</a></p>
<p><strong>EXCEPTION</strong><br />
The only exception here is if there&#8217;s ZERO user-generated content, ZERO 3rd-party HTML, ZERO 3rd-party JavaScript on a page, and everything the page and it&#8217;s assets are all sent via SSL. Even then, you&#8217;re at the mercy of the users desktop &#8212; don&#8217;t store userid, fbuid, or api secret anywhere on the client (in code, cookies, etc.)</p>
<p>The other exception here is if you really know what you&#8217;re doing and you&#8217;ve been dealing with XSS and browser authentication for a decade. In that case, I&#8217;m sure all of your application&#8217;s assets are served statically (or through SSL), your JS is locked down with a fine-tooth comb, you don&#8217;t let any advertisers or user-content sneak in HTML or JS, and you don&#8217;t store your FB API secret on the client.</p>
<p><strong>WHY?</strong><br />
This is serious business. Privacy is priceless. Facebook Connect, despite how folks feel, is more secure than many banks. However, their crutch on letting developers do everything with JavaScript, and browsers limited support for security (injecting JS is like godmode in Doom), have put Facebook at the forefront of all of our security misgivings.</p>
<p><strong>BUT WHAT ABOUT PRIVACY / PAI</strong><br />
A site with a significant user-base and an improper FB Connect implementation will, by proxy, give an attacker delegation to all of the private data that site has access to. Digg being hacked = digg FB users exploited, Yelp exploited = Yelp FB users screwed &#8212; you get the idea.</p>
<p>Please, don&#8217;t be that site. It&#8217;s easy to blame Facebook, but, all they&#8217;ve done is made public data public.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nessence.wordpress.com/298/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nessence.wordpress.com/298/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nessence.wordpress.com/298/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nessence.wordpress.com/298/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nessence.wordpress.com/298/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nessence.wordpress.com/298/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nessence.wordpress.com/298/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nessence.wordpress.com/298/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nessence.wordpress.com/298/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nessence.wordpress.com/298/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nessence.wordpress.com/298/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nessence.wordpress.com/298/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nessence.wordpress.com/298/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nessence.wordpress.com/298/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=298&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nessence.net/2010/05/20/facebook-connect-security-lockdown/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a73a1ab6b15c0f17db9cb7dc7add9a2e?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=X" medium="image">
			<media:title type="html">nessence</media:title>
		</media:content>
	</item>
		<item>
		<title>Adobe vs Apple: Divorces are never easy.</title>
		<link>http://nessence.net/2010/04/09/adobe-apple-divorce-never-easy/</link>
		<comments>http://nessence.net/2010/04/09/adobe-apple-divorce-never-easy/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 23:19:43 +0000</pubDate>
		<dc:creator>Alex Leverington</dc:creator>
				<category><![CDATA[apple]]></category>
		<category><![CDATA[brand]]></category>
		<category><![CDATA[deprecated]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[roulette]]></category>

		<guid isPermaLink="false">http://nessence.net/?p=279</guid>
		<description><![CDATA[Why is Adobe yelling and complaining about flash-free iPhones? Every developer who makes something in Flash or grpahics for the iPhone, is probably forking over $500+ a year to Adobe for Photoshop+Flash. I mean, shouldn&#8217;t Adobe be marketing Photoshop for iPhone development? Stepping back, we can recall that Adobe was real close to discontinuing their [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=279&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Why is Adobe yelling and complaining about flash-free iPhones?</p>
<p>Every developer who makes something in Flash or grpahics for the iPhone, is <em>probably</em> forking over $500+ a year to Adobe for Photoshop+Flash. I mean, shouldn&#8217;t Adobe be marketing Photoshop for iPhone development?</p>
<p>Stepping back, we can recall that Adobe was real close to discontinuing their products on Apple&#8217;s operating system. Did Apple whine like this?</p>
<p>Did IBM throw tantrums and cry when Apple dropped PPC?</p>
<p>No, Apple and IBM know better. They took the cards they were dealt and when on doing business.</p>
<p>So here we are. Flash blows and &#8220;interpreted code&#8221; &#8212; whether it&#8217;s PHP or Flash&#8217;s ActionScript &#8212; is a huge security vulnerability, and for this reason Apple doesn&#8217;t allow them on the iPhone anyways. How many iPhone malware worms are there? (jailbroken-only virus doesn&#8217;t count). How many Flash malware worms are there? Answer: at least one per year.</p>
<p>I&#8217;ll repeat some <a href="http://techcrunch.com/2010/04/09/adobe-go-screw-yourself-apple-2/">coverage from TechCrunch which had an excerpt from Adobe&#8217;s 10-Q filing</a>:</p>
<p>“To the extent new releases of operating systems or other third-party products, platforms or devices, such as the Apple iPhone or iPad, make it more difficult for our products to perform, and our customers are persuaded to use alternative technologies, our business could be harmed.”</p>
<p>Let&#8217;s be honest here. Rarely is anyone able to start an Apple-dependent product partnership without Apple&#8217;s written consent. In this regard, Apple&#8217;s legal and PR position has been consistent for decades.</p>
<p>I wouldn&#8217;t be surprised if Apple speaks nothing of this matter. Of course, we know what that means.</p>
<p>Welcome Adobe, to the &#8220;APPL ex&#8217;s club&#8221;. I&#8217;m sure IBM and Motorola will welcome you. Motorola makes cell phones too, so, I&#8217;m sure you&#8217;ll be in good company.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nessence.wordpress.com/279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nessence.wordpress.com/279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nessence.wordpress.com/279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nessence.wordpress.com/279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nessence.wordpress.com/279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nessence.wordpress.com/279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nessence.wordpress.com/279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nessence.wordpress.com/279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nessence.wordpress.com/279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nessence.wordpress.com/279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nessence.wordpress.com/279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nessence.wordpress.com/279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nessence.wordpress.com/279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nessence.wordpress.com/279/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=279&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nessence.net/2010/04/09/adobe-apple-divorce-never-easy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a73a1ab6b15c0f17db9cb7dc7add9a2e?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=X" medium="image">
			<media:title type="html">nessence</media:title>
		</media:content>
	</item>
		<item>
		<title>iPad: Tips before 1st Use, First Impressions</title>
		<link>http://nessence.net/2010/04/03/ipad-tips-first-use-impressions/</link>
		<comments>http://nessence.net/2010/04/03/ipad-tips-first-use-impressions/#comments</comments>
		<pubDate>Sat, 03 Apr 2010 15:19:02 +0000</pubDate>
		<dc:creator>Alex Leverington</dc:creator>
				<category><![CDATA[apple]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://nessence.net/?p=269</guid>
		<description><![CDATA[For no good reason I decided to get up to the Apple store at 2am this morning. Ok, so getting an iPad was a good idea, but 2am? I&#8217;m a night owl anyways. In short, the iPad was good idea. However, if you already have an iPhone and take your laptop to sync up, consider [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=269&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>For no <strong>good</strong> reason I decided to get up to the Apple store at 2am this morning. Ok, so getting an iPad <em>was</em> a good idea, but 2am? I&#8217;m a night owl anyways.</p>
<p style="text-align:center;"><a href="http://nessence.files.wordpress.com/2010/04/img_0799.jpg"><img class="size-medium wp-image-277 aligncenter" title="ipad-lines" src="http://nessence.files.wordpress.com/2010/04/img_0799.jpg?w=300&#038;h=225" alt="" width="300" height="225" /></a></p>
<p>In short, the iPad was good idea. However, if you already have an iPhone and take your laptop to sync up, consider these time-saving tips:</p>
<ol>
<li>The &#8220;Apple&#8221; iPad protector gets dirty very easily. Consider an alternative.</li>
<li>Update iTunes by running software update; it&#8217;s about 100mb (hint: Apple Store&#8217;s have free wifi)</li>
<li>When prompted, it&#8217;s <em>somewhat</em>* safe to click &#8220;Setup as new iPad&#8221; &#8212; you don&#8217;t have to restore your iPhone&#8217;s backup</li>
<li>If you have more than 200 photos and want to start using your iPad &#8220;quickly&#8221;, don&#8217;t sync photos yet. They take a long time to be &#8220;optimized&#8221;. My sync (2500 photos) took more than an hour.</li>
<li>You&#8217;ll be prompted to sync your current apps &#8212; a no brainer if you want your iPhone apps on the device</li>
</ol>
<p>*I may end up performing a restore from my iPhone backup. Setting up the iPad as &#8220;new&#8221; resulted in none of my application settings and preferences being sync&#8217;d to the iPad. More on this after I test a few reloads.</p>
<p>Back to my little iPad debut story&#8230;</p>
<p>At 2:30a there were 4 cars, until 3am, when one person walked up to the store; thereafter everyone else stopped hiding and started camping at the Apple Store on Knox St. in Dallas. It seemed I was the 2nd arrival, but, the other party didn&#8217;t have a reservation so I ended up 1st for the &#8220;reservations&#8221; line. While the downside was an applicable &#8220;dork&#8221; label, I was interviewed by several local TV channels and newspapers. Ironically, I don&#8217;t watch local TV or read local newspapers.</p>
<p>On to the iPad&#8230; and how it rocks&#8230;</p>
<p>The first thing I noticed was orientation doesn&#8217;t matter &#8212; this is awesome because I can just pick it up and use it. The screen swiftly changes to any orientation and there&#8217;s a switch to lock it to a specific orientation.</p>
<p>I immediately installed iBooks, Pandora, and NPR &#8212; all free apps which looked great. Every app was fast and installed in seconds &#8212; almost before I had the chance to touch to start the app. Everything pops into place quickly. After syncing the iPad I quickly went through my routine apps and they were blazing fast and I had no issues.</p>
<p>The glossy screen, which suffers from glare, is still surprisingly legible in broad daylight. It seems as though the focal point of the glass surface is distant enough from the LCD that glares are overlooked. Several people were able to legibly record the screen as I installed various apps and navigated the iPad settings.</p>
<p>Safari is instant and quick as I tested out the various sites which Apple convinced to convert to html5video. Apple has them listed as &#8220;<a href="http://www.apple.com/ipad/ready-for-ipad/">iPad-ready websites</a>&#8220;. Videos were smooth, no clipping, and no interface issues. Did I say it was fast?</p>
<p>The keyboard was very usable, although it reminded me of my days as a Blackberry user. For some reason it was fairly natural to use my thumbs to type with the keyboard while holding the device in my hand. No problems typing so far.</p>
<p>Now I&#8217;m off to the App Store. I&#8217;m going to try not to spend more on apps than I paid for the device.</p>
<p>The big problem? No multitasking. If Apple gives the iPad multi-tasking, my &#8220;nesspad&#8221; is going to be quite the monster.</p>
<p>Minor, notable &#8220;little problems&#8221;:</p>
<ul>
<li>Videos in iTunes don&#8217;t have an icon indicating a video and the video opens in a separate Videos application, which unlike iPod, will not play in the background.</li>
<li>as others have noted, screen smudges are ugly&#8230; but not really noticed when using the device</li>
<li>iPad apps are fairly &#8220;expensive&#8221;. I think Apple set the bar with their iWork apps and everyone is following suit. Time will tell whether the apps are worth their price.</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nessence.wordpress.com/269/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nessence.wordpress.com/269/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nessence.wordpress.com/269/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nessence.wordpress.com/269/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nessence.wordpress.com/269/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nessence.wordpress.com/269/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nessence.wordpress.com/269/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nessence.wordpress.com/269/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nessence.wordpress.com/269/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nessence.wordpress.com/269/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nessence.wordpress.com/269/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nessence.wordpress.com/269/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nessence.wordpress.com/269/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nessence.wordpress.com/269/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=269&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nessence.net/2010/04/03/ipad-tips-first-use-impressions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a73a1ab6b15c0f17db9cb7dc7add9a2e?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=X" medium="image">
			<media:title type="html">nessence</media:title>
		</media:content>

		<media:content url="http://nessence.files.wordpress.com/2010/04/img_0799.jpg?w=300" medium="image">
			<media:title type="html">ipad-lines</media:title>
		</media:content>
	</item>
		<item>
		<title>Sometimes, revenue is free.</title>
		<link>http://nessence.net/2010/03/30/sometimes-revenue-is-free/</link>
		<comments>http://nessence.net/2010/03/30/sometimes-revenue-is-free/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 08:45:59 +0000</pubDate>
		<dc:creator>Alex Leverington</dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[operations]]></category>
		<category><![CDATA[startup]]></category>

		<guid isPermaLink="false">http://nessence.net/?p=264</guid>
		<description><![CDATA[It&#8217;s often easy to get your head caught up in the clouds when starting a company, building a new products, or ogling over that new cloud computing service. What do you consider when making your final decision? aesthetics cost performance connectivity Did you consider analyzing every data point, of every option, for all of these [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=264&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s often easy to get your head caught up in the clouds when starting a company, building a new products, or ogling over that new cloud computing service. What do you consider when making your final decision?</p>
<ul>
<li>aesthetics</li>
<li>cost</li>
<li>performance</li>
<li>connectivity</li>
</ul>
<p>Did you consider analyzing every data point, of every option, for all of these considerations?</p>
<p>The possibilities are exponential and represent how many possible places you could find revenue you didn&#8217;t know existed. If you&#8217;re a successful freemium startup, the answer to this question is yes. At least has been for <a href="http://gigaom.com/2010/03/26/case-studies-in-freemium-pandora-dropbox-evernote-automattic-and-mailchimp/">Dropbox, Evernote, Pandora, and WordPress</a>. It&#8217;s great how Evernote has their user costs down to the penny.</p>
<p>Is every line, pixel, and connection within your software tracked for profitability?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nessence.wordpress.com/264/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nessence.wordpress.com/264/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nessence.wordpress.com/264/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nessence.wordpress.com/264/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nessence.wordpress.com/264/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nessence.wordpress.com/264/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nessence.wordpress.com/264/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nessence.wordpress.com/264/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nessence.wordpress.com/264/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nessence.wordpress.com/264/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nessence.wordpress.com/264/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nessence.wordpress.com/264/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nessence.wordpress.com/264/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nessence.wordpress.com/264/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=264&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nessence.net/2010/03/30/sometimes-revenue-is-free/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a73a1ab6b15c0f17db9cb7dc7add9a2e?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=X" medium="image">
			<media:title type="html">nessence</media:title>
		</media:content>
	</item>
		<item>
		<title>Real-Time is the new Web2.0: Both mean nothing.</title>
		<link>http://nessence.net/2010/03/05/real-time-web2-0-both-meaningless/</link>
		<comments>http://nessence.net/2010/03/05/real-time-web2-0-both-meaningless/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 20:44:49 +0000</pubDate>
		<dc:creator>Alex Leverington</dc:creator>
				<category><![CDATA[information technology]]></category>
		<category><![CDATA[startup]]></category>
		<category><![CDATA[web applications]]></category>
		<category><![CDATA[web20]]></category>
		<category><![CDATA[real-time]]></category>
		<category><![CDATA[realtime]]></category>
		<category><![CDATA[RTC]]></category>

		<guid isPermaLink="false">http://nessence.net/?p=246</guid>
		<description><![CDATA[So you come across a startup that&#8217;s pitching a &#8220;Real-Time&#8221; service, what do you do? Punch them in the face &#8211; now that&#8217;s real-time! Well, maybe that&#8217;s a bad idea, but you should completely tell them they&#8217;re not getting anywhere just by calling their service &#8220;Real-Time&#8221;. Here are some examples of concepts which can&#8217;t ever [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=246&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>So you come across a startup that&#8217;s pitching a &#8220;Real-Time&#8221; service, what do you do? Punch them in the face &#8211; now that&#8217;s real-time! Well, maybe that&#8217;s a bad idea, but you should completely tell them they&#8217;re not getting anywhere just by calling their service &#8220;Real-Time&#8221;. Here are some examples of concepts which can&#8217;t ever be real-time:</p>
<p>1. The News &#8211; Maybe if people as a whole were more intelligent, but, the closest you&#8217;re going to get is Digg or Reddit and those require thousands of data points (over time) before an article bubbles to the top of the relevancy list. The exception of course is &#8220;Bad News&#8221;, that could easily be done in real-time.</p>
<p>2. Product Pricing - Retailers have a hard enough time with loss prevention and maintaining profits than to care if their published prices and inventory are accurate or not. Sure, they have real-time inventory internally, but that&#8217;s a large enough dataset that it&#8217;ll never be replicated to a service provider; the short story is that you&#8217;ll never be able to get both an instant price and instant data at the same time.</p>
<div class="wp-caption alignright" style="width: 310px"><a href="http://www.flickr.com/search/?q=architel"><img class=" " title="datacenter" src="http://farm1.static.flickr.com/41/88026264_0b6ee54336.jpg" alt="" width="300" height="199" /></a><p class="wp-caption-text">Maybe if you were Google.</p></div>
<p>3. Search (sites, news, or otherwise) &#8211; Indexing is hard and there&#8217;s only one cat in the game with the facilities to do so in real-time. The only problem is the rest of the world doesn&#8217;t have a supercomputer running their system and there will always be a delay before Google gets the memo. The exceptions here are sites that Google cares about but chances are you&#8217;re not going to be big enough for that, else, you probably wouldn&#8217;t be a startup.</p>
<p>4. Communications &#8211; There&#8217;s already an &#8220;app for that&#8221;. It&#8217;s called the phone and your voice. Pickup phone, call friend, profit. Anything else might provide real-time delivery on one end or the other, but chances are, one person in the party is playing a video game, watching youtube, or chatting on Facebook in which case their response will be in Internet time.</p>
<p>Let me just steal the definition of Real-Time from Wikipedia:</p>
<blockquote><p>In <a title="Computer science" href="http://en.wikipedia.org/wiki/Computer_science">computer science</a>, <strong>real-time computing</strong> (RTC), or &#8220;reactive computing&#8221;, is the study of <a title="Computer hardware" href="http://en.wikipedia.org/wiki/Computer_hardware">hardware</a> and <a title="Computer software" href="http://en.wikipedia.org/wiki/Computer_software">software</a> systems that are subject to a &#8220;real-time constraint&#8221;—i.e., operational deadlines from event to system response. By contrast, a <em>non-real-time system</em> is one for which there is no deadline, even if fast response or high performance is desired or preferred. The needs of real-time software are often addressed in the context of <a title="Real-time operating system" href="http://en.wikipedia.org/wiki/Real-time_operating_system">real-time operating systems</a>, and <a title="Synchronous programming language" href="http://en.wikipedia.org/wiki/Synchronous_programming_language">synchronous programming languages</a>, which provide frameworks on which to build real-time application software.</p></blockquote>
<p>If that&#8217;s not your product then please, stop calling yourself real-time and get an old comp sci book, then figure out what real-time really is.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nessence.wordpress.com/246/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nessence.wordpress.com/246/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nessence.wordpress.com/246/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nessence.wordpress.com/246/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nessence.wordpress.com/246/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nessence.wordpress.com/246/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nessence.wordpress.com/246/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nessence.wordpress.com/246/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nessence.wordpress.com/246/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nessence.wordpress.com/246/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nessence.wordpress.com/246/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nessence.wordpress.com/246/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nessence.wordpress.com/246/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nessence.wordpress.com/246/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=246&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nessence.net/2010/03/05/real-time-web2-0-both-meaningless/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a73a1ab6b15c0f17db9cb7dc7add9a2e?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=X" medium="image">
			<media:title type="html">nessence</media:title>
		</media:content>

		<media:content url="http://farm1.static.flickr.com/41/88026264_0b6ee54336.jpg" medium="image">
			<media:title type="html">datacenter</media:title>
		</media:content>
	</item>
		<item>
		<title>Don&#8217;t steal your users&#8217; domains (wordpress.com)</title>
		<link>http://nessence.net/2010/03/04/dont-steal-your-users-domains/</link>
		<comments>http://nessence.net/2010/03/04/dont-steal-your-users-domains/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 01:32:03 +0000</pubDate>
		<dc:creator>Alex Leverington</dc:creator>
				<category><![CDATA[brand]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[information technology]]></category>
		<category><![CDATA[web applications]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[wordpress.com]]></category>

		<guid isPermaLink="false">http://nessence.net/?p=240</guid>
		<description><![CDATA[UPDATE: I&#8217;m very happy to update this post with a link to WordPress and their announcement of DNS editing. Kudos to WordPress for promptly providing this feature. Who knows, maybe they&#8217;ve been working on it awhile &#8212; but I was fairly convinced with my support conversation they weren&#8217;t working on the feature. Either way I&#8217;m [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=240&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>UPDATE: </strong>I&#8217;m very happy to update this post with a link to WordPress and their <a title="DNS Editing Deployed" href="http://bit.ly/wordpress-dns">announcement of DNS editing</a>. Kudos to WordPress for promptly providing this feature. Who knows, maybe they&#8217;ve been working on it awhile &#8212; but I was fairly convinced with my support conversation they weren&#8217;t working on the feature. Either way I&#8217;m happy with WordPress and the thought of never having to host my own WP blog again.</p>
<p>This is primarily with regard to WordPress.com, but, it&#8217;s an important and delicate concern for any service. Currently, if you want yourdomain.com to point to your WP blog, you have to give WP control over your domain name. WordPress has the challenging problem of providing scalable content and this is very hard to do while providing domain name support at the same time; this is why WP requires control of your domain&#8217;s DNS. WordPress has a highly redundant and robust network and part of that is having control over their user&#8217;s domains. This is limiting in that a user can&#8217;t point a subdomain like securepayments.yourdomain.com to another service.</p>
<p>While DNS natively supports this functionality, it&#8217;s not something the average blogger, hosting provider, or even application developer understands (it&#8217;s called Slaving). If/when WordPress supports this functionality, they&#8217;ll need to do so carefully to limit exposing their systems to outside risks, make it easy to use, and support the most complex users who need to run their own DNS.</p>
<p>If you provide a web service, such as a blogging platform, don&#8217;t build &#8220;domain name support&#8221; by forcing your users to give you full control over their domain name. In short, I don&#8217;t blame WP for their current implementation (it&#8217;s probably a lower priority for them), but here&#8217;s a few tips on what you should do if you want to make YOUR app/service support user-supplied domain names:</p>
<ol>
<li>Don&#8217;t give the feature away for free. Your support costs will be higher for this feature than most.</li>
<li>Don&#8217;t give the feature away for free. DNS plays a big role in spam and you don&#8217;t want to associate your systems with a spammer&#8217;s domain name.</li>
<li>Think very hard if you want to point a user&#8217;s app to the root of their domain. Doing so opens you up to the concerns above.</li>
<li>If your service involves high-traffic content such that load balancers are involved, consult someone who&#8217;s figured this problem out before. (my advice is <em>typically</em> free)</li>
<li>Whenever you&#8217;re building and scaling your services, keep all the above in mind. As the Internet becomes connected at the application layer, via things like federations and digital certificates, domain names will become more and more important as a component of security and authority.</li>
<li>Let users host their own DNS and point it at you instead of the other way around. Administering DNS servers isn&#8217;t very cost effective and you&#8217;ll save money leaving it up to the users. The downside is you&#8217;ll need to be very good at providing your users with instructions and you&#8217;ll need to notify them when changes are necessary; again, Don&#8217;t give the feature away for free.</li>
<li>Let users host their own DNS. You don&#8217;t want to host DNS for your users &#8212; doing so is a long-term cost commitment and something you can&#8217;t &#8220;undo&#8221;.</li>
</ol>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nessence.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nessence.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nessence.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nessence.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nessence.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nessence.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nessence.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nessence.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nessence.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nessence.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nessence.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nessence.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nessence.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nessence.wordpress.com/240/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=240&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nessence.net/2010/03/04/dont-steal-your-users-domains/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a73a1ab6b15c0f17db9cb7dc7add9a2e?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=X" medium="image">
			<media:title type="html">nessence</media:title>
		</media:content>
	</item>
		<item>
		<title>Amazon RDS: Poison or Pill</title>
		<link>http://nessence.net/2009/10/29/amazon-rds-poison-or-pill/</link>
		<comments>http://nessence.net/2009/10/29/amazon-rds-poison-or-pill/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 11:40:32 +0000</pubDate>
		<dc:creator>Alex Leverington</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[information technology]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[web applications]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[amazon rds]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[ec2]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[rdbms]]></category>

		<guid isPermaLink="false">http://nessence.net/?p=227</guid>
		<description><![CDATA[As soon as read the AWS newsletter about Amazon RDS, I started looking for a Megaphone to start shouting at folks &#8211; keep away! Amazon RDS or Relational Database Service places Amazon into the mire of shared hosting and AW users into a position of false confidence. Harsh words considering, overall, I feel Amazon&#8217;s service [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=227&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>As soon as read the AWS newsletter about Amazon RDS, I started looking for a Megaphone to start shouting at folks &#8211; keep away! Amazon RDS or Relational Database Service places Amazon into the mire of shared hosting and AW users into a position of false confidence. Harsh words considering, overall, I feel Amazon&#8217;s service offerings are best-in-class. AWS offerings have historically pushed the envelope with regard to practical usage-based computing, something which ancient providers such as Sun and IBM have attempted to accomplish for decades; in this case I define practical as both usable and cost effective for small and large tasks. Up until now such systems weren&#8217;t trivialized to x86 hardware and required special programming considerations, access to academic institutions and/or a large budget. By combining SLA-supported x86 virtualization alongside application services such as S3, SQS, and SimpleDB, AWS has provided a usage-based on-demand computing solution which is simpler than task-based computing and as secure and reliable as virtualized or shared hosting. With it&#8217;s on-demand nature AWS is a cost effective for everything from small tasks to those requiring a datacenter of processors.</p>
<p>So why is Amazon RDS so bad, so much that you shouldn&#8217;t use it?</p>
<p>Well, there&#8217;s not an easy answer, the better question is to ask yourself: Why do you think AWS will be better than your own MySQL deployment? There is no right answer because almost any answer will probably, one day, bite you in the ass. Hard. I mean data loss, and it won&#8217;t be Amazon&#8217;s fault.</p>
<p>RDBMS systems and applications which depend on them are built from the ground up to rely on persistence, integrity, and static data models (schema). In contrast AWS has been built for distribution, decentralization, and the &#8220;cloud&#8221;. For Amazon, this service is somewhat of a U-turn from their original direction and has also placed a stamp on their forehead which says &#8220;That MySQL Guy&#8221; which is not good &#8212; I have nothing against mysql, however, as a de facto entry-level (free open source) software, it has accrued a strong following of immature software. Such software has nothing to do with the basic purposes of AWS or MySQL but has everything to do with how Amazon&#8217;s support and engineering staff will be spending their time which is supporting users and software which aren&#8217;t built for the cloud.</p>
<p>I hope that RDS won&#8217;t be a situation of butterflies &amp; hurricanes but here&#8217;s a quick list of why the relative cost of RDS is high both for Amazon (the company) and all of it&#8217;s AWS users:</p>
<ul>
<li>Cost for Amazon (operations, engineers, and products)
<ul>
<li>MySQL, like most open source systems, has been historically buggy software with a trailing release+testing+production schedule which requires continuous testing between production releases for large deployments (such as RDS).</li>
<li>MySQL has a large set of features which vary across releases and which share equal presence in production; in other words, Amazon will need to cater to providing production support for multiple versions, not just the latest stable version.</li>
<li>Amazon has no control over features and capabilities of MySQL and is thus limited to what MySQL provides; while MySQL provides many &#8220;good things&#8221;, Amazon will still be obligated to maintain through the bad. This is a shared disadvantage of AWS Map Reduce via Hadoop however, those are mostly mitigated because Map Reduce is such a low-level distributed system.</li>
<li>MySQL is very flexible and itself scales very well however it doesn&#8217;t do so by itself and requires a significant effort to be properly configured for the data being managed. All the folks who don&#8217;t know this will default into thinking Amazon will do this for them and will be disappointed when it doesn&#8217;t &#8220;just work&#8221;. Whether they ditch RDS or bug Amazon&#8217;s support, either way, it&#8217;s not a positive situation.</li>
</ul>
</li>
</ul>
<ul>
<li>Cost for AWS (primarily EC2) users
<ul>
<li>Potential degradation of service and support for EC2 instances
<ul>
<li>With RDS available Amazon can defer issues with regard to running MySQL on EC2 instances to a recommendation for RDS &#8212; this will be a terrible waste of time for both parties.</li>
<li>MySQL is a very centralized system and by transitioning the decision of where MySQL resides in the AWS cloud from the user to Amazon, Amazon will be further centralizing the impact of MySQL on the cloud. Whereas users will randomly have MySQL deployed across any EC2 instance, Amazon will be appointing MySQL to specific hardware; this is based on the assumption that Amazon is clustering RDS deployments onto local hardware and not randomly deploying instances in the cloud. This is somewhat of a compromise for security and adds significant SLA risks (read: cost) to Amazon. In short, when a MySQL cluster dies &#8211; a LOT of folks are going to be VERY unhappy &#8211; their support tickets will be a burden to staff and their requests for credits will be a financial cost. Moreover, support staff will be yielding priority to these customers over other services because of the implicit severity.</li>
</ul>
</li>
<li>Increased cost
<ul>
<li>RDS instances cost &gt;10% more than regular instances and only come with the added benefit of backups &#8212; something which every system should already have in place. If you do choose to delegate the task of backups to RDS, you&#8217;re paying extra for a task you&#8217;ve already thought about doing yourself.</li>
<li>Cost of keeping your database, it&#8217;s backups, and it&#8217;s history all within AWS is multiplicative and if you grow to the point where you&#8217;re ready to move off you&#8217;ll be charged to transfer all the data to an external system. While this is a subjective cost it&#8217;s still worth pointing out; if folks aren&#8217;t already doing backups right, they&#8217;ll likely not know that cost effective database backups make use of binary logging facilities, not filesystem snapshots, and use significantly less disk space (and thus I/O).</li>
</ul>
</li>
<li>False confidence
<ul>
<li><a title="magnolia dead" href="http://nessence.net/2009/02/18/magnolia-ded/">As I&#8217;ve mentioned before, letting other folks control your backups for you is a mistake</a>. Failure is a matter of when, not if, and you&#8217;ll be in better control of responding if you understand what you&#8217;re dealing with. Just because RDS is doing you&#8217;re backups doesn&#8217;t mean you&#8217;re safe.</li>
<li>RDS users will expect MySQL to scale on-demand as everything else works that way with AWS and it&#8217;s just not that simple. Scaling a database requires analysis and a balanced combination of server settings, data normalization, and indexes; all of these things will still be the user&#8217;s responsibility and Amazon&#8217;s solution of &#8220;throw hardware at it&#8221; is a haunted path to send it&#8217;s users down.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Overall, I feel that Amazon could quickly cannibalize the value and quality of AWS if they (continue to) introduce trivial services. Supporting open source software they have no control over is a significant increase in relative support and operations cost. Amazon seems to be approaching this by making the cost of RDS instances more than EC2 which is a mistake because the real cost is the lost opportunity of engineers spending their time on systems which are more efficient for cloud computing &#8211; Amazon could charge 3 times an EC2 instance and their engineers would still be better off building technologies for cloud-based systems and not centralized RDBMS-dependent web applications.</p>
<p>Where I feel Amazon has fallen short the most, is that RDS only provides single-instance MySQL support and nothing more. No load balancing, replication, Hadoop integration, or any other form of data abstraction which could make it functional in a cloud computing context. Not implementing these features is a very clear indicator that AWS is focused more on short term revenue generating feature rather than cost effective cloud computing systems or improving the shortfalls of legacy centralized system.</p>
<p>With all this said, I have to consider the possibility of this being a good move for Amazon. I present the potential issues with RDS simply to warn folks from relying on it as a crutch, and, to point out the new direction AWS has veered is into choppy waters. There are several aspects of RDS which will give Amazon insight into correlations among and between the varying systems of data storage and processing &#8211; comparing SimpleDB, MapReduce, MySQL, and general resource consumption could shed light onto how their cloud is being used at a higher level than processors and bandwidth. Last, Amazon might be aware that MySQL is a crutch and is putting the service out there as a way to wean folks off of centralized systems.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nessence.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nessence.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nessence.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nessence.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nessence.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nessence.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nessence.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nessence.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nessence.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nessence.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nessence.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nessence.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nessence.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nessence.wordpress.com/227/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=227&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nessence.net/2009/10/29/amazon-rds-poison-or-pill/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a73a1ab6b15c0f17db9cb7dc7add9a2e?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=X" medium="image">
			<media:title type="html">nessence</media:title>
		</media:content>
	</item>
		<item>
		<title>restful-authentication + subdomain-fu = needing cookie adjustments</title>
		<link>http://nessence.net/2009/10/26/restful-authentication-subdomain-fu-needing-cookie-adjustments/</link>
		<comments>http://nessence.net/2009/10/26/restful-authentication-subdomain-fu-needing-cookie-adjustments/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 09:45:49 +0000</pubDate>
		<dc:creator>Alex Leverington</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[web applications]]></category>
		<category><![CDATA[CGI]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[rack]]></category>
		<category><![CDATA[rails 2.3]]></category>
		<category><![CDATA[rails sub-domain subdomain restful-authentication subdomain-fu]]></category>

		<guid isPermaLink="false">http://nessence.net/?p=224</guid>
		<description><![CDATA[I&#8217;ve perused several posts about handling cookies when multiple subdomains are involved however, the solutions were either for older versions of rails or didn&#8217;t resolve my situation; we wanted to have a cookie which could be used among all subdomains. This might also give you some insight as to why restful-authentication doesn&#8217;t have a feature [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=224&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve perused several posts about handling cookies when multiple subdomains are involved however, the solutions were either for older versions of rails or didn&#8217;t resolve my situation; we wanted to have a cookie which could be used among all subdomains. This might also give you some insight as to why restful-authentication doesn&#8217;t have a feature to do all this for you &#8212; it keeps changing and by-hand is best for now. If you&#8217;re employing this, do be diligent with security; sharing credentials across domains can be risky business if your security varies across domains.</p>
<p>To do this, first edit config/initializers/session_store.rb where you&#8217;ll want to add the key:</p>
<p>:domain =&gt; &#8216;.example.com&#8217;</p>
<p>The format here is important &#8211; if you don&#8217;t prefix the domain with a period the cookie (and session) will not apply for requests to subdomains. This covers the rails session &#8212; however we also need to cover the cookie set by restful-authentication which you&#8217;ll find in lib/authenticated_system.rb. In the kill_remember_cookie! and send_remember_cookie! methods insert same key as above or a reference to the session_options key. It&#8217;ll look like this:</p>
<pre>def kill_remember_cookie!
  cookies.delete :auth_token, :domain =&gt; ActionController::Base.session_options[:domain]
end</pre>
<pre>def send_remember_cookie!
  cookies[:auth_token] = {
    :value   =&gt; @current_user.remember_token,
    :expires =&gt; @current_user.remember_token_expires_at,
    :domain =&gt; ActionController::Base.session_options[:domain] }
end</pre>
<p>During development you should be aware this might not work using &#8216;localhost&#8217;, depending on your OS. The best thing to do is to edit your hosts file to have &#8220;example.local&#8221; point to your machine and use those domains for testing instead.</p>
<p>If you&#8217;re doing anything more complicated, you&#8217;ve got your work cut out for you as you may need to write custom rack middleware (see: Google) and/or use a Proc. In the latest Rails, cookies are being handled by Rack (instead of CGI); in any version, setting Cookies via cookies[:key]= is performed independent of the session options which is why you must specify the domain separately. There are some folks who describe monkey patching Rails to set the domain automatically but this is unreliable as I believe it&#8217;s changed every release. If you don&#8217;t want to have to change it, just create a wrapper method for setting your cookies, or, set the domain wherever you set or delete a cookie. We only set one cookie via restful-authentication so 2 lines is a fairly simple fix.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nessence.wordpress.com/224/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nessence.wordpress.com/224/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nessence.wordpress.com/224/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nessence.wordpress.com/224/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nessence.wordpress.com/224/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nessence.wordpress.com/224/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nessence.wordpress.com/224/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nessence.wordpress.com/224/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nessence.wordpress.com/224/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nessence.wordpress.com/224/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nessence.wordpress.com/224/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nessence.wordpress.com/224/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nessence.wordpress.com/224/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nessence.wordpress.com/224/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=224&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nessence.net/2009/10/26/restful-authentication-subdomain-fu-needing-cookie-adjustments/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a73a1ab6b15c0f17db9cb7dc7add9a2e?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=X" medium="image">
			<media:title type="html">nessence</media:title>
		</media:content>
	</item>
		<item>
		<title>Ruby EventMachine :gt Python Tornado, Twisted</title>
		<link>http://nessence.net/2009/09/25/ruby-eventmachine-gt-python-tornado-twisted/</link>
		<comments>http://nessence.net/2009/09/25/ruby-eventmachine-gt-python-tornado-twisted/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 14:24:50 +0000</pubDate>
		<dc:creator>Alex Leverington</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://nessence.net/?p=209</guid>
		<description><![CDATA[I was working on a project looking to see if Ruby was good enough for responding quickly to HTTP requests. Good thing it, along with Python, and every other language, plays well with C/C++. Anyways, EventMachine apparently blows away Tornado and Twisted. I only tested Tornado because it&#8217;s faster, right? What I really wanted to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=209&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I was working on a project looking to see if Ruby was good enough for responding quickly to HTTP requests. Good thing it, along with Python, and every other language, plays well with C/C++. Anyways, EventMachine apparently blows away Tornado and Twisted. I only tested Tornado because it&#8217;s faster, right? What I really wanted to test was if either of these would fall apart under high concurrency or load. For the &#8220;Hello World!&#8221;, they both survived although as you can see for Tornado, response times became an issue earlier. I&#8217;ve also provided &#8216;ab&#8217; for reference &#8211; it&#8217;s a little more specific with regard to response times. Clearly both of these are hitting a CPU ceiling &#8211; with Tornado hitting it faster. Ftr, I tested on a dual-core 2.33ghz xeon w/RHEL5, python2.6, and ruby1.8.5.</p>
<p>Along my adventure in this hnews thread, I came along this most awesome post: <a href="http://teddziuba.com/2009/09/twisted-vs-tornado-youre-both.html">Twisted vs. Tornado: You&#8217;re Both Idiots</a></p>
<p>Anyways, what I&#8217;m happy about is there&#8217;s a Ruby option for a fast little server which pumps out a bajillion requests per second if you&#8217;ve got a farm of servers and it won&#8217;t fall on it&#8217;s face. Also, I don&#8217;t have to use Python and EventMachine is a BREEZE to use. What does suck is the EM HTTP server isn&#8217;t RFC compliant but that&#8217;s probably just a matter of time and I won&#8217;t be using HTTP anyways. ymmv</p>
<p>httperf: Tornado</p>
<pre>[root@mail ~]# httperf --port=3002 --num-conns=1000 --num-calls=500 --rate 100 -v
httperf --verbose --client=0/1 --server=localhost --port=3002 --uri=/ --rate=100 --send-buffer=4096 --recv-buffer=16384 --num-conns=1000 --num-calls=500
httperf: maximum number of open descriptors = 1024
reply-rate = 5045.8
reply-rate = 4868.5
reply-rate = 4905.4
reply-rate = 4846.9
reply-rate = 4938.4
reply-rate = 4747.3
reply-rate = 4800.2
reply-rate = 4795.6
reply-rate = 4595.3
reply-rate = 4591.1
reply-rate = 4784.6
reply-rate = 4775.9
reply-rate = 4563.3
reply-rate = 4872.3
reply-rate = 4948.8
reply-rate = 4853.0
reply-rate = 4551.3
reply-rate = 4587.3
reply-rate = 4885.7
reply-rate = 4900.2
Maximum connect burst length: 1</pre>
<pre>Total: connections 1000 requests 500000 replies 500000 test-duration 104.059 s</pre>
<pre>Connection rate: 9.6 conn/s (104.1 ms/conn, &lt;=1000 concurrent connections)
Connection time [ms]: min 34704.2 avg 93867.4 max 97177.5 median 95862.5 stddev 6293.6
Connection time [ms]: connect 0.0
Connection length [replies/conn]: 500.000</pre>
<pre>Request rate: 4805.0 req/s (0.2 ms/req)
Request size [B]: 62.0</pre>
<pre>Reply rate [replies/s]: min 4551.3 avg 4792.8 max 5045.8 stddev 144.4 (20 samples)
Reply time [ms]: response 187.7 transfer 0.0
Reply size [B]: header 156.0 content 12.0 footer 0.0 (total 168.0)
Reply status: 1xx=0 2xx=500000 3xx=0 4xx=0 5xx=0</pre>
<pre>CPU time [s]: user 2.97 system 99.60 (user 2.9% system 95.7% total 98.6%)
Net I/O: 1079.2 KB/s (8.8*10^6 bps)</pre>
<pre>Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0</pre>
<p>httperf: Ruby EventMachine</p>
<pre>[root@mail ~]# httperf --port=3001 --num-conns=1000 --num-calls=500 --rate 100 -v
httperf --verbose --client=0/1 --server=localhost --port=3001 --uri=/ --rate=100 --send-buffer=4096 --recv-buffer=16384 --num-conns=1000 --num-calls=500
httperf: maximum number of open descriptors = 1024
reply-rate = 11631.7
reply-rate = 9769.5
reply-rate = 9352.3
reply-rate = 10086.1
reply-rate = 8899.4
reply-rate = 9759.3
reply-rate = 9985.1
reply-rate = 10152.8
reply-rate = 10383.9
Maximum connect burst length: 1</pre>
<pre>Total: connections 1000 requests 500000 replies 500000 test-duration 49.590 s</pre>
<pre>Connection rate: 20.2 conn/s (49.6 ms/conn, &lt;=984 concurrent connections)
Connection time [ms]: min 229.8 avg 39130.7 max 42870.4 median 41409.5 stddev 6775.5
Connection time [ms]: connect 0.0
Connection length [replies/conn]: 500.000</pre>
<pre>Request rate: 10082.7 req/s (0.1 ms/req)
Request size [B]: 62.0</pre>
<pre>Reply rate [replies/s]: min 8899.4 avg 10002.2 max 11631.7 stddev 756.9 (9 samples)
Reply time [ms]: response 78.3 transfer 0.0
Reply size [B]: header 65.0 content 12.0 footer 0.0 (total 77.0)
Reply status: 1xx=0 2xx=500000 3xx=0 4xx=0 5xx=0</pre>
<pre>CPU time [s]: user 2.20 system 46.84 (user 4.4% system 94.4% total 98.9%)
Net I/O: 1368.7 KB/s (11.2*10^6 bps)</pre>
<pre>Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0</pre>
<p>ab: Tornado</p>
<pre>[root@mail ~]# ab -c1000 -n100000 http://127.0.0.1:3002/
This is ApacheBench, Version 2.0.40-dev &lt;$Revision: 1.146 $&gt; apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Finished 100000 requests

Server Software:        TornadoServer/0.1
Server Hostname:        127.0.0.1
Server Port:            3002

Document Path:          /
Document Length:        12 bytes

Concurrency Level:      1000
Time taken for tests:   27.996766 seconds
Complete requests:      100000
Failed requests:        0
Write errors:           0
Total transferred:      16800336 bytes
HTML transferred:       1200024 bytes
Requests per second:    3571.84 [#/sec] (mean)
Time per request:       279.968 [ms] (mean)
Time per request:       0.280 [ms] (mean, across all concurrent requests)
Transfer rate:          586.00 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0  197 1102.8      0   20998
Processing:     1   50  37.3     45    5234
Waiting:        0   49  37.4     44    5234
Total:         18  247 1109.2     45   21253

Percentage of the requests served within a certain time (ms)
  50%     45
  66%     48
  75%     52
  80%     57
  90%     77
  95%   1237
  98%   3074
  99%   3112
 100%  21253 (longest request)</pre>
<p>ab: EventMachine</p>
<pre>[root@mail ~]# ab -c1000 -n100000 http://127.0.0.1:3001/
This is ApacheBench, Version 2.0.40-dev &lt;$Revision: 1.146 $&gt; apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Finished 100000 requests

Server Software:
Server Hostname:        127.0.0.1
Server Port:            3001

Document Path:          /
Document Length:        12 bytes

Concurrency Level:      1000
Time taken for tests:   15.238117 seconds
Complete requests:      100000
Failed requests:        0
Write errors:           0
Total transferred:      7700077 bytes
HTML transferred:       1200012 bytes
Requests per second:    6562.49 [#/sec] (mean)
Time per request:       152.381 [ms] (mean)
Time per request:       0.152 [ms] (mean, across all concurrent requests)
Transfer rate:          493.43 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   76 603.3      0    9000
Processing:     0   32 264.1     15   10627
Waiting:        0   31 264.1     14   10625
Total:          9  108 752.8     15   14642

Percentage of the requests served within a certain time (ms)
  50%     15
  66%     15
  75%     15
  80%     22
  90%     33
  95%     35
  98%   2999
  99%   3015
 100%  14642 (longest request)</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nessence.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nessence.wordpress.com/209/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nessence.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nessence.wordpress.com/209/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nessence.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nessence.wordpress.com/209/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nessence.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nessence.wordpress.com/209/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nessence.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nessence.wordpress.com/209/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nessence.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nessence.wordpress.com/209/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nessence.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nessence.wordpress.com/209/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=209&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nessence.net/2009/09/25/ruby-eventmachine-gt-python-tornado-twisted/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a73a1ab6b15c0f17db9cb7dc7add9a2e?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=X" medium="image">
			<media:title type="html">nessence</media:title>
		</media:content>
	</item>
		<item>
		<title>Snow Leopard &#8211; Rails; Java stink</title>
		<link>http://nessence.net/2009/08/28/snow-leopard-rails-java-stink/</link>
		<comments>http://nessence.net/2009/08/28/snow-leopard-rails-java-stink/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 23:01:00 +0000</pubDate>
		<dc:creator>Alex Leverington</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rjb]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[snow leopard]]></category>

		<guid isPermaLink="false">http://nessence.net/?p=198</guid>
		<description><![CDATA[If you&#8217;re upgrading to Snow Leopard and develop with Ruby on Rails you&#8217;ll need to do a few things. First, a note about Java. If you depend on Java, 10.6 no longer has Java 1.5. The current workaround for this is to copy a 1.5 install from a non-snow-leopard mac. More instructions here (there&#8217;s a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=198&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re upgrading to Snow Leopard and develop with Ruby on Rails you&#8217;ll need to do a few things.</p>
<p>First, a note about Java. If you depend on Java, 10.6 no longer has Java 1.5. The current workaround for this is to copy a 1.5 install from a non-snow-leopard mac. More <a href="http://wiki.oneswarm.org/index.php/OS_X_10.6_Snow_Leopard">instructions here</a> (there&#8217;s a d/l for 1.5 as well; yes, Snow Leopard DELETIFIES 1.5).</p>
<p>1) Install XCode from the CD (required for ruby headers)<br />
1a) Install iPhone SDK if that&#8217;s something you do<br />
2) gem uninstall ruby-debug-base; gem install ruby-debug-base linecache<br />
3) rebuild database gems and/or drivers (you&#8217;ll likely need arch flag, below)</p>
<p>I can&#8217;t speak for others but for PostgreSQL I had 8.3 installed and had to download/compile/install the latest 8.3.7 from source then gem uninstall dbd-pg, pg, and ruby-pg and reinstall them &#8211; prefixing gem install with ARCHFLAGS=&#8221;-arch x86_64&#8243;.</p>
<p>For our particular project I had to reinstall json, nokogiri, and rjb (had to export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0 ).</p>
<p>If you use mod_passenger, reinstall and follow install instructions (passenger-install-apache2-module).</p>
<p>Shameless plug: if this helped you, you live in Texas, and drive &lt; 12k miles a year, checkout my <a title="MileMeter Insurance Company" href="http://www.milemeter.com/?n">employer</a>.</p>
<p>Errors this stuff fixed for me:</p>
<pre>/path/to/gems/ruby-debug-base-0.10.3/lib/ruby_debug.bundle: dlopen(/path/to/gems/ruby-debug-base-0.10.3/lib/ruby_debug.bundle, 9): no suitable image found.  Did find: (LoadError)
	/path/to/gems/ruby-debug-base-0.10.3/lib/ruby_debug.bundle: no matching architecture in universal wrapper - /path/to/gems/ruby-debug-base-0.10.3/lib/ruby_debug.bundle

/path/to/gems/linecache-0.43/lib/../lib/trace_nums.bundle: dlopen(/path/to/gems/linecache-0.43/lib/../lib/trace_nums.bundle, 9): no suitable image found.  Did find: (LoadError)
	/path/to/gems/linecache-0.43/lib/../lib/trace_nums.bundle: no matching architecture in universal wrapper - /path/to/gems/linecache-0.43/lib/../lib/trace_nums.bundle

/path/to/gems/activerecord-2.3.3/lib/active_record/connection_adapters/abstract/connection_specification.rb:76:in `establish_connection': Please install the postgresql adapter: `gem install activerecord-postgresql-adapter` (dlopen(/path/to/gems/pg-0.8.0/lib/pg.bundle, 9): no suitable image found.  Did find: (RuntimeError)
	/path/to/gems/pg-0.8.0/lib/pg.bundle: no matching architecture in universal wrapper - /path/to/gems/pg-0.8.0/lib/pg.bundle)

# This happens when postgresql is old. I had to compile 8.3.7 from source with archflags above.
compat.h:38:2: error: #error PostgreSQL client version too old, requires 7.3 or later.

dlopen(/path/to/gems/json-1.1.7/ext/json/ext/generator.bundle, 9): no suitable image found.  Did find:
	/path/to/gems/json-1.1.7/ext/json/ext/generator.bundle: no matching architecture in universal wrapper - /path/to/gems/json-1.1.7/ext/json/ext/generator.bundle

dlopen(/path/to/gems/nokogiri-1.3.2/lib/nokogiri/nokogiri.bundle, 9): no suitable image found.  Did find:
	/path/to/gems/nokogiri-1.3.2/lib/nokogiri/nokogiri.bundle: mach-o, but wrong architecture - /path/to/gems/nokogiri-1.3.2/lib/nokogiri/nokogiri.bundle

dlopen(/path/to/gems/rjb-1.1.7/lib/rjbcore.bundle, 9): no suitable image found.  Did find: (LoadError)
	/path/to/gems/rjb-1.1.7/lib/rjbcore.bundle: no matching architecture in universal wrapper - /path/to/gems/rjb-1.1.7/lib/rjbcore.bundle

# Java stuff spits out something like this
:in `load': can't create Java VM (RuntimeError)</pre>
<div id="_mcePaste" style="position:absolute;left:-10000px;top:0;width:1px;height:1px;">/Users/alexl/code/gems/gems/ruby-debug-base-0.10.3/lib/ruby_debug.bundle: dlopen(/Users/alexl/code/gems/gems/ruby-debug-base-0.10.3/lib/ruby_debug.bundle, 9): no suitable image found.  Did find: (LoadError)</div>
<div id="_mcePaste" style="position:absolute;left:-10000px;top:0;width:1px;height:1px;"><span style="white-space:pre;"> </span>/Users/alexl/code/gems/gems/ruby-debug-base-0.10.3/lib/ruby_debug.bundle: no matching architecture in universal wrapper &#8211; /Users/alexl/code/gems/gems/ruby-debug-base-0.10.3/lib/ruby_debug.bundle</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nessence.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nessence.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nessence.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nessence.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nessence.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nessence.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nessence.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nessence.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nessence.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nessence.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nessence.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nessence.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nessence.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nessence.wordpress.com/198/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nessence.net&amp;blog=7091&amp;post=198&amp;subd=nessence&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nessence.net/2009/08/28/snow-leopard-rails-java-stink/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a73a1ab6b15c0f17db9cb7dc7add9a2e?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=X" medium="image">
			<media:title type="html">nessence</media:title>
		</media:content>
	</item>
	</channel>
</rss>
