<?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>Benjamin Stover &#187; mobile</title>
	<atom:link href="http://stechz.com/tag/mobile/feed/" rel="self" type="application/rss+xml" />
	<link>http://stechz.com</link>
	<description></description>
	<lastBuildDate>Fri, 09 Dec 2011 17:57:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Creating a robust kinetic animation</title>
		<link>http://stechz.com/2010/robust-kinetic-animation/</link>
		<comments>http://stechz.com/2010/robust-kinetic-animation/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 00:22:27 +0000</pubDate>
		<dc:creator>Benjamin Stover</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[kinetic]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[n900]]></category>
		<guid isPermaLink="false">http://stechz.com/?p=119</guid>
		<description><![CDATA[Sometimes it&#8217;s the little things that make all the difference in an application. That&#8217;s probably why I&#8217;ve rewritten our kinetic scrolling in some fashion three different times. Kinetic scrolling is the animation you see on touchscreen phones when you move your finger across a web page and let go. The content will continue to scroll [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes it&#8217;s the little things that make all the difference in an application.  That&#8217;s probably why I&#8217;ve rewritten our kinetic scrolling in some fashion three different times.  Kinetic scrolling is the animation you see on touchscreen phones when you move your finger across a web page and let go.  The content will continue to scroll for a couple of seconds, slowing down to a halt at the end.  This gives scrolling a feeling of physical weight, as if you had pushed a coin across your desktop and friction slowed it to a stop.  It&#8217;s one of those algorithms anyone can implement, but few manage to perfect.</p>
<p>Fennec&#8217;s kinetic scroller needed some tweaking, though I didn&#8217;t start out knowing exactly what it needed.  As I played with a few algorithms I eventually came up with three goals:</p>
<ul>
<li>Predictability.  The same gesture should roughly get you exactly the same distance every time, independent of outside factors like frame skipping.</li>
<li>Smoothness.  Your eyes are good at noticing changes in distance.  If a frame or two is out of step, you will notice or possibly even see something unexpected!  More on that later.</li>
<li>Speed.  The total time the animation takes should be reigned in; the animation is there to give weight to the content with subtlety, and stay out of the way.</li>
</ul>
<p>Each goal isn&#8217;t so hard in itself, but I found when I focused on one the other two would slip out of my grasp.  As far as I&#8217;ve seen, only the iPhone really gets it right.  You can spin an hour or minute scroll wheel with amazing consistency once you get the hang of it.  Android gets it all wrong.  The friction is so low that the animation can last forever.  If Android misses a few beats while you are dragging your fingers, it will interpret that as a super-fast finger pan and will set your initial velocity to infinity minus one.  Android also has poor responsiveness: sometimes on my Cliq I don&#8217;t know if I&#8217;ve panned until I&#8217;ve let go of my finger.  By then it&#8217;s far too late.</p>
<p>My work focused on changing how we determine the distance moved in every frame of the animation.  In Fennec, we keep it simple and assume we can get away with friction being a constant deceleration.  Given an initial velocity and deceleration rate, how do we get from our start position to our end position?</p>
<h3>Previous solution: Newtonian approximations with fixed dt</h3>
<p><a href="http://stechz.com/wp-content/uploads/2010/01/GodfreyKneller-IsaacNewton-1689.jpg"><img src="http://stechz.com/wp-content/uploads/2010/01/GodfreyKneller-IsaacNewton-1689-218x300.jpg" alt="" title="Isaac Newton. A major contributor to optics, calculus, and laws of planetary motion.  Also an alchemist, go figure." width="260" height="300" class="alignleft size-medium wp-image-141" /></a></p>
<p>Don&#8217;t let any of those words scare you if your math is a little rusty.  Think of the position of the scrollbox as a function of time.  At the beginning, position(t=0) is where the scrollbox was at before moving.  At some final time, the scrollbox&#8217;s position will have settled to a stop further down the page.  <a href="http://www.ugrad.math.ubc.ca/coursedoc/math100/notes/approx/newton.html">Newton&#8217;s approximation</a> is just a very simple application of a derivative:</p>
<div class="wp_syntax"><div class="code"><pre class="math" style="font-family:monospace;"># general application
f(x+dx)=f(x) + dx*f'(dx)
&nbsp;
# physics application
# note: velocity is the derivative of position
pos(t+dt)=pos(t) + dt*vel(t)
vel(t+dt)=vel(t) + dt*acc</pre></div></div>
<p>Derivatives tell how a function&#8217;s value changes.  For this algorithm, a derivative helps approximate a function&#8217;s value at nearby places.  If I know the velocity at a given time (vel(t)) and the position at a given time (pos(t)), I can make a really good guess about what the position will be at a small time increment from now (pos(t+dt)).  Set dt to a fixed constant (like if the position is updating every 15 msecs, 15 msecs might be a good value for dt).  So subtract a fraction of the velocity from the position, subtract a fraction of the acceleration from the velocity, and bam!  Newtonian approximation.  Many programmers have written this algorithm without knowing an iota of calculus just because it&#8217;s so intuitive.  Maybe Newton and his fancy calculus aren&#8217;t so precious after all.  You going to take that Newton?  Oh, you have to because you&#8217;re dead!</p>
<h4>Downsides</h4>
<p><img src="http://stechz.com/wp-content/uploads/2010/01/3386190147_cc8fe92f81-150x150.jpg" alt="" title="Not actually fat. To be fair, I haven't actually seen Falstaff. Attribution: http://www.flickr.com/photos/chuckeye/" width="150" height="150" class="alignright size-thumbnail wp-image-159" /></p>
<p>By fixing dt, the animation is not over until the fat lady sings.  And operas last a really long time.  Yeah the sets are cool and the singer-actors are amazing virtuosos, but god don&#8217;t you get tired of watching the subtexts?  It&#8217;s like Italian is only capable of conveying shock and melancholy.  If my phone is crunching and each frame takes an average of 100 milliseconds, the scrolling animation is going to last more than six times longer than it should!  Although holding a note 12 seconds is nothing for an opera superstar, an animation of similar length isn&#8217;t acceptable.</p>
<h3>Newtonian with varying dt</h3>
<p>The first fix I tried is the obvious one.  Plug the real elapsed time between frames into dt and problem solved.  This is where the reality of programming comes in and shouts &#8220;oh no you didn&#8217;t&#8221; and twists your tidy algorithm into the user experience equivalent of a pretzel.  All of the sudden, everything&#8217;s jerking around a lot!  And oh crap how did I get to the bottom of the stupid-long planet.mozilla.org so fast?  All I did was smudge my finger on the screen.</p>
<h4>Downsides</h4>
<p>Let&#8217;s plug in some numbers and see what happens:</p>
<div class="wp_syntax"><div class="code"><pre class="math" style="font-family:monospace;">50msec elapse: pos(0+.050) = 0 + .050 * 600 = 30 respectable pixels
800msec elapse: pos(0+.8) = 0 + .8 * 600 = 480 I guess that's OK pixels
3200msec elapse: pos(0+3.2)=0 + 3.2 * 600 = 1920 ridiculous pixels</pre></div></div>
<p>Unfortunately during intensive operations like page load, Fennec can often see three second delays between timer callbacks.  This is the antithesis of smooth; it&#8217;s possible to completely lose your context of what you are reading.  Not only that, but the total distance traveled is now dependent on how much time Fennec spent <a href="http://code.google.com/p/chromium/issues/detail?id=31482">teleporting goats</a> or whatever the hell it&#8217;s doing.  This is why I consider good kinetic panning a &#8220;slippery&#8221; problem; here I&#8217;ve fixed the speed problem at the total expense of predictability and smoothness.</p>
<h3>Verlet integration</h3>
<p>This is a more sophisticated way of calculating the scroll position based on the previous step, with less error.  I won&#8217;t delve into the details, but <a href="http://en.wikipedia.org/wiki/Verlet_integration<br />
">verlet integration</a> had the same basic problems as Newtonian approximation did.  Ultimately, step-based solutions were not getting me the results I wanted.  Taking a step back, I realized I was using approximations of a function that I could easily calculate myself.</p>
<h3>Closed form of position: a parabola</h3>
<p><img src="http://stechz.com/wp-content/uploads/2010/01/Gorillas_screenshot.png" alt="" title="GORILLAS.BAS, one of the first programs I ever looked at. (c) Microsoft." width="320" height="175" class="alignright wp-image-167" /></p>
<p>If the scrolling animation has a velocity that decelerates constantly, the movement is actually that of a parabola.  I don&#8217;t want to dive into integration methods here, but there&#8217;s an easier way to explain it.  If you are a gorilla and you&#8217;re throwing exploding bananas at buildings, the arc that your banana makes with deadly grace as it moves through the air is a parabola.  The banana initially has an upward velocity, but gravity decelerates the velocity at a constant rate causing the banana to come down and hit unsuspecting office workers, detonating on impact.  This motion is analogous to our scrollbox movement over time, except at the peak of the scrollbox&#8217;s parabola the motion is cut off.</p>
<p>Here&#8217;s the formula:</p>
<div class="wp_syntax"><div class="code"><pre class="math" style="font-family:monospace;">pos(t) = v0*t + 1/2*a*t^2
vel(t) = v0 + a*t</pre></div></div>
<div class="plot">
<!--<br />
  (function() {<br />
    var d1 = [];<br />
    for (var i = 0; i < 10.5; i += 0.5)<br />
      d1.push([i, 5 * i - .5 * i * i]);</p>
<p>    var d2 = [];<br />
    for (var i = 0; i < 10.5; i += 0.5)<br />
      d2.push([i, 5 - i]);</p>
<p>    var markings = [<br />
      { color: '#000', lineWidth: 1, color: 'red', xaxis: { from: 5.0, to: 5.0 } },<br />
    ];</p>
<p>    var ticks = [[5, "final time"]];</p>
<p>    $.plot(this, [{ label: "Position pos(t)" , data: d1 }, { label: "Velocity vel(t)", data: d2 }], { grid: { markings: markings }, xaxis: { ticks: ticks } });<br />
  })<br />
-->
</p></div>
<p>Now I was getting somewhere.  I could calculate the time and position at which the movement is at its peak, when the velocity is zero:</p>
<div class="wp_syntax"><div class="code"><pre class="_1" style="font-family:monospace;">vel(tf) = 0 = v0 + a * t
tf = -v0 / a
&nbsp;
pos(-v0 / a) = v0 * (-v0 / a) + 1/2 * a * (-v0 / a) ^ 2
pos(-v0 / a) = -1/2 * v0^2 / a</pre></div></div>
<p>So I now have an equation that gives me exactly what I want: when the animation should end, and more importantly, where the animation should end.  Assuming the initial velocity is calculated robustly, I can pan down a page and consistently get the same distance covered every time.</p>
<h4>Downsides</h4>
<p>This formula nails down the animation&#8217;s speed and predictability as best as anything can, but smoothness has suffered.  To add insult to injury, our <a href="http://dailythemes.wordpress.com/">mobile VP Jay</a> noticed something bizarre: the scrolling sometimes sped up in the middle!  I checked my algorithm with a data dump:</p>
<div class="plot alignright">
<!-- (function() {<br />
var d1 =<br />
[[30,-50],<br />
[72,-67],<br />
[119,-70],<br />
[167,-67],<br />
[215,-63],<br />
[263,-58],<br />
[310,-52],<br />
[358,-49],<br />
[405,-44],<br />
[463,-48],<br />
[510,-34],<br />
[558,-30],<br />
[606,-25],<br />
[655,-21],<br />
[703,-16],<br />
[750,-11],<br />
[798,-7],<br />
[856,-2]];<br />
var total2 = 0;<br />
for (var i = 0; i < d1.length; i++) {<br />
  d1[i][0] += 50;<br />
  total2 += d1[i][1];<br />
  d1[i][1] = total2;<br />
}<br />
$.plot(this, [{ label: "Position versus time", data: d1 }], { points: { show: true }, lines: { show: true }});<br />
}) -->
</div>
<div class="wp_syntax"><div class="code"><pre class="math" style="font-family:monospace;">time 30 distance -50
time 72 distance -67
time 119 distance -70
time 167 distance -67
time 215 distance -63
time 263 distance -58
time 310 distance -52
time 358 distance -49
time 405 distance -44
time 463 distance -48
time 510 distance -34
time 558 distance -30
time 606 distance -25
time 655 distance -21
time 703 distance -16
time 750 distance -11
time 798 distance -7
time 856 distance -2</pre></div></div>
<p>The numbers look pretty good, but  unfortunately the time dumps are in Javascript and don&#8217;t reflect exactly when the screen is repainted.  If the times between the scroll call and the repaint are constant, the graph would just shift (and still look like a parabola).  My theory is that this time offset varies in a specific way per animation causing the velocity hump.</p>
<h3>Parabola with time mean</h3>
<p>I then fudged time a little, like I imagine the protagonist in Braid would do in a similar spot.  I wanted all the smoothness of a fixed dt solution but with the ability to control how long the animation takes like in varying dt.  The velocity hump also needed to be flattened out.  After some experimentation, it hit me that I could literally blend the two solutions together with a time average:</p>
<div class="wp_syntax"><div class="code"><pre class="math" style="font-family:monospace;">time = (elapsed time + elapsed frames * update interval) / 2)</pre></div></div>
<p>It&#8217;s immediately obvious that the animation can last no longer than two times the &#8220;ideal time&#8221; the animation should take (plug in final time for time, 0 for elapsed frames as a worst case, and solve for elapsed time).  In contrast, if the animation is lagging behind the ideal time, the frame skipping will be blended in with a smoother animation.  If the above formula is made to be a weighted average, the trade-off between smoothness and total animation time can be tweaked with predictable results.</p>
<p>Putting the algorithm to the test, I noticed that the velocity hump is smoothed out by the time interpolation as well, so I had finally approached a robust kinetic panning algorithm that hit all three of my goals.</p>
<h3>Final thoughts</h3>
<p>Because I&#8217;m fortunate enough to be at Mozilla, you can find the distilled version of my efforts <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=538682">in code</a>.  If you&#8217;re a Javascript hacker, you&#8217;ll find this a satisfying thing to play with because you don&#8217;t really need to know a lot about Fennec beforehand.  It might be a great way to get into Fennec development (here&#8217;s how to <a href="https://wiki.mozilla.org/Mobile/Build/Fennec">set up a build</a>; ignore anything Maemo-specific to build on your desktop).</p>
<p>This problem required lots of neat stuff: basic calculus, data analysis, attention to detail and polish, a surprising roadblock, and a neatly contained end result.  These are the kinds of problems that keep me excited about programming.</p>
]]></content:encoded>
			<wfw:commentRss>http://stechz.com/2010/robust-kinetic-animation/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Health of the web and mobile site redirections</title>
		<link>http://stechz.com/2010/health-of-the-web-and-mobile-site-redirections/</link>
		<comments>http://stechz.com/2010/health-of-the-web-and-mobile-site-redirections/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 18:07:39 +0000</pubDate>
		<dc:creator>Benjamin Stover</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[open web]]></category>
		<guid isPermaLink="false">http://stechz.com/?p=114</guid>
		<description><![CDATA[Even when targeting just the iPhone, redirecting to mobile-friendly sites is already causing problems for the web. This will only get worse as sites begin to detect user agents for other mobile browsers. We are headed towards a fragmented internet, where desktop sites and mobile sites live in independent ecosystems and movement between them is [...]]]></description>
			<content:encoded><![CDATA[<p>Even when targeting just the iPhone, redirecting to mobile-friendly sites is already causing problems for the web.  This will only get worse as sites begin to detect user agents for other mobile browsers.  We are headed towards a fragmented internet, where desktop sites and mobile sites live in independent ecosystems and movement between them is fragile and perilous.</p>
<p>What is a good solution for this problem?  Don&#8217;t say user agents.  Peeking at user agents is so last decade.  Media queries are part of the answer, but mobile phones have limited screen space and performance is crucial.  There&#8217;s a lot of content that is best to not even load.  How do web developers detect these performance-sensitive environments and react accordingly?</p>
]]></content:encoded>
			<wfw:commentRss>http://stechz.com/2010/health-of-the-web-and-mobile-site-redirections/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Make your Fennec RC1 fast again</title>
		<link>http://stechz.com/2010/make-your-fennec-rc1-fast-again/</link>
		<comments>http://stechz.com/2010/make-your-fennec-rc1-fast-again/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 19:58:53 +0000</pubDate>
		<dc:creator>Benjamin Stover</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[n900]]></category>
		<guid isPermaLink="false">http://stechz.com/?p=110</guid>
		<description><![CDATA[If you are using RC1 on the N900, do yourself a favor and turn off disk caching. Set the preference &#8220;browser.cache.disk.enable&#8221; to false: Navigate to &#8220;about:config&#8221;. In the Filter field, type in &#8220;disk&#8221; to narrow the results down. Carefully tap the one that says &#8220;browser.cache.disk.enable&#8221; and press Enter on your keyboard. The preference should become [...]]]></description>
			<content:encoded><![CDATA[<p>If you are using RC1 on the N900, do yourself a favor and turn off disk caching.  Set the preference &#8220;browser.cache.disk.enable&#8221; to false:</p>
<ol>
<li>Navigate to &#8220;about:config&#8221;.</li>
<li>In the Filter field, type in &#8220;disk&#8221; to narrow the results down.</li>
<li>Carefully tap the one that says &#8220;browser.cache.disk.enable&#8221; and press Enter on your keyboard.  The preference should become bold.</li>
<li>Restart your browser.</li>
</ol>
<p>Sometime after beta 5, we&#8217;ve known that there was a regression with loading pages.  After releasing RC1, our fellow hacker <a href="http://dougt.org/">Doug</a> solved the mystery: in beta 5, Firefox&#8217;s disk cache had effectively been turned off for the N900.  We &#8220;fixed&#8221; the problem in RC1 and caused a major regression in page loading performance.  <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=537843">Here&#8217;s the bug</a> if you want to track it.</p>
<p>This is a band-aid solution for 1.0.  Ultimately we want disk caching to happen outside of the main thread so that Firefox stays snappy during page load.</p>
]]></content:encoded>
			<wfw:commentRss>http://stechz.com/2010/make-your-fennec-rc1-fast-again/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Following mobile Firefox nightly builds</title>
		<link>http://stechz.com/2009/mobile-firefox-nightly/</link>
		<comments>http://stechz.com/2009/mobile-firefox-nightly/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 22:21:58 +0000</pubDate>
		<dc:creator>Benjamin Stover</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[n900]]></category>
		<guid isPermaLink="false">http://stechz.com/?p=80</guid>
		<description><![CDATA[The super easy way for N900 owners. For extension developers or users who would like to keep up with the latest and greatest copies of Mobile Firefox, Joel Maher is graciously hosting a debian repository (UPDATE: an official repository is now available&#8211;URL has been changed from Joel&#8217;s to official): In MicroB, the default browser, navigate [...]]]></description>
			<content:encoded><![CDATA[<p>The super easy way for N900 owners.  For extension developers or users who would like to keep up with the latest and greatest copies of Mobile Firefox, <a href="http://quality.mozilla.org/blogs/jmaher">Joel Maher</a> is graciously hosting a debian repository (UPDATE: an official repository is now available&#8211;URL has been changed from Joel&#8217;s to official):</p>
<ol>
<li>In MicroB, the default browser, navigate to <a href="http://ftp.mozilla.org/pub/mozilla.org/mobile/repos/1.9.2_multi/1.9.2_multi_nightly.install">http://ftp.mozilla.org/pub/mozilla.org/mobile/repos/1.9.2_multi/1.9.2_multi_nightly.install</a> (short url: <a href="http://bit.ly/6ccalh">http://bit.ly/6ccalh</a>).<br />
<img class="size-full wp-image-81" title="Screenshot: Joel's webpage in MicroB" src="http://stechz.com/wp-content/uploads/2009/11/Screenshot-20091116-134123.png" width="400" height="240" />
</li>
<li>You will be asked to add the catalog, which has the nightly packages needed. Click Add.<br />
<img src="http://stechz.com/wp-content/uploads/2009/11/Screenshot-20091116-134221.png" title="Screenshot: Adding the repository" width="400" height="240" class="alignnone size-full wp-image-82" />
</li>
<li>&#8220;fennec&#8221; will now be available as a package in the application manager from the &#8220;Download&#8221; menu.  Install it.<br />
<img src="http://stechz.com/wp-content/uploads/2009/11/Screenshot-20091116-134519.png" title="Screenshot: fennec is now an installable package" width="400" height="240" class="alignnone size-full wp-image-83" />
</li>
<li>Watch for the yellow exclamation mark in your notification area every morning, or whenever you feel like it.  Your software updates will include fennec now (you will also see entries for &#8220;xulrunner&#8221;&#8211;Fennec depends on this, so install it too).</li>
</ol>
<p>We could definitely use your help testing as we grind towards our 1.0 release.  If you have any thoughts or find a bug, please ping us on <a href="irc://irc.mozilla.org/#mobile">IRC</a> (irc.mozilla.org, channel #mobile) or <a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Fennec">file a bug</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://stechz.com/2009/mobile-firefox-nightly/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Android vs iPhone metrics</title>
		<link>http://stechz.com/2009/android-vs-iphone-metrics/</link>
		<comments>http://stechz.com/2009/android-vs-iphone-metrics/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 20:55:16 +0000</pubDate>
		<dc:creator>Benjamin Stover</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[mobile]]></category>
		<guid isPermaLink="false">http://stechz.com/?p=69</guid>
		<description><![CDATA[Taken from AdMob data: First up we have smartphone ad request from just the United States. Android started at 1% and steadily rose to 17%. This was due large in part to two Android phones: the HTC Dream and HTC Magic That&#8217;s some significant growth for Android on the mobile web. With a lot of [...]]]></description>
			<content:encoded><![CDATA[<p>Taken from AdMob data:</p>
<blockquote><p>
First up we have smartphone ad request from just the United States. Android started at 1% and steadily rose to 17%. This was due large in part to two Android phones: the HTC Dream and HTC Magic
</p></blockquote>
<p>That&#8217;s some significant growth for Android on the mobile web.  With a lot of new phones on the horizon for the holiday season, Android is looking like an unstoppable juggernaut.</p>
]]></content:encoded>
			<wfw:commentRss>http://stechz.com/2009/android-vs-iphone-metrics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

