<?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>just another tech blog</title>
	<atom:link href="http://s1ckboy.de/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://s1ckboy.de/blog</link>
	<description>programming, graphs, databases, nerd stuff</description>
	<lastBuildDate>Thu, 08 Sep 2011 14:23:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>new index interfaces and how to integrate custom indices in sones GraphDB</title>
		<link>http://s1ckboy.de/blog/2011/09/08/new-index-interfaces-and-how-to-integrate-custom-indices-in-sones-graphdb/</link>
		<comments>http://s1ckboy.de/blog/2011/09/08/new-index-interfaces-and-how-to-integrate-custom-indices-in-sones-graphdb/#comments</comments>
		<pubDate>Thu, 08 Sep 2011 14:23:48 +0000</pubDate>
		<dc:creator>s1ck</dc:creator>
				<category><![CDATA[a&d]]></category>
		<category><![CDATA[graphdb]]></category>
		<category><![CDATA[graphs]]></category>
		<category><![CDATA[sones]]></category>
		<category><![CDATA[binary search tree]]></category>
		<category><![CDATA[index]]></category>
		<category><![CDATA[interface]]></category>

		<guid isPermaLink="false">http://s1ckboy.de/blog/?p=264</guid>
		<description><![CDATA[In the course of our work at sones GraphDB 2.1 we refactored our index interfaces to make them more suitable for our needs. Furthermore, we wanted to make it easier for the community to implement custom index structures for their special needs. For the latter reason I set up a tutorial and published a sample [...]]]></description>
			<content:encoded><![CDATA[<p>In the course of our work at sones GraphDB 2.1 we refactored our index interfaces to make them more suitable for our needs. Furthermore, we wanted to make it easier for the community to implement custom index structures for their special needs. For the latter reason I set up a tutorial and published a sample implementation on github.</p>
<p>If you have any questions concerning the interfaces or the sample implementation, feel free to ask questions here or in the sones forum.</p>
<p>Now the links:</p>
<p><a href="http://developers.sones.de/wiki/doku.php?id=documentation:plugins:database:indices" title="Index Interfaces at sones developer wiki" target="_blank">Index Interfaces at sones developer wiki</a><br />
<a href="http://developers.sones.de/wiki/doku.php?id=documentation:plugins:database:indices#implementing_a_custom_index" title="Index tutorial at sones developer wiki" target="_blank">Index tutorial at sones developer wiki</a><br />
<a href="https://github.com/sones/sones-bstindex-tutorial" title="Tutorial source on github" target="_blank">Tutorial source on github</a><br />
<a href="http://forum.sones.de/" title="sones forum" target="_blank">sones forum</a></p>
<p>Greetings,<br />
s1ck</p>
]]></content:encoded>
			<wfw:commentRss>http://s1ckboy.de/blog/2011/09/08/new-index-interfaces-and-how-to-integrate-custom-indices-in-sones-graphdb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sones GraphDB at NoSQL Workshop “Neue Verwaltung” Leipzig 05/11</title>
		<link>http://s1ckboy.de/blog/2011/05/13/sones-graphdb-at-nosql-workshop-%e2%80%9cneue-verwaltung%e2%80%9d-leipzig-0511/</link>
		<comments>http://s1ckboy.de/blog/2011/05/13/sones-graphdb-at-nosql-workshop-%e2%80%9cneue-verwaltung%e2%80%9d-leipzig-0511/#comments</comments>
		<pubDate>Fri, 13 May 2011 09:45:21 +0000</pubDate>
		<dc:creator>s1ck</dc:creator>
				<category><![CDATA[conference]]></category>
		<category><![CDATA[sones]]></category>
		<category><![CDATA[couchdb]]></category>
		<category><![CDATA[graphdb]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[slides]]></category>

		<guid isPermaLink="false">http://s1ckboy.de/blog/?p=260</guid>
		<description><![CDATA[NoSQL &#8211; Neue Ansätze zur Verwaltung unstrukturierter Daten View more presentations from s1ck]]></description>
			<content:encoded><![CDATA[<div style="width:425px" id="__ss_7948736"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/s1ck/nosql-neue-anstze-zur-verwaltung-unstrukturierter-daten-7948736" title="NoSQL - Neue Ansätze zur Verwaltung unstrukturierter Daten">NoSQL &#8211; Neue Ansätze zur Verwaltung unstrukturierter Daten</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/7948736" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/s1ck">s1ck</a> </div>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://s1ckboy.de/blog/2011/05/13/sones-graphdb-at-nosql-workshop-%e2%80%9cneue-verwaltung%e2%80%9d-leipzig-0511/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Implementing parallel breadth-first search using .NET 4.0 TPL</title>
		<link>http://s1ckboy.de/blog/2011/02/19/implementing-parallel-breadth-first-search-using-net-4-0-tpl/</link>
		<comments>http://s1ckboy.de/blog/2011/02/19/implementing-parallel-breadth-first-search-using-net-4-0-tpl/#comments</comments>
		<pubDate>Sat, 19 Feb 2011 13:06:21 +0000</pubDate>
		<dc:creator>s1ck</dc:creator>
				<category><![CDATA[a&d]]></category>
		<category><![CDATA[BA]]></category>
		<category><![CDATA[graphs]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[algorithm]]></category>
		<category><![CDATA[bfs]]></category>
		<category><![CDATA[graph]]></category>
		<category><![CDATA[net]]></category>
		<category><![CDATA[net40]]></category>
		<category><![CDATA[parallel]]></category>
		<category><![CDATA[tpl]]></category>

		<guid isPermaLink="false">http://s1ckboy.de/blog/?p=120</guid>
		<description><![CDATA[Introduction In the last days I worked on a small project for the parallel computing course at my university. The task was to take any serial algorithm we like, try to parallelize it and write an article about our results. For the reason of my graph addiction, I chose the default breadth-first search (BFS) in [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Introduction</strong></p>
<p>In the last days I worked on a small project for the parallel computing course at my university. The task was to take any serial algorithm we like, try to parallelize it and write an article about our results.</p>
<p>For the reason of my graph addiction, I chose the default breadth-first search (BFS) in the version of a single source shortest path (SSSP) search. But first some explanations on the topic. A graph G(V,E) is a structure which consists of a set of vertices (nodes) V and a set of edges E. Each edge connects a pair (u,v) of vertices. A graph can be either directed or undirected.</p>
<div id="attachment_130" class="wp-caption aligncenter" style="width: 310px"><a href="http://s1ckboy.de/blog/wp-content/uploads/2011/02/directed_graph.png"><img class="size-medium wp-image-130 " title="directed_graph" src="http://s1ckboy.de/blog/wp-content/uploads/2011/02/directed_graph-300x137.png" alt="" width="300" height="137" /></a><p class="wp-caption-text">Figure 1: directed graph</p></div>
<p>In a directed graph (figure 1) each edge has a source and a target vertex, a connection between vertex A and vertex B does not assume a connection between vertex B and vertex A.</p>
<div id="attachment_128" class="wp-caption aligncenter" style="width: 310px"><a href="http://s1ckboy.de/blog/wp-content/uploads/2011/02/undirected_graph.png"><img class="size-medium wp-image-128 " title="undirected_graph" src="http://s1ckboy.de/blog/wp-content/uploads/2011/02/undirected_graph-300x137.png" alt="" width="300" height="137" /></a><p class="wp-caption-text">Figure 2: Undirected graph</p></div>
<p>In an undirected graph (figure 2) an edge implies a connection in both ways. The number of edges, which are connected to a vertex u, is called degree of u. Another property of graphs is the weight of vertices or edges. In a weighted graph each vertex or edge might have a weight to define the costs to traverse this entity. In a real network, an edge-weight could represent the distance between cities or the importance of social relationships („friend of“ &gt; „knows“).</p>
<p>The graph structure is an abstract way to model relationships in real networks like social, technological or biological networks. But in fact, graph theory is a part of discrete mathematics and offers algorithms to do a lot of measurement on networks.</p>
<p>A common example for real networks in the current version of the web are social networks like <a href="http://www.facebook.com/">Facebook</a>, <a href="http://www.linkedin.com/">LinkedIn</a> or the <a href="http://www.vz-netzwerke.net/">VZ-Network</a> in the german region. Interesting questions concerning this kind of networks are:</p>
<p>„How many users are between User A and User B?“<br />
„How important is User A in this part of the network?“<br />
„How many friends of User A also know each other?“<br />
„How many shortest path connections between two users contain User A?“</p>
<p>Some of these questions can be answered by algorithms which are an extension of the BFS. Based on this algorithm, we can measure the shortest path between two vertices [1], calculate the betweenesses centrality [2] or check how many vertices are reachable from Vertex A and their distance to A [3].<br />
The latter example is called a breadth-first tree which is in fact a spanning tree in a connected subgraph rooted at some vertex s. The breadth-first tree contains some extra information at the vertices: the distance to root vertex s (source) and a reference to its predecessor. Based on the second information you can reconstruct any shortest path after building the tree.  The following figure shows an example of a breadth-first tree in a directed graph.</p>
<div id="attachment_247" class="wp-caption aligncenter" style="width: 310px"><a href="http://s1ckboy.de/blog/wp-content/uploads/2011/02/bfs-tree1.png"><img src="http://s1ckboy.de/blog/wp-content/uploads/2011/02/bfs-tree1-300x137.png" alt="" title="bfs-tree" width="300" height="137" class="size-medium wp-image-247" /></a><p class="wp-caption-text">Figure 3: breadth-first tree</p></div>
<p>But why is the algorithm called “breadth-first”? To answer this question we should look a bit more in detail how it works&#8230;</p>
<p><strong>The algorithm</strong></p>
<p>Starting at a given root vertex s, the algorithm looks up all neighbors of s. In a directed graph, these are all neighbors at outgoing edges (edges which have s as source vertex), in an undirected graph the whole set of neighbors is affected. All these vertices own the same distance to s, because they’re just one step away. In the next iteration, all these “one-step-away”-vertices are treated like they were source nodes. So the algorithm checks all nodes with the same distance k to s before it starts checking all nodes with distance k + 1 to s.<br />
To realize this behavior, the algorithm uses a datastructure called “queue”. A queue is a first-in-first-out datastructure where elements are added at the end (enqueue) and removed at front (dequeue). Using this structure guarantees that all nodes with same distance are processed before switching to the next level of the breadth-first tree. The following listing shows the algorithm:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Search<span style="color: #008000;">&#40;</span>IGraph myGraph, IVertex mySource<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
     <span style="color: #008080;">#region Init</span>
&nbsp;
     InitGraph<span style="color: #008000;">&#40;</span>myGraph<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
     <span style="color: #008080; font-style: italic;">// init source vertex</span>
     mySource<span style="color: #008000;">.</span><span style="color: #0000FF;">IsVisited</span> <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
     mySource<span style="color: #008000;">.</span><span style="color: #0000FF;">Distance</span>    <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
&nbsp;
     <span style="color: #008080; font-style: italic;">// use Concurrent Queue for parallel access</span>
     var queue <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Queue<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
     IVertex u <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">;</span>
&nbsp;
     <span style="color: #008080;">#endregion</span>
&nbsp;
     <span style="color: #008080;">#region BFS</span>
&nbsp;
     <span style="color: #008080; font-style: italic;">// enqueue the source vertex</span>
     queue<span style="color: #008000;">.</span><span style="color: #0000FF;">Enqueue</span><span style="color: #008000;">&#40;</span>mySource<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
     <span style="color: #0600FF; font-weight: bold;">while</span> <span style="color: #008000;">&#40;</span>queue<span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span> <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
          <span style="color: #008080; font-style: italic;">// take front element of the queue</span>
          u <span style="color: #008000;">=</span> queue<span style="color: #008000;">.</span><span style="color: #0000FF;">Dequeue</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
          <span style="color: #008080; font-style: italic;">// process neighbours of u</span>
          <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>var outEdge <span style="color: #0600FF; font-weight: bold;">in</span> u<span style="color: #008000;">.</span><span style="color: #0000FF;">OutgoingEdges</span><span style="color: #008000;">&#41;</span>
          <span style="color: #008000;">&#123;</span>
               <span style="color: #008080; font-style: italic;">// neighbour node</span>
               var v <span style="color: #008000;">=</span> outEdge<span style="color: #008000;">.</span><span style="color: #0000FF;">Target</span><span style="color: #008000;">;</span>
&nbsp;
               <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">!</span>v<span style="color: #008000;">.</span><span style="color: #0000FF;">IsVisited</span><span style="color: #008000;">&#41;</span> <span style="color: #008080; font-style: italic;">// unexplorered node</span>
               <span style="color: #008000;">&#123;</span>
                    <span style="color: #008080; font-style: italic;">// set as visited</span>
                    v<span style="color: #008000;">.</span><span style="color: #0000FF;">IsVisited</span> <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
                    <span style="color: #008080; font-style: italic;">// set the predecessor</span>
                    v<span style="color: #008000;">.</span><span style="color: #0000FF;">Predecessor</span> <span style="color: #008000;">=</span> u<span style="color: #008000;">;</span>
                    <span style="color: #008080; font-style: italic;">// increment the distance</span>
                    v<span style="color: #008000;">.</span><span style="color: #0000FF;">Distance</span> <span style="color: #008000;">=</span> u<span style="color: #008000;">.</span><span style="color: #0000FF;">Distance</span> <span style="color: #008000;">+</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
                    <span style="color: #008080; font-style: italic;">// and enqueue that node</span>
                    queue<span style="color: #008000;">.</span><span style="color: #0000FF;">Enqueue</span><span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
               <span style="color: #008000;">&#125;</span>
          <span style="color: #008000;">&#125;</span>
     <span style="color: #008000;">&#125;</span>     
&nbsp;
     <span style="color: #008080;">#endregion</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p><strong>The idea for parallelization</strong></p>
<p>If you think of social graphs like Facebook, you will recognize, that these graphs are really large-scale. Facebook itself has about 0.5 Billion active users and any user has about 130 relationships to other users [4]. Furthermore, there are about 0.9 Billion objects like groups, pages or events to whom a user can be connected to. And realize how many times you clicked the “Like” button&#8230; ;)<br />
Such large-scale graphs can&#8217;t be computed by a single processor or a single machine (maybe by a mainframe? :). So we are forced to find solutions to distribute the work to multiple processors or multiple machines in a cluster. Due to the fact, that I don&#8217;t own a cluster of more than 1 PC, I decided to distribute the work on the cores of a single CPU (more on that later).</p>
<p>If you think again about Facebook with an average degree of 130 friends, it&#8217;s easy to see that the more far away we are from s, the more nodes we have to check. In the first iteration there are just 130 nodes, in the second level each of these 130 nodes also has about 130 neighbors (assuming that there are less ring-references). So for a given distance d from s we have about 130^d nodes with the same distance to s.<br />
My idea was to distribute these 130^d nodes on the available processors, so that each level can be checked in parallel.</p>
<p><strong>The implementation</strong></p>
<p>I decided to try two parallel programming approaches which I learned in the .NET Parallel Book [5]: the “while-not-empty” pattern using two Concurrent Queues and the &#8220;parallel aggregate&#8221; pattern which is doing some thread-local calculation and merges the results of all threads.</p>
<p><strong>while-not-empty</strong></p>
<p>The <a href="http://msdn.microsoft.com/en-us/library/dd267265.aspx">ConcurrentQueue</a> is a generic threadsafe FIFO-datastructure. Thread A can enqueue new items while another Thread B dequeues the items at the beginning. Another important fact &#8211; that might sound weired &#8211; is that you can modify the queue while iterating over its elements. This is made possible by creating a snapshot of the current queue-state and iterating over the snapshot. The algorithm is displayed in the following listing.</p>
<p>There are two Concurrent Queues, the read queue, which is used for parallel reading, and the write queue, which is used for parallel writing. I tried the above mentioned pattern using just one queue for reading and writing and there were no differences in performance, so I decided to use this way because of the “not-weired”-bonus.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Search<span style="color: #008000;">&#40;</span>IGraph myGraph, IVertex mySource<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
     <span style="color: #008080;">#region Init</span>
&nbsp;
      InitGraph<span style="color: #008000;">&#40;</span>myGraph<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
      <span style="color: #008080; font-style: italic;">// init source vertex</span>
      mySource<span style="color: #008000;">.</span><span style="color: #0000FF;">IsVisited</span> <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
      mySource<span style="color: #008000;">.</span><span style="color: #0000FF;">Distance</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>            
&nbsp;
      <span style="color: #008080; font-style: italic;">// first queue is the read queue</span>
      var <span style="color: #0600FF; font-weight: bold;">from</span> <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ConcurrentQueue<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #008080; font-style: italic;">// second queue is the write queue</span>
      var to <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ConcurrentQueue<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
      <span style="color: #008080;">#endregion</span>
&nbsp;
      <span style="color: #008080;">#region BFS</span>
&nbsp;
      <span style="color: #008080; font-style: italic;">// enqueue the source vertex</span>
      <span style="color: #0600FF; font-weight: bold;">from</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Enqueue</span><span style="color: #008000;">&#40;</span>mySource<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
      <span style="color: #0600FF; font-weight: bold;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">from</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span> <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
           <span style="color: #008080; font-style: italic;">// re-initialize the write queue</span>
           to <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ConcurrentQueue<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
           <span style="color: #008080; font-style: italic;">// process current BFS tree level in parallel</span>
           Parallel<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">ForEach</span><span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">from</span>, u <span style="color: #008000;">=&gt;;</span>
           <span style="color: #008000;">&#123;</span>
               <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">from</span><span style="color: #008000;">.</span><span style="color: #0000FF;">TryDequeue</span><span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">out</span> u<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
               <span style="color: #008000;">&#123;</span>
                   <span style="color: #008080; font-style: italic;">// process neighbours of u</span>
                   <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>var outEdge <span style="color: #0600FF; font-weight: bold;">in</span> u<span style="color: #008000;">.</span><span style="color: #0000FF;">OutgoingEdges</span><span style="color: #008000;">&#41;</span>
                   <span style="color: #008000;">&#123;</span>
                       <span style="color: #008080; font-style: italic;">// neighbour node</span>
                       var v <span style="color: #008000;">=</span> outEdge<span style="color: #008000;">.</span><span style="color: #0000FF;">Target</span><span style="color: #008000;">;</span>
&nbsp;
                       <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">!</span>v<span style="color: #008000;">.</span><span style="color: #0000FF;">IsVisited</span><span style="color: #008000;">&#41;</span> <span style="color: #008080; font-style: italic;">// not the target</span>
                       <span style="color: #008000;">&#123;</span>
                           <span style="color: #008080; font-style: italic;">// set as visited</span>
                           v<span style="color: #008000;">.</span><span style="color: #0000FF;">IsVisited</span> <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
                           <span style="color: #008080; font-style: italic;">// set the predecessor</span>
                           v<span style="color: #008000;">.</span><span style="color: #0000FF;">Predecessor</span> <span style="color: #008000;">=</span> u<span style="color: #008000;">;</span>
                           <span style="color: #008080; font-style: italic;">// increment the distance</span>
                           v<span style="color: #008000;">.</span><span style="color: #0000FF;">Distance</span> <span style="color: #008000;">=</span> u<span style="color: #008000;">.</span><span style="color: #0000FF;">Distance</span> <span style="color: #008000;">+</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
&nbsp;
                           <span style="color: #008080; font-style: italic;">// add to the queue</span>
                           to<span style="color: #008000;">.</span><span style="color: #0000FF;">Enqueue</span><span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                       <span style="color: #008000;">&#125;</span>
                   <span style="color: #008000;">&#125;</span>
               <span style="color: #008000;">&#125;</span>
           <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
           <span style="color: #008080; font-style: italic;">// switch queues</span>
           <span style="color: #0600FF; font-weight: bold;">from</span> <span style="color: #008000;">=</span> to<span style="color: #008000;">;</span>
      <span style="color: #008000;">&#125;</span>
&nbsp;
      <span style="color: #008080;">#endregion</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>At first the source vertex s is enqueued into the read queue, it represents level 0 of the breadth-first tree. The read queue is then processed in parallel to retrieve all neighbors of the currently enqueued nodes. These neighbor-nodes are enqueued in the write queue. After processing the whole level (all nodes with same distance to s), the write queue becomes the new read queue and the write queue is re-initialized. All nodes with current distance + 1 are now enqueued in the read set and can be processed in parallel during the next iteration. This process runs until all reachable nodes are processed.</p>
<p><strong>parallel aggregate</strong></p>
<p>Another really interesting pattern which is introduced in [5] is the parallel aggregate pattern. This approach can be used if there is no “natural” data parallelism because there is just one final result which is accumulated using intermediate results. A typical example is the sum calculation: if you have n summands, you can distribute them to p processors which calculate intermediate (partial) results. If all partial results are calculated, they will be merged into one final result. It sounds like a kind of map reduce, and in my opinion this is a very similar pattern.</p>
<p>In figure 4 you can see an input set distributed to three tasks. Each task calculates an intermediate result (subtotal) which is merged with the final result (total). The  calculations of intermediate results are independent, so this can run in parallel. The important thing is, that the merge between intermediate and final result has to be processed serially.</p>
<div id="attachment_170" class="wp-caption aligncenter" style="width: 310px"><a href="http://s1ckboy.de/blog/wp-content/uploads/2011/02/parallel_aggregate.png"><img src="http://s1ckboy.de/blog/wp-content/uploads/2011/02/parallel_aggregate-300x117.png" alt="" title="parallel_aggregate" width="300" height="117" class="size-medium wp-image-170" /></a><p class="wp-caption-text">Figure 4: parallel aggregate</p></div>
<p>Like the while-not-empty pattern, the following implementation also uses two datastructures for read and write. In this case there is no need for concurrent queues, because write operations are serialized and the structure won&#8217;t change during iteration. I used an overloaded version of the Parallel.ForEach method. The first parameter is the datastructure to read from in parallel, in our case these are all vertices with same distance to the root vertex. The second parameter defines an init action or pre-processor, which is performed before the loop body is executed. In this implementation we use the parameter to initialize the local (partial) result. I used an ordinary generic List, because there is no need for thread-safety. The third parameter is the loop body itself, defined by the vertex u, the loopstate, which is unused and finally the partial result to store the neighbors of u. Parameter four also describes an action, which I name post-processor because it is called after executing the loop body. In this action the thread-local partial result is merged into the final result (all nodes with distance k + 1). This step has to be serialized using the lock object.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Search<span style="color: #008000;">&#40;</span>IGraph myGraph, IVertex mySource<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
     <span style="color: #008080;">#region Init</span>
&nbsp;
     InitGraph<span style="color: #008000;">&#40;</span>myGraph<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
     <span style="color: #008080; font-style: italic;">// init source vertex</span>
     mySource<span style="color: #008000;">.</span><span style="color: #0000FF;">IsVisited</span> <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
     mySource<span style="color: #008000;">.</span><span style="color: #0000FF;">Distance</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
&nbsp;
     <span style="color: #008080; font-style: italic;">// use simple lists for r/w</span>
     var <span style="color: #0600FF; font-weight: bold;">from</span> <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span>IVertex<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
     var to <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span>IVertex<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
     <span style="color: #008080; font-style: italic;">// need this for the merging part</span>
     var lockObj <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #6666cc; font-weight: bold;">Object</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
     <span style="color: #008080;">#endregion</span>
&nbsp;
     <span style="color: #008080;">#region BFS</span>
&nbsp;
     <span style="color: #008080; font-style: italic;">// add the source vertex</span>
     <span style="color: #0600FF; font-weight: bold;">from</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>mySource<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
     <span style="color: #0600FF; font-weight: bold;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">from</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span> <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
          to <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span>IVertex<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
          Parallel<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">ForEach</span><span style="color: #008000;">&#40;</span>
          <span style="color: #008080; font-style: italic;">// the values to be aggregated</span>
          <span style="color: #0600FF; font-weight: bold;">from</span>,
          <span style="color: #008080; font-style: italic;">// local initial partial result</span>
          <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">=&gt;</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span>IVertex<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,
          <span style="color: #008080; font-style: italic;">// loop body</span>
          <span style="color: #008000;">&#40;</span>u, loopState, partialResult<span style="color: #008000;">&#41;</span> <span style="color: #008000;">=&gt;</span>
          <span style="color: #008000;">&#123;</span>				
               <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>var outEdge <span style="color: #0600FF; font-weight: bold;">in</span> u<span style="color: #008000;">.</span><span style="color: #0000FF;">OutgoingEdges</span><span style="color: #008000;">&#41;</span>
               <span style="color: #008000;">&#123;</span>
                    <span style="color: #008080; font-style: italic;">// neighbour node</span>
                    var v <span style="color: #008000;">=</span> outEdge<span style="color: #008000;">.</span><span style="color: #0000FF;">Target</span><span style="color: #008000;">;</span>
&nbsp;
                    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">!</span>v<span style="color: #008000;">.</span><span style="color: #0000FF;">IsVisited</span><span style="color: #008000;">&#41;</span> <span style="color: #008080; font-style: italic;">// not the target</span>
                    <span style="color: #008000;">&#123;</span>
                         <span style="color: #008080; font-style: italic;">// set as visited                               </span>
                         v<span style="color: #008000;">.</span><span style="color: #0000FF;">IsVisited</span> <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
                         <span style="color: #008080; font-style: italic;">// set the predecessor</span>
                         v<span style="color: #008000;">.</span><span style="color: #0000FF;">Predecessor</span> <span style="color: #008000;">=</span> u<span style="color: #008000;">;</span>
                         <span style="color: #008080; font-style: italic;">// increment the distance</span>
                         v<span style="color: #008000;">.</span><span style="color: #0000FF;">Distance</span> <span style="color: #008000;">=</span> u<span style="color: #008000;">.</span><span style="color: #0000FF;">Distance</span> <span style="color: #008000;">+</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
                         <span style="color: #008080; font-style: italic;">// add this vertex to the partial result</span>
                         partialResult<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>													
                    <span style="color: #008000;">&#125;</span>
               <span style="color: #008000;">&#125;</span>
&nbsp;
               <span style="color: #0600FF; font-weight: bold;">return</span> partialResult<span style="color: #008000;">;</span>
          <span style="color: #008000;">&#125;</span>,
          <span style="color: #008080; font-style: italic;">// the final step of each local context</span>
          <span style="color: #008000;">&#40;</span>localPartialSet<span style="color: #008000;">&#41;</span> <span style="color: #008000;">=&gt;</span>
          <span style="color: #008000;">&#123;</span>
               <span style="color: #008080; font-style: italic;">// this has the be done in serial way</span>
               <span style="color: #0600FF; font-weight: bold;">lock</span> <span style="color: #008000;">&#40;</span>lockObj<span style="color: #008000;">&#41;</span>
               <span style="color: #008000;">&#123;</span>					
                    to<span style="color: #008000;">.</span><span style="color: #0000FF;">AddRange</span><span style="color: #008000;">&#40;</span>localPartialSet<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
               <span style="color: #008000;">&#125;</span>
          <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
          <span style="color: #008080; font-style: italic;">// switch lists</span>
          <span style="color: #0600FF; font-weight: bold;">from</span> <span style="color: #008000;">=</span> to<span style="color: #008000;">;</span>
     <span style="color: #008000;">&#125;</span>
&nbsp;
     <span style="color: #008080;">#endregion</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p><strong>evaluation</strong></p>
<p>The implementations where tested on nine example graphs. Five of these are real graphs taken from [6]. As a representative of social networks, I chose the slashdot community graph of 2009 (slash_soc). For the category of information networks, there is a webgraph from google (google_web), which was published in 2002 for a programming competition. As a communication network, I used a forum chat from wikipedia (wiki_talk). The road network of Texas (texas_road) is the representative for transportation networks and the last real network is a snapshot of the gnutella p2p network made in 2002 (gnut_p2p).<br />
The additional four graphs where generated using different graph models. There are two random graphs based on the Erdos-Renyi-Model [8] and two scale-free graphs based on the model of Barabasi and Albert [9]. If you want me to explain these models, just leave me a comment. They were generated using <a href="http://igraph.sourceforge.net/">igraph</a>, a graph library for <a href="http://www.r-project.org/">R</a>.<br />
Except the texas_road network, all graphs are directed. The real networks are unconnected, except the gnut_p2p.</p>
<p>The test platform is an Intel Core 2 Quad CPU (4&#215;2.83Ghz) with 16GB RAM and Windows 7 x64 as OS. This machine is one of the test and profiling machines at <a href="http://www.sones.com">sones</a>. All measurements are performed in-memory.<br />
For each graph, the benchmark chose 10 random source vertices and built the bfs-tree 20 times. The average duration was determined and from these average values, the average duration for each algorithm was composed. The unit for all time values is [ms]. The speedup S_p is the relation between serial and parallel execution based on p processors. So we look at S_4.</p>
<p>The results are displayed in table 1, d(G) is the diameter of the graph, t_serial denotes the duration of the serial algorithm, t_wne of the while-not-empty implementation and t_la of the local aggregate implementation.<br />
In general, the parallel execution needs less time. The average speedup of the while-not-empty implementation is <em>S_4 = 1.45</em>, the speedup of the local aggregation is <em>S_4 = 2.17</em>. The maximum value <em>S_4 = 2.65</em> was achieved by the local aggregation on the random graph erdos_1. The while-not-empty implementation made the worst result <em>S_4 = 0.72</em> in the wiki_talk network.</p>
<table border="1" style="border:1px solid black">
<tr>
<th>Graph</th>
<th>|V|</th>
<th>|E|</th>
<th>d(G)</th>
<th>t_serial</th>
<th>t_wne (S_4)</th>
<th>t_la (S_4)</th>
</tr>
<tr>
<td>slash_soc</td>
<td>77360</td>
<td>905468</td>
<td>12</td>
<td>157</td>
<td>94 (1.67)</td>
<td><strong>72 (2.18)</strong></td>
</tr>
<tr>
<td>google_web</td>
<td>875713</td>
<td>875713</td>
<td>22</td>
<td>727</td>
<td>557 (1.31)</td>
<td><strong>356 (2.04)</strong></td>
</tr>
<tr>
<td>wiki_talk</td>
<td>2394385</td>
<td>5021410</td>
<td>9</td>
<td>1747</td>
<td>2443 (0.72)</td>
<td><strong>853 (2.09)</strong></td>
</tr>
<tr>
<td>texas_road</td>
<td>1379917</td>
<td>3843320</td>
<td>1049</td>
<td>989</td>
<td>872 (1.13)</td>
<td><strong>535 (1.84)</strong></td>
</tr>
<tr>
<td>gnut_p2p</td>
<td>62586</td>
<td>147892</td>
<td>11</td>
<td>44</td>
<td>41 (1.07)</td>
<td><strong>21 (2.1)</strong></td>
</tr>
<tr>
<td>erdos_1</td>
<td>1000000</td>
<td>8332480</td>
<td>-</td>
<td>3161</td>
<td>1948 (1.62)</td>
<td><strong>1225 (2.58)</strong></td>
</tr>
<tr>
<td>erdos_2</td>
<td>100000</td>
<td>3993968</td>
<td>-</td>
<td>1063</td>
<td>435 (2.44)</td>
<td><strong>401 (2.65)</strong></td>
</tr>
<tr>
<td>barabasi_1</td>
<td>1000000</td>
<td>3999964</td>
<td>-</td>
<td>1787</td>
<td>1137 (1.57)</td>
<td><strong>943 (1.89)</strong></td>
</tr>
<tr>
<td>barabasi_2</td>
<td>100000</td>
<td>399970</td>
<td>-</td>
<td>132</td>
<td>88 (1.5)</td>
<td><strong>60 (2.2)</strong></td>
</tr>
</table>
<p><strong>conclusion</strong></p>
<p>Based on a maximum speedup of S_4 = 4, the average speedup of the while-not-empty implementation S_4 = 1.45 is not according to the expectations. One reason for this bad result is the parallel read and write in both concurrent queues. These processes require internal locking, which affects the duration in a negative way. I validated this assumption by comparing the serial and the concurrent queue using one thread.<br />
The local aggregation on the other hand achieved an obvious improvement with an average speedup of S_4 = 2.17. It&#8217;s on the dice that the serial execution of the merge from local result to final result leads into performance losses.<br />
In addition to the mentioned reasons, I could determine using the Visual Studio 2010 Concurrency Profiler, that the garbage collector blocked running tasks because of allocating or freeing memory. This also has negative effects to the speedup.</p>
<p><strong>future work</strong></p>
<p> I currently tried the BFS in a multicore environment, but it&#8217;s even more interesting to see how the algorithm performs in a cluster. I found a paper where the BFS was implemented on a BlueGene/L with 32.768 CPUs [7]. Maybe I can use my EC2 voucher to play a little with clusters :)<br />
Another thing I&#8217;d like to test is to do local vertex processing. Currently each thread just looks up the neighbors for each vertex. One consideration is to implement something like matching or filter functions which are performed at each vertex. Two examples: &#8220;Give me the shortest path between Berlin and Munich but don&#8217;t pass Leipzig or Nuremberg&#8221; or &#8220;Give me the shortest path between Vertex A and Vertex B containing only vertices with a local cluster coefficient of 0.5 or greater&#8221;.</p>
<p><strong>finally&#8230;</strong></p>
<p>This is my first more extensive blog article, so thank you for reading and I hope to get some feedback on my work :)<br />
If you got any ideas for improving my implementations or you might have a totally different approach, then let&#8217;s discuss it.</p>
<p>[1] E. W. Dijkstra. A note on two problems in connexion with graphs. Numerische Mathematik, 1(1):269-271, 1959.<br />
[2] M. E. J. Newman. Networks An Introduction. Oxford University Press, 2010.<br />
[3] R. C. Prim: Shortest connection networks and some generalizations. In: Bell System Technical Journal, 36 (1957), pp. 1389–1401<br />
[4] <a href="http://www.facebook.com/press/info.php?statistics">Facebook Statistics</a> (Accessed 2011-02-18)<br />
[5] Parallel Programming with Microsoft .NET at <a href="http://parallelpatterns.codeplex.com/">CodePlex</a> (Accessed 2011-02-18)<br />
[6] <a href="http://snap.stanford.edu/data/index.html">Stanford Large Network Dataset Collection</a> (Accessed 2011-02-18)<br />
[7] A. Yoo, E. Chow, K. Henderson, W. McLendon, B. Hendrickson, and U. Catalyurek. A scalable distributed parallel breadth-firrst search algorithm on bluegene/L.  Washington, DC, USA, 2005. IEEE Computer Society.<br />
[8] Erdos, P. und A. Rényi: On random graphs. I. Publ. Math. Debrecen, 6:290-297, 1959.<br />
[9] Barabási, Albert-László und Eric Bonabeau: Skalenfreie Netze. Spektrum der Wissenschaft, Juli:64-68, 2004.</p>
]]></content:encoded>
			<wfw:commentRss>http://s1ckboy.de/blog/2011/02/19/implementing-parallel-breadth-first-search-using-net-4-0-tpl/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Druckerfreigabe Windows 7 64-Bit für Windows XP 32-Bit Canon iP4300</title>
		<link>http://s1ckboy.de/blog/2011/01/12/druckerfreigabe-windows-7-64-bit-fur-windows-xp-32-bit-canon-ip4300/</link>
		<comments>http://s1ckboy.de/blog/2011/01/12/druckerfreigabe-windows-7-64-bit-fur-windows-xp-32-bit-canon-ip4300/#comments</comments>
		<pubDate>Wed, 12 Jan 2011 19:46:48 +0000</pubDate>
		<dc:creator>s1ck</dc:creator>
				<category><![CDATA[windows 7]]></category>
		<category><![CDATA[canon]]></category>
		<category><![CDATA[fehler]]></category>
		<category><![CDATA[freigabe]]></category>
		<category><![CDATA[iP4300]]></category>
		<category><![CDATA[prozessorarchitektur]]></category>
		<category><![CDATA[treiber]]></category>
		<category><![CDATA[windows xp]]></category>

		<guid isPermaLink="false">http://s1ckboy.de/blog/?p=111</guid>
		<description><![CDATA[Unter Windows 7 einen Drucker einzurichten ist vergleichsweise einfach. Im Fall meines Canon iP4300 reichte das Anschalten des Druckers völlig aus (eine Internetverbindung vorausgesetzt). Problematischer ist hingegen das Freigeben des Druckers für Rechner mit unterschiedlichen Windows Versionen. Hierzu bietet Windows 7 die Möglichkeit, entsprechende Treiber bereitzustellen. Diese Bereitstellung erfolgt jedoch manuell. Versucht man den Canon [...]]]></description>
			<content:encoded><![CDATA[<p>Unter Windows 7 einen Drucker einzurichten ist vergleichsweise einfach. Im Fall meines Canon iP4300 reichte das Anschalten des Druckers völlig aus (eine Internetverbindung vorausgesetzt).</p>
<p>Problematischer ist hingegen das Freigeben des Druckers für Rechner mit unterschiedlichen Windows Versionen. Hierzu bietet Windows 7 die Möglichkeit, entsprechende Treiber bereitzustellen. Diese Bereitstellung erfolgt jedoch manuell.</p>
<p>Versucht man den Canon Windows XP 32-Bit Treiber (1.95) (<a title="Canon Treiber 1.95" href="http://de.software.canon-europe.com/software/0024841.asp" target="_blank">http://de.software.canon-europe.com/software/0024841.asp</a>) unter Windows 7 64-Bit zur Verfügung zu stellen, kommt es zur der Fehlermeldung</p>
<p><em>Der angegebene Pfad enthält keinen Treiber Canon Inkjet iP4300 für die angeforderte Prozessorarchitektur.</em></p>
<p>Ein einfaches Suchen &amp; Ersetzen löst dieses Problem. Dazu die ip4300.inf Datei öffnen (Canon\Driver\iP4300.inf) und alle Vorkommen von &#8220;<strong>Canon iP4300</strong>&#8221; mit &#8220;<strong>Canon Inkjet iP4300</strong>&#8221; ersetzen.</p>
<p>Anschließend wird der Treiber als solcher durch den Freigabeassistenten erkannt und unter Zustimmung zur Verwendung nicht autorisierter Treiber kann dieser auch verwendet werden. Eine Installation ist unter Windows XP nun ohne zusätzliche Treiber möglich. Probleme, welche auf diese Änderung zurückzuführen wären konnte ich nicht feststellen.</p>
]]></content:encoded>
			<wfw:commentRss>http://s1ckboy.de/blog/2011/01/12/druckerfreigabe-windows-7-64-bit-fur-windows-xp-32-bit-canon-ip4300/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Metaheuristik mal anders</title>
		<link>http://s1ckboy.de/blog/2010/12/11/metaheuristik-mal-anders/</link>
		<comments>http://s1ckboy.de/blog/2010/12/11/metaheuristik-mal-anders/#comments</comments>
		<pubDate>Sat, 11 Dec 2010 22:34:12 +0000</pubDate>
		<dc:creator>s1ck</dc:creator>
				<category><![CDATA[a&d]]></category>
		<category><![CDATA[fun]]></category>
		<category><![CDATA[marienkäfer]]></category>
		<category><![CDATA[metaheuristik]]></category>
		<category><![CDATA[tsp]]></category>

		<guid isPermaLink="false">http://s1ckboy.de/blog/?p=99</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<div id="attachment_103" class="wp-caption aligncenter" style="width: 310px"><a href="http://s1ckboy.de/blog/wp-content/uploads/2010/12/IMG_30121.jpg"><img class="size-medium wp-image-103" title="Wintergast löst TSP" src="http://s1ckboy.de/blog/wp-content/uploads/2010/12/IMG_30121-300x200.jpg" alt="" width="300" height="200" /></a><p class="wp-caption-text">Wintergast löst TSP</p></div>
]]></content:encoded>
			<wfw:commentRss>http://s1ckboy.de/blog/2010/12/11/metaheuristik-mal-anders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cebit 2k10</title>
		<link>http://s1ckboy.de/blog/2010/03/08/morbo-and-friends-cebit-2k10/</link>
		<comments>http://s1ckboy.de/blog/2010/03/08/morbo-and-friends-cebit-2k10/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 20:30:45 +0000</pubDate>
		<dc:creator>s1ck</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[cebit]]></category>
		<category><![CDATA[graphdb]]></category>
		<category><![CDATA[hannover]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[semantic web]]></category>
		<category><![CDATA[sones]]></category>
		<category><![CDATA[wortschatz]]></category>

		<guid isPermaLink="false">http://s1ckboy.de/blog/?p=36</guid>
		<description><![CDATA[Letzten Samstag waren zwei meiner Kommilitonen und ich seit Langem mal wieder auf der Cebit. Nach ein paar Startschwierigkeiten (zwei falsch gestellte Handywecker) konnten wir 8:34 Jena per Raumschiff verlassen. An dieser Stelle nochmal großes &#8220;Sorry&#8221; an Micha, der echt 6:30 sehnsüchtig am Ufo stand, während wir anderen so langsam das Land der Träume verließen. [...]]]></description>
			<content:encoded><![CDATA[<p>Letzten Samstag waren zwei meiner Kommilitonen und ich seit Langem mal wieder auf der Cebit. Nach ein paar Startschwierigkeiten (zwei falsch gestellte Handywecker) konnten wir 8:34 Jena per Raumschiff verlassen. An dieser Stelle nochmal großes &#8220;Sorry&#8221; an Micha, der echt 6:30 sehnsüchtig am Ufo stand, während wir anderen so langsam das Land der Träume verließen.</p>
<p>Nach längerer Parkplatzsuche haben wir uns entschlossen, das Teil auf irgendeinem Mast zu parken. Das funktionierte auch ganz gut wie man im Bild sehen kann.</p>
<p><a href="http://s1ckboy.de/blog/wp-content/uploads/2010/03/morbos_schiff.jpg"><img class="aligncenter size-medium wp-image-38" title="morbos schiff" src="http://s1ckboy.de/blog/wp-content/uploads/2010/03/morbos_schiff-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p>Motiviert und munter wie eh und je mischten wir uns unter das gemeine Volk der Beutelratten. Wem dies kein Begriff ist: die Beutelratten sind eine Art Messebesucher, welche sich dadurch auszeichnen, mit großen, meist bunt bedruckten Beuteln alle Stände auf der Suche nach Werbegeschenken abzugrasen. Der Anteil der Beutelratten unter den Messebesuchern ist an Wochenenden meist höher als an Werktagen.</p>
<p>Unsere Reise begann in Halle 13 gefolgt von Halle 12. Der Schwerpunkt lag hier auf Business Communications &amp; Networking, eine Thematik die besonders Micha schwer beeindruckte. Til und ich wunderten uns jedenfalls sehr darüber, dass vertikal eingebaute Stromsteckerleisten in Serverschränken als Innovation gelten. Nunja, als Entwickler setzt man wohl andere Schwerpunkte :)</p>
<p>Im Übergang von Halle 12 zu Halle 9 (ja wir haben einige Hallen übersprungen) entstand dann auch folgendes Foto. Wer sich jetzt wundert warum Micha und Til nicht in die Kamera schauen, die Faszination für das um 180° schwenkbare Display meiner 3 Jahre alten Handgepäck-Canon war einfach zu groß&#8230;</p>
<p><a href="http://s1ckboy.de/blog/wp-content/uploads/2010/03/alle_drei.jpg"><img class="aligncenter size-medium wp-image-40" title="morbo and friends" src="http://s1ckboy.de/blog/wp-content/uploads/2010/03/alle_drei-300x208.jpg" alt="" width="300" height="208" /></a></p>
<p>In Halle 9 angekommen, begann für mich persönlich der interessante Teil der cebit, der &#8220;future parc&#8221;. Hier stellten alle Bundesländer ihre innovativsten Projekte vor, darunter beispielsweise die wissensbasierte Suchmaschine für biomedizinische Texte <a title="GoPubMed" href="http://www.gopubmed.com/web/gopubmed/" target="_blank">GoPubMed</a> der <a title="TU Dresden" href="http://tu-dresden.de/" target="_blank">TU Dresden</a>. Weiterhin konnte man die aktuellen Projekte des <a title="BMWI" href="http://www.bmwi.de/" target="_blank">Bundesministeriums für Wirtschaft und Technologie</a> begutachten. Das im Rahmen des<a title="Theseus" href="http://www.theseus-programm.de/default.aspx" target="_blank"> Theseus</a>-Programms vorgestellte Projekt <em>Alexandria</em> zeigte beispielsweise wie das im Web2.0 verfügbare Wissen besser vernetzt und leichter zugänglich gemacht werden kann. Schwerpunkt ist hier die semantische Suche, bei der Anfragen in natürlicher Sprache gestellt werden. Seeehr beeindruckend. Die <a title="FSU Jena" href="http://www.uni-jena.de/" target="_blank">FSU Jena</a> stellte das Projekt <em>Mehrdimensionale Wortschatzvernetzung</em> vor, welches es sich zum Ziel gesetzt hat den deutschen Wortschatz anhand einer <a title="Lemma" href="http://de.wikipedia.org/wiki/Lemma_(Lexikografie)" target="_blank">Lemma</a> Maske zu analysieren und die Ergebnisse in einer auf semantischen Technologien basierenden Datenbank zu übertragen.</p>
<p>Nach etwa 1,5 Stunden im &#8220;future parc&#8221; setzte sich unserer Rundgang bis zur Halle 4 fort.  Dort traten wir sofort die Suche nach meinem Arbeitgeber, der <a title="sones" href="http://www.sones.com" target="_blank">sones GmbH</a>, an. Mitten unter den vielen Microsoft Partnern fanden wir die Jungs auch relativ flott und trafen auf <a title="cosh" href="http://www.dreiundzwanzig.biz/" target="_blank">cosh</a> und ho.lie im schicken Buiness-Dress. Nachdem die beiden netterweise meinen Kommilitonen erklärt haben was wir so tun, entstand folgendes Foto:</p>
<p><a href="http://s1ckboy.de/blog/wp-content/uploads/2010/03/sones.jpg"><img class="aligncenter size-medium wp-image-46" title="sones" src="http://s1ckboy.de/blog/wp-content/uploads/2010/03/sones-300x198.jpg" alt="" width="300" height="198" /></a></p>
<p>Nachdem wir noch den restlichen Microsoft-Stand begutachtet haben und aufgrund der hohen Besucherdichte leider nur wenige Einblicke in Visual Studio 2010 und Office 2010 bekamen, stellte sich ein leichtes Hungergefühl ein und wir entschlossen uns so langsam die Heimreise anzutreten jedoch nicht ohne einen kleinen Abstecher ins das zu Beginn erspähte Lokal einer bekannten Fast Foot Kette zu unternehmen (mjam).</p>
<p>Beim Durchstreifen des cebit Geländes hatten wir kurz das Gefühl ein bekanntes Gesicht zu sehen :P</p>
<p><a href="http://s1ckboy.de/blog/wp-content/uploads/2010/03/historic.jpg"><img class="aligncenter size-medium wp-image-47" title="historic" src="http://s1ckboy.de/blog/wp-content/uploads/2010/03/historic-300x274.jpg" alt="" width="300" height="274" /></a></p>
<p>Unter diesem Motto möchte ich auch den Bericht über unseren Ausflug abschließen. Der Ausflug hat sich gelohnt, wenn man mal vom Muskelkater von 4!!Stunden Fußmarsch absieht :)</p>
]]></content:encoded>
			<wfw:commentRss>http://s1ckboy.de/blog/2010/03/08/morbo-and-friends-cebit-2k10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Titan Quest&#8230; again</title>
		<link>http://s1ckboy.de/blog/2010/02/19/titan-quest-again/</link>
		<comments>http://s1ckboy.de/blog/2010/02/19/titan-quest-again/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 20:38:26 +0000</pubDate>
		<dc:creator>s1ck</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[char]]></category>
		<category><![CDATA[steropes]]></category>
		<category><![CDATA[titan quest]]></category>

		<guid isPermaLink="false">http://s1ckboy.de/blog/?p=27</guid>
		<description><![CDATA[Heute kam uns die Idee mal wieder einen neuen Titan Quest Char zu erstellen&#8230; bei der Recherche nach einem enstprechenden Namen stieß ich auf Steropes, ein Kyklop aus der griechischen Mythologie. Als wir dann mal unter Kyklop genauere Information erlangen wollten, präsentierte sich dieses Bild: Es hat uns sehr erheitert :) Na dann, ab ins [...]]]></description>
			<content:encoded><![CDATA[<p>Heute kam uns die Idee mal wieder einen neuen Titan Quest Char zu erstellen&#8230; bei der Recherche nach einem enstprechenden Namen stieß ich auf <em>Steropes</em>, ein Kyklop aus der griechischen Mythologie.</p>
<p>Als wir dann mal unter <em>Kyklop</em> genauere Information erlangen wollten, präsentierte sich dieses Bild:</p>
<p><a href="http://s1ckboy.de/blog/wp-content/uploads/2010/02/472px-Redon.cyclops.jpg"><img class="aligncenter size-medium wp-image-28" title="Der Zyklop" src="http://s1ckboy.de/blog/wp-content/uploads/2010/02/472px-Redon.cyclops-236x300.jpg" alt="" width="236" height="300" /></a></p>
<p>Es hat uns sehr erheitert :)</p>
<p>Na dann, ab ins Geschnetzel!</p>
]]></content:encoded>
			<wfw:commentRss>http://s1ckboy.de/blog/2010/02/19/titan-quest-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows 7 command prompt im Explorer Context Menu</title>
		<link>http://s1ckboy.de/blog/2010/02/07/windows-7-command-prompt-im-explorer-context-menu/</link>
		<comments>http://s1ckboy.de/blog/2010/02/07/windows-7-command-prompt-im-explorer-context-menu/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 12:01:28 +0000</pubDate>
		<dc:creator>s1ck</dc:creator>
				<category><![CDATA[windows 7]]></category>
		<category><![CDATA[cmd]]></category>
		<category><![CDATA[command prompt]]></category>
		<category><![CDATA[context menu]]></category>
		<category><![CDATA[doshere.inf]]></category>

		<guid isPermaLink="false">http://s1ckboy.de/blog/?p=16</guid>
		<description><![CDATA[Windows 7 bietet dem Nutzer die Möglichkeit mittels &#8220;Shift + rechte Maustaste&#8221; das Context Menu des Explorers zu erweitern. Führt man dies nun auf ein Verzeichnis aus, so hat man die Möglichkeit die Kommadozeile im aktuell selektierten Ordner zu öffnen, was in vielen Fällen sehr hilfreich sein kann. Um die Option &#8220;Eingabeaufforderung hier öffnen&#8221; auch bei [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Windows 7 bietet dem Nutzer die Möglichkeit mittels &#8220;Shift + rechte Maustaste&#8221; das Context Menu des Explorers zu erweitern. Führt man dies nun auf ein Verzeichnis aus, so hat man die Möglichkeit die Kommadozeile im aktuell selektierten Ordner zu öffnen, was in vielen Fällen sehr hilfreich sein kann.</p>
<p style="text-align: left;"><a href="http://s1ckboy.de/blog/wp-content/uploads/2010/02/context.png"><img class="size-medium wp-image-17 aligncenter" title="Context Menu" src="http://s1ckboy.de/blog/wp-content/uploads/2010/02/context-300x121.png" alt="" width="300" height="121" /></a><br />
Um die Option &#8220;Eingabeaufforderung hier öffnen&#8221; auch bei einem normalen Rechtsklick anzeigen zu lassen, ist folgende Änderung an der Windows Registry notwendig:</p>
<ul>
<li style="text-align: left;">Im Startmenü &#8220;regedit&#8221; ausführen</li>
<li>zu <em>HKEY_CLASSES_ROOT\Directory\shell\cmd </em>navigieren</li>
<li>den Eintrag <em>Extended </em>entweder löschen oder umbenennen</li>
<li>Fertig</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://s1ckboy.de/blog/2010/02/07/windows-7-command-prompt-im-explorer-context-menu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>watch morbo</title>
		<link>http://s1ckboy.de/blog/2010/02/01/watch-morbo/</link>
		<comments>http://s1ckboy.de/blog/2010/02/01/watch-morbo/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 20:55:27 +0000</pubDate>
		<dc:creator>s1ck</dc:creator>
				<category><![CDATA[misc]]></category>

		<guid isPermaLink="false">http://s1ckboy.de/blog/?p=4</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/JU94q9xoMr8&#038;hl=de_DE&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/JU94q9xoMr8&#038;hl=de_DE&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://s1ckboy.de/blog/2010/02/01/watch-morbo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

