<?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>ALGOholic - A Coder&#039;s Blog</title>
	<atom:link href="http://algoholic.eu/feed/" rel="self" type="application/rss+xml" />
	<link>http://algoholic.eu</link>
	<description>Written by Stanisław Adaszewski</description>
	<lastBuildDate>Mon, 21 May 2012 08:16:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>New Theme: Bye bye iNove, welcome iFeature</title>
		<link>http://algoholic.eu/new-theme/</link>
		<comments>http://algoholic.eu/new-theme/#comments</comments>
		<pubDate>Sun, 20 May 2012 13:53:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://algoholic.eu/?p=1135</guid>
		<description><![CDATA[I felt it was time for a change on my blog, so I did a little search for new theme yesterday. I found this lovely iFeature theme which you can see in action now. It features something called iFeature Slider &#8211; basically it&#8217;s a carousel type widget that displays images assigned to recent posts from<a href="http://algoholic.eu/new-theme/"> <br /><br /> Read More…</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://algoholic.eu/wp-content/uploads/2012/05/byebye_inove.png" rel="lightbox[1135]" title="byebye_inove"><img src="http://algoholic.eu/wp-content/uploads/2012/05/byebye_inove-e1337588198611-150x120.png" alt="" title="byebye_inove" width="150" height="120" class="alignleft size-thumbnail wp-image-1151" /></a>I felt it was time for a change on my blog, so I did a little search for new theme yesterday. I found this lovely <a href="http://wordpress.org/extend/themes/ifeature">iFeature</a> theme which you can see in action now. It features something called iFeature Slider &#8211; basically it&#8217;s a carousel type widget that displays images assigned to recent posts from given Category. I modified it a little to always use first image from the post content &#8211; this way I don&#8217;t have to specify image manually. I also created Featured category &#8211; posts from this category will be displayed on the Slider. Enjoy : )</p>
]]></content:encoded>
			<wfw:commentRss>http://algoholic.eu/new-theme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ThinGit: SSH session reuse + significant GUI improvements</title>
		<link>http://algoholic.eu/thin-git-ssh-session-reuse-update/</link>
		<comments>http://algoholic.eu/thin-git-ssh-session-reuse-update/#comments</comments>
		<pubDate>Fri, 18 May 2012 12:16:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[collaboration]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[lightweight]]></category>
		<category><![CDATA[sharing]]></category>
		<category><![CDATA[sparkleshare]]></category>
		<category><![CDATA[system]]></category>
		<category><![CDATA[thin]]></category>
		<category><![CDATA[thin-git]]></category>
		<category><![CDATA[version]]></category>

		<guid isPermaLink="false">http://algoholic.eu/?p=1116</guid>
		<description><![CDATA[I&#8217;ve updated ThinGit to reuse existing SSH sessions instead of re-establishing them for every operation &#8211; it speeds up processing significantly and reduces CPU usage! I&#8217;ve also made GUI a LOT more user-friendly. Enjoy! DOWNLOAD: ThinGit Update]]></description>
			<content:encoded><![CDATA[<p><a href="http://algoholic.eu/wp-content/uploads/2012/05/tglogo280.png" rel="lightbox[1116]" title="tglogo280"><img src="http://algoholic.eu/wp-content/uploads/2012/05/tglogo280-150x150.png" alt="" title="tglogo280" width="150" height="150" class="alignleft size-thumbnail wp-image-1127" /></a>I&#8217;ve updated ThinGit to reuse existing SSH sessions instead of re-establishing them for every operation &#8211; it speeds up processing significantly and reduces CPU usage! I&#8217;ve also made GUI a LOT more user-friendly. Enjoy!</p>
<p><strong>DOWNLOAD:</strong> <a href='http://algoholic.eu/wp-content/uploads/2012/05/thin-git1.zip'>ThinGit Update</a></p>
]]></content:encoded>
			<wfw:commentRss>http://algoholic.eu/thin-git-ssh-session-reuse-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ThinGit</title>
		<link>http://algoholic.eu/thingit/</link>
		<comments>http://algoholic.eu/thingit/#comments</comments>
		<pubDate>Tue, 15 May 2012 14:01:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[collaboration]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[lightweight]]></category>
		<category><![CDATA[sharing]]></category>
		<category><![CDATA[sparkleshare]]></category>
		<category><![CDATA[system]]></category>
		<category><![CDATA[thin]]></category>
		<category><![CDATA[thin-git]]></category>
		<category><![CDATA[version]]></category>

		<guid isPermaLink="false">http://algoholic.eu/?p=1070</guid>
		<description><![CDATA[OK, finally I&#8217;m ready to present my collaboration/content-sharing tool &#8211; ThinGit! ThinGit periodically synchronizes local Git repositories with their remote origins and features automatic conflict resolution by creating timestamped copies of conflicted files. As such, its primary use is as an alternative to DropBox and SparkleShare! As the name suggests, it is &#8211; similarly to<a href="http://algoholic.eu/thingit/"> <br /><br /> Read More…</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://algoholic.eu/wp-content/uploads/2012/05/tglogo280.png" rel="lightbox[1070]" title="tglogo280"><img src="http://algoholic.eu/wp-content/uploads/2012/05/tglogo280-150x150.png" alt="" title="tglogo280" width="150" height="150" class="alignleft size-thumbnail wp-image-1127" /></a>OK, finally I&#8217;m ready to present my collaboration/content-sharing tool &#8211; ThinGit! ThinGit periodically synchronizes local Git repositories with their remote origins and features automatic conflict resolution by creating timestamped copies of conflicted files. As such, its primary use is as an alternative to DropBox and SparkleShare!</p>
<p>As the name suggests, it is &#8211; similarly to SparkleShare &#8211; based on Git. To be precise &#8211; the idea behind it is identical, so all tutorials for setting up a repository for SparkleShare are also valid for ThinGit.</p>
<p>ThinGit is completely self-contained (requires only Java) and comes in a single JAR file 1.8MB in size. Under the hood it uses JGit (for Git repository handling), JSch (for SSH access), cli-parser (for command-line arguments parsing) and &#8211; interestingly &#8211; AspectJ. Yes &#8211; for the first time ever I actually found a good application for AspectJ. I used it to inject code that sets HTTP proxy for SSH sessions created by JGit (functionality which is unfortunately not exposed by JGit API and it wasn&#8217;t possible to set a default proxy using JSch API either). ThinGit was originally a command-line only tool (compare pics 1/2/3) and actually can still be considered command-line in nature because the minimalistic GUI I&#8217;ve prepared basically just helps you set the proper command line arguments (and remembers them for future use). To adhere more to industry standards, it also features a tray icon and notifications about repository updates in balloon tips (pic 4) but that&#8217;s it &#8211; lean and mean, as promised <img src='http://algoholic.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Now, let me describe briefly the list of parameters:</p>
<p><strong>Paths containing Git repositories to be serviced</strong> &#8211; this is a list of paths on your local filesystem with Git repositories that you wish to have handled by ThinGit<br />
<strong>HTTP proxy host/port/username/password</strong> &#8211; these parameters specify the HTTP proxy to be used; if host is not set, the others are ignored<br />
<strong>Username to be used in case of interactive authentication</strong> &#8211; CLI-only &#8211; specifies the username to be used for remote SSH connections<br />
<strong>Ask for password to be used during interactive authentication</strong> &#8211; CLI-only &#8211; makes ThinGit ask for password at startup; this password will be used for all authentication purposes later<br />
<strong>Delay between synchronizations (in milliseconds)</strong> &#8211; Delay between consecutive cycles of synchronization; it&#8217;s a matter of personal taste, reasonably can be anything between 10 seconds and 10 minutes; note that if both sides have this delay set to 10 minutes, the worst case delay between side A updates getting propagated to side B is 20 minutes!<br />
<strong>Disable graphical subsystem</strong> &#8211; forces use of CLI; normally ThinGit tries to launch GUI and only if it fails, falls back to CLI<br />
<strong>Clone selected repository</strong> &#8211; this argument takes precedence over -repos; if it&#8217;s specified ThinGit will perform a git-clone command on the selected repository; normally you will launch ThinGit once with this parameter set and then clear it and set -repos instead<br />
<strong>Target path of cloned repository</strong> &#8211; target argument of the git-clone command<br />
<strong>Cycle once through repositories and exit</strong> &#8211; don&#8217;t loop the execution, process all repositories once and exit<br />
<strong>Show configuration dialog</strong> &#8211; Unused<br />
<strong>Set Java look and feel</strong> &#8211; GUI-only &#8211; Sets Java Look and Feel, possible values are windows and gtk; you can also set LAF using Java&#8217;s standard -Dswing.defaultlaf= switch. Requires restart!<br />
<strong>Start as tray icon only</strong> &#8211; GUI-only &#8211; Starts application without showing the main window</p>
<p>Noteworthy, JGit, and thus ThinGit processes ~/.ssh/config file so it is possible to set up a password-less key-based login to your repository server! In my case, the whole setup was like following: I&#8217;m running an Apache server with mod_proxy limiting access by IP and AllowCONNECT set to Yes and SSH with key-based authorization. My ~/.ssh/config contains appropriate entries. My key is password protected so I have to enter the password each time ThinGit starts. I configured proxy first giving algoholic.eu as host and 80 as port, then I ran ThinGit with -clone set to algoholic.eu:/tmp/git1 (my test repository) and -clone-dest set to C:/tmp/git5. After it completed cloning, I ran it with -clone parameter removed and C:/tmp/git5 added to -repos.</p>
<p>And that was it! Now I have it running on my test repository for 24 hours already and it&#8217;s doing nicely so far. It&#8217;s doing such a good job replacing my pen-drive that I&#8217;m actually going to establish a more permanent repo and hold all my small projects together in there. I was growing tired of creating separate Git repos for each small thing and keeping them without any versioning is also quite bothersome, so I welcome my own new creation <img src='http://algoholic.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>As you can see (pic 5) a repository serviced by ThinGit can still be accessed by regular Git tools (in this case &#8211; GitExtensions) allowing for easy history management.</p>
<p>To summarize the rationale and benefits of ThinGit:<br />
1) Self-contained Java-based application &#8211; just one small JAR file for every platform (also Windows XP <img src='http://algoholic.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ) supporting Java SE. It&#8217;s by far the smallest application of this kind!<br />
2) Supports HTTP CONNECT proxy &#8211; in my experience, the most reliable way of circumventing firewalls (SOCKS proxy are supported using Java&#8217;s -DsocksProxyHost=socks.mydomain.com switch)<br />
3) Command-line and graphical interfaces that map almost 1:1 allowing for execution in environments with or without graphical subsystem.<br />
4) You can use existing Git tools, including Git-based sharing/collaboration applications like SparkleShare in an interchangeable manner (e.g. when you need to access your repository from Android, SparkleShare might be the right choice!)<br />
5) And of course this &#8211; <a title="DropBox, SparkleShare, … thin-git" href="http://algoholic.eu/thin-git/">part 1</a>, <a title="DropBox, SparkleShare, … thin-git (Part 2)" href="http://algoholic.eu/dropbox-sparkleshare-thin-git-part-2/">part 2</a></p>
<p>I recommend ThinGit to those who are concerned with security and for some reasons have trouble running SparkleShare or just like a lean-and-mean solution like ThinGit more. Enjoy!</p>
<p><strong>DOWNLOAD:</strong> <a href="http://algoholic.eu/wp-content/uploads/2012/05/thin-git.zip">ThinGit (JAR file inside ZIP)</a></p>
<p><a href="http://algoholic.eu/wp-content/uploads/2012/05/tg1.png" rel="lightbox[1070]" title="tg1"><img class="size-medium wp-image-1071 alignnone" title="tg1" src="http://algoholic.eu/wp-content/uploads/2012/05/tg1-300x257.png" alt="" width="300" height="257" /></a></p>
<p><a href="http://algoholic.eu/wp-content/uploads/2012/05/tg11.png" rel="lightbox[1070]" title="tg1"><img class="wp-image-1073 alignnone" title="tg1" src="http://algoholic.eu/wp-content/uploads/2012/05/tg11-300x151.png" alt="" width="300" height="151" /></a></p>
<p><a href="http://algoholic.eu/wp-content/uploads/2012/05/tg12.png" rel="lightbox[1070]" title="tg1"><img class="size-medium wp-image-1075 alignnone" title="tg1" src="http://algoholic.eu/wp-content/uploads/2012/05/tg12-300x230.png" alt="" width="300" height="230" /></a></p>
<p><a href="http://algoholic.eu/wp-content/uploads/2012/05/tg13.png" rel="lightbox[1070]" title="tg1"><img class="wp-image-1077 alignnone" title="tg1" src="http://algoholic.eu/wp-content/uploads/2012/05/tg13-300x107.png" alt="" width="300" height="107" /></a></p>
<p><a href="http://algoholic.eu/wp-content/uploads/2012/05/tg14.png" rel="lightbox[1070]" title="tg1"><img class="alignleft size-medium wp-image-1079" title="tg1" src="http://algoholic.eu/wp-content/uploads/2012/05/tg14-300x186.png" alt="" width="300" height="186" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://algoholic.eu/thingit/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>DropBox, SparkleShare, &#8230; thin-git (Part 2)</title>
		<link>http://algoholic.eu/dropbox-sparkleshare-thin-git-part-2/</link>
		<comments>http://algoholic.eu/dropbox-sparkleshare-thin-git-part-2/#comments</comments>
		<pubDate>Mon, 14 May 2012 16:28:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Categories: Uncategorized Tags: collaboration]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[lightweight]]></category>
		<category><![CDATA[sharing]]></category>
		<category><![CDATA[sparkleshare]]></category>
		<category><![CDATA[system]]></category>
		<category><![CDATA[thin]]></category>
		<category><![CDATA[thin-git]]></category>
		<category><![CDATA[version]]></category>

		<guid isPermaLink="false">http://algoholic.eu/?p=1065</guid>
		<description><![CDATA[As announced, I&#8217;ve installed DropBox and SparkleShare today on my Windows XP-based PC. DropBox works out-of-the-box and makes the impression of a mature and stable application. It works fast, reliably and features Web interface to overlook and manage the state of your remote repository. Its only shortcoming (except for the one mentioned in previous post)<a href="http://algoholic.eu/dropbox-sparkleshare-thin-git-part-2/"> <br /><br /> Read More…</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://algoholic.eu/wp-content/uploads/2012/05/Dropbox-Review-2-e1336902298704.jpg" rel="lightbox[1065]" title="Dropbox-Review-2"><img src="http://algoholic.eu/wp-content/uploads/2012/05/Dropbox-Review-2-e1336902298704-150x150.jpg" alt="" title="Dropbox-Review-2" width="150" height="150" class="alignleft size-thumbnail wp-image-1062" /></a>As announced, I&#8217;ve installed DropBox and SparkleShare today on my Windows XP-based PC. DropBox works out-of-the-box <img src='http://algoholic.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  and makes the impression of a mature and stable application. It works fast, reliably and features Web interface to overlook and manage the state of your remote repository. Its only shortcoming (except for the one mentioned in previous post) is that you cannot manage file history in off-line mode &#8211; this is something Git-based solutions for sure don&#8217;t suffer from (major benefit of distributed VCS). Thanks to directory monitoring, changes are picked up right when they actually happen (not in a time-triggered fashion) and are propagated to DropBox server almost instantly. So basically &#8211; DropBox just works(tm <img src='http://algoholic.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  )</p>
<p>Now to SparkleShare &#8211; unfortunately, I&#8217;ve learned the painful way (immortal &#8216;Program has ended unexpectedly&#8230;&#8217; message) that it is unsupported on Windows XP !!! That&#8217;s a major issue in my opinion but never mind &#8211; I gave it a try anyway on another PC running Windows 7. SparkleShare&#8217;s user interface looks quite nice and provides easy wizard-based configuration. We can have SparkleShare handle Git projects hosted on our own server or any of the free Git hosting providers: Bitbucket, Github, Gitorious or The GNOME Project. However, all seems nice and well only as long as you&#8217;re not behind a firewall! I&#8217;ve tried to add a project hosted on my own server and failed miserably. For all the free hosting providers SparkleShare also tries to use SSH and fails. And there&#8217;s no option for HTTP proxy configuration (this is what I normally use to punch through to my server). Ouch! That&#8217;s painful &#8211; I can&#8217;t really test it now, can I? ;/ Actually I can but since it requires some extra steps, I will let it rest for now.</p>
<p>It was all anyway to prepare the stage for a new player &#8211; my very own <strong>thin-git</strong> ; ) More about it in the next post. It actually works where SparkleShare failed! <img src='http://algoholic.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://algoholic.eu/dropbox-sparkleshare-thin-git-part-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>DropBox, SparkleShare, &#8230; thin-git</title>
		<link>http://algoholic.eu/thin-git/</link>
		<comments>http://algoholic.eu/thin-git/#comments</comments>
		<pubDate>Sun, 13 May 2012 09:43:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[collaboration]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[lightweight]]></category>
		<category><![CDATA[sharing]]></category>
		<category><![CDATA[sparkleshare]]></category>
		<category><![CDATA[system]]></category>
		<category><![CDATA[thin]]></category>
		<category><![CDATA[thin-git]]></category>
		<category><![CDATA[version]]></category>

		<guid isPermaLink="false">http://algoholic.eu/?p=1050</guid>
		<description><![CDATA[Recently I had a little discussion about DropBox, which was highly praised by my colleague for its simplicity, efficacy, security, etc. Of course I like the idea very much and believe that it works good, because otherwise it wouldn&#8217;t have so many users. However there&#8217;s one thing fundamentally wrong with it, and it&#8217;s the same<a href="http://algoholic.eu/thin-git/"> <br /><br /> Read More…</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://algoholic.eu/wp-content/uploads/2012/05/Dropbox-Review-2.jpg" rel="lightbox[1050]" title="Dropbox-Review-2"><img src="http://algoholic.eu/wp-content/uploads/2012/05/Dropbox-Review-2-e1336902298704-150x150.jpg" alt="" title="Dropbox-Review-2" width="150" height="150" class="alignleft size-thumbnail wp-image-1062" /></a>Recently I had a little discussion about <a href="http://www.dropbox.com/">DropBox</a>, which was highly praised by my colleague for its simplicity, efficacy, security, etc. Of course I like the idea very much and believe that it works good, because otherwise it wouldn&#8217;t have so many users. However there&#8217;s one thing fundamentally wrong with it, and it&#8217;s the same thing that is wrong with Gmail &#8211; your data (this time it&#8217;s not just your emails, it&#8217;s your real data for God&#8217;s sake!!) is stored on a 3rdparty server!!! Unencrypted! And even though DropBox announces the following on its website:</p>
<blockquote><p>Dropbox employees are prohibited from viewing the content of files you store in your Dropbox account, and are only permitted to view file metadata (e.g., file names and locations).
</p></blockquote>
<p>you know what? I just don&#8217;t believe them! Also, just take a look at the DropShip story and imagine how much data could&#8217;ve leaked this way. So sure&#8230; I don&#8217;t mind you using DropBox &#8211; I wouldn&#8217;t even mind using DropBox myself for storing some multimedia files &#8211; but I definitely think you&#8217;re crazy if you keep your business or research data there and I would for sure never go with such solution myself.</p>
<p>However, criticism without any suggestion of alternative solution is worth close to nothing, so I started looking for a free and open-source DropBox-like applications. Almost instantly I found <a href="http://sparkleshare.org/">SparkleShare</a> which mimics precisely functionality of DropBox &#8211; it is multi-platform, has user-friendly GUI, supports file sharing and version control . What&#8217;s more &#8211; it let&#8217;s you set up your very own server! To that end you only need a machine running Git VCS and SSH!!! SparkleShare&#8217;s architecture is trivial and powerful at the same time. Basically it&#8217;s just having a remote Git repository and its many clones and SparkleShare running git commit/fetch/rebase/push periodically on all of them with automatic conflict resolution based on timestamped copies creation (i.e. whenever there&#8217;s a mid-air collision, one version is given a new filename with timestamp appended, the other one is left as it was). Standard Git parameters are tweaked to accommodate your files which will typically be a lot larger than text files Git normally works with. All in all, SparkleShare claims to be an efficient and robust solution.</p>
<p>Now &#8211; I admit I haven&#8217;t really tested either DropBox or SparkleShare ; ) I know, I know&#8230; how can I have an opinion, right? ; ) Just to be on the safe side &#8211; I will give them both a try on Monday. In the meantime however, I have prepared my own SparkleShare-inspired piece of code <img src='http://algoholic.eu/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>It&#8217;s called thin-git and at the moment is just a console-based tool (no GUI). However it could already replace SparkleShare in terms of functionality. Why a new application instead of contributing to SparkleShare? Well&#8230; I wanted to create a Java-based solution relying on JGit only so that you could use it without having to download the original Git tools. Actually both DropBox and SparkleShare fall short of my liking because of the libraries they use. DropBox is based on wxWidgets and SparkleShare/Linux on GTK# (and probably System.Windows.Forms for Windows). In other words &#8211; as usual, I wanted to offer something lean and mean as alternative to existing bloatware-ish solutions : )</p>
<p>Stay tuned &#8211; I will soon describe my new piece of software and the impressions after using DropBox/SparkleShare in new blog posts. I will also release the application and source code as usual : )</p>
<p>Cheers!</p>
]]></content:encoded>
			<wfw:commentRss>http://algoholic.eu/thin-git/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>QNodesEditor &#8211; Qt nodes/ports-based data processing flow editor</title>
		<link>http://algoholic.eu/qnodeseditor-qt-nodesports-based-data-processing-flow-editor/</link>
		<comments>http://algoholic.eu/qnodeseditor-qt-nodesports-based-data-processing-flow-editor/#comments</comments>
		<pubDate>Tue, 17 Apr 2012 15:17:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[editor]]></category>
		<category><![CDATA[nodes]]></category>
		<category><![CDATA[ports]]></category>
		<category><![CDATA[processing]]></category>
		<category><![CDATA[qt]]></category>
		<category><![CDATA[workflow]]></category>

		<guid isPermaLink="false">http://algoholic.eu/?p=1023</guid>
		<description><![CDATA[In case you ever wanted to use nodes-based editor in Qt, I think I&#8217;ve got just the right thing for you. I tried to make sure that no similar solution already existed. Now, briefly about the software I&#8217;ve stumbled upon and what is wrong with it in my opinion: 1) http://openassembler.wordpress.com/ &#8211; requires Python and<a href="http://algoholic.eu/qnodeseditor-qt-nodesports-based-data-processing-flow-editor/"> <br /><br /> Read More…</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://algoholic.eu/wp-content/uploads/2012/04/qnodeseditor.png" rel="lightbox[1023]" title="qnodeseditor"><img src="http://algoholic.eu/wp-content/uploads/2012/04/qnodeseditor-300x224.png" alt="" title="qnodeseditor" width="300" height="224" class="alignleft size-medium wp-image-1024" /></a> In case you ever wanted to use nodes-based editor in Qt, I think I&#8217;ve got just the right thing for you. I tried to make sure that no similar solution already existed. Now, briefly about the software I&#8217;ve stumbled upon and what is wrong with it in my opinion:</p>
<p>1) <a href="http://openassembler.wordpress.com/">http://openassembler.wordpress.com/</a> &#8211; requires Python and PyQt which excludes pure C++ development &#8211; this doesn&#8217;t suit my needs<br />
2) <a href="https://github.com/nical/kiwi">https://github.com/nical/kiwi</a> &#8211; originally written in D (look above); C++ version is pretty much work in progress, and it&#8217;s a lot more complicated than QNodesEditor &#8211; among other things it imposes conventions intended for nodes-based processing with regards to data containers, ready states, etc. etc. &#8211; complicates things unnecessarily IMHO. <strong>UPDATE:</strong> After taking another look at kiwi I discovered it actually contains a very simple standalone node editor called Qiwi &#8211; it&#8217;s quite all-right, but doesn&#8217;t support port names and saving/loading.<br />
<strong>UPDATE:</strong> 3) <a href="http://nukengine.com/qt-node-editor/">http://nukengine.com/qt-node-editor/</a> &#8211; this one was actually the closest to meet my expectations although I found the necessity to create GUI elements for nodes/ports myself and then attach logical nodes/ports classes to them to be bothersome. It&#8217;s a cool project though and I really like it, especially smart connections alignment.</p>
<p>QNodesEditor&#8217;s hallmark is being as simple as it gets. Blocks are just blocks, I don&#8217;t decide what they should be used for, maybe you just want them to be there and look pretty &#8211; it&#8217;s your choice. If you want to implement some processing logic &#8211; it&#8217;s up to you. New types of blocks can even be created completely dynamically in runtime, you don&#8217;t have to subclass anything. QNodesEditor is primarily a GUI tool.</p>
<p>Blocks consist of named input and output ports. Ports can have additional flags, currently just NamePort and TypePort (ports that cannot be used for connections, they&#8217;re just there to display some extra text with special formatting on the block &#8211; yes, you can think of it as an ugly hack). QNodesEditor supports saving and loading of node diagrams. Again &#8211; all data are saved as-is (names, connections, positions) without any introspection. It&#8217;s up to you to interpret the graphical schematic, attach extra data to it, etc. Blocks and connections are saved in the same order as they&#8217;re placed in the QGraphicsScene, so it seems natural to reference them by index when saving your application-specific data.</p>
<p>A short example:</p>
<pre class="brush: cpp; title: ; notranslate">
    QGraphicsScene *s = new QGraphicsScene();
    ui-&gt;graphicsView-&gt;setScene(s);
    ui-&gt;graphicsView-&gt;setRenderHint(QPainter::Antialiasing);

    QNEBlock *b = new QNEBlock(0, s);
    b-&gt;addPort(&quot;test&quot;, 0, QNEPort::NamePort);
    b-&gt;addPort(&quot;TestBlock&quot;, 0, QNEPort::TypePort);
    b-&gt;addInputPort(&quot;in1&quot;);
    b-&gt;addInputPort(&quot;in2&quot;);
    b-&gt;addInputPort(&quot;in3&quot;);
    b-&gt;addOutputPort(&quot;out1&quot;);
    b-&gt;addOutputPort(&quot;out2&quot;);
    b-&gt;addOutputPort(&quot;out3&quot;);

    b = b-&gt;clone();
    b-&gt;setPos(150, 0);

    b = b-&gt;clone();
    b-&gt;setPos(150, 150);

    nodesEditor = new QNodesEditor(this);
    nodesEditor-&gt;install(s);
</pre>
<p>As you can see, it can hardly be any easier to set up a nodes-based editor. After creating a block &#8220;template&#8221; and cloning it several times to different positions in the scene, you just install QNodesEditor onto QGraphicsScene and voila, your QGraphicsScene is now working as a fully-fledged node editor. Left click and drag on nodes to move them around. Do the same with ports to create connections. Right click nodes and connections to delete them. You can do multiple selection by left-clicking with Ctrl pressed.</p>
<p>If you want to save your diagram, it cannot be any simpler:</p>
<pre class="brush: cpp; title: ; notranslate">
QFile f(&quot;test.nodes&quot;);
f.open(QFile::WriteOnly);
QDataStream ds(&amp;f);
nodesEditor-&gt;save(ds);
</pre>
<p>Want to load them back? No sweat:</p>
<pre class="brush: cpp; title: ; notranslate">
QFile f(&quot;test.nodes&quot;);
f.open(QFile::ReadOnly);
QDataStream ds(&amp;f);
nodesEditor-&gt;load(ds);
</pre>
<p>The code is BSD-licensed. You can use it as-is and develop application-specific stuff completely separately or just modify the code to suit your needs, since it&#8217;s really lightweight and easy to understand. Anyway &#8211; good luck and enjoy! Don&#8217;t forget to drop some feedback in case you find it useful (or not <img src='http://algoholic.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  )!</p>
<p>Cheers!</p>
<p><strong>DEMO:</strong> <a href='http://algoholic.eu/wp-content/uploads/2012/04/qnodeseditor_demo.zip'>qnodeseditor_demo.zip</a><br />
<strong>SOURCE CODE:</strong> <a href='http://algoholic.eu/wp-content/uploads/2012/04/qnodeseditor_src.zip'>qnodeseditor_src.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://algoholic.eu/qnodeseditor-qt-nodesports-based-data-processing-flow-editor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lindenberg&#8217;s watershed-based blob detection for MATLAB</title>
		<link>http://algoholic.eu/lindenbergs-watershed-based-blob-detection-for-matlab/</link>
		<comments>http://algoholic.eu/lindenbergs-watershed-based-blob-detection-for-matlab/#comments</comments>
		<pubDate>Mon, 02 Apr 2012 15:14:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[MATLAB]]></category>
		<category><![CDATA[blob]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[detection]]></category>
		<category><![CDATA[lindenberg]]></category>
		<category><![CDATA[matlab]]></category>
		<category><![CDATA[watershed]]></category>

		<guid isPermaLink="false">http://algoholic.eu/?p=1000</guid>
		<description><![CDATA[Just something I needed recently and haven&#8217;t found any existing standalone implementation. Algorithm description can be found on Wikipedia. Usage is quite simple: &#160; &#160; &#160; &#160; % Where I is 1-, 2- or 3-dimensional image [~, index] = sort(reshape(I, numel(I), 1), 1, &#8216;descend&#8217;); blobs = ls_blob_detect(I, index);]]></description>
			<content:encoded><![CDATA[<p><a href="http://algoholic.eu/wp-content/uploads/2012/02/Matlab_Logo.png" rel="lightbox[1000]" title="Matlab_Logo"><img class="alignleft size-thumbnail wp-image-876" title="Matlab_Logo" src="http://algoholic.eu/wp-content/uploads/2012/02/Matlab_Logo-e1329160681579-150x134.png" alt="" width="150" height="134" /></a>Just something I needed recently and haven&#8217;t found any existing standalone implementation. Algorithm description can be found on <a href="http://en.wikipedia.org/wiki/Blob_detection#Lindeberg.27s_watershed-based_grey-level_blob_detection_algorithm">Wikipedia</a>. Usage is quite simple:</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote><p>% Where I is 1-, 2- or 3-dimensional image<br />
[~, index] = sort(reshape(I, numel(I), 1), 1, &#8216;descend&#8217;);<br />
blobs = ls_blob_detect(I, index);</p></blockquote>
<pre class="brush: cpp; title: ; notranslate">/* Lindenberg's watershed-based blob detection algorithm implementation for MATLAB
   Author: Stanislaw Adaszewski, 2012 */

#include &lt;mex.h&gt;

static void ind2sub(int nx, int ny, int nz, int idx, int *x, int *y, int *z) {
    int r1 = idx % (nx * ny);
    *z = idx / (nx * ny);
    *y = r1 / nx;
    *x = r1 % nx;
}

static int sub2ind(int nx, int ny, int nz, int x, int y, int z) {
    if (x &lt; 0 || x &gt;= nx || y &lt; 0 || y &gt;= ny || z &lt; 0 || z &gt;= nz)
        return -1;
    else
        return x + nx * (y + ny * z);
}

static const int ofs[][3] = {
    {-1, -1, -1}, {-1,  0, -1}, {-1, 1, -1}, {0, -1, -1}, {0, 0, -1}, {0, 1, -1}, {1, -1, -1}, {1, 0, -1}, {1, 1, -1},
    {-1, -1,  0}, {-1,  0,  0}, {-1, 1,  0}, {0, -1,  0},
            // {0, 0, 0},
    { 0,  1,  0}, { 1, -1,  0}, { 1, 0,  0}, {1,  1,  0},
    {-1, -1,  1}, {-1,  0,  1}, {-1, 1,  1}, {0, -1,  1}, {0, 0,  1}, {0, 1,  1}, {1, -1,  1}, {1, 0,  1}, {1, 1,  1}
};

void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
    if (nlhs != 1 || nrhs != 2 || mxGetNumberOfDimensions(prhs[0]) &gt; 3 || !mxIsDouble(prhs[0]) || mxGetClassID(prhs[1]) != mxINT32_CLASS || mxGetNumberOfElements(prhs[1]) != mxGetNumberOfElements(prhs[0])) {
        mexErrMsgTxt(&quot;Usage: R=ls_blob_detect(I, index)\nI must be 1-, 2- or 3-dimensional image\nindex must be list of voxel offsets (0-based) in decreasing brightness order&quot;);
        return;
    } else {
        int N = mxGetNumberOfElements(prhs[0]);
        double *data1 = mxGetPr(prhs[0]);
        int n_blobs = 0;
        const mwSize *siz = mxGetDimensions(prhs[0]);
        int ndim = mxGetNumberOfDimensions(prhs[0]);
        mxArray *R = mxCreateNumericArray(ndim, siz, mxINT32_CLASS, mxREAL);
        int nx, ny, nz;
        int *map = (int*) mxGetData(R);
        int *index = (int*) mxGetData(prhs[1]); // malloc(sizeof(int) * N);
        int i;

        if (!R) {
            mexErrMsgTxt(&quot;Out of memory.&quot;);
            return;
        }

        plhs[0] = R;

        for (i = 0; i &lt; N; i++)
            map[i] = 0;

        nx = siz[0];
        ny = siz[1];
        if (ndim &gt; 2)
            nz = siz[2];
        else
            nz = 1;

        for (i = 0; i &lt; N; i++) {
           int x, y, z;
           int *neighbors = (int*) calloc(sizeof(int), n_blobs+1);
           int j;
           int blob, blob_cnt = 0;
           if (!neighbors) {
               mexErrMsgTxt(&quot;Out of memory.&quot;);
               return;
           }

           if (data1[index[i]] == 0)
               continue; // Ignore 0 voxels

           ind2sub(nx, ny, nz, index[i], &amp;x, &amp;y, &amp;z);

           for (j = 0; j &lt; 26; j++) {
               int idx_neighbor = sub2ind(nx, ny, nz, x + ofs[j][0], y + ofs[j][1], z + ofs[j][2]);

               if (idx_neighbor == -1)
                   continue; // Ignore voxels outside of volume boundaries

               if (data1[idx_neighbor] &gt; data1[index[i]])
                   neighbors[map[idx_neighbor]] += 1;
           }

           for (j = 0; j &lt; n_blobs; j++)
               if (neighbors[1+j] &gt; 0) {
                   blob_cnt += 1;
                   blob = j;
               }

           if (neighbors[0]&gt;0 || blob_cnt&gt;1) {
                map[index[i]] = 0; // background
           } else if (blob_cnt &gt; 0) {
                map[index[i]] = 1 + blob; // existing blob
           } else {
                n_blobs += 1;
                map[index[i]] = n_blobs; // new blob
           }

           free(neighbors);
        }
    }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://algoholic.eu/lindenbergs-watershed-based-blob-detection-for-matlab/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Another Flow Field Editor Update</title>
		<link>http://algoholic.eu/another-flow-field-editor-update/</link>
		<comments>http://algoholic.eu/another-flow-field-editor-update/#comments</comments>
		<pubDate>Tue, 27 Mar 2012 16:33:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[editor]]></category>
		<category><![CDATA[flow]]></category>
		<category><![CDATA[flowmap]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[qt]]></category>
		<category><![CDATA[unity]]></category>
		<category><![CDATA[unity3d]]></category>
		<category><![CDATA[water]]></category>

		<guid isPermaLink="false">http://algoholic.eu/?p=994</guid>
		<description><![CDATA[Probably final this time I was trying to find a compromise between speed and quality and came up with an idea of triangle-based cubic interpolation. Fortunately it turned out that such beast already existed &#8211; http://cran.r-project.org/web/packages/akima/. It&#8217;s several times faster than Natural Neighbour and gives better results than Linear Interpolation, although there are some artefacts<a href="http://algoholic.eu/another-flow-field-editor-update/"> <br /><br /> Read More…</a>]]></description>
			<content:encoded><![CDATA[<p>Probably final this time <img src='http://algoholic.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  I was trying to find a compromise between speed and quality and came up with an idea of triangle-based cubic interpolation. Fortunately it turned out that such beast already existed &#8211; <a href="http://cran.r-project.org/web/packages/akima/">http://cran.r-project.org/web/packages/akima/</a>. It&#8217;s several times faster than Natural Neighbour and gives better results than Linear Interpolation, although there are some artefacts in sharp transition areas (they can be avoided or overcome with smart point placing). Just another interesting option for preview during development. For production quality, you should definitely go with Natural Neighbour Interpolation.</p>
<p><a href="http://algoholic.eu/wp-content/uploads/2012/03/flowed4.png" rel="lightbox[994]" title="flowed"><img src="http://algoholic.eu/wp-content/uploads/2012/03/flowed4-300x262.png" alt="" title="flowed" width="300" height="262" class="alignnone size-medium wp-image-995" /></a></p>
<p><strong>DOWNLOAD:</strong> <a href='http://algoholic.eu/wp-content/uploads/2012/03/flowed2.zip'>Flow Field Editor Update 2</a></p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://algoholic.eu/another-flow-field-editor-update/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Flow Field Editor Update</title>
		<link>http://algoholic.eu/flow-field-editor-update/</link>
		<comments>http://algoholic.eu/flow-field-editor-update/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 14:02:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[editor]]></category>
		<category><![CDATA[field]]></category>
		<category><![CDATA[flow]]></category>
		<category><![CDATA[flowmap]]></category>
		<category><![CDATA[qt]]></category>

		<guid isPermaLink="false">http://algoholic.eu/?p=980</guid>
		<description><![CDATA[I&#8217;ve introduced some useful changes: 1) Fast preview/export using triangulated irregular network linear interpolation. This looks a bit worse than Natural Neighbor method but it&#8217;s a lot faster. 2) Thanks to using OpenMP for Natural Neighbor high quality export, it should be approximately N times faster (where N is the number of CPU cores you<a href="http://algoholic.eu/flow-field-editor-update/"> <br /><br /> Read More…</a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve introduced some useful changes:<br />
1) Fast preview/export using triangulated irregular network linear interpolation. This looks a bit worse than Natural Neighbor method but it&#8217;s a lot faster.<br />
2) Thanks to using OpenMP for Natural Neighbor high quality export, it should be approximately N times faster (where N is the number of CPU cores you have)<br />
3) When loading image, flowed automatically looks for corresponding .ff file and tries to load it<br />
4) Antialiasing of the drawing scene<br />
5) Added Repeat Last Export button<br />
6) Fixed bug in Natural Neighbor implementation which used to cause artifacts near right border of the flow map</p>
<p><a href="http://algoholic.eu/wp-content/uploads/2012/03/flowed3.png" rel="lightbox[980]" title="flowed"><img src="http://algoholic.eu/wp-content/uploads/2012/03/flowed3-300x258.png" alt="" title="flowed" width="300" height="258" class="alignnone size-medium wp-image-990" /></a></p>
<p><strong>DOWNLOAD:</strong> <a href="http://algoholic.eu/wp-content/uploads/2012/03/flowed1.zip">Flow Field Editor Update</a></p>
]]></content:encoded>
			<wfw:commentRss>http://algoholic.eu/flow-field-editor-update/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Flow Shader Fix / Flow Editor</title>
		<link>http://algoholic.eu/flow-shader-fix-flow-editor/</link>
		<comments>http://algoholic.eu/flow-shader-fix-flow-editor/#comments</comments>
		<pubDate>Thu, 22 Mar 2012 14:57:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[editor]]></category>
		<category><![CDATA[flow]]></category>
		<category><![CDATA[flowmap]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[monkey]]></category>
		<category><![CDATA[unity3d]]></category>
		<category><![CDATA[water]]></category>

		<guid isPermaLink="false">http://algoholic.eu/?p=956</guid>
		<description><![CDATA[So first of all, I&#8217;ve fixed a little bug in the water flow shader which basically inverted one of the texture coordinates and made all of the flow animations look weird or just wrong. This is how the flow map from my last tutorial looks in action now: And it&#8217;s WAY more impressive when animated!<a href="http://algoholic.eu/flow-shader-fix-flow-editor/"> <br /><br /> Read More…</a>]]></description>
			<content:encoded><![CDATA[<p>So first of all, I&#8217;ve fixed a little bug in the water flow shader which basically inverted one of the texture coordinates and made all of the flow animations look weird or just wrong. This is how the flow map from my last tutorial looks in action now:</p>
<p><a href="http://algoholic.eu/wp-content/uploads/2012/03/monkey_unity17.png" rel="lightbox[956]" title="monkey_unity"><img src="http://algoholic.eu/wp-content/uploads/2012/03/monkey_unity17-300x169.png" alt="" title="monkey_unity" width="300" height="169" class="alignnone size-medium wp-image-961" /></a></p>
<p>And it&#8217;s WAY more impressive when animated!</p>
<p>Next, I thought that the way of creating flowmaps I&#8217;d described before is a little bit too complicated and so I created a little flow editor in Qt to make preparation of flowmaps more straightforward. You can sketch the flow as you see fit and the rest will be interpolated using <a href="http://en.wikipedia.org/wiki/Natural_neighbor">Natural Neighbor</a> algorithm. Due to the nature of NN the more flow points you add, the faster it works (recomputation of Voronoi diagram is faster, read NN description if you want to understand). The example flow field takes just a couple of seconds on one 3GHz core.</p>
<p><a href="http://algoholic.eu/wp-content/uploads/2012/03/flowed1.png" rel="lightbox[956]" title="flowed"><img src="http://algoholic.eu/wp-content/uploads/2012/03/flowed1-300x203.png" alt="" title="flowed" width="300" height="203" class="alignnone size-medium wp-image-965" /></a></p>
<p><a href="http://algoholic.eu/wp-content/uploads/2012/03/flowed21.png" rel="lightbox[956]" title="flowed2"><img src="http://algoholic.eu/wp-content/uploads/2012/03/flowed21-300x203.png" alt="" title="flowed2" width="300" height="203" class="alignnone size-medium wp-image-966" /></a></p>
<p>And this is what it looks like in Unity with little debug info added:</p>
<p><a href="http://algoholic.eu/wp-content/uploads/2012/03/monkey_unity18.png" rel="lightbox[956]" title="monkey_unity"><img src="http://algoholic.eu/wp-content/uploads/2012/03/monkey_unity18-300x230.png" alt="" title="monkey_unity" width="300" height="230" class="alignnone size-medium wp-image-970" /></a></p>
<p>and without debug:</p>
<p><a href="http://algoholic.eu/wp-content/uploads/2012/03/monkey_unity19.png" rel="lightbox[956]" title="monkey_unity"><img src="http://algoholic.eu/wp-content/uploads/2012/03/monkey_unity19-300x221.png" alt="" title="monkey_unity" width="300" height="221" class="alignnone size-medium wp-image-971" /></a></p>
<p>It&#8217;s WAY WAY more impressive with animation, you can actually see the water interacting with obstacles. I tried going back to Simple Daylight Water from Unity and it looks like a child&#8217;s play now when my water is INTERACTING with the environment. Pretty cool. Thanks Valve (guys from Valve came up with this idea at SIGGRAPH 2010), GraphicsRunner (guy who wrote all about it and prepared a demo in C#) and Alzahiel (guy who prepared the initial port to Unity). I&#8217;ve modified Alzahiel&#8217;s shader a little bit and now I&#8217;m contributing the flow editor. Enjoy! <img src='http://algoholic.eu/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>DOWNLOAD:</strong> <a href='http://algoholic.eu/wp-content/uploads/2012/03/flowed.zip'>Flow Editor</a></p>
<p>PS. You can also try the updated monkey game</p>
<p><strong>DOWNLOAD:</strong> <a href='http://algoholic.eu/wp-content/uploads/2012/03/monkey_unity3.zip'>Monkey Dodge &#8211; Unity Game</a></p>
]]></content:encoded>
			<wfw:commentRss>http://algoholic.eu/flow-shader-fix-flow-editor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

