<?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>blprnt.blg</title>
	<atom:link href="http://blog.blprnt.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.blprnt.com</link>
	<description>Jer Thorp &#124; There is an art to evolution...</description>
	<lastBuildDate>Fri, 03 Feb 2012 18:44:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Eyeo Festival 2011 &#8211; New York, New York</title>
		<link>http://blog.blprnt.com/blog/blprnt/eyeo-festival-2011-new-york-new-york</link>
		<comments>http://blog.blprnt.com/blog/blprnt/eyeo-festival-2011-new-york-new-york#comments</comments>
		<pubDate>Mon, 23 Jan 2012 20:18:16 +0000</pubDate>
		<dc:creator>Jer</dc:creator>
				<category><![CDATA[Talks]]></category>

		<guid isPermaLink="false">http://blog.blprnt.com/?p=1521</guid>
		<description><![CDATA[Last year at Eyeo, I gave a talk about the work that I had done in my first year in New York City, including Cascade (a social network visualization tool), OpenPaths (a secure personal location data project) and my work with Local Projects on the 9/11 Memorial. Oh, and Batman. And Wayne Gretzky. You can [...]]]></description>
			<content:encoded><![CDATA[<p>Last year at <a href="http://eyeofestival.com">Eyeo</a>, I gave a talk about the work that I had done in my first year in New York City, including <a href="http://nytlabs.com/projects/cascade.html">Cascade</a> (a social network visualization tool), <a href="http://openpaths.cc">OpenPaths</a> (a secure personal location data project) and <a href="http://blog.blprnt.com/blog/blprnt/all-the-names">my work with Local Projects on the 9/11 Memorial</a>.</p>
<p>Oh, and Batman. And Wayne Gretzky.</p>
<p>You can watch the video below (it&#8217;s about 50 minutes). As always, questions, feedback and bizarre non-sequiturs are welcome.</p>
<p><iframe src="http://player.vimeo.com/video/35300280?color=DC6B27" width="550" height="412" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blprnt.com/blog/blprnt/eyeo-festival-2011-new-york-new-york/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Selected Works (2009 &#8211; 2011)</title>
		<link>http://blog.blprnt.com/blog/blprnt/selected-works-2009-2011</link>
		<comments>http://blog.blprnt.com/blog/blprnt/selected-works-2009-2011#comments</comments>
		<pubDate>Sun, 27 Nov 2011 16:21:46 +0000</pubDate>
		<dc:creator>Jer</dc:creator>
				<category><![CDATA[1]]></category>

		<guid isPermaLink="false">http://blog.blprnt.com/?p=1517</guid>
		<description><![CDATA[These days my spare time is typically measured in seconds &#8211; so I took advantage of a rare free morning today to put together a very simple list of the some of the work that I have built since the beginning of 2009. You can find a link to this list at the top of [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.blprnt.com/selected-works"><img src="http://blog.blprnt.com/wp-content/uploads/2011/11/works5.png" alt="" title="works5" width="500" height="500" class="alignnone size-full wp-image-1526" /></a></p>
<p>These days my spare time is typically measured in seconds &#8211; so I took advantage of a rare free morning today to put together a very simple list of the some of the work that I have built since the beginning of 2009. You can find a link to this list at the top of the site &#8211; or you can just <a href="http://blog.blprnt.com/selected-works">click here</a>. As always, comments and suggestions are encouraged and appreciated.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blprnt.com/blog/blprnt/selected-works-2009-2011/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>UPDATED: Quick Tutorial &#8211; Processing &amp; Twitter</title>
		<link>http://blog.blprnt.com/blog/blprnt/updated-quick-tutorial-processing-twitter</link>
		<comments>http://blog.blprnt.com/blog/blprnt/updated-quick-tutorial-processing-twitter#comments</comments>
		<pubDate>Thu, 27 Oct 2011 17:08:32 +0000</pubDate>
		<dc:creator>Jer</dc:creator>
				<category><![CDATA[1]]></category>

		<guid isPermaLink="false">http://blog.blprnt.com/?p=1456</guid>
		<description><![CDATA[** Since I first released this tutorial in 2009, it has received thousands of views and has hopefully helped some of you get started with building projects incorporating Twitter with Processing. In late 2010, Twitter changed the way that authorization works, so I&#8217;ve updated the tutorial to get it inline with the new Twitter API [...]]]></description>
			<content:encoded><![CDATA[<p><em>** Since I first released this tutorial in 2009, it has received thousands of views and has hopefully helped some of you get started with building projects incorporating Twitter with Processing. In late 2010, Twitter changed the way that authorization works, so I&#8217;ve updated the tutorial to get it inline with the new Twitter API functionality.</em></p>
<p>Accessing information from the Twitter API with Processing is (reasonably) easy. A few people have sent me e-mails asking how it all works, so I thought I&#8217;d write a very quick tutorial to get everyone up on their feet.</p>
<p>We don&#8217;t need to know too much about how the Twitter API functions, because someone has put together a very useful Java library to do all of the dirty work for us. It&#8217;s called twitter4j, and you can <a href="http://yusuke.homeip.net/twitter4j/en/index.html">download it here</a>. We&#8217;ll be using this in the first step of the building section of this tutorial.</p>
<p><strong>1. Authentication</strong></p>
<p>Here&#8217;s the tricky part. In the olden days, Twitter used to be happy with us sending it a username and password pair for authentication. Now, all of the Twitter API functionality uses an <a href="http://oauth.net/">oAuth</a> system, which allows people to authenticate applications through a login at twitter.com (so that developers never see the user&#8217;s login information). </p>
<p>That&#8217;s pretty good from a security standpoint, but it makes our job a little bit harder. Now, instead of just needing a short username and password, we need FOUR things to authenticate our sketch: A consumer key &#038; secret, and an access token &#038; secret. You can get all 4 of these things from the twitter developer page.</p>
<p>1. Visit https://dev.twitter.com/ and login with your twitter username and password<br />
2. Click on the &#8216;Create an app&#8217; button at the bottom right<br />
3. Fill out the form that follows &#8211; you can use temporary values (like &#8220;Jer&#8217;s awesome test application&#8221;) for the first three fields.<br />
4. Once you&#8217;ve agreed to the developer terms, you&#8217;ll arrive at a page which shows the first two of the four things that we need: the Consumer key and the Consumer secret. Copy and paste these somewhere so you have them ready to access.</p>
<p><a href="http://blog.blprnt.com/blog/blprnt/updated-quick-tutorial-processing-twitter/screen-shot-2011-10-27-at-12-38-48-pm" rel="attachment wp-att-1461"><img src="http://blog.blprnt.com/wp-content/uploads/2011/10/Screen-Shot-2011-10-27-at-12.38.48-PM-500x259.png" alt="" title="Screen Shot 2011-10-27 at 12.38.48 PM" width="500" height="259" class="alignnone size-medium wp-image-1461" /></a></p>
<p>5. To get the other two values that we need, click on the button that says &#8216;Recreate my access token&#8217;. Copy and paste those two values (Access token and Access token secret) so that we have all four in the same place.</p>
<p><strong>2. Building</strong></p>
<p>1. Open up a new Processing sketch.<br />
2. Import the twitter4j library. In your downloaded twitter4j files, you&#8217;ll find the core .jar in a directory called &#8216;lib&#8217;. You&#8217;re looking for a file called something like &#8216;twitter4j-core-2.2.5.jar&#8217;. We can add this to our sketch by simply dragging the twitter4j-core-2.2.5.jar file onto your sketch window. If you want to check, you should now see this file in your sketch folder, inside of a new &#8216;code&#8217; directory.<br />
3. The first thing we&#8217;ll do in our new file is to store the credentials that we gathered in the first part of this tutorial into a ConfigurationBuilder object (this is a built-in part of the twitter4j library):</p>
<p><em>** Don&#8217;t use the credentials below &#8211; these are fake ones that I made up &#8211; use the ones that you copy &#038; pasted in steps 4 &#038; 5 above</em></p>
<pre class="brush: java; title: ; notranslate">
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setOAuthConsumerKey(&quot;lPFSpjBppo5u4KI5xEXaQ&quot;);
cb.setOAuthConsumerSecret(&quot;SYt3e4xxSHUL1gPfM9bxQIq6Jf34Hln9T1q9KGCPs&quot;);
cb.setOAuthAccessToken(&quot;17049577-Yyo3AEVsqZZopPTr055TFdySop228pKKAZGbJDtnV&quot;);
cb.setOAuthAccessTokenSecret(&quot;6ZjJBebElMBiOOeyVeh8GFLsROtXXtKktXALxAT0I&quot;);
</pre>
<p>4. Now we&#8217;ll make the main Twitter object that we can use to do pretty much anything you can do on the twitter website &#8211; get status updates, run search queries, find follower information, etc. This Twitter object gets built by something called the TwitterFactory, which needs our configuration information that we set above:</p>
<pre class="brush: java; title: ; notranslate">
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setOAuthConsumerKey(&quot;lPFSpjBppo5u4KI5xEXaQ&quot;);
cb.setOAuthConsumerSecret(&quot;SYt3e4xxSHUL1gPfM9bxQIq6Jf34Hln9T1q9KGCPs&quot;);
cb.setOAuthAccessToken(&quot;17049577-Yyo3AEVsqZZopPTr055TFdySop228pKKAZGbJDtnV&quot;);
cb.setOAuthAccessTokenSecret(&quot;6ZjJBebElMBiOOeyVeh8GFLsROtXXtKktXALxAT0I&quot;);

Twitter twitter = new TwitterFactory(cb.build()).getInstance();
</pre>
<p>5. Now that we have a Twitter object, we want to build a query to search via the Twitter API for a specific term or phrase. This is code that will not always work &#8211; sometimes the Twitter API might be down, or our search might not return any results, or we might not be connected to the internet. The Twitter object in twitter4j handles those types of conditions by throwing back an exception to us; we need to have a try/catch structure ready to deal with that if it happens:</p>
<pre class="brush: java; title: ; notranslate">
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setOAuthConsumerKey(&quot;lPFSpjBppo5u4KI5xEXaQ&quot;);
cb.setOAuthConsumerSecret(&quot;SYt3e4xxSHUL1gPfM9bxQIq6Jf34Hln9T1q9KGCPs&quot;);
cb.setOAuthAccessToken(&quot;17049577-Yyo3AEVsqZZopPTr055TFdySop228pKKAZGbJDtnV&quot;);
cb.setOAuthAccessTokenSecret(&quot;6ZjJBebElMBiOOeyVeh8GFLsROtXXtKktXALxAT0I&quot;);

Twitter twitter = new TwitterFactory(cb.build()).getInstance();
Query query = new Query(&quot;#OWS&quot;);

try {
  QueryResult result = twitter.search(query);
}
catch (TwitterException te) {
  println(&quot;Couldn't connect: &quot; + te);
};
</pre>
<p>5. This code is working &#8211; but we haven&#8217;t done anything with the results. Here, we&#8217;ll set the results per page parameter for the query to 100 to get the last 100 results with the term &#8216;#OWS&#8217; and spit those results into the output panel:</p>
<pre class="brush: java; title: ; notranslate">

ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setOAuthConsumerKey(&quot;lPFSpjBppo5u4KI5xEXaQ&quot;);
cb.setOAuthConsumerSecret(&quot;SYt3e4xxSHUL1gPfM9bxQIq6Jf34Hln9T1q9KGCPs&quot;);
cb.setOAuthAccessToken(&quot;17049577-Yyo3AEVsqZZopPTr055TFdySop228pKKAZGbJDtnV&quot;);
cb.setOAuthAccessTokenSecret(&quot;6ZjJBebElMBiOOeyVeh8GFLsROtXXtKktXALxAT0I&quot;);

Twitter twitter = new TwitterFactory(cb.build()).getInstance();
Query query = new Query(&quot;#OWS&quot;);
query.setRpp(100);

try {
  QueryResult result = twitter.search(query);
  ArrayList tweets = (ArrayList) result.getTweets();

  for (int i = 0; i &lt; tweets.size(); i++) {
    Tweet t = (Tweet) tweets.get(i);
    String user = t.getFromUser();
    String msg = t.getText();
    Date d = t.getCreatedAt();
    println(&quot;Tweet by &quot; + user + &quot; at &quot; + d + &quot;: &quot; + msg);
  };
}
catch (TwitterException te) {
  println(&quot;Couldn't connect: &quot; + te);
};
</pre>
<p>It seems stupid to come all of this way without doing something visual, so let&#8217;s throw all of the words that we see in the tweets onto the screen, quick and dirty, at random positions. The following code takes our existing instructions and puts them into the standard Processing setup/draw enclosures so that we can do some animation over time:</p>
<pre class="brush: java; title: ; notranslate">

//Build an ArrayList to hold all of the words that we get from the imported tweets
ArrayList&lt;String&gt; words = new ArrayList();

void setup() {
  //Set the size of the stage, and the background to black.
  size(550,550);
  background(0);
  smooth();

  //Credentials
  ConfigurationBuilder cb = new ConfigurationBuilder();
  cb.setOAuthConsumerKey(&quot;lPFSpjBppo5u4KI5xEXaQ&quot;);
  cb.setOAuthConsumerSecret(&quot;SYt3e4xxSHUL1gPfM9bxQIq6Jf34Hln9T1q9KGCPs&quot;);
  cb.setOAuthAccessToken(&quot;17049577-Yyo3AEVsqZZopPTr055TFdySop228pKKAZGbJDtnV&quot;);
  cb.setOAuthAccessTokenSecret(&quot;6ZjJBebElMBiOOeyVeh8GFLsROtXXtKktXALxAT0I&quot;);

  //Make the twitter object and prepare the query
  Twitter twitter = new TwitterFactory(cb.build()).getInstance();
  Query query = new Query(&quot;#OWS&quot;);
  query.setRpp(100);

  //Try making the query request.
  try {
    QueryResult result = twitter.search(query);
    ArrayList tweets = (ArrayList) result.getTweets();

    for (int i = 0; i &lt; tweets.size(); i++) {
      Tweet t = (Tweet) tweets.get(i);
      String user = t.getFromUser();
      String msg = t.getText();
      Date d = t.getCreatedAt();
      println(&quot;Tweet by &quot; + user + &quot; at &quot; + d + &quot;: &quot; + msg);

      //Break the tweet into words
      String[] input = msg.split(&quot; &quot;);
      for (int j = 0;  j &lt; input.length; j++) {
       //Put each word into the words ArrayList
       words.add(input[j]);
      }
    };
  }
  catch (TwitterException te) {
    println(&quot;Couldn't connect: &quot; + te);
  };
}

void draw() {
  //Draw a faint black rectangle over what is currently on the stage so it fades over time.
  fill(0,1);
  rect(0,0,width,height);

  //Draw a word from the list of words that we've built
  int i = (frameCount % words.size());
  String word = words.get(i);

  //Put it somewhere random on the stage, with a random size and colour
  fill(255,random(50,150));
  textSize(random(10,30));
  text(word, random(width), random(height));
}
</pre>
<p><a href="http://blog.blprnt.com/blog/blprnt/updated-quick-tutorial-processing-twitter/twitter" rel="attachment wp-att-1460"><img src="http://blog.blprnt.com/wp-content/uploads/2011/10/twitter.png" alt="" title="twitter" width="550" height="550" class="alignnone size-full wp-image-1460" /></a></p>
<p><strong>** Extra-coolness: <a href="http://scotland.proximity.on.ca/dxr/tmp/processing-mobile/examples/twitter/blprnt-twitter-demo.html">see this example working in the browser</a> with <a href="http://processingjs.org">Processing.js</a>!!</strong></p>
<p>That&#8217;s it! This example is very simple, but it&#8217;s the bare bones of what you need build a project which connects Twitter through Processing.</p>
<p>Shortly I&#8217;ll add another post which shows how to use Processing with the Twitter Streaming API, so that we can deal with large volumes of tweets over time.</p>
<p>Good luck!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blprnt.com/blog/blprnt/updated-quick-tutorial-processing-twitter/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>138 Years of Popular Science</title>
		<link>http://blog.blprnt.com/blog/blprnt/138-years-of-popular-science</link>
		<comments>http://blog.blprnt.com/blog/blprnt/138-years-of-popular-science#comments</comments>
		<pubDate>Wed, 26 Oct 2011 02:10:57 +0000</pubDate>
		<dc:creator>Jer</dc:creator>
				<category><![CDATA[1]]></category>

		<guid isPermaLink="false">http://blog.blprnt.com/?p=1449</guid>
		<description><![CDATA[Near the end of this summer, I was asked by the publishers of Popular Science magazine to produce a visualization piece that explored the archive of their publication. PopSci has a history that spans almost 140 years, so I knew there would be plenty of material to draw from. Working with Mark Hansen, I ended [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/blprnt/6281515793/" title="Magazine shots - Popular Science by blprnt_van, on Flickr"><img src="http://farm7.static.flickr.com/6212/6281515793_5b3bd9b38e.jpg" width="500" height="375" alt="Magazine shots - Popular Science"></a></p>
<p>Near the end of this summer, I was asked by the publishers of Popular Science magazine to produce a visualization piece that explored the archive of their publication. PopSci has a history that spans almost 140 years, so I knew there would be plenty of material to draw from. Working with Mark Hansen, I ended up making a graphic that showed how different technical and cultural terms have come in and out of use in the magazine since its inception.</p>
<p>The graphic is anchored by a kind of molecular chain &#8211; decade clusters in turn contain year clusters. Every atom in these year clusters is a single issue of the magazine, and is shaded with colours extracted from the issue covers via a colour clustering routine. The size of the issue-atoms is determined by the number of words in each issue.</p>
<p><a href="http://www.flickr.com/photos/blprnt/6281520707/" title="Magazine shots - Popular Science by blprnt_van, on Flickr"><img src="http://farm7.static.flickr.com/6229/6281520707_376069f355.jpg" width="500" height="375" alt="Magazine shots - Popular Science"></a></p>
<p><a href="http://www.flickr.com/photos/blprnt/6282038098/" title="Magazine shots - Popular Science by blprnt_van, on Flickr"><img src="http://farm7.static.flickr.com/6101/6282038098_774a6cffcb.jpg" width="500" height="375" alt="Magazine shots - Popular Science"></a></p>
<p>Surrounding this chain are about 70 word frequency histograms showing the issue-by-issue usage of different terms (like &#8216;software&#8217; or &#8216;bakelite&#8217;). I used a simple space-filling algorithm to place these neatly around the molecule chain, and to stack them so that one histogram begins shortly after another ends. This ended up resulting in some interesting word chains that show how technology has progressed &#8211; some that make sense (microcomputer to e-mail) and some what are more whimsical (supernatural to periscope to datsun to fax). </p>
<p>Picking out interesting words from all of the available choices (pretty much the entire dictionary) was a tricky part of the process. I built a custom tool in Processing that pre-visualized the frequency plots of each word so that I could go through many, many possibilities and identify the ones that would be interesting to include in the final graphic. This is a really common approach for me to take &#8211; building small tools during the process of a project that help me solve specific problems. For this visualization, I actually ended up writing 4 tools in <a href="http://www.processing.org">Processing</a> &#8211; only one of which contributed visually to the final result.</p>
<p>My working process is riddled with dead-ends, messy errors and bad decisions &#8211; the &#8216;final&#8217; product usually sits on top of a mountain of iterations that rarely see the light of day. To give a bit of insight into the steps between concept and product, I&#8217;ve put together a <a href="http://www.flickr.com/photos/blprnt/sets/72157627854698933/">Flickr set</a> showing 134 process images that came out of the development of this visualization. Here are a few images from that set:</p>
<p><strong>Rough beginning</strong></p>
<p><a href="http://www.flickr.com/photos/blprnt/6281861306/" title="Popular Science - Process by blprnt_van, on Flickr"><img src="http://farm7.static.flickr.com/6043/6281861306_606da18897.jpg" width="500" height="462" alt="Popular Science - Process"></a></p>
<p><strong>Early molecular chain</strong></p>
<p><a href="http://www.flickr.com/photos/blprnt/6281860762/" title="Popular Science - Process by blprnt_van, on Flickr"><img src="http://farm7.static.flickr.com/6019/6281860762_c0ffc2c816.jpg" width="500" height="462" alt="Popular Science - Process"></a></p>
<p><strong>Denser chain with test &#8216;word span&#8217;</strong></p>
<p><a href="http://www.flickr.com/photos/blprnt/6281343855/" title="Popular Science - Process by blprnt_van, on Flickr"><img src="http://farm7.static.flickr.com/6120/6281343855_2b84323755.jpg" width="500" height="462" alt="Popular Science - Process"></a></p>
<p><strong>A diversion</strong></p>
<p><a href="http://www.flickr.com/photos/blprnt/6281856864/" title="Popular Science - Process by blprnt_van, on Flickr"><img src="http://farm7.static.flickr.com/6117/6281856864_feac178d69.jpg" width="500" height="462" alt="Popular Science - Process"></a></p>
<p><strong>Near-final</strong></p>
<p><a href="http://www.flickr.com/photos/blprnt/6281316931/" title="Popular Science - Process by blprnt_van, on Flickr"><img src="http://farm7.static.flickr.com/6098/6281316931_e392b7bb0e.jpg" width="500" height="500" alt="Popular Science - Process"></a> </p>
<p>Lost in the image records are the steps that involved the data &#8211; and there were a lot of them. The archive was text that came from an OCR (optical character recognition) process, and was incredibly messy. To make matters worse, the file names for each issue were machine-generated and didn&#8217;t tie to the actual date order of the documents. A great deal of our time was spent cleaning up this data, and compiling customized datasets (many of which never ended up getting used).</p>
<p>While the final graphic is pictured above, it looks much better in print &#8211; so make sure you get a copy! Better yet, you can order a poster-sized version of the graphic by clicking <a href="http://popsci.com/posters">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blprnt.com/blog/blprnt/138-years-of-popular-science/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Tutorial: Processing, Javascript, and Data Visualization</title>
		<link>http://blog.blprnt.com/blog/blprnt/tutorial-processing-javascript-and-data-visualization</link>
		<comments>http://blog.blprnt.com/blog/blprnt/tutorial-processing-javascript-and-data-visualization#comments</comments>
		<pubDate>Sat, 03 Sep 2011 02:16:55 +0000</pubDate>
		<dc:creator>Jer</dc:creator>
				<category><![CDATA[Processing]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://blog.blprnt.com/?p=1375</guid>
		<description><![CDATA[[The above graphic is an interactive 3D bar graph. If you can't see it, it's probably because your browser sucks can't render WebGL content. Maybe try Chrome or Firefox?] Ben Fry and Casey Reas, the initiators of the Processing project, announced at the Eyeo Festival that a new version of Processing, Processing 2.0, will be [...]]]></description>
			<content:encoded><![CDATA[<p><script src="http://blprnt.com/js/processing.js"></script> </p>
<div id="pjs" width="500" height="500" style="padding-bottom:20px">
<canvas data-processing-sources="http://blog.blprnt.com/pde/tutorial.pde"></canvas>
</div>
<p><em>[The above graphic is an interactive 3D bar graph. If you can't see it, it's probably because your browser <del>sucks</del> can't render WebGL content. Maybe try <a href="http://www.google.com/chrome">Chrome</a> or <a href="http://www.mozilla.org/en-US/firefox/new/">Firefox</a>?]</em></p>
<p><a href="http://fathom.cc/">Ben Fry</a> and <a href="http://reas.com/">Casey Reas</a>, the initiators of the <a href="http://processing.org">Processing project</a>, announced at the <a href="http://eyeofestival.com">Eyeo Festival</a> that a n<a href="http://vimeo.com/28117873">ew version of Processing, Processing 2.0, will be released in the fall (VIDEO)</a>. This 2.0 release brings a lot of really exciting changes, including vastly improved 3D performance, and a brand-new high-performance video library. Perhaps most interesting is the addition of publishing modes &#8211; Processing sketches can now be published to other formats other than the standard Java applet. The mode that is going to cause the most buzz around the interweb is Javascript mode: yes, Processing sketches can now be published, with one click, to render in pretty much any web browser. This is very exciting news for those of us who use Processing for data visualization &#8211; it means that our sketches can reach a much broader audience, and that the visual power of Processing can be combined with the interactive power of Javascript.</p>
<p>While preview releases of Processing 2.0 will be available for download very soon, you don&#8217;t have to wait to experiment with Processing and Javascript. The upcoming JS mode comes thanks to the team behind <a href="http://processingjs.org">Processing.js</a>, and we can use it to build sketches for the browser right now.</p>
<p>To get started, you can <a href="http://blprnt.com/tutorials/PJStutorial.zip">download this sample file</a>. When you unzip the file, you&#8217;ll see a directory with three files &#8211; the index.html page, processing.js, and our sketch file, called tutorial.pde. If you open the sketch file in a text editor, you&#8217;ll see something like this:</p>
<pre class="brush: java; title: ; notranslate">
void setup() {
  //instructions in here happen once when the sketch is run
  size(500,500);
  background(0);
}

void draw() {
  //instructions in here happen over and over again
}
</pre>
<p>If you&#8217;re a Processing user, you&#8217;ll be familiar with the setup and draw enclosures. If you&#8217;re not, the notes inside of each one explain what&#8217;s going on: when we run the sketch, the size is set to 500px by 500px, and the background is set to black. Nothing is happening (yet) in the draw enclosure.</p>
<p>You can see this incredibly boring sketch run if you open the index.html file in your browser (this will work in Firefox and Safari, but not in Chrome due to security settings). </p>
<p>Processing.js is a fully-featured port of Processing &#8211; all of the things that you&#8217;d expect to be able to do in Processing without importing extra libraries can be done in Processing.js. Which, quite frankly, is amazing! This means that many of your existing sketches will run, with no changes, in the browser.</p>
<p>Since this is a data visualization tutorial, let&#8217;s look at a simple representation of numbers. To keep it simple, we&#8217;ll start with a set of numbers: 13.4, 14.5, 15.0, 23.2, 30.9, 31.3, 32.9 35.1, 34.3. (These numbers are obesity percentages in the U.S. population, between the 1960s and the present &#8211; but we&#8217;re really going to use them without context).</p>
<p>Typically, if we were to put these numbers into a Processing sketch, we&#8217;d construct an array of floating point numbers (numbers with a decimal place), which would look like this:</p>
<pre class="brush: java; title: ; notranslate">
float[] myNumbers = {13.4, 14.5, 15.0, 23.2, 30.9, 31.3, 32.9, 35.1, 34.3};
</pre>
<p>However, we&#8217;re not in Java-land anymore, so we can make use of Javascript&#8217;s easier syntax (one of the truly awesome things about Processing.js is that we can include JS in our sketches, inline):</p>
<pre class="brush: java; title: ; notranslate">
var numbers = [13.4, 14.5, 15.0, 23.2, 30.9, 31.3, 32.9, 35.1, 34.3];
</pre>
<p>Our .pde file, then, looks like this:</p>
<pre class="brush: java; title: ; notranslate">

var numbers = [13.4, 14.5, 15.0, 23.2, 30.9, 31.3, 32.9, 35.1, 34.3];

void setup() {
  //instructions in here happen once when the sketch is run
  size(500,500);
  background(0);
}

void draw() {
  //instructions in here happen over and over again
}
</pre>
<p>Now that we have our helpful list of numbers (called, cleverly, &#8216;numbers&#8217;), we can access any of the numbers using its <em>index</em>. Indexes in Processing (and Javascript) are zero-based, so to get the first number out of the list, we&#8217;d use numbers[0]. To get the fourth one, we&#8217;d use numbers[3]. Let&#8217;s use those two numbers to start doing some very (very) simple visualization. Indeed, the first thing we&#8217;ll do is to draw a couple of lines:</p>
<pre class="brush: java; title: ; notranslate">
var numbers = [13.4, 14.5, 15.0, 23.2, 30.9, 31.3, 32.9, 35.1, 34.3];

void setup() {
  //instructions in here happen once when the sketch is run
  size(500,500);
  background(0);

  //Draw two lines
  stroke(255);
  line(0, 50, numbers[0], 50);
  line(0, 100, numbers[4], 100);
}

void draw() {
  //instructions in here happen over and over again
}
</pre>
<p><a href="http://blog.blprnt.com/blog/blprnt/tutorial-processing-javascript-and-data-visualization/screen-shot-2011-09-02-at-8-23-32-pm" rel="attachment wp-att-1378"><img src="http://blog.blprnt.com/wp-content/uploads/2011/09/Screen-shot-2011-09-02-at-8.23.32-PM-500x498.png" alt="" title="Screen shot 2011-09-02 at 8.23.32 PM" width="500" height="498" class="alignnone size-medium wp-image-1378" /></a></p>
<p>OK. I&#8217;ll admit. That&#8217;s a pretty crappy sketch. But, we can build on it. Let&#8217;s start by making those lines into rectangles:</p>
<pre class="brush: java; title: ; notranslate">
var numbers = [13.4, 14.5, 15.0, 23.2, 30.9, 31.3, 32.9, 35.1, 34.3];

void setup() {
  //instructions in here happen once when the sketch is run
  size(500,500);
  background(0);

  //Draw two lines
  stroke(255);
  rect(0, 50, numbers[0], 20);
  rect(0, 100, numbers[4], 20);
}

void draw() {
  //instructions in here happen over and over again
}
</pre>
<p>At this point, I&#8217;m going to introduce my very best Processing friend, <a href="http://processing.org/reference/map_.html">the map() function</a>. What the map() function allows us to do is to adjust a number that exists in a certain range so that it fits into a new range. A good real-world example of this would be converting a number (0.5) that exists in a range between 0 and 1 into a percentage:</p>
<pre class="brush: java; title: ; notranslate">
50 = map(0.5, 0, 1, 0, 100);
</pre>
<p>We can take any number inside any range, and map it to a new range. Here are a few more easy examples:</p>
<pre class="brush: java; title: ; notranslate">
500 = map(5, 0, 10, 0, 1000);
0.25 = map(4, 0, 16, 0, 1);
PI = map(180, 0, 360, 0, 2 * PI);
</pre>
<p>In our sketch, the list of numbers that we&#8217;re using ranges from 13.4 to 34.3. This means that our rectangles are pretty short, sitting in the 500 pixel-wide sketch. So, let&#8217;s map those numbers to fit onto the width of our screen (minus 50 pixels as for a buffer):</p>
<pre class="brush: java; title: ; notranslate">
var numbers = [13.4, 14.5, 15.0, 23.2, 30.9, 31.3, 32.9, 35.1, 34.3];

void setup() {
  //instructions in here happen once when the sketch is run
  size(500,500);
  background(0);

  //Draw two rectangles
  rect(0, 50, map(numbers[0], 0, 34.3, 0, width - 50), 20);
  rect(0, 100, map(numbers[4], 0, 34.3, 0, width - 50),  20);
}

void draw() {
  //instructions in here happen over and over again
}
</pre>
<p>Two bars! Wee-hoo! Now, let&#8217;s use a simple loop to get all of our numbers on the screen (this time we&#8217;ll use the max() function to find the biggest number in our list):</p>
<pre class="brush: java; title: ; notranslate">
var numbers = [13.4, 14.5, 15.0, 23.2, 30.9, 31.3, 32.9, 35.1, 34.3];

void setup() {
  //instructions in here happen once when the sketch is run
  size(500,500);
  background(0);

  for (var i = 0; i &lt; numbers.length; i++) {
    //calculate the width of the bar by mapping the number to the width of the screen minus 50 pixels
    var w = map(numbers[i], 0, max(numbers), 0, width - 50);
    rect(0, i * 25, w, 20);
  }
}

void draw() {
  //instructions in here happen over and over again
}
</pre>
<p><a href="http://blog.blprnt.com/blog/blprnt/tutorial-processing-javascript-and-data-visualization/screen-shot-2011-09-02-at-8-40-04-pm" rel="attachment wp-att-1379"><img src="http://blog.blprnt.com/wp-content/uploads/2011/09/Screen-shot-2011-09-02-at-8.40.04-PM-500x498.png" alt="" title="Screen shot 2011-09-02 at 8.40.04 PM" width="500" height="498" class="alignnone size-medium wp-image-1379" /></a></p>
<p>We&#8217;re still firmly in Microsoft Excel territory, but we can use some of Processing&#8217;s excellent visual programming features to make this graph more interesting. For starters, let&#8217;s change the colours of the bars. Using the map() function again, we&#8217;ll colour the bars from red (for the smallest number) to yellow (for the biggest number):</p>
<pre class="brush: java; title: ; notranslate">
var numbers = [13.4, 14.5, 15.0, 23.2, 30.9, 31.3, 32.9, 35.1, 34.3];

void setup() {
  //instructions in here happen once when the sketch is run
  size(500,500);
  background(0);

  for (var i = 0; i &lt; numbers.length; i++) {
    //calculate the amount of green in the colour by mapping the number to 255 (255 red &amp;amp; 255 green = yellow)
    var c = map(numbers[i], min(numbers), max(numbers), 0, 255);
    fill(255, c, 0);
    //calculate the width of the bar by mapping the number to the width of the screen minus 50 pixels
    var w = map(numbers[i], 0, max(numbers), 0, width - 50);
  	rect(0, i * 25, w, 20);
  }
}

void draw() {
  //instructions in here happen over and over again
}
</pre>
<p><a href="http://blog.blprnt.com/blog/blprnt/tutorial-processing-javascript-and-data-visualization/screen-shot-2011-09-02-at-8-39-38-pm" rel="attachment wp-att-1380"><img src="http://blog.blprnt.com/wp-content/uploads/2011/09/Screen-shot-2011-09-02-at-8.39.38-PM-500x500.png" alt="" title="Screen shot 2011-09-02 at 8.39.38 PM" width="500" height="500" class="alignnone size-medium wp-image-1380" /></a></p>
<p>This process of mapping a number to be represented by a certain dimension (in this case, the width of the bars along with the colour) is the basic premise behind data visualization in Processing. Using this simple framework, we can map to a whole variety of dimensions, including size, position, rotation, and transparency. </p>
<p>As an example, here is the same system we saw above, rendered as a radial graph (note here that I&#8217;ve added a line before the loop that moves the drawing point to the centre of the screen; I&#8217;ve also changed the width of the bars to fit in the screen):</p>
<pre class="brush: java; title: ; notranslate">
var numbers = [13.4, 14.5, 15.0, 23.2, 30.9, 31.3, 32.9, 35.1, 34.3];

void setup() {
  //instructions in here happen once when the sketch is run
  size(500,500);
  background(0);

  //move to the center of the sketch before we draw our graph
  translate(width/2, height/2);
  for (var i = 0; i &lt; numbers.length; i++) {
    //calculate the amount of green in the colour by mapping the number to 255 (255 red &amp;amp; 255 green = yellow)
    var c = map(numbers[i], min(numbers), max(numbers), 0, 255);
    fill(255, c, 0);
    //calculate the width of the bar by mapping the number to the half the width of the screen minus 50 pixels
    var w = map(numbers[i], 0, max(numbers), 0, width/2 - 50);
  	rect(0, 0, w, 20);
  	//after we draw each bar, turn the sketch a bit
  	rotate(TWO_PI/numbers.length);
  }
}

void draw() {
  //instructions in here happen over and over again
}
</pre>
<p><a href="http://blog.blprnt.com/blog/blprnt/tutorial-processing-javascript-and-data-visualization/screen-shot-2011-09-02-at-8-48-30-pm" rel="attachment wp-att-1381"><img src="http://blog.blprnt.com/wp-content/uploads/2011/09/Screen-shot-2011-09-02-at-8.48.30-PM-500x498.png" alt="" title="Screen shot 2011-09-02 at 8.48.30 PM" width="500" height="498" class="alignnone size-medium wp-image-1381" /></a></p>
<p>So far we&#8217;ve been keeping things very simple. But the possibilities using Processing and Javascript are really exciting. It&#8217;s very easy to add interactivity, and it&#8217;s even possible to take advantage of Processing&#8217;s 3D functionality <strong>in the browser</strong>. </p>
<p>Here&#8217;s our numbers again, rendered in 3D (note the change to the size() function), with the rotation controlled by the mouse (via our new friend the map() function):</p>
<pre class="brush: java; title: ; notranslate">
var numbers = [13.4, 14.5, 15.0, 23.2, 30.9, 31.3, 32.9, 35.1, 34.3];

void setup() {
  //instructions in here happen once when the sketch is run
  size(500,500,P3D);
  background(0);

}

void draw() {
  //instructions in here happen over and over again
  background(0);
  //turn on the lights so that we see shading on the 3D objects
  lights();
  //move to the center of the sketch before we draw our graph
  translate(width/2, height/2);
  //Tilt about 70 degrees on the X axis - like tilting a frame on the wall so that it's on a table
  rotateX(1.2);
  //Now, spin around the Z axis as the mouse moves. Like spinning that frame on the table around its center
  rotateZ(map(mouseX, 0, width, 0, TWO_PI));
  for (var i = 0; i &lt; numbers.length; i++) {
    //calculate the amount of green in the colour by mapping the number to 255 (255 red &amp;amp; 255 green = yellow)
    var c = map(numbers[i], min(numbers), max(numbers), 0, 255);
    fill(255, c, 0);
    //calculate the height of the bar by mapping the number to the half the width of the screen minus 50 pixels
    var w = map(numbers[i], 0, max(numbers), 0, width/2 - 50);
    //move out 200 pixels from the center
  	pushMatrix();
  		translate(200, 0);
  		box(20,20,w);
  	popMatrix();
  	//after we draw each bar, turn the sketch a bit
  	rotate(TWO_PI/numbers.length);
  }
}
</pre>
<p>Thirty lines of code, and we have an interactive, 3D data visualization (you can see this sketch running inline in the header). Now, I understand that this isn&#8217;t the best use of 3D, and that we&#8217;re only visualizing a basic dataset, but the point here is to start to imagine the possibilities of using Processing with Javascript in the browser. </p>
<p>For starters, Javascript lets us <em>very</em> easily import data from any JSON source with no parsing whatsoever &#8211; this means we can create interactive graphics that load dynamic data on the fly (more on this in the next tutorial). On top of that, because we can write Javascript inline with our Processing code, and we can integrate external Javascript functions and libraries (lie JQuery) to our sketches, we can incorporate all kinds of advanced interactivity. </p>
<p>I suspect that the release of Processing 2.0 will lead to a burst of Javascript-based visualization projects being released on the web. In the meantime, we can use the basic template from this tutorial to work with Processing.js &#8211; have fun!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blprnt.com/blog/blprnt/tutorial-processing-javascript-and-data-visualization/feed</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>All The Names: Algorithmic Design and the 9/11 Memorial</title>
		<link>http://blog.blprnt.com/blog/blprnt/all-the-names</link>
		<comments>http://blog.blprnt.com/blog/blprnt/all-the-names#comments</comments>
		<pubDate>Fri, 10 Jun 2011 09:40:31 +0000</pubDate>
		<dc:creator>Jer</dc:creator>
				<category><![CDATA[Processing]]></category>
		<category><![CDATA[Project]]></category>
		<category><![CDATA[9/11]]></category>
		<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Computer Assisted Design]]></category>
		<category><![CDATA[New York]]></category>
		<category><![CDATA[World Trade Center]]></category>

		<guid isPermaLink="false">http://blog.blprnt.com/?p=1272</guid>
		<description><![CDATA[In late October, 2009, I received an e-mail from Jake Barton from Local Projects, titled plainly &#8216;Potential Freelance Job&#8217;. I read the e-mail, and responded with a reply in two parts: First, I would love to work on the project. Second, I wasn&#8217;t sure that it could be done. The project was to design an algorithm [...]]]></description>
			<content:encoded><![CDATA[<div>
<p><a rel="attachment wp-att-1277" href="http://blog.blprnt.com/blog/blprnt/all-the-names/picture-2-3"><img title="Picture 2" src="http://blog.blprnt.com/wp-content/uploads/2011/03/Picture-2-500x320.png" alt="" width="500" height="320" /></a></p>
<p>In late October, 2009, I received an e-mail from Jake Barton from <a href="http://localprojects.net/">Local Projects</a>, titled plainly &#8216;Potential Freelance Job&#8217;. I read the e-mail, and responded with a reply in two parts: First, I would love to work on the project. Second, I wasn&#8217;t sure that it could be done.</p>
<p>The project was to design an algorithm for placement of names on the 9/11 memorial in New York City. In architect <a href="http://en.wikipedia.org/wiki/Michael_Arad">Michael Arad</a>&#8216;s vision for the memorial, the names were to be laid according to where people were and who they were with when they died &#8211; not alphabetical, nor placed in a grid. Inscribed in bronze parapets, almost three thousand names would stream seamlessly around the memorial pools. Underneath this river of names, though, an arrangement would provide a meaningful framework; one which allows the names of family and friends to exist together. Victims would be linked through what Arad terms &#8216;meaningful adjacencies&#8217; &#8211; connections that would reflect friendships, family bonds, and <a href="http://www.fastcodesign.com/1663780/at-911-memorial-name-placements-reflect-bonds-between-victims-thanks-to-algorithm">acts of heroism</a>. through these connections, the memorial becomes a permanent embodiment of not only the many individual victims, but also of the relationships that were part of their lives before those tragic events.</p>
<p>Over several years, staff at the 9/11 Memorial Foundation undertook the painstaking process of collecting adjacency requests from the next of kin of the victims, creating a massive database of requested linkages. Often, several requests were made for each victim. There were more than one thousand adjacency requests in total, a complicated system of connections that all had to be addressed in the final arrangement. In mathematical terms, finding a layout that satisfied as many of these adjacency requests as possible is an optimization problem &#8211; a problem of finding the best solution among a myriad of possible ones. To solve this problem and to produce a layout that would give the Memorial Designers a structure to base their final arrangement of the names upon, we built a software tool in two parts: First, an arrangement algorithm that optimized this adjacency problem to find the best possible solution. And second, an interactive tool that allowed for human adjustment of the computer-generated layout.</p>
<p><strong>The Algorithm</strong></p>
<p>The solution for producing a solved layout for the names arrangement sat at the bottom of a precariously balanced stack of complex requirements.</p>
<p>First, there was the basic spatial problem &#8211; the names for each pool had to fit, evenly, into a set of 76 panels (18 panels per side plus one corner). 12 of these panels were irregularly shaped (the corners and the panels adjacent to the corners, as seen in the image at the top of this post). Because the names were to appear in one continuous flowing group around each pool, some names had to overlap between panels, crossing a thin, invisible expansion joint between the metal plates. This expansion joint was small enough it would fit in the space between many of the first and last names (or middle initials), but with certain combinations of letterforms (for example, a last name starting with a J, or a first name ending with a y), names were unable to cross this gap. As a result, the algorithm had to consider the typography of each name as it was placed into the layout.</p>
<p>Of course, the most challenging problem was to place the names within the panels while satisfying as many of the requested adjacencies as possible. There were more than 1200 adjacency requests that needed to be addressed. One of the first things that I did was to get an idea of how complex this network of relations was by building some radial maps:</p>
<p><a rel="attachment wp-att-1345" href="http://blog.blprnt.com/blog/blprnt/all-the-names/wtc_11_27__20_54_56"><img class="alignnone size-medium wp-image-1345" title="WTC_11_27__20_54_56" src="http://blog.blprnt.com/wp-content/uploads/2011/05/WTC_11_27__20_54_56-500x285.png" alt="" width="500" height="285" /></a></p>
<p>Clearly, there was a dense set of relations that needed to be considered. On top of that, the algorithm needed to be aware of the physical form of each of the names, since longer names could offer more space for adjacency than smaller ones. Because each person could have more than one adjacency request, there were groups of victims who were linked together into large clusters of relationship &#8211; the largest one of these contained more than 70 names. Here is a map of the adjacency clusters within one of the major groupings:</p>
<p><a rel="attachment wp-att-1344" href="http://blog.blprnt.com/blog/blprnt/all-the-names/adjacencymap_grouping1"><img class="alignnone size-medium wp-image-1344" title="AdjacencyMap_Grouping1" src="http://blog.blprnt.com/wp-content/uploads/2011/05/AdjacencyMap_Grouping1-500x285.png" alt="" width="500" height="285" /></a></p>
<p>On top of these crucial links between victim names, there were a set of larger groupings in which the names were required to be placed: affiliations (usually companies), and sub-affiliations (usually departments within companies). To complicate matters, many of the adjacency requests linked people in different affiliations and subaffiliations, so the ordering of these groupings had to be calculated in order to satisfy both the adjacency requests and the higher-level relationships.</p>
<p>At some point I plan on detailing the inner workings of the algorithm (built in <a href="http://www.processing.org">Processing</a>). For the time being, I&#8217;ll say that the total process is in fact a combination of several smaller routines: first, a clustering routine to make discrete sets of names in which the adjacency requests are satisfied. Second, a space filling process which places the clusters into the panels and fills available space with names from the appropriate groupings. Finally, there is a placement routine which manages the cross-panel names, and adjusts spacing within and between panels.</p>
<p>The end result from the algorithm is a layout which completes as many of the adjacency requests as completely as possible. With this system, we were able to produce layouts which satisfied more than 98% of the requested adjacencies.</p>
<p><strong>The Tool</strong></p>
<p>Early on in the project, it became clear that the final layout for the names arrangement would not come directly from the algorithm. While the computerized system was able to solve the logistical problems underlying the arrangement, it was not as good at addressing the myriad of aesthetic concerns. The final layout had to be reviewed by hand &#8211; the architects needed to be able to meticulously adjust spacing and placement so that the final layout would be precisely as they wanted it. With this in mind, we built a custom software tool which allowed the memorial team to make custom changes to the layout, while still keeping track of all of the adjacencies.</p>
<p><a rel="attachment wp-att-1333" href="http://blog.blprnt.com/blog/blprnt/all-the-names/wtc_full"><img title="WTC_Full" src="http://blog.blprnt.com/wp-content/uploads/2011/05/WTC_Full-500x314.png" alt="" width="500" height="314" /></a></p>
<p>The tool, again built in <a href="http://www.processing.org">Processing</a>, allowed users to view the layouts in different modes, easily move names within and between panels, get overall statistics about adjacency fulfillment, and export SVG versions of the entire system for micro-level adjustments in Adobe Illustrator. In the image above, we see an early layout for the South Pool. The colouring here represents two levels of grouping within the names. Main colour blocks represent affiliations, while shading within those colour blocks represents sub-affiliations. Below, we see a close-up view of a single panel, with several names placed in the &#8216;drawer&#8217; below. Names can be placed in that space when they need to be moved from one panel to another. Note that adjacency indications remain active while the names are in the drawer.</p>
<p><a rel="attachment wp-att-1332" href="http://blog.blprnt.com/blog/blprnt/all-the-names/wtc_drawer3"><img title="WTC_Drawer3" src="http://blog.blprnt.com/wp-content/uploads/2011/05/WTC_Drawer3-500x314.png" alt="" width="500" height="314" /></a></p>
<p>Other features were built in to make the process of finalizing the layout as easy as possible: users could search for individual names, as well as affiliations and sub-affiliations; a change-tracking system allowed users to see how a layout had changed over multiple saved versions, and a variety of interface options allowed for precise placement of names within panels. Here is a video of the tool in use, again using a preliminary layout for the South Pool:</p>
<p><iframe src="http://player.vimeo.com/video/23444105?title=0&amp;byline=0&amp;portrait=0" width="550" height="330" frameborder="0"></iframe></p>
<p><strong> Computer Assisted Design</strong></p>
<p>It would be misleading to say that the layout for the final memorial was produced by an algorithm. Rather, the underlying framework of the arrangement was solved by the algorithm, and humans used that framework to design the final result. This is, I think, a perfect example of something that I&#8217;ve believed in for a long time: we should let computers do what computers do best, and let humans do what humans do best. In this case, the computer was able to evaluate millions of possible solutions for the layout, manage a complex relational system, and track a large set of important variables and measurements. Humans, on the other hand, could focus on aesthetic and compositional choices. It would have been very hard (or impossible) for humans to do what the computer did. At the same time, it would have been very difficult to program the computer to handle the tasks that were completed with such dedication and precision by the architects and the memorial team.</p>
<p><strong>The Weight of Data</strong></p>
<p>This post has been a technical documentation of a very challenging project. Of course, on a emotional level, the project was also incredibly demanding. I was very aware throughout the process that the names that I was working with were the names of fathers and sons, mothers, daughters, best friends, and lovers.</p>
<p>Lawrence Davidson. Theresa Munson. Muhammadou Jawara. Nobuhiro Hayatsu. Hernando Salas. Mary Trentini.</p>
<p>In the days and months that I worked on the arrangement algorithm and the placement tool, I found myself frequently speaking these names out loud. Though I didn&#8217;t personally know anyone who was killed that day, I would come to feel a connection to each of them.</p>
<p>This project was a very real reminder that information carries weight. While names of the dead may be the heaviest data of all, almost every number or word we work with bears some link to a significant piece of the real world. It&#8217;s easy to download a data set &#8211; <a href="http://2010.census.gov/2010census/data/">census information</a>, <a href="http://earthquake.usgs.gov/regional/neic/">earthquake records</a>, <a href="http://www.guardian.co.uk/news/datablog/2011/jun/09/homelessness-england-data">homelessness figures </a>- and forget that the numbers represent real lives. As designers, artists, and researchers, we always need to consider the true source of data, and the moral responsibility which they carry.</p>
<p>Ultimately, my role in the construction of the memorial was a small, and largely invisible one. Rightly, visitors to the site will never know that an algorithm assisted in its design. Still, it is rewarding to think that my work with Local Projects has helped to add meaning to such an important monument.</p>
<p><a href="http://911memorial.org">The 9/11 Memorial</a> will be dedicated on September 11, 2011 and opens to the public with the reservation of a visitor pass on September 12th.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.blprnt.com/blog/blprnt/all-the-names/feed</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>Your Device: Your data. How to save your iPhone location data (and help researchers make the world a better place)</title>
		<link>http://blog.blprnt.com/blog/blprnt/your-device-your-data-how-to-save-your-iphone-location-data-and-help-researchers-make-the-world-a-better-place</link>
		<comments>http://blog.blprnt.com/blog/blprnt/your-device-your-data-how-to-save-your-iphone-location-data-and-help-researchers-make-the-world-a-better-place#comments</comments>
		<pubDate>Thu, 05 May 2011 04:03:50 +0000</pubDate>
		<dc:creator>Jer</dc:creator>
				<category><![CDATA[data]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[data activism]]></category>
		<category><![CDATA[data sovereignty]]></category>
		<category><![CDATA[itunes]]></category>
		<category><![CDATA[location data]]></category>

		<guid isPermaLink="false">http://blog.blprnt.com/?p=1286</guid>
		<description><![CDATA[An hour ago, Apple announced that it has released a patch for iOS and iTunes, which reduces the size of the location cache stored on your machine, and prevents an automatic back-up through iTunes. Good news, right? I don&#8217;t think so. Apple is still collecting this data, still getting this data from you, and still [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="attachment wp-att-1309" href="http://blog.blprnt.com/blog/blprnt/your-device-your-data-how-to-save-your-iphone-location-data-and-help-researchers-make-the-world-a-better-place/devicedata-2"><img class="alignnone size-full wp-image-1309" title="deviceData" src="http://blog.blprnt.com/wp-content/uploads/2011/05/deviceData1.png" alt="" width="550" height="300" /></a></p>
<p>An hour ago, <a href="http://www.macgasm.net/2011/05/04/apple-fixes-locationgate-ios-update/">Apple announced that it has released a patch for iOS and iTunes</a>, which reduces the size of the location cache stored on your machine, and prevents an automatic back-up through iTunes.</p>
<p>Good news, right?</p>
<p>I don&#8217;t think so. Apple is still collecting this data, still getting this data from you, and still using it. The only difference is that <strong>you can&#8217;t use your own data.</strong></p>
<p>Location data is extremely useful. That&#8217;s why Apple, Google, and Microsoft are collecting it. Over the last year, Apple has, intentionally or not, created what is likely the largest locational database ever. This is a hugely, massively, ridiculously useful database. And with this new update, Apple are the only ones who will be able to get their hands on it. I believe that our data should be&#8230; well, our data. We should be able to store it securely, explore it, and use it for any purposes that we might choose. This data would be extraordinarily useful for researchers &#8211; people studying how diseases spread, trying to solve traffic-flow problems, and researching human mobility.</p>
<p>With all of this in mind, some colleagues and I have been working on a project for the last week called <a href="http://openpaths.cc">openpaths.cc</a>. It lets you upload your location data from your iDevice, securely store it, explore it via a map interface, and we&#8217;ll eventually offer you a system to directly donate your data to well-deserving research projects.</p>
<p><a rel="attachment wp-att-1306" href="http://blog.blprnt.com/blog/blprnt/your-device-your-data-how-to-save-your-iphone-location-data-and-help-researchers-make-the-world-a-better-place/picture-13"><img class="alignnone size-medium wp-image-1306" title="Picture 13" src="http://blog.blprnt.com/wp-content/uploads/2011/05/Picture-13-500x346.png" alt="" width="500" height="346" /></a></p>
<p>We&#8217;re pushing this project out quickly in hopes that we can gather as many location files as we can before people upgrade iOS and iTunes.</p>
<p><strong>Visit <a href="http://openpaths.cc">openpaths.cc</a> now to upload, explore, and securely store your iDevice location data.</strong></p>
<p>We are existing a world where data is being collected about us on a massive scale. This data is currently being stored, analyzed and monetized by corporations &#8211; there is little or no agency for the people to whom the data actually belongs. I believe that grass-roots initiatives like openpaths.cc can provide a framework for how data sovereignty can be established and managed.</p>
<p>In the short term, I am hoping we can collect and store enough locational data to be of use to researchers. So please, before you upgrade iOS and iTunes, visit <a href="http://openpaths.cc">openpaths.cc</a> and make your own data your own data. And please (please) &#8211; pass this on.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blprnt.com/blog/blprnt/your-device-your-data-how-to-save-your-iphone-location-data-and-help-researchers-make-the-world-a-better-place/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Random Number Multiples</title>
		<link>http://blog.blprnt.com/blog/blprnt/random-number-multiples</link>
		<comments>http://blog.blprnt.com/blog/blprnt/random-number-multiples#comments</comments>
		<pubDate>Wed, 02 Feb 2011 00:09:49 +0000</pubDate>
		<dc:creator>Jer</dc:creator>
				<category><![CDATA[Exhibition]]></category>
		<category><![CDATA[artwork]]></category>
		<category><![CDATA[dataviz]]></category>
		<category><![CDATA[prints]]></category>
		<category><![CDATA[screenprints]]></category>

		<guid isPermaLink="false">http://blog.blprnt.com/?p=1261</guid>
		<description><![CDATA[About seven years ago, I had a bit of a career crisis. I was freelancing &#8211; working for clients I didn&#8217;t care much about on projects that I didn&#8217;t care much about, and feeling that there was a huge distance between the work that I was creating and my physical self. I was sick of [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Random Number Multiples - RGB by blprnt_van, on Flickr" href="http://www.flickr.com/photos/blprnt/5363621051/"><img src="http://farm6.static.flickr.com/5203/5363621051_0b22192093.jpg" alt="Random Number Multiples - RGB" width="500" height="375" /></a></p>
<p>About seven years ago, I had a bit of a career crisis. I was freelancing &#8211; working for clients I didn&#8217;t care much about on projects that I didn&#8217;t care much about, and feeling that there was a huge distance between the work that I was creating and my physical self. I was sick of computers, and was considering a range of (in hindsight) ridiculous vocational changes.</p>
<p>My rescue didn&#8217;t come from a new programming language, or a faster computer, or even better clients. It came, instead, from a return to the physical. I learned how to screenprint, and made rock posters for local bands, out of my living room. Every weekend, a friend and I would rack paper, pull squeegees, make an enormous mess &#8211; and escape from all of our pixel-based problems. We kept it up for a few years; after I moved into a larger, cleaner, less ink-friendly place I put my screens into storage. Even though I stopped printing, that time I spent screenprinting turned the rest of my career in a more creative direction.</p>
<p>Imagine how happy I was, then, to be asked by curator <a href="http://randomnumber.nu/">Christina Vassallo</a> to be part of the inaugural edition of her <a href="http://randomnumber.nu/?cat=21">Random Number Multiple</a> series &#8211; a project that would produce screenprints from the work of computational artists and designers. Even better, this first edition would pair me with Marius Watz, an artist who has been a huge inspiration to me over the years, and whose work is exceptional in every way.</p>
<p>Marius and Christina and I spent three days at <a href="http://www.bushwickprintlab.org/">Bushwick Print Lab</a> printing each of the 200 prints by hand. It was a fantastic experience, and the results, I think, speak for themselves. Marius&#8217; prints are explosions of colour, vivid, dramatic pseudo-random that really capture the eye:</p>
<p><a href="http://www.flickr.com/photos/watz/5386696682/" title="RN Multiples 5146 Marius Watz - Arcs04-01 by watz, on Flickr"><img src="http://farm6.static.flickr.com/5218/5386696682_5366d9f0e8.jpg" width="500" height="333" alt="RN Multiples 5146 Marius Watz - Arcs04-01" /></a></p>
<p>I made two prints. Both are abstractions of my word frequency visualizations that I created using Processing and the NYTimes Article Search API. The first, titled &#8216;RGB &#8211; NYT Word Frequency&#8217;, shows usage of the words &#8216;red&#8217;, &#8216;green&#8217;, &#8216;blue&#8217; in the Times between 1981 and 2011 (you can see a series of details from the print <a href="http://randomnumber.nu/?p=2899">here</a>):</p>
<p><a title="Jer Thorp, &quot;RGB - NYTimes Word Frequencies&quot; by Christina Vassallo, on Flickr" href="http://www.flickr.com/photos/randomnumbernu/5362872334/"><img src="http://farm6.static.flickr.com/5209/5362872334_1969794255.jpg" alt="Jer Thorp, &quot;RGB - NYTimes Word Frequencies&quot;" width="500" height="333" /></a></p>
<p><a title="Random Number Multiples - RGB by blprnt_van, on Flickr" href="http://www.flickr.com/photos/blprnt/5364236536/"><img src="http://farm6.static.flickr.com/5001/5364236536_74ee5ec5ce.jpg" alt="Random Number Multiples - RGB" width="375" height="500" /></a></p>
<p>This print turned out even better than I could have expected. The fine detail is amazing, the colours are rich and vivid, and the half-toning on the individual bars creates a jewel-like halo in the center that is fascinating to look at up close.</p>
<p>My second print visualizes the terms &#8216;hope&#8217; and &#8216;crisis&#8217; over the same time period (again, more detailed views can be found <a href="http://randomnumber.nu/?p=2904">here</a>). This print was made with a semi-reflective ink, so it has a unique shimmer to it when viewed in the light:</p>
<p><a title="RN Multiples 5235 Jer Thorp, Hope-Crisis by watz, on Flickr" href="http://www.flickr.com/photos/watz/5397099298/"><img src="http://farm6.static.flickr.com/5171/5397099298_36f561d0af.jpg" alt="RN Multiples 5235 Jer Thorp, Hope-Crisis" width="500" height="333" /></a></p>
<p>Overall, I was surprised and delighted by how well this computer-generated work translated to the traditional medium of screenprint. I will definitely be looking to make more prints in the future.</p>
<p>In the meantime, a limited number of both of these prints are available for sale at on the <a href="http://randomnumber.nu/?cat=21">Random Number Multiples</a> site. Prints are $100, made with entirely acid-free media, and ship with a signed certificate of authenticity.</p>
<p><a title="Random Number Multiples - RGB by blprnt_van, on Flickr" href="http://www.flickr.com/photos/blprnt/5363618125/"><img src="http://farm6.static.flickr.com/5003/5363618125_c78db9bd12.jpg" alt="Random Number Multiples - RGB" width="500" height="375" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blprnt.com/blog/blprnt/random-number-multiples/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Angry Birds &amp; Box2D: An Open Source Holiday Wish</title>
		<link>http://blog.blprnt.com/blog/blprnt/angry-birds-box2d-an-opensource-holiday-wish</link>
		<comments>http://blog.blprnt.com/blog/blprnt/angry-birds-box2d-an-opensource-holiday-wish#comments</comments>
		<pubDate>Mon, 13 Dec 2010 23:14:05 +0000</pubDate>
		<dc:creator>Jer</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[angrybirds]]></category>
		<category><![CDATA[box2d]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[rovio]]></category>

		<guid isPermaLink="false">http://blog.blprnt.com/?p=1229</guid>
		<description><![CDATA[I have been spending far too much of my time over the last week or so playing Angry Birds. It&#8217;s a simple, clever, and addictive game which seems to have captivated large part of the human population (just yesterday, I heard a woman on the subway exclaim: &#8220;Take that, you %$!# pigs!&#8221;). Along with immense [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="attachment wp-att-1239" href="http://blog.blprnt.com/blog/blprnt/angry-birds-box2d-an-opensource-holiday-wish/boxbirds"><img class="alignnone size-medium wp-image-1239" title="boxbirds" src="http://blog.blprnt.com/wp-content/uploads/2010/12/boxbirds-500x248.png" alt="" width="500" height="248" /></a></p>
<p>I have been spending far too much of my time over the last week or so playing <a href="http://www.rovio.com/index.php?page=angry-birds">Angry Birds</a>. It&#8217;s a simple, clever, and addictive game which seems to have captivated large part of the human population (just yesterday, I heard a woman on the subway exclaim: &#8220;Take that, you %$!# pigs!&#8221;). Along with immense popularity, the game has also brought in millions upon millions of dollars for <a href="http://www.rovio.com/">Rovio</a>, the Finnish game company who created the concept and built the game. Though exact figures are unclear, the game has had upwards of 50M downloads, and brings in $1M per month in ad revenue alone. It&#8217;s likely that Angry Birds has made upwards of 100 million dollars.</p>
<p>For those that haven&#8217;t played, the gameplay is straight-forward: you launch birds out of a slingshot, in an attempt to collapse structures that are protecting egg-thieving pigs (it&#8217;s more fun that it sounds). A large part of the effectiveness of the game comes from the fact that these structures &#8211; built from blocks, triangles, and cylinders of various materials, react with realistic physics; the blocks knock each other over, the cylinders roll down hills, and the triangles act as convenient ramps.</p>
<p><del>I can&#8217;t say this for sure, but it&#8217;s very very likely that </del>Angry Birds is built on top of Erin Catto&#8217;s excellent <a href="http://www.box2d.org/">Box2D</a> physics engine. Box2D is a set of libraries for C++ which makes it easy to build rigid body physics simulations &#8211; <a href="http://www.wired.com/wiredscience/2010/10/physics-of-angry-birds/">which is, essentially, what Angry Birds is</a>. <em>[EDIT: It has been confirmed that Angry Birds does in fact use Box2D]</em></p>
<p>Box2D is released with a very liberal open source license &#8211; it can basically be used by anyone, for anything. The only requirement is that, if and when source is released, the code has to be attributed to Erin, and can&#8217;t be claimed as original. There is absolutely no legal requirement for anyone using Box2D to pay for it in any way.</p>
<p>But is there an ethical requirement? The founders of Rovio are very, very, very rich men &#8211; thanks to Angry Birds. If, indeed, Angry Birds relies as heavily on Box2D as I suspect, they are also very, very, very rich men thanks to Erin and Box2D.</p>
<p>I&#8217;ve often thought of open source as a gratitude economy &#8211; people maintain and distribute projects largely because they are fueled by the thanks that they receive. By releasing Box2D with such a generous license, Erin Catto was clearly aware that he wouldn&#8217;t be profiting from its use. Likely, he&#8217;s been happy seeing his project used in so many interesting ways. I can&#8217;t imagine that he ever expected someone to make such a ridiculous fortune from his code, on the scale of Rovio and Angry Birds.</p>
<p>Of course, Rovio <del>may have built their own physics engine for Angry Birds. And, even if they didn&#8217;t, they </del>are perfectly within their rights to keep every penny, and not say a word about Erin or about Box2D.</p>
<p>With Christmas just around the corner, though, I can&#8217;t help but imagine an ideal world &#8211; in which Erin Catto receives some kind of an unexpected bonus. An open source holiday wish?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blprnt.com/blog/blprnt/angry-birds-box2d-an-opensource-holiday-wish/feed</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>tree.growth.redux</title>
		<link>http://blog.blprnt.com/blog/blprnt/tree-growth-redux</link>
		<comments>http://blog.blprnt.com/blog/blprnt/tree-growth-redux#comments</comments>
		<pubDate>Sun, 28 Nov 2010 16:06:34 +0000</pubDate>
		<dc:creator>Jer</dc:creator>
				<category><![CDATA[Science & Creativity]]></category>
		<category><![CDATA[christian flaccus]]></category>
		<category><![CDATA[print]]></category>
		<category><![CDATA[tree.growth]]></category>

		<guid isPermaLink="false">http://blog.blprnt.com/?p=1218</guid>
		<description><![CDATA[Munich designer Christian Flaccus used my tree.growth source code to create this amazing print, which includes, along with a hugely detailed tree, all of the Processing code used to render the tree. It&#8217;s giant &#8211; about 84 x 120cm, and is printed at 400dpi. Digital artists talk a lot about preservation techniques for flaky digital [...]]]></description>
			<content:encoded><![CDATA[<p><a title="tree.growth.redux by Christian Flaccus by blprnt_van, on Flickr" href="http://www.flickr.com/photos/blprnt/5214863982/"><img src="http://farm6.static.flickr.com/5002/5214863982_a9105a0f09.jpg" alt="tree.growth.redux by Christian Flaccus" width="354" height="500" /></a></p>
<p>Munich designer <a href="http://www.schoeneneuekinder.de/">Christian Flaccus</a> used my <a href="http://blog.blprnt.com/source-code-tutorial">tree.growth source code</a> to create this amazing print, which includes, along with a hugely detailed tree, all of the Processing code used to render the tree. It&#8217;s giant &#8211; about 84 x 120cm, and is printed at 400dpi.</p>
<p>Digital artists talk a lot about preservation techniques for flaky digital storage media &#8211; and indeed a solution that comes up fairly often is to transfer the code onto a much more permanent, more archive-friendly medium &#8211; paper. So I suppose this poster serves as an archive as well &#8211; I&#8217;ll hope that Christian takes good care of it.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blprnt.com/blog/blprnt/tree-growth-redux/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

