<?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>Dave Martorana</title>
	<atom:link href="http://davemartorana.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://davemartorana.com</link>
	<description>Developer, Design and Architecture Buff, Beer Enthusiast</description>
	<lastBuildDate>Fri, 07 Jun 2013 13:25:02 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Flyclops Domino! 2012 in Review</title>
		<link>http://davemartorana.com/logs/flyclops/flyclops-domino-2012-in-review/</link>
		<comments>http://davemartorana.com/logs/flyclops/flyclops-domino-2012-in-review/#comments</comments>
		<pubDate>Sat, 05 Jan 2013 08:12:37 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Flyclops]]></category>

		<guid isPermaLink="false">http://davemartorana.com/?p=539</guid>
		<description><![CDATA[In May of 2012, Flyclops launched Domino!, an asynchronous multiplayer dominoes game. Here&#8217;s a fun look at the first 7 months. Hi, I&#8217;m Dave In late 2011, I joined the boys at Flyclops in order to help them complete their new game, Domino! A very polished take on the ages-old classic game dominoes, with a wonderful [...]]]></description>
				<content:encoded><![CDATA[<p>In May of 2012, <a href="http://flyclops.com" target="_blank">Flyclops</a> launched <a title="Domino!" href="http://domino.flyclops.com" target="_blank">Domino!</a>, an asynchronous multiplayer dominoes game. Here&#8217;s a fun look at the first 7 months.</p>
<h2>Hi, I&#8217;m Dave</h2>
<p>In late 2011, I joined the boys at <a title="Flyclops" href="http://flyclops.com" target="_blank">Flyclops</a> in order to help them complete their new game, <a href="http://domino.flyclops.com" target="_blank">Domino!</a> A very polished take on the ages-old classic game dominoes, with a wonderful asynchronous multi-player twist, there was a glaring omission in the App Store that needed to be filled.</p>
<p>They had originally started the game in September, 2011, and expected the game to take a few weeks to a month to build. After a couple months, it became apparent that the game was much larger than they had estimated, and more revealing was how deficient Game Center actually was for building a complete, feature-rich multi-player game. Being friends with both of the founders &#8211; <a title="Jake O'Brien" href="https://twitter.com/flailmonger" target="_blank">Jake O&#8217;Brien</a> and <a title="Parker Whitney" href="https://twitter.com/parkerwhitney" target="_blank">Parker Whitney</a>, via the storied coworking space <a title="IndyHall" href="http://indyhall.org" target="_blank">IndyHall</a> (where we still work) &#8211; I offered my assistance in building a backend API that would compliment the game in the way Game Center couldn&#8217;t.</p>
<p>What followed was a pretty amazing journey through 2012 &#8211; here&#8217;s our story.</p>
<p><span id="more-539"></span></p>
<h2>TL;DR</h2>
<p>For the impatient (yes, this is a lengthy post) the basics are this &#8211; we spent a plethora of time on a relatively simple game, making sure every piece was polished. We released before we felt it was ready (it will <em>never</em> be ready) and spent a lot of time iterating and making steady, constant improvements. We had an amazing first month in May of 2012, earning over $2000. We focus more of our efforts on customer service and engagement than anything else, bar none. By paying close attention to our customers, being incredibly personally involved in engagement, and providing a worthy experience, we topped $53,000 in revenue in December 2012, a mere 7 months later.</p>
<h2>Numbers Porn</h2>
<p>The revenue numbers are below, but here are some fun stats about play and our API server. We run our server stack on Amazon&#8217;s AWS offerings. Currently we employ:</p>
<ul>
<li>A single <strong>db.m1.large</strong> MySQL database, using Provisioned IOPS (currently, 2,000 IOPS/second of which we utilize around 1,200 and growing)</li>
<li>One Elasticache cluster with a single <strong>cache.m1.small</strong> node</li>
<li>A single Elastic Load Balancer</li>
<li>Several Route 53 &#8220;alias&#8221; records against the load balancer</li>
<li>Several CloudWatch alarms, all of which send SMS messages</li>
<li>Anywhere between 3 &#8211; 7 app servers on <strong>c1.medium</strong> EC2 instances behind the load balancer</li>
</ul>
<p>The API is:</p>
<ul>
<li>Written entirely in <strong>Python</strong></li>
<li>Utilizes the <strong>Flask</strong> web framework with the <strong>APY package</strong> for better class-based routing</li>
<li>Uses <strong>SqlAlchemy</strong> as an ORM</li>
</ul>
<p>On each API server, we run:</p>
<ul>
<li><strong>nginx</strong>, with a <strong>memcached</strong> plugin that allows the iOS app to query the ElastiCache cluster directly through nginx for functions such as polling (skipping the web app entirely)</li>
<li><strong>uwsgi</strong></li>
<li><strong>pyapns</strong> (absolutely brilliantly rock-solid asynchronous push-notifications server &#8211; we&#8217;ve sent over 250,000,000 push notifications with it)</li>
</ul>
<p>We currently:</p>
<ul>
<li>Scale by hand when alarms go off. (OMG what a nightmare!! CloudFormation and AutoScale Groups are on the way, like, by the end of the week.)</li>
</ul>
<p>Future engineering tasks:</p>
<ul>
<li>Autoscaling (did I mention??)</li>
<li>Better caching</li>
<li>Proactive push notifications (&#8220;Your game is about to expire!&#8221;)</li>
<li>Real-time live gaming (we have &#8220;real-time&#8221; play, but it&#8217;s not a dedicated real-time platform)</li>
<li>Blogging about it all</li>
</ul>
<p>Our API currently handles:</p>
<ul>
<li>An daily average of 10,000 RPM (requests per minute) or ~165 requests/second</li>
<li>Nightly averages of 15,000-20,000 RPM (300 requests/second)</li>
<li>Spikes of over 28,000 RPM (over 460 requests/second)</li>
<li>Around 14,400,000 API requests a day</li>
<li>Upwards of 1/2 BILLION requests/month</li>
</ul>
<div class="wp-caption aligncenter" style="width: 417px"><a href="http://f.cl.ly/items/3V062O3J2W08422u3S3m/Domino!%20API%20-%20New%20Relic-1.jpg" target="_blank"><img class="  " alt="" src="http://f.cl.ly/items/3V062O3J2W08422u3S3m/Domino!%20API%20-%20New%20Relic-1.jpg" width="407" height="172" /></a><p class="wp-caption-text">An average night (busy time)</p></div>
<p>(<em>Note: Those spikes are when alarms go off. They will go away with autoscaling.</em>) Despite that much traffic, we maintain an average of 53ms per request. I honestly believe this is extremely important in maintaining customer satisfaction. If we moved from 65,000 daily player to 650,000 players, however, maintaining this could be difficult.</p>
<div class="wp-caption aligncenter" style="width: 857px"><a href="http://f.cl.ly/items/3w2E1R372p3c0m0l1o47/Domino!%20API%20-%20New%20Relic.jpg" target="_blank"><img class="  " alt="" src="http://f.cl.ly/items/3w2E1R372p3c0m0l1o47/Domino!%20API%20-%20New%20Relic.jpg" width="847" height="392" /></a><p class="wp-caption-text">API server response times</p></div>
<h2>Some totals for 2012</h2>
<ul>
<li>890,000+ downloads (97,000 active daily users)</li>
<li>3,957,000 matches (in the last week of December, we were adding ~43,500 a day)</li>
<li>176,700,000+ moves made</li>
<li>250,000,000+ push notifications sent</li>
<li></li>
<li>Over 100,000,000 sessions since May, 2012 (905,000 daily sessions)</li>
<li><em><strong>694 YEARS</strong> <strong>of aggregate play</strong> <strong>time</strong></em> as of December 31, 2012 (May 15, 2012, adding 6 years a day)</li>
</ul>
<div class="wp-caption aligncenter" style="width: 767px"><a href="http://f.cl.ly/items/3P1h0C293j463S2n1R3B/Flurry%20%7C%20App%20Advertising%20and%20Analytics-3.jpg" target="_blank"><img class="  " alt="" src="http://f.cl.ly/items/3P1h0C293j463S2n1R3B/Flurry%20%7C%20App%20Advertising%20and%20Analytics-3.jpg" width="757" height="198" /></a><p class="wp-caption-text">Total time spent in-app every day</p></div>
<h2>Launch: May, 2012</h2>
<p>Nine months after development began, we launched.</p>
<p>We had zero idea what to expect. Sure, we studied and planned, but you can&#8217;t know until it&#8217;s out there. All of our friends dutifully played. We knew almost no one would have friends who had the app, so we expected a lot of people to try &#8211; and then abandon &#8211; the game. Having build random matching in to the game, we would take turns watching the DB and immediately matching back anyone who started a random-match game, so as to appear that we had plenty of active players. Phone calls went back and forth at all hours.</p>
<p>Then things began to pick up.</p>
<h2>Players!</h2>
<p>Any game launch will, currently, attract <em>some</em> attention on the App Store. The attention ours attracted was beyond our expectations. We had over 10,000 signups in the first 3 weeks. The first day was 2. Then 0. Then 4. Then on May 15th, we hit 116 new signups.</p>
<div class="wp-caption aligncenter" style="width: 538px"><a href="http://f.cl.ly/items/2b3Y3j3z3c0F3i3o1o42/(MySQL%205.5.27-log)%20Domino!_dataclops-1.jpg" target="_blank"><img class="   " alt="" src="http://f.cl.ly/items/2b3Y3j3z3c0F3i3o1o42/(MySQL%205.5.27-log)%20Domino!_dataclops-1.jpg" width="528" height="74" /></a><p class="wp-caption-text">Multiplayer signups by month</p></div>
<p>During the whole time, we were obsessing over random matches. We wanted anyone who played to feel like they almost instantly had someone to play against. On May 20 (my birthday, incidentally) we had 404 signups. Many people were buying the paid version of the app, and for the free version, people were just starting to look at ads in some consistent manner. Having launched our Facebook page, we began to interact with as many people as would watch, and hounded our friends on Twitter and Facebook to tell their friends.</p>
<p>By the end of May, we had culled over 10,000 multiplayer signups.</p>
<p><em>Half never played again.</em></p>
<h2>Momentum</h2>
<p>We quickly learned that our attrition rate was going to be high. Only about 20% of signups became active players, and that number has stuck relatively consistently from May through today. We can say:</p>
<ul>
<li>12% of signups never opened the app more than once</li>
<li>20% never played past the first day</li>
<li>Another 15% never make it past a week</li>
<li>Fully 45% of players never make it past a month</li>
<li>Consistently, ~20% of all signups play each day</li>
</ul>
<p>It was a bit of a pill to swallow. We quickly hit an average daily signup of around 1,000 &#8220;multiplayer&#8221; players, but it would take a week or more to add 1,000 active players to our daily total. We constantly sweated our signup stats. We&#8217;d have 1100 players sign up one day, followed by 700, which we immediately took as a sign that our time in the Sun had come to an end.</p>
<p>To boot (see the chart above) our active monthly signups spiked in August and have never come close to reaching that number again.</p>
<h2>Plodding growth</h2>
<p>Quickly, we hit a bizarre trend.</p>
<div class="wp-caption aligncenter" style="width: 1051px"><a href="http://f.cl.ly/items/1W1B0D1u0l0B0t3e301K/Flurry%20%7C%20App%20Advertising%20and%20Analytics.jpg" target="_blank"><img class="  " alt="Growth" src="http://f.cl.ly/items/1W1B0D1u0l0B0t3e301K/Flurry%20%7C%20App%20Advertising%20and%20Analytics.jpg" width="1041" height="340" /></a><p class="wp-caption-text">Growth</p></div>
<p>Despite some minor daily fluctuations, our growth was constant. Amazingly constant. From July of 2012 through the middle of December, 2012, we would add between 1000-1500 multiplayer users. Every. Single. Day. Our daily-user trend is insane:</p>
<div class="wp-caption aligncenter" style="width: 1015px"><a href="http://f.cl.ly/items/222A052e3y250o42161E/Flurry%20%7C%20App%20Advertising%20and%20Analytics-2.jpg" target="_blank"><img class="  " alt="" src="http://f.cl.ly/items/222A052e3y250o42161E/Flurry%20%7C%20App%20Advertising%20and%20Analytics-2.jpg" width="1005" height="339" /></a><p class="wp-caption-text">Holy straight line, Batman. (Active daily users)</p></div>
<p>Our active daily user graph is so insanely normalized that it almost feels fake. I still have no good explanation for this. I expected we would eventually hit a critical mass that would cause daily signups to spike &#8211; but we never did.</p>
<h2>Multiplayer?</h2>
<p>Right, so&#8230; we shipped the game with a single-player mode. Apparently&#8230; people like that a LOT.</p>
<p>For 2012, we had:</p>
<ul>
<li>891,148 downloads</li>
<li>331,221 multiplayer signups</li>
<li>96,375 active daily users, but</li>
<li>only 62,380 daily multiplayer users</li>
</ul>
<p><strong>Despite being a heavily multiplayer-focused game, only 37% of people who download the app ever sign up for multiplayer play!</strong></p>
<p>As for daily users, 35% &#8211; over 1/3 of our players &#8211; never play a single multiplayer game. But they <em>play</em>, a <em>lot</em>, and they look at ads. My point? If you&#8217;re going to develop a multiplayer game, never underestimate the power of including a single-player version. I never will again.</p>
<h2>The Money</h2>
<p>We never really expected <em>Domino!</em> to make much more money than might pay for some beer and perhaps a new laptop each at the end of the year. Boy were we wrong.</p>
<p>Our revenue stream is very ad-heavy. Over the months we&#8217;ve added and removed ad providers based on performance, and have fine-tuned our strategy. That has led to marked gains. Currently:</p>
<ul>
<li><strong>We utilize 5 ad providers and 1 ad aggregator</strong></li>
<li>Domino! downloads a config file on every open that tells which ad providers to show, and how each should be weighted in priority and use</li>
<li>We edit the config file several times a day based on current eCPM projections</li>
<li>We split ads between traditional pay-per-view ad providers and pay-per-install ad providers, based on current payouts-per-impression calculations</li>
</ul>
<p>This process has been fine-tuned, and will shortly be completely automated based on some optimization algorithms. By trending ads towards those paying a higher eCPM (and adjusting multiple times throughout the day) we maximize our profit across multiple providers.</p>
<p>We also have revenue from the ad-free version of the game. <strong>However, sales made up less than 10% of revenue in December, with ads making up over 90%. </strong></p>
<p>By tweaking our ad providers constantly, our revenue growth has outpaced our user growth. By quarter:</p>
<p><a href="http://f.cl.ly/items/3k092k150J0x1g0Y0Q2q/Domino!%20Finances.jpg" target="_blank"><img class="aligncenter" alt="" src="http://f.cl.ly/items/3k092k150J0x1g0Y0Q2q/Domino!%20Finances.jpg" width="599" height="370" /></a></p>
<h2>Expenses</h2>
<p>Our expenses are minimal at this point in time. They are:</p>
<ul>
<li>Server costs. In December, the total was $1,561.29. We expect January to be around $1650.</li>
<li>Office space: Less than $700/month</li>
<li>Our time.</li>
</ul>
<p>In December, our costs before paying ourselves were 2.9% of revenue. We also pay:</p>
<ul>
<li>Approximately $15,000/month in &#8220;salaries&#8221;, taxes, and health care</li>
<li>Under $250 on meals and entertaining</li>
</ul>
<h2>The Fiscal Cliff</h2>
<p>Something to note &#8211; the 4th quarter of any year is amazingly, deceptively good for any company. Usually. For us it was great. Advertisers pay huge amounts of money to attract Christmas season buyers. January, however, is for crap.</p>
<p>For instance, here&#8217;s a quick look at our daily iAd take. Notice that at the very end of the year, we jump from requesting ~600,000 ads a day to over 1 million, but our fill rate drops from the 80% range to 17%.</p>
<div class="wp-caption aligncenter" style="width: 788px"><a href="http://f.cl.ly/items/0s3Y1y3b3Y0T1U2Z1f10/AppViz%202.jpg" target="_blank"><img class="  " alt="" src="http://f.cl.ly/items/0s3Y1y3b3Y0T1U2Z1f10/AppViz%202.jpg" width="778" height="275" /></a><p class="wp-caption-text">The fiscal cliff</p></div>
<p>Our other ad providers look similar, however, we seem to be rebounding a bit.</p>
<p>That said, <strong>I would expect a 40-55% drop in revenue from December 2012 to January 2013.</strong></p>
<p>Don&#8217;t get me wrong &#8211; $30,000/month during one of the worst months of the year is decent enough to run a small business. But now that we&#8217;ve tasted a $50,000+ month, we want it all the time, because we want to hire, and develop products faster. That said, it becomes glaringly obvious that it&#8217;s time for us to&#8230;</p>
<h2>Diversify income sources</h2>
<p>Our next update rolls out some sweet features, but after that, we have to concentrate on diversifying our income sources a bit. There will be in-app-purchase at some point in time (it is <em>the</em> way to make money on the App Store right now) and we plan to launch two more titles this year.</p>
<p>We also plan to port Domino! to Android. We&#8217;ll let you know how that goes, financially.</p>
<p>However, as we look to continue growing (which includes hiring a couple new people) and diversify and increase our revenue streams, we have to be extremely cognizant of user happiness. No matter what we do, we piss off <em>some</em> users with each update, but as long as the majority are happy, that&#8217;s good.</p>
<p>Adding something as seemingly a money-grab as in-app-purchase requires intense amounts of time being spent on making sure that extreme levels of value are being delivered to our customers.</p>
<h2>So how did we do it?</h2>
<p>How did a small game studio make good? We&#8217;re certainly not a million-dollar company&#8230; yet. But how did we get to be much more than self-sustaining?</p>
<p>I have no idea.</p>
<p>But it seems that these factors had something to do with it:</p>
<ol>
<li>Constant communication with our players. Constant. We engage users however and wherever we can &#8211; often directly in-app. Server hiccup? Here&#8217;s what happened. The entire app stops working for 30,000 people because we missed a change in Facebook&#8217;s API? A full-on customer service assault.</li>
<li>Constant <em><strong>personal</strong></em> communication with players. Every regular player knows our first names (and perhaps our last names). Many people start matches with us, so they can play the developers. We have conversations with them through in-game chat, email, Facebook, Twitter, and more. Parker has over 80 ongoing matches right now, because he was silly enough to include his username in a Facebook post somewhere.</li>
<li>The personal touch &#8211; which goes along with numbers 1 and 2. When Parker lost his first match against a player publicly, he posted a picture of his shame.
<p><div class="wp-caption aligncenter" style="width: 919px"><a href="http://f.cl.ly/items/1N2O2l0h3W363T0R311v/ParkersShame-5.jpg" target="_blank"><img class=" " alt="" src="http://f.cl.ly/items/1N2O2l0h3W363T0R311v/ParkersShame-5.jpg" width="909" height="395" /></a><p class="wp-caption-text">Parker&#8217;s Shame</p></div></li>
<li>Updates that don&#8217;t have to be <em>constant</em>, but contain both obvious features, as well as more subtle updates that make the game flow that much better. The &#8220;Next Game&#8221; button we recently added had a HUGE impact on player engagement, whereas tweaking our rematch process may have gone unnoticed, but suddenly people weren&#8217;t starting multiple matches against each other unnecessarily.</li>
<li>Polish. Lots of polish.</li>
<li>It&#8217;s a social game. Not social as in social media, but social as in fun between friends. We have a lot of people tell us they love playing family across the country and across the world as a way to keep in touch. That&#8217;s awesome.</li>
<li>A snappy feel &#8211; helped by both snappy servers and good UX.</li>
<li>Responsive, friendly, personalized customer service.</li>
<li>The realization that without constant attention (and perhaps even with) this could all go away in an instant.</li>
<li>Constantly making sure that we are, in our own honest opinions, the best dominoes game on the App Store.</li>
</ol>
<p>If you took ANY theme out of that, it&#8217;s how important customer services is. We have rabid fans because of it, and what&#8217;s worse, <em>we genuinely care about their happiness</em>. I mean, that&#8217;s a good thing, but now we&#8217;re invested <img src='http://davemartorana.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Conclusion&#8230;?</h2>
<p>So that&#8217;s a lot, but hopefully it&#8217;s let you in on a little of what&#8217;s been an incredible year for us. We hope to continue doing whatever it is that we&#8217;re doing well, while also fixing whatever we&#8217;re doing poorly &#8211; all while having just a stupid amount of fun.</p>
<p>It&#8217;s not impossible to create a profitable small business from iOS titles, but it&#8217;s certainly not easy (or fast) either. Moving from barely-sustaining to the next level is going to be like the blind leading the blind, so we&#8217;ll just keep our eye on customer satisfaction.</p>
<p>Here&#8217;s to a wonderful 2013 for Flyclops and for anyone who read down this far. You certainly deserve some good karma for that!</p>
]]></content:encoded>
			<wfw:commentRss>http://davemartorana.com/logs/flyclops/flyclops-domino-2012-in-review/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Shell scripting: logging elapsed time</title>
		<link>http://davemartorana.com/logs/software/shell-scripting-logging-elapsed-time/</link>
		<comments>http://davemartorana.com/logs/software/shell-scripting-logging-elapsed-time/#comments</comments>
		<pubDate>Thu, 02 Aug 2012 18:49:05 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://davemartorana.com/?p=390</guid>
		<description><![CDATA[This is as much a note for myself as it is for anyone else, but I&#8217;m executing a couple shell scripts via cron that I&#8217;d very much like to be able to time. I know they take from less than a second to a couple of seconds to complete, and would like to be able [...]]]></description>
				<content:encoded><![CDATA[<p>This is as much a note for myself as it is for anyone else, but I&#8217;m executing a couple shell scripts via <code>cron</code> that I&#8217;d very much like to be able to time. I know they take from less than a second to a couple of seconds to complete, and would like to be able to log the elapsed time.</p>
<p>The common way Google presents is as follows:</p>
<script src="https://gist.github.com/3239955.js?file=anything_really.sh"></script><noscript><pre><code class="language-shell shell">#!/bin/sh
START=`date +%s`

# Do stuff here

END=`date +%s`
ELAPSED=$(( $END - $START ))</code></pre></noscript>
<p>There is one glaring problem with this &#8211; for me anyway. <code>bash</code> and <code>sh</code> don&#8217;t work with fractions of a second (or floating point/decimal numbers at all) so the difference will always be a whole number. </p>
<p>Seeing &#8220;2 seconds&#8221; is fine, but I&#8217;m interested in it being &#8220;2.255322 seconds.&#8221; A better solution:</p>
<script src="https://gist.github.com/3239948.js?file=anything_really.sh"></script><noscript><pre><code class="language-shell shell">#!/bin/sh
START=`date +%s%N`

# Do stuff here

END=`date +%s%N`
ELAPSED=`echo &quot;scale=8; ($END - $START) / 1000000000&quot; | bc`</code></pre></noscript>
<p>First, we change the date format to</p>
<p><code>date +%s%N</code></p>
<p>Adding the <code>%N</code> gets us nanoseconds instead of seconds &#8211; as whole numbers, that is. (Note: <code>%N</code> doesn&#8217;t work on BSD variants.) So we divide by 1 billion, and pipe the calculation string through <code>bc</code>, a unix calculator, and it will return our seconds difference to 8 decimal places.</p>
<p>This changes my output from:</p>
<p><code>Backup complete in 2 seconds</code></p>
<p>to:</p>
<p><code>Backup complete in 2.83732828 seconds</code></p>
<p>Much better <img src='http://davemartorana.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://davemartorana.com/logs/software/shell-scripting-logging-elapsed-time/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>InnoDB tweaking on AWS RDS for write-heavy apps</title>
		<link>http://davemartorana.com/logs/software/innodb-tweaking-on-aws-rds-for-write-heavy-apps/</link>
		<comments>http://davemartorana.com/logs/software/innodb-tweaking-on-aws-rds-for-write-heavy-apps/#comments</comments>
		<pubDate>Fri, 18 May 2012 21:44:54 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[innodb]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[rds]]></category>

		<guid isPermaLink="false">http://davemartorana.com/?p=374</guid>
		<description><![CDATA[Along with the coolest game company on Earth, I launched a little game recently. The pick-up has been great&#8230; but I quickly learned a little something about RDS. The API server is write-heavy. It&#8217;s constantly saving state, setting people as online or offline, writing data about games, etc. There are more API writes than reads. [...]]]></description>
				<content:encoded><![CDATA[<p>Along with the <a title="Flyclops" href="http://flyclops.com" target="_blank">coolest game company on Earth</a>, I <a title="Domino!" href="http://domino.flyclops.com" target="_blank">launched a little game</a> recently. The pick-up has been great&#8230; but I quickly learned a little something about RDS.</p>
<p>The API server is write-heavy. It&#8217;s constantly saving state, setting people as online or offline, writing data about games, etc. There are more API writes than reads. I&#8217;m using SQLAlchemy and have highly optimized read queries&#8230; but writes&#8230; well&#8230;</p>
<p><span id="more-374"></span></p>
<p>I was finding that I was severely IO bound on writes. InnoDB, it seems, likes to write to the transaction log on disk every operation. Amazon&#8217;s RDS instances use EBS backing stores, which are nice and write-slow. At the lightest 3 updates per second, I was seeing per-operation disk writes spike up to 600ms and beyond.</p>
<div id="attachment_375" class="wp-caption aligncenter" style="width: 624px"><img class=" wp-image-375 " title="RDS Management Console-1-1" src="http://davemartorana.com/wp-content/uploads/RDS-Management-Console-1-1.png" alt="" width="614" height="357" /><p class="wp-caption-text">Wut. Slow.</p></div>
<p>I tweaked two settings:</p>
<script src="https://gist.github.com/2727865.js"></script><noscript><pre><code class="language- ">innodb_flush_log_at_trx_commit = 0
innodb_support_xa = 0</code></pre></noscript>
<p>The big one was innodb_flush_log_at_trx_commit &#8211; it seems that InnoDB synchronously writes to the transaction log (on disk) for every transaction commit &#8211; which would have been several times a second. Turning off innodb_flush_log_at_trx_commit stopped that from happening. Is that OK to do? Yup &#8211; because InnoDB will flush the log EVERY SECOND anyway. And it will do it asynchronously.</p>
<p>Now, I can handle the loss of data from 1 second. Some apps can&#8217;t. Your mileage will vary.</p>
<p>Turning off innodb_support_xa also moves from a 2-stage commit to a 1-stage commit. Again, it&#8217;s giving up a little transactional security, but I don&#8217;t particularly need it.</p>
<p>After&#8230; well, I&#8217;ll let this 24 hour log do my &#8216;splainin.</p>
<div id="attachment_376" class="wp-caption aligncenter" style="width: 660px"><img class=" wp-image-376 " title="before and after" src="http://davemartorana.com/wp-content/uploads/Domino-API-New-Relic-1.png" alt="" width="650" height="296" /><p class="wp-caption-text">Much better.</p></div>
<p>See? Much better. Since then, I&#8217;ve been trailing this sort of graph, where DB access is almost constant time:</p>
<p style="text-align: center;"><a href="http://davemartorana.com/wp-content/uploads/Domino-API-New-Relic-2.png"><img class="aligncenter  wp-image-377" title="constant time" src="http://davemartorana.com/wp-content/uploads/Domino-API-New-Relic-2.png" alt="" width="651" height="238" /></a></p>
<p style="text-align: left;">So letting InnoDB write to the transaction log asynchronously is HUGE in an RDS, write-heavy environment. Or so it would seem.</p>
]]></content:encoded>
			<wfw:commentRss>http://davemartorana.com/logs/software/innodb-tweaking-on-aws-rds-for-write-heavy-apps/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>OS X Mountain Lion (10.8) Is Not Good News For Developers</title>
		<link>http://davemartorana.com/logs/software/os-x-mountain-lion-10-8-is-not-good-news-for-developers/</link>
		<comments>http://davemartorana.com/logs/software/os-x-mountain-lion-10-8-is-not-good-news-for-developers/#comments</comments>
		<pubDate>Thu, 16 Feb 2012 17:53:56 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://davemartorana.com/?p=354</guid>
		<description><![CDATA[While I&#8217;m stil processing the information coming out about OS X 10.8 (Mountain Lion), the talk in the office has been anything but positive. It all revolves around apps. UPDATE: As some commenters have pointed out, the GM release of Mountain Lion did enable the Notification Center APIs for non-App-Store apps. While this is a [...]]]></description>
				<content:encoded><![CDATA[<p>While I&#8217;m stil processing the information coming out about OS X 10.8 (Mountain Lion), the talk in the office has been anything but positive. It all revolves around apps.</p>
<p><span id="more-354"></span></p>
<p><em><strong>UPDATE:</strong> As some commenters have pointed out, the GM release of Mountain Lion did enable the Notification Center APIs for non-App-Store apps. While this is a positive move, there are still a few restricted APIs (iCloud, and the argument can be made that this is a positive or negative thing) but sandboxing and OS-refusal to run unsigned apps continue to be hard pills to swallow.</em></p>
<p><em><strong>UPDATE 2:</strong> It looks like sandboxing is so restrictive, that <a href="http://mjtsai.com/blog/2012/09/23/aperture-3-4-sandboxing-and-flickrexport/">Apple is using private exceptions and security scoping</a> in their apps that aren&#8217;t available to developers. It&#8217;s easy to play by a different set of rules if you&#8217;re Apple, but it&#8217;s further indication that you can&#8217;t play on par in the OS anymore.</em></p>
<p><a href="http://daringfireball.net/2012/02/mountain_lion" target="_blank">Gruber did a nice writeup</a> about his experience with the Apple Event For One and new features in 10.8, but makes the following statement that I find to be relatively uninformed:</p>
<blockquote><p>This default setting benefits users by increasing practical security, and also benefits developers, preserving the freedom to ship whatever software they want for the Mac, with no approval process.</p></blockquote>
<p>It&#8217;s true, you know, that there is a security interest here. However, it is crippling to development. Here are a couple reasons why:</p>
<ol>
<li>Unsigned software won&#8217;t run unless you hop in to the OS settings. For practical purposes, it makes signing almost necessary. The problem is that any old signing won&#8217;t do &#8211; I can&#8217;t get a Verisign cert and use that. Apple holds all the keys here.</li>
<li>Signed software can&#8217;t load unsigned (compiled) plugins. There are a plethora of apps that you probably use on a daily basis that load plugins. They range from launchers (like LaunchBar, Alfred, etc.), to IM clients, professional tools for <a href="http://davemartorana.com/logs/tag/design-tag/" class="st_tag internal_tag" rel="tag" title="Posts tagged with design">design</a>, music, and movie creation and editing, and so on. Many apps make use of plugins to extend functionality and separate features in a logical fashion.</li>
<ol>
<li>The flip side to this is that you can make all plugins Javascript or Python or Ruby, but then not only are they slower, but they&#8217;re completely open-source. The <em>license</em> may not be open source, but code is definitely available for all to see.</li>
<li>While developers may be able to statically link to their <em>own</em> plugins, any software that encourages plugin development from the community will suffer.</li>
</ol>
</ol>
<p>Apple&#8217;s strategy has been termed, in our office, &#8220;boiling the frog.&#8221; It&#8217;s the old adage of a frog tossed in to boiling water will hop out, but put it in room-temperature water with the water temperature turned up slowly will not notice and will eventually boil to death. Apple&#8217;s strategy is easy to see.</p>
<p>I can understand people thinking I&#8217;m overreacting, but here&#8217;s where Apple is boiling the frog &#8211; now it&#8217;s signed apps, but you can still run unsigned ones with effort. If Apple is willing to give out signing certificates for free, requiring all apps to be signed is easily imagined in 10.9. But oh, there&#8217;s more &#8211; some of the more interesting new frameworks in 10.8, like Notification Center and iCloud, <em>are only available to apps sold through the App Store</em>.</p>
<p>The nail in the coffin is this &#8211; starting March 1, all apps submitted to the Mac App Store will have to be sandboxed. To quickly review what that means, apps will only have access to their install directory and perhaps their preferences directory, and will be unable to do things like access the general file system, hook in to OS-level functions, and so on. This effects the above-listed apps, as well renders useless apps like Little Snitch, Dropbox, Transmit, Git and SVN apps, across-file search functions in text editors like TextMate and Sublime Text, and so-on.</p>
<p>If all apps have to be signed, and in order to sign them Apple holds the keys, and in order to use all the frameworks you have to use the app store, and if you sell your app in the app store it is required to be sandboxed, well, you can see where this is going. The water is getting a lot hotter for Mr. Frog.</p>
<p>If you&#8217;re still a little confused about sandboxing, you can think of it like iOS on the iPhone and iPad &#8211; each app runs in its own space, can&#8217;t communicate with other apps, doesn&#8217;t have access to lower level OS services, and so on.</p>
<p>Of course, you can, when submitting an app to the App Store, write an essay (not kidding) about why your app needs to be able to step out of the sandbox in certain ways. However, you&#8217;re at the mercy of Apple also thinking you should have such permissions, that your app should be allowed to do what you developed it to do&#8230; And even if you do get approval, by the way, it can be revoked at any time.</p>
<p>There is going to be an awful lot of talking about these new policies in the coming months. I&#8217;m hoping things end up getting hashed out in the favor of developers &#8211; and the users who rely on their apps daily.</p>
]]></content:encoded>
			<wfw:commentRss>http://davemartorana.com/logs/software/os-x-mountain-lion-10-8-is-not-good-news-for-developers/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>The Three Revolutions of Our Age (things to be thankful for this year)</title>
		<link>http://davemartorana.com/logs/ramblings/the-three-revolutions-of-our-age/</link>
		<comments>http://davemartorana.com/logs/ramblings/the-three-revolutions-of-our-age/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 19:59:57 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Ramblings]]></category>
		<category><![CDATA[energy revolution]]></category>
		<category><![CDATA[humanity]]></category>
		<category><![CDATA[information revolution]]></category>
		<category><![CDATA[medical revolution]]></category>
		<category><![CDATA[science]]></category>

		<guid isPermaLink="false">http://davemartorana.com/?p=336</guid>
		<description><![CDATA[Those of us who had our adolescence peppered with the invention of the x86 processor, who gamed away our grade-school years on the Atari 2600 and watched Nintendo become the new heavy-weight champ of the console world with the invention of the original NES &#8211; we have spent the majority of our teen and young [...]]]></description>
				<content:encoded><![CDATA[<p>Those of us who had our adolescence peppered with the invention of the x86 processor, who gamed away our grade-school years on the Atari 2600 and watched Nintendo become the new heavy-weight champ of the console world with the invention of the original NES &#8211; we have spent the majority of our teen and young adult lives in the middle of the Information Revolution. To be able to look up something on Wikipedia on our phones while on a plane gives me pause, and makes me think back to my parents investment of a not insignificant amount of cash in to a set of World Book Encyclopedias so that we could have &#8220;information at our fingertips.&#8221; It&#8217;s impossible to control, and we can only sit back and watch in wonder as the course of humanity is changed right in front of us.</p>
<p><a href="http://davemartorana.com/wp-content/uploads/einstein.jpg"><img class="aligncenter size-full wp-image-349" title="einstein" src="http://davemartorana.com/wp-content/uploads/einstein.jpg" alt="" width="600" height="213" /></a><em><a href="http://pod-tanwen.deviantart.com/art/Scientific-Revolution-119949222">Scientific Revolution</a> by ~<a class="u" href="http://pod-tanwen.deviantart.com/">pod-tanwen</a> on <a href="http://www.deviantart.com">deviantART</a></em></p>
<p>In terms of economic impact, the Information Revolution makes the Industrial Revolution look like child&#8217;s play. The political machines of individual nations are still trying to grasp the full force of the barely-regulated globalization impact of the Information Revolution. (It may be this barely-there-regulation that has gotten us so far so quickly.) All of this, and the Information Revolution is likely still in the early stages of what future generations will look back upon as our awakening.</p>
<p><em>Update: Video of me giving a talk on this post at <a href="http://ignitephilly.org/" target="_blank">Ignite Philly 9</a> after the jump. (Thanks to <a href="http://technicallyphilly.com/" target="_blank">Technically Philly</a>!)</em></p>
<p><span id="more-336"></span></p>
<p><!--[if IE]><object width="437" height="288" id="viddlerOuter-8a72d51d" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"><param name="movie" value="//www.viddler.com/player/8a72d51d/"><param name="allowScriptAccess" value="always"><param name="allowNetworking" value="all"><param name="allowFullScreen" value="true"><param name="flashVars" value="f=1&#038;openURL=106683906&#038;autoplay=f&#038;loop=false&#038;nologo=false&#038;hd=false"><object id="viddlerInner-8a72d51d"><video id="viddlerVideo-8a72d51d" src="//www.viddler.com/file/8a72d51d/html5mobile?openURL=106683906" type="video/mp4" width="437" height="246" poster="//www.viddler.com/thumbnail/8a72d51d/" controls="controls" x-webkit-airplay="allow"></video></object></object><![endif]--> <!--[if !IE]> <!--> <object width="437" height="288" id="viddlerOuter-8a72d51d" type="application/x-shockwave-flash" data="//www.viddler.com/player/8a72d51d/"><param name="movie" value="//www.viddler.com/player/8a72d51d/"><param name="allowScriptAccess" value="always"><param name="allowNetworking" value="all"><param name="allowFullScreen" value="true"><param name="flashVars" value="f=1&#038;openURL=106683906&#038;autoplay=f&#038;loop=false&#038;nologo=false&#038;hd=false"><object id="viddlerInner-8a72d51d"> <video id="viddlerVideo-8a72d51d" src="//www.viddler.com/file/8a72d51d/html5mobile?openURL=106683906" type="video/mp4" width="437" height="246" poster="//www.viddler.com/thumbnail/8a72d51d/" controls="controls" x-webkit-airplay="allow"></video> </object></object> <!--<![endif]--></p>
<p>But it&#8217;s not alone. We get to live through two more revolutions as well &#8211; slower starters, but that may have a bigger impact on humanity than the Information Revolution will ever have. (Granted, we will see that none of these three are mutually exclusive &#8211; nonetheless, for the purposes of this essay, we&#8217;ll define them individually.)</p>
<h2>The Energy Revolution</h2>
<p>Unlike the Information Revolution, which very few were able to foresee, and therefore try to stifle, the Energy Revolution is well within sight. It will fight an uphill battle against entrenched global energy corporations, but progress can only be slowed &#8211; it cannot be stopped. The Energy Revolution is interestingly quiet in its first stages, but so was the Information Revolution. Here is the future that awaits us.</p>
<p><a href="http://davemartorana.com/wp-content/uploads/solar.jpg"><img class="aligncenter size-full wp-image-341" title="solar" src="http://davemartorana.com/wp-content/uploads/solar.jpg" alt="" width="600" height="342" /></a></p>
<p>There is a tectonic shift in the very fabric of energy production. We currently produce most of our energy at great cost to the environment which surrounds us &#8211; either by burning the finite resources of fossil fuels and coal, or by creating highly radioactive waste that can melt down and have a murderous impact that lasts generations. The future will harness the seemingly limitless energy provided to us on a constant and ongoing basis by nature itself. Instead of fighting against nature, we will embrace it.</p>
<p>I will skip wind energy in this conversation. Despite it being <a href="http://www.pawindenergynow.org/wind/facts.html" target="_blank">more efficient</a> than nuclear and fossil fuel generators (not to mention cheaper), it will be relegated to small tasks in the future. It will always have a place (think of a wind turbine on top of a sailboat) but its place will be small.</p>
<p>The future is in solar energy. We are just tapping the well of this almost limitless power. Solar energy is <a href="http://www.ncwarn.org/wp-content/uploads/2010/07/NCW-SolarReport_final1.pdf" target="_blank">already cheaper</a> (PDF warning) than nuclear energy, and will be <a href="http://www.nytimes.com/2011/11/07/opinion/krugman-here-comes-solar-energy.html?_r=2&amp;hp" target="_blank">cheaper than coal-fired plants</a> in under 10 years. If you take in to account the economic impact of the pollution and health issues caused by burning coal, solar energy is already cheaper.</p>
<p>Here are some quick numbers according to <a href="http://blogs.scientificamerican.com/guest-blog/2011/03/16/smaller-cheaper-faster-does-moores-law-apply-to-solar-cells/" target="_blank">Scientific America</a>: the Sun hits the earth with 89 petawatts of power every day. That&#8217;s 6,000 times more energy than all of civilization uses. Enough energy hits the Earth in 14 seconds to power the entire world for a day. In 88 minutes, as much as the world consumes in a full year. &#8220;In 112 hours &#8211; less than five days &#8211; it provides 36 zettajoules of energy &#8211; as much energy as is contained in all proven reserves of oil, coal, and natural gas on this planet. If humanity could capture one tenth of one percent of the solar energy striking the earth &#8211; one part in one thousand &#8211; we would have access to six times as much energy as we consume in all forms today, with almost no greenhouse gas emissions.&#8221;</p>
<p>Scientific America went ahead and <a href="http://blogs.scientificamerican.com/guest-blog/2011/03/16/smaller-cheaper-faster-does-moores-law-apply-to-solar-cells/" target="_blank">did the math</a> and discovered that the cost of solar power collection is following Moore&#8217;s Law &#8211; and has been for over 31 years. By 2030, solar energy production will cost <strong><em>half</em></strong> of coal production &#8211; with virtually zero carbon emissions. We currently emit 35 gigatons of carbon emissions each year by burning fossil fuels for energy &#8211; by one study, that&#8217;s enough to fill the balloons of the Macy&#8217;s Thanksgiving Day Parade <a href="http://climaterealityproject.org/2011/11/23/a-thanksgiving-reality-check/" target="_blank">over <strong>2 billion times</strong></a>. With solar costing half of what fossil fuels do, we&#8217;ll be able to eliminate a huge chunk of that 35 gigatons of annual carbon pollution.</p>
<p>Of course the biggest factor sitting between us and energy independence is not solar technology, but battery technology. It takes a long time to charge batteries, and they have limited capacity. They&#8217;re also toxic to produce. Never fear &#8211; insane strides are being made to battery technology too. For now, it&#8217;s Lithium-ion. Northwestern University just discovered that a small change in the way we produce Lithium-ion batteries &#8211; basically drilling holes in-between the layers &#8211; <a href="http://www.physorg.com/news/2011-11-technology-energy-capacity-rechargeable-batteries.html" target="_blank">increases the storage capacity of a battery by a factor of 10, and decreases the charge time again by a factor of 10</a>. They expect the production changes to take at most 5 years to reach market, which means our iPhones will take 5 minutes to charge and last for 5-10 days of constant use. To put it another way, this simple change makes electric cars 100% viable. A Nissan Leaf would take <a href="http://gas2.org/2011/11/22/lithium-battery-electrode-increases-battery-life-decrease-charge-time-by-factor-of-10/" target="_blank">3 minutes to charge</a> on a Level 3 charger, and have a range of <strong>730 miles</strong>. What comes after the Lithium-ion is anyone&#8217;s guess, but at least we know <a href="http://www.pcworld.com/article/192300/nanoscale_ultra_capacitors_challenge_the_lithiumion_battery.html" target="_blank">smart</a> <a href="http://www.forbes.com/sites/williampentland/2011/06/10/sludge-battery-breakthrough-at-mit-sparks-cambridge-crude-speculation/" target="_blank">people</a> are <a href="http://www.greentechmedia.com/articles/read/the-future-of-batteries-might-not-be-batteries/" target="_blank">working on it</a>.</p>
<p>The potential of Northwestern&#8217;s Lithium-ion breakthrough is huge. Aside from electric cars, it means home-based batteries that store solar-collected energy could withstand a few days of low sunlight. It means that even a small break in a huge storm-system could mean fully-recharged batteries. This is huge, as solar cells only collect energy during the day, and only if it&#8217;s sunny out. Better batteries mean less direct sunlight is required. Solar power on every building starts to become viable.</p>
<p>But hey &#8211; just in case you still think this direct-sunlight thing is a huge detractor of solar cells, fear not. Idaho National Labs have created a <a href="https://inlportal.inl.gov/portal/server.pt?open=514&amp;objID=1269&amp;mode=2&amp;featurestory=DA_101047" target="_blank">thin solar film</a> that actually holds nano-coils that vibrate at the natural frequency of a type of radiation that floods the Earth from the Sun both day and night, sunny or cloudy. To boot, they&#8217;re 80% efficient (as opposed to current cells that are 40% efficient). Solar cells that can collect energy efficiently both night and day? It&#8217;s not a pipe-dream. It&#8217;s the future.</p>
<p>As Moore&#8217;s Law continues to act on the price of collecting energy from the Sun that hits the Earth whether we use it or not, we mathematically head towards a point where the cost of producing energy nears zero. Since energy is nine-tenths of production, the ability to produce food and goods opens up to even the poorest among us. Where desalination is currently inefficient and energy-hungry, near-limitless near-free energy would make desalination (in current technology) affordable to those who desperately need it. Limitless cheap energy and worldwide access to clean water changes not &#8220;the game&#8221;, but &#8220;every game.&#8221;</p>
<p>The best part is, we will be alive to witness its birth.</p>
<h2>The Medical Revolution</h2>
<p>The third in our series of revolutions is medicine. What we take for medical technology now will look antiquated and even barbaric within our lifetimes. Mapping the human genome was more important than any of us could have imagined. Still in its infancy, understanding what the 25-40,000 genes in our bodies <em>do</em> is just starting to emerge. The human body has about 3-4 billion base pairs in its DNA, but only around 4 percent of those effect gene function, which is where the future of medicine lies.</p>
<p>Viruses and bacterial infections are basically epic battles between genes. Right now we flail in the dark trying to combat viruses, and our ability to beat back a bacterial infection results in mutated, drug-resistant bacteria capable of withstanding the best of the fight we have. But if we can understand the actual battle happening between our genes and those of viruses and bacteria, we can build targeted weapons against disease that nothing can combat.</p>
<p>Let&#8217;s start with genetic mapping. When we started mapping the human genome in 2001, we thought it would take 30 years and cost more money than we could imagine. The initial costs were astronomical &#8211; the cost of mapping one Megabase (one million base pairs) was over $10,000. But unlike the cost of solar energy which is following Moore&#8217;s Law, the cost of genetic sequencing and mapping has fallen <a href="http://singularityhub.com/2011/03/05/costs-of-dna-sequencing-falling-fast-look-at-these-graphs/" target="_blank">far, far faster</a>. The big change happened in 2008, and by July of 2011, the cost per Megabase had fallen to $0.10. The cost of mapping a Megabase of DNA has dropped by <strong>100,000%</strong>. The cost of mapping an entire genome? It&#8217;s down from $100,000,000 to well below $30,000.</p>
<p><a href="http://davemartorana.com/wp-content/uploads/dna.jpg"><img class="aligncenter size-full wp-image-342" title="dna" src="http://davemartorana.com/wp-content/uploads/dna.jpg" alt="" width="600" height="335" /></a></p>
<p>Of course, in order to truly understand a genome, you have to understand patterns in genetic sequences. That requires a lot of data. Some genetic banks have stores of DNA samples <a href="http://singularityhub.com/2010/01/19/vanderbilt-launches-dna-biobank-with-75000-samples/" target="_blank">in the hundreds of thousands</a> but more will be required. Still, this hasn&#8217;t stopped science, and genetic pattern matching has already begun.</p>
<p>But lets back up for a second. Imagine the cost of mapping a genome persists on the same path. The cost of mapping a genome would drop to 30 cents in 3 years. It&#8217;s likely to not continue on this trend, but the price will drop significantly, and in the near future it will become cost effective to map everyone&#8217;s DNA. Sample sizes will increase to the millions if not billions, and pattern matching will be able to pinpoint the exact genetic sequences of everything from cancer to the common cold. Several companies are already working on <a href="http://www.technologyreview.com/biomedicine/39048/page1/" target="_blank">mapping the genetic profiles of cancers</a>. What this means is targeted therapies that replace nuclear options like chemotherapy. Not only will such mapping lead doctors to be able to tell what drugs a cancer might be resistant to and which would be incredibly effective, but will even eventually lead to custom-made, custom-tailored drugs that are specific to not a kind of cancer, but to <a href="http://www.dana-farber.org/Newsroom/Publications/Tailor-Made.aspx" target="_blank">a particular cancer in a particular individual</a>. Tailor-made drugs with DNA-specific targeting mechanisms mean cancer and other diseases become a nuisance rather than a death sentence &#8211; if we just don&#8217;t prevent them in the first place.</p>
<p>Then there&#8217;s the insanely cool and barely understood stem cell. Much speculation has been made of its potential, but the debate has been bogged down in the politics of abortion. Not to fear, we&#8217;ve already moved past embryonic stem cells in many therapies. Not only can we use your own stem cells now, but we can use pig cells too, why not?</p>
<p>Recently the Pentagon has been dabbing in regenerating muscle lost by soldiers to IEDs and other battlefield injuries. They&#8217;ve been testing regenerative muscle replacement on soldiers suffering &#8220;massive loss&#8221; of tissue &#8211; defined by a 25% tissue loss (but including up to 90% loss) &#8211; preventing the need for amputation and giving soldiers 25% or more improvement in physical function. This isn&#8217;t the future &#8211; it&#8217;s happening now. A mere 4 years after a company was able to <a href="http://health.howstuffworks.com/human-body/cells-tissues/extracellular-matrix.htm" target="_blank">regenerate a fingertip</a> in an experiment, the first trials are happening on soldiers. Certain proteins and cells from a pig&#8217;s bladder can create the scaffolding that will cause your own stem cells to flood a particular area and start regenerating lost tissue. It only takes a single surgery and some fairly intense physical therapy to strengthen the newly regenerated muscle cells, but the procedure has already been a success on 4 soldiers. The trial wraps up in less than 2 years, and baring any unforeseen circumstances (none of which have raised their heads since this began in 2007) this will become the standard treatment for traumatic loss. Consider the consequences: 50% of battlefield injuries in Iraq and Afganistan are these types of &#8220;massive loss&#8221; injuries. Amputations could become a thing of the past. Bring that technology in to the civilian world and amputations from car accidents to diabetes will all but go away.</p>
<p>But enough about muscles. What about the rest of your body? Got you covered there too. In what can only be described as a blurring of the lines between traditionally held beliefs about the fabric of life itself, we can now use your own stem cells to <a href="http://www.thedailybeast.com/newsweek/2010/12/07/future-of-medicine-growing-new-organs.html" target="_blank">regrow replacement body parts</a>. The basics are this &#8211; create a scaffold, dip it in some stem cells, program it to be a thing (your choice &#8211; a heart? bladder? How about a urethra, windpipe, kidney&#8230;?) and then once it&#8217;s grown in a lab, transplant it back in to your body. Your second, growing heart will <a href="http://www.youtube.com/watch?v=j9hEFUpTVPA" target="_blank"><em>actually start to beat</em></a> before it is ever implanted in your body.</p>
<p>The benefits are obvious. First there is the enormous shortage of donated organs &#8211; and in order to receive one, often someone else has to die. Transplanted organs require a lifetime of massive drug therapy to keep you from rejecting the implanted organs. Even with drugs, many transplants fail, and the patient ends up dying anyway. Now take an organ built with your own stem cells &#8211; it&#8217;s yours, free and clear. Science already has the ability to build your own replacement organs, which will one day do away with the need for organ donors. Your stem cells will become life-regenerating factories, capable of regrowing anything broken. Born blind? New eyes. Heart failure? New heart. And for one guy who had throat cancer, <a href="http://news.discovery.com/human/first-artificial-organ-transplant-110708.html#mkcpgn=rssnws1" target="_blank">a new windpipe</a>. The best part is that since the body part is grown of your own body, it will never be rejected &#8211; no post-transplant drugs, just a whole new part that&#8217;s fresh and ready to take on the role of its previous, failing brother-in-arms.</p>
<p>This isn&#8217;t the future. It&#8217;s now. Within a decade, it will be common-place. Within 25 years, we may no longer have a need for a donor registry at all.</p>
<p>So whether you get a genetically hand-tailored drug to destroy the cancer in your kidney, or you simply replace a kidney that&#8217;s beyond repair&#8230; you can see how mind-bending the near-future of medicine is &#8211; and only imagine what the not-too-distant future will hold.</p>
<p>Besides, it will be nice to be able to grab some replacement body parts, even if we <a href="http://www.ted.com/talks/cynthia_kenyon_experiments_that_hint_of_longer_lives.html" target="_blank">may have already found</a> a way to <a href="http://abcnews.go.com/Technology/Ted_Diane/ted-talks-worm-helps-scientists-link-gene-longevity/story?id=14973527" target="_blank">slow aging drastically</a>. 300 years is a long time to live with all the same organs.</p>
<h3>What a time to be alive!</h3>
<p>We get to live through not one, but three concurrent revolutions, each of which will have a more changing effect on humanity over the course of a few decades than the rest of human history put together. This is an insane time to be alive. At 33 years of age, I imagine what the scientific landscape will look like when I&#8217;m 60 is almost impossible to imagine. While there is still political and religious strife, extreme poverty, starvation, war, and genocide, each will be impacted positively by the three revolutions. When the world has access to information, energy, and medical breakthroughs beyond comprehension, the landscape of humanity will change forever &#8211; for the better. I guarantee it.</p>
]]></content:encoded>
			<wfw:commentRss>http://davemartorana.com/logs/ramblings/the-three-revolutions-of-our-age/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Window Paintings by Sean Martorana</title>
		<link>http://davemartorana.com/logs/design/window-paintings-by-sean-martorana/</link>
		<comments>http://davemartorana.com/logs/design/window-paintings-by-sean-martorana/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 19:06:00 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[art]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[painting]]></category>
		<category><![CDATA[sean martorana]]></category>

		<guid isPermaLink="false">http://davemartorana.com/logs/ramblings/window-paintings-by-sean-martorana/</guid>
		<description><![CDATA[At the Q BBQ in Philadelphia. View the full set here.]]></description>
				<content:encoded><![CDATA[<p>At the Q BBQ in Philadelphia. <a title="On flickr" href="http://www.flickr.com/photos/iamthedave/sets/72157627715979903/with/6221229004/" target="_blank">View the full set here</a>.</p>
<p><object width="400" height="300" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="flashvars" value="offsite=true&amp;lang=en-us&amp;page_show_url=%2Fphotos%2Fiamthedave%2Fsets%2F72157627715979903%2Fshow%2F&amp;page_show_back_url=%2Fphotos%2Fiamthedave%2Fsets%2F72157627715979903%2F&amp;set_id=72157627715979903&amp;jump_to=" /><param name="allowFullScreen" value="true" /><param name="src" value="http://www.flickr.com/apps/slideshow/show.swf?v=122138" /><param name="allowfullscreen" value="true" /><embed width="400" height="300" type="application/x-shockwave-flash" src="http://www.flickr.com/apps/slideshow/show.swf?v=122138" flashvars="offsite=true&amp;lang=en-us&amp;page_show_url=%2Fphotos%2Fiamthedave%2Fsets%2F72157627715979903%2Fshow%2F&amp;page_show_back_url=%2Fphotos%2Fiamthedave%2Fsets%2F72157627715979903%2F&amp;set_id=72157627715979903&amp;jump_to=" allowFullScreen="true" allowfullscreen="true" /></object></p>
]]></content:encoded>
			<wfw:commentRss>http://davemartorana.com/logs/design/window-paintings-by-sean-martorana/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Alexander McQueen Fall 2011</title>
		<link>http://davemartorana.com/logs/design/steve-mcqueen-fall-2011/</link>
		<comments>http://davemartorana.com/logs/design/steve-mcqueen-fall-2011/#comments</comments>
		<pubDate>Wed, 05 Oct 2011 16:01:00 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[fashion]]></category>
		<category><![CDATA[mcqueen]]></category>

		<guid isPermaLink="false">http://davemartorana.com/logs/ramblings/steve-mcqueen-fall-2011/</guid>
		<description><![CDATA[Check out the photos by Nina Garcia of Alexander McQueen&#8217;s 2011 runway show. He might be gone, but his couture style still lives on. And these are just crappy phone photos&#8230; &#160; Nina Garcia on WhoSay &#160; &#160;]]></description>
				<content:encoded><![CDATA[<p>Check out the photos by Nina Garcia of Alexander McQueen&#8217;s 2011 runway show. He might be gone, but his couture style still lives on. And these are just crappy phone photos&#8230;</p>
<p>&nbsp;</p>
<p style="text-align: center;"><a title="Nina Garcia's photo PHOTO: Final walk @WorldMcQueen CC: @marieclaire" href="http://www.whosay.com/ninagarcia/photos/75879"><img class="aligncenter" alt="Nina Garcia's photo PHOTO: Final walk @WorldMcQueen CC: @marieclaire" src="http://media.whosay.com/75879/75879_la.jpg" /></a><br />
<a href="http://www.whosay.com/ninagarcia/photos/75879">Nina Garcia on WhoSay</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://davemartorana.com/logs/design/steve-mcqueen-fall-2011/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>weWorkInPhilly</title>
		<link>http://davemartorana.com/logs/websites/weworkinphilly/</link>
		<comments>http://davemartorana.com/logs/websites/weworkinphilly/#comments</comments>
		<pubDate>Thu, 07 Jul 2011 17:31:00 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Websites]]></category>

		<guid isPermaLink="false">http://davemartorana.com/logs/ramblings/weworkinphilly/</guid>
		<description><![CDATA[A fantastic directory of people, companies, projects, groups, and resources all proud to call Philadelphia&#8230; home. You&#8217;ll find me, Flyclops, and so much more!]]></description>
				<content:encoded><![CDATA[<p>A fantastic directory of people, companies, projects, groups, and resources all proud to call Philadelphia&#8230; home.</p>
<p>You&#8217;ll find <a title="Dave Martorana on weWorkInPhilly" href="http://weworkinphilly.com/people/dave-martorana" target="_blank">me</a>, <a title="Flycops at weWorkInPhilly" href="http://weworkinphilly.com/companies/flyclops" target="_blank">Flyclops</a>, and <a title="weWorkInPhilly" href="http://weworkinphilly.com" target="_blank">so much more</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://davemartorana.com/logs/websites/weworkinphilly/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Orb Lab Light from Schoolhouse Electric</title>
		<link>http://davemartorana.com/logs/design/orb-lab-light-from-schoolhouse-electric/</link>
		<comments>http://davemartorana.com/logs/design/orb-lab-light-from-schoolhouse-electric/#comments</comments>
		<pubDate>Wed, 01 Jun 2011 14:54:00 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[lighting]]></category>

		<guid isPermaLink="false">http://davemartorana.com/logs/ramblings/orb-lab-light-from-schoolhouse-electric/</guid>
		<description><![CDATA[Desk lamps don&#8217;t have to be boring, and this one certainly isn&#8217;t. Schoolhouse Electric does some really really cool things with lighting &#8211; check out some more of their desk lamps and other wares here.]]></description>
				<content:encoded><![CDATA[<p>Desk lamps don&#8217;t have to be boring, and this one certainly isn&#8217;t. Schoolhouse Electric does some really really cool things with lighting &#8211; <a title="Schoolhouse Electric" href="http://www.schoolhouseelectric.com/" target="_blank">check out some more of their desk lamps and other wares here</a>.</p>
<p><a href="http://davemartorana.com/wp-content/uploads/Period-Lighting-Fixtures-and-Glass-Shades-Schoolhouse-Electric-Co.-Fixtures.jpg"><img class="size-full wp-image-320 aligncenter" alt="Period Lighting Fixtures and Glass Shades - Schoolhouse Electric Co. - Fixtures.jpg" src="http://davemartorana.com/wp-content/uploads/Period-Lighting-Fixtures-and-Glass-Shades-Schoolhouse-Electric-Co.-Fixtures.jpg" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://davemartorana.com/logs/design/orb-lab-light-from-schoolhouse-electric/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Rackspace Cloud Load Balancers to make Cloud Servers disposable and immutable</title>
		<link>http://davemartorana.com/logs/software/using-rackspace-cloud-load-balancers-to-make-cloud-servers-immutable/</link>
		<comments>http://davemartorana.com/logs/software/using-rackspace-cloud-load-balancers-to-make-cloud-servers-immutable/#comments</comments>
		<pubDate>Tue, 17 May 2011 20:05:53 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://davemartorana.com/?p=285</guid>
		<description><![CDATA[It's pretty easy to get an EC2-type experience from Rackspace while saving money, getting outstanding support, and reaping all the same benefits.]]></description>
				<content:encoded><![CDATA[<p>Depending on your needs, Rackspace&#8217;s implementation of Cloud Servers is either better &#8211; or worse &#8211; than Amazon EC2. I happen to see several advantages that Rackspace has over EC2:</p>
<ol>
<li>Cloudfiles images are insanely easy to manage, and any server can be spun up from any snapshot. This is so much easier than trying to create a custom AMI that it&#8217;s not even worth discussing.</li>
<li>The initial buy-in is incredibly low &#8211; a single small server will run you about $12 on Rackspace, while running ~$70 on EC2. Yes, I know that the hardware is basically apples-to-oranges, but we&#8217;re talking about initial buy-in here, not what $70 will get you. I can run a web server box and a PostgreSQL box separately for well under a single small instance on EC2.</li>
<li>The support &#8211; oh the support. Zip, zilch, nada on EC2&#8230; while on Rackspace &#8211; a human in under 20 seconds. It&#8217;s glorious.</li>
</ol>
<p>However, I grew to love the idea of throw-away servers with EC2. Alestic, Ubuntu, and other well-known institutions provide ready-to-go AMIs, and we spent a little bit of time writing code that would take a vanilla API, run a shell script, and turn it in to whatever it needed to be in no time flat. We plugged this scripting in to our CI server, and would have a successful build of our production branch of code spin up new servers with new code, drop the old ones, and no one would be the wiser.<span id="more-285"></span></p>
<p>Since my new business is fledgling, I didn&#8217;t have the money to run multiple EC2 instances with RDS as another expense. Rackspace has always had a place in my heart since my days of running $10k/month in servers from one of my old jobs. While their cloud offerings are certainly less mature than Amazon&#8217;s, the price was right, and it was pretty easy to get going.</p>
<p>I knew there had to be a way to get the kind of flexibility I had with EC2 on Rackspace, even though they built their offerings completely oppositely &#8211; servers are supposed to be long-running, save state, etc.</p>
<h2>Enter Cloud Load Balancers</h2>
<p>As soon as Rackspace opened their Cloud Load Balancer product to beta (and I discovered a Python API to it) I knew I had found what I needed. The idea was this &#8211; write a script against their API that would spin up new servers, drop them behind static load balancers, drop out the old servers, and no one would be the wiser. Rackspace&#8217;s load balancers even had a huge advantage over Amazon&#8217;s Elastic Load Balancers &#8211; I could point an A record at them.</p>
<p>There were, however, a few hurdles I hadn&#8217;t expected.</p>
<p>Amazon has this neat little feature where you can pass in data to a newly booting server. You simply have your rc.local file call a special IP address, download the data, and in our case, execute said data as a script. That would get you in the door and your code running.</p>
<p>Rackspace was more difficult &#8211; much more. They allow you to pass in files to a newly booting server, but those files are then marked as read-only with no execute permissions. So passing in an rc.local file would mark that file as un-executable, and it wouldn&#8217;t run.</p>
<p><strong>Hey cron, can you help me out?</strong></p>
<p>The solution is an ugly one, but here it is. There are three files I pass in to a newly booting web server.</p>
<p><code>/etc/rc.local</code><br />
<script src="https://gist.github.com/976694.js"> </script></p>
<p><code>/etc/rc.local.stage1</code><br />
<script src="https://gist.github.com/976701.js"> </script></p>
<p>And the crux of the whole thing:</p>
<p><code>/etc/cron.d/initialrunner</code><br />
<script src="https://gist.github.com/976705.js"> </script></p>
<p>Let&#8217;t take a look at these files. <code>rc.local</code> does as it should &#8211; it has some scripting that runs whenever the server reboots &#8211; in this case launching <a title="django-ztask" href="http://github.com/dmgctrl/django-ztask" target="_blank">django-ztask</a> &#8211; our async backgrounding app build on top of 0MQ (but that&#8217;s another story for another day).</p>
<p><code>rc.local.stage1</code> is run once and only once, and is the script that sets up our whole server. I&#8217;ve only put the first few lines, but you can see what they do &#8211; update the server, install git, and as you can imagine, do a bunch of other things (load in our git public keys, install apache, side-load our apache conf files, etc.).</p>
<p>But like I said &#8211; all three of these files will be marked as read-only and neither script will be executable. So we toss in a script in to <code>/etc/cron.d/initialrunner</code> that does 4 things the first time you reboot the server:</p>
<ol>
<li>Echo &#8220;hello world&#8221; in to a log file as an indication to me that it was run</li>
<li>Change the permissions of <code>/etc/rc.local</code> and <code>/etc/rc.local.stage1</code></li>
<li>Execute <code>/etc/rc.local.stage1</code> to set up the server, sending output to a log file</li>
</ol>
<p>Simple enough.</p>
<p><strong>Putting it all together</strong></p>
<p>The build script (written in Python) is somewhat long, but I&#8217;m going to put it here, and explain below what it&#8217;s doing. This is the script that my CI server runs after a successful unittest build of code committed to our production branch.</p>
<p><code>build.py</code><br />
<script src="https://gist.github.com/976729.js"> </script></p>
<p>So what&#8217;s going on here?</p>
<p>The <code>if __name__ == '__main__':</code> section at the bottom of the script is what gets run when the script is called from a shell. This is what it does in order:</p>
<ol>
<li>It instantiates a <code>cloudservers.CloudServers</code> object instance, (from the official <a href="http://pypi.python.org/pypi/python-cloudservers" target="_blank">python-cloudservers Python API package, available here</a>) passing in our username and API key</li>
<li>Calls <code>create_server</code>, passing in the name of the initial image to use and the size of the server.</li>
<li>Calls <code>wait_for_server</code> which waits for the server to be done setting up. This takes the keyword argument <code>with_url_ping</code> that we&#8217;ll use later to not only wait for the server to respond, but acknowledge our site is up as well.</li>
<li>Sleeps for 20 seconds (Rackspace seems to have a few places where it needs a couple seconds to catch up with itself)</li>
<li>Calls the the update method on the server instance, which has the happy side effect of REBOOTING the server. That &#8211; guess what &#8211; causes our <code>/etc/cron.d/initialrunner</code> script to be called, which starts building our server out!</li>
<li>Wait for the server again, waiting for the ping to return true this time, which means that Apache is up, mods have been enabled, it&#8217;s configured properly, and serving our content.</li>
<li>&#8230; At this point in time, our REAL script also uses <code>paramkio</code> (SSH library) to run server migrations and run our unittest suite against the installed code, but I left that out.</li>
<li>Creates an instance of <code>cloudlb.CloudLoadBalancer</code> object, (from the official <a href="http://pypi.python.org/pypi/python-cloudlb" target="_blank">python-cloudlb Python API package, available here</a>) passing in our username, API key, and which of the data centers to use. (Hint: there are only two.)</li>
<li>Call <code>replace_servers</code>, which takes the new servers, appends them to the load balancer, waits 20 seconds, and removes the old servers. It then deletes the old servers from existence.</li>
</ol>
<p>It may seem somewhat complicated, but it&#8217;s not much different than using BOTO to do the same thing on EC2. There&#8217;s also nothing stopping you from modifying this script slightly to create multiple servers each time. The <code>replace_servers</code> function is already aware of replacing all servers with all new servers (notice it takes our new server in an array, expecting to load as many new servers behind our load balancers as we ask it to).</p>
<div class="woo-sc-box normal   ">The whole script works using internal IP addresses &#8211; each Rackspace Cloud Server gets two IPs &#8211; a public and private IP address. Servers are able to address each other faster using the internal IP.</div>
<p><strong>Any downsides?</strong></p>
<p>Yeah, a couple. Every now and again the server build will just die. Seems to be a Rackspace issue and I need to get in touch with support about it, but since the final <code>wait_for_server</code> call will fail over by deleting our hanging server without touching existing servers, it&#8217;s not a big deal and the build script is just re-run.</p>
<p>Also, Rackspace load balancers work in an odd fashion &#8211; they can only run a single port. They can share IP addresses (see the <code>replace_servers</code> function which, if finding no existing load balancers, will create them for you) so your DNS doesn&#8217;t have to do anything fancy, but to run a website with port 80 and 443, you have to pay for two load balancers. Still relatively cheap, but an annoying downside.</p>
<p><strong>Conclusion, maybe?</strong></p>
<p>With a little love from the official API packages and Rackspace&#8217;s new Cloud Load Balancers, I was able to achieve the same immutable-server effect that I like from EC2, for a fraction of the price. While many people like long-running servers and using things like Capistrano or Fabric for deployment, I prefer that servers build new each time, test themselves, then simply replace outdated servers with not a clue that it&#8217;s happening to the end user. The beauty of this is that with a single line of code change, I can update what image new servers are built with, instantly taking advantage of an updated OS release.</p>
<p>This method isn&#8217;t for everyone, and it&#8217;s a lot more popular with EC2, but it&#8217;s possible with Rackspace, and I&#8217;d prefer to stick with Rackspace (and reap the benefits of their amazing support) and still get what I want. <img src='http://davemartorana.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><em>(Image courtesy of <a href="http://www.sxc.hu/profile/clix">clix on sxc.hu</a>)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://davemartorana.com/logs/software/using-rackspace-cloud-load-balancers-to-make-cloud-servers-immutable/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  davemartorana.com/feed/ ) in 1.03912 seconds, on Jun 18th, 2013 at 10:54 pm UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Jun 18th, 2013 at 11:54 pm UTC -->
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- Quick Cache Is Fully Functional :-) ... A Quick Cache file was just served for (  davemartorana.com/feed/ ) in 0.00055 seconds, on Jun 18th, 2013 at 10:56 pm UTC. -->