<?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>Savoy Blog</title>
	<atom:link href="http://www.savoysoftware.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.savoysoftware.com/blog</link>
	<description>Beautiful Software</description>
	<lastBuildDate>Sat, 06 Feb 2010 08:52:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Liquid Scale 1.0</title>
		<link>http://www.savoysoftware.com/blog/liquid-scale-1-0/</link>
		<comments>http://www.savoysoftware.com/blog/liquid-scale-1-0/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 23:03:59 +0000</pubDate>
		<dc:creator>Jan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.savoysoftware.com/blog/?p=296</guid>
		<description><![CDATA[We are happy to announce that Liquid Scale is available in the App Store. You can get more information on our product site.

 	 
 	 	 
 	 
 
]]></description>
			<content:encoded><![CDATA[<p>We are happy to announce that Liquid Scale is available in the <a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=338683436&#038;mt=8">App Store</a>. You can get more information on our <a href="http://www.savoysoftware.com/liquidscale/">product site</a>.</p>
<div style="display:table;margin:20px auto;">
 	 <a href="http://www.savoysoftware.com/liquidscale/"><br />
 	 	 <img src="http://www.savoysoftware.com/liquidscale/images/ls.png" alt="Liquid Scale" /><br />
 	 </a>
 </div>
]]></content:encoded>
			<wfw:commentRss>http://www.savoysoftware.com/blog/liquid-scale-1-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Indie + Relief</title>
		<link>http://www.savoysoftware.com/blog/indie-relief/</link>
		<comments>http://www.savoysoftware.com/blog/indie-relief/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 15:13:38 +0000</pubDate>
		<dc:creator>Nikolai</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.savoysoftware.com/blog/?p=284</guid>
		<description><![CDATA[Today is a good day to buy software. Indie developers are donating their sales to Haiti. Savoy Software will donate sales to Doctors without Borders.

»You get great software, Haiti gets financial help in its time of crisis.«
]]></description>
			<content:encoded><![CDATA[<p>Today is a good day to buy software. <a href="http://indierelief.com/">Indie developers are donating their sales to Haiti</a>. Savoy Software will donate sales to Doctors without Borders.</p>
<p><a href="http://indierelief.com/"><img style="margin-top:20px; margin-bottom:20px;" src="http://www.indierelief.com/images/ir_500.png" alt="indie+relief" /></a></p>
<p>»You get great software, Haiti gets financial help in its time of crisis.«</p>
]]></content:encoded>
			<wfw:commentRss>http://www.savoysoftware.com/blog/indie-relief/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing Liquid Scale</title>
		<link>http://www.savoysoftware.com/blog/introducing-liquid-scale/</link>
		<comments>http://www.savoysoftware.com/blog/introducing-liquid-scale/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 16:55:23 +0000</pubDate>
		<dc:creator>Jan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">/blog/?p=264</guid>
		<description><![CDATA[Content aware image resizing for the iPhone.]]></description>
			<content:encoded><![CDATA[<div style="display:table;margin:30px auto 0 auto;font-size:1.3em;"><a style="color:#000;" href="http://savoysoftware.com/liquidscale/">It’s magical &#8230;</a></div>
<div style="display:table;margin:0 auto;"><a href="http://savoysoftware.com/liquidscale/"><img src="http://savoysoftware.com/images/liquidscale_icon.png" alt="" /></a></div>
<div style="display:table;margin:0 auto 30px auto;font-size:1.3em;"><a style="color:#000;" href="http://savoysoftware.com/liquidscale/">&#8230; and it’s coming soon!</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.savoysoftware.com/blog/introducing-liquid-scale/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Cake for Spots Sake</title>
		<link>http://www.savoysoftware.com/blog/a-cake-for-spots-sake/</link>
		<comments>http://www.savoysoftware.com/blog/a-cake-for-spots-sake/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 20:33:46 +0000</pubDate>
		<dc:creator>Jan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://savoysoftware.com/blog/?p=191</guid>
		<description><![CDATA[We plan to bring you some tasty new things in the near future. But for now we like to whet your appetite with this little movie we made for the Great Indie Bake Off in January. Unfortunately we missed the deadline for submission.
Turn on your volume, and&#8230; Buon appetito!

]]></description>
			<content:encoded><![CDATA[<p>We plan to bring you some tasty new things in the near future. But for now we like to whet your appetite with this little movie we made for the <a href="http://www.148apps.com/news/great-indie-bake-voting-open/">Great Indie Bake Off</a> in January. Unfortunately we missed the deadline for submission.</p>
<p>Turn on your volume, and&#8230; Buon appetito!</p>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/_fYvW73N_kY&#038;hl=de&#038;fs=1&#038;rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/_fYvW73N_kY&#038;hl=de&#038;fs=1&#038;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.savoysoftware.com/blog/a-cake-for-spots-sake/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Released today: Spots 1.1 with 13,000 free hotspots</title>
		<link>http://www.savoysoftware.com/blog/released-today-spots-11-with-13000-free-hotspots/</link>
		<comments>http://www.savoysoftware.com/blog/released-today-spots-11-with-13000-free-hotspots/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 22:41:04 +0000</pubDate>
		<dc:creator>Nikolai</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://savoysoftware.com/blog/?p=184</guid>
		<description><![CDATA[We are happy to announce the release of Spots 1.1 today. We added 13,000 free hotspots in the US and 2,500 T-Mobile US hotspots. All locations have been updated so that Spots now contains a total of 250,000+ hotspots worldwide.
Spots currently contains hotspot locations of the following providers:

Free US locations: 13,000+ (NEW)
T-Mobile US: 2,500 (NEW)
T-Mobile [...]]]></description>
			<content:encoded><![CDATA[<p>We are happy to announce the release of Spots 1.1 today. We added 13,000 free hotspots in the US and 2,500 T-Mobile US hotspots. All locations have been updated so that Spots now contains a total of 250,000+ hotspots worldwide.</p>
<p>Spots currently contains hotspot locations of the following providers:</p>
<ul>
<li>Free US locations: 13,000+ (NEW)</li>
<li>T-Mobile US: 2,500 (NEW)</li>
<li>T-Mobile EU: 12,000 (updated)</li>
<li>AT&amp;T: 18,000+ US locations (updated)</li>
<li>BT FON: 80,000 in the UK (NEW)</li>
<li>Neuf FON: 60,000 in France (NEW)</li>
<li>FON: 200,000 worldwide locations (updated)</li>
<li>BT Openzone: 3,200 UK and IR locations (updated)</li>
</ul>
<p>And we are planning to add more hotspots soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.savoysoftware.com/blog/released-today-spots-11-with-13000-free-hotspots/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My iPhone is not a Mac Pro</title>
		<link>http://www.savoysoftware.com/blog/my-iphone-is-not-a-mac-pro/</link>
		<comments>http://www.savoysoftware.com/blog/my-iphone-is-not-a-mac-pro/#comments</comments>
		<pubDate>Sun, 11 Jan 2009 16:04:57 +0000</pubDate>
		<dc:creator>Nikolai</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://savoysoftware.com/blog/?p=114</guid>
		<description><![CDATA[This article is about enhancing the performance of iPhone applications using the power of Objective C++. By discussing a real-world problem from Savoy’s <a href="http://www.savoysoftware.com/spots/">Spots</a> application, the article shows the necessary optimizations to make the program run smoothly in three steps.]]></description>
			<content:encoded><![CDATA[<p>This article is about enhancing the performance of iPhone applications using the power of Objective C++. By discussing a real-world problem from Savoy’s <a href="http://www.savoysoftware.com/spots/">Spots</a> application, the article shows the necessary optimizations to make the program run smoothly in three steps.</p>
<div class="articleimage"><a href="/spots/"><img src="http://savoysoftware.com/blog/wp-content/uploads/2008/12/spots-icon-big.png" alt="Spots" title="spots-icon-big" width="165" height="165" /></a></div>
<h3>Using Objective C++ to enhance the performance of iPhone applications.</h3>
<p>One thing I really like about software development is, that there are problems from so many different domains—and problem solving is, when the fun part starts. While developing Spots, I have been confronted with UI decisions over and over. Designing a streamlined user interface for the iPhone is not easy. »Shall I include a button for the provider filter or put it into the Settings.app?« I changed my mind on this about twenty times.</p>
<p>This post will not be about user interface but about coding and performance. One of the hardest problems to solve was the drawing of the map (the rectangle in the lower part of the screen). It took me several approaches to learn that the only way to draw 230,000 spots on the map was using OpenGL and a lot of tricks and cheats to make drawing performance acceptable. At last I used three different techniques depending on the zoom level and amount of visible spots. Performance was the most important issue, since I wanted map interaction (dragging and pinching) to be as smooth as possible, ideally at 60Hz.</p>
<div class="articleimage"><img src="http://savoysoftware.com/blog/wp-content/uploads/2009/01/map_spots.png" alt="map_spots" title="map_spots" width="320" height="211"/></div>
<p>In this article, I want to share some of the techniques used to improve performance. They are very simple and straight forward but I took the time to write them down because I see them rarely used in a Cocoa context. For example, I’m not seeing a lot of C++ in Cocoa, even though both languages can be mixed in a very productive way. Objective C++ is a great extension to pure Cocoa when your aim is performance. And on the iPhone, everything is about performance.</p>
<h3>The Problem</h3>
<p>Spots contains about 230,000 hotspot locations, spread over a rectangular area (the world map in mercator projection). It is necessary to count the number of visible spots in the area covered by the current map rectangle, since this value decides which drawing technique to use. The coordinates are normalized, so the whole world covers the rectangle {{0.0, 1.0}, {0.0, 1.0}}. For a typical use of the program, the map rectangle is quite small: less than two percent of the whole map width or height.</p>
<div class="articleimage"><img src="http://savoysoftware.com/blog/wp-content/uploads/2009/01/map.png" alt="map" title="map" width="453" height="343" class="alignnone size-full wp-image-138" /></div>
<p>How do I count the number of locations in a database of hundreds of thousands of locations efficiently?</p>
<p>I prepared an <a href="http://savoysoftware.com/blog/wp-content/uploads/2009/01/spotsdb.zip">XCode project</a> that contains all code discussed here. The example project does not contain the original database that comes with Spots. It simply spreads out the spots randomly over the world map, which is very different from the real scenario. But the stats I collected with the original data are very much the same like those from the random data.</p>
<h3>The first Approach: Plain-vanilla Cocoa</h3>
<p>The first approach is very simple and does not even try to be very efficient. The locations are represented as Objective C objects (@class Spot) and are kept in a database object (@class SpotsDB1) using an NSArray.</p>
<pre>
@interface Spot : NSObject {
    CGPoint _position;
}
@property (nonatomic) CGPoint position;
@end

@interface SpotsDB1 : NSObject {
    NSArray* _spots;
}
- (NSUInteger)countSpotsInRect:(CGRect)rect;
@end
</pre>
<p>To count the locations in a given CGRect, the database object simply iterates over the array and checks each location.</p>
<pre>
NSUInteger count = 0;
for (Spot* spot in _spots) {
    if (CGRectContainsPoint(aRect, spot.position))
        ++count;
}
</pre>
<p>With this code it takes about 250 milliseconds to count the number of spots in a {0.02, 0.02} random rectangle from a total of 230,000. Too bad, if you target a frame rate of 60Hz, where you have 16 ms to draw a frame.</p>
<p>What makes this solution slow is not only the lack of a smarter algorithm, but also the amount of time wasted to make a couple of function calls in the tight loop. Another negative impact on the performance is the fact, that the locations are stored in objects in an NSArray, since the large memory footprint of objects and the pointer indirection of the array all add to processing time.</p>
<h3>The second Approach: Simple optimizations</h3>
<p>To make the same solution run much faster, we can simply put the locations into a more compact data structure: a standard C array of CGPoint structs. For ease of use, we keep that C array in an NSMutableData object.</p>
<pre>
_spotCount = [spots count];
_spotsData = [[NSMutableData alloc] init];
for (Spot* spot in spots) {
    CGPoint p = spot.position;
    [data appendBytes:&#038;p length:sizeof(CGPoint)];
}
</pre>
<p>Removing the function calls from the loop we get a times four performance boost:</p>
<pre>
CGFloat xMin = CGRectGetMinX(aRect);
CGFloat yMin = CGRectGetMinY(aRect);
CGFloat xMax = CGRectGetMaxX(aRect);
CGFloat yMax = CGRectGetMaxY(aRect);

CGPoint* begin = (CGPoint*)[_spotsData bytes];
CGPoint* end = begin + _spotCount;

NSUInteger count = 0;
for (CGPoint* i = begin; i != end; ++i) {
    if (i->x > xMin &#038;&#038; i->y > yMin &#038;&#038; i->x &lt; xMax &#038;&#038; i->y &lt; yMax)
        ++count;
}
</pre>
<p>Without changing the simple algorithm, we now calculate the spot count in 55 milliseconds, which is more than four times faster. What’s even better, regarding the very constrained resources of the iPhone, is the fact, that we use less than half of the memory compared to the first version.</p>
<h3>The third Approach: Algorithmic optimizations</h3>
<p>Of course there are lots of clever ways to optimize lookup of points in a planar map. For example, you could use a quad tree to store the points. In this example I’m using a less complex solution, which does not imply a change to the way, the data is stored. And I’m using built-in features of C++ so that I don’t even have to write the small piece of code that gets a little more complex.</p>
<div class="articleimage"><img src="http://savoysoftware.com/blog/wp-content/uploads/2009/01/sorted.png" alt="sorted" title="sorted" width="355" height="343" class="alignnone size-full wp-image-139" /></div>
<p>The idea is to sort the locations in the array from left to right. By doing that, it is possible to determine the left and right margins of the given rectangle very quickly (see below). When the margins in the array are known, only the points between the margins have to be checked.</p>
<div class="articleimage"><img src="http://savoysoftware.com/blog/wp-content/uploads/2009/01/sorted2.png" alt="sorted2" title="sorted2" width="355" height="343" class="alignnone size-full wp-image-140" /></div>
<p>So it’s all about finding the margins quickly. We do this by using <a href="http://en.wikipedia.org/wiki/Binary_search" target="_blank">binary search</a>, which works on an array of sorted values. It does not check every value to find the matching position but jumps in the middle, checks if the value is less or greater, then jumps in the middle of the remaining section and so on. By using this cutting-in-half algorithm, binary search takes log2(n) checks to find the best element. With our array of 230,000 locations, that’s only 22 elements to try!</p>
<p>Back to the code, we find how easy it is to implement the above algorithm. Of course, now we have to sort our database:</p>
<pre>
// comparison function for array sorting
NSInteger leftToRight(Spot* a, Spot* b, void* context) {
    CGFloat xa = a.position.x;
    CGFloat xb = b.position.x;
    if (xa &lt; xb)
        return NSOrderedAscending;
    return xa > xb ? NSOrderedDescending : NSOrderedSame;
}

...

spots = [spots sortedArrayUsingFunction:leftToRight context:NULL];
</pre>
<p>Now the interesting part: binary search using C++. We use the library function <code>std::lower_bound</code> from <code>#include &lt;algorithm></code>. It takes a starting iterator, an end iterator, the value to look for and a comparison function. It returns the first value for which the comparison function returns false. Start and end iterators can be simple C pointers into the array.</p>
<pre>
#include &lt;algorithm>
...

bool cmpX(const CGPoint&#038; a, const CGPoint&#038; b) {
    return a.x < b.x;
}
...

CGFloat yMin = CGRectGetMinY(aRect);
CGFloat yMax = CGRectGetMaxY(aRect);

CGPoint* begin = (CGPoint*)[_spotsData bytes];
CGPoint* end = begin + _spotCount;

CGPoint leftMargin = aRect.origin;
CGPoint rightMargin;
rightMargin.x = CGRectGetMaxX(aRect);

CGPoint* left  = std::lower_bound(begin, end, leftMargin, cmpX);
CGPoint* right = std::lower_bound(left, end, rightMargin, cmpX);

NSUInteger count = 0;
for (CGPoint* i = left; i != right; ++i) {
    if (i->y > yMin &#038;&#038; i->y &lt; yMax)
        ++count;
}
</pre>
<p>Note, that the second binary search, the one that finds the right margin, only starts searching from the left margin, not the whole array. Another optimization was to remove the X-axis checks from the loop, since that’s already done by determining the margins.</p>
<p>With these optimizations, the code takes only about one millisecond to count the points in the rectangle. That’s two hundred times faster than the first version and fast enough for the intended use.</p>
<h3>Results</h3>
<p>Here’s the output of the <a href="http://savoysoftware.com/blog/wp-content/uploads/2009/01/spotsdb.zip">example project</a>, running on three different devices. If you want run the code on your own device, keep in mind that you have to change the Code Signing Identity in the target settings. If you don’t use a universal application identifier in your profile, you also have to change the Bundle Identifier in the Info.plist file from »com.savoysoftware.spotsDB« to whatever your identifier is.</p>
<p>iPhone 3G:</p>
<pre>
SpotsDB1 needed 3.2 seconds to count spots in 13 rects
that's 244.423 ms per rect
SpotsDB2 needed 3.0 seconds to count spots in 55 rects
that's 55.230 ms per rect
SpotsDB3 needed 3.0 seconds to count spots in 2988 rects
that's 1.004 ms per rect
</pre>
<p>Second generation iPod Touch:</p>
<pre>
SpotsDB1 needed 3.1 seconds to count spots in 16 rects
that's 194.756 ms per rect
SpotsDB2 needed 3.0 seconds to count spots in 65 rects
that's 46.450 ms per rect
SpotsDB3 needed 3.0 seconds to count spots in 3399 rects
that's 0.883 ms per rect
</pre>
<p>Simulator running on a Mac Pro:</p>
<pre>
SpotsDB1 needed 3.0 seconds to count spots in 687 rects
that's 4.372 ms per rect
SpotsDB2 needed 3.0 seconds to count spots in 2687 rects
that's 1.117 ms per rect
SpotsDB3 needed 3.0 seconds to count spots in 187276 rects
that's 0.016 ms per rect
</pre>
<h3>Conclusion</h3>
<p>When looking at the results it gets obvious that there’s a huge difference in performance between a desktop computer and the iPhone. Translating the numbers to a rule of thumb you could say: »What takes one second on a Mac takes one minute on the iPhone«. Or, what sounds even worse to me: »A frame rate of 60Hz on a Mac means one update per second on the iPhone«.</p>
<p>There’s obviously a big need for optimized code on the iPhone. In this article, I showed a couple of ways to reduce the overhead of Objective C and how to maximize performance using C++. Of course it’s not always so easy to get at the bottlenecks and simply switch some data structures to make the code fly. But when designing the architecture of data intensive applications, it’s absolutely worth looking at non-Cocoa ways to help coping with the restrictions of mobile devices.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.savoysoftware.com/blog/my-iphone-is-not-a-mac-pro/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>The Making of Spots</title>
		<link>http://www.savoysoftware.com/blog/making-spots/</link>
		<comments>http://www.savoysoftware.com/blog/making-spots/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 17:35:57 +0000</pubDate>
		<dc:creator>Jan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://savoysoftware.com/blog/?p=90</guid>
		<description><![CDATA[In a series of articles starting next week we will give you some technical details about the technologies under the hood of Spots, our new iPhone application. The first article My iPhone is not a Mac Pro will discuss how we tweaked the map rendering code of Spots in order to display over 230,000 hotspots [...]]]></description>
			<content:encoded><![CDATA[<p>In a series of articles starting next week we will give you some technical details about the technologies under the hood of <a href="/spots/">Spots</a>, our new iPhone application. The first article <em>My iPhone is not a Mac Pro</em> will discuss how we tweaked the map rendering code of Spots in order to display over 230,000 hotspots smoothly. We will prepare an XCode project with example code for you. In the second article <em>Designing Spots</em> we will explain some decisions we made for the exceptional user interface of Spots. In <em>Doing Apples Job</em> we will share our <em>TouchController</em> code which correctly identifies (multi-) taps, pinch, turn, swipe and drag gestures on your iPhone.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.savoysoftware.com/blog/making-spots/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Spots in the App Store</title>
		<link>http://www.savoysoftware.com/blog/spots-in-the-appstore/</link>
		<comments>http://www.savoysoftware.com/blog/spots-in-the-appstore/#comments</comments>
		<pubDate>Wed, 24 Dec 2008 22:09:33 +0000</pubDate>
		<dc:creator>Jan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://savoysoftware.com/blog/?p=57</guid>
		<description><![CDATA[Today, Spots has been released in the App Store. Please check out the screenshots and a video on our <a href="/spots/">product website</a>. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/spots/"><img class="size-full wp-image-61" style="float:left;padding-right:10px;" title="spots-icon-big" src="http://savoysoftware.com/blog/wp-content/uploads/2008/12/spots-icon-big.png" alt="Spots" width="165" height="165" /></a></p>
<p>Today, Spots has been released in the App Store. Spots is the first application for locating hotspots worldwide  without requiring an internet connection and it is our first application in the App Store. Please check out the the video and screenshots on our <a href="/spots/">product website</a> or go to the <a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=300150448&amp;mt=8">App Store</a> directly.</p>
<p>Merry Christmas!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.savoysoftware.com/blog/spots-in-the-appstore/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
