<?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>exploration &#187; programming</title>
	<atom:link href="http://robertcarlsen.net/tag/programming/feed" rel="self" type="application/rss+xml" />
	<link>http://robertcarlsen.net</link>
	<description>accounts of success and misadventure</description>
	<lastBuildDate>Tue, 13 Jul 2010 14:37:06 +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>LEITv: Fly or Pie show</title>
		<link>http://robertcarlsen.net/2010/02/23/leitv-fly-or-pie-show-1121</link>
		<comments>http://robertcarlsen.net/2010/02/23/leitv-fly-or-pie-show-1121#comments</comments>
		<pubDate>Tue, 23 Feb 2010 20:25:12 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[Live Experimental Interactive Television]]></category>
		<category><![CDATA[assignment]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[couchdb]]></category>
		<category><![CDATA[couchrest]]></category>
		<category><![CDATA[experiment]]></category>
		<category><![CDATA[group]]></category>
		<category><![CDATA[itp]]></category>
		<category><![CDATA[itv]]></category>
		<category><![CDATA[leitv]]></category>
		<category><![CDATA[live]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[problem]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[project]]></category>
		<category><![CDATA[sinatra]]></category>
		<category><![CDATA[two-screen]]></category>
		<category><![CDATA[voting]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://robertcarlsen.net/?p=1121</guid>
		<description><![CDATA[This assignment was to develop a concept around a two-screen, live event experience; specifically, using TV and computer via internet. Our group&#8217;s concept was a variety-style, Gong Show inspired show with binary voting from viewers to determine via aggregate whether a performance was Fly (a rousing success) or Pie (a miserable failure) which received a [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://robertcarlsen.net/blog/wp-content/uploads/2010/02/flypie-voting.png" rel="lightbox[1121]"><img class="alignright size-thumbnail wp-image-1128" title="flypie-voting" src="http://robertcarlsen.net/blog/wp-content/uploads/2010/02/flypie-voting-150x150.png" alt="flypie-voting" width="150" height="150" /></a>This assignment was to develop a concept around a two-screen, live event experience; specifically, using TV and computer via internet. Our group&#8217;s concept was a variety-style, Gong Show inspired show with binary voting from viewers to determine via aggregate whether a performance was Fly (a rousing success) or Pie (a miserable failure) which received a whipped cream pie in the face. (We&#8217;re a classy outfit here..)<span id="more-1121"></span></p>
<p>My contribution to the project was the web voting interface and database backend as well as a simple API for communicating with it. I wrote the application using the Sinatra microframework for Ruby and utilized couchrest to communicate with a CouchDB database. A control panel interface enabled an operator to update the voting interface status messages and to open the next event for voting. A display page mocked up the live video with Fly and Pie status bars for viewers to watch.</p>
<p>Although the system is very rudimentary, all the pieces are in place for a live voting situation. During the class demo however, the server was crippled by only a dozen simultaneous connections, and become sluggish enough to be unusable. I believe that the problem stemmed from each of the clients polling the database, and couchrest seems to update a view each time it&#8217;s requested. CouchDB is quite fast at reads, but far slower at writes, and I think these things combined to make a big problem.</p>
<p>I think that performance could be greatly enhanced if status polling were eliminated, or at least read from static file that was generated by the control application or server when data needed to be refreshed.</p>
<p>Live voting is a tested and successful model, and the class seemed to enjoy the real-time updates at the beginning while the system was responsive. The show itself was successful largely thanks to Gordie and Lisa Maria&#8217;s performances (and willingness to take a pie to their faces from Jong Yoon).</p>

<a href='http://robertcarlsen.net/2010/02/23/leitv-fly-or-pie-show-1121/flypie-vote-submit' title='Voting Submit'><img width="150" height="150" src="http://robertcarlsen.net/blog/wp-content/uploads/2010/02/flypie-vote-submit-150x150.png" class="attachment-thumbnail" alt="" title="Voting Submit" /></a>
<a href='http://robertcarlsen.net/2010/02/23/leitv-fly-or-pie-show-1121/flypie-voting' title='Voting Panel'><img width="150" height="150" src="http://robertcarlsen.net/blog/wp-content/uploads/2010/02/flypie-voting-150x150.png" class="attachment-thumbnail" alt="" title="Voting Panel" /></a>
<a href='http://robertcarlsen.net/2010/02/23/leitv-fly-or-pie-show-1121/flypie-vote-accept' title='Vote Accepted'><img width="150" height="150" src="http://robertcarlsen.net/blog/wp-content/uploads/2010/02/flypie-vote-accept-150x150.png" class="attachment-thumbnail" alt="" title="Vote Accepted" /></a>
<a href='http://robertcarlsen.net/2010/02/23/leitv-fly-or-pie-show-1121/flypie-video' title='Video Display'><img width="150" height="150" src="http://robertcarlsen.net/blog/wp-content/uploads/2010/02/flypie-video-150x150.png" class="attachment-thumbnail" alt="" title="Video Display" /></a>
<a href='http://robertcarlsen.net/2010/02/23/leitv-fly-or-pie-show-1121/flypie-controlpanel-update' title='Operator&#039;s Control Panel'><img width="150" height="150" src="http://robertcarlsen.net/blog/wp-content/uploads/2010/02/flypie-controlpanel-update-150x150.png" class="attachment-thumbnail" alt="" title="Operator&#039;s Control Panel" /></a>
<a href='http://robertcarlsen.net/2010/02/23/leitv-fly-or-pie-show-1121/flypie-controlpanel-status' title='Operator Control Panel voting'><img width="150" height="150" src="http://robertcarlsen.net/blog/wp-content/uploads/2010/02/flypie-controlpanel-status-150x150.png" class="attachment-thumbnail" alt="" title="Operator Control Panel voting" /></a>

]]></content:encoded>
			<wfw:commentRss>http://robertcarlsen.net/2010/02/23/leitv-fly-or-pie-show-1121/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parsing foursquare KML files</title>
		<link>http://robertcarlsen.net/2010/02/23/parsing-foursquare-kml-files-1113</link>
		<comments>http://robertcarlsen.net/2010/02/23/parsing-foursquare-kml-files-1113#comments</comments>
		<pubDate>Tue, 23 Feb 2010 17:21:05 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[Telling Stories with Sensors]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[foursquare]]></category>
		<category><![CDATA[itp]]></category>
		<category><![CDATA[kml]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://robertcarlsen.net/?p=1113</guid>
		<description><![CDATA[We&#8217;re using Foursquare as a data logger for one of our assignments in the Telling Stories with Sensors, Data and Humans class at ITP. As an aid to begin understanding the relationships between venues for our tracks, it&#8217;s helpful to munge the KML into CSV so it can be plotted and played with in a spreadsheet, [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re using Foursquare as a data logger for one of our assignments in the Telling Stories with Sensors, Data and Humans class at ITP. As an aid to begin understanding the relationships between venues for our tracks, it&#8217;s helpful to munge the KML into CSV so it can be plotted and played with in a spreadsheet, Illustrator, R, Processing or whatever&#8230;</p>
<p>Below is a short python script to parse a Foursquare KML file into a simple CSV file. It outputs the check-in name, description, timestamp and location (as lat, lon). The Foursquare KML feed is available at the <a href="http://foursquare.com/feeds/" onclick="pageTracker._trackPageview('/outgoing/foursquare.com/feeds/?referer=');">Feeds</a> page on their site.<span id="more-1113"></span>This script relies on <a href="http://www.crummy.com/software/BeautifulSoup/#Download" onclick="pageTracker._trackPageview('/outgoing/www.crummy.com/software/BeautifulSoup/_Download?referer=');">BeautifulSoup</a> and, of course, python. Give the script the filename of the KML file you want to parse and it will output out.csv in the current directory. eg.</p>
<p>$ python parse_kml.py MyFoursquareFeed.kml</p>
<p>Here&#8217;s the file: <a href="http://robertcarlsen.net/blog/wp-content/uploads/2010/02/parse_kml.py">parse_kml</a></p>
<pre class="brush: python;">
# parse each file from the photo collection and export data into CSV.
# will need: os.listdir(path)
import sys
import os
import codecs
import csv
from BeautifulSoup import BeautifulStoneSoup

# get the file list:
if len(sys.argv) &gt; 1:
    dir = sys.argv[1]
else:
    dir = os.getcwd()

file = dir

# create the output dictionary
outputData = []

# sanity checking, only work on kml files
if file.endswith('.kml') == 0: sys.exit(-1)

print &quot;Reading file: &quot;+file

fh = codecs.open(file,'r',&quot;utf-8&quot;)
html = fh.read()
fh.close()

soup = BeautifulStoneSoup(html)
#print soup.prettify()

# create a new dictionary for the current image's data
imageData = dict();

# get the image data:
dataTable = soup.findAll('placemark')
for i in dataTable:
    row = i.contents

    # add the current data to the dict
    imageData = {}
    imageData['Name'] = row[0].contents[0].string.encode(&quot;ascii&quot;,&quot;ignore&quot;)
    imageData['Description'] = row[1].contents[0].string.encode(&quot;ascii&quot;,&quot;ignore&quot;)
    imageData['Time'] = row[3].contents[0].string.encode(&quot;ascii&quot;,&quot;ignore&quot;)
    coord = row[5].coordinates.contents[0].string.encode(&quot;ascii&quot;,&quot;ignore&quot;)
    imageData['Lon'] = coord.split(',')[0]
    imageData['Lat'] = coord.split(',')[1]

    # add this image's data to the list
    outputData.append(imageData)

#print outputData

# create the output file
out = codecs.open(os.getcwd() + &quot;/out.csv&quot;, 'w',&quot;utf-8&quot;)
firstRun = 1

print &quot;Writing output file: &quot;+ out.name
try:
    fieldnames = sorted(outputData[0].keys())
    fieldnames.reverse()
    writer = csv.DictWriter(out,dialect='excel', fieldnames=fieldnames, extrasaction='ignore', quoting=csv.QUOTE_NONNUMERIC)
    headers = dict( (n,n) for n in fieldnames )
    writer.writerow(headers)

    for row in outputData:
         writer.writerow(row)

finally:
    out.close()
</pre>
]]></content:encoded>
			<wfw:commentRss>http://robertcarlsen.net/2010/02/23/parsing-foursquare-kml-files-1113/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sinatra + Kara == qwerty animals</title>
		<link>http://robertcarlsen.net/2010/02/20/sinatra-kara-qwerty-animals-1108</link>
		<comments>http://robertcarlsen.net/2010/02/20/sinatra-kara-qwerty-animals-1108#comments</comments>
		<pubDate>Sat, 20 Feb 2010 16:53:49 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[itp]]></category>
		<category><![CDATA[app]]></category>
		<category><![CDATA[couchdb]]></category>
		<category><![CDATA[couchrest]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[dreamhost]]></category>
		<category><![CDATA[funaday]]></category>
		<category><![CDATA[haml]]></category>
		<category><![CDATA[kara]]></category>
		<category><![CDATA[passenger]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[qwerty]]></category>
		<category><![CDATA[rack]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[sass]]></category>
		<category><![CDATA[sinatra]]></category>

		<guid isPermaLink="false">http://robertcarlsen.net/?p=1108</guid>
		<description><![CDATA[Yesterday I released a small web app; it was my first using the Sinatra microframework for Ruby: http://qwerty.robertcarlsen.net

The app arranges illustrations of animals wearing lettered t-shirts to create user-supplied messages. Kara Schlindwein created the illustrations as part of her project for the 6th Annual Fun-a-Day project in Philadelphia, and I wrote the first draft of the [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday I released a small web app; it was my first using the <a href="http://www.sinatrarb.com/" onclick="pageTracker._trackPageview('/outgoing/www.sinatrarb.com/?referer=');">Sinatra</a> microframework for Ruby: <a href="http://qwerty.robertcarlsen.net" onclick="pageTracker._trackPageview('/outgoing/qwerty.robertcarlsen.net?referer=');">http://qwerty.robertcarlsen.net</a></p>
<p style="text-align: center;"><a href="http://robertcarlsen.net/blog/wp-content/uploads/2010/02/sinatra.png" rel="lightbox[1108]"><img class="size-medium wp-image-1109 aligncenter" title="sinatra" src="http://robertcarlsen.net/blog/wp-content/uploads/2010/02/sinatra-300x72.png" alt="sinatra" width="300" height="72" /></a></p>
<p>The app arranges illustrations of animals wearing lettered t-shirts to create user-supplied messages. <a href="http://karaschlindwein.com/qwerty_animals.php" onclick="pageTracker._trackPageview('/outgoing/karaschlindwein.com/qwerty_animals.php?referer=');">Kara Schlindwein</a> created the illustrations as part of her project for the 6th Annual <a href="http://artclash.com/" onclick="pageTracker._trackPageview('/outgoing/artclash.com/?referer=');">Fun-a-Day</a> project in Philadelphia, and I wrote the first draft of the app while sitting in a chair at the show a couple of weeks ago, still nursing my broken ankle.<span id="more-1108"></span></p>
<p>I&#8217;ve come to really like working with Sinatra / HAML / SASS – once I had a basic comprehension of how the components fit together I could see how to organize the app without getting mired in the code. Making changes to the app has been pleasantly easy. Deployment via <a href="http://www.modrails.com/" onclick="pageTracker._trackPageview('/outgoing/www.modrails.com/?referer=');">Passenger</a> (mod_rails) on Apache was simple enough my my local and development servers (after reading sample virtual host configurations) and setting up a subdomain on <a href="http://blog.nyerm.com/2009/03/21/deploying-a-sinatra-app-on-dreamhost/" onclick="pageTracker._trackPageview('/outgoing/blog.nyerm.com/2009/03/21/deploying-a-sinatra-app-on-dreamhost/?referer=');">Dreamhost</a> has been fine, too. Everything is coordinated via git, so pushing changes around has been simple.</p>
<p>I first heard about Sinatra (and couchdb for that matter) in a presentation by <a href="http://danieltsadok.wordpress.com/2009/03/26/its-all-middleware/" onclick="pageTracker._trackPageview('/outgoing/danieltsadok.wordpress.com/2009/03/26/its-all-middleware/?referer=');">Daniel Tsadock </a>at ITP last year and I&#8217;ve kept it in the back of my mind as something I wanted to try. I&#8217;m just now getting to development of my thesis project website and decided to use Sinatra for it, although I had a disappointing experience with the performance of another Sinatra + couchrest app I wrote for the Live Experimental Interactive Television class this past week. My VPS development server ground to a halt when a dozen classmates attempted to use the app at the same time. I&#8217;m pretty sure that my code was somewhat inefficient (with each client polling couchdb through an api provided via Sinatra routes), however I was hoping for usability beyond 12 simultaneous connections. I&#8217;m still optimistic though that it will work, and writing an app with the framework and view templates is fast and actually pretty fun.</p>
]]></content:encoded>
			<wfw:commentRss>http://robertcarlsen.net/2010/02/20/sinatra-kara-qwerty-animals-1108/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OCR for iPhone source</title>
		<link>http://robertcarlsen.net/2010/01/12/ocr-for-iphone-source-1080</link>
		<comments>http://robertcarlsen.net/2010/01/12/ocr-for-iphone-source-1080#comments</comments>
		<pubDate>Tue, 12 Jan 2010 06:46:58 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[iphone]]></category>
		<category><![CDATA[camera]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[ocr]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[photo]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[project]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://robertcarlsen.net/?p=1080</guid>
		<description><![CDATA[The source code for the Tesseract OCR for iPhone project has been published. It&#8217;s really simple – more of a skeleton, proof-of-concept project than anything else. Still, though, it&#8217;s neat to have nearly point-and-shoot text conversion in your pocket.
The project page is: Pocket OCR
The source code is available at github: http://github.com/rcarlsen/Pocket-OCR
There is certainly a lot [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://robertcarlsen.net/blog/wp-content/uploads/2010/01/ocr_gobbledygook.png" rel="lightbox[1080]"><img class="alignright size-thumbnail wp-image-1089" title="ocr_gobbledygook" src="http://robertcarlsen.net/blog/wp-content/uploads/2010/01/ocr_gobbledygook-150x150.png" alt="ocr_gobbledygook" width="150" height="150" /></a>The source code for the Tesseract OCR for iPhone project has been published. It&#8217;s really simple – more of a skeleton, proof-of-concept project than anything else. Still, though, it&#8217;s neat to have nearly point-and-shoot text conversion in your pocket.</p>
<p>The project page is: <a href="http://robertcarlsen.net/dev/pocket-ocr">Pocket OCR</a></p>
<p>The source code is available at github: <a href="http://github.com/rcarlsen/Pocket-OCR" onclick="pageTracker._trackPageview('/outgoing/github.com/rcarlsen/Pocket-OCR?referer=');">http://github.com/rcarlsen/Pocket-OCR</a></p>
<p>There is certainly a lot of improvement to be made. Automatic color correction. Page layout recognition. Perspective correction&#8230;the list could go on. The code is there, so&#8230;fork away!</p>
<p>(the thumbnail is a bit tongue-in-cheek&#8230;but honest. good conversion requires a good source image: well-lit, macro, focused and tightly cropped seems best)</p>
]]></content:encoded>
			<wfw:commentRss>http://robertcarlsen.net/2010/01/12/ocr-for-iphone-source-1080/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>OCR on iPhone demo</title>
		<link>http://robertcarlsen.net/2009/12/06/ocr-on-iphone-demo-1043</link>
		<comments>http://robertcarlsen.net/2009/12/06/ocr-on-iphone-demo-1043#comments</comments>
		<pubDate>Sun, 06 Dec 2009 20:33:39 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[iphone]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[app]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[ocr]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tesseract]]></category>

		<guid isPermaLink="false">http://robertcarlsen.net/?p=1043</guid>
		<description><![CDATA[Update: Source code for demo project released.

i finally got around to building a proof of concept implementation of tesseract-ocr for the iPhone. months ago, i documented the steps which helped to get the library cross-compiled for the iPhone&#8217;s ARM processor, and how to build a fat library for use with the simulator as well. several [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update</strong>: Source code for demo project <a href="http://robertcarlsen.net/2010/01/12/ocr-for-iphone-source-1080">released</a>.</p>
<p><img class="size-full wp-image-1051 alignright" title="TessIcon" src="http://robertcarlsen.net/blog/wp-content/uploads/2009/12/TessIcon.png" alt="TessIcon" width="57" height="57" /></p>
<p>i finally got around to building a proof of concept implementation of <a href="http://code.google.com/p/tesseract-ocr/" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/tesseract-ocr/?referer=');">tesseract-ocr</a> for the iPhone. months ago, i <a href="http://robertcarlsen.net/2009/07/15/cross-compiling-for-iphone-dev-884">documented</a> the steps which helped to get the library cross-compiled for the iPhone&#8217;s ARM processor, and how to build a fat library for use with the simulator as well. several folks have helped immensely in noting how to actually run the engine in obj-c++. thanks to everyone who has commented so far.</p>
<p>anyway, below is a short video of the POC in action. the basic workflow is: select image from photo library or camera, crop tightly on the box of text you&#8217;d like to convert, wait while it processes, select / copy or email text.<span id="more-1043"></span></p>
<p>there are loads of improvements which could be implemented (image histogram adjustment, rotation / perspective correction, automatic text box/layout detection, content detection &#8211; dates, links, contact information&#8230;) but this is a nice point to stop and document.</p>
<p>i realize that there are several OCR applications available for the iPhone, including a few which also run the engine on the device rather than handing it off to a web service. this started as an educational project on cross-compiling, and to fill a personal want for a handheld OCR app of my own. for these reasons, i&#8217;m going to open-source the entire app. look for it after this semester ends when i&#8217;ll have some more time to properly document the code. in the meantime, enjoy these code snippets demonstrating how to initialize the engine and process an image.</p>
<p>Initialize the engine:</p>
<pre class="brush: cpp;">
    NSString *dataPath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@&quot;tessdata&quot;];
    /*
     Set up the data in the docs dir
     want to copy the data to the documents folder if it doesn't already exist
     */
    NSFileManager *fileManager = [NSFileManager defaultManager];
    // If the expected store doesn't exist, copy the default store.
    if (![fileManager fileExistsAtPath:dataPath]) {
        // get the path to the app bundle (with the tessdata dir)
        NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
        NSString *tessdataPath = [bundlePath stringByAppendingPathComponent:@&quot;tessdata&quot;];
        if (tessdataPath) {
            [fileManager copyItemAtPath:tessdataPath toPath:dataPath error:NULL];
        }
    }

    NSString *dataPathWithSlash = [[self applicationDocumentsDirectory] stringByAppendingString:@&quot;/&quot;];
    setenv(&quot;TESSDATA_PREFIX&quot;, [dataPathWithSlash UTF8String], 1);

    // init the tesseract engine.
    tess = new TessBaseAPI();

    tess-&gt;SimpleInit([dataPath cStringUsingEncoding:NSUTF8StringEncoding],  // Path to tessdata-no ending /.
                     &quot;eng&quot;,  // ISO 639-3 string or NULL.
                     false);
</pre>
<p>Process an image. This should be threaded as it&#8217;s a heavy process:</p>
<pre class="brush: cpp;">
    CGSize imageSize = [uiImage size];
    double bytes_per_line	= CGImageGetBytesPerRow([uiImage CGImage]);
    double bytes_per_pixel	= CGImageGetBitsPerPixel([uiImage CGImage]) / 8.0;

    CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider([uiImage CGImage]));
    const UInt8 *imageData = CFDataGetBytePtr(data);

    // this could take a while. maybe needs to happen asynchronously.
    char* text = tess-&gt;TesseractRect(imageData,
                                     bytes_per_pixel,
                                     bytes_per_line,
                                     0, 0,
                                     imageSize.width, imageSize.height);

    // Do something useful with the text!
    NSLog(@&quot;Converted text: %@&quot;,[NSString stringWithCString:text encoding:NSUTF8StringEncoding]);

    delete[] text;
</pre>
<p>Enjoy the video!<br />
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/MICew5-nZp4&#038;fs=1" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed src="http://www.youtube.com/v/MICew5-nZp4&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://robertcarlsen.net/2009/12/06/ocr-on-iphone-demo-1043/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>PinwheelBeta &#8211; adhoc</title>
		<link>http://robertcarlsen.net/2009/07/23/pinwheelbeta-adhoc-896</link>
		<comments>http://robertcarlsen.net/2009/07/23/pinwheelbeta-adhoc-896#comments</comments>
		<pubDate>Thu, 23 Jul 2009 18:24:50 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[iphone]]></category>
		<category><![CDATA[adhoc]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://robertcarlsen.net/?p=896</guid>
		<description><![CDATA[In preparation of submitting Pinwheel to the App Store I&#8217;ve gone and released a beta version via ad hoc distribution. Seems like it should be a straightforward prospect, however the various device provisioning, code signing profiles and entitlements made it a bit of a process for a first-timer.
iTunes also seems to be entirely unhelpful when [...]]]></description>
			<content:encoded><![CDATA[<p>In preparation of submitting Pinwheel to the App Store I&#8217;ve gone and released a beta version via ad hoc distribution. Seems like it should be a straightforward prospect, however the various device provisioning, code signing profiles and entitlements made it a bit of a process for a first-timer.</p>
<p>iTunes also seems to be entirely unhelpful when something goes wrong with the &#8220;unknown error&#8221; message. What could it be? Code sign error? Unprovisioned device? Incorrect OS target? Mismatch in the app and mobileprovision file? It&#8217;s all a mystery in the iTunes universe.</p>
<p>Despite the inconvenience involved with having to generate a new ad hoc mobileprovision profile each time I add a new beta tester device, requiring a recompile of the beta app, it&#8217;s nice to finally get an app out to other non-development devices.</p>
<p>The ad hoc distribution process is documented well (enough) on Apple&#8217;s <a href="http://developer.apple.com/iphone/manage/distribution/index.action" onclick="pageTracker._trackPageview('/outgoing/developer.apple.com/iphone/manage/distribution/index.action?referer=');">dev portal</a> and on several other <a href="http://iphonedevelopertips.com/xcode/iphone-distribution-build-cheatsheet.html" onclick="pageTracker._trackPageview('/outgoing/iphonedevelopertips.com/xcode/iphone-distribution-build-cheatsheet.html?referer=');">blogs</a>, but my real stumbling block was navigating the Xcode interface to ensure that the proper code signing profile was being included in the binary (hint, look at the verbose build output for &#8220;embedded.mobileprovision&#8221; and ensure that the mobileprovision ID matches the correct version.)</p>
<p>I&#8217;ve also been getting trouble with Xcode not building using the correct provisioning, despite updating the target info and cleaning out the build folder. A restart of the program usually gets it sorted.</p>
<p>The next step will be to set up a Distribution build for the App Store submission. We&#8217;ll see how that goes in the end&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://robertcarlsen.net/2009/07/23/pinwheelbeta-adhoc-896/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>openFrameworks iPhone 3GS / OS 3.0</title>
		<link>http://robertcarlsen.net/2009/07/14/openframeworks-iphone-3gs-os-3-0-882</link>
		<comments>http://robertcarlsen.net/2009/07/14/openframeworks-iphone-3gs-os-3-0-882#comments</comments>
		<pubDate>Tue, 14 Jul 2009 06:13:31 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[iphone]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[openframeworks]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[troubleshooting]]></category>

		<guid isPermaLink="false">http://robertcarlsen.net/?p=882</guid>
		<description><![CDATA[i&#8217;ve been dealing with a performance bug in a particle + accelerometer oF app. the same project which has run very smoothly on a first generation iPhone with OS 2.2.1 has a noticeable stutter on an iPhone 3GS with OS 3.0.
there was no improvement despite several rounds of optimizing the openGL drawing code and plugging [...]]]></description>
			<content:encoded><![CDATA[<p>i&#8217;ve been dealing with a performance bug in a particle + accelerometer oF app. the same project which has run very smoothly on a first generation iPhone with OS 2.2.1 has a noticeable stutter on an iPhone 3GS with OS 3.0.</p>
<p>there was no improvement despite several rounds of optimizing the openGL drawing code and plugging several memory leaks.</p>
<p>finally, in frustration i bumped the explicit frame rate declaration from the default 60 fps to 120 fps. i realize that ofSetFrameRate(60) is merely the upper limit of the frame rate, and that the hardware won&#8217;t actually go faster than it can handle, however this immediately improved performance on the 3GS and the first gen is about the same as it was. further improvement was had with a declared frame rate of 240 fps.</p>
<p>i haven&#8217;t had a chance to look into the underlying issue, but i believe that oF is using NSTimer under the hood to trigger a scheduled update() and draw(). has there been some change in the SDK there?</p>
]]></content:encoded>
			<wfw:commentRss>http://robertcarlsen.net/2009/07/14/openframeworks-iphone-3gs-os-3-0-882/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8230;little help (oh, malloc)?</title>
		<link>http://robertcarlsen.net/2009/07/06/little-help-oh-malloc-869</link>
		<comments>http://robertcarlsen.net/2009/07/06/little-help-oh-malloc-869#comments</comments>
		<pubDate>Mon, 06 Jul 2009 21:43:23 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[iphone]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[malloc]]></category>
		<category><![CDATA[memory]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://robertcarlsen.net/?p=869</guid>
		<description><![CDATA[i&#8217;m having a time of it tracking down a resource allocation bloat culprit in an iPhone app i&#8217;m working on. i&#8217;ve narrowed it down to when i&#8217;m rapidly updating the center property of a UIImageView. a snippet from the Instruments application is below:


there are hundreds (if not thousands) of these messages, and the object allocation [...]]]></description>
			<content:encoded><![CDATA[<p>i&#8217;m having a time of it tracking down a resource allocation bloat culprit in an iPhone app i&#8217;m working on. i&#8217;ve narrowed it down to when i&#8217;m rapidly updating the center property of a UIImageView. a snippet from the Instruments application is below:</p>
<p><a href="http://robertcarlsen.net/blog/wp-content/uploads/2009/07/malloc.png" rel="lightbox[869]"><img class="size-full wp-image-871 alignleft" title="malloc" src="http://robertcarlsen.net/blog/wp-content/uploads/2009/07/malloc.png" alt="malloc" width="482" height="79" /></a><br />
<br style="clear:both;" /><br />
there are hundreds (if not thousands) of these messages, and the object allocation graph trends steadily upwards. when i disable the portion of the method which updates the center property the allocations stop and the memory usage goes flat. this also only occurs on the device&#8230;the simulator does not exhibit this behavior.</p>
<p>i&#8217;m using UIImageView directly, without subclassing, and it contains data from a small PNG file. i&#8217;ve patched up several other leaks successfully today, and really wanted to nail this one too.</p>
]]></content:encoded>
			<wfw:commentRss>http://robertcarlsen.net/2009/07/06/little-help-oh-malloc-869/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>(overly simplistic) saving state in oF for iPhone</title>
		<link>http://robertcarlsen.net/2009/06/19/overly-simplistic-saving-state-in-of-for-iphone-847</link>
		<comments>http://robertcarlsen.net/2009/06/19/overly-simplistic-saving-state-in-of-for-iphone-847#comments</comments>
		<pubDate>Fri, 19 Jun 2009 15:52:37 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[iphone]]></category>
		<category><![CDATA[openframeworks]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://robertcarlsen.net/?p=847</guid>
		<description><![CDATA[There was a recent comment about saving / restoring application state when using openFrameworks for iPhone which got me to thinking about how to do it. Apple&#8217;s frameworks provide a fairly thorough way to save state to the disk and restore later. There seem to be three primary ways to do this: simple plist files [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://robertcarlsen.net/blog/wp-content/uploads/2009/06/save_state2.jpg" rel="lightbox[847]"><img class="alignright size-thumbnail wp-image-854" title="save_state" src="http://robertcarlsen.net/blog/wp-content/uploads/2009/06/save_state2-150x150.jpg" alt="save_state" width="150" height="150" /></a>There was a recent <a href="http://robertcarlsen.net/blog/2009/05/31/using-openframeworks-for-iphone-dev-757#comment-553">comment</a> about saving / restoring application state when using openFrameworks for iPhone which got me to thinking about how to do it. Apple&#8217;s frameworks provide a fairly thorough way to save state to the disk and restore later. There seem to be three primary ways to do this: simple plist files (usually encoded in binary on the iPhone), archived data (they like to refer to this as freeze-dried object graphs) and core data.</p>
<p>I believe that archiving objects require methods inherited from NSObject, which we don&#8217;t have in openFrameworks&#8217; ofSimpleApp. Core Data seems like overkill, so I looked into using plist files.</p>
<p>There are likely better ways to do this, but this ad-hoc solution works wonderfully for a small app I&#8217;m working on, and only requires a bit of Objective-C code that could likely be moved up into a nice wrapper class. However, since the question was asked I&#8217;d just like to get it out there before working on a more elegant approach.<span id="more-847"></span></p>
<p>The easiest way to store state is with NSUserDefaults. The following returns a pointer to the shared user defaults object then writes several values to it. Adding data to the object will get cached in memory and eventually written to disk (or upon receiving a synchronize message). The key is just a NSString, which can be arbitrarily named, but you&#8217;ll need to use identical values to retrieve the data later.</p>
<pre class="brush: cpp; light: true;">
NSUserDefaults *savedData = [NSUserDefaults standardUserDefaults];

[savedData setInteger:score forKey:@&quot;score&quot;];
[savedData setInteger:pointsAvail forKey:@&quot;pointsAvail&quot;];
[savedData setInteger:timeRemaining forKey:@&quot;time&quot;];
[savedData synchronize];
</pre>
<p>The savedData object should be autoreleased. Plists can handle basic data types such as integer, float, bool and double. Look at the documentation for specific messages, but it&#8217;s usually like setFloat:forKey: or setBool:forKey:. It can also handle some NSObjects such as NSString, NSArray and NSDictionary. The selector for those is setObject:forKey:.</p>
<p>Reading back is just as simple. If a key doesn&#8217;t exist 0 is returned for a number, and nil for other strings, arrays and dictionaries. In the below example score, pointsAvail and timeRemaining are instance variables of testApp.</p>
<pre class="brush: cpp; light: true;">
NSUserDefaults *savedData = [NSUserDefaults standardUserDefaults];

score = [savedData integerForKey:@&quot;score&quot;];
pointsAvail = [savedData integerForKey:@&quot;pointsAvail&quot;];
timeRemaining = [savedData integerForKey:@&quot;time&quot;];
</pre>
<p>To get this all working as expected, retrieve the defaults in setup(), and be sure to do some sanity checking if the values aren&#8217;t found (ie. if this is the first run of the app). <strong>Because we&#8217;re mixing Objective-C and C++ in testApp, be sure to rename main.cpp to main.mm, testApp.cpp to testApp.mm and add &#8220;#import &lt;UIKit/UIKit.h&gt;&#8221; to the top of testApp.mm.</strong></p>
<p>A code snippet from setup():</p>
<pre class="brush: cpp; light: true;">
// test for previous state
NSUserDefaults *savedData = [NSUserDefaults standardUserDefaults];
int hideInstructions = [savedData integerForKey:@&quot;hideInstructions&quot;];

// if the key &quot;hideInstructions&quot; doesn't exist, then it will return 0
if(hideInstructions) {
// we've must have run at least once before and written &quot;hideInstructions&quot;
// restoreGame will read in the rest of the saved values:
restoreGame();
} else {
// assume first run
[savedData setInteger:1 forKey:@&quot;hideInstructions&quot;];
showInstructions();
}
</pre>
<p>openFrameworks supports an exit() method which gets called dutifully on the iPhone when the application will quit. This is a fine place to write out data to the userDefaults. The challenge as a programmer will be to determine the appropriate data to save and restore. In my simple game, I needed to save the game state for score and time, but also the position and basic state of the widgets on screen. With a larger game I&#8217;d look into writing methods into my objects cough up their own important data and then request it when the app is exiting. Keep in mind that there is a narrow window of time that the iPhone OS provides between receiving a signal to quit and when it will forcefully quit your app (like a few seconds) so saving data needs to happen quickly.</p>
<p>This method is purposefully rudimentary, but I think it works well for this particular use.</p>
]]></content:encoded>
			<wfw:commentRss>http://robertcarlsen.net/2009/06/19/overly-simplistic-saving-state-in-of-for-iphone-847/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ofxiPhoneAlertView</title>
		<link>http://robertcarlsen.net/2009/06/10/ofxiphonealertview-780</link>
		<comments>http://robertcarlsen.net/2009/06/10/ofxiphonealertview-780#comments</comments>
		<pubDate>Wed, 10 Jun 2009 19:48:02 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[iphone]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[openframeworks]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[wrapper]]></category>

		<guid isPermaLink="false">http://robertcarlsen.net/blog/?p=780</guid>
		<description><![CDATA[Here is a (really) basic wrapper for the UIAlertView in openFrameworks of iPhone. Not all of the necessary delegate methods have been implemented yet, but this is enough for me to get the proof of concept rolling in an app I&#8217;m building.
Feel free to let me know how I can do things better, or just [...]]]></description>
			<content:encoded><![CDATA[<p>Here is a (really) basic wrapper for the UIAlertView in openFrameworks of iPhone. Not all of the necessary delegate methods have been implemented yet, but this is enough for me to get the proof of concept rolling in an app I&#8217;m building.</p>
<p>Feel free to let me know how I can do things better, or just tinker with the code directly at github: <a href="http://github.com/rcarlsen/ofxiPhoneWrappers/tree" onclick="pageTracker._trackPageview('/outgoing/github.com/rcarlsen/ofxiPhoneWrappers/tree?referer=');">ofxiPhoneWrappers</a></p>
<p>Check out the <a href="http://robertcarlsen.net/blog/wp-content/uploads/2009/06/alertView.zip">example project</a>. This is a bit of a kludge. I would like to figure out how to avoid having to declare main and testApp as mixed source files (.mm). It works for now, however.</p>
<p>Here are the notes on using the class:<span id="more-780"></span></p>
<pre class="brush: cpp;">
// ofxiPhoneAlertView:
// setup the list of buttons
vector&lt;string&gt; otherButtons;
otherButtons.push_back(&quot;Button 1&quot;);
otherButtons.push_back(&quot;Button 2&quot;);
// the args are: title, message, cancel button title (&quot;&quot; == omitted), vector of other button titles
ofxiPhoneAlertView *alert = new ofxiPhoneAlertView(&quot;Title,&quot;Here is the alert message.&quot;,&quot;&quot;,otherButtons);
// display the alert view
alert-&gt;show();

// I'm using the following methods in update()
// test if the alert is visible (bool):
alert-&gt;isVisible();

// test if the alert has been dismissed:
alert-&gt;isDismissed();

// get the selected button (int):
alert-&gt;getSelectedButton();

// if you use several alerts, you can distinguish between them via their title:
alert-&gt;getTitle();

// example logic:
switch(alert-&gt;getSelectedButton()){
case -1:
// cancel, or no selection
printf(&quot;alert = -1&quot;);
break;
case 0:
// first, non-cancel button
printf(&quot;alert = 0&quot;);
break;
case 1:
// next button. will be the second button after Cancel
printf(&quot;alert = 1, ok&quot;);
break;
}
</pre>
<h3>ofxiPhoneAlertView.h</h3>
<pre class="brush: cpp;">
/*
ofxiPhoneAlertView.h

Created on 6/10/09.
Copyright 2009 Robert Carlsen | robertcarlsen.net

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.

*/

#import &lt;UIKit/UIKit.h&gt;
#import &quot;ofMain.h&quot;

@interface ofxiPhoneAlertViewDelegate : UIAlertView &lt;UIAlertViewDelegate&gt;
{
UIAlertView*			_alertView;
int                     selectedButton;
bool                    dismissed;
}

- (id)initWithTitle:(NSString *)title message:(NSString *)message cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSArray *)otherButtonTitles;

-(int)getButton;
-(bool)isDismissed;
-(string)getTitle;

@end

class ofxiPhoneAlertView
{
public:
ofxiPhoneAlertView(string title, string message, string cancelButtonTitle, vector&lt;string&gt; otherButtonTitles);
~ofxiPhoneAlertView();

void show();
int getSelectedButton();
bool isVisible();
bool isDismissed();
string getTitle();

protected:
ofxiPhoneAlertViewDelegate *alertViewDelegate;
};
</pre>
<h3>ofxiPhoneAlertView.mm</h3>
<pre class="brush: cpp;">
/*
ofxiPhoneAlertView.mm

Created on 6/10/09.
Copyright 2009 Robert Carlsen | robertcarlsen.net

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.
*/

#include &quot;ofxiPhoneAlertView.h&quot;

// c++ class methods
ofxiPhoneAlertView::ofxiPhoneAlertView(string _title,
string _message,
string _cancelButtonTitle,
vector&lt;string&gt; _otherButtonTitles){
NSString * title = [[[NSString alloc] initWithCString: _title.c_str()] autorelease];
NSString * message = [[[NSString alloc] initWithCString: _message.c_str()] autorelease];

// nil value will omit button
NSString * cancelButtonTitle;
if(_cancelButtonTitle == &quot;&quot;)
cancelButtonTitle = nil;
else
cancelButtonTitle = [[[NSString alloc] initWithCString: _cancelButtonTitle.c_str()] autorelease];

// the other buttons are an array of strings
NSMutableArray *otherButtons = [NSMutableArray array];
for(int i=0;i&lt;_otherButtonTitles.size();i++){
[otherButtons addObject:[[[NSString alloc] initWithCString: _otherButtonTitles[i].c_str()] autorelease]];
}

alertViewDelegate = [[ofxiPhoneAlertViewDelegate alloc] initWithTitle:title
message:message
cancelButtonTitle:cancelButtonTitle
otherButtonTitles:otherButtons];

}

ofxiPhoneAlertView::~ofxiPhoneAlertView(){
[alertViewDelegate release];
}

void ofxiPhoneAlertView::show(){
[alertViewDelegate show];
}

int ofxiPhoneAlertView::getSelectedButton(){
return [alertViewDelegate getButton];
}

bool ofxiPhoneAlertView::isVisible(){
return [alertViewDelegate isVisible];
}

bool ofxiPhoneAlertView::isDismissed(){
return [alertViewDelegate isDismissed];
}

string ofxiPhoneAlertView::getTitle(){
return [alertViewDelegate getTitle];
}

// obj-c implementation
@implementation ofxiPhoneAlertViewDelegate

- (id)initWithTitle:(NSString *)title message:(NSString *)message cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSArray *)otherButtonTitles
{
if (self = [super initWithTitle:title
message:message
delegate:self
cancelButtonTitle:cancelButtonTitle
otherButtonTitles:nil ]){
_alertView = [[ofxiPhoneAlertViewDelegate alloc] initWithTitle:title
message:message
delegate:self
cancelButtonTitle:cancelButtonTitle
otherButtonTitles:nil ];
for(NSString *s in otherButtonTitles){
[_alertView addButtonWithTitle:s];
[self addButtonWithTitle:s];
}

dismissed = false;
//self = [_alertView copy];
}
return self;
}

-(int)getButton{
return selectedButton;
}

-(bool)isDismissed{
return dismissed;
}

-(string)getTitle{
// return the title of the alert. to differentiate between separate alert views
return [[self title] UTF8String];
}

/*
- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated;
{

}
*/
// Called when a button is clicked. The view will be automatically dismissed after this call returns
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
selectedButton = buttonIndex;
dismissed = true;
NSLog(@&quot;Selected button: %d&quot;,selectedButton);
}

/*
// Called when we cancel a view (eg. the user clicks the Home button). This is not called when the user clicks the cancel button.
// If not defined in the delegate, we simulate a click in the cancel button
- (void)alertViewCancel:(UIAlertView *)alertView;

- (void)willPresentAlertView:(UIAlertView *)alertView;  // before animation and showing view
- (void)didPresentAlertView:(UIAlertView *)alertView;  // after animation

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex; // before animation and hiding view
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex;  // after animation
*/

-(void) dealloc{
[_alertView release];
[super dealloc];
}

@end
</pre>
]]></content:encoded>
			<wfw:commentRss>http://robertcarlsen.net/2009/06/10/ofxiphonealertview-780/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
