<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Coding Hell]]></title>
  <link href="http://www.codinghell.ch/atom.xml" rel="self"/>
  <link href="http://www.codinghell.ch/"/>
  <updated>2015-07-19T13:28:37-07:00</updated>
  <id>http://www.codinghell.ch/</id>
  <author>
    <name><![CDATA[Nils Caspar]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[File Handling: Never trust default encoding settings]]></title>
    <link href="http://www.codinghell.ch/blog/2015/02/05/file-handling-never-trust-default-encoding-settings/"/>
    <updated>2015-02-05T13:38:00-08:00</updated>
    <id>http://www.codinghell.ch/blog/2015/02/05/file-handling-never-trust-default-encoding-settings</id>
    <content type="html"><![CDATA[<p>Whenever you are doing any kind of file shenanigans, you should always
explicitly set the expected encoding of the file you are reading from. Most
programming languages&#8217; standard file handling libraries use encoding settings
by default which do not lead to the desired behaviour.</p>

<!-- more -->


<h1>Example code</h1>

<p>Let me demonstrate the potential problems of the default encoding settings with
the following example code:</p>

<figure class='code'><figcaption><span>example.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">data</span> <span class="o">=</span> <span class="no">File</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">&#39;test.txt&#39;</span><span class="p">)</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">data</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/Example/</span><span class="p">,</span> <span class="s1">&#39;Coding&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>test.txt</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Example with ❤</span></code></pre></td></tr></table></div></figure>


<p>Now when I connect to a server with that code installed via SSH from my Mac,
everything works perfectly fine:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ ruby example.rb
</span><span class='line'>Coding with ❤
</span><span class='line'>$ echo $?
</span><span class='line'>0</span></code></pre></td></tr></table></div></figure>


<p>But when I connect from a Windows machine to the same server and do the same
thing, I end up with a different result:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ ruby example.rb
</span><span class='line'>example.rb:2:in `gsub': invalid byte sequence in US-ASCII (ArgumentError)
</span><span class='line'>        from example.rb:2:in `&lt;main&gt;'
</span><span class='line'>$ echo $?
</span><span class='line'>1</span></code></pre></td></tr></table></div></figure>


<h1>Behind the scenes</h1>

<p>When you connect to a server via SSH, modern clients send environment variables
to pass on your local locale settings. You can see this once you enable the
debug output of your SSH client:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>debug1: Sending environment.
</span><span class='line'>debug1: Sending env LC_ALL = en_US.UTF-8
</span><span class='line'>debug1: Sending env LANG = en_US.UTF-8
</span><span class='line'>debug1: Sending env LC_CTYPE = en_US.UTF-8</span></code></pre></td></tr></table></div></figure>


<p>If these variables are omitted, you end up with a default locale, which in my
case was a non-unicode version of <code>en_US</code>.</p>

<p>The same problem will emerge if your script is executed as a cron job: The
<code>cron</code> daemon normally also ends up with the systems default locale settings.</p>

<h1>Explicit encoding to the rescue</h1>

<p>When you are reading data from a file, you should always explicitly define the
encoding you expect the file to be in:</p>

<figure class='code'><figcaption><span>example.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">data</span> <span class="o">=</span> <span class="no">File</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">&#39;test.txt&#39;</span><span class="p">,</span> <span class="ss">encoding</span><span class="p">:</span> <span class="s1">&#39;UTF-8&#39;</span><span class="p">)</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">data</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/Example/</span><span class="p">,</span> <span class="s1">&#39;Coding&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This way you end up with portable code that executes in a predictable way
independent of environment settings. Just make sure to specify the encoding
your application uses for file handling in your documentation.</p>

<p>The same concepts apply to other programming languages as well. Java&#8217;s
<a href="http://docs.oracle.com/javase/7/docs/api/java/io/FileReader.html"><code>java.io.FileReader</code></a>
for example is completely useless because it does not allow you to state the
encoding manually:</p>

<blockquote><p>The constructors of this class assume that the default character encoding and<br/>the default byte-buffer size are appropriate. To specify these values yourself,<br/>construct an InputStreamReader on a FileInputStream.</p></blockquote>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ReChat for Twitch]]></title>
    <link href="http://www.codinghell.ch/blog/2015/02/02/rechat-for-twitch/"/>
    <updated>2015-02-02T16:13:00-08:00</updated>
    <id>http://www.codinghell.ch/blog/2015/02/02/rechat-for-twitch</id>
    <content type="html"><![CDATA[<p><img class="center" src="http://files.codinghell.ch/pictures/2015-02-02-rechat.png" width="300" height="191"></p>

<p>A little while ago, I released an extension that adds a nifty feature to
<a href="http://www.twitch.tv/">Twitch</a> (Twitch is the video streaming platform for
games that was acquired by Amazon last year for $970 million):
<a href="https://www.rechat.org">ReChat&nbsp;for&nbsp;Twitch</a>.</p>

<p>Twitch does not only allow users to see live video streams but also records
them so that users can watch them later. The one thing you miss out on when you
watch a recorded stream is the chat. This is where ReChat comes into play:
<strong>ReChat allows you to see the recorded chat messages as if it was a live
stream.</strong></p>

<!-- more -->


<h1>Indexing chat messages</h1>

<p>Since Twitch does either not record chat messages or at least not make them
available through their API, I was forced to build my own indexing system.</p>

<p>Luckily, Twitch&#8217;s custom built chat server does not only come with an HTTP
front-end, but is also reachable via IRC. IRC, in contrast to the proprietary
HTTP chat interface of Twitch, is a well documented and quite simple standard
(<a href="https://tools.ietf.org/html/rfc1459">RFC&nbsp;1459</a>) and was therefore the
natural choice to connect to Twitch chat.</p>

<p><img class="center" src="http://files.codinghell.ch/pictures/2015-02-02-rechat-indexer.png" width="558" height="52"></p>

<p>I chose to write the indexing daemon in JavaScript and run it with
<a href="http://nodejs.org/">Node.js</a>. It&#8217;s event-driven architecture and the
non-blocking I/O seems like a perfect fit for an application that waits on
numerous connections for incoming chat messages.</p>

<p>For the storage backend, I chose to go with
<a href="http://www.elasticsearch.org/">Elasticsearch</a>. Not only does Elasticsearch a
good job at indexing hundreds of documents per second, it also is easily
scalable and blazingly fast at finding documents. Every chat message is
represented by a JSON document consisting of the actual message, the sender,
the chat room, and a timestamp.</p>

<h1>Browser extension</h1>

<p>Since all modern browser (probably even
<a href="http://www.neowin.net/news/internet-explorer-12-ui-overhaul-is-a-blend-of-chrome-and-firefox-adds-extension-support">Internet&nbsp;Explorer&nbsp;12</a>)
feature a JavaScript powered extension interface, writing cross-browser
extensions has never been easier. The main difference between the browsers is
how you have to provide metadata (e.g.
<a href="https://github.com/pencil/rechat/blob/master/Chrome/manifest.json">manifest.json</a>
for Chrome,
<a href="https://github.com/pencil/rechat/blob/master/Firefox/package.json">package.json</a>
for Firefox, …) and the <a href="https://github.com/pencil/rechat/blob/94400622b8e2e1143c0eecdf87d0de7a2021ae9e/common/js/rechat.js#L28-L38">API to access bundled
resources</a>.</p>

<p>All of the browser extension&#8217;s source code is available on
<a href="https://github.com/pencil/rechat">GitHub</a>.</p>

<h1>Search API</h1>

<p><img class="center" src="http://files.codinghell.ch/pictures/2015-02-02-rechat-search.png" width="759" height="130"></p>

<p>The ReChat search API consists of a basic <a href="http://www.sinatrarb.com/">Sinatra</a>
web application that talks to Elasticsearch, a threaded <a href="http://puma.io/">Puma</a>
that acts as application server, and an <a href="http://nginx.org/">nginx</a> as reverse
proxy.</p>

<p>Based on the unique Twitch video ID, the web application fetches video time
information via Twitch API, searches for the matching chat messages in the
Elasticsearch index and serves them in chunks with pagination.</p>

<h1>Aggregations</h1>

<p>Elasticsearch has some nifty aggregation features to analyze the data
available.  Maybe some sort of statistics page would be a nice addition? It
could for example feature a visual representation of the most frequent words
(some common english words filtered out):</p>

<p><img class="center" src="http://files.codinghell.ch/pictures/2015-02-02-twitch-chat-cloud.png" width="800" height="354"></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Migrate from RVM to rbenv]]></title>
    <link href="http://www.codinghell.ch/blog/2013/05/24/migrate-from-rvm-to-rbenv/"/>
    <updated>2013-05-24T22:51:00-07:00</updated>
    <id>http://www.codinghell.ch/blog/2013/05/24/migrate-from-rvm-to-rbenv</id>
    <content type="html"><![CDATA[<p>I switched from RVM to <a href="http://rbenv.org/">rbenv</a> for managing Ruby versions on my development machine. RVM does not follow the classic <a href="http://en.wikipedia.org/wiki/Unix_philosophy#McIlroy:_A_Quarter_Century_of_Unix">UNIX philosophy</a>; RVM does too many things (Ruby environment management, Ruby compilation and installation, …). It feels kind of bloated to me.</p>

<!-- more -->


<h1>Basic setup</h1>

<p>Uninstall <code>rvm</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rvm implode
</span></code></pre></td></tr></table></div></figure>


<p>Install <code>rbenv</code> and <code>ruby-build</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>brew update
</span><span class='line'>brew install rbenv
</span><span class='line'>brew install ruby-build
</span></code></pre></td></tr></table></div></figure>


<p>Remove RVM initializers from your <code>.bash_profile</code> and instead add <code>rbenv</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">eval</span> <span class="s2">&quot;$(rbenv init -)&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Restart your shell (or re-source <code>.bash_profile</code>).</p>

<p>Now you can start installing Ruby versions:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rbenv install 1.9.3-p194
</span><span class='line'>rbenv install 1.9.3-p429
</span><span class='line'>rbenv install 2.0.0-p195
</span><span class='line'>rbenv rehash  <span class="c"># Rehash rbenv shims (run this after installing executables)</span>
</span></code></pre></td></tr></table></div></figure>


<h1>Gemsets</h1>

<p>If you used RVMs project-specific gemsets and would like to continue to do so, I recommend installing <code>rbenv-gemset</code>. Be sure to install an up-to-date version to support loading <code>.ruby-gemset</code> files (instead of just <code>.rbenv-gemsets</code> files):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>brew install rbenv-gemset --HEAD
</span></code></pre></td></tr></table></div></figure>


<p>If you already migrated from <code>.rvmrc</code> to <code>.ruby-version</code> (and <code>.ruby-gemset</code>), this setup is 100% compatible with <code>rvm</code>. If not, now is the time to do so: <code>.ruby-version</code> contains the Ruby version (like <code>1.9.3-p429</code>) while <code>.ruby-gemset</code> contains the name of the gemset (like <code>casino</code>). You can delete <code>.rvmrc</code> afterwards.</p>

<h1>Pow</h1>

<p>If you are using <a href="http://pow.cx/">Pow</a>, add this to your <code>~/.powconfig</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">export </span><span class="nv">PATH</span><span class="o">=</span><span class="k">$(</span>rbenv root<span class="k">)</span>/shims:<span class="nv">$PATH</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How and when (not) to use exceptions]]></title>
    <link href="http://www.codinghell.ch/blog/2013/03/31/how-and-when-not-to-use-exceptions/"/>
    <updated>2013-03-31T10:32:00-07:00</updated>
    <id>http://www.codinghell.ch/blog/2013/03/31/how-and-when-not-to-use-exceptions</id>
    <content type="html"><![CDATA[<p>Did you ever ask yourself, how you should &#8220;design&#8221; your exceptions? Ever wondered if you understood the idea behind exceptions? Do you know, what you should use exceptions for? This article aims to clarify how and when (not) to use exceptions.</p>

<!-- more -->


<p>I will use some Ruby for the example code, but the principles are the same in all other programming languages (at least the ones I know).</p>

<h1>Exception as in exceptional</h1>

<p>Exceptions should be used for situation where a certain method or function could not execute normally. For example, when it encounters broken input or when a resource (e.g. a file) is unavailable. Use exceptions to signal the caller that you faced an error which you are unwilling or unable to handle. The exception is then passed to the caller who has the chance to either handle the exception or pass it on (chain-of-responsibility).</p>

<figure class='code'><figcaption><span>How to use exceptions</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="n">identifier</span><span class="p">)</span>
</span><span class='line'>  <span class="k">unless</span> <span class="vi">@data</span><span class="o">.</span><span class="n">has_key?</span><span class="p">(</span><span class="n">identifier</span><span class="p">)</span>
</span><span class='line'>    <span class="k">raise</span> <span class="no">UnknownIdentifierError</span><span class="p">,</span> <span class="s2">&quot;Identifier &#39;</span><span class="si">#{</span><span class="n">identifier</span><span class="si">}</span><span class="s2">&#39; is not registered&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="c1"># ...</span>
</span><span class='line'>  <span class="k">raise</span> <span class="no">TimeoutError</span><span class="p">,</span> <span class="s2">&quot;Timeout while connecting to server &#39;</span><span class="si">#{</span><span class="n">server</span><span class="si">}</span><span class="s2">&#39;.&quot;</span>
</span><span class='line'>  <span class="c1"># ...</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Don&#8217;t use exceptions for your normal application flow. Take a look at the following example:</p>

<figure class='code'><figcaption><span>How NOT to use exceptions</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">handle_client_input</span><span class="p">(</span><span class="n">input_stream</span><span class="p">)</span>
</span><span class='line'>  <span class="n">input_stream</span><span class="o">.</span><span class="n">each_line</span> <span class="k">do</span> <span class="o">|</span><span class="n">line</span><span class="o">|</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">line</span> <span class="o">=~</span> <span class="sr">/^hello$/i</span>
</span><span class='line'>      <span class="c1"># ...</span>
</span><span class='line'>    <span class="k">elsif</span> <span class="n">line</span> <span class="o">=~</span> <span class="sr">/^quit$/i</span>
</span><span class='line'>      <span class="k">raise</span> <span class="no">ClientQuitEvent</span><span class="p">,</span> <span class="s2">&quot;Client is about to disconnect.&quot;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>In this example we use an exception to signal the caller that the client disconnected by sending a <code>quit</code> command. Something that will happen in every normal use case of this method. There are multiple reasons why you should <strong>not do this</strong>:</p>

<ol>
<li><p><strong>Exceptions are not designed for this.</strong> Developers using this API or reading through the source code will be confused. It looks like a failure scenario but it&#8217;s just some sort of flow control.</p></li>
<li><p><strong>Exceptions are hard to follow.</strong> If you are using exceptions like this, you are using just another form of a <code>goto</code> statement. I don&#8217;t have to clarify why using <code>goto</code> is a bad idea, do I?</p></li>
<li><p><strong>Exceptional exceptions?</strong> If you use exceptions for normal situations, how do you signal unusual situations?</p></li>
<li><p><strong>Exceptions are slow.</strong> Because exception only rarely occur, performance is not a priority for the implementers of compilers nor the designers of the language. Throwing and catching exceptions is inefficient and many times slower than a simple check of a return value or a state field.</p></li>
</ol>


<p>Don&#8217;t use exceptions to signal something completely normal. Don&#8217;t use exceptions to control your normal application flow. Use return values or state fields for flow control instead.</p>

<h1>It&#8217;s all about the hierarchy</h1>

<p>Another question that pops up frequently: What structure (hierarchy, inheritance, …) should I use for my own exceptions?</p>

<p>Exceptions should be as specific as possible. Especially if you are designing an API that will be used by third-party developers.</p>

<p>Your own exceptions should all inherit from a common exception in your namespace. And this exception class in turn should inherit from the standard library exception (e.g. <code>StandardError</code> in Ruby, <code>Exception</code> in Java).</p>

<figure class='code'><figcaption><span>How to structure your exceptions</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">MyAwesomeModule</span>
</span><span class='line'>  <span class="k">class</span> <span class="nc">Error</span> <span class="o">&lt;</span> <span class="no">StandardError</span><span class="p">;</span> <span class="k">end</span>
</span><span class='line'>  <span class="k">class</span> <span class="nc">ClientError</span> <span class="o">&lt;</span> <span class="no">Error</span><span class="p">;</span> <span class="k">end</span>
</span><span class='line'>  <span class="k">class</span> <span class="nc">TimeoutError</span> <span class="o">&lt;</span> <span class="no">ClientError</span><span class="p">;</span> <span class="k">end</span>
</span><span class='line'>  <span class="k">class</span> <span class="nc">ParsingError</span> <span class="o">&lt;</span> <span class="no">ClientError</span><span class="p">;</span> <span class="k">end</span>
</span><span class='line'>  <span class="c1"># ...</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>This allows the caller to decide which exceptions he would like to handle. If you don&#8217;t follow this advice, you might end up with an error design as broken as the one in Ruby&#8217;s Net::HTTP. Because there is no common error class, a caller willing to catch all module specific exceptions must list all possible exceptions that may occur:</p>

<figure class='code'><figcaption><span>Net::HTTP&#8217;s broken error design</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">begin</span>
</span><span class='line'>  <span class="n">response</span> <span class="o">=</span> <span class="ss">Net</span><span class="p">:</span><span class="ss">:HTTP</span><span class="o">.</span><span class="n">post_form</span><span class="p">(</span><span class="o">.</span><span class="n">.</span><span class="o">.</span><span class="p">)</span>
</span><span class='line'><span class="k">rescue</span> <span class="ss">Timeout</span><span class="p">:</span><span class="ss">:Error</span><span class="p">,</span> <span class="ss">Errno</span><span class="p">:</span><span class="ss">:EINVAL</span><span class="p">,</span> <span class="ss">Errno</span><span class="p">:</span><span class="ss">:ECONNRESET</span><span class="p">,</span> <span class="no">EOFError</span><span class="p">,</span> <span class="ss">Net</span><span class="p">:</span><span class="ss">:HTTPBadResponse</span><span class="p">,</span> <span class="ss">Net</span><span class="p">:</span><span class="ss">:HTTPHeaderSyntaxError</span><span class="p">,</span> <span class="ss">Net</span><span class="p">:</span><span class="ss">:ProtocolError</span> <span class="o">=&gt;</span> <span class="n">e</span>
</span><span class='line'>  <span class="c1"># ...</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<h1>Be verbose</h1>

<p>When throwing an exception, you should supply an error message describing what exactly went wrong. This is especially useful for logging and debugging.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">raise</span> <span class="ss">MyAwesomeModule</span><span class="p">:</span><span class="ss">:ParsingError</span><span class="p">,</span> <span class="s2">&quot;Character </span><span class="si">#{</span><span class="n">character</span><span class="si">}</span><span class="s2"> at position </span><span class="si">#{</span><span class="n">position</span><span class="si">}</span><span class="s2"> is not allowed&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The error messages are only intended for humans. They should not be used by the calling method to determine what probably went wrong.</p>

<h1>tl;dr</h1>

<p>Exceptions should be used to signal serious errors from which your method is unable or unwilling to recover. In a best case scenario, no exceptions should occur during the whole application flow.</p>

<p>Be sure to structure your exceptions and use a hierarchy to simplify exception handling for the caller.</p>

<p>Use the optional error message to supply additional debug information.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CASino: An easy to use Single sign-on (SSO)]]></title>
    <link href="http://www.codinghell.ch/blog/2013/03/30/casino-an-easy-to-use-single-sign-on-sso/"/>
    <updated>2013-03-30T13:22:00-07:00</updated>
    <id>http://www.codinghell.ch/blog/2013/03/30/casino-an-easy-to-use-single-sign-on-sso</id>
    <content type="html"><![CDATA[<p>Back in 2012 we were looking for a solution to replace our company-wide SSO with something more robust and future proof. After comparing various SSO technologies and standards, we decided to go with a <a href="http://www.jasig.org/cas/protocol">CAS</a>-based solution. CAS is an open standard and there are libraries for a wide range of client platforms (e.g. Ruby, Java, PHP, .NET, Apache).</p>

<h1>RubyCAS-Server</h1>

<p>We didn&#8217;t have any knowledge in running a big Java web application, so we decided to use the RubyCAS-Server. Running and maintaining Ruby web applications was (and still is) our daily business.</p>

<p>After some weeks and months of usage, we encountered several bugs and shortcomings in RubyCAS-Server. What&#8217;s worse: RubyCAS-Server does not fully adhere the CAS standard. &#8220;No problem, it&#8217;s open source!&#8221;, you&#8217;re probably saying. That&#8217;s what we thought too&#8230; After looking through the source code, we almost cried: it&#8217;s a mess and not well tested. But we didn&#8217;t give up here and began to hack our changes in. We then opened issues and pull requests but did not get any feedback. Very frustrating! The project seemed dead to us.</p>

<h1>CASino</h1>

<p>That&#8217;s when we formed an organization (<a href="https://github.com/rbCAS">rbCAS</a>) and decided to build our own Ruby on Rails based CAS server: <strong><a href="http://casino.rbcas.com/">CASino</a></strong></p>

<p>It took us just a few weeks to implement basic CAS support. We had a clean code base, a responsive user interface and 100% compatibility with the CAS standard.</p>

<p><img src="http://files.codinghell.ch/pictures/2013-03-30-casino-login.png" width="660" height="384"></p>

<!--more-->


<p>But we didn&#8217;t stop here; the clean and well-tested source code allowed us to go beyond the CAS standard and add features such as two-factor authentication and a session overview.</p>

<p><img src="http://files.codinghell.ch/pictures/2013-03-30-casino-session-overview.png" width="860" height="631"></p>

<p>We also built a product page with an appealing documentation: Check out <a href="http://casino.rbcas.com/">casino.rbcas.com</a> to learn how to setup your SSO within minutes.</p>

<p>And that&#8217;s it? Of course not! We are still adding features to CASino. So make sure to follow the project on <a href="http://github.com/rbCAS/CASino">GitHub</a>, report feature requests or ask questions in <a href="irc://chat.freenode.net/rbCAS">our IRC channel</a> (<a href="http://webchat.freenode.net?randomnick=1&amp;channels=rbcas&amp;uio=d4">webchat</a>)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CAS: The missing domain model]]></title>
    <link href="http://www.codinghell.ch/blog/2012/12/23/cas-the-missing-domain-model/"/>
    <updated>2012-12-23T17:30:00-08:00</updated>
    <id>http://www.codinghell.ch/blog/2012/12/23/cas-the-missing-domain-model</id>
    <content type="html"><![CDATA[<p>As you probably know, I&#8217;m currently working on an <a href="https://github.com/pencil/CASino">implementation of the server part</a> of the <a href="http://www.jasig.org/cas/protocol">CAS protocol</a>. The documentation is very fragmented and definitely lacking some graphics and diagrams.</p>

<!--more-->


<p>So here is my contribution: A domain model to give you an overview over the CAS entities as I know them until now.</p>

<p><img src="http://files.codinghell.ch/pictures/2012-12-23-cas-domain-model.png" width="529" height="596"></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Anvil: Menubar app for managing Pow]]></title>
    <link href="http://www.codinghell.ch/blog/2012/11/10/anvil-menubar-app-for-managing-pow/"/>
    <updated>2012-11-10T12:32:00-08:00</updated>
    <id>http://www.codinghell.ch/blog/2012/11/10/anvil-menubar-app-for-managing-pow</id>
    <content type="html"><![CDATA[<p>If you are (like me) developing Ruby on Rails applications under Mac OS X, you are probably already familiar with <a href="http://pow.cx/">Pow</a>. Pow is doubtless the easiest way to run multiple Rack applications on your development machine.</p>

<p>The only thing not that intuitive to me was the whole linking progress as it was easy to lose track of what you already &#8220;deployed&#8221; to your local Pow installation.</p>

<p><strong>Not anymore, <a href="http://anvilformac.com/">Anvil</a> to the rescue!</strong></p>

<p><img src="http://files.codinghell.ch/pictures/2012-11-10-anvil-window.png" width="330" height="346"></p>

<p>It adds a little menubar icon that gives you access to your Pow apps, allows adding new ones and lets you easily execute various Pow commands (start, stop, &#8230;). Finally a nice GUI for Pow! :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Hide actual database IDs from your users]]></title>
    <link href="http://www.codinghell.ch/blog/2012/10/14/hide-actual-database-ids-from-your-users/"/>
    <updated>2012-10-14T13:53:00-07:00</updated>
    <id>http://www.codinghell.ch/blog/2012/10/14/hide-actual-database-ids-from-your-users</id>
    <content type="html"><![CDATA[<p>In a project I&#8217;m working on in my spare time, I wanted to hide / obfuscate the databases IDs of my ActiveRecord model. I didn&#8217;t want the users to find records by simply incrementing a number in the URL.</p>

<p>I ended up writing my own Gem, which manipulates ActiveRecord::Base to hide the actual ID. Rails&#8217;s <a href="http://guides.rubyonrails.org/routing.html#generating-paths-and-urls-from-code">path functions</a> still work as expected. The only thing I had to add to the actual project was the following line:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">User</span> <span class="o">&lt;</span> <span class="ss">ActiveRecord</span><span class="p">:</span><span class="ss">:Base</span>
</span><span class='line'>  <span class="n">encrypted_id</span> <span class="ss">key</span><span class="p">:</span> <span class="s1">&#39;5gA6lgr5g3GOg7EOQ1caYQ&#39;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>I open sourced the project on GitHub (<a href="https://github.com/pencil/encrypted_id#readme">pencil/encrypted_id</a>) and published it on <a href="https://rubygems.org/gems/encrypted_id">RubyGems.org</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Tic-tac-toe AI Part 4: Learning by doing]]></title>
    <link href="http://www.codinghell.ch/blog/2012/09/15/tic-tac-toe-ai-part-4-learning-by-doing/"/>
    <updated>2012-09-15T12:00:00-07:00</updated>
    <id>http://www.codinghell.ch/blog/2012/09/15/tic-tac-toe-ai-part-4-learning-by-doing</id>
    <content type="html"><![CDATA[<p>The second bot doesn&#8217;t know any strategies to win tic-tac-toe. This bot will simply try things out and give each move a score once the game ended. If the bot wins, all moves that lead to this situation will get score+1, if he loses, all moves will get score-1. The default score is 0.</p>

<p>So when it is this bots turn, it will decide based on the scores:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">private</span> <span class="n">Map</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Move</span><span class="o">&gt;</span> <span class="n">scores</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HashMap</span><span class="o">&lt;&gt;();</span>
</span><span class='line'>
</span><span class='line'><span class="kd">private</span> <span class="n">Move</span> <span class="nf">chooseMove</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>  <span class="n">Move</span> <span class="n">bestMove</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">9</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="o">(</span><span class="n">gameGrid</span><span class="o">.</span><span class="na">getField</span><span class="o">(</span><span class="n">i</span><span class="o">)</span> <span class="o">==</span> <span class="n">Field</span><span class="o">.</span><span class="na">EMPTY</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">GameGrid</span> <span class="n">possibleGrid</span> <span class="o">=</span> <span class="k">new</span> <span class="n">GameGrid</span><span class="o">(</span><span class="n">gameGrid</span><span class="o">);</span>
</span><span class='line'>          <span class="n">possibleGrid</span><span class="o">.</span><span class="na">setField</span><span class="o">(</span><span class="n">i</span><span class="o">,</span> <span class="n">playersField</span><span class="o">);</span>
</span><span class='line'>          <span class="kt">int</span> <span class="n">hashCode</span> <span class="o">=</span> <span class="n">possibleGrid</span><span class="o">.</span><span class="na">hashCode</span><span class="o">();</span>
</span><span class='line'>          <span class="k">if</span> <span class="o">(!</span><span class="n">scores</span><span class="o">.</span><span class="na">containsKey</span><span class="o">(</span><span class="n">hashCode</span><span class="o">))</span> <span class="o">{</span>
</span><span class='line'>              <span class="n">scores</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">hashCode</span><span class="o">,</span> <span class="k">new</span> <span class="n">Move</span><span class="o">(</span><span class="n">hashCode</span><span class="o">));</span>
</span><span class='line'>          <span class="o">}</span>
</span><span class='line'>          <span class="n">Move</span> <span class="n">move</span> <span class="o">=</span> <span class="n">scores</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">hashCode</span><span class="o">);</span>
</span><span class='line'>          <span class="k">if</span> <span class="o">(</span><span class="n">bestMove</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">||</span> <span class="n">move</span><span class="o">.</span><span class="na">score</span> <span class="o">&gt;</span> <span class="n">bestMove</span><span class="o">.</span><span class="na">score</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>              <span class="n">bestMove</span> <span class="o">=</span> <span class="n">move</span><span class="o">;</span>
</span><span class='line'>          <span class="o">}</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">bestMove</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>We then have to save the performed moves, so that we later can set the score accordingly:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kt">void</span> <span class="nf">reset</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">score</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="o">(</span><span class="n">gameGrid</span><span class="o">.</span><span class="na">getWinner</span><span class="o">()</span> <span class="o">==</span> <span class="n">playersField</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">score</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span>
</span><span class='line'>  <span class="o">}</span> <span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="n">gameGrid</span><span class="o">.</span><span class="na">getWinner</span><span class="o">()</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">score</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="o">;</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  <span class="k">for</span> <span class="o">(</span><span class="n">Move</span> <span class="n">move</span> <span class="o">:</span> <span class="n">performedMoves</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">move</span><span class="o">.</span><span class="na">score</span> <span class="o">+=</span> <span class="n">score</span><span class="o">;</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  <span class="n">performedMoves</span><span class="o">.</span><span class="na">clear</span><span class="o">();</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&#8217;s it! So the learning AI is even simpler than the <a href="http://www.codinghell.ch/blog/2012/08/31/tic-tac-toe-ai-part-3-game-tree-for-the-win/">Minimax bot</a>.</p>

<!--more-->


<h1>Results</h1>

<p>The question is: How good is this bot?</p>

<p>To measure this, I let the bot play against a really stupid bot (chooses always a random move). In the following screenshots: &#8220;Player 1&#8221; is the stupid bot, &#8220;Player 2&#8221; is the learning bot.</p>

<figure>
  <img src="http://files.codinghell.ch/pictures/2012-09-15-20-rounds.png" width="450" height="536">
  <figcaption>At the beginning they are both stupid (stupid bot even got a higher winning rate).</figcaption>
</figure>




<figure>
  <img src="http://files.codinghell.ch/pictures/2012-09-15-98-rounds.png" width="450" height="536">
  <figcaption>After ~100 rounds, the learning bot is getting better.</figcaption>
</figure>




<figure>
  <img src="http://files.codinghell.ch/pictures/2012-09-15-1206-rounds.png" width="450" height="536">
  <figcaption>After ~1.200 rounds, the learning bot won 76.2% of the last 1.000 games.</figcaption>
</figure>




<figure>
  <img src="http://files.codinghell.ch/pictures/2012-09-15-2108-rounds.png" width="450" height="536">
  <figcaption>After ~2.100 rounds, the winning rate was at 81.2%.</figcaption>
</figure>




<figure>
  <img src="http://files.codinghell.ch/pictures/2012-09-15-8249-rounds.png" width="450" height="536">
  <figcaption>After ~8.250 rounds, the learning bot had a winning rate of 83.5%.</figcaption>
</figure>




<figure>
  <img src="http://files.codinghell.ch/pictures/2012-09-15-20003-rounds.png" width="450" height="536">
  <figcaption>After ~20.000 rounds, the learning bot won 84.5% of the last 1.000 games.</figcaption>
</figure>


<p>As you see, the learning bot is indeed smarter than a purely random but (as expected). Playing this 20.000 rounds took 15 minutes. Probably he would get even as good as the simulating bot (which has a winning rate of ~80% against the stupid bot but never loses) if he would be running/learning long enough.</p>

<p><strong>Update 2012-09-16 19:41</strong>: After ~3.000 rounds, the learning bot achieved a 100% draw rate against the simulation bot. Yay! :)</p>

<h1>Source Code</h1>

<p>Once I finished refactoring the code, I will make my repository public on GitHub. In the meantime, you can download a playable version here: <a href="http://files.codinghell.ch/downloads/TicTacToe.jar">Simple Tic-tac-toe</a> (Java 7 required)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Java 7: Try-with-resources]]></title>
    <link href="http://www.codinghell.ch/blog/2012/08/31/java-7-try-with-resources/"/>
    <updated>2012-08-31T23:07:00-07:00</updated>
    <id>http://www.codinghell.ch/blog/2012/08/31/java-7-try-with-resources</id>
    <content type="html"><![CDATA[<p>A nice Java 7 feature is the new try-with-resources statement.</p>

<p>When you did some SQL things back in the Java 6 days, you often ended up with something like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="k">try</span> <span class="o">{</span>
</span><span class='line'>  <span class="n">Connection</span> <span class="n">con</span> <span class="o">=</span> <span class="n">createConnection</span><span class="o">();</span>
</span><span class='line'>  <span class="c1">// do something</span>
</span><span class='line'>  <span class="n">Statement</span> <span class="n">stmt</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>  <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">stmt</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="na">createStatement</span><span class="o">();</span>
</span><span class='line'>    <span class="n">ResultSet</span> <span class="n">rs</span> <span class="o">=</span> <span class="n">stmt</span><span class="o">.</span><span class="na">executeQuery</span><span class="o">(</span><span class="s">&quot;SELECT ...&quot;</span><span class="o">);</span>
</span><span class='line'>    <span class="c1">// do something with rs</span>
</span><span class='line'>    <span class="n">rs</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>  <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">SQLException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
</span><span class='line'>  <span class="o">}</span> <span class="k">finally</span> <span class="o">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="o">(</span><span class="n">stmt</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">stmt</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'><span class="o">}</span> <span class="k">finally</span> <span class="o">{</span>
</span><span class='line'>  <span class="n">con</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now with Java 7, this got a lot easier and shorter:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="k">try</span> <span class="o">(</span><span class="n">Connection</span> <span class="n">con</span> <span class="o">=</span> <span class="n">createConnection</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>  <span class="c1">// do something</span>
</span><span class='line'>  <span class="k">try</span> <span class="o">(</span><span class="n">Statement</span> <span class="n">stmt</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="na">createStatement</span><span class="o">();</span>
</span><span class='line'>       <span class="n">ResultSet</span> <span class="n">rs</span> <span class="o">=</span> <span class="n">stmt</span><span class="o">.</span><span class="na">executeQuery</span><span class="o">(</span><span class="s">&quot;SELECT ...&quot;</span><span class="o">))</span> <span class="o">{</span>
</span><span class='line'>    <span class="c1">// do something with rs</span>
</span><span class='line'>  <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">SQLException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>Awesome!</strong></p>

<p>If you want to write a class that supports this syntax, you may take a look a the <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/AutoCloseable.html">AutoClosable</a> interface.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Tic-tac-toe AI Part 3: Game tree for the win]]></title>
    <link href="http://www.codinghell.ch/blog/2012/08/31/tic-tac-toe-ai-part-3-game-tree-for-the-win/"/>
    <updated>2012-08-31T19:18:00-07:00</updated>
    <id>http://www.codinghell.ch/blog/2012/08/31/tic-tac-toe-ai-part-3-game-tree-for-the-win</id>
    <content type="html"><![CDATA[<p>Writing a bot for a game as simple as tic-tac-toe is not that hard. As there are only 255,168 possible games, you can easily simulate all of them to search for good moves.</p>

<p>So the first thing the bot does is generating all possible game endings based on the current situation. The resulting situations can be stored in a so called <strong>Game Tree</strong>:</p>

<figure>
  <img src="http://files.codinghell.ch/pictures/2012-08-31-Tic-tac-toe-game-tree.png" width="500" height="333">
  <figcaption>Image source: <a href="http://en.wikipedia.org/wiki/File:Tic-tac-toe-game-tree.svg">Wikipedia</a>/<a href="http://en.wikipedia.org/wiki/User:Gdr">Gdr</a></figcaption>
</figure>


<!--more-->


<p>To generate the game tree, we will use a <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/RecursiveAction.html">RecursiveAction</a> to speed things up:</p>

<figure class='code'><figcaption><span>SimulatingBot$SimulationTreeNode</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">class</span> <span class="nc">SimulationTreeNode</span> <span class="kd">extends</span> <span class="n">RecursiveAction</span> <span class="o">{</span>
</span><span class='line'>  <span class="kd">private</span> <span class="kd">static</span> <span class="kt">int</span> <span class="n">FORK_THRESHOLD</span> <span class="o">=</span> <span class="mi">6</span><span class="o">;</span>
</span><span class='line'>  <span class="n">SimulationTreeNode</span><span class="o">[]</span> <span class="n">possibleMoves</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">private</span> <span class="n">GameGrid</span> <span class="n">gameGrid</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/**</span>
</span><span class='line'><span class="cm">   * Last position set that let to the situation now</span>
</span><span class='line'><span class="cm">   */</span>
</span><span class='line'>  <span class="kd">private</span> <span class="kt">byte</span> <span class="n">chosenPosition</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/**</span>
</span><span class='line'><span class="cm">   * Player who should act now</span>
</span><span class='line'><span class="cm">   */</span>
</span><span class='line'>  <span class="kd">private</span> <span class="n">Field</span> <span class="n">activePlayer</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">protected</span> <span class="kt">boolean</span> <span class="nf">isComputersTurn</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">activePlayer</span> <span class="o">==</span> <span class="n">playersField</span><span class="o">;</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nd">@Override</span>
</span><span class='line'>  <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">compute</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="o">(</span><span class="n">gameGrid</span><span class="o">.</span><span class="na">getWinner</span><span class="o">()</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">||</span> <span class="n">gameGrid</span><span class="o">.</span><span class="na">countFreeFields</span><span class="o">()</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="k">return</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>    <span class="kt">int</span> <span class="n">freeFields</span> <span class="o">=</span> <span class="n">gameGrid</span><span class="o">.</span><span class="na">countFreeFields</span><span class="o">();</span>
</span><span class='line'>    <span class="n">possibleMoves</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SimulationTreeNode</span><span class="o">[</span><span class="n">freeFields</span><span class="o">];</span>
</span><span class='line'>    <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>      <span class="kt">int</span> <span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>      <span class="k">for</span> <span class="o">(</span><span class="kt">byte</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">9</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="o">(</span><span class="n">gameGrid</span><span class="o">.</span><span class="na">getField</span><span class="o">(</span><span class="n">i</span><span class="o">)</span> <span class="o">==</span> <span class="n">Field</span><span class="o">.</span><span class="na">EMPTY</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">SimulationTreeNode</span> <span class="n">child</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SimulationTreeNode</span><span class="o">(</span>
</span><span class='line'>              <span class="n">gameGrid</span><span class="o">,</span> <span class="n">i</span><span class="o">,</span> <span class="n">otherPlayer</span><span class="o">(</span><span class="n">activePlayer</span><span class="o">));</span>
</span><span class='line'>          <span class="n">possibleMoves</span><span class="o">[</span><span class="n">counter</span><span class="o">++]</span> <span class="o">=</span> <span class="n">child</span><span class="o">;</span>
</span><span class='line'>          <span class="k">if</span> <span class="o">(</span><span class="n">freeFields</span> <span class="o">&lt;</span> <span class="n">FORK_THRESHOLD</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">child</span><span class="o">.</span><span class="na">compute</span><span class="o">();</span>
</span><span class='line'>          <span class="o">}</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>      <span class="k">if</span> <span class="o">(</span><span class="n">freeFields</span> <span class="o">&gt;=</span> <span class="n">FORK_THRESHOLD</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">invokeAll</span><span class="o">(</span><span class="n">Arrays</span><span class="o">.</span><span class="na">asList</span><span class="o">(</span><span class="n">possibleMoves</span><span class="o">));</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">EngineException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Each <code>SimulationTreeNode</code> starts a new thread to generate all possible moves. If less then 6 free fields are left, no new threads are started (wouldn&#8217;t improve performance anymore). The generated sub-situations are stored in an array.</p>

<p>Now when it is the computers turn, it can build the game tree or search for the new situation in the existing game tree (after players move):</p>

<figure class='code'><figcaption><span>SimulatingBot</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="nd">@Override</span>
</span><span class='line'><span class="kd">public</span> <span class="kt">int</span> <span class="nf">getNextMove</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="o">(</span><span class="n">simulationTree</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">generateSimulationTree</span><span class="o">();</span>
</span><span class='line'>  <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">simulationTree</span> <span class="o">=</span> <span class="n">simulationTree</span><span class="o">.</span><span class="na">getChild</span><span class="o">(</span><span class="n">gameGrid</span><span class="o">.</span><span class="na">hashCode</span><span class="o">());</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  <span class="n">SimulationTreeNode</span> <span class="n">move</span> <span class="o">=</span> <span class="n">simulationTree</span><span class="o">.</span><span class="na">getBestMove</span><span class="o">();</span>
</span><span class='line'>  <span class="n">simulationTree</span> <span class="o">=</span> <span class="n">move</span><span class="o">;</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">move</span><span class="o">.</span><span class="na">getPosition</span><span class="o">();</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<h1>What should I do?</h1>

<p>You may noticed the <code>getBestMove</code> call to the simulation tree. This method searches the best possible move. Often there are multiple moves with the same &#8220;score&#8221;. A random one is returned in that situation:</p>

<figure class='code'><figcaption><span>SimulatingBot$SimulationTreeNode</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="n">SimulationTreeNode</span> <span class="nf">getBestMove</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>  <span class="kt">double</span> <span class="n">bestScore</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="o">;</span>
</span><span class='line'>  <span class="n">List</span><span class="o">&lt;</span><span class="n">SimulationTreeNode</span><span class="o">&gt;</span> <span class="n">bestMoves</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;&gt;();</span>
</span><span class='line'>  <span class="k">for</span> <span class="o">(</span><span class="n">SimulationTreeNode</span> <span class="n">child</span> <span class="o">:</span> <span class="n">possibleMoves</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="o">(</span><span class="n">child</span><span class="o">.</span><span class="na">getScore</span><span class="o">()</span> <span class="o">&gt;</span> <span class="n">bestScore</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">bestScore</span> <span class="o">=</span> <span class="n">child</span><span class="o">.</span><span class="na">getScore</span><span class="o">();</span>
</span><span class='line'>      <span class="n">bestMoves</span><span class="o">.</span><span class="na">clear</span><span class="o">();</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>    <span class="k">if</span> <span class="o">(</span><span class="n">child</span><span class="o">.</span><span class="na">getScore</span><span class="o">()</span> <span class="o">==</span> <span class="n">bestScore</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">bestMoves</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">child</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">index</span> <span class="o">=</span> <span class="n">randomGenerator</span><span class="o">.</span><span class="na">nextInt</span><span class="o">(</span><span class="n">bestMoves</span><span class="o">.</span><span class="na">size</span><span class="o">());</span>
</span><span class='line'>  <span class="n">SimulationTreeNode</span> <span class="n">bestMove</span> <span class="o">=</span> <span class="n">bestMoves</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">randomGenerator</span><span class="o">.</span><span class="na">nextInt</span><span class="o">(</span><span class="n">index</span><span class="o">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">bestMove</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>What does this &#8220;score&#8221; mean? The higher, the better: A defeat would be bad for us, so it has score -1. A draw would be OK, so it has score 0. Winning would be good, so it has score 1:</p>

<figure class='code'><figcaption><span>SimulatingBot$SimulationTreeNode</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">private</span> <span class="kt">byte</span> <span class="nf">calculateScore</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="o">(</span><span class="n">gameGrid</span><span class="o">.</span><span class="na">getWinner</span><span class="o">()</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="o">(</span><span class="n">gameGrid</span><span class="o">.</span><span class="na">countFreeFields</span><span class="o">()</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="mi">0</span><span class="o">;</span> <span class="c1">// draw</span>
</span><span class='line'>    <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>      <span class="c1">// Magic happens here!</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>  <span class="o">}</span> <span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="n">gameGrid</span><span class="o">.</span><span class="na">getWinner</span><span class="o">()</span> <span class="o">==</span> <span class="n">playersField</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="mi">1</span><span class="o">;</span> <span class="c1">// win</span>
</span><span class='line'>  <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="o">;</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>To calculate the score of situations which are not yet completed (no winner and still empty fields), we use the <a href="http://en.wikipedia.org/wiki/Minimax">Minimax algorithm</a>.</p>

<p>When it is the other players turn, we assume that he will try to do the best he can. So we must assume the lowest score of all possible moves for the situation. Because when we end up with that situation, the player could do this move that would hurt us.</p>

<p>When it is the computers turn, it will do the best it can. That&#8217;s why we can assume the highes score of all possible moves. Because when we end up with that situation, we may have a chance to do the move with that good score.</p>

<p>We end up with something like this:</p>

<figure class='code'><figcaption><span>SimulatingBot$SimulationTreeNode</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">private</span> <span class="kt">byte</span> <span class="nf">calculateScore</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="o">(</span><span class="n">gameGrid</span><span class="o">.</span><span class="na">getWinner</span><span class="o">()</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="o">(</span><span class="n">gameGrid</span><span class="o">.</span><span class="na">countFreeFields</span><span class="o">()</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="mi">0</span><span class="o">;</span> <span class="c1">// draw</span>
</span><span class='line'>    <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>      <span class="kt">byte</span> <span class="n">score</span> <span class="o">=</span> <span class="o">(</span><span class="kt">byte</span><span class="o">)</span> <span class="o">(</span><span class="n">isComputersTurn</span><span class="o">()</span> <span class="o">?</span> <span class="o">-</span><span class="mi">1</span> <span class="o">:</span> <span class="mi">1</span><span class="o">);</span>
</span><span class='line'>      <span class="k">for</span> <span class="o">(</span><span class="n">SimulationTreeNode</span> <span class="n">child</span> <span class="o">:</span> <span class="n">possibleMoves</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="o">(</span><span class="n">isComputersTurn</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>          <span class="c1">// computer will move, so search for good choice</span>
</span><span class='line'>          <span class="k">if</span> <span class="o">(</span><span class="n">child</span><span class="o">.</span><span class="na">getScore</span><span class="o">()</span> <span class="o">&gt;</span> <span class="n">score</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">score</span> <span class="o">=</span> <span class="n">child</span><span class="o">.</span><span class="na">getScore</span><span class="o">();</span>
</span><span class='line'>          <span class="o">}</span>
</span><span class='line'>        <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>          <span class="c1">// other player will move and tries to hurt us!</span>
</span><span class='line'>          <span class="k">if</span> <span class="o">(</span><span class="n">child</span><span class="o">.</span><span class="na">getScore</span><span class="o">()</span> <span class="o">&lt;</span> <span class="n">score</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">score</span> <span class="o">=</span> <span class="n">child</span><span class="o">.</span><span class="na">getScore</span><span class="o">();</span>
</span><span class='line'>          <span class="o">}</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>      <span class="k">return</span> <span class="n">score</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>  <span class="o">}</span> <span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="n">gameGrid</span><span class="o">.</span><span class="na">getWinner</span><span class="o">()</span> <span class="o">==</span> <span class="n">playersField</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="mi">1</span><span class="o">;</span> <span class="c1">// win</span>
</span><span class='line'>  <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="o">;</span> <span class="c1">// defeated</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Tic-tac-toe AI Part 2: The grid system]]></title>
    <link href="http://www.codinghell.ch/blog/2012/08/28/tic-tac-toe-ai-part-2-the-grid-system/"/>
    <updated>2012-08-28T11:13:00-07:00</updated>
    <id>http://www.codinghell.ch/blog/2012/08/28/tic-tac-toe-ai-part-2-the-grid-system</id>
    <content type="html"><![CDATA[<p>Before we can start implementing the actual artificial intelligence, we need to develop the basic game mechanics. The key element of Tic-tac-toe is obviously the game grid.</p>

<p>As the grid consists of 3x3 fields, we could go with a multidimensional array, where each field would store either a 0 (empty), 1 (X, player 1&#8217;s sign) or a 2 (O, player 2&#8217;s sign). But multidimensional arrays are difficult to serialize and you can&#8217;t do a simple pattern matching against them.</p>

<!--more-->


<h1>Integer to the rescue</h1>

<p>This is why we will use an integer to store the grid. We need 3 different states per field, which we can store using 2 bits each. Given the 9 fields of the grid, we totally need 18 bits (<em>doh</em>, short is only 16-bit, so we will definitely need an integer). The actual bit position is calculated as: <code>(x + (y * 3)) * 2</code></p>

<p><img src="http://files.codinghell.ch/pictures/2012-08-28-grid.png" width="350" height="350"></p>

<p>This makes it also very easy to reset the grid. We just need to set our integer back to 0.</p>

<h1>Bitwise operators</h1>

<p>Retrieving and setting the value of a field requires some bitwise operations. If we wanted to get the value of field <code>(1, 1)</code> (the center of the grid), we would start by calculating the bits&#8217; position, using the formula above: <code>position = (1 + (1 * 3)) * 2 = 8</code>. That implies, we need bit 8 and 9 to get the actual value. To get this two bits, we will need a mask. The mask is generated by setting bit 8 and bit 9 (the desired bits) to 1: <code>mask = 3 &lt;&lt; position</code>. Now we can do an AND to get the bits:</p>

<pre><code>    00 00 01 00 10 10 00 00 01
AND 00 00 00 00 11 00 00 00 00
  = 00 00 00 00 10 00 00 00 00
</code></pre>

<p>We now shift the result again, to get the actual value (<code>result &gt;&gt; position</code>), which gives us a 2 decimal. Which is exactly what we expected, yay!</p>

<p>The resulting Java code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kt">int</span> <span class="nf">getField</span><span class="o">(</span><span class="kt">int</span> <span class="n">x</span><span class="o">,</span> <span class="kt">int</span> <span class="n">y</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">position</span> <span class="o">=</span> <span class="n">calcualteBitPosition</span><span class="o">(</span><span class="n">x</span><span class="o">,</span> <span class="n">y</span><span class="o">);</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">mask</span> <span class="o">=</span> <span class="n">getMask</span><span class="o">(</span><span class="n">position</span><span class="o">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="na">grid</span> <span class="o">&amp;</span> <span class="n">mask</span><span class="o">)</span> <span class="o">&gt;&gt;</span> <span class="n">position</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">private</span> <span class="kt">int</span> <span class="nf">getMask</span><span class="o">(</span><span class="kt">int</span> <span class="n">position</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">mask</span> <span class="o">=</span> <span class="mi">3</span> <span class="o">&lt;&lt;</span> <span class="n">position</span><span class="o">;</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">mask</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">private</span> <span class="kt">int</span> <span class="nf">calcualteBitPosition</span><span class="o">(</span><span class="kt">int</span> <span class="n">x</span><span class="o">,</span> <span class="kt">int</span> <span class="n">y</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">position</span> <span class="o">=</span> <span class="o">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">y</span> <span class="o">*</span> <span class="mi">3</span><span class="o">)</span> <span class="o">*</span> <span class="mi">2</span><span class="o">;</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">position</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<h1>Come on, make a move!</h1>

<p>Say we would like to replace the value of <code>(1, 1)</code> with an X (not a valid game move, but we&#8217;ll do it anyway). We would first erase the current value at the given position, using AND with the inverted mask from above:</p>

<pre><code>    00 00 01 00 10 10 00 00 01
AND 11 11 11 11 00 11 11 11 11
  = 00 00 01 00 00 10 00 00 01
</code></pre>

<p>Then we would shift the desired value (X, therefore 1) to the desired position and do an OR:</p>

<pre><code>    00 00 01 00 00 10 00 00 01
OR  00 00 00 00 01 00 00 00 00
  = 00 00 01 00 01 10 00 00 01
</code></pre>

<p>The resulting Java code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kt">void</span> <span class="nf">setField</span><span class="o">(</span><span class="kt">int</span> <span class="n">x</span><span class="o">,</span> <span class="kt">int</span> <span class="n">y</span><span class="o">,</span> <span class="kt">int</span> <span class="n">value</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">position</span> <span class="o">=</span> <span class="n">calcualteBitPosition</span><span class="o">(</span><span class="n">x</span><span class="o">,</span> <span class="n">y</span><span class="o">);</span>
</span><span class='line'>  <span class="k">this</span><span class="o">.</span><span class="na">grid</span> <span class="o">=</span> <span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="na">grid</span> <span class="o">&amp;</span> <span class="o">~</span><span class="n">getMask</span><span class="o">(</span><span class="n">position</span><span class="o">))</span> <span class="o">|</span> <span class="o">(</span><span class="n">value</span> <span class="o">&lt;&lt;</span> <span class="n">position</span><span class="o">);</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Tic-tac-toe AI Part 1: Introduction]]></title>
    <link href="http://www.codinghell.ch/blog/2012/08/27/tictactoe-ai-part-1-introduction/"/>
    <updated>2012-08-27T10:52:00-07:00</updated>
    <id>http://www.codinghell.ch/blog/2012/08/27/tictactoe-ai-part-1-introduction</id>
    <content type="html"><![CDATA[<p>One of the things that always interested me is <strong>Artificial Intelligence</strong>. I never had a chance to learn anything about it, but now the time has come. I recently bought the book <a href="http://aima.cs.berkeley.edu/">Artificial Intelligence: A Modern Approach</a> which I&#8217;ll start reading during my flight to the USA.</p>

<p>In this blog series, I&#8217;d like to document the development of a simple tic-tac-toe program. Once finished, I&#8217;ll release the source code on GitHub.</p>

<p>The program will support three different players:</p>

<p><strong>Human Player</strong>: This one is obvious ;)</p>

<p><strong>Simulating AI</strong>: A AI simulating all possible moves to find the ones guaranteeing either a win or a tie.</p>

<p><strong>Learning AI</strong>: This one is the most interesting one: The only thing it knows is that it plays a turn based game and it can place X&#8217;s (or O&#8217;s) on a 3x3 grid. It doesn&#8217;t know the rules and it doesn&#8217;t know any strategies. Instead it will try to win by analyze it&#8217;s moves when the game finished.</p>

<p>I&#8217;ll use Java (7) as programming language but the principles are useable in any other language as well.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Extended usage of HumanReadableFileSize.js]]></title>
    <link href="http://www.codinghell.ch/blog/2012/08/21/extended-usage-of-humanreadablefilesize-dot-js/"/>
    <updated>2012-08-21T16:08:00-07:00</updated>
    <id>http://www.codinghell.ch/blog/2012/08/21/extended-usage-of-humanreadablefilesize-dot-js</id>
    <content type="html"><![CDATA[<p>I just extended my jQuery plugin <a href="https://github.com/pencil/HumanReadableFileSize.js">HumanReadableFileSize.js</a> to support replacing the (numerical) contents of elements with a human-readable file size. Here is an example of how it works:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;filesize&quot;</span><span class="nt">&gt;</span>54788455578<span class="nt">&lt;/span&gt;</span> <span class="c">&lt;!-- 51.03 GiB --&gt;</span>
</span><span class='line'><span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;filesize&quot;</span><span class="nt">&gt;</span>2322<span class="nt">&lt;/span&gt;</span> <span class="c">&lt;!-- 2.27 KiB --&gt;</span>
</span><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.filesize&#39;</span><span class="p">).</span><span class="nx">fileSize</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Hope it&#8217;s of some use to you.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Deploy Octopress to Amazon S3]]></title>
    <link href="http://www.codinghell.ch/blog/2012/08/19/deploy-octopress-to-amazon-s3/"/>
    <updated>2012-08-19T00:02:00-07:00</updated>
    <id>http://www.codinghell.ch/blog/2012/08/19/deploy-octopress-to-amazon-s3</id>
    <content type="html"><![CDATA[<p>As I mentioned in my <a href="http://www.codinghell.ch/blog/2012/08/18/welcome/">first blog post</a>, I currently use Amazon S3 to host this blog. In this blog post, I&#8217;d like to explain my setup and the deployment process.</p>

<!--more-->


<h1>Setup</h1>

<p>First you have to <a href="http://aws.amazon.com/s3/">sign up for an Amazon AWS account</a>. Then you create a bucket using the <a href="https://console.aws.amazon.com/s3/home">S3 Management Console</a>. The name of the bucket should be the domain you&#8217;d like to use later (in this example it&#8217;s www.codinghell.ch).</p>

<p>By default, stuff stored in Amazon&#8217;s S3 cloud is only accessible to you. To change that, select the bucket and click on &#8220;Properties&#8221;. Next, click on &#8220;Add bucket policy&#8221; and add this code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='json'><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="nt">&quot;Version&quot;</span><span class="p">:</span> <span class="s2">&quot;2008-10-17&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nt">&quot;Statement&quot;</span><span class="p">:</span> <span class="p">[</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="nt">&quot;Sid&quot;</span><span class="p">:</span> <span class="s2">&quot;PublicReadForGetBucketObjects&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="nt">&quot;Effect&quot;</span><span class="p">:</span> <span class="s2">&quot;Allow&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="nt">&quot;Principal&quot;</span><span class="p">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="nt">&quot;AWS&quot;</span><span class="p">:</span> <span class="s2">&quot;*&quot;</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nt">&quot;Action&quot;</span><span class="p">:</span> <span class="s2">&quot;s3:GetObject&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="nt">&quot;Resource&quot;</span><span class="p">:</span> <span class="s2">&quot;arn:aws:s3:::www.codinghell.ch/*&quot;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">]</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Also in the properties pane, click on &#8220;Website&#8221; and enable the checkbox. Use <code>index.html</code> as &#8220;Index Document&#8221;. The domain part of the endpoint URL is what you should point your actual domain to (CNAME).</p>

<h1>Deployment</h1>

<p>To deploy the blog, we will use s3cmd. It&#8217;s available (or at least installable) in most Linux distributions and via Homebrew for OS X users.
After you installed s3cmd, you have to configure it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>s3cmd --configure      <span class="c"># start the interactive configuration</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now every time you want to update the content stored on S3, you do the following:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rake generate
</span><span class='line'>s3cmd sync --no-preserve --delete-removed --recursive public/ s3://www.codinghell.ch
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Welcome!]]></title>
    <link href="http://www.codinghell.ch/blog/2012/08/18/welcome/"/>
    <updated>2012-08-18T17:45:00-07:00</updated>
    <id>http://www.codinghell.ch/blog/2012/08/18/welcome</id>
    <content type="html"><![CDATA[<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'> <span class="nb">print</span> <span class="s1">&#39;Hello world!&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>I finally managed to start my own blog. I will add random bits about ruby, software development in general, geek stuff but also personal thoughts. You can learn more about me and this blog in the <a href="http://www.codinghell.ch/about">about</a> section of this website.</p>

<p>The blog is powered by Octopress, it&#8217;s using the darkstripes theme for the moment and it&#8217;s currently hosted at Amazon S3. I will try to build my own theme and setup a personal server when the time comes.</p>
]]></content>
  </entry>
  
</feed>
