<?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</title>
	<atom:link href="http://robertcarlsen.net/feed" rel="self" type="application/rss+xml" />
	<link>http://robertcarlsen.net</link>
	<description>accounts of success and misadventure</description>
	<lastBuildDate>Wed, 03 Mar 2010 14:48:34 +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>Golden Cheetah featured on nyvelocity.com</title>
		<link>http://robertcarlsen.net/2010/03/03/golden-cheetah-featured-on-nyvelocity-com-1142</link>
		<comments>http://robertcarlsen.net/2010/03/03/golden-cheetah-featured-on-nyvelocity-com-1142#comments</comments>
		<pubDate>Wed, 03 Mar 2010 14:48:10 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[Golden Cheetah]]></category>
		<category><![CDATA[article]]></category>
		<category><![CDATA[nyvelocity]]></category>
		<category><![CDATA[press]]></category>

		<guid isPermaLink="false">http://robertcarlsen.net/?p=1142</guid>
		<description><![CDATA[Golden Cheetah has gotten a really nice write-up on the &#8220;bike racing, news and events&#8221; site nyvelocity.com. The article was featured on the front page for a time, sporting the brand new icon from Dan Schmalz.
A couple of weeks ago I sat down with Andy Shen over lunch and discussed the project, it&#8217;s developer community and [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://robertcarlsen.net/blog/wp-content/uploads/2010/03/gcvelo.jpg" rel="lightbox[1142]"><img class="alignright size-thumbnail wp-image-1143" title="gcvelo" src="http://robertcarlsen.net/blog/wp-content/uploads/2010/03/gcvelo-150x150.jpg" alt="gcvelo" width="150" height="150" /></a><a href="http://nyvelocity.com/content/coachingfitness/2010/golden-cheetah-open-source-goodness" onclick="pageTracker._trackPageview('/outgoing/nyvelocity.com/content/coachingfitness/2010/golden-cheetah-open-source-goodness?referer=');">Golden Cheetah</a> has gotten a really nice <a href="http://nyvelocity.com/content/coachingfitness/2010/golden-cheetah-open-source-goodness" onclick="pageTracker._trackPageview('/outgoing/nyvelocity.com/content/coachingfitness/2010/golden-cheetah-open-source-goodness?referer=');">write-up </a>on the &#8220;bike racing, news and events&#8221; site <a href="http://nyvelocity.com/" onclick="pageTracker._trackPageview('/outgoing/nyvelocity.com/?referer=');">nyvelocity.com</a>. The article was featured on the front page for a time, sporting the brand new icon from Dan Schmalz.</p>
<p>A couple of weeks ago I sat down with Andy Shen over lunch and discussed the project, it&#8217;s developer community and my thoughts on open source software. He did a really nice job parsing my semi-coherent babel and combining it with Sean and Justin&#8217;s perspectives into a thorough history of Golden Cheetah, brief outline of how the program grows through user contributions and a great outline of the major features (and he even built some hype for the forthcoming mapping and long-term metrics features).</p>
<p>Great to see! Read the article at:<br />
<a href="http://nyvelocity.com/content/coachingfitness/2010/golden-cheetah-open-source-goodness" onclick="pageTracker._trackPageview('/outgoing/nyvelocity.com/content/coachingfitness/2010/golden-cheetah-open-source-goodness?referer=');">http://nyvelocity.com/content/coachingfitness/2010/golden-cheetah-open-source-goodness</a></p>
]]></content:encoded>
			<wfw:commentRss>http://robertcarlsen.net/2010/03/03/golden-cheetah-featured-on-nyvelocity-com-1142/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Close to Home</title>
		<link>http://robertcarlsen.net/2010/03/01/close-to-home-1131</link>
		<comments>http://robertcarlsen.net/2010/03/01/close-to-home-1131#comments</comments>
		<pubDate>Mon, 01 Mar 2010 18:17:43 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[Telling Stories with Sensors]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[foursquare]]></category>
		<category><![CDATA[itp]]></category>
		<category><![CDATA[project]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[visualization]]></category>

		<guid isPermaLink="false">http://robertcarlsen.net/?p=1131</guid>
		<description><![CDATA[Our assignment last week was to use Foursquare to log our daily travels. This week, we were asked to use a classmate&#8217;s Foursquare check-in history as the source of our visualizations. I was given Bryan Lence&#8217;s data and set off to see what was there.

Over the past few weeks I&#8217;ve been teaching myself the R &#8220;environment [...]]]></description>
			<content:encoded><![CDATA[<p>Our assignment last week was to use Foursquare to log our daily travels. This week, we were asked to use a classmate&#8217;s Foursquare check-in history as the source of our visualizations. I was given Bryan Lence&#8217;s data and set off to see what was there.</p>
<p><a href="http://robertcarlsen.net/blog/wp-content/uploads/2010/03/blence_map_1024.png" rel="lightbox[1131]"><img class="alignnone size-medium wp-image-1138" title="blence_map_1024" src="http://robertcarlsen.net/blog/wp-content/uploads/2010/03/blence_map_1024-300x225.png" alt="blence_map_1024" width="300" height="225" /></a></p>
<p>Over the past few weeks I&#8217;ve been teaching myself the R &#8220;<a href="http://www.r-project.org/" onclick="pageTracker._trackPageview('/outgoing/www.r-project.org/?referer=');">environment for statistical computing and graphics</a>&#8220;. It&#8217;s an open source project and has a doubly steep learning curve (for me, at least) of an unfamiliar syntax and medium (statistics). I can see it&#8217;s power for visualizations, however, when used to reveal interesting associations which can be further refined in other graphics software (in this case, Illustrator).</p>
<p><span id="more-1131"></span></p>
<p>We began by looking at KML feeds of check-in history as provided by Foursquare in Google Earth. This quickly gave us a rough idea of what the check-ins looked like geographically. I put together a simple <a href="http://robertcarlsen.net/2010/02/23/parsing-foursquare-kml-files-1113">python script</a> which parses the KML into an easy-to-ingest CSV file. I analyzed this data in R for several days, mostly learning how to get around in the language and getting up to speed on the ggplot2 package, following the advice of <a href="http://dataspora.com/" onclick="pageTracker._trackPageview('/outgoing/dataspora.com/?referer=');">Mike Driscoll</a> as he described during his presentation to our class last week. After simply plotting the check-ins, I still had to ponder the story behind Bryan&#8217;s history. Aside from learning R syntax, teasing out a meaningful story was the most difficult part of this project.</p>
<p>In the end, I noticed that Bryan spent almost all of the week approximately within 1 kilometer of his home. With that in mind I started to work out the lengths of trips (distance between check-ins) and the distance to each from his home. Breaking out the travels by day revealed some neat relationships in the pattern. I also looked to see if weather conditions contributed at all, and while this data set is quite small (42 check-ins over eight days), there were three days of snow with light travel (which, admittedly, could be coincidental).</p>
<p>I took several plots generated by R into Illustrator for refinement and layout. I&#8217;m happy with this result, acknowledging that it&#8217;s a pretty rudimentary start to data visualization using these methods.</p>
<p>[<a href="http://robertcarlsen.net/blog/wp-content/uploads/2010/03/blence_map.pdf">PDF version of the graphic</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://robertcarlsen.net/2010/03/01/close-to-home-1131/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>&#8230;of course i was logging</title>
		<link>http://robertcarlsen.net/2010/02/10/of-course-i-was-logging-1098</link>
		<comments>http://robertcarlsen.net/2010/02/10/of-course-i-was-logging-1098#comments</comments>
		<pubDate>Thu, 11 Feb 2010 03:11:09 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[itp]]></category>
		<category><![CDATA[ankle]]></category>
		<category><![CDATA[csv]]></category>
		<category><![CDATA[datalogging]]></category>
		<category><![CDATA[graph]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[processing]]></category>
		<category><![CDATA[snowboard]]></category>
		<category><![CDATA[visualization]]></category>

		<guid isPermaLink="false">http://robertcarlsen.net/?p=1098</guid>
		<description><![CDATA[I fractured my ankle in a hard snowboard crash a couple of weeks ago and of course I was data logging the accelerometer forces. I was using the iPhone app developed last fall for the seismi{c}ycling project; while riding the phone was in my jacket&#8217;s internal chest pocket.
A group from ITP was enjoying the bitter [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://robertcarlsen.net/blog/wp-content/uploads/2010/02/Screen-shot-2010-01-30-at-20.12.55-.png" rel="lightbox[1098]"><img class="alignright size-thumbnail wp-image-1099" title="Screen shot 2010-01-30 at 20.12.55" src="http://robertcarlsen.net/blog/wp-content/uploads/2010/02/Screen-shot-2010-01-30-at-20.12.55--150x150.png" alt="Screen shot 2010-01-30 at 20.12.55" width="150" height="150" /></a>I fractured my ankle in a hard snowboard crash a couple of weeks ago and of course I was data logging the accelerometer forces. I was using the iPhone app developed last fall for the seismi{c}ycling project; while riding the phone was in my jacket&#8217;s internal chest pocket.</p>
<p>A group from ITP was enjoying the bitter weather at Mount Snow, in West Dover, VT on our (now annual?) Snowbunnies trip. This crash was late in the day on a wide open trail. I accidentally disengaged my heelside edge for a moment, causing me to rotate slightly clockwise and slide laterally. Moments later, my heelside edge caught again, now on the downhill side, causing me to quickly flip backwards onto my head &#8230; thankfully I was wearing a helmet. After that I can&#8217;t recall what exactly happened, but I know that it involved a lot of tumbling which my right ankle just couldn&#8217;t weather.<span id="more-1098"></span></p>
<p>The data was recorded at 10Hz and includes GPS coordinates, heading, estimated speed and altitude and the accelerometer values. I used a simple java / processing application to graph the log. In the video clip below I&#8217;ve applied low pass filtering to the raw acc data and used that to control a 3d box, representing my orientation during the crash.</p>
<p>The log file is included here in CSV format if anyone wants to check it out or make an awesome visualization of it! There is some weirdness at the beginning of the file&#8230;perhaps as Core Location was getting a GPS fix. [<a href="http://robertcarlsen.net/blog/wp-content/uploads/2010/02/crashlog.zip">crash datalog</a>]</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/cXQ99o6O_30&#038;fs=1" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed src="http://www.youtube.com/v/cXQ99o6O_30&#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/2010/02/10/of-course-i-was-logging-1098/feed</wfw:commentRss>
		<slash:comments>0</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>ITP Winter Show 2009</title>
		<link>http://robertcarlsen.net/2009/12/20/itp-winter-show-2009-1067</link>
		<comments>http://robertcarlsen.net/2009/12/20/itp-winter-show-2009-1067#comments</comments>
		<pubDate>Sun, 20 Dec 2009 19:18:24 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[itp]]></category>

		<guid isPermaLink="false">http://robertcarlsen.net/?p=1067</guid>
		<description><![CDATA[The 2009 ITP Winter Show is Sunday and Monday, December 20–21. The first visualization of my ongoing bicycle data logging project is on display under the title &#8220;seismi{c}ycling&#8220;.
This visualization traces the routes I rode throughout the fall, highlighting big bumps. Areas of New York which caused me to experience lots of bumps begin to glow bright [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://robertcarlsen.net/blog/wp-content/uploads/2009/12/photo.jpg" rel="lightbox[1067]"><img class="alignright size-thumbnail wp-image-1068" title="photo" src="http://robertcarlsen.net/blog/wp-content/uploads/2009/12/photo-150x150.jpg" alt="photo" width="150" height="150" /></a>The 2009 ITP Winter Show is Sunday and Monday, December 20–21. The first visualization of my ongoing bicycle data logging project is on display under the title &#8220;<a href="http://robertcarlsen.net/projects/seismicycling">seismi{c}ycling</a>&#8220;.</p>
<p>This visualization traces the routes I rode throughout the fall, highlighting big bumps. Areas of New York which caused me to experience lots of bumps begin to glow bright red.</p>
<p>The show is a great time; I&#8217;d highly suggest coming to see the myriad of projects this year. There&#8217;s a online guest book with project map at <a href="http://itpguestbook.com" onclick="pageTracker._trackPageview('/outgoing/itpguestbook.com?referer=');">ITPGuestbook</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://robertcarlsen.net/2009/12/20/itp-winter-show-2009-1067/feed</wfw:commentRss>
		<slash:comments>0</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>7</slash:comments>
		</item>
		<item>
		<title>motivations: karma</title>
		<link>http://robertcarlsen.net/2009/12/03/motivations-karma-1039</link>
		<comments>http://robertcarlsen.net/2009/12/03/motivations-karma-1039#comments</comments>
		<pubDate>Fri, 04 Dec 2009 04:17:44 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[Media Economics and Participation]]></category>
		<category><![CDATA[itp]]></category>
		<category><![CDATA[assignment]]></category>
		<category><![CDATA[karma]]></category>
		<category><![CDATA[motivation]]></category>
		<category><![CDATA[paper]]></category>
		<category><![CDATA[slashdot]]></category>
		<category><![CDATA[writing]]></category>

		<guid isPermaLink="false">http://robertcarlsen.net/?p=1039</guid>
		<description><![CDATA[[written for Media Economics &#38; Participation at ITP]
Slashdot users are seeking karma. However, gaining positive karma at Slashdot is just a means to an end; Slashdot users are seeking (limited) power and status among their peers in the form of fleeting moderator access for the vibrant comments component of the highly active, technology-focused news aggregation [...]]]></description>
			<content:encoded><![CDATA[<p>[written for Media Economics &amp; Participation at ITP]</p>
<p>Slashdot users are seeking karma. However, gaining positive karma at Slashdot is just a means to an end; Slashdot users are seeking (limited) power and status among their peers in the form of fleeting moderator access for the vibrant comments component of the highly active, technology-focused news aggregation site. Moderators are chosen from among the registered users using a somewhat obscure algorithm which incorporates each user’s karma rating (a scale of Terrible, Bad, Neutral, Positive, Good, and Excellent), length of membership and randomness. Selected moderators are given special status and 5 mod{eration} points with an expiration window of three days. The moderation status ends when the points have been used in the act of moderating comments or have expired.</p>
<p>The moderation system has been borne out of necessity as the Slashdot community has grown large, bringing the signal-to-noise ratio down and decreasing the satisfaction in reading the raw comment threads. “Flamebait” and “trolls” contribute little more than instigation for starting arguments and fights among the users with typically strong opinions on matters which usually appear on Slashdot. Rob Malda, founder of Slashdot, explains this phenomenon on the Slashdot FAQ:<span id="more-1039"></span></p>
<blockquote><p>“One of the unfortunate side-effects of the increasing popularity of Slashdot is that the number of trolls, flame-warriors and all-around lamers increases as well, and it only takes a relatively small number of them to make a lot of noise. Keeping this noise to a minimum is one of the primary goals of the moderation system” (http://slashdot.org/faq/com-mod.shtml#cm500)</p></blockquote>
<p>Comments are moderated by labeling them as either offtopic, flamebait, troll, redundant, insightful, interesting, informative, funny, overrated or underrated. These adjective labels translate into positive or negative values and are summed to provide the final score. The scoring system for comments is an absolute numeric scale from -1 to 5. Readers can use this scale to filter out comments which have been modded down. While moderators are encouraged to view the comments unfiltered, non-moderators can simply set a viewing threshold which omits the low ranked comments. At times, this creates a disconnect when a highly modded response appears for a hidden comment, however it creates a better overall reading experience (and hidden comments can easily be displayed ad hoc).</p>
<p>Of course, since the moderators are sourced from the same membership pool which is creating the comments to be moderated, controls have been established to limit the influence (or damage) of any one moderator. The small number of mod points provided at a time, short expiration period for them and a somewhat obfuscated moderator selection process make taking advantage of the system by particular users difficult. There is also a metamoderation (m2) system where the larger Slashdot membership can rate the validity of mod points as they have been awarded and can directly influence the karma status of the moderators which awarded them.</p>
<p>Aside from being used to set viewing filters on comment threads, mod points are a direct factor in awarding karma to comment authors. According to the Slashdot FAQ, contributing (good) comments and submitting articles are the primary ways to achieve positive karma, which then increases the chances of being selected as a moderator (for a day, or so). Paraphrased from a story submitted by Slashdot user dkh2: “Post Intelligently, Post Calmly, Post Early, Post Often, Stay On Topic, Be Original, Read It Before You Post, Log In As a Registered User, Read Slashdot Regularly…Come to the party and play.” (http://slashdot.org/faq/com-mod.shtml#cm1900)</p>
<p>In terms of motivators, attaining moderator status provides a sense of all four intrinsic motivators. Being bestowed moderator status confirms a sense of membership in the community, as well as grants a small degree of autonomy. Moderators can recognize competence in other members (as well as affirm their own competence) by modding up particularly good comments, and also display generosity in giving up their limited mod points (although perhaps out of some self-serving drive rather than communal altruism). Modding down poor comments seems similar, but perhaps the generosity is directed toward the community while providing satisfaction at venting ire over undesirable users.</p>
<p>It’s important to note that posting comments is not limited to Slashdot members. “Anonymous cowards” are welcome to post comments on any story. While it seems as though this creates an easy vector to enable trolling and flamebait, the Slashdot chooses to recognize potential utility of anonymous posting:</p>
<blockquote><p>“We think the ability to post anonymously is important. Sometimes people have important information they want to post, but are afraid to do it if they can be linked to it. Anonymous Coward posting will continue to exist for the foreseeable future.” (http://slashdot.org/faq/com-mod.shtml#cm515)</p></blockquote>
<p>Anonymous comments begin with zero mod points, so simply adjusting the viewing threshold to 1 and above omits anonymous posts which have not be explicitly modded up and reduces the need for moderators to use up mod points to curtail anonymous flamebait (unless it’s been already modded up for some reason). The stated guidelines for moderators explain Slashdot’s objectives:</p>
<blockquote><p>“Concentrate more on promoting than on demoting. The real goal here is to find the juicy good stuff and let others read it.…The goal here is to share ideas. To sift through the haystack and find needles. And to keep the children who like to spam Slashdot in check.” (http://slashdot.org/faq/com-mod.shtml#cm600)</p></blockquote>
<p>While the editors of Slashdot determine which of the submitted stories actually make it to the front page, there has been a conscious decision to keep the commenting system organic. Editors have unlimited moderation points, but comments themselves are not removed. In response to the question “Will you delete my comment?” the resounding answer on the FAQ is:</p>
<blockquote><p>“No. We believe that discussions in Slashdot are like discussions in real life- you can&#8217;t change what you say, you only can attempt to clarify by saying more.…In short, you should think twice before you click that &#8216;Submit&#8217; button because once you click it, we aren&#8217;t going to let you Undo it.” (http://slashdot.org/faq/com-mod.shtml#cm150)</p></blockquote>
<p>The moderation system has created motivators of its own to keep it self-propagating and self-healing, however the primary motivator among (positive) members of Slashdot is recognition from peers. The tagline for Slashdot is “News for nerds. Stuff that matters.” and there is a real sense that the membership is intelligent, highly competent and well regarded (despite the actual demographics or what can be inferred by the quality of comments). Having a comment deemed as valuable and subsequently modded up provides satisfaction and a sense of accomplishment. There are often choruses of “mod parent up” by non-moderator members imploring peers with moderator status to recognize good comments.</p>
<p>Analysis of larger motivators describing members contributing to a discussion board or comments thread is outside the scope of this examination. However, Slashdot has implemented an interesting self-sustaining system to provide free expression while minimizing inevitable elements which are distracting or possibly damaging to the community. The system is designed to self-moderate and self-select future moderators using recognition of past contributions and actions as indicators of responsibility and competence. A striking element of this system is that lowly moderated comments are not censored but filtered; all contributions are available for viewing by any readers of the site at all times. This is a compelling balance between control and transparency which would be intriguing to experiment with in other contexts.</p>
]]></content:encoded>
			<wfw:commentRss>http://robertcarlsen.net/2009/12/03/motivations-karma-1039/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
