<?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>zachary::witte</title>
	<atom:link href="http://www.zacwitte.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.zacwitte.com</link>
	<description>code, art, algorithms, and leisure</description>
	<lastBuildDate>Mon, 30 Aug 2010 03:04:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Getting Wikipedia Summary from the Page ID</title>
		<link>http://www.zacwitte.com/getting-wikipedia-summary-from-the-page-id</link>
		<comments>http://www.zacwitte.com/getting-wikipedia-summary-from-the-page-id#comments</comments>
		<pubDate>Mon, 30 Aug 2010 03:04:23 +0000</pubDate>
		<dc:creator>zac</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.zacwitte.com/?p=91</guid>
		<description><![CDATA[While working on my forthcoming checkin.to project, I needed to use the MediaWiki API to get the summary paragraph of wikipedia articles pertaining to places. Checkin.to relies on the Yahoo Where On Earth Identifiers (woeid). Yahoo also conveniently offers a concordance API so from the woeid I get the Geonames ID and the Wikipedia page [...]]]></description>
			<content:encoded><![CDATA[<p>While working on my forthcoming <a href="http://checkin.to" target="_blank">checkin.to</a> project, I needed to use the <a href="http://www.mediawiki.org/wiki/API" target="_blank">MediaWiki API</a> to get the summary paragraph of wikipedia articles pertaining to places. <a href="http://checkin.to">Checkin.to</a> relies on the Yahoo <a href="http://developer.yahoo.com/geo/geoplanet/guide/concepts.html#woeids" target="_blank">Where On Earth Identifiers</a> (woeid). Yahoo also conveniently offers a <a href="http://developer.yahoo.com/geo/geoplanet/guide/api-reference.html#api-concordance" target="_blank">concordance API</a> so from the woeid I get the Geonames ID and the Wikipedia page ID among other things. As far as I can tell, the MediaWiki API doesn&#8217;t allow you to request page content using the page ID so the first step here is to resolve the page id into a unique page title. This can be done using the query action like so:</p>
<p><a href="http://en.wikipedia.org/w/api.php?action=query&amp;pageids=49728&amp;format=json" target="_blank">http://en.wikipedia.org/w/api.php?action=query&amp;pageids=49728&amp;format=json</a></p>
<p>It gives a response resembling:</p>
<pre>{"query":{"pages":{"49728":{"pageid":49728,"ns":0,"title":"San Francisco"}}}}</pre>
<p>Step 2 is to get the actual page content. There are a variety of formats available including the raw wiki markup, but for my purpose the formatted HTML is much more useful. We also need to convert the spaces in the page title to underscores. The request looks like this:</p>
<p><a href="http://en.wikipedia.org/w/api.php?action=parse&amp;prop=text&amp;page=San_Francisco&amp;format=json" target="_blank">http://en.wikipedia.org/w/api.php?action=parse&amp;prop=text&amp;page=San_Francisco&amp;format=json</a></p>
<p>And a response resembling:</p>
<pre>{"parse":{"text":{"*":"&lt;div class=\"dablink\"&gt;This article is about the place in California. [...] "}}}</pre>
<p>Step 3 is to parse the resulting article html and extract just the first body paragraph which typically summarizes the whole article. The problem here is that a bunch of other stuff including all the sidebar content comes before the first body paragraph and that other stuff itself can include p tags. jQuery is a big help here, as usual. First, lets wrap the entire resulting wiki page in a div element to give everything a root. Then we can first just the simplings of that wrapper element to find the first root level p tag.</p>
<pre>wikipage = $("&lt;div&gt;"+data.parse.text['*']+"&lt;div&gt;").children('p:first');</pre>
<p>Below I have the entire resulting function that goes from page id to summary paragraph and appends it to a &lt;div&gt; somewhere in my DOM called #wiki_container. I also perform some optional cleanup including removing citations, updating the relative hrefs to absolute hrefs pointing to http://en.wikipedia.org, and adding a read more link.</p>
<pre>function getAreaMetaInfo_Wikipedia(page_id) {
  $.ajax({
    url: 'http://en.wikipedia.org/w/api.php',
    data: {
      action:'query',
      pageids:page_id,
      format:'json'
    },
    dataType:'jsonp',
    success: function(data) {
      title = data.query.pages[page_id].title.replace(' ','_');
      $.ajax({
        url: 'http://en.wikipedia.org/w/api.php',
        data: {
          action:'parse',
          prop:'text',
          page:title,
          format:'json'
        },
        dataType:'jsonp',
        success: function(data) {
          wikipage = $("&lt;div&gt;"+data.parse.text['*']+"&lt;div&gt;").children('p:first');
          wikipage.find('sup').remove();
          wikipage.find('a').each(function() {
            $(this)
              .attr('href', 'http://en.wikipedia.org'+$(this).attr('href'))
              .attr('target','wikipedia');
          });
          $("#wiki_container").append(wikipage);
          $("#wiki_container").append("&lt;a href='http://en.wikipedia.org/wiki/"+title+"' target='wikipedia'&gt;Read more on Wikipedia&lt;/a&gt;");
        }
      });
    }
  });
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.zacwitte.com/getting-wikipedia-summary-from-the-page-id/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A continuous, blocking python interface for streaming Flickr photos</title>
		<link>http://www.zacwitte.com/a-continuous-blocking-python-interface-for-streaming-flickr-photos</link>
		<comments>http://www.zacwitte.com/a-continuous-blocking-python-interface-for-streaming-flickr-photos#comments</comments>
		<pubDate>Wed, 07 Jul 2010 02:11:26 +0000</pubDate>
		<dc:creator>zac</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.zacwitte.com/blog/a-continuous-blocking-python-interface-for-streaming-flickr-photos/</guid>
		<description><![CDATA[As I explained in my last post, Yahoo! claims their Firehose is a real-time streaming API and it&#8217;s not. So to make life a bit easier for app developers I wrote a python wrapper that provides a continuous blocking interface to the Flickr polling API. Effectively it emulates a streaming API by stringing together frequent [...]]]></description>
			<content:encoded><![CDATA[<p>As I explained in my last post, Yahoo! claims their Firehose is a real-time streaming API and it&#8217;s not. So to make life a bit easier for app developers I wrote a python wrapper that provides a continuous blocking interface to the Flickr polling API. Effectively it emulates a streaming API by stringing together frequent requests to the flickr.photos.getRecent results. And it&#8217;s dead simple.</p>
<pre>
import PyFlickrStreamr

fs = PyFlickrStreamr('your_api_key_here', extras=['date_upload','url_m'])
for row in fs:
    print str(row['id'])+"   "+row['url_m']
</pre>
<p>You can download the package from <a href="http://packages.python.org/PyFlickrStreamr" target="_blank">pypi</a> or fork the source code on <a href="http://github.com/zacwitte/PyFlickrStreamr" target="_blank">github</a>. Have fun.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zacwitte.com/a-continuous-blocking-python-interface-for-streaming-flickr-photos/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Yahoo Firehose &quot;feed&quot; isn&#8217;t a feed at all</title>
		<link>http://www.zacwitte.com/the-yahoo-firehose-feed-isnt-a-feed-at-all</link>
		<comments>http://www.zacwitte.com/the-yahoo-firehose-feed-isnt-a-feed-at-all#comments</comments>
		<pubDate>Fri, 02 Jul 2010 20:56:45 +0000</pubDate>
		<dc:creator>zac</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[real-time]]></category>
		<category><![CDATA[stream]]></category>
		<category><![CDATA[yahoo]]></category>
		<category><![CDATA[YQL]]></category>

		<guid isPermaLink="false">http://www.zacwitte.com/?p=58</guid>
		<description><![CDATA[The web has been on a big trend of real-time for the past couple years. Friendfeed was one of the first services to show real-time updates across your social network and real-time feeds took the stage in a big way when Twitter started its streaming API. In April, Yahoo! announced it&#8217;s Firehose API claiming &#8220;it [...]]]></description>
			<content:encoded><![CDATA[<p>The web has been on a big trend of real-time for the past couple years. Friendfeed was one of the first services to show real-time updates across your social network and real-time feeds took the stage in a big way when Twitter started its <a href="http://developer.twitter.com/pages/streaming_api" target="_blank">streaming API</a>. In April, <a href="http://developer.yahoo.net/blog/archives/2010/04/yahoo_updates_firehose.html" target="_blank">Yahoo! announced it&#8217;s Firehose API</a> claiming &#8220;it includes a real-time feed of every public action taken on our network&#8221;. The thing is, this isn&#8217;t a &#8220;feed&#8221; or a &#8220;stream&#8221; in the same sense that Twitter&#8217;s streaming API is. It&#8217;s a database you can poll with Yahoo&#8217;s YQL, an SQL like query language. Sure, the updates may be available in their database in near real-time, but to receive them you need to issue a new request. In fact the only way you know if there are updates is to continuously poll the service. A feed would be something like long-polling with <a href="http://en.wikipedia.org/wiki/Push_technology#HTTP_server_push" target="_blank">HTTP server push</a> (what twitter does) or <a href="http://code.google.com/p/pubsubhubbub/" target="_blank">PubSubHubbub</a>.</p>
<p>It may be just semantics to some, but this bothers me. To those of us who build applications that publish or consumer real-time information this is a very important distinction. I plan on writing a python library that wraps flickr&#8217;s polling API into a &#8220;real-time&#8221; blocking continuous stream for a project I&#8217;m working on. I&#8217;ll publish the code on github and post it here when done.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zacwitte.com/the-yahoo-firehose-feed-isnt-a-feed-at-all/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resolving HTTP Redirects in Python</title>
		<link>http://www.zacwitte.com/resolving-http-redirects-in-python</link>
		<comments>http://www.zacwitte.com/resolving-http-redirects-in-python#comments</comments>
		<pubDate>Sun, 09 May 2010 02:47:48 +0000</pubDate>
		<dc:creator>zac</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.zacwitte.com/?p=55</guid>
		<description><![CDATA[Since everyone is using short urls these days and sometimes we just need to know where that URL leads I wrote this handy little function which finds out for us. Redirection can be a kind of tricky thing. We have 301 (&#8220;permanent&#8221;) and 302 (&#8220;temporary&#8221;) style status codes and multiple layers of redirection. I think [...]]]></description>
			<content:encoded><![CDATA[<p>Since everyone is using short urls these days and sometimes we just need to know where that URL leads I wrote this handy little function which finds out for us. Redirection can be a kind of tricky thing. We have 301 (&#8220;permanent&#8221;) and 302 (&#8220;temporary&#8221;) style status codes and multiple layers of redirection. I think the simplest approach to take is whenever the server returns a Location http header and the value in that location field is not the same as what you made the request to, we can pretty well be sure that it&#8217;s a redirect. The function below uses the http HEAD verb/method to request only the headers so as not to waste bandwidth and recursively calls itself until it gets a non-redirecting result. As a safeguard against infinite recursion I have a depth counter.</p>
<pre>
import urlparse
import httplib

# Recursively follow redirects until there isn't a location header
def resolve_http_redirect(url, depth=0):
    if depth > 10:
        raise Exception("Redirected "+depth+" times, giving up.")
    o = urlparse.urlparse(url,allow_fragments=True)
    conn = httplib.HTTPConnection(o.netloc)
    path = o.path
    if o.query:
        path +='?'+o.query
    conn.request("HEAD", path)
    res = conn.getresponse()
    headers = dict(res.getheaders())
    if headers.has_key('location') and headers['location'] != url:
        return resolve_http_redirect(headers['location'], depth+1)
    else:
        return url
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.zacwitte.com/resolving-http-redirects-in-python/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simple Skew Animation with ActionScript 3</title>
		<link>http://www.zacwitte.com/simple-skew-animation-with-actionscript-3</link>
		<comments>http://www.zacwitte.com/simple-skew-animation-with-actionscript-3#comments</comments>
		<pubDate>Thu, 29 Apr 2010 21:33:40 +0000</pubDate>
		<dc:creator>zac</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[actionscript]]></category>

		<guid isPermaLink="false">http://www.zacwitte.com/?p=48</guid>
		<description><![CDATA[I couldn&#8217;t find any good examples on simple tween of a skew effect in actionscipt 3 so I thought I&#8217;d share what I came up with. The problem is that skew is not a property on the MovieClip like x or height or others you&#8217;re used to tweening with fl.transitions. To apply a skew effect [...]]]></description>
			<content:encoded><![CDATA[<p>I couldn&#8217;t find any good examples on simple tween of a skew effect in actionscipt 3 so I thought I&#8217;d share what I came up with.</p>
<p>The problem is that skew is not a property on the MovieClip like x or height or others you&#8217;re used to tweening with fl.transitions. To apply a skew effect in AS3 you need to use a matrix transform like this:</p>
<pre>    import flash.geom.Matrix;
    var matrix:Matrix = new Matrix();
    matrix.b = _y * Math.PI/180;
    matrix.c = _x * Math.PI/180;
    matrix.concat(target.transform.matrix);
    my_mc.transform.matrix = matrix;
</pre>
<p>or</p>
<pre>    import flash.geom.Matrix;
    var matrix:Matrix = new Matrix(1, _y * Math.PI/180, _x * Math.PI/180, 1, 0, 0);
    my_mc.transform.matrix = matrix;
</pre>
<p>where _y or _x is the skew angle in radians. Unfortunately when you update a property of the transform matrix like</p>
<pre>my_mc.transform.matrix.b = _y * Math.PI/180;</pre>
<p>it doesn&#8217;t update the movieclip. You need to actually re-assign the matrix to trigger an update. So you can&#8217;t simply tween the my_mc.transform.matrix.b directly. Here&#8217;s my solution.</p>
<pre>    import fl.transitions.Tween;
    import fl.transitions.easing.*;
    import fl.transitions.TweenEvent;
    import flash.geom.Matrix;

    var mymatrix:Matrix = new Matrix(1,0,0,1,0,0);

    function reassignMatrix(e:TweenEvent) {
        bg.transform.matrix = mymatrix;
    }

    var bgTweenSkew = new Tween(mymatrix, 'b', Regular.easeOut, mymatrix.b, Math.tan(_y * (Math.PI/180)), 10);
    bgTweenSkew.addEventListener(TweenEvent.MOTION_CHANGE, reassignMatrix);
</pre>
<p>Note this will overwrite the scale and rotation properties, which are a part of the transform matrix. See <a href="http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7dcb.html" target="_blank">the Adobe livedocs</a> for more information.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zacwitte.com/simple-skew-animation-with-actionscript-3/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Three Alternative Inputs for Video Games</title>
		<link>http://www.zacwitte.com/three-alternative-inputs-for-video-games</link>
		<comments>http://www.zacwitte.com/three-alternative-inputs-for-video-games#comments</comments>
		<pubDate>Fri, 09 Apr 2010 10:21:00 +0000</pubDate>
		<dc:creator>zac</dc:creator>
				<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[eye tracking]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[human-computer interaction]]></category>
		<category><![CDATA[voice control]]></category>

		<guid isPermaLink="false">http://www.zacwitte.com/?p=42</guid>
		<description><![CDATA[When you use a computer enough it can start to feel like the mouse becomes a part of you. Very quickly you forget about consciously moving it right or left to control the cursor as it becomes second nature. Essentially it is an extension of your physical self, with which you manipulate the screen as [...]]]></description>
			<content:encoded><![CDATA[<p>When you use a computer enough it can start to feel like the mouse becomes a part of you. Very quickly you forget about consciously moving it right or left to control the cursor as it becomes second nature. Essentially it is an extension of your physical self, with which you manipulate the screen as naturally as you pick up an object with your hand. Combined with a keyboard it is the only form of input for most &#8216;serious&#8217; video games in the home because of the level of precision required. I think there are other forms of input that can be used in conjunction with traditional mouse and keyboard for a much richer, more immersive experience.</p>
<ol>
<li>Eye tracking</li>
<li>Voice control</li>
<li>Video gestures</li>
</ol>
<p><span style="text-decoration: underline;"><strong>Eye tracking</strong></span> has been employed in usability and behavioral studies for over a decade, but it has so far been demonstrated only in a very limited sense for actual control input. These two videos demonstrate eye tracking as used for <a href="http://www.youtube.com/watch?v=3pRWYE2LRhk&amp;feature=related" target="_blank">controlling camera movement</a> instead of the mouse and <a href=" http://www.youtube.com/watch?v=lGehsY7pcrc&amp;feature=related " target="_blank">aim</a> instead of what would normally be a physical gun in an arcade.</p>
<p>In the case of a free camera the player moves the camera by looking towards the edge of the screen. When the eyes are centered the camera is still. This is the same kind of control that a joystick uses. Without having tried it myself, I feel like it could be unintuitive because when we look at something we don&#8217;t expect it to move away. With the second example you can see that with a fixed camera in place of a physical gun, eye tracking is quite effective, but I don&#8217;t see any major advantages over the traditional method.</p>
<p>In first person shooters I feel the best combination will be mouse for camera control and eye tracking for aim. When you look at something on the screen it doesn&#8217;t move away &#8211; you shoot precisely where you look. Gamers can use the same intuitive interface they&#8217;re already used to for moving the character around and firing the weapon. For the quickest, most precise control of aiming, the lighting fast twitch reflex of eye movement is perfect and, in fact, is something players already do.</p>
<p>In 2005, Erika Jonsson of the Royal Institute of Technology in Sweden conducted a study of the methods I described and arrived at similar conclusions:</p>
<blockquote style="font-style: italic;"><p>The result showed that interaction with the eyes is very fast, easy to learn and perceived to be natural and relaxed. According to the usability study, eye control can provide a more fun and committing gaming experience than ordinary mouse control. Eye controlled computer games is a very new area that needs to be further developed and evaluated. The result of this study suggests that eye based interaction may be very successful in computer games.</p></blockquote>
<p>The problems facing this method are primarily the cost of hardware. Current technologies are used in a limited fashion with academics and usability studies and are generally not available in the mass market. Accurate eye tracking is apparently not an easy thing to do. I&#8217;m guessing that, were there a serious market opportunity, some enterprising group of young researchers could simplify the hardware and prepare it for mass production, bringing costs down to reasonable levels for a luxury product.</p>
<p><span style="text-decoration: underline;"><strong>Voice control</strong></span> can be used for high level commands that might otherwise be accessed from menus or other complex key commands. By using voice it saves the player from having to break from the immersive experience of controlling the character. It has the additional side effect of engaging other parts of the brain and encourages more realistic style of interaction that people encounter in daily life.</p>
<p>The jury is still out on whether people like talking to their computer. I think reception of it will rest, as usual, on the intuitiveness of the commands. The game should never force the player to use voice commands &#8211; there always needs to be another path of access &#8211; and the player should never have to remember what that command or sequence is. You just say what you want to happen. I think this could be especially interested in non-linear story lines where the options aren&#8217;t necessarily clear to the player. Instead of selecting from a menu of pre-defined choices the player could explore (as long as they don&#8217;t feel they&#8217;re searching in the dark).</p>
<p><span style="text-decoration: underline;"><strong>Video gestures</strong></span> have been used as a fun, gimmicky activity with the PS3 eye and soon with microsoft&#8217;s project natal, but I haven&#8217;t seen a use that actually results in interesting game play with what we call &#8220;serious&#8221; games. One idea is to take hints from the camera and not direct input. When communicating with team mates in multiplayer a user might say a command in voice chat and point in a general direction relative to where he&#8217;s looking. The camera could take that hint and cause his character to also point in that direction. This is not something that can be used for precise control, but we can attempt to mimic non-essential body language as added value.</p>
<p>When combined with voice command video gestures could enhance the level of realism and natural interface. For instance the direction of the face could indicate whether the player is giving a command to the game or talking to another person in the room. In story telling dialog, more than one player can input and the video indicates which one of them is talking. Again, I think the best we can do with camera input at this point is imprecise input. Project natal looks like it might do a great job in the casual games space, but we&#8217;ll have to see it in the wild controlling games by 3rd party developers.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zacwitte.com/three-alternative-inputs-for-video-games/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visualizing Wikipedia As One Large Node Graph</title>
		<link>http://www.zacwitte.com/visualizing-wikipedia</link>
		<comments>http://www.zacwitte.com/visualizing-wikipedia#comments</comments>
		<pubDate>Wed, 31 Mar 2010 07:52:59 +0000</pubDate>
		<dc:creator>zac</dc:creator>
				<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[infographics]]></category>
		<category><![CDATA[map-reduce]]></category>
		<category><![CDATA[visualization]]></category>
		<category><![CDATA[wikipedia]]></category>

		<guid isPermaLink="false">http://www.zacwitte.com/?p=35</guid>
		<description><![CDATA[As a network visualization tool, node graphs are an intuitive method of communicating relationships between entities. I&#8217;ve been thinking a lot about the semantic web lately and thought it would be cool to visualize all of the links between articles in Wikipedia at once. I want to pull back and get the 10,000 foot view [...]]]></description>
			<content:encoded><![CDATA[<p>As a network visualization tool, node graphs are an intuitive method of communicating relationships between entities. I&#8217;ve been thinking a lot about the semantic web lately and thought it would be cool to visualize all of the links between articles in Wikipedia at once. I want to pull back and get the 10,000 foot view of the state of modern knowledge, which I don&#8217;t think has been done before in a comprehensible way. Chris Harrison&#8217;s <a href="http://www.chrisharrison.net/projects/wikiviz/index.html" target="_blank">WikiViz</a> project comes closest but it quickly becomes incomprehensible and is not dynamic.</p>
<p>I have not yet found a tool capable of pulling this off. There are two key ideas that go into representing information at such vast scale. We need to be able to show detailed information in a narrow focus but not get bogged down when zoomed out, which means you need to represent the graph at different resolutions. This has been a problem solved for seeing images at scale. Google earth represents the earth at vastly different resolutions and <a href="http://gigapan.org/gigapans/5322/" target="_blank">gigapan</a> is able to zoom into images of many gigapixel size. Second, the kind of information you&#8217;re displaying needs to make sense at any height. That means when you&#8217;re looking at the graph from 10,000 feet it shouldn&#8217;t devolve into a gray blur. Google maps also demonstrates this by removing detail such as building names and street names, cities, and states when you zoom out. Because I&#8217;m a gamer I&#8217;m inspired by Supreme Commander which developed an innovative way of showing tactical information. You can zoom out to see the playing field as a whole and seamlessly zoom in to examine an area in detail. When zoomed out, individual <a href="http://pcmedia.ign.com/pc/image/article/765/765601/supreme-commander-20070216034800626.jpg" target="_blank">units become symbols</a> that still convey what the unit is.</p>
<p>At a detailed level a single node could contain basic information including the name, some classification, and perhaps a summery. We can use a <a href="http://blog.thejit.org/2009/10/05/sunburst-visualization/" target="_blank">sunburst style visualization</a> to represent links. As you zoom out that detail gradually disappears. At a high level less significant articles can be represented by generalized concepts. Higher yet, even more general concepts begin to swallow up the more specific ones. The higher you get the more general the concept. Less significant links between concepts fade into the background. The big challenge is reliably building a concept tree for any node in Wikipedia. A lot of research and effort has gone into that area, but it&#8217;s not quite there yet. People would be forgiving of the accuracy to start with.</p>
<p>So here&#8217;s a summary of the requirements for a tool to visualize Wikipedia</p>
<ul>
<li> Must handle 3.2 million nodes and tens of millions of edges (links)</li>
<li> Must be able to modify the graph dynamically to highlight changes in real-time. This means we need something other than the standard spring plotting algorithm which runs in computational complexity O(n^2).</li>
<li> Must be able to represent clusters of nodes symbolically as concepts and gradually move between level of detail</li>
<li> Must be able to operate with partial graph data. The client application will see only a small slice of the network at once or a high level view of a larger area at a low resolution.</li>
</ul>
<p>In my brief analysis there are very few tools designed to handle large data sets dynamically. AI<sup>3</sup> has a list of <a href="http://www.mkbergman.com/414/large-scale-rdf-graph-visualization-tools/" target="_blank">26 candidate tools for large scale graph visualization</a> and although some are visually stunning and some are large scale, none satisfy the requirements above. It seems like the major innovation needed here is a map-reduce style algorithm for undirected graphs. Map-reduce works well with a tree structure, but not as well with unstructured, cyclic graphs. In Wikipedia any node can be linked to any other node and there&#8217;s no consistent parent-child relationship. Everything is an &#8220;unowned&#8221; entity. If a comprehensive and reliable concept hierarchy could be generated from Wikipedia links and text we might be able to use that as the tree-like structure where each level of the tree roughly represents one resolution of the network.</p>
<p>Anyway &#8211; that&#8217;s something to think on.</p>
<p>Here are some more links of interest:<br />
<a href="http://cytoscape.org/screenshots.php" target="_blank">http://cytoscape.org/screenshots.php</a><br />
<a href="http://arxiv.org/abs/cs/0512085" target="_blank">http://arxiv.org/abs/cs/0512085</a><br />
<a href="http://blog.semanticfoundry.com/2009/06/01/dynamic-visualization-introduction-theory/" target="_blank">http://blog.semanticfoundry.com/2009/06/01/dynamic-visualization-introduction-theory/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zacwitte.com/visualizing-wikipedia/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Climate Data Mashup</title>
		<link>http://www.zacwitte.com/climate-data-mashup</link>
		<comments>http://www.zacwitte.com/climate-data-mashup#comments</comments>
		<pubDate>Wed, 09 Dec 2009 05:51:37 +0000</pubDate>
		<dc:creator>zac</dc:creator>
				<category><![CDATA[Ideas]]></category>

		<guid isPermaLink="false">http://www.zacwitte.com/?p=20</guid>
		<description><![CDATA[The problem: people generally have very little perspective of the actual scale of the contributing components of climate change or the effects of different proposed measures to stop it. What percentage of CO2 emissions are a result of city residential electrical consumption vs agriculture vs vehicles? How much of a difference will legislation X make [...]]]></description>
			<content:encoded><![CDATA[<div>
<div>
<div>
<div>
<p><strong>The  problem:</strong> people generally have very little perspective of the  actual scale of the contributing components of climate change or the  effects of different proposed measures to stop it. What percentage of  CO2 emissions are a result of city residential electrical consumption vs  agriculture vs vehicles? How much of a difference will legislation X  make in the big picture? When Obama says that the United States will cut  greenhouse gas emission 80% by 2050 what kind of effect does that  actually have? What would happen to the weather in 10 years if everyone  in the world stopped driving tomorrow?</p>
<p><strong>The solution:</strong> Let people build hypothetical  scenarios themselves. Design an interface centered around an attractive  time line graph indicating climate data in all its various forms  including temperature increase,  carbon emissions, and sea level.  Curious users can click on and off different proposed solutions to see  the real overall effect on projected emissions along with dollar cost  over time. Group data in terms of current relevancy such as proposals  being discussed at the climate summit in Copenhagen this week. Include  competing predictions from different agencies and scientific groups to  communicate the level of uncertainty.</p>
<p>Extra credit for building a system to automatically pull in current  data from a variety of sources.</p>
</div>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.zacwitte.com/climate-data-mashup/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A General Update</title>
		<link>http://www.zacwitte.com/a-general-update</link>
		<comments>http://www.zacwitte.com/a-general-update#comments</comments>
		<pubDate>Mon, 23 Nov 2009 08:05:21 +0000</pubDate>
		<dc:creator>zac</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.zacwitte.com/?p=18</guid>
		<description><![CDATA[I haven’t really used this space to send out personal updates as of yet, but that’s partly what I mean it for. In years past I kept a frequent blog about my travels and adventures, but since becoming boring that kind of tapered off. Tonight I’m feeling a little inspired. I kept up with my [...]]]></description>
			<content:encoded><![CDATA[<p>I haven’t really used this space to send out personal updates as of  yet, but that’s partly what I mean it for. In years past I kept a  frequent blog about my travels and adventures, but since becoming boring  that kind of tapered off. Tonight I’m feeling a little inspired.</p>
<p>I kept up with my nomadic tendencies by moving (somewhat blindly)  back to San Francisco last month. The intention is mostly to surround  myself with techies and the Bay’s zany brand of artistic expression  while staying away from the Midwest’s bone-chilling winter. So far so  good. I’m constantly surprised by all the times I hear guys at a bar  intensely debating their new iPhone app or walk into a coffee shop at 2  in the afternoon to find it full of people on their laptops adorn with  jQuery or facebook or name-your-startup stickers. I’ve already been to a  few of silicon valley’s famously excessive dot com parties with flashy  performances and dance clubs offering all-night open bar for hundreds of  people. And only in San Francisco will you find <a href="http://www.flickr.com/photos/zacwitte/4127652558/" target="_blank">friday night  events</a> taking place in some converted warehouse combining lectures  on neuroscience and synesthesia with street art and house music until  2am. My favorite. I’m subletting a room in a nice apartment for the time  being (<a href="http://www.flickr.com/photos/zacwitte/4127655258/" target="_blank">pic</a>, <a href="http://www.flickr.com/photos/zacwitte/4127655642/" target="_blank">pic</a>).</p>
<p>So far I have tended on reclusive productivity, trying to finish a  couple long overdue freelance jobs that have been hovering about for  quite some time. I also started working on some exciting startup ideas.  Check out <a href="http://tweet-pulse.com/" target="_blank">tweet-pulse.com</a> for a little tease of one. Mysterious, I know. Others involve more  heavily my ambitions for artificial intelligence, but I discover more  and more how difficult that can be with no capital and no graduate  degree. I’m contemplating graduate school, which would be the expected  path, but I really prefer to learn by doing something practical. I would  love for someone to pay me to work on something related to robotics  while I hone my skills in more abstract machine learning techniques, but  those opportunities are few and far between. They do exists – I had one  interview for a job I would have loved – but it feels like 90% of the  work these days is with web-related ventures.</p>
<p>I’ve had enough of that. In fact, I’m setting a guideline for my  upcoming job search that I won’t look at companies which deal only in  the web space because frankly I’m tired of that work. I’ve done it for  the past seven years both freelancing and fully employed and it lost  most of the appeal when it was no longer a theoretical challenge and  only an implementation challenge. I like to work on problems that I go  to bed thinking about and wake up having been enlightened by some  other-dimensional thought pattern. Or perhaps to experiment with methods  mysterious enough that the results surprise me.</p>
<p>Over the next 30 days I need to decide which of the three-sided fence  I’ll hop over to. I know I would benefit from working with a company on  a project larger than myself and with mentors more experienced that me,  but I’m scared that I’ll find that work less than fulfilling. I also  know I’ll miss, in some ways, being my own boss, which has been my  natural state almost exclusively so far. Some of the biggest and most  successful names in technology have gone their own way and found it  better than any other, but I could just as likely find it longer and  more strenuous. The third side of this curious tri-fence is graduate  school. Oh what potential, oh what a loss of time. I welcome your  counseling.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zacwitte.com/a-general-update/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How head hunters use google searches to find candidates</title>
		<link>http://www.zacwitte.com/how-head-hunters-use-google-searches-to-find-candidates</link>
		<comments>http://www.zacwitte.com/how-head-hunters-use-google-searches-to-find-candidates#comments</comments>
		<pubDate>Sat, 17 Oct 2009 21:49:34 +0000</pubDate>
		<dc:creator>zac</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.zacwitte.com/?p=16</guid>
		<description><![CDATA[In the past two months I’ve been randomly contacted by a number of head hunters hiring for positions both in Chicago and on the west coast. In a time when so many people are looking for jobs, some recruiters actually seem to be coming to me. I know that a number of friends in the [...]]]></description>
			<content:encoded><![CDATA[<div>
<div>
<div>
<div>
<p>In the past  two months I’ve been randomly contacted by a number of head hunters  hiring for positions both in Chicago and on the west coast. In a time  when so many people are looking for jobs, some recruiters actually seem  to be coming to me. I know that a number of friends in the industry with  at least a little proven track record have been experiencing the same  thing. One of the keys, it turns out, is to have your own blog and  resume (cv) online. Check out this google hit that showed up on my  site’s analytics yesterday, for example. “.pdf” and “Java”   “chicago”    CV</p>
<p>This particular person was in the UK (Chicago financial companies  often use London based recruiting agencies). I’ve seen similar searches  coming from networks of big companies that we all know.</p>
<p>So keep your resume online, keep it current, and blog.</p>
</div>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.zacwitte.com/how-head-hunters-use-google-searches-to-find-candidates/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
