<?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>dow.ngra.de &#187; cool</title>
	<atom:link href="http://dow.ngra.de/category/cool/feed/" rel="self" type="application/rss+xml" />
	<link>http://dow.ngra.de</link>
	<description>no buzzwords allowed</description>
	<lastBuildDate>Sun, 22 Jan 2012 14:52:41 +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>Another excellent Devops Weekly</title>
		<link>http://dow.ngra.de/2012/01/22/another-excellent-devops-weekly/</link>
		<comments>http://dow.ngra.de/2012/01/22/another-excellent-devops-weekly/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 14:52:41 +0000</pubDate>
		<dc:creator>Toomas Römer</dc:creator>
				<category><![CDATA[cool]]></category>

		<guid isPermaLink="false">http://dow.ngra.de/?p=1602</guid>
		<description><![CDATA[One of the few newsletters that I actually read is Devops Weekly. It is a no bullshit, just content type of weekly newsletter composed by Gareth Rushgrove every Sunday. As I was reading this week&#8217;s issue (55th) and clicking the links I stumbled upon couple of presentations that I thought I&#8217;ll mention. Some interesting facts [...]]]></description>
			<content:encoded><![CDATA[<p>One of the few newsletters that I actually read is <a href="http://devopsweekly.com/">Devops Weekly</a>. It is a no bullshit, just content type of weekly newsletter composed by <a href="https://twitter.com/#!/garethr">Gareth Rushgrove</a> every Sunday.</p>
<p>As I was reading <a href="http://devopsweekly.com/2012/01/22/issue-55/">this week&#8217;s issue</a> (55th) and clicking the links I stumbled upon couple of presentations that I thought I&#8217;ll mention. Some interesting facts and fiction from the presentations</p>
<ul style="margin-bottom:5px">
<li>Interesting stats about <a href="http://www.etsy.com/">Etsy</a>
<ul style="margin-bottom:5px">
<li>	> 1 billion page views / month</li>
<li>	$300+ million in sales in 2010</li>
<li>	$41.1 million in December alone</li>
<li>	721 deploys in November</li>
<li>	Engineering team grew 4x during past 15months</li>
<li>	Great startup definition</li>
</ul>
<li>	Work in trunk, branch in code</li>
<li>	Focusing on performance</li>
<li>	Logging and graphing almost everything</li>
<li>	Cool pictures and screenshots</li>
<li>	Perf-related data belongs in your server logs</li>
</ul>
<p>Here are the presentations.</p>
<p><iframe src="http://www.slideshare.net/slideshow/embed_code/7298379" width="400" height="337" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/></p>
<p><iframe src="http://www.slideshare.net/slideshow/embed_code/7300057" width="400" height="337" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/></p>
<p><iframe src="http://www.slideshare.net/slideshow/embed_code/7308367" width="400" height="337" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/></p>
<p><iframe src="http://www.slideshare.net/slideshow/embed_code/11159635" width="400" height="337" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/></p>
]]></content:encoded>
			<wfw:commentRss>http://dow.ngra.de/2012/01/22/another-excellent-devops-weekly/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Skype Bot for Fun and Profit – Part II – Getting it Running</title>
		<link>http://dow.ngra.de/2012/01/06/skype-bot-for-fun-and-profit-part-ii-getting-it-running/</link>
		<comments>http://dow.ngra.de/2012/01/06/skype-bot-for-fun-and-profit-part-ii-getting-it-running/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 21:10:21 +0000</pubDate>
		<dc:creator>Toomas Römer</dc:creator>
				<category><![CDATA[cool]]></category>
		<category><![CDATA[creative]]></category>
		<category><![CDATA[humour]]></category>

		<guid isPermaLink="false">http://dow.ngra.de/?p=1533</guid>
		<description><![CDATA[This is a post from the Skype Bot for Fun and Profit series. This is the second part in the series and if you want to get your bot running you will need to have some prerequisites filled out, see the first part for the list. Configuring and running There is a skype-bot project at [...]]]></description>
			<content:encoded><![CDATA[<p><em>This is a post from the <a href="http://dow.ngra.de/2012/01/06/skype-bot-for-fun-and-profit">Skype Bot for Fun and Profit</a> series. This is the second part in the series and if you want to get your bot running you will need to have some prerequisites filled out, see the <a href="http://dow.ngra.de/2012/01/06/skype-bot-for-fun-and-profit-part-i-getting-started">first part</a> for the list.</em></p>
<h3>Configuring and running</h3>
<p><img src="http://dow.ngra.de/wp-content/uploads/2012/01/github.png" alt="" title="github" width="84" height="38" class="alignleft size-full wp-image-1580" />There is a skype-bot project at github. It is written in Java and has support for simple functionality. You can clone it via:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">git clone https://github.com/toomasr/skype-bot.git</pre></div></div>

<p>The project is maven based and once you import the project into your favourite IDE that has maven support it should compile out of the box. Before we can actually run the project we need to make couple of adjustments. First make a copy of the <b>project.properties</b> file and make it <b>personal.properties</b>. Then change the username, password and pemfile attributes in the file. Make sure that the folder that has the pem file also has a der file that has the same name (except the extension of course).<br />
<span id="more-1533"></span><br />
Next lets build the project. It is sufficient to just issue a <code>mvn install</code> command. You will end up with a <b>skype-bot-0.0.1-SNAPSHOT.jar</b> in the <code>target</code> folder. Before we can run that we need to start the runtime. See <a href="http://dow.ngra.de/?p=1504">Running the Runtime from the previous post</a>.</p>
<p>Now we are ready to start the bot. Issue a <code>java -jar target/skype-bot-0.0.1-SNAPSHOT.jar</code>. Now expecting that the Runtime is still running and that you updated the credentials in the <b>personal.properties</b> file you should see your need friend come online and you can start a chat.</p>
<p>The bot has the commands that he reacts to defined in the <code>org.zeroturnaround.commands</code> package. But for starters you can tell him &#8220;bot: time&#8221; and it will tell you the time.</p>
<h3>Web Server</h3>
<p>The bot also launches a web server on port <b>2500</b> that has defined handler on the url <code>http://0.0.0.0:2500/post</code>. You can send a <b>POST</b> message there with the parameters <bold>message=?</bold> and <bold>group=?</bold>. This will instruct the bot to issue the <bold>message</bold> to the <bold>group</bold>. The group is looked up from the bot&#8217;s list of groups that matches the <code>Conversation.PROPERTY.displayname</code>.</p>
<p>So what can we do with this? Most of the todays services have webhooks. For example GitHub has <a href="http://help.github.com/post-receive-hooks/">Service Hooks</a>, FogBugz have <a href="http://fogbugz.stackexchange.com/questions/8634/fogbugz-web-hooks">Web Hooks</a> and others have similar services. This means that you can register a web hook and when an event happens the bot will tell you over Skype (in a group chat for example).</p>
<h3>What next?</h3>
<p>This is up to you, hopefully you have a friendly bot. Make him tell you important information that you care about and don&#8217;t let him waste your time. Check back to the <a href="http://dow.ngra.de/2012/01/06/skype-bot-for-fun-and-profit ">original article</a> if I&#8217;ve added anything to the series.</p>
]]></content:encoded>
			<wfw:commentRss>http://dow.ngra.de/2012/01/06/skype-bot-for-fun-and-profit-part-ii-getting-it-running/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Skype Bot for Fun and Profit &#8211; Part I &#8211; Getting Started</title>
		<link>http://dow.ngra.de/2012/01/06/skype-bot-for-fun-and-profit-part-i-getting-started/</link>
		<comments>http://dow.ngra.de/2012/01/06/skype-bot-for-fun-and-profit-part-i-getting-started/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 21:09:44 +0000</pubDate>
		<dc:creator>Toomas Römer</dc:creator>
				<category><![CDATA[cool]]></category>
		<category><![CDATA[creative]]></category>
		<category><![CDATA[humour]]></category>

		<guid isPermaLink="false">http://dow.ngra.de/?p=1504</guid>
		<description><![CDATA[This is a post from the Skype Bot for Fun and Profit series. This is the first part in the series and for a complete list see the original article. Join the Skype Developer Program A lot of necessary documentation and also software is behind a login screen at Skype Developer Program. You will need [...]]]></description>
			<content:encoded><![CDATA[<p><em>This is a post from the <a href="http://dow.ngra.de/2012/01/06/skype-bot-for-fun-and-profit">Skype Bot for Fun and Profit</a> series. This is the first part in the series and for a complete list see the <a href="http://dow.ngra.de/2012/01/06/skype-bot-for-fun-and-profit">original article</a>.</em></p>
<h3>Join the Skype Developer Program</h3>
<div id="dev_program"></div>
<p><img src="http://dow.ngra.de/wp-content/uploads/2012/01/skype_developer-150x150.png" alt="" title="Skype Developer Program" width="150" height="150" class="alignleft size-thumbnail wp-image-1575" />A lot of necessary documentation and also software is behind a login screen at <a href="http://developer.skype.com/" title="Skype Developer Program">Skype Developer Program</a>. You will need to join the program to continue and log in. This will cost you 10$. I personally don&#8217;t like the monetary fee for documentation and a SDK but I&#8217;m happy this is not 100$.<br />
<span id="more-1504"></span><br />
Now the biggest challenge has been conquered and you can also open up Skype&#8217;s own <a href="http://developer.skype.com/skypekit/development-guide/java-tutorial/tutorial-guide-java">Getting Started Guide</a>. That guide will go into more details with some of the next steps, so if you get stuck here be sure to check their documentation also.</p>
<h3>Create a new project at Skype</h3>
<div id="project"></div>
<p>Lets create a new project at the developer page. Navigate to My Projects submenu.There you can choose between multiple projects to create.</p>
<p><img src="http://dow.ngra.de/wp-content/uploads/2011/12/my-projects.png" alt="" title="My Projects" width="500" height="82" class="aligncenter size-full wp-image-1510" /></p>
<p>Right now you need to choose <b>SkypeKit for Desktop</b>. You can name the project something along the lines of <b>chat-bot-demo</b> and fill the rest of the form how ever you like (or they require). Now we have a project in place and we can move on.</p>
<h3>Download the SDK and the Runtime</h3>
<p>Navigate to your just created project and lets get the SDK and Runtime. SDK is the library (com.skype.*) that you will use to talk to the runtime (headless Skype client). The SDK you can download right away but for the Runtime you need to put in a request and it can take up to several hours to get the download link (usually just 5-10 minutes).</p>
<p><img src="http://dow.ngra.de/wp-content/uploads/2011/12/sdk_and_runtime.png" alt="" title="SDK and Runtime" width="500" height="168" class="aligncenter size-full wp-image-1515" /></p>
<h3>Build a sid-java-wrapper.jar file</h3>
<div id="sdk"></div>
<p>The SDK comes in source format only, before we can continue we need to get this into a single JAR file and also install it in your local maven repository. To build it we need <a href="http://ant.apache.org/">ANT</a> to be installed (I presume you do). Issue the following commands now:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">toomasr@cigar:~/$ cd skypekit-sdk_sdk/interfaces/skype/java/api/
toomasr@cigar:~/skypekit-sdk_sdk/interfaces/skype/java/api$ ant
Buildfile: ~/skypekit-sdk_sdk/interfaces/skype/java/api/build.xml
&nbsp;
clean:
   [delete] Deleting directory ~/skypekit-sdk_sdk/interfaces/skype/java/api/bin
&nbsp;
compile:
    [mkdir] Created dir: ~/skypekit-sdk_sdk/interfaces/skype/java/api/bin
    [javac] Compiling 36 source files to ~/skypekit-sdk_sdk/interfaces/skype/java/api/bin
&nbsp;
jar:
      [jar] Building jar: ~/skypekit-sdk_sdk/interfaces/skype/java/api/sid-java-wrapper.jar
&nbsp;
clean-build:
&nbsp;
main:
&nbsp;
BUILD SUCCESSFUL
Total time: 3 seconds</pre></div></div>

<p>We have the sid-java-wrapper.jar file now in that <code>api</code> folder. For easier project setup we will be using maven (and probably for some of you shoot you in the foot as an added bonus). We will need to install the JAR file into our local repository. I will use <b>com.skype</b> as the groupId and <b>skype-sdk</b> as the artifactId. Issue the following command to do the same.</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">toomasr@cigar:~/$ cd ~/skypekit-sdk_sdk/interfaces/skype/java/api/
mvn install:install-file -Dfile=sid-java-wrapper.jar -DgroupId=com.skype -DartifactId=skype-sdk -Dversion=1.0 -Dpackaging=jar</pre></div></div>

<h3>Run the runtime</h3>
<div id="runtime"></div>
<p>Just to check if the runtime starts lets unpack and start the binary. If everything goes successfully you should see something similar. On a Linux machine I had to download couple of different binaries before I got a client that did not die (at least on EC2).</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">toomasr@cigar:~/downloadss/mac-x86-skypekit-novideo_3.5.1.1041_493734/bin/mac-x86$ ./mac-x86-skypekit-novideo 
SkypeRuntime Copyright (C) 2003-2011 Skype Technologies S.A.
SkypeRuntime Version: 3.4.1/mac-x86-skypekit-novideo_3.5.1.1041_493734
Proprietary and confidential, do not share this application.</pre></div></div>

<h3>Development keypair</h3>
<div id="keypair"></div>
<p>Next we need a development keypair. It is a signed RSA private key that you need to request from the Skype developer website. See the screenshot.</p>
<p><img src="http://dow.ngra.de/wp-content/uploads/2012/01/developer_key_pair_resized.png" alt="" title="Developer Key" width="500" height="174" class="alignnone size-full wp-image-1518" /></p>
<p>Once you have the file downloaded lets convert it to a format that is used by the Skype SDK. This is the openssl command for this. Be smarter than me and don&#8217;t accidentally overwrite the downloaded PEM file because they let you download it only once. The keypair is valid for 60 days!</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">openssl pkcs8 -topk8 -in download-pair.pem -outform DER -out downloaded-pair.der -nocrypt</pre></div></div>

<h3>Create a Skype account for the bot</h3>
<div id="account"></div>
<p>Go to <a href="http://www.skype.com/">skype.com</a> and create an account for you bot. Also add this bot to your friend list and log in once with the bot and accept the request.</p>
<h3>Lets sum it up</h3>
<p>By now we should have the following in place</p>
<ul>
<li><a href="#dev_program">Have 10USD less on you bank account</a></li>
<li><a href="#dev_program">Skype Developer account</a></li>
<li><a href="#project">A project created at Skype Developer page</a></li>
<li><a href="#runtime">Working Skype Runtime</a></li>
<li><a href="#sdk">Skype SDK jar file</a></li>
<li><a href="#keypair">Development Keypair in PEM and DER format</a></li>
<li><a href="#account">New contact on your contact list and its username/password</a></li>
</ul>
<p>If you are missing any of those or had problems getting them then check out the more in depth documentation at <a href="https://developer.skype.com/skypekit/development-guide/java-tutorial/tutorial-guide-java">developer.skype.com</a> or post a comment.</p>
<p>Where to go from now? Check out the next part, <a href="http://dow.ngra.de/2012/01/06/skype-bot-for-fun-and-profit-part-ii-getting-it-running">Getting it Running</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dow.ngra.de/2012/01/06/skype-bot-for-fun-and-profit-part-i-getting-started/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Skype Bot for Fun and Profit</title>
		<link>http://dow.ngra.de/2012/01/06/skype-bot-for-fun-and-profit/</link>
		<comments>http://dow.ngra.de/2012/01/06/skype-bot-for-fun-and-profit/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 21:08:53 +0000</pubDate>
		<dc:creator>Toomas Römer</dc:creator>
				<category><![CDATA[cool]]></category>
		<category><![CDATA[creative]]></category>
		<category><![CDATA[humour]]></category>

		<guid isPermaLink="false">http://dow.ngra.de/?p=1497</guid>
		<description><![CDATA[Couple of months ago I was travelling and found myself in a hotel room with many hours to kill. For no particular reason I started hacking on a Java based Skype bot. Couple of weeks later I took the time to polish it and enable it for company wide notification chatroom. Now couple of months [...]]]></description>
			<content:encoded><![CDATA[<p><em>Couple of months ago I was travelling and found myself in a hotel room with many hours to kill. For no particular reason I started hacking on a Java based Skype bot. Couple of weeks later I took the time to polish it and enable it for company wide notification chatroom. Now couple of months later I&#8217;m on vacation and will write about how to write a Skype bot in Java.</em></p>
<h3>The Plan</h3>
<div style="float:left"><img src="http://dow.ngra.de/wp-content/uploads/2012/01/183272970_54862f67b4_b.jpg" alt="" title="Bot" width="100" height="187"/><br/><span style="font-size: xx-small;"><span style="font-family: Arial;">Image by </span><a style="font-family: Arial;" href="http://www.flickr.com/photos/flysi/183272970/">Simon Abrams</a></span></div>
<p>The Skype bot needs a bit more work than your average IRC bot because of the proprietary nature of Skype. There is much clicking and downloading of certificate stuff to get you started for example. Also I want to show you how to put the bot into action, so we will go beyond just the bot.<br />
<span id="more-1497"></span></p>
<h4>Getting started</h4>
<p>In this <a href="http://dow.ngra.de/2012/01/06/skype-bot-for-fun-and-profit-part-i-getting-started">Part I &#8211; Getting Started</a> we will go through the steps to get you started with the Skype developer program and download all the necessary software for the bot. The registration process, necessary accounts etc. Once you complete these steps you can develop any other bot out there.</p>
<h4>Hacking on the Java part</a></h4>
<p>In this <a href="http://dow.ngra.de/2012/01/06/skype-bot-for-fun-and-profit-part-ii-getting-it-running">Part II &#8211; Getting It Running</a> we will take a <a href="https://github.com/toomasr/skype-bot/">Java Skype bot</a> and get it running. It requires a little more than just compile and run so it has its own chapter.</p>
<p>We will also look into how to use this bot to notify about important information to Skype chat rooms. </p>
<h4>And maybe something more</h4>
<p>If everything went well then you have your own bot running now. There are many ways to go forward and improve the bot and the services. Lets see if we have time to cover those.</p>
<p>Hopefully next time that I have a <del>dumb</del> crazy idea I go have a beer instead.</p>
]]></content:encoded>
			<wfw:commentRss>http://dow.ngra.de/2012/01/06/skype-bot-for-fun-and-profit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fling &#8211; Detecting Little Fockers Furballs</title>
		<link>http://dow.ngra.de/2011/06/15/fling-detecting-little-fockers-furballs/</link>
		<comments>http://dow.ngra.de/2011/06/15/fling-detecting-little-fockers-furballs/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 08:13:44 +0000</pubDate>
		<dc:creator>Toomas Römer</dc:creator>
				<category><![CDATA[cool]]></category>
		<category><![CDATA[creative]]></category>

		<guid isPermaLink="false">http://dow.ngra.de/?p=1384</guid>
		<description><![CDATA[This piece is the second installment in the series of Fling &#8211; Game of Furballs. It has been in the drafts for 6 months because of lack of time and/or interest. I&#8217;m on a bus to Tartu and I just might as well finish this. So in the previous part I gave you an intro [...]]]></description>
			<content:encoded><![CDATA[<p><i>This piece is the second installment in the series of <a href="http://dow.ngra.de/2010/12/27/fling-game-of-furballs/">Fling &#8211; Game of Furballs</a>. It has been in the drafts for 6 months because of lack of time and/or interest. I&#8217;m on a bus to Tartu and I just might as well finish this.</i></p>
<p>So in the previous part I gave you an intro of the game and how I stumbled upon the game and how it took over our lunches (now we have recovered and are back to random discussions). In this part we&#8217;ll look how to detect the furballs from Fling screenshots.</p>
<h2>Abstract</h2>
<p>Lets build a web service that accepts screenshots of Fling and sends you back a webpage link of the solution to the image or just bunch of attachments. </p>
<h2>Solution</h2>
<p>Lets divide and conquer.</p>
<ul>
<li>Image/Color recognition to detect the Furballs (covered in this piece)
<li>Algorithm to solve the puzzles (not covered, but code available)
<li>Algorithm to draw the 1 step screens (not covered, but code available)
<li>Email handling (not covered, but code available)
</ul>
<p><span id="more-1384"></span></p>
<h2>Detecting Furballs</h2>
<p>When I started out with this one I had no idea how to do it. I sent an email to <a href="http://kt.era.ee/">one of my friends</a> who has done image recognition and asked him how to get started. He took a look at the screenshot and asked, why do I need to recognize anything, just detect the color and you can tell if it is an empty square or a furball! It sounded so obvious that I was somewhat ashamed for not thinking of this myself :)</p>
<h2>Python and PIL</h2>
<p>Go get the latest version of <a href="http://www.pythonware.com/products/pil/">PIL</a> installed to have the examples work. Also we&#8217;ll be working from the root of the fling solver project. Just clone my <a href="https://bitbucket.org/hudolejev/flingsolver">BitBucket repo</a>. So lets get started and load up the image and verify that PIL is working. Or you can skip this and take a look at <a href="https://bitbucket.org/hudolejev/flingsolver/src/501a753cea03/blog_demo_1.py">blog_demo_1.py.</a></p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">shot = Image.<span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">abspath</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,       
                               <span style="color: #483d8b;">&quot;etc/shots/sample001.png&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>                          
shot_pix = shot.<span style="color: black;">load</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>                                                              
shot.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p><a href="http://dow.ngra.de/wp-content/uploads/2011/06/original.png"><img src="http://dow.ngra.de/wp-content/uploads/2011/06/original-150x150.png" alt="" title="Original Image" width="150" height="150" class="alignright size-thumbnail wp-image-1464" style="margin-left:10px" /></a>Once you execute this an image should pop up, like the one on the right. Now lets isolate a square and dwell into it.</p>
<p>Because the grid is static it is a matter of figuring out the width and height and the offsets as where the squares start. You can use your top notch vision, pixel ruler or little bit of Python to get this right. Run the following and you will see how I&#8217;m using PIL to find the offsets (trial and error). You should see something like <a href="http://dow.ngra.de/wp-content/uploads/2011/06/one_marked.png">this</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">x, y, w, h = <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">70</span>, <span style="color: #ff4500;">45</span>, <span style="color: #ff4500;">45</span>                                                          
<span style="color: #808080; font-style: italic;"># lets choose the leftmost square and visualise it                                  </span>
draw = ImageDraw.<span style="color: black;">Draw</span><span style="color: black;">&#40;</span>shot<span style="color: black;">&#41;</span>                                                         
draw.<span style="color: black;">rectangle</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>x, y, x+w, y+h<span style="color: black;">&#93;</span>, outline=<span style="color: black;">&#40;</span><span style="color: #ff4500;">255</span>, <span style="color: #ff4500;">255</span>, <span style="color: #ff4500;">255</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>                           
<span style="color: #ff7700;font-weight:bold;">del</span> draw                                                                            
shot.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Ok, excellent. We now know the coordinates. Lets now average the colors. We will iterate through every pixel and take an average of the R, G, B values. We&#8217;ll also display the image for debugging purposes.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># lets find the average color</span>
avgR, avgG, avgB = <span style="color: #ff4500;">0</span>,<span style="color: #ff4500;">0</span>,<span style="color: #ff4500;">0</span>
counter = <span style="color: #ff4500;">0</span>
<span style="color: #808080; font-style: italic;"># load pixels of the image</span>
shot_pix = shot.<span style="color: black;">load</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, w<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, h<span style="color: black;">&#41;</span>:
        counter = counter + <span style="color: #ff4500;">1</span>
        avgR = avgR+shot_pix<span style="color: black;">&#91;</span>x+i, y+j<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
        avgG = avgG+shot_pix<span style="color: black;">&#91;</span>x+i, y+j<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
        avgB = avgB+shot_pix<span style="color: black;">&#91;</span>x+i, y+j<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>
&nbsp;
avgR = avgR/counter
avgB = avgB/counter
avgG = avgG/counter
&nbsp;
avgC = <span style="color: black;">&#40;</span>avgR,avgG,avgB<span style="color: black;">&#41;</span>
&nbsp;
draw = ImageDraw.<span style="color: black;">Draw</span><span style="color: black;">&#40;</span>shot<span style="color: black;">&#41;</span>
draw.<span style="color: black;">rectangle</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>x, y, x+w, y+h<span style="color: black;">&#93;</span>, outline=<span style="color: black;">&#40;</span><span style="color: #ff4500;">255</span>, <span style="color: #ff4500;">255</span>, <span style="color: #ff4500;">255</span><span style="color: black;">&#41;</span>, fill=avgC<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">del</span> draw
shot.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Okay, <a href="http://dow.ngra.de/wp-content/uploads/2011/06/one_avg.png">looks about right</a>. Now lets do this for the whole image. Here I will be reusing code from the flingsolver package. You can do the same.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">fip = ImProcessor<span style="color: black;">&#40;</span><span style="color: #483d8b;">'etc/shots/sample002.png'</span><span style="color: black;">&#41;</span>
fip.<span style="color: black;">debug</span> = <span style="color: #008000;">True</span>
state = fip.<span style="color: black;">process</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
fip.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p><img src="http://dow.ngra.de/wp-content/uploads/2011/06/all_average2.png" alt="" title="All Average" width="324" height="478" class="aligncenter size-full wp-image-1474" /></p>
<p>Voila, all squares are marked with their average color. Now detecting furballs and not furballs is quite easy. Just make a conditional based on some color. For example I used:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> isBall<span style="color: black;">&#40;</span>...<span style="color: black;">&#41;</span>
...
<span style="color: #ff7700;font-weight:bold;">if</span> avgR <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">60</span>, <span style="color: #ff4500;">90</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">and</span> avgG <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">90</span>, <span style="color: #ff4500;">130</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">and</span> avgB <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">36</span>,<span style="color: #ff4500;">55</span><span style="color: black;">&#41;</span>:        
	<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
<span style="color: #ff7700;font-weight:bold;">else</span>:                         
	<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span></pre></div></div>

<p>For the complete demo you can run blog_demo_1.py from the flingsolver repository. It should generate all the images shown in this post. Happy hacking your own images!</p>
<p>Next time when I have time I will continue with the solving Fling and writing the email handling.</p>
]]></content:encoded>
			<wfw:commentRss>http://dow.ngra.de/2011/06/15/fling-detecting-little-fockers-furballs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VisualVM and jps Not Finding my Java Process</title>
		<link>http://dow.ngra.de/2011/05/27/visualvm-and-jps-not-finding-my-java-process/</link>
		<comments>http://dow.ngra.de/2011/05/27/visualvm-and-jps-not-finding-my-java-process/#comments</comments>
		<pubDate>Fri, 27 May 2011 10:07:54 +0000</pubDate>
		<dc:creator>Toomas Römer</dc:creator>
				<category><![CDATA[cool]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://dow.ngra.de/?p=1429</guid>
		<description><![CDATA[Today I was hit by a weird problem and I thought I&#8217;ll share the problem and the solution (thanks for the solution goes to my colleague Lauri). Googling did not help me much (probably bad keywords or not much information about it) and hopefully this post will serve as future destination for a solution for [...]]]></description>
			<content:encoded><![CDATA[<p>Today I was hit by a weird problem and I thought I&#8217;ll share the problem and the solution (thanks for the solution goes to my colleague Lauri). Googling did not help me much (probably bad keywords or not much information about it) and hopefully this post will serve as future destination for a solution for this problem.</p>
<h2>Problem</h2>
<p>You are running Mac OS X (maybe the problem is relevant on other platforms too) and even if you&#8217;ve started Tomcat and you can see the Java process in the Activity Monitor or with <code>ps</code> you <strong>can&#8217;t</strong> see the process with <code>jps</code>. You <strong>are not</strong> able to connect to the process with VisualVM nor JConsole. Bummer.<br />
<span id="more-1429"></span></p>
<h2>Solution</h2>
<p>Tomcat scripts have a variable called CATALINA_TMPDIR and the java process is forked with</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">-Djava.io.tmpdir=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$CATALINA_TMPDIR</span>&quot;</span></pre></div></div>

<p> What happens is that jps and VisualVM/JConsole look for information about processes from the system TMP folder. Once you redefine this they cannot find their information. The solution is to eliminate this variable from the process.</p>
<p>Either execute the commandline that you can copy and paste from</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ps</span> aux <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-i</span> tomcat</pre></div></div>

<p> and exclude the -Djava.io.tmpdir part or modify the script for your debug session. Thats it.</p>
<p>You&#8217;re welcome.</p>
]]></content:encoded>
			<wfw:commentRss>http://dow.ngra.de/2011/05/27/visualvm-and-jps-not-finding-my-java-process/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>What are the default -Xmx and -Xms values?</title>
		<link>http://dow.ngra.de/2011/01/12/what-are-the-default-xmx-and-xms-values/</link>
		<comments>http://dow.ngra.de/2011/01/12/what-are-the-default-xmx-and-xms-values/#comments</comments>
		<pubDate>Wed, 12 Jan 2011 07:57:18 +0000</pubDate>
		<dc:creator>Toomas Römer</dc:creator>
				<category><![CDATA[cool]]></category>

		<guid isPermaLink="false">http://dow.ngra.de/?p=1399</guid>
		<description><![CDATA[Happened to read Inspecting HotSpot JVM Options and found a solution to one of the questions that I have every now and then. What are the default -Xmx and -Xms values for this JVM on this machine? The solution? Invoking java with some flags, check out the terminal session. toomasr@cigarillo-2:~$ java -server -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version [...]]]></description>
			<content:encoded><![CDATA[<p>Happened to read <a href="http://q-redux.blogspot.com/2011/01/inspecting-hotspot-jvm-options.html">Inspecting HotSpot JVM Options</a> and found a solution to one of the questions that I have every now and then. <strong>What are the default -Xmx and -Xms values for this JVM on this machine?</strong> The solution? Invoking java with some flags, check out the terminal session.</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">toomasr@cigarillo-2:~$ java -server -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version | grep -i heapsize
uintx ErgoHeapSizeLimit                    = 0                {product}
uintx InitialHeapSize                     := 65011712         {product}
uintx LargePageHeapSizeThreshold           = 134217728        {product}
uintx MaxHeapSize                         := 1040187392       {product}
java version &quot;1.6.0_22&quot;
Java(TM) SE Runtime Environment (build 1.6.0_22-b04-307-10M3261)
Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03-307, mixed mode)
toomasr@cigarillo-2:~$ java -client -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version | grep -i heapsize
uintx ErgoHeapSizeLimit                    = 0                {product}
uintx InitialHeapSize                      = 0                {product}
uintx LargePageHeapSizeThreshold           = 134217728        {product}
uintx MaxHeapSize                          = 130862280        {product}
java version &quot;1.6.0_22&quot;
Java(TM) SE Runtime Environment (build 1.6.0_22-b04-307-10M3261)
Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03-307, mixed mode)</pre></div></div>

<p>If there is an easier way, let me know. Will put this one on my tool belt at the moment.</p>
]]></content:encoded>
			<wfw:commentRss>http://dow.ngra.de/2011/01/12/what-are-the-default-xmx-and-xms-values/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Fling &#8211; Game of Furballs</title>
		<link>http://dow.ngra.de/2010/12/27/fling-game-of-furballs/</link>
		<comments>http://dow.ngra.de/2010/12/27/fling-game-of-furballs/#comments</comments>
		<pubDate>Sun, 26 Dec 2010 23:56:23 +0000</pubDate>
		<dc:creator>Toomas Römer</dc:creator>
				<category><![CDATA[cool]]></category>
		<category><![CDATA[creative]]></category>

		<guid isPermaLink="false">http://dow.ngra.de/?p=1359</guid>
		<description><![CDATA[Couple of months ago a mere 100 lines of Python inspired me to hack on a project for hours and hours from my free time for fun and profit, spend 10 USD on a domain name and play a prank on an investor. This post is an intro as how this all started out. I [...]]]></description>
			<content:encoded><![CDATA[<p><em>Couple of months ago a mere 100 lines of Python inspired me to hack on a project for hours and hours from my free time for fun <del>and profit</del>, spend 10 USD on a domain name and play a prank on an investor.</p>
<p>This post is an intro as how this all started out. I sure hope I get around to write the other posts (see the end of the post for a list of potential subjects).</em></p>
<p>I stumbled upon an iPhone game called <a href="http://itunes.apple.com/us/app/fling/id325815008?mt=8">Fling</a> that I still play every now and then (I purchased it about a year ago). The game is a puzzle game and your mission (should you choose to accept it) is to fling furballs into each other and the ones closest to the edges are flung off the board.</p>
<p>See the animated GIF for a live demo or check out the video on <a href="http://www.youtube.com/watch?v=HfteaRTGyVw">Youtube</a>. Once the board has just a single furball you&#8217;ve won!</p>
<p><a href="http://dow.ngra.de/wp-content/uploads/2010/12/flingAnimated.gif"><img src="http://dow.ngra.de/wp-content/uploads/2010/12/flingAnimated.gif" alt="" title="Animated Fling Game" width="320" height="480" class="aligncenter size-full wp-image-1360" /></a></p>
<p>As you progress the number of Furballs per level increases and finding a solution takes more time. At certain levels it takes a lot of time. Kind of reminds me of really difficult chess puzzles that can steal an hour or two from you.</p>
<p>The puzzle got so popular amongst colleagues of mine from <a href="http://www.zeroturnaround.com/">ZeroTurnaround</a> that during lunch we would place an iPad on the table with one of the levels and who ever found it interesting would give it a shot at some difficult level.</p>
<p>One time over lunch we theorized on how to solve a puzzle of this sort in algorithmic terms. We had different approaches and time estimates but one of the colleagues showed up with a Python solution the next day. Took him less than 90 minutes (apparently attended a not so interesting lecture). And in terms of time complexity we figured that on every move every furball has <code>len(furballs) - 1</code> furballs to kick out so <code>(n-1)!</code> should be a rough upper bound estimate.</p>
<p>These 100 lines of Python code started a chain reaction of learning more Python, detecting furballs from screenshots, solving the puzzle by outputting images with the moves, email exchange with the author and prank pitching him as an investor, writing an email frontend (you can send in your screenshot), profiling Python, checking out Jython and hopefully some more blog posts on the subject.</p>
]]></content:encoded>
			<wfw:commentRss>http://dow.ngra.de/2010/12/27/fling-game-of-furballs/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Master Debugging Class: RMI</title>
		<link>http://dow.ngra.de/2010/08/04/master-debugging-class-rmi/</link>
		<comments>http://dow.ngra.de/2010/08/04/master-debugging-class-rmi/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 13:19:05 +0000</pubDate>
		<dc:creator>Jevgeni Kabanov</dc:creator>
				<category><![CDATA[cool]]></category>

		<guid isPermaLink="false">http://dow.ngra.de/?p=1295</guid>
		<description><![CDATA[Today we had a most interesting encounter with the quirks of our environment and RMI. We use RMI in our new LiveRebel product to connect the management console to the remote agents. Commonly, the agent code is obfuscated by Proguard. However as obfuscation renames the classes it prevents us from doing any debugging, so I [...]]]></description>
			<content:encoded><![CDATA[<p>Today we had a most interesting encounter with the quirks of our environment and RMI. We use RMI in our new LiveRebel product to connect the management console to the remote agents. Commonly, the agent code is obfuscated by Proguard. However as obfuscation renames the classes it prevents us from doing any debugging, so I made a vanilla build and started the debugger.</p>
<p>BOOM! The particular method I needed to call throws an exception &#8220;java.rmi.UnmarshalException: unrecognized method hash: method not supported by remote object&#8221;. Googling tells me that this usually means that different classes are deployed on the client and server, so I spend the next half an hour making sure that the JAR on the client and server is exactly the same. A complicating condition is that this particular method returns an object from a third-party library, and to avoid conflicts with the user code we rename the package of that library using JarJar.</p>
<p>As I establish beyond reasonable or unreasonable doubt that the JAR really is the same I start looking into other potential issues. As the exception reports the hash to be missing I start looking into how the hash is calculated for the RMI calls. A fair amount of debugger stepping (a useful tip is that you can put a method breakpoint even if you don&#8217;t have the code) reveals that <code>sun.rmi.server.Util.computeMethodHash()</code> calculates the hash using the digest of the method name and signature. Not much room for mistakes there, but nevertheless I put a method breakpoint on <code>UnicastServerRef.dispatch()</code>, which is the last call in the stack trace and dump hashes for all methods in the target class from a static map.</p>
<p>Next I make sure that the hashes are the same on client and server. Decompiling the RMI Stub shows that it includes the precalculated hashes in the call. First check on a different method that I know to work shows that the hashes are the same. But the hash for the problematic method is different in the Stub than in the server map. WTF is wrong?</p>
<p>Here I probably should have verified the next assumptions, but luckily an epiphany interferes. Turns out that the <code>rmic</code> compiler is called <em>before</em> the third-party library is renamed, so the hash is calculated with the wrong packages in the signature. As the JarJar will then rename the signature in the Stub class, it is almost impossible to notice. However the last remaining question is why the hell did it work at all? The hashes should have been different all the time, not just in the vanilla build. A little digging reveals, that as Proguard commonly renames the classes in RMI signatures it will go and fix the RMI hash for you. </p>
<p>EOF</p>
]]></content:encoded>
			<wfw:commentRss>http://dow.ngra.de/2010/08/04/master-debugging-class-rmi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>When Manners Run Out &#8211; Story of a Website Theft</title>
		<link>http://dow.ngra.de/2010/07/07/when-manners-run-out/</link>
		<comments>http://dow.ngra.de/2010/07/07/when-manners-run-out/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 08:11:53 +0000</pubDate>
		<dc:creator>tony</dc:creator>
				<category><![CDATA[cool]]></category>
		<category><![CDATA[humour]]></category>

		<guid isPermaLink="false">http://dow.ngra.de/?p=1240</guid>
		<description><![CDATA[A guest post from our intern Tony. He has traveled all the way from North-America just to learn the ropes of programming and IT culture from us. He&#8217;s last week&#8217;s priority 2 task was to handle our site being stolen problem. A few months ago we discovered that our website (http://www.zeroturnaround.com) had been stolen by [...]]]></description>
			<content:encoded><![CDATA[<p><em>A guest post from our intern Tony. He has traveled all the way from North-America just to learn the ropes of programming and IT culture from us. He&#8217;s last week&#8217;s priority 2 task was to handle our <a href="http://dow.ngra.de/2010/04/23/somebody-is-stealing-my-website-design-what-are-my-options/">site being stolen problem</a>.<br />
</em><br />
A few months ago we discovered that our website (<a href="http://www.zeroturnaround.com/">http://www.zeroturnaround.com</a>) had been stolen by jbrute.info (I won&#8217;t link it, you need to copy-paste yourself), in every sense of the word. (HTML, CSS, JavaScript, even our logo, HOTLINKED!) A simple side-by-side screenshot will show you the extent of their blatant behavior.</p>
<p><a href="http://dow.ngra.de/wp-content/uploads/2010/07/zt_screenshot.jpg"><img class="alignnone size-large wp-image-1256" src="http://dow.ngra.de/wp-content/uploads/2010/07/zt_screenshot-1024x547.jpg" alt="" width="502" height="268" /></a></p>
<p><a href="http://dow.ngra.de/wp-content/uploads/2010/07/jbrute_screenshot.jpg"><img class="alignnone size-large wp-image-1259" src="http://dow.ngra.de/wp-content/uploads/2010/07/jbrute_screenshot-1024x555.jpg" alt="" width="502" height="272" /></a></p>
<p>Furious as we were, we managed to keep our manners and reached out (tried to at least) to the author of of jbrute.info and their hosting provider. Sadly, the only response we ever had other than SMTP MAIL CANNOT BE DELIVERED is a canned email instructing us how to write a formal DMCA takedown notice.</p>
<p>We then turned to <a href="http://dow.ngra.de/2010/04/23/somebody-is-stealing-my-website-design-what-are-my-options/">starting a blog post and asking your help on what you would do in our shoes</a>. As Karl Marx would put it, &#8220;the power of the people is strong&#8221;, and before long the community came up with a few nothing-less-than-brilliant ideas. (We are not Communists and are not related to the Tsars in anyway, I promise, even though our operational base in Central <a href="http://vesilind.blogspot.com/2008/05/estonian-jokes.html">Estonia </a>might lead you to think otherwise :P)</p>
<p>In particular, Joe Walnes pointed out that since jbrute.info hotlinks .php files and JavaScript from our website, by &#8220;check[ing] the HTTP_REFERER, [we] can conditionally change the contents, and with JavaScript [we] can make the page look however [we] want.&#8221;</p>
<p>Sadly, life got busy and almost three months suddenly went by, and this little incident was nearly forgotten. Last week, we stumbled upon JBrute once again&#8230; Finally we got around to acting on Joe&#8217;s advice and, in the most hackish fashion, decided to take it upon ourselves to deliver a truly custom &#8220;DMCA Takedown notice&#8221; over two glasses of beer. Here is a screenshot of the finished work :) We encourage you to check out <a href="http://jbrute.info">jbrute.info</a> (this time I linked :( ) for yourself.</p>
<p><a href="http://dow.ngra.de/wp-content/uploads/2010/07/jbrute_defaced_screenshot1.jpg"><img class="alignnone size-large wp-image-1273" src="http://dow.ngra.de/wp-content/uploads/2010/07/jbrute_defaced_screenshot-1024x551.jpg" alt="" width="491" height="265" /></a></p>
<p>Just to prove our point, we bring you the pseudo xkcd comic.<br />
<a href="#"><img class="alignnone size-full wp-image-1242" src="http://dow.ngra.de/wp-content/uploads/2010/07/blogging_ironic.png" alt="" width="330" height="335" /></a></p>
<p>I hope you enjoyed our little mischief. We&#8217;ll keep you posted on the status of jbrute over the coming days following this post and we&#8217;ll follow up next week with the technical details &#8211; <em>How to un-hack a website!</em> Keep tuned :)</p>
]]></content:encoded>
			<wfw:commentRss>http://dow.ngra.de/2010/07/07/when-manners-run-out/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

