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

  <title><![CDATA[Geek Quickies]]></title>
  <link href="http://mrtn.me/atom.xml" rel="self"/>
  <link href="http://mrtn.me/"/>
  <updated>2012-11-15T18:16:46+01:00</updated>
  <id>http://mrtn.me/</id>
  <author>
    <name><![CDATA[Antoine Martin]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Mirror a Git repository through SSH]]></title>
    <link href="http://mrtn.me/blog/2012/11/15/mirror-a-git-repository-through-ssh/"/>
    <updated>2012-11-15T17:45:00+01:00</updated>
    <id>http://mrtn.me/blog/2012/11/15/mirror-a-git-repository-through-ssh</id>
    <content type="html"><![CDATA[<p>Redmine can show the timeline of a Git repository but this repository needs to
be local (see <a href="http://www.redmine.org/boards/2/topics/3487">here</a>). When you
host your repository externally (on GitHub, for instance), you need to
synchronize your remote repository on your Redmine server.</p>

<p>The following shell script is an <em>All in one</em> command that can be easily put in
the crontab to mirror the repository on your Redmine server :</p>

<!-- More -->




<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>
<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>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="c">#!/bin/sh</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="o">[</span> <span class="s2">&quot;run&quot;</span> !<span class="o">=</span> <span class="s2">&quot;$1&quot;</span> <span class="o">]</span>; <span class="k">then</span>
</span><span class='line'><span class="k">  </span><span class="nb">exec </span>ssh -i <span class="s2">&quot;$GIT_KEY&quot;</span> -o <span class="s2">&quot;StrictHostKeyChecking no&quot;</span> <span class="s2">&quot;$@&quot;</span>
</span><span class='line'><span class="k">fi</span>
</span><span class='line'>
</span><span class='line'><span class="nv">remote</span><span class="o">=</span><span class="nv">$2</span>
</span><span class='line'><span class="nb">local</span><span class="o">=</span><span class="nv">$3</span>
</span><span class='line'>
</span><span class='line'><span class="nb">echo</span> <span class="s2">&quot;Mirroring from $remote to $local&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="nv">name</span><span class="o">=</span><span class="k">$(</span>basename <span class="s2">&quot;$local&quot;</span><span class="k">)</span>
</span><span class='line'>
</span><span class='line'><span class="nb">export </span><span class="nv">GIT_KEY</span><span class="o">=</span><span class="s2">&quot;`mktemp /tmp/git.XXXXXX`&quot;</span>
</span><span class='line'><span class="nb">export </span><span class="nv">GIT_SSH</span><span class="o">=</span><span class="s2">&quot;$0&quot;</span>
</span><span class='line'>
</span><span class='line'>cat &gt;<span class="s2">&quot;$GIT_KEY&quot;</span> <span class="s">&lt;&lt;EOF</span>
</span><span class='line'><span class="s">-----BEGIN DSA PRIVATE KEY-----</span>
</span><span class='line'><span class="s">### Put here your private key ###</span>
</span><span class='line'><span class="s">-----END DSA PRIVATE KEY-----</span>
</span><span class='line'><span class="s">EOF</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="o">[</span> -d <span class="s2">&quot;$local&quot;</span> <span class="o">]</span>; <span class="k">then</span>
</span><span class='line'><span class="k">        </span>git <span class="s2">&quot;--git-dir=$local&quot;</span> remote update
</span><span class='line'><span class="k">else</span>
</span><span class='line'><span class="k">        </span>git clone --mirror <span class="s2">&quot;$remote&quot;</span> <span class="s2">&quot;$local&quot;</span>
</span><span class='line'><span class="k">fi</span>
</span><span class='line'>
</span><span class='line'>rm -f <span class="s2">&quot;$GIT_KEY&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="nb">exit </span>0
</span></code></pre></td></tr></table></div></figure>


<p>You need to copy the private key in the script (line 20). You can then use the
script with the following syntax</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='sh'><span class='line'>git-import.sh run &lt;remote_repository&gt;  &lt;local_repository&gt;
</span></code></pre></td></tr></table></div></figure>


<p>Notice the use of the <strong>run</strong> argument to distinguish between executions of the
script as a user and as the <code>ssh</code> command to be used by Git.</p>

<p>Here is an example:</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='sh'><span class='line'><span class="o">[</span>antoine@dev ~<span class="o">]</span><span class="nv">$ </span>./git-import.sh run git@github.com:antoinemartin/django-windows-tools.git django-windows-tools.git
</span><span class='line'>Mirroring from git@github.com:antoinemartin/django-windows-tools.git to django-windows-tools.git
</span><span class='line'>Cloning into bare repository <span class="s1">&#39;django-windows-tools.git&#39;</span>...
</span><span class='line'>remote: Counting objects: 112, <span class="k">done</span>.
</span><span class='line'>remote: Compressing objects: 100% <span class="o">(</span>88/88<span class="o">)</span>, <span class="k">done</span>.
</span><span class='line'>remote: Total 112 <span class="o">(</span>delta 46<span class="o">)</span>, reused 78 <span class="o">(</span>delta 14<span class="o">)</span>
</span><span class='line'>Receiving objects: 100% <span class="o">(</span>112/112<span class="o">)</span>, 41.04 KiB, <span class="k">done</span>.
</span><span class='line'>Resolving deltas: 100% <span class="o">(</span>46/46<span class="o">)</span>, <span class="k">done</span>.
</span><span class='line'><span class="o">[</span>antoine@dev ~<span class="o">]</span><span class="nv">$ </span>
</span></code></pre></td></tr></table></div></figure>


<p>The first time you run the script, it
creates the Git mirror. The following runs only syncs the mirror:</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='sh'><span class='line'><span class="o">[</span>antoine@dev ~<span class="o">]</span><span class="nv">$ </span>./git-import.sh run git@github.com:antoinemartin/django-windows-tools.git django-windows-tools.git
</span><span class='line'>Mirroring from git@github.com:antoinemartin/django-windows-tools.git to django-windows-tools.git
</span><span class='line'>Fetching origin
</span><span class='line'><span class="o">[</span>antoine@dev ~<span class="o">]</span><span class="nv">$ </span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Checking Google Play Signatures on .Net]]></title>
    <link href="http://mrtn.me/blog/2012/11/15/checking-google-play-signatures-on-net/"/>
    <updated>2012-11-15T11:50:00+01:00</updated>
    <id>http://mrtn.me/blog/2012/11/15/checking-google-play-signatures-on-net</id>
    <content type="html"><![CDATA[<p>With <a href="http://developer.android.com/guide/google/play/billing/billing_integrate.html">In-App Billing</a>
on Android, each time a purchase occurs, your application receives a JSON
payload containing information about the purchase, as well as its signature with
your developer certificate.</p>

<p>Google encourages you to verify that the signature is valid to authentify the
purchase. You can do that inside the application, but if the delivery of the
purchase involves a server, it is better to do it on the server to prevent
client code manipulation. The following show how to do it on .Net server
application.</p>

<!-- More -->


<p>The JSON payload looks like 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>
<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='js'><span class='line'><span class="p">{</span> <span class="s2">&quot;nonce&quot;</span> <span class="o">:</span> <span class="mi">1836535032137741465</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;orders&quot;</span> <span class="o">:</span>
</span><span class='line'>    <span class="p">[{</span> <span class="s2">&quot;notificationId&quot;</span> <span class="o">:</span> <span class="s2">&quot;android.test.purchased&quot;</span><span class="p">,</span>
</span><span class='line'>       <span class="s2">&quot;orderId&quot;</span> <span class="o">:</span> <span class="s2">&quot;transactionId.android.test.purchased&quot;</span><span class="p">,</span>
</span><span class='line'>       <span class="s2">&quot;packageName&quot;</span> <span class="o">:</span> <span class="s2">&quot;com.example.dungeons&quot;</span><span class="p">,</span>
</span><span class='line'>       <span class="s2">&quot;productId&quot;</span> <span class="o">:</span> <span class="s2">&quot;android.test.purchased&quot;</span><span class="p">,</span>
</span><span class='line'>       <span class="s2">&quot;developerPayload&quot;</span> <span class="o">:</span> <span class="s2">&quot;bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ&quot;</span><span class="p">,</span>
</span><span class='line'>       <span class="s2">&quot;purchaseTime&quot;</span> <span class="o">:</span> <span class="mi">1290114783411</span><span class="p">,</span>
</span><span class='line'>       <span class="s2">&quot;purchaseState&quot;</span> <span class="o">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span class='line'>       <span class="s2">&quot;purchaseToken&quot;</span> <span class="o">:</span> <span class="s2">&quot;rojeslcdyyiapnqcynkjyyjh&quot;</span> <span class="p">}]</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>You receive it with a broadcast <code>com.android.vending.billing.PURCHASE_STATE_CHANGED</code>
in the <code>inapp_signed_data</code> extra intent field. The signature comes as a base 64
encoded string in the <code>inapp_signature</code> intent field and looks 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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">YlNBaqlKSS</span><span class="o">+</span><span class="nx">zk</span><span class="o">/</span><span class="nx">fteJuHbvI3</span><span class="o">/</span><span class="nx">N</span><span class="o">+</span><span class="nx">hbiLiolYsMl8gCD13</span><span class="o">+</span><span class="nx">Ii</span><span class="o">+</span><span class="mi">1</span><span class="nx">m4GSd68rc2TwbSLYsYrHVL</span><span class="o">/</span><span class="mi">9</span><span class="nx">xg</span><span class="o">/</span><span class="mi">0</span><span class="nx">CBf</span>
</span><span class='line'><span class="nx">CN6NKLtqjFqRs034ExCW2qaMddwfRiqsGZ3z7ZvWuMyNntE3pTGTxG2X</span><span class="o">/</span><span class="mi">71</span><span class="o">/</span><span class="nx">cpGwQoSFQBceVR9t5Sge</span>
</span><span class='line'><span class="nx">Tw5HJimt5xlIhHqgRxS</span><span class="o">/</span><span class="nx">W</span><span class="o">/</span><span class="nx">kfrJIyKt03l2hUJDGOX9eig5S4ex6fgyFZxR73</span><span class="o">/</span><span class="nx">HxOFGJ9ohApwaBNF7rD</span>
</span><span class='line'><span class="nx">LaMZFnYbLsYgBWMOHW1uE</span><span class="o">+</span><span class="nx">F5b2JZWvyColpe5SKMWaNVWVWZGte1WBOYRFxbriZR1VwClkEg9Y4mVn5k</span>
</span><span class='line'><span class="nx">SZIje5pSueLKwiForU02jA</span><span class="o">==</span>
</span></code></pre></td></tr></table></div></figure>


<p>It is the signature of the <code>SHA1</code> digest of the JSON payload with the private
key of your developer certificate. Don&#8217;t look for this private key, it is
detained by Google. Google only provides you the corresponding public key in the
profile page of your developer account :</p>

<p><img src="http://developer.android.com/images/billing_public_key.png"></p>

<p>This public key is the base 64 string of the <a href="http://tools.ietf.org/html/rfc3280#section-4.1.2.7">Subject Public Key Info</a> of
your certificate encoded in the <a href="http://en.wikipedia.org/wiki/Distinguished_Encoding_Rules#DER_encoding">DER format</a>.
It corresponds to the following part of your certificate:</p>

<pre>
Certificate:
...
       Subject Public Key Info:
           Public Key Algorithm: rsaEncryption
           RSA Public Key: (1024 bit)
               Modulus (1024 bit):
                   00:b4:31:98:0a:c4:bc:62:c1:88:aa:dc:b0:c8:bb:
                   33:35:19:d5:0c:64:b9:3d:41:b2:96:fc:f3:31:e1:
                   66:36:d0:8e:56:12:44:ba:75:eb:e8:1c:9c:5b:66:
                   70:33:52:14:c9:ec:4f:91:51:70:39:de:53:85:17:
                   16:94:6e:ee:f4:d5:6f:d5:ca:b3:47:5e:1b:0c:7b:
                   c5:cc:2b:6b:c1:90:c3:16:31:0d:bf:7a:c7:47:77:
                   8f:a0:21:c7:4c:d0:16:65:00:c1:0f:d7:b8:80:e3:
                   d2:75:6b:c1:ea:9e:5c:5c:ea:7d:c1:a1:10:bc:b8:
                   e8:35:1c:9e:27:52:7e:41:8f
               Exponent: 65537 (0x10001)
...
</pre>


<p>The public key in this format cannot be read directly by the
<code>RSACryptoServiceProvider</code> class of the .Net <code>System.Security.Cryptography</code>
module. The preferred import format for this class is XML. The
<a href="http://www.bouncycastle.org/">Bouncy Castle Library</a> allows reading this kind
of encoding, but you don&#8217;t really need to add a new dependency to your project.
Instead, what you need is simply to convert your public key in XML. Once this is
done, you can use the following simple .Net code to check the signature:</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>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="nf">verify</span><span class="p">(</span><span class="n">String</span> <span class="n">message</span><span class="p">,</span> <span class="n">String</span> <span class="n">base64Signature</span><span class="p">,</span> <span class="n">String</span> <span class="n">publicKey</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="c1">// By default the result is false</span>
</span><span class='line'>        <span class="kt">bool</span> <span class="n">result</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span>
</span><span class='line'>        <span class="k">try</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="c1">// Create the provider and load the KEY</span>
</span><span class='line'>            <span class="n">RSACryptoServiceProvider</span> <span class="n">provider</span> <span class="p">=</span> <span class="k">new</span> <span class="n">RSACryptoServiceProvider</span><span class="p">();</span>
</span><span class='line'>            <span class="n">provider</span><span class="p">.</span><span class="n">FromXmlString</span><span class="p">(</span><span class="n">publicKey</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// The signature is supposed to be encoded in base64 and the SHA1 checksum</span>
</span><span class='line'>            <span class="c1">// Of the message is computed against the UTF-8 representation of the </span>
</span><span class='line'>            <span class="c1">// message</span>
</span><span class='line'>            <span class="kt">byte</span><span class="p">[]</span> <span class="n">signature</span> <span class="p">=</span> <span class="n">Convert</span><span class="p">.</span><span class="n">FromBase64String</span><span class="p">(</span><span class="n">base64Signature</span><span class="p">);</span>
</span><span class='line'>            <span class="n">SHA1Managed</span> <span class="n">sha</span> <span class="p">=</span> <span class="k">new</span> <span class="n">SHA1Managed</span><span class="p">();</span>
</span><span class='line'>            <span class="kt">byte</span><span class="p">[]</span> <span class="n">data</span> <span class="p">=</span> <span class="n">Encoding</span><span class="p">.</span><span class="n">UTF8</span><span class="p">.</span><span class="n">GetBytes</span><span class="p">(</span><span class="n">message</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">result</span> <span class="p">=</span> <span class="n">provider</span><span class="p">.</span><span class="n">VerifyData</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">sha</span><span class="p">,</span> <span class="n">signature</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="cm">/* e */</span><span class="p">)</span> <span class="p">{</span> <span class="cm">/* TODO: add some kind of logging here */</span><span class="p">}</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>For converting your key, you can download the <a href="http://mrtn.me/downloads/code/PEMKeyLoader.cs">PEMKeyLoader class</a>
and use it in a Console Project to convert your key to XML with the follwing 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>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="n">RSACryptoServiceProvider</span> <span class="n">provider</span> <span class="p">=</span> <span class="n">PEMKeyLoader</span><span class="p">.</span><span class="n">CryptoServiceProviderFromPublicKeyInfo</span><span class="p">(</span><span class="n">MY_BASE64_PUBLIC_KEY</span><span class="p">);</span>
</span><span class='line'><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="n">provider</span><span class="p">.</span><span class="n">ToXmlString</span><span class="p">(</span><span class="k">false</span><span class="p">));</span>
</span><span class='line'><span class="p">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>You will obtain your XML formatted key :</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='csharp'><span class='line'><span class="p">&lt;</span><span class="n">RSAKeyValue</span><span class="p">&gt;&lt;</span><span class="n">Modulus</span><span class="p">&gt;</span><span class="n">u5xfVod</span><span class="p">+</span><span class="m">5</span><span class="n">uEP7Zu</span><span class="p">/</span><span class="n">xN3v4yhAO3tSsezDJUBajr92u</span><span class="p">+</span><span class="n">wUXZNH2IKt</span><span class="p">/</span><span class="m">9</span><span class="p">/</span><span class="n">V</span><span class="p">/</span><span class="n">HjMyzW5AC0PZpi6ROTWvQoO5Xa2L8</span><span class="p">+</span><span class="n">lKLiVtVcaI60O</span><span class="p">+</span><span class="n">M6B1Rn1zCYD</span><span class="c1">//TgYwfqofKPvbv/Vshl+LwdkqBcp1as4t6+2f0sGHwH/hT1D+E94m0zf4qOR5O5o3ILXaC1z8pAoV4cM6YttFRDh9lxPj/9hkQR4l809bbxOdJPo41F69rqdyU4xFjncxCOHcFdnkT7LQUVv1v2GYae3Rl4iZVncbEygg4K/+uG21QyC0xRda9L2KmQyV7Mtcb5YTJzyfaI/Z/EEZ0A2pkX+4Ki1MKCaUAPLw==&lt;/Modulus&gt;&lt;Exponent&gt;AQAC&lt;/Exponent&gt;&lt;/RSAKeyValue&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>That you can use then in your project as a string constant.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Avoid Thread Issues while Testing an Android Service]]></title>
    <link href="http://mrtn.me/blog/2012/11/08/avoid-thread-issues-while-testing-an-android-service/"/>
    <updated>2012-11-08T12:12:00+01:00</updated>
    <id>http://mrtn.me/blog/2012/11/08/avoid-thread-issues-while-testing-an-android-service</id>
    <content type="html"><![CDATA[<p>The <a href="http://developer.android.com/tools/testing/testing_android.html">Android Test Framework</a>
provides many tools to test parts of an Android application, and the
<a href="http://developer.android.com/reference/android/test/ServiceTestCase.html">ServiceTestCase</a>
in particular to test your <a href="http://developer.android.com/reference/android/app/Service.html">Service</a>
classes.</p>

<p>This class is quite useful but you may find yourself scratching your head
because your test does not work like it should. This happens in particular if
you&#8217;re doing some background work in your service, relying for example on
<a href="http://developer.android.com/reference/android/os/AsyncTask.html">AsyncTask</a>
for it.</p>

<p>Read on if you want to understand why it doesn&#8217;t work and find a solution for it.</p>

<!-- More -->


<p>In an Android application, any service is instantiated and operates on the main
thread. But this is not the case in the test framework provided by the
<code>ServiceTestCase</code> class. Your Service is instantiated in the same thread the
test runs.</p>

<p>While your tests are running, there is no <a href="http://developer.android.com/reference/android/os/Looper.html">Looper</a>
waiting for messages on the service thread. In consequence, anything that relies
on it and on the <a href="http://developer.android.com/reference/android/os/Handler.html">Handler</a>
class to communicate back to the main thread will not work.</p>

<p>For instance, <code>AsyncTask</code> uses a handler to ensure that the <code>onPostExecute</code>
method is called on the main thread. After <code>doInBackground</code> has been called,
it posts a message on this handler, but as the <code>Looper</code> on the service is not
running to handle the message, the <code>onPostExecute</code> method will never be
called.</p>

<p>To circumvent this behaviour, the service must be run on a separate thread with
a <code>Looper</code> running.</p>

<h2>Simulating <em>main thread</em> behaviour</h2>

<p>The <code>ThreadServiceTestCase&lt;T extends Service&gt;</code> (<a href="http://mrtn.me/downloads/code/ThreadServiceTestCase.java">source here</a>)
class that we describe here provides such features. It declares a <code>Looper</code> and a
<code>Hanlder</code> to be able to run code on 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>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'>  <span class="kd">protected</span> <span class="n">Handler</span> <span class="n">serviceHandler</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">protected</span> <span class="n">Looper</span> <span class="n">serviceLooper</span><span class="o">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the setup of the test, we instantiate the service thread, start it, and link
our handler with its looper:</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="nd">@Override</span>
</span><span class='line'><span class="kd">protected</span> <span class="kt">void</span> <span class="nf">setUp</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
</span><span class='line'>  <span class="kd">super</span><span class="o">.</span><span class="na">setUp</span><span class="o">();</span>
</span><span class='line'>  <span class="c1">// Setup service thread</span>
</span><span class='line'>  <span class="n">HandlerThread</span> <span class="n">serviceThread</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HandlerThread</span><span class="o">(</span><span class="s">&quot;[&quot;</span> <span class="o">+</span> <span class="n">serviceClass</span><span class="o">.</span><span class="na">getSimpleName</span><span class="o">()</span> <span class="o">+</span> <span class="s">&quot;Thread]&quot;</span><span class="o">);</span>
</span><span class='line'>  <span class="n">serviceThread</span><span class="o">.</span><span class="na">start</span><span class="o">();</span>
</span><span class='line'>  <span class="n">serviceLooper</span> <span class="o">=</span> <span class="n">serviceThread</span><span class="o">.</span><span class="na">getLooper</span><span class="o">();</span>
</span><span class='line'>  <span class="n">serviceHandler</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Handler</span><span class="o">(</span><span class="n">serviceLooper</span><span class="o">);</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The corresponding <code>tearDown</code> method shuts down the tread.</p>

<p>We provide a <code>runOnServiceThread</code> method to be able to run code on the service
thread:</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>
</pre></td><td class='code'><pre><code class='java'><span class='line'> <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">runOnServiceThread</span><span class="o">(</span><span class="kd">final</span> <span class="n">Runnable</span> <span class="n">r</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="kd">final</span> <span class="n">CountDownLatch</span> <span class="n">serviceSignal</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CountDownLatch</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span>
</span><span class='line'>      <span class="n">serviceHandler</span><span class="o">.</span><span class="na">post</span><span class="o">(</span><span class="k">new</span> <span class="n">Runnable</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>          <span class="nd">@Override</span>
</span><span class='line'>          <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>              <span class="n">r</span><span class="o">.</span><span class="na">run</span><span class="o">();</span>
</span><span class='line'>              <span class="n">serviceSignal</span><span class="o">.</span><span class="na">countDown</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><span class='line'>      <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">serviceSignal</span><span class="o">.</span><span class="na">await</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">InterruptedException</span> <span class="n">ie</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">fail</span><span class="o">(</span><span class="s">&quot;The Service thread has been interrupted&quot;</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>Then, the <code>startService</code> methods starts the service in its own thread:</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>
<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>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">static</span> <span class="kd">class</span> <span class="nc">Holder</span><span class="o">&lt;</span><span class="n">H</span><span class="o">&gt;</span> <span class="o">{</span>
</span><span class='line'>  <span class="n">H</span> <span class="n">value</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">protected</span> <span class="n">T</span> <span class="nf">startService</span><span class="o">(</span><span class="kd">final</span> <span class="kt">boolean</span> <span class="n">bound</span><span class="o">,</span> <span class="kd">final</span> <span class="n">ServiceRunnable</span> <span class="n">r</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>  <span class="kd">final</span> <span class="n">Holder</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">serviceHolder</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Holder</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;();</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// I want to create my service in its own &#39;Main thread&#39;</span>
</span><span class='line'>  <span class="c1">// So it can use its handler</span>
</span><span class='line'>  <span class="n">runOnServiceThread</span><span class="o">(</span><span class="k">new</span> <span class="n">Runnable</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="nd">@Override</span>
</span><span class='line'>      <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">T</span> <span class="n">service</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>          <span class="k">if</span> <span class="o">(</span><span class="n">bound</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>              <span class="cm">/* IBinder binder = */</span><span class="n">bindService</span><span class="o">(</span><span class="k">new</span> <span class="n">Intent</span><span class="o">(</span><span class="n">getContext</span><span class="o">(),</span> <span class="n">serviceClass</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">startService</span><span class="o">(</span><span class="k">new</span> <span class="n">Intent</span><span class="o">(</span><span class="n">getContext</span><span class="o">(),</span> <span class="n">serviceClass</span><span class="o">));</span>
</span><span class='line'>          <span class="o">}</span>
</span><span class='line'>          <span class="n">service</span> <span class="o">=</span> <span class="n">getService</span><span class="o">();</span>
</span><span class='line'>          <span class="k">if</span> <span class="o">(</span><span class="n">r</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span>
</span><span class='line'>              <span class="n">r</span><span class="o">.</span><span class="na">run</span><span class="o">(</span><span class="n">service</span><span class="o">);</span>
</span><span class='line'>          <span class="n">serviceHolder</span><span class="o">.</span><span class="na">value</span> <span class="o">=</span> <span class="n">service</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><span class='line'>  <span class="k">return</span> <span class="n">serviceHolder</span><span class="o">.</span><span class="na">value</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The <code>bound</code> parameters tells wether to start the service with a binding or with
an <code>Intent</code>.. The optional <code>ServiceRunnable</code> parameter can be provided to add
some initialization code.</p>

<p>A test class using this code looks like 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>
<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">public</span> <span class="kd">class</span> <span class="nc">MyServiceTest</span> <span class="kd">extends</span> <span class="n">ThreadServiceTestCase</span><span class="o">&lt;</span><span class="n">MyService</span><span class="o">&gt;</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">public</span> <span class="nf">MyServiceTest</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="kd">super</span><span class="o">(</span><span class="n">MyService</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testSomething</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// starts the service</span>
</span><span class='line'>      <span class="n">MyService</span> <span class="n">service</span> <span class="o">=</span> <span class="n">startService</span><span class="o">(</span><span class="kc">true</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span>
</span><span class='line'>      <span class="o">...</span>
</span><span class='line'>      <span class="c1">// Do something on the service</span>
</span><span class='line'>      <span class="n">runOnServiceThread</span><span class="o">(</span> <span class="k">new</span> <span class="n">ServiceRunnable</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>          <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">(</span><span class="n">Service</span> <span class="n">service</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="o">}</span>
</span><span class='line'>      <span class="o">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>With it, the service is started in its own thread and the <code>Looper</code> and <code>Handler</code>
mechanism will work.</p>

<h2>Waiting for listeners to be notified</h2>

<p>A service that performs tasks asynchronously also notifies the outcome of the
background tasks asynchronously. There are several techniques for doing that,
but the most common are :</p>

<ul>
<li>Broadcast an intent, or</li>
<li>Call a callback method on listeners.</li>
</ul>


<p>This usually happens in the main thread. In our case, it would happen in the
service thread. As the test is executing itself in its own thread, some
synchronization mechanism is needed between the service thread and the test
thread to be able to handle the outcome of the background task in the test.</p>

<p>The <code>ThreadServiceTestCase</code> class provides an helper class for that:</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>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">ServiceSyncHelper</span> <span class="o">{</span>
</span><span class='line'>  <span class="c1">// The semaphore will wakeup clients</span>
</span><span class='line'>  <span class="kd">protected</span> <span class="kd">final</span> <span class="n">Semaphore</span> <span class="n">semaphore</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Semaphore</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
</span><span class='line'>  
</span><span class='line'>  <span class="cm">/**</span>
</span><span class='line'><span class="cm">  * Waits for some response coming from the service.</span>
</span><span class='line'><span class="cm">  * </span>
</span><span class='line'><span class="cm">  * @param timeout</span>
</span><span class='line'><span class="cm">  *            The maximum time to wait.</span>
</span><span class='line'><span class="cm">  * @throws InterruptedException</span>
</span><span class='line'><span class="cm">  *             if the Thread is interrupted or reaches the timeout.</span>
</span><span class='line'><span class="cm">  */</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">synchronized</span> <span class="kt">void</span> <span class="nf">waitListener</span><span class="o">(</span><span class="kt">long</span> <span class="n">timeout</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">InterruptedException</span> <span class="o">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="o">(!</span><span class="n">semaphore</span><span class="o">.</span><span class="na">tryAcquire</span><span class="o">(</span><span class="n">timeout</span><span class="o">,</span> <span class="n">TimeUnit</span><span class="o">.</span><span class="na">MILLISECONDS</span><span class="o">))</span>
</span><span class='line'>          <span class="k">throw</span> <span class="k">new</span> <span class="nf">InterruptedException</span><span class="o">();</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>It contains a semaphore that can be used to synchronize the service thread with
the test thread.</p>

<p>In the case of the callback listener, we can then define an utility class like
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>
<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">static</span> <span class="kd">class</span> <span class="nc">SynchronizedListener</span> <span class="kd">extends</span> <span class="n">ServiceSyncHelper</span> <span class="o">{</span>
</span><span class='line'>  <span class="n">Object</span> <span class="n">result</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/**</span>
</span><span class='line'><span class="cm">  * Service listener that registers the value returned by the service in</span>
</span><span class='line'><span class="cm">  * the holder and release the semaphore.</span>
</span><span class='line'><span class="cm">  */</span>
</span><span class='line'>  <span class="kd">final</span> <span class="n">MyService</span><span class="o">.</span><span class="na">Listener</span> <span class="n">listener</span> <span class="o">=</span> <span class="k">new</span> <span class="n">MyService</span><span class="o">.</span><span class="na">Listener</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="kd">public</span> <span class="kt">void</span> <span class="nf">onTaskPerformed</span><span class="o">(</span><span class="n">MyService</span> <span class="n">service</span><span class="o">,</span> <span class="n">Object</span> <span class="n">returnValue</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">result</span> <span class="o">=</span> <span class="n">returnValue</span><span class="o">;</span>
</span><span class='line'>          <span class="n">semaphore</span><span class="o">.</span><span class="na">release</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><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>When notified by the service in the service thread, the contained listener
releases the semaphore and awakes the test that is waiting on the semaphore.</p>

<p>The listener contained in the helper class also needs to be added to the service
being tested at service initialization. A test using this feature then becomes :</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>
<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>
</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">testSomething</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Catch listener callback in the test</span>
</span><span class='line'>    <span class="kd">final</span> <span class="n">SynchronizedListener</span> <span class="n">listener</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SynchronizedListener</span><span class="o">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// starts the service</span>
</span><span class='line'>    <span class="cm">/* MyService service = */</span> <span class="n">startService</span><span class="o">(</span><span class="kc">true</span><span class="o">,</span> <span class="k">new</span> <span class="n">ServiceRunnable</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="nd">@Override</span>
</span><span class='line'>        <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">(</span><span class="n">Service</span> <span class="n">service</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="c1">// add our listener to the service</span>
</span><span class='line'>            <span class="n">service</span><span class="o">.</span><span class="na">addListener</span><span class="o">(</span><span class="n">listener</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><span class='line'>    <span class="c1">// wait for the service to notify us</span>
</span><span class='line'>    <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>        <span class="c1">// Wait for the service to perform its background task</span>
</span><span class='line'>        <span class="n">listener</span><span class="o">.</span><span class="na">waitListener</span><span class="o">(</span><span class="n">WAIT_TIME</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">InterruptedException</span> <span class="n">ie</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">fail</span><span class="o">(</span><span class="s">&quot;The listener never got signaled&quot;</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">assertEquals</span><span class="o">(</span><span class="n">expected_value</span><span class="o">,</span> <span class="n">listener</span><span class="o">.</span><span class="na">result</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>You can grab The <code>ThreadServiceTestCase&lt;T extends Service&gt;</code> source code <a href="http://mrtn.me/downloads/code/ThreadServiceTestCase.java">here</a>.
Hope it will help.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Unlock and root a Nexus device]]></title>
    <link href="http://mrtn.me/blog/2012/10/25/unlock-and-root-a-nexus-device/"/>
    <updated>2012-10-25T07:51:00+02:00</updated>
    <id>http://mrtn.me/blog/2012/10/25/unlock-and-root-a-nexus-device</id>
    <content type="html"><![CDATA[<p>Having an unlocked and rooted device provides several advantages :</p>

<ul>
<li>Easy backup and restore with Nandroid backup,</li>
<li>Easy firmware replacement and updates installation,</li>
<li>Advanced debugging capabilities.</li>
</ul>


<p>The following instructions allow unlocking and rooting a Nexus device (Galaxy
Nexus, Nexus 7) from the command line on a Linux machine. It involves:</p>

<ul>
<li>Backuping your device,</li>
<li>Unlocking the bootloader,</li>
<li>Restoring the backup,</li>
<li>Rooting the device.</li>
</ul>


<!-- More -->


<h3>Prerequisites</h3>

<p>Here is the list of prerequisites :</p>

<ul>
<li><a href="http://developer.android.com/sdk/index.html">Android SDK</a>, to have access to <code>adb</code> and <code>fastboot</code>.</li>
<li><a href="http://download2.clockworkmod.com/recoveries/recovery-clockwork-6.0.1.0-grouper.img">Clockwork Mode (CWM) </a> recovery image.</li>
<li><a href="http://download.chainfire.eu/212/SuperSU/CWM-SuperSU-v0.96.zip">SuperSU</a> installable zip.</li>
</ul>


<p>The <code>platform-tools</code> directory of the Android SDK must be on your <code>PATH</code>, and
the device must have USB debugging enabled.</p>

<h3>Udev rules</h3>

<p>On Linux, you don&#8217;t have to install any driver. You need however to enable
access for your users. Depending on your distribution, you may have a package
handling that, but if not, here is a quick way to give access to your user to
the device (here <code>antoine</code>). Type as <code>root</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>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="o">[</span>root@dev ~<span class="o">]</span> <span class="nv">$ </span><span class="nb">cd</span> /etc/udev/rules.d
</span><span class='line'><span class="o">[</span>root@dev rules.d<span class="o">]</span> <span class="nv">$ </span>wget https://raw.github.com/M0Rf30/android-udev-rules/master/51-android.rules
</span><span class='line'><span class="o">[</span>root@dev rules.d<span class="o">]</span> <span class="nv">$ </span>groupadd adbusers
</span><span class='line'><span class="o">[</span>root@dev rules.d<span class="o">]</span> <span class="nv">$ </span>udevadm control --reload-rules
</span><span class='line'><span class="o">[</span>root@dev rules.d<span class="o">]</span> <span class="nv">$ </span>gpasswd -a antoine adbusers
</span></code></pre></td></tr></table></div></figure>


<p>Plug your device on the USB cable, and you should be able to see it with <code>adb</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='sh'><span class='line'><span class="o">[</span>antoine@dev nexus<span class="o">]</span> <span class="nv">$ </span>adb devices
</span><span class='line'>List of devices attached
</span><span class='line'>015d2ebecd341e06        device
</span></code></pre></td></tr></table></div></figure>


<h3>Backup</h3>

<p>Unlocking the bootloader wipes all the data on the device. If you&#8217;re not doing
this on a new device, you may want to backup and restore your data and
applications. With the device connected in USB debug mode, type :</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='sh'><span class='line'><span class="o">[</span>antoine@dev nexus<span class="o">]</span> <span class="nv">$ </span>adb backup -apk -shared -all -f backup.ab
</span></code></pre></td></tr></table></div></figure>


<p>Depending on the amount of data you have on your device, this process can be
quite long.</p>

<h3>OEM unlock</h3>

<p>Unlocking the device is easy. With the device connected in USB debug mode, type:</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='sh'><span class='line'><span class="o">[</span>antoine@dev nexus<span class="o">]</span> <span class="nv">$ </span>adb reboot bootloader
</span></code></pre></td></tr></table></div></figure>


<p>The device will reboot in <em>fastboot</em> mode. To check this, type:</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='sh'><span class='line'><span class="o">[</span>antoine@dev nexus<span class="o">]</span> <span class="nv">$ </span>fastboot devices
</span><span class='line'>015d2ebecd341e06        fastboot
</span></code></pre></td></tr></table></div></figure>


<p>You will see your device in the list. Then you can unlock it by typing:</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>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="o">[</span>antoine@dev nexus<span class="o">]</span> <span class="nv">$ </span>fastboot oem unlock
</span><span class='line'>...
</span><span class='line'><span class="o">(</span>bootloader<span class="o">)</span> erasing userdata...
</span><span class='line'><span class="o">(</span>bootloader<span class="o">)</span> erasing userdata <span class="k">done</span>
</span><span class='line'><span class="o">(</span>bootloader<span class="o">)</span> erasing cache...
</span><span class='line'><span class="o">(</span>bootloader<span class="o">)</span> erasing cache <span class="k">done</span>
</span><span class='line'><span class="o">(</span>bootloader<span class="o">)</span> unlocking...
</span><span class='line'><span class="o">(</span>bootloader<span class="o">)</span> Bootloader is unlocked now.
</span><span class='line'>OKAY <span class="o">[</span> 54.821s<span class="o">]</span>
</span><span class='line'>finished. total <span class="nb">time</span>: 54.821s
</span><span class='line'><span class="o">[</span>antoine@dev nexus<span class="o">]</span> <span class="nv">$ </span>fastboot reboot
</span></code></pre></td></tr></table></div></figure>


<p>At the end of the process, reboot your device:</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='sh'><span class='line'><span class="o">[</span>antoine@dev nexus<span class="o">]</span> <span class="nv">$ </span>fastboot reboot
</span></code></pre></td></tr></table></div></figure>


<p>You will go through the initialization process in the device.</p>

<h3>Restore</h3>

<p>Once the device is up and running, you can restore your data with:</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='sh'><span class='line'><span class="o">[</span>antoine@dev nexus<span class="o">]</span> <span class="nv">$ </span>adb restore backup.ab
</span></code></pre></td></tr></table></div></figure>


<h3>Root</h3>

<p>To root the device, we will apply the SuperSU installable zip as an update in
CWM.</p>

<p>First we push the SuperSU installable zip in the device filesystem:</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='sh'><span class='line'><span class="o">[</span>antoine@dev nexus<span class="o">]</span> <span class="nv">$ </span>adb push CWM-SuperSU-v0.96.zip /sdcard/update.zip
</span><span class='line'>752 KB/s <span class="o">(</span>674673 bytes in 0.875s<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now that the device is unlocked, we can boot it into CWM. We first reboot it in
fastboot mode:</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='sh'><span class='line'><span class="o">[</span>antoine@dev nexus<span class="o">]</span> <span class="nv">$ </span>adb reboot bootloader
</span></code></pre></td></tr></table></div></figure>


<p>And then boot it with CWM:</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>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="o">[</span>antoine@dev nexus<span class="o">]</span> <span class="nv">$ </span>fastboot boot recovery-clockwork-6.0.1.0-grouper.img
</span><span class='line'>downloading <span class="s1">&#39;boot.img&#39;</span>...
</span><span class='line'>OKAY <span class="o">[</span>  0.800s<span class="o">]</span>
</span><span class='line'>booting...
</span><span class='line'>OKAY <span class="o">[</span>  0.020s<span class="o">]</span>
</span><span class='line'>finished. total <span class="nb">time</span>: 0.820s
</span></code></pre></td></tr></table></div></figure>


<p>After a few seconds, the device will show the CWM interface. With the volume
buttons, move to the <code>install zip from sdcard</code> option and select it by pushing
the power button.</p>

<p>On the new menu that appears, choose the <code>apply /sdcard/update.zip</code> option and
scroll down to the <code>Yes</code> option. click on the power button and SuperSU will
be installed.</p>

<p>Once done, you can go back to the main CWM menu and reboot the device.</p>

<h3>Permanently install CWM</h3>

<p>You can permanetly install CWM on the device recovery partition so that
you can start your device in CWM without being connected via USB.</p>

<p>Your device automatically restores the recovery partition at each boot. To avoid
that, you need to delete the <code>/system/recovery-from-boot.p</code> file on the
device :</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='sh'><span class='line'><span class="o">[</span>antoine@dev nexus<span class="o">]</span> <span class="nv">$ </span>adb shell
</span><span class='line'>shell@android:/ <span class="nv">$ </span>su
</span><span class='line'>shell@android:/ <span class="c"># rm /system/recovery-from-boot.p</span>
</span><span class='line'>shell@android:/ <span class="c"># exit</span>
</span><span class='line'>shell@android:/ <span class="nv">$ </span><span class="nb">exit</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can then reboot in fastboot mode and install CWM permanetly :</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='sh'><span class='line'><span class="o">[</span>antoine@dev nexus<span class="o">]</span> <span class="nv">$ </span>adb reboot bootloader
</span><span class='line'><span class="o">[</span>antoine@dev nexus<span class="o">]</span> <span class="nv">$ </span>fastboot flash recovery recovery-clockwork-touch-6.0.0.6-grouper.img
</span><span class='line'><span class="o">[</span>antoine@dev nexus<span class="o">]</span> <span class="nv">$ </span>fastboot reboot
</span></code></pre></td></tr></table></div></figure>


<p>I personally don&#8217;t recommend to install CWM permanetly as it will prevent you
from installing the OTA updates that are pushed to your device.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Quickly deploy a Git project on a server with SSH]]></title>
    <link href="http://mrtn.me/blog/2012/10/24/quickly-deploy-a-git-project-on-a-server-with-ssh/"/>
    <updated>2012-10-24T13:23:00+02:00</updated>
    <id>http://mrtn.me/blog/2012/10/24/quickly-deploy-a-git-project-on-a-server-with-ssh</id>
    <content type="html"><![CDATA[<p>So you have this brand new project <code>my_project</code> of yours with your local Git
repository set up and you want to quickly make it available for others to clone
on your repository server.</p>

<p>All your projects are located in your server <code>git.mycompany.com</code> under
<code>/srv/git</code>. You&#8217;re using the user named <code>git</code> to connect to your server with
the SSH private key located in <code>~/.ssh/git</code>.</p>

<p>Here is the quickiest way to deploy your projet:</p>

<!-- More -->


<p>You first add your SSH key to the SSH agent :</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='sh'><span class='line'><span class="o">[</span>antoine@dev my_project<span class="o">]</span> <span class="nv">$ </span>ssh-add ~/.ssh/git
</span></code></pre></td></tr></table></div></figure>


<p>If the agent is not started, you need to execute first :</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='sh'><span class='line'><span class="o">[</span>antoine@dev my_project<span class="o">]</span> <span class="nv">$ </span><span class="nb">eval</span> <span class="sb">`</span>ssh-agent<span class="sb">`</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then you create an empty Git bare repository on your server with the name of
your project :</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='sh'><span class='line'><span class="o">[</span>antoine@dev my_project<span class="o">]</span> <span class="nv">$ </span>ssh git@git.mycompany.com <span class="s2">&quot;git --bare init /srv/git/$(basename $(pwd)).git&quot;</span>
</span><span class='line'>Initialized empty Git repository in /srv/git/my_project.git/
</span></code></pre></td></tr></table></div></figure>


<p>Then you add your newly created remote Git repository as the origin of your
local repo :</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='sh'><span class='line'><span class="o">[</span>antoine@dev my_project<span class="o">]</span> <span class="nv">$ </span>git remote add origin <span class="s2">&quot;git@git.mycompany.com:/srv/git/$(basename $(pwd)).git&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>You push your master branch to the remote repository :</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>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="o">[</span>antoine@dev my_project<span class="o">]</span> <span class="nv">$ </span>git push origin master
</span><span class='line'>Counting objects: 3, <span class="k">done</span>.
</span><span class='line'>Writing objects: 100% <span class="o">(</span>3/3<span class="o">)</span>, 209 bytes, <span class="k">done</span>.
</span><span class='line'>Total 3 <span class="o">(</span>delta 0<span class="o">)</span>, reused 0 <span class="o">(</span>delta 0<span class="o">)</span>
</span><span class='line'>To git@git.mycompany.com:/srv/git/my_project.git
</span><span class='line'> * <span class="o">[</span>new branch<span class="o">]</span>      master -&gt; master
</span></code></pre></td></tr></table></div></figure>


<p>Lastly, you make your local branch track your remote branch :</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='sh'><span class='line'><span class="o">[</span>antoine@dev my_project<span class="o">]</span> <span class="nv">$ </span>git branch --set-upstream master origin/master
</span><span class='line'>Branch master <span class="nb">set </span>up to track remote branch master from origin.
</span></code></pre></td></tr></table></div></figure>


<p>The last two steps can be done for any local branch you have that you want to
push on the server.</p>

<p>You can test pulling from the server :</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='sh'><span class='line'><span class="o">[</span>antoine@dev my_project<span class="o">]</span> <span class="nv">$ </span>git pull
</span><span class='line'>Already up-to-date.
</span></code></pre></td></tr></table></div></figure>


<p>That&#8217;s it !</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Installing Redmine on CentOS 6.2 wiht MySQL and Apache]]></title>
    <link href="http://mrtn.me/blog/2012/07/06/installing-redmine-on-centos-6-dot-2-wiht-mysql-and-apache/"/>
    <updated>2012-07-06T17:56:00+02:00</updated>
    <id>http://mrtn.me/blog/2012/07/06/installing-redmine-on-centos-6-dot-2-wiht-mysql-and-apache</id>
    <content type="html"><![CDATA[<p>I needed recently to install the excellent project management tool
<a href="http://www.redmine.org/">Redmine</a> on a <a href="http://www.centos.org/">CentOS</a>
 6.2 machine. There are some tutorials on the Web (<a href="http://www.redmine.org/projects/redmine/wiki/How_to_Install_Redmine_on_CentOS_%28Detailed%29">here</a>
or <a href="http://luzem.dyndns.org/2011/04/14/install-redmine-in-rhel6-and-rh-based-distributions/">here</a>)
but they are a little bit outdated. The following is a method that works as of
today.</p>

<!-- More -->


<h2>Pre-requisites</h2>

<p>Logged as root, install the following packages:</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='sh'><span class='line'>yum install make gcc gcc-c++ zlib-devel ruby-devel rubygems ruby-libs apr-devel apr-util-devel httpd-devel mysql-devel mysql-server automake autoconf ImageMagick ImageMagick-devel curl-devel
</span></code></pre></td></tr></table></div></figure>


<p>And then install the <code>bundle</code> ruby gem:</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='sh'><span class='line'>gem install bundle
</span></code></pre></td></tr></table></div></figure>


<h2>Install Redmine</h2>

<p>Redmine is installed with the following commmands:</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='sh'><span class='line'><span class="nb">cd</span> /var/www
</span><span class='line'>wget http://rubyforge.org/frs/download.php/76255/redmine-1.4.4.tar.gz
</span><span class='line'>tar zxf redmine-1.4.4.tar.gz
</span><span class='line'>ln -s redmine-1.4.4 redmine
</span><span class='line'>rm -f redmine-1.4.4.tar.gz
</span></code></pre></td></tr></table></div></figure>


<h2>Install Redmine ruby dependencies</h2>

<p>Bundle helps us install the ruby Redmine dependencies:</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='sh'><span class='line'><span class="nb">cd</span> /var/www/redmine
</span><span class='line'>bundle install --without postgresql sqlite <span class="nb">test </span>development
</span></code></pre></td></tr></table></div></figure>


<h2>Database creation</h2>

<p>First we start MySQL:</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='sh'><span class='line'>service mysqld start
</span></code></pre></td></tr></table></div></figure>


<p>Then we secure it (Optional):</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='sh'><span class='line'>mysql_secure_installation
</span></code></pre></td></tr></table></div></figure>


<p>We then create the redmine database and user:</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='sh'><span class='line'><span class="nv">$ </span>mysql
</span><span class='line'>mysql&gt; create database redmine character <span class="nb">set </span>utf8;
</span><span class='line'>mysql&gt; grant all privileges on redmine.* to <span class="s1">&#39;redmine&#39;</span>@<span class="s1">&#39;localhost&#39;</span> identified by <span class="s1">&#39;my_password&#39;</span>;
</span><span class='line'>mysql&gt; flush privileges;
</span><span class='line'>mysql&gt; quit
</span></code></pre></td></tr></table></div></figure>


<h2>Redmine database configuration</h2>

<p>We copy the database configuration example and we modify it to point to our
newly created database:</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='sh'><span class='line'><span class="nb">cd</span> /var/www/redmine/config
</span><span class='line'>copy database.yml.example database.yml
</span></code></pre></td></tr></table></div></figure>


<p>On the <code>database.yml</code> file, the <code>production</code> section should look 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>
</pre></td><td class='code'><pre><code class='yaml'><span class='line'><span class="l-Scalar-Plain">production</span><span class="p-Indicator">:</span>
</span><span class='line'>  <span class="l-Scalar-Plain">adapter</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">mysql</span>
</span><span class='line'>  <span class="l-Scalar-Plain">database</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">redmine</span>
</span><span class='line'>  <span class="l-Scalar-Plain">host</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">localhost</span>
</span><span class='line'>  <span class="l-Scalar-Plain">username</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">redmine</span>
</span><span class='line'>  <span class="l-Scalar-Plain">password</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">my_password</span>
</span><span class='line'>  <span class="l-Scalar-Plain">encoding</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">utf8</span>
</span></code></pre></td></tr></table></div></figure>


<p>And then we create and populate the database with the following rake commands:</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='sh'><span class='line'><span class="nb">cd</span> /var/www/redmine
</span><span class='line'>rake generate_session_store
</span><span class='line'>rake db:migrate <span class="nv">RAILS_ENV</span><span class="o">=</span><span class="s2">&quot;production&quot;</span>
</span><span class='line'>rake redmine:load_default_data <span class="nv">RAILS_ENV</span><span class="o">=</span><span class="s2">&quot;production&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Outgoing email configuration (Optional)</h2>

<p>To configure an outgoing SMTP server for sending emails, we create the
<code>config/configuration.yml</code> file from the sample:</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='sh'><span class='line'><span class="nb">cd</span> /var/www/redmine/config
</span><span class='line'>cp configuration.yml.example configuration.yml
</span></code></pre></td></tr></table></div></figure>


<p>And edit it to provide our configuration :</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>
</pre></td><td class='code'><pre><code class='yaml'><span class='line'><span class="l-Scalar-Plain">production</span><span class="p-Indicator">:</span>
</span><span class='line'>  <span class="l-Scalar-Plain">email_delivery</span><span class="p-Indicator">:</span>
</span><span class='line'>    <span class="l-Scalar-Plain">delivery_method</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">:smtp</span>
</span><span class='line'>    <span class="l-Scalar-Plain">smtp_settings</span><span class="p-Indicator">:</span>
</span><span class='line'>      <span class="l-Scalar-Plain">address</span><span class="p-Indicator">:</span> <span class="s">&quot;smtp.mydomain.com&quot;</span>
</span><span class='line'>      <span class="l-Scalar-Plain">port</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">25</span>
</span><span class='line'>      <span class="l-Scalar-Plain">domain</span><span class="p-Indicator">:</span> <span class="s">&quot;mydomain.com&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Redmine standalone testing</h2>

<p>At this point, Redmine can be tested in <em>standalone</em> mode by running the
following command:</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='sh'><span class='line'><span class="nb">cd</span> /var/www/redmine/
</span><span class='line'>ruby script/server webrick -e production
</span></code></pre></td></tr></table></div></figure>


<p>and open the <code>http://localhost:3000</code> addess in a browser. If you are testing
from another computer, you will need to open the port in the
<code>/etc/sysconfig/iptables</code> file by duplicating the ssh (port 22) line and
adapting 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>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
</span><span class='line'>-A INPUT -m state --state NEW -m tcp -p tcp --dport 3000 -j ACCEPT
</span></code></pre></td></tr></table></div></figure>


<p>Then apply the new configuration with the following command:</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='sh'><span class='line'>service iptables restart
</span></code></pre></td></tr></table></div></figure>


<h2>Passenger installation</h2>

<p>To install <a href="http://www.modrails.com/">Phusion passenger</a>, we firts install its
gem:</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='sh'><span class='line'>gem install passenger
</span></code></pre></td></tr></table></div></figure>


<p>And then install the Apache module with the command:</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='sh'><span class='line'>passenger-install-apache2-module
</span></code></pre></td></tr></table></div></figure>


<h2>Apache configuration</h2>

<p>We remove the default Apache configuration and replace it by a new one:</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='sh'><span class='line'><span class="nb">cd</span> /etc/httpd
</span><span class='line'>mv conf.d available
</span><span class='line'>mkdir conf.d
</span></code></pre></td></tr></table></div></figure>


<p>In the empty new <code>conf.d</code> folder, we create a <code>redmine.conf</code> file with the
following configuration:</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='sh'><span class='line'><span class="c"># Loading Passenger</span>
</span><span class='line'>LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.13/ext/apache2/mod_passenger.so
</span><span class='line'>PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.13
</span><span class='line'>PassengerRuby /usr/bin/ruby
</span><span class='line'>
</span><span class='line'>&lt;VirtualHost *:80&gt;
</span><span class='line'>   ServerName redmine.mycompany.com
</span><span class='line'>   DocumentRoot /var/www/redmine/public
</span><span class='line'>   &lt;Directory /var/www/redmine/public&gt;
</span><span class='line'>      <span class="c"># This relaxes Apache security settings.</span>
</span><span class='line'>      AllowOverride all
</span><span class='line'>      <span class="c"># MultiViews must be turned off.</span>
</span><span class='line'>      Options -MultiViews
</span><span class='line'>      allow from all
</span><span class='line'>   &lt;/Directory&gt;
</span><span class='line'>
</span><span class='line'>   ErrorLog <span class="s2">&quot;|/usr/sbin/rotatelogs /etc/httpd/logs/redmine-error.%Y-%m-%d.log 86400&quot;</span>
</span><span class='line'>   CustomLog <span class="s2">&quot;|/usr/sbin/rotatelogs /etc/httpd/logs/redmine-access.%Y-%m-%d.log 86400&quot;</span> <span class="s2">&quot;%h %l %u %t %D \&quot;%r\&quot; %&gt;s %b \&quot;%{Referer}i\&quot; \&quot;%{User-Agent}i\&quot;&quot;</span>
</span><span class='line'>
</span><span class='line'>&lt;/VirtualHost&gt;
</span></code></pre></td></tr></table></div></figure>


<p>We then enable named based virtual hosting for our server by <strong>uncomenting</strong> the
following line in the <code>/etc/httpd/conf/httpd.conf</code> file:</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>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>...
</span><span class='line'><span class="c">#</span>
</span><span class='line'><span class="c"># Use name-based virtual hosting.</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'>NameVirtualHost *:80
</span><span class='line'>...
</span></code></pre></td></tr></table></div></figure>


<p>We give full access on the redmine folder to the <code>apache</code> user and test the
configuration:</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='sh'><span class='line'>chown -R apache:root /var/www/redmine
</span><span class='line'>service httpd configtest
</span></code></pre></td></tr></table></div></figure>


<p>At this point, the SELinux configuration needs to be modified to allow our
apache instance to run the phusion passenger module. You can do this by putting
SELinux in permissive mode:</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='sh'><span class='line'>setenfore Permissive
</span></code></pre></td></tr></table></div></figure>


<p>And letting the Permissive mode survive a reboot by modifyin the
<code>/etc/selinux/config</code> file from:</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='sh'><span class='line'><span class="nv">SELINUX</span><span class="o">=</span>enforcing
</span></code></pre></td></tr></table></div></figure>


<p>to</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='sh'><span class='line'><span class="nv">SELINUX</span><span class="o">=</span>permissive
</span></code></pre></td></tr></table></div></figure>


<p>If you want to run redmine while enforcing, you may want to apply the method
<a href="http://www.bangheadonwall.net/?p=343">described here</a> for which you will need
to install the <code>policycoreutils-python</code> package.</p>

<p>In any case, you will start Apache with the command:</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='sh'><span class='line'>service httpd start
</span></code></pre></td></tr></table></div></figure>


<p>Now you can access your Redmine installation with your browser. To access it
from all the computers in your network, you will need to open the port 80 in the
<code>/etc/sysconfig/iptables</code>. You can replace the 3000 rule by :</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='sh'><span class='line'>-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
</span><span class='line'>-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
</span></code></pre></td></tr></table></div></figure>


<p>And restart iptables.</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='sh'><span class='line'>service iptables restart
</span></code></pre></td></tr></table></div></figure>


<h2>Start services at boot</h2>

<p>To have MySQL and Apache started at boot, run the commands:</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='sh'><span class='line'>chkconfig --level 345 mysqld on
</span><span class='line'>chkconfig --level 345 httpd on
</span></code></pre></td></tr></table></div></figure>


<h2>Cleaning up</h2>

<p>A quick command to clean up all the <code>devel</code> stuff needed for installation:</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='sh'><span class='line'>yum remove <span class="s1">&#39;*-devel&#39;</span> make automake autoconf
</span></code></pre></td></tr></table></div></figure>


<h2>Tips</h2>

<p>Don&#8217;t forget that if you change your Redmine configuration, you don&#8217;t have to
restart Apache. Your can restart only Redmine with the command:</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='sh'><span class='line'>touch /var/www/redmine/tmp/restart.txt
</span></code></pre></td></tr></table></div></figure>


<p>If you restore data on your server from another redmine instance that runs on a
previous version, dont forget to migrate your data:</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='sh'><span class='line'><span class="nb">cd</span> /var/www/redmine
</span><span class='line'>rake db:migrate <span class="nv">RAILS_ENV</span><span class="o">=</span><span class="s2">&quot;production&quot;</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Django on Windows: run Celery as a Service]]></title>
    <link href="http://mrtn.me/blog/2012/07/04/django-on-windows-run-celery-as-a-windows-service/"/>
    <updated>2012-07-04T12:21:00+02:00</updated>
    <id>http://mrtn.me/blog/2012/07/04/django-on-windows-run-celery-as-a-windows-service</id>
    <content type="html"><![CDATA[<p>In my <a href="http://mrtn.me/blog/2012/06/27/running-django-under-windows-with-iis-using-fcgi/">previous post</a>,
I showed how to set up a Django project on a Windows Server to be served behind
IIS. After setting up the server, the next thing we want with a Django
application is to be able to run background and scheduled tasks, and
<a href="http://celeryproject.org/">Celery</a> is the perfect tool for that.</p>

<!-- more -->


<p>On Windows, background processes are mostly run as Windows Services.
Fortunately, <a href="http://sourceforge.net/projects/pywin32/">Python for Windows Extensions</a>
(a.k.a pywin32) provides facilities to create a Windows Service.</p>

<p>I have packaged the related code for this post and the previous one in a
project called <a href="https://github.com/antoinemartin/django-windows-tools">django-windows-tools</a>
available on github and the cheese shop. To make it available for your
application, simply install it with the command:</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='sh'><span class='line'>pip install django-windows-tools
</span></code></pre></td></tr></table></div></figure>


<h2>Configuring your project</h2>

<p>To run Celery for your project, you need to install Celery and choose a Broker
for passing messages between the Django application and the Celery worker
processes.</p>

<p>Installation of celery is easy:</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='sh'><span class='line'>pip install django-celery
</span></code></pre></td></tr></table></div></figure>


<p>Then you add it to your <code>settings.py</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>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">INSTALLED_APPS</span> <span class="o">+=</span> <span class="p">(</span>
</span><span class='line'>    <span class="s">&#39;djcelery&#39;</span><span class="p">,</span>
</span><span class='line'><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">djcelery</span>
</span><span class='line'><span class="n">djcelery</span><span class="o">.</span><span class="n">setup_loader</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can choose among <a href="http://docs.celeryproject.org/en/latest/getting-started/brokers/index.html">several message brokers</a>.
I personnaly use a <a href="https://github.com/MSOpenTech/Redis">Windows port of Redis</a>
installed as a <a href="https://github.com/kcherenkov/redis-windows-service">Windows Service</a>.
The advantage of Redis is that it can also be used as an in-memory database. In
case you&#8217;re interested, you can find <a href="http://mrtn.me/downloads/redis.zip">here</a> a binay copy
of my installation.</p>

<p>The configuration of Redis as Celery&#8217;s broker also occurs in the <code>settings.py</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>
<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>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># Redis configuration</span>
</span><span class='line'><span class="n">REDIS_PORT</span><span class="o">=</span><span class="mi">6379</span>
</span><span class='line'><span class="n">REDIS_HOST</span> <span class="o">=</span> <span class="s">&quot;127.0.0.1&quot;</span>
</span><span class='line'><span class="n">REDIS_DB</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'><span class="n">REDIS_CONNECT_RETRY</span> <span class="o">=</span> <span class="bp">True</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Broker configuration</span>
</span><span class='line'><span class="n">BROKER_HOST</span> <span class="o">=</span> <span class="s">&quot;127.0.0.1&quot;</span>
</span><span class='line'><span class="n">BROKER_BACKEND</span><span class="o">=</span><span class="s">&quot;redis&quot;</span>
</span><span class='line'><span class="n">BROKER_USER</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
</span><span class='line'><span class="n">BROKER_PASSWORD</span> <span class="o">=</span><span class="s">&quot;&quot;</span>
</span><span class='line'><span class="n">BROKER_VHOST</span> <span class="o">=</span> <span class="s">&quot;0&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Celery Redis configuration</span>
</span><span class='line'><span class="n">CELERY_SEND_EVENTS</span><span class="o">=</span><span class="bp">True</span>
</span><span class='line'><span class="n">CELERY_RESULT_BACKEND</span><span class="o">=</span><span class="s">&#39;redis&#39;</span>
</span><span class='line'><span class="n">CELERY_REDIS_HOST</span><span class="o">=</span><span class="s">&#39;127.0.0.1&#39;</span>
</span><span class='line'><span class="n">CELERY_REDIS_PORT</span><span class="o">=</span><span class="mi">6379</span>
</span><span class='line'><span class="n">CELERY_REDIS_DB</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'><span class="n">CELERY_TASK_RESULT_EXPIRES</span> <span class="o">=</span> <span class="mi">10</span>
</span><span class='line'><span class="n">CELERYBEAT_SCHEDULER</span><span class="o">=</span><span class="s">&quot;djcelery.schedulers.DatabaseScheduler&quot;</span>
</span><span class='line'><span class="n">CELERY_ALWAYS_EAGER</span><span class="o">=</span><span class="bp">False</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally, you add the <code>django_windows_tools</code> application to your project:</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='python'><span class='line'><span class="n">INSTALLED_APPS</span> <span class="o">+=</span> <span class="p">(</span>
</span><span class='line'>    <span class="s">&#39;django_windows_tools&#39;</span><span class="p">,</span>
</span><span class='line'><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>After the configuration, a <code>python manage.py syncdb</code> will ensure that the
database of your project is up to date.</p>

<h2>Enabling the service</h2>

<p>The installed service is going to allow us to run in the backround arbitrary
management commands related to our project.</p>

<p>With the application installed, on the root of your project, type the following
command:</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='python'><span class='line'><span class="n">D</span><span class="p">:</span>\<span class="n">sites</span>\<span class="n">mydjangoapp</span><span class="o">&gt;</span> <span class="n">python</span> <span class="n">winservice_install</span>
</span></code></pre></td></tr></table></div></figure>


<p><img src="http://mrtn.me/images/django/winservice_install.png" width="600"></p>

<p>It will create two files in the root directory of your project .<code>service.py</code>
will help you install, run and remove the Windows Service. It&#8217;s much like
<code>manage.py</code> for the service. <code>service.ini</code> contains the list of management
commands that will be run by the Windows Service.</p>

<h2>Configuring the service</h2>

<p>A look at the <code>service.ini</code> file gives us 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>
<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='python'><span class='line'><span class="p">[</span><span class="n">services</span><span class="p">]</span>
</span><span class='line'><span class="c"># Services to be run on all machines</span>
</span><span class='line'><span class="n">run</span><span class="o">=</span><span class="n">celeryd</span>
</span><span class='line'><span class="n">clean</span><span class="o">=</span><span class="n">d</span><span class="p">:</span>\<span class="n">logs</span>\<span class="n">celery</span><span class="o">.</span><span class="n">log</span>
</span><span class='line'>
</span><span class='line'><span class="p">[</span><span class="n">BEATSERVER</span><span class="p">]</span>
</span><span class='line'><span class="c"># There should be only one machine with the celerybeat service</span>
</span><span class='line'><span class="n">run</span><span class="o">=</span><span class="n">celeryd</span> <span class="n">celerybeat</span>
</span><span class='line'><span class="n">clean</span><span class="o">=</span><span class="n">d</span><span class="p">:</span>\<span class="n">logs</span>\<span class="n">celerybeat</span><span class="o">.</span><span class="n">pid</span><span class="p">;</span><span class="n">d</span><span class="p">:</span>\<span class="n">logs</span>\<span class="n">beat</span><span class="o">.</span><span class="n">log</span><span class="p">;</span><span class="n">d</span><span class="p">:</span>\<span class="n">logs</span>\<span class="n">celery</span><span class="o">.</span><span class="n">log</span>
</span><span class='line'>
</span><span class='line'><span class="p">[</span><span class="n">celeryd</span><span class="p">]</span>
</span><span class='line'><span class="n">command</span><span class="o">=</span><span class="n">celeryd</span>
</span><span class='line'><span class="n">parameters</span><span class="o">=-</span><span class="n">f</span> <span class="n">d</span><span class="p">:</span>\<span class="n">logs</span>\<span class="n">celery</span><span class="o">.</span><span class="n">log</span> <span class="o">-</span><span class="n">l</span> <span class="n">info</span>
</span><span class='line'>
</span><span class='line'><span class="p">[</span><span class="n">celerybeat</span><span class="p">]</span>
</span><span class='line'><span class="n">command</span><span class="o">=</span><span class="n">celerybeat</span>
</span><span class='line'><span class="n">parameters</span><span class="o">=-</span><span class="n">f</span> <span class="n">d</span><span class="p">:</span>\<span class="n">logs</span>\<span class="n">beat</span><span class="o">.</span><span class="n">log</span> <span class="o">-</span><span class="n">l</span> <span class="n">info</span> <span class="o">--</span><span class="n">pidfile</span><span class="o">=</span><span class="n">d</span><span class="p">:</span>\<span class="n">logs</span>\<span class="n">celerybeat</span><span class="o">.</span><span class="n">pid</span>
</span><span class='line'>
</span><span class='line'><span class="p">[</span><span class="n">runserver</span><span class="p">]</span>
</span><span class='line'><span class="c"># Runs the debug server and listen on port 8000</span>
</span><span class='line'><span class="c"># This one is just an example to show that any manage command can be used</span>
</span><span class='line'><span class="n">command</span><span class="o">=</span><span class="n">runserver</span>
</span><span class='line'><span class="n">parameters</span><span class="o">=--</span><span class="n">noreload</span> <span class="o">--</span><span class="n">insecure</span> <span class="mf">0.0</span><span class="o">.</span><span class="mf">0.0</span><span class="p">:</span><span class="mi">8000</span>
</span><span class='line'>
</span><span class='line'><span class="p">[</span><span class="n">log</span><span class="p">]</span>
</span><span class='line'><span class="n">filename</span><span class="o">=</span><span class="n">d</span><span class="p">:</span>\<span class="n">logs</span>\<span class="n">service</span><span class="o">.</span><span class="n">log</span>
</span><span class='line'><span class="n">level</span><span class="o">=</span><span class="n">INFO</span>
</span></code></pre></td></tr></table></div></figure>


<p>The <code>services</code> section contains :</p>

<ul>
<li>The list of background commands to run in the <code>run</code> directive.</li>
<li>The list of files to delete when refreshed or stopped in the <code>clean</code>
directive.</li>
</ul>


<p>Here the <code>run</code> directive contains only one command: <code>celeryd</code>. If we look
at the corresponding section of the <code>ini</code> file, we find:</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='python'><span class='line'><span class="p">[</span><span class="n">celeryd</span><span class="p">]</span>
</span><span class='line'><span class="n">command</span><span class="o">=</span><span class="n">celeryd</span>
</span><span class='line'><span class="n">parameters</span><span class="o">=-</span><span class="n">f</span> <span class="n">d</span><span class="p">:</span>\<span class="n">logs</span>\<span class="n">celery</span><span class="o">.</span><span class="n">log</span> <span class="o">-</span><span class="n">l</span> <span class="n">info</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>command</code> specifies the <code>manage.py</code> command to run and <code>parameters</code>
specifies the parameters to the command.</p>

<p>So here the configurations tells us that the service, when started, will run a
python process equivalent to the command 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>
</pre></td><td class='code'><pre><code class='python'><span class='line'>  <span class="n">D</span><span class="p">:</span>\<span class="n">sites</span>\<span class="n">mydjangoapp</span><span class="o">&gt;</span> <span class="n">python</span> <span class="n">manage</span><span class="o">.</span><span class="n">py</span> <span class="n">celeryd</span> <span class="o">-</span><span class="n">f</span> <span class="n">d</span><span class="p">:</span>\<span class="n">logs</span>\<span class="n">celery</span><span class="o">.</span><span class="n">log</span> <span class="o">-</span><span class="n">l</span> <span class="n">info</span>
</span></code></pre></td></tr></table></div></figure>


<p>And that the <code>d:\logs\celery.log</code> will be deleted between runs.</p>

<p>The <code>log</code> sections defines a log file and logging level for the service
process itself:</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='python'><span class='line'><span class="p">[</span><span class="n">log</span><span class="p">]</span>
</span><span class='line'><span class="n">filename</span><span class="o">=</span><span class="n">d</span><span class="p">:</span>\<span class="n">logs</span>\<span class="n">service</span><span class="o">.</span><span class="n">log</span>
</span><span class='line'><span class="n">level</span><span class="o">=</span><span class="n">INFO</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Installing and removing the service</h2>

<p>You need to have administrator privileges to install the service in the
Windows Registry so that it&#8217;s started each time the machine boots. You do
that with the following command:</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='python'><span class='line'><span class="n">D</span><span class="p">:</span>\<span class="n">sites</span>\<span class="n">mydjangoapp</span><span class="o">&gt;</span> <span class="n">python</span> <span class="n">service</span><span class="o">.</span><span class="n">py</span> <span class="o">--</span><span class="n">startup</span><span class="o">=</span><span class="n">auto</span> <span class="n">install</span>
</span></code></pre></td></tr></table></div></figure>


<p><img src="http://mrtn.me/images/django/winservice_install.png" width="600"></p>

<p>The <code>--startup=auto</code> parameter will allow the service to start automatically
when the server boots. You can check it has been installed:</p>

<p><img src="http://mrtn.me/images/django/winservice_service.png"></p>

<p>It can be removed with the following commands:</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='python'><span class='line'><span class="n">D</span><span class="p">:</span>\<span class="n">sites</span>\<span class="n">mydjangoapp</span><span class="o">&gt;</span> <span class="n">python</span> <span class="n">service</span><span class="o">.</span><span class="n">py</span> <span class="n">remove</span>
</span></code></pre></td></tr></table></div></figure>


<p>Please ensure that the Server Manager is not running when you run this command,
because in that case a complete removal of the service will need a server
restart.</p>

<h2>Starting and stopping the service</h2>

<p>The service can be manually started and stopped with the following commands:</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='python'><span class='line'><span class="n">D</span><span class="p">:</span>\<span class="n">sites</span>\<span class="n">mydjangoapp</span><span class="o">&gt;</span> <span class="n">python</span> <span class="n">service</span><span class="o">.</span><span class="n">py</span> <span class="n">start</span>
</span><span class='line'><span class="n">D</span><span class="p">:</span>\<span class="n">sites</span>\<span class="n">mydjangoapp</span><span class="o">&gt;</span> <span class="n">python</span> <span class="n">service</span><span class="o">.</span><span class="n">py</span> <span class="n">stop</span>
</span></code></pre></td></tr></table></div></figure>


<p>If everything went fine, the python processes should be there:</p>

<p><img src="http://mrtn.me/images/django/winservice_process.png"></p>

<p>Along with the log files :</p>

<p><img src="http://mrtn.me/images/django/winservice_logs.png"></p>

<h2>Running the Beat service</h2>

<p>If you deploy your Django project on several servers, you probably want to have
Celery worker processes on each deployed machine but only one unique Beat process
for executing scheduled tasks. You can customize the <code>services</code> section of the
<code>service.ini</code> configuration file on that specific machine, but this is
incovenient if you are sharing files between machines, for instance.</p>

<p>The service provides the ability to have several <code>services</code> sections in the
same configuration file for different host servers. The Windows Service will try
to find the section which name matches the name of the current server and will
fallback to the <code>services</code> section if it does not find it. This allows you to
have a different behaviour for the service on different machines.
In the preceding configuration, you have one section, named <code>BEATSERVER</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='python'><span class='line'><span class="p">[</span><span class="n">BEATSERVER</span><span class="p">]</span>
</span><span class='line'><span class="c"># There should be only one machine with the celerybeat service</span>
</span><span class='line'><span class="n">run</span><span class="o">=</span><span class="n">celeryd</span> <span class="n">celerybeat</span>
</span><span class='line'><span class="n">clean</span><span class="o">=</span><span class="n">d</span><span class="p">:</span>\<span class="n">logs</span>\<span class="n">celerybeat</span><span class="o">.</span><span class="n">pid</span><span class="p">;</span><span class="n">d</span><span class="p">:</span>\<span class="n">logs</span>\<span class="n">beat</span><span class="o">.</span><span class="n">log</span><span class="p">;</span><span class="n">d</span><span class="p">:</span>\<span class="n">logs</span>\<span class="n">celery</span><span class="o">.</span><span class="n">log</span>
</span></code></pre></td></tr></table></div></figure>


<p>which adds the <code>celerybeat</code> command to the <code>celeryd</code> command. With this
configuration file, the service run on a machine named <code>BEATSERVER</code> will run
the Celery beat service.</p>

<p>The <code>winservice_install</code> facility provides a convenient option for choosing
the current machine as the <em>Beat</em> machine. Let&#8217;s try that :</p>

<p><img src="http://mrtn.me/images/django/winservice_beat.png" width="600"></p>

<p>The new <code>service.py</code> file will contain a section with the name of the current
machine:</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='python'><span class='line'><span class="p">[</span><span class="n">WS2008R2X64</span><span class="p">]</span>
</span><span class='line'><span class="c"># There should be only one machine with the celerybeat service</span>
</span><span class='line'><span class="n">run</span><span class="o">=</span><span class="n">celeryd</span> <span class="n">celerybeat</span>
</span><span class='line'><span class="n">clean</span><span class="o">=</span><span class="n">d</span><span class="p">:</span>\<span class="n">logs</span>\<span class="n">celerybeat</span><span class="o">.</span><span class="n">pid</span><span class="p">;</span><span class="n">d</span><span class="p">:</span>\<span class="n">logs</span>\<span class="n">beat</span><span class="o">.</span><span class="n">log</span><span class="p">;</span><span class="n">d</span><span class="p">:</span>\<span class="n">logs</span>\<span class="n">celery</span><span class="o">.</span><span class="n">log</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, when run, the service will start a new python process:</p>

<p><img src="http://mrtn.me/images/django/winservice_process_beat.png"></p>

<p>And new log files for the beat service will be present:</p>

<p><img src="http://mrtn.me/images/django/winservice_log_beat.png"></p>

<h2>Changes to the configuration</h2>

<p>The Windows Service monitor changes to the <code>service.ini</code> configuration
file. In case it is modified, the service does the following:</p>

<ul>
<li>Stop the background processes.</li>
<li>Reread the configuration file.</li>
<li>Start the background processes.</li>
</ul>


<p>You may have seen in the <code>service.ini</code> file the <code>runserver</code> section:</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='python'><span class='line'><span class="p">[</span><span class="n">runserver</span><span class="p">]</span>
</span><span class='line'><span class="c"># Runs the debug server and listen on port 8000</span>
</span><span class='line'><span class="c"># This one is just an example to show that any manage command can be used</span>
</span><span class='line'><span class="n">command</span><span class="o">=</span><span class="n">runserver</span>
</span><span class='line'><span class="n">parameters</span><span class="o">=--</span><span class="n">noreload</span> <span class="o">--</span><span class="n">insecure</span> <span class="mf">0.0</span><span class="o">.</span><span class="mf">0.0</span><span class="p">:</span><span class="mi">8000</span>
</span></code></pre></td></tr></table></div></figure>


<p>It allows running the runserver command in a separate process. I you edit the
<code>service.ini</code> file and add <code>runserver</code> to the <code>run</code> directive:</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='python'><span class='line'><span class="p">[</span><span class="n">WS2008R2X64</span><span class="p">]</span>
</span><span class='line'><span class="c"># There should be only one machine with the celerybeat service</span>
</span><span class='line'><span class="n">run</span><span class="o">=</span><span class="n">celeryd</span> <span class="n">celerybeat</span> <span class="n">runserver</span>
</span><span class='line'><span class="o">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>As soon as you save the file, you can make your browser point to
<code>http://localhost:8000</code> and will obtain:</p>

<p><img src="http://mrtn.me/images/django/winservice_runserver.png"></p>

<h2>Running arbitrary commands</h2>

<p>As shown in the preceding section, virtually any Django management command can
be run by the service at startup or each time the <code>service.ini</code> file is
modified. You could imagine having a section:</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='python'><span class='line'><span class="p">[</span><span class="n">collectstatic</span><span class="p">]</span>
</span><span class='line'><span class="n">command</span><span class="o">=</span><span class="n">collectstatic</span>
</span><span class='line'><span class="n">parameters</span><span class="o">=--</span><span class="n">noinput</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Running Django under Windows with IIS using FastCGI]]></title>
    <link href="http://mrtn.me/blog/2012/06/27/running-django-under-windows-with-iis-using-fcgi/"/>
    <updated>2012-06-27T14:12:00+02:00</updated>
    <id>http://mrtn.me/blog/2012/06/27/running-django-under-windows-with-iis-using-fcgi</id>
    <content type="html"><![CDATA[<p><strong>Update</strong>: The configuration process described in this post can be achieved
with only one management command if you install the
<a href="https://github.com/antoinemartin/django-windows-tools">django-windows-tools application</a>.</p>

<p>Windows is probably not the best production environment for
<a href="https://www.djangoproject.com/">Django</a> but sometimes one doesn&#8217;t have the
choice. In that case, a few options aleardy exist, most notably the one
developed by <a href="http://www.helicontech.com/">helicontech</a> that relies on
Microsoft&#8217;s <a href="http://www.microsoft.com/web/downloads/platform.aspx">Web Platform Installer</a>.
This solution, which is described <a href="http://www.microsoft.com/web/downloads/platform.aspx">here</a>,
relies on the installation of a specific native Handler developed by
Helicontech.</p>

<p>This handler manages the communication between IIS and the Django application
through the <a href="http://www.fastcgi.com">FastCGI protocol</a> with the help of a
little python script that bridges FastCGI to WSGI. This script is derived from
the Allan Saddi <a href="http://trac.saddi.com/flup">flup package</a> that is already used
by Django in the <code>manage.py runfcgi</code> command. The flup package doesn&#8217;t work
under Windows and Helicontech has made the necessary adaptations to make it
work with its handler.</p>

<p>Since its version 7, IIS does however support FastCGI natively, so the use of a
specific handler to support Django is not needed. This post describes how to
configure and run a Django application with the native FastCGI IIS handler. For
that, I have myself adapted the Helicontech FastCGI to WSGI script to make it a
<a href="https://gist.github.com/3004168">Django management command</a>.</p>

<!-- more -->


<h2>Python installation</h2>

<p>But before that, to run Django you will need to have python on your server. If
like me for some reason it is uneasy for you to run a software installer on your
server, a good choice is to use <a href="http://www.portablepython.com/">Portable Python</a>.
With it, you can install and configure your python environment on your
development or staging server and install it in your production server(s)
by just copying over the <code>python</code> folder. You can even have different python
environments with differents configurations on the same server. To use the
portable python installation in copied in <code>d:\python</code> from a command line
window, juste type:</p>

<figure class='code'><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'>set path=d:\python\app\scripts;d:\python\app;%path%</span></code></pre></td></tr></table></div></figure>


<p>And then python and its commands are available from the command line:</p>

<p><img src="http://mrtn.me/images/django/command.png" width="600"></p>

<p>Another advantage of Portable Python is that it comes already bundled with
<a href="http://sourceforge.net/projects/pywin32/">The Python for Windows extensions</a>
(a.k.a. pywin32) and Django.</p>

<h2>Adding FastCGI to the project</h2>

<p>In our example, the Django project will be named <code>esplayer</code> and will be
installed in <code>d:\sites\esplayer</code>. Please note that this configuration has
been tested on Windows 2008 Server R2.</p>

<p>Take the <a href="https://gist.github.com/3004168">fcgi.py</a> file and copy it in the
<code>management\commands</code> directory of one of your project applications so that
the <code>manage.py help fcgi</code> command returns you:</p>

<p><img src="http://mrtn.me/images/django/fcgi.png" width="600"></p>

<h2>Configure the FastCGI application on IIS</h2>

<p>The next step is to configure the FastCGI Application on IIS. FastCGI is
available whenever you have installed the CGI feature on your IIS installation.
Run the server manager and go to the IIS role and configuration. Select your
website. You should see a FastCGI Settings icon:</p>

<p><img src="http://mrtn.me/images/django/fastcgi_settings.png" width="600"></p>

<p>Double click on it and select the <em>Add application</em> action. Enter the following
parameters:</p>

<p><img src="http://mrtn.me/images/django/fcgi_configuration.png" width="400"></p>

<ul>
<li>In <code>Full Path</code>, enter the path to your python executable.</li>
<li>In <code>Arguments</code>, enter the command line for running our fcgi command, i.e. <code>d:\sites\esplayer\esplayer\manage.py fcgi --pythonpath=d:\sites\esplayer --settings=esplayer.settings</code>.
The <code>pythonpath</code> and <code>settings</code> arguments are needed to be path independent
(more on this later).</li>
</ul>


<p>The other arguments are optional but you should review them to enter sensible
values. The <code>Monitor changes to file</code> setting is particularly interesting. It
will allow you to specify the path of a file that will trigger a restart of the
application whenever it is modified. You can enter the path to the
<code>settings.py</code> of your project. I personally prefer to specify a file that I
explicitely update via a <code>touch</code> command.</p>

<h2>Create the website and configure it to use the FastCGI application</h2>

<p>Once we have our FastCGI application configured, we need a web site to make use
of it. For it, we create a website pointing to our Django project:</p>

<p><img src="http://mrtn.me/images/django/website_configuration.png" width="400"></p>

<p>To make the website use our FastCGI application, we create the following
<code>web.config</code> file in the root of our project (here
d:\sites\esplayer\esplayer):</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='xml'><span class='line'><span class="cp">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span>
</span><span class='line'><span class="nt">&lt;configuration&gt;</span>
</span><span class='line'>  <span class="nt">&lt;system.webServer&gt;</span>
</span><span class='line'>    <span class="nt">&lt;handlers&gt;</span>
</span><span class='line'>      <span class="nt">&lt;clear/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;add</span> <span class="na">name=</span><span class="s">&quot;FastCGI&quot;</span> <span class="na">path=</span><span class="s">&quot;*&quot;</span> <span class="na">verb=</span><span class="s">&quot;*&quot;</span> <span class="na">modules=</span><span class="s">&quot;FastCgiModule&quot;</span> <span class="na">scriptProcessor=</span><span class="s">&quot;D:\python\App\python.exe|d:\sites\esplayer\esplayer\manage.py fcgi --pythonpath=d:\sites\esplayer --settings=esplayer.settings&quot;</span> <span class="na">resourceType=</span><span class="s">&quot;Unspecified&quot;</span> <span class="na">requireAccess=</span><span class="s">&quot;Script&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/handlers&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/system.webServer&gt;</span>
</span><span class='line'><span class="nt">&lt;/configuration&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>We first clear all the request handlers and then specify that every request
(<code>path="*"</code> and <code>verb="*"</code>) should be managed by the <code>FastCgiModule</code>
module. The <code>scriptProcessor</code> attribute reproduces the <code>Full Path</code> and the
<code>Arguments</code> of our FastCGI application separated by <code>|</code>. It allows the
module to identify the FastCGI application to which the requests will be routed.</p>

<h2>Static files</h2>

<p>With the preceding <code>web.config</code> configuration, all the requests are routed
to the Django application. However, we want the static files of our application
to be managed by IIS itself. To do that, we first configure Django to collect
the static files in the <code>static</code> subdirectory of our project. For that, we
have the following configuration in our <code>settings.py</code> file:</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>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">SITE_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">__file__</span><span class="p">))</span>
</span><span class='line'><span class="o">...</span>
</span><span class='line'><span class="n">STATIC_URL</span> <span class="o">=</span> <span class="s">&#39;/static/&#39;</span>
</span><span class='line'><span class="o">...</span>
</span><span class='line'><span class="n">STATIC_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span> <span class="n">SITE_ROOT</span><span class="p">,</span> <span class="s">&#39;static&#39;</span><span class="p">)</span>
</span><span class='line'><span class="n">SITE_STATIC_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span> <span class="n">SITE_ROOT</span><span class="p">,</span> <span class="s">&#39;local_static&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Additional locations of static files</span>
</span><span class='line'><span class="n">STATICFILES_DIRS</span> <span class="o">=</span> <span class="p">(</span>
</span><span class='line'>    <span class="c"># Don&#39;t forget to use absolute paths, not relative paths.</span>
</span><span class='line'>    <span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">,</span> <span class="n">SITE_STATIC_ROOT</span><span class="p">),</span>
</span><span class='line'><span class="p">)</span>
</span><span class='line'><span class="o">..</span>
</span></code></pre></td></tr></table></div></figure>


<p>The project wide defined static files are located in the <code>local_static</code>
directory. All the static files are collected in the <code>static</code> directory by
running the following command:</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='python'><span class='line'><span class="n">python</span> <span class="n">manage</span><span class="o">.</span><span class="n">py</span> <span class="n">collecstatic</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the <code>local_static</code> directory we put the following <code>web.config</code> file:</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>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="cp">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span>
</span><span class='line'><span class="nt">&lt;configuration&gt;</span>
</span><span class='line'>  <span class="nt">&lt;system.webServer&gt;</span>
</span><span class='line'>    <span class="c">&lt;!-- this configuration overrides the FastCGI handler to let IIS serve the static files --&gt;</span>
</span><span class='line'>    <span class="nt">&lt;handlers&gt;</span>
</span><span class='line'>    <span class="nt">&lt;clear/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;add</span> <span class="na">name=</span><span class="s">&quot;StaticFile&quot;</span> <span class="na">path=</span><span class="s">&quot;*&quot;</span> <span class="na">verb=</span><span class="s">&quot;*&quot;</span> <span class="na">modules=</span><span class="s">&quot;StaticFileModule&quot;</span> <span class="na">resourceType=</span><span class="s">&quot;File&quot;</span> <span class="na">requireAccess=</span><span class="s">&quot;Read&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/handlers&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/system.webServer&gt;</span>
</span><span class='line'><span class="nt">&lt;/configuration&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Which basically inverts the <code>web.config</code> file or the root of the project by
clearing all the handlers and serving all requests only as static files. When
collected, this file will go in the <code>static</code> directory and will instruct IIS
that all requests below the path <code>/static</code> should be served as static files.</p>

<h2>Website creation automation</h2>

<p>The website creation that is described in the previous sections can be automated
with the following script that must be run as an administrator:</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='xml'><span class='line'>%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+&quot;[fullPath=&#39;d:\python\app\python.exe&#39;,arguments=&#39;d:\sites\esplayer\esplayer\manage.py fcgi --pythonpath=d:\sites\esplayer --settings=esplayer.settings&#39;,maxInstances=&#39;4&#39;,idleTimeout=&#39;1800&#39;,activityTimeout=&#39;30&#39;,requestTimeout=&#39;90&#39;,instanceMaxRequests=&#39;100000&#39;,protocol=&#39;NamedPipe&#39;,flushNamedPipe=&#39;False&#39;,monitorChangesTo=&#39;d:\sites\esplayer\esplayer\web.config&#39;]&quot; /commit:apphost
</span><span class='line'>%windir%\system32\inetsrv\appcmd.exe add apppool /name:esplayer
</span><span class='line'>%windir%\system32\inetsrv\appcmd.exe add site /name:esplayer /bindings:http://*:80 /physicalPath:d:\sites\esplayer\esplayer
</span><span class='line'>%windir%\system32\inetsrv\appcmd.exe set app &quot;esplayer/&quot; /applicationPool:esplayer
</span></code></pre></td></tr></table></div></figure>


<p>The four commands run in the script do the following actions:</p>

<ul>
<li>Create the FastCGI application.</li>
<li>Create the site application pool.</li>
<li>Create the website.</li>
<li>Add the created website to the application pool.</li>
</ul>


<h2>Testing and troubleshooting</h2>

<p>After the configuration, the website should be available through IIS. If this
is not the case, you will probably get a <code>500</code> Error:</p>

<p><img src="http://mrtn.me/images/django/500_error.png" width="400"></p>

<p>The first thing to do is to check that the website is available outside of IIS
by running it with the command:</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='sh'><span class='line'>python manage.py runserver 0.0.0.0:8000
</span></code></pre></td></tr></table></div></figure>


<p>And accessing it on <code>http://localhost:8000</code>. If the application works as a
standalone Django application, the most common cause of error is a
misconfiguration of either the FastCGI application or the root <code>web.config</code>
file. You need to be sure that the The <code>scriptProcessor</code> attribute
of the <code>web.config</code> matches <code>Full Path</code> and the <code>Arguments</code> of the FastCGI
application.</p>

<p>To troubleshoot further, the <code>fcgi.py</code> command provides several settings to
be put in the <code>settings.py</code> file : <code>FCGI_LOG</code> (default
<code>False</code>), when <code>True</code>, instructs the command to create a log file in the
path pointed by <code>FCGI_LOG_PATH</code>. If <code>FCGI_LOG_PATH</code> is not
defined, the log file will be created in the project root directory. The file
name name pattern of the log file will be <code>fcgi_AAMMDD_HHMMSS_XXXX.log</code>, in
which <code>AAMMDD</code> is the date, <code>HHMMSS</code> the time and <code>XXXX</code> the FastCGI
application process number. If <code>DEBUG</code> is set to <code>True</code> in the settings, the
log file will contain the Django debug logs. The <code>FCGI_DEBUG</code> setting (default
<code>False</code>), when set to <code>True</code>, will output in the log file information about
the FCGI protocol transfers between IIS and the Django application.</p>

<h2>Easing the FastCGI configuration</h2>

<p>It is somewhat painful to have to specify the <code>pythonpath</code> and <code>settings</code>
parameters both in the FastCGI configuration and in the <code>web.config</code> file. To
avoid entering them each time, I have created a <code>manage.py</code> script in the
<code>scripts</code> subdirectory of the project root that <em>auto configures</em> itself.
Here is the source of the file:</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>
<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>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c">#!/usr/bin/python</span>
</span><span class='line'><span class="c"># -*- coding: utf-8 -*-</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">os</span><span class="o">,</span><span class="nn">sys</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">os.path</span> <span class="kn">import</span> <span class="n">abspath</span><span class="p">,</span> <span class="n">dirname</span>
</span><span class='line'>
</span><span class='line'><span class="c"># the base path is my parent directory</span>
</span><span class='line'><span class="n">base_path</span> <span class="o">=</span> <span class="n">dirname</span><span class="p">(</span><span class="n">dirname</span><span class="p">(</span><span class="n">abspath</span><span class="p">(</span><span class="n">__file__</span><span class="p">)))</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="kn">from</span> <span class="nn">django.core.handlers.modpython</span> <span class="kn">import</span> <span class="n">handler</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Add the parent directory to the path to be able to import settings</span>
</span><span class='line'><span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">base_path</span><span class="p">)</span>
</span><span class='line'><span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">dirname</span><span class="p">(</span><span class="n">base_path</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Now we can import our settings and setup the environment</span>
</span><span class='line'><span class="k">try</span><span class="p">:</span>
</span><span class='line'>    <span class="kn">import</span> <span class="nn">settings</span> <span class="c"># Assumed to be in the same directory.</span>
</span><span class='line'><span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
</span><span class='line'>    <span class="kn">import</span> <span class="nn">sys</span>
</span><span class='line'>    <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;Error: Can&#39;t find the file &#39;settings.py&#39; in the directory containing </span><span class="si">%r</span><span class="s">. It appears you&#39;ve customized things.</span><span class="se">\n</span><span class="s">You&#39;ll have to run django-admin.py, passing it your settings module.</span><span class="se">\n</span><span class="s">(If the file settings.py does indeed exist, it&#39;s causing an ImportError somehow.)</span><span class="se">\n</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">__file__</span><span class="p">)</span>
</span><span class='line'>    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">django.core.management</span> <span class="kn">import</span> <span class="n">setup_environ</span>
</span><span class='line'><span class="n">setup_environ</span><span class="p">(</span><span class="n">settings</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="kn">from</span> <span class="nn">django.core.management</span> <span class="kn">import</span> <span class="n">execute_manager</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span>
</span><span class='line'>    <span class="n">execute_manager</span><span class="p">(</span><span class="n">settings</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>With this script, the <code>Arguments</code> setting of the FastCGI application becomes
<code>d:\sites\esplayer\esplayer\scripts\manage.py fcgi</code> and the
<code>scriptProcessor</code> attribute in the <code>web.config</code> file becomes</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='python'><span class='line'><span class="n">scriptProcessor</span><span class="o">=</span><span class="s">&quot;D:\python\App\python.exe|d:\sites\esplayer\esplayer\script\manage.py fcgi&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>What next</h2>

<p>Once this configuration is done on a project and a server, replicating it
across multiple servers is easy as the only configuration not part of the
project is the one of the FastCGI application. Most configuration files are
ported from server to server with the source code of the project.</p>

<p>However, the first creation and configuration could benefit from having some
management commands dedicated to it. These would be part, along with the
<a href="https://gist.github.com/3004168">fcgi.py</a> command, of a specific Django
application that could be added to any project.</p>

<p>Furthermore, some of you may have noted that having the website point to the
root of the Django project is not mandatory. Thus the Django project itself
could be part of the python installation itself and deployed by running a Django
management command.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using Eclipse templates to ease Android logging]]></title>
    <link href="http://mrtn.me/blog/2012/03/24/using-eclipse-templates-to-ease-android-logging/"/>
    <updated>2012-03-24T07:26:00+01:00</updated>
    <id>http://mrtn.me/blog/2012/03/24/using-eclipse-templates-to-ease-android-logging</id>
    <content type="html"><![CDATA[<p>Adding logs to your Android source code is sometimes the only way to really
understand what happens , especially in asynchronous situations.</p>

<p>If you are lazy like me, you may insert <em>lazy logs</em> like this one:</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='java'><span class='line'>  <span class="n">Log</span><span class="o">.</span><span class="na">v</span><span class="o">(</span><span class="s">&quot;#LOOK#&quot;</span><span class="o">,</span> <span class="s">&quot;onStart()&quot;</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Instead of having less lazy code like:</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>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">SomeActivity</span> <span class="kd">extends</span> <span class="n">Activity</span> <span class="o">{</span>
</span><span class='line'>  <span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">LOG_TAG</span> <span class="o">=</span> <span class="n">SomeActivity</span><span class="o">.</span><span class="na">class</span>
</span><span class='line'>          <span class="o">.</span><span class="na">getSimpleName</span><span class="o">();</span>
</span><span class='line'>  <span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">LOG_LEVEL</span> <span class="o">=</span> <span class="n">Log</span><span class="o">.</span><span class="na">VERBOSE</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">public</span> <span class="kt">void</span> <span class="nf">onStart</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">LOG_LEVEL</span> <span class="o">&lt;=</span> <span class="n">Log</span><span class="o">.</span><span class="na">VERBOSE</span><span class="o">)</span>
</span><span class='line'>          <span class="n">Log</span><span class="o">.</span><span class="na">v</span><span class="o">(</span><span class="n">LOG_TAG</span><span class="o">,</span> <span class="s">&quot;onStart()&quot;</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>But Eclipse can easily help you to avoid this and then the need to clean up your
code after debbuging.</p>

<!-- more -->


<p>Everybody uses content assist in Eclipse. The <code>CTRL+Space</code> shortcut alleviates
us from the need to type all those long field and method names that come out of
our imagination. With the <em>Templates</em> feature, it can even write code for us.</p>

<p>Templates are editable in the preferences. To see them, select
<code>Window &gt; Preferences</code> and then in the preferences dialog, <code>Java &gt; Editor &gt; Templates</code>.
The window looks like this:</p>

<p><img src="http://mrtn.me/images/eclipse_templates.png" width="500"></p>

<p>If you double click on a template you can edit it:</p>

<p><img src="http://mrtn.me/images/eclipse_template_edit.png" width="500"></p>

<p>The template name is what you type in the Editor window before hitting
<code>CTRL+Space</code> and that will make Eclipse propose you the template. I won&#8217;t go
into a full explanation of the syntax of the templates, but basically the
template name is replaced by the template pattern and the content between the
<code>${}</code> is replaced either by what you type or by values computed by existing
macros. DZone gives you a good <a href="http://eclipse.dzone.com/news/visual-guide-templates-eclipse">Visual Guide to Template</a>
listing most common macros.</p>

<p>Now we can create our templates for both adding the Log declarations at the
beginning of our class as well as templates for inserting conditionally ran logs.</p>

<p>For the header, we create a template named <code>alh</code> in <code>Java types member</code> context
with the following pattern:</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='java'><span class='line'><span class="n">$</span><span class="o">{:</span><span class="n">import</span><span class="o">(</span><span class="n">android</span><span class="o">.</span><span class="na">util</span><span class="o">.</span><span class="na">Log</span><span class="o">)}</span><span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">LOG_TAG</span> <span class="o">=</span> <span class="n">$</span><span class="o">{</span><span class="n">enclosing_type</span><span class="o">}.</span><span class="na">class</span><span class="o">.</span><span class="na">getSimpleName</span><span class="o">();</span>
</span><span class='line'><span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">LOG_LEVEL</span> <span class="o">=</span> <span class="n">Log</span><span class="o">.</span><span class="n">$</span><span class="o">{</span><span class="n">level</span><span class="o">};</span>
</span><span class='line'><span class="n">$</span><span class="o">{</span><span class="n">cursor</span><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The different <code>${}</code> mean:</p>

<ul>
<li><code>${:import(android.util.Log)}</code>: make sure <code>android.util.Log</code> is imported.</li>
<li><code>${enclosing_type}</code>: insert the name of the type (class) we&#8217;re in.</li>
<li><code>${level}</code>: when inserting, put the cursor here and wait for  the user to
enter the <code>level</code> variable.</li>
<li><code>${cursor}</code>: leave the cursor here when the user hits the <code>ENTER</code> key.</li>
</ul>


<p>With this template, inserting the log headers in a class is achievied with the
following steps:</p>

<ul>
<li>type <code>alh</code> and hit <code>STRL+Space</code>.</li>
<li>select the template (first choice) and hit <code>ENTER</code></li>
<li>enter the desired log level (<code>DEBUG</code> for instance) for the class and hit
<code>ENTER</code>.</li>
<li>continue coding.</li>
</ul>


<p>This is much simpler than copy-pasting the code from another class and replacing
the class name and log level.</p>

<p>The following template, named <code>alv</code> in the <code>Java statement</code> context is for
inserting verbose logs:</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='java'><span class='line'><span class="k">if</span> <span class="o">(</span><span class="n">LOG_LEVEL</span> <span class="o">&lt;=</span> <span class="n">Log</span><span class="o">.</span><span class="na">VERBOSE</span><span class="o">)</span>
</span><span class='line'>  <span class="n">Log</span><span class="o">.</span><span class="na">v</span><span class="o">(</span><span class="n">LOG_TAG</span><span class="o">,</span> <span class="s">&quot;${enclosing_method}() ${}&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">$</span><span class="o">{</span><span class="n">cursor</span><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The nice thing is that it inserts the name of the current method and wait just
after for your debug message. Just typing <code>Enter</code> will leave a log like:</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='java'><span class='line'> <span class="k">if</span> <span class="o">(</span><span class="n">LOG_LEVEL</span> <span class="o">&lt;=</span> <span class="n">Log</span><span class="o">.</span><span class="na">VERBOSE</span><span class="o">)</span>
</span><span class='line'>      <span class="n">Log</span><span class="o">.</span><span class="na">v</span><span class="o">(</span><span class="n">LOG_TAG</span><span class="o">,</span> <span class="s">&quot;onStart() &quot;</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Wich may be just enough.</p>

<p>On this model, you can create <code>ali</code>, <code>ald</code>, <code>ale</code> templates for the different
debug levels, or if you want to use <code>String.format()</code> templates like :</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='java'><span class='line'><span class="k">if</span> <span class="o">(</span><span class="n">LOG_LEVEL</span> <span class="o">&lt;=</span> <span class="n">Log</span><span class="o">.</span><span class="na">DEBUG</span><span class="o">)</span>
</span><span class='line'>  <span class="n">Log</span><span class="o">.</span><span class="na">d</span><span class="o">(</span><span class="n">LOG_TAG</span><span class="o">,</span> <span class="n">String</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">&quot;${enclosing_method}() ${}&quot;</span><span class="o">,</span> <span class="n">$</span><span class="o">{</span><span class="n">args</span><span class="o">}));</span>
</span><span class='line'><span class="n">$</span><span class="o">{</span><span class="n">cursor</span><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Just adapt them to your needs.</p>

<p>Once you have finished debugging, if you change the <code>LOG_LEVEL</code> of your class
from let&#8217;s say <code>VERBOSE</code> to <code>INFO</code>, all the <code>alv</code> templates you&#8217;ve entered
will become <em>dead code</em> as the <code>if</code> surrounding the log lines is always <code>false</code>.
This is because it compares static variables, and this is just what we want.
When we compile for delivery, we want the compiler to optimize out all this code
from the binary.</p>

<p>However, the Java compiler will generate warnings for that. As it is not
possible to surround the log with a <code>@SuppressWarnings()</code> attribute, you may
want to change the error level of dead code from <code>Warning</code> to <code>Ignore</code>. This is
done in <code>Window &gt; Preferences</code>, <code>Java &gt; Compiler &gt; Error/Warnings &gt; Potential
programming problems</code>.</p>

<p>When it&#8217;s time for delivery, you may want to change the <code>LOG_LEVEL</code> of all
classes to a particular value. To do that, I personally use a slightly modified
version of the <code>alh</code> header template:</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="n">$</span><span class="o">{:</span><span class="n">import</span><span class="o">(</span><span class="n">android</span><span class="o">.</span><span class="na">util</span><span class="o">.</span><span class="na">Log</span><span class="o">,</span><span class="n">com</span><span class="o">.</span><span class="na">eurosport</span><span class="o">.</span><span class="na">player</span><span class="o">.</span><span class="na">constants</span><span class="o">.</span><span class="na">DebugConstants</span><span class="o">)}</span><span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">LOG_TAG</span> <span class="o">=</span> <span class="n">$</span><span class="o">{</span><span class="n">enclosing_type</span><span class="o">}.</span><span class="na">class</span><span class="o">.</span><span class="na">getSimpleName</span><span class="o">();</span>
</span><span class='line'><span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">LOG_LEVEL_LOCAL</span> <span class="o">=</span> <span class="n">Log</span><span class="o">.</span><span class="n">$</span><span class="o">{</span><span class="n">level</span><span class="o">};</span>
</span><span class='line'><span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">LOG_LEVEL</span> <span class="o">=</span> <span class="n">DebugConstants</span><span class="o">.</span><span class="na">LOG_FORCE_GLOBAL</span> <span class="o">*</span> <span class="n">DebugConstants</span><span class="o">.</span><span class="na">LOG_LEVEL</span> <span class="o">+</span> <span class="o">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">DebugConstants</span><span class="o">.</span><span class="na">LOG_FORCE_GLOBAL</span><span class="o">)</span> <span class="o">*</span> <span class="n">LOG_LEVEL_LOCAL</span><span class="o">;</span>
</span><span class='line'><span class="n">$</span><span class="o">{</span><span class="n">cursor</span><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>That works with the <code>DebugConstants</code> interface :</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="kd">interface</span> <span class="nc">DebugConstants</span> <span class="o">{</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">LOG_LEVEL</span> <span class="o">=</span> <span class="n">Log</span><span class="o">.</span><span class="na">INFO</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">LOG_FORCE_GLOBAL</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The way the modified <code>alh</code> template works is the following:</p>

<ul>
<li>if the value of <code>DebugConstants.LOG_FORCE_GLOBAL</code> is 0, the <code>LOG_LEVEL</code> variable
contains the value of the <code>LOG_LEVEL_LOCAL</code> variable.</li>
<li>if the value of <code>DebugConstants.LOG_FORCE_GLOBAL</code> is 1, the <code>LOG_LEVEL</code> variable
contains the value of the <code>DebugConstants.LOG_LEVEL</code> variable.</li>
</ul>


<p>By having inserted this template in my classes, even if at delivery time some
of the <code>LOG_LEVEL_LOCAL</code> values are still set to <code>Log.VERBOSE</code>, by setting
<code>LOG_FORCE_GLOBAL</code> to 1, all log levels will be forced to <code>Log.INFO</code> and all
the log code for deeper debugging levels will be removed by DCE (Dead Code
Elimination).</p>

<p>Now, there&#8217;s no more excuses to have sloppy logs in your Android code !</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Get the height of the status bar in Android]]></title>
    <link href="http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/"/>
    <updated>2012-03-17T09:09:00+01:00</updated>
    <id>http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android</id>
    <content type="html"><![CDATA[<p>Sometimes in Android, the flexible layout system is not flexible enough and you
need to make some computations inside your code. In these computations, you may
need to subtract the size of the status bar. Stackoverflow gives you
<a href="http://stackoverflow.com/questions/3407256/height-of-status-bar-in-android">some answers</a>,
but they all rely on the fact that te status bar is shown at the time you make
your computation. If you are in full screen mode, by having called for instance:</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='java'><span class='line'><span class="n">getWindow</span><span class="o">().</span><span class="na">setFlags</span><span class="o">(</span><span class="n">WindowManager</span><span class="o">.</span><span class="na">LayoutParams</span><span class="o">.</span><span class="na">FLAG_FULLSCREEN</span><span class="o">,</span> <span class="n">WindowManager</span><span class="o">.</span><span class="na">LayoutParams</span><span class="o">.</span><span class="na">FLAG_FULLSCREEN</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>It doesn&#8217;t work.</p>

<!-- more -->


<p>The height of the status bar is contained in a dimension resource called
<code>status_bar_height</code>. It&#8217;s not part of the public resources, so you can&#8217;t access
it directly from your code with <code>android.R.dimen.status_bar_height</code>. You can
however compute it at runtime with the following 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>
</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">getStatusBarHeight</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">result</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">resourceId</span> <span class="o">=</span> <span class="n">getResources</span><span class="o">().</span><span class="na">getIdentifier</span><span class="o">(</span><span class="s">&quot;status_bar_height&quot;</span><span class="o">,</span> <span class="s">&quot;dimen&quot;</span><span class="o">,</span> <span class="s">&quot;android&quot;</span><span class="o">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="o">(</span><span class="n">resourceId</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">result</span> <span class="o">=</span> <span class="n">getResources</span><span class="o">().</span><span class="na">getDimensionPixelSize</span><span class="o">(</span><span class="n">resourceId</span><span class="o">);</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">result</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>You need to put this method in a <code>ContextWrapper</code> class.</p>

<p>Hope it helps.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Start a virtualenv Django shell from the Linux Desktop]]></title>
    <link href="http://mrtn.me/blog/2012/03/13/start-a-virtualenv-django-shell-from-the-linux-desktop/"/>
    <updated>2012-03-13T07:58:00+01:00</updated>
    <id>http://mrtn.me/blog/2012/03/13/start-a-virtualenv-django-shell-from-the-linux-desktop</id>
    <content type="html"><![CDATA[<p>If you are tired to fire a terminal window, <code>cd</code> to your project directory and activate your python <code>virtualenv</code>
to get to your Django project, you will find here some tips to improve things a little bit.</p>

<!-- more -->


<p>This tip is divided in two parts :</p>

<ol>
<li>First we create a shell startup script that <em>activates</em> the <code>virtualenv</code>, bash completion and <code>cd</code> in the project directory.</li>
<li>Then we create a <a href="http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html">Linux Desktop Entry</a> file
That spawns a console in our environment.</li>
</ol>


<p>Here you have the startup script:</p>

<figure class='code'><figcaption><span>Django startup script (.consolerc)</span> <a href='http://mrtn.me/downloads/code/.consolerc'>download</a></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>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="c">#!/bin/bash</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'><span class="c"># The layout of the development environment is assumed to be:</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'><span class="c"># &lt;pyton virtual env&gt;/</span>
</span><span class='line'><span class="c">#   src/</span>
</span><span class='line'><span class="c">#     &lt;project name&gt;/</span>
</span><span class='line'><span class="c">#       .consolerc (this file)</span>
</span><span class='line'><span class="c">#       setup.py</span>
</span><span class='line'><span class="c">#       ...</span>
</span><span class='line'><span class="c">#       &lt;project name&gt;/</span>
</span><span class='line'><span class="c">#         manage.py</span>
</span><span class='line'><span class="c">#         settings.py</span>
</span><span class='line'><span class="c">#         ...</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Run the standard bash rc file</span>
</span><span class='line'><span class="nb">source</span> ~/.bashrc
</span><span class='line'>
</span><span class='line'><span class="c"># Get the current source file name</span>
</span><span class='line'><span class="nv">current</span><span class="o">=</span><span class="s2">&quot;${BASH_SOURCE[0]}&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Retrieve the source directory</span>
</span><span class='line'><span class="nv">DJANGO_SOURCE_DIR</span><span class="o">=</span><span class="s2">&quot;$(dirname &quot;</span><span class="k">$(</span>readlink -f <span class="s2">&quot;$current&quot;</span><span class="k">)</span><span class="s2">&quot;)&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Get the Django related directories</span>
</span><span class='line'><span class="nv">DJANGO_PROJECT_NAME</span><span class="o">=</span><span class="s2">&quot;$(basename &quot;</span><span class="nv">$DJANGO_SOURCE_DIR</span><span class="s2">&quot;)&quot;</span>
</span><span class='line'><span class="nv">DJANGO_ENV_DIR</span><span class="o">=</span><span class="k">$(</span>readlink -f <span class="s2">&quot;${DJANGO_SOURCE_DIR}/../../&quot;</span><span class="k">)</span>
</span><span class='line'><span class="nv">DJANGO_PROJECT_DIR</span><span class="o">=</span><span class="s2">&quot;${DJANGO_SOURCE_DIR}/${DJANGO_PROJECT_NAME}&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Activate the environment</span>
</span><span class='line'><span class="nb">source</span> <span class="s2">&quot;${DJANGO_ENV_DIR}/bin/activate&quot;</span>
</span><span class='line'><span class="nb">cd</span> <span class="s2">&quot;$DJANGO_PROJECT_DIR&quot;</span>
</span><span class='line'><span class="nb">export </span><span class="nv">PATH</span><span class="o">=</span><span class="s2">&quot;$PATH:$(pwd)&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Retrieve the Django bash completion file (only once) and execute it. </span>
</span><span class='line'><span class="c"># This is potentially insecure.</span>
</span><span class='line'><span class="nv">DJANGO_BASH_COMPLETION</span><span class="o">=</span><span class="s2">&quot;${DJANGO_SOURCE_DIR}/.django_bash_completion&quot;</span>
</span><span class='line'><span class="k">if</span> <span class="o">[</span> ! -f <span class="s2">&quot;$DJANGO_BASH_COMPLETION&quot;</span> <span class="o">]</span>; <span class="k">then</span>
</span><span class='line'><span class="k">  </span>curl http://code.djangoproject.com/svn/django/trunk/extras/django_bash_completion -o <span class="s2">&quot;$DJANGO_BASH_COMPLETION&quot;</span> 2&gt;/dev/null
</span><span class='line'><span class="k">fi</span>
</span><span class='line'><span class="nb">source</span> <span class="s2">&quot;$DJANGO_BASH_COMPLETION&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Miscellaneous</span>
</span><span class='line'><span class="nb">alias </span><span class="nv">runserver</span><span class="o">=</span><span class="s1">&#39;cd $DJANGO_PROJECT_DIR;manage.py runserver 0.0.0.0:8000&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The comment at the beginning explains how the project directory layout is assumed to be. That is the only assumption that makes the
script. In consequence, it is reusable <em>as is</em> in any other project.</p>

<p>Here is the <code>.desktop</code> file that runs a terminal console with our script:</p>

<figure class='code'><figcaption><span>Django desktop file (Django.desktop)</span> <a href='http://mrtn.me/downloads/code/Django.desktop'>download</a></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='sh'><span class='line'><span class="o">[</span>Desktop Entry<span class="o">]</span>
</span><span class='line'><span class="nv">Exec</span><span class="o">=</span>/bin/bash --rcfile .consolerc
</span><span class='line'>GenericName<span class="o">[</span>fr<span class="o">]=</span>MyProject Django
</span><span class='line'><span class="nv">GenericName</span><span class="o">=</span>MyProject Django
</span><span class='line'><span class="nv">Icon</span><span class="o">=</span>/home/antoine/images/django-icon_0.png
</span><span class='line'><span class="nv">MimeType</span><span class="o">=</span>
</span><span class='line'>Name<span class="o">[</span>fr<span class="o">]=</span>MyProject Django
</span><span class='line'><span class="nv">Name</span><span class="o">=</span>MyProject Django
</span><span class='line'><span class="nv">Path</span><span class="o">=</span>/home/antoine/src/django/my_project/src/my_project/
</span><span class='line'><span class="nv">StartupNotify</span><span class="o">=</span><span class="nb">true</span>
</span><span class='line'><span class="nv">Terminal</span><span class="o">=</span><span class="nb">true</span>
</span><span class='line'><span class="nv">TerminalOptions</span><span class="o">=</span>
</span><span class='line'><span class="nv">Type</span><span class="o">=</span>Application
</span><span class='line'><span class="nv">Categories</span><span class="o">=</span>Development
</span></code></pre></td></tr></table></div></figure>


<p>The command runs in a terminal because of <code>Terminal=true</code>. You can see that apart from <code>Name</code> and <code>GenericName</code>, the only
line specific to the project is</p>

<figure class='code'><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'>Path=/home/antoine/src/django/my_project/src/my_project/</span></code></pre></td></tr></table></div></figure>


<p>It defines the project path, making it easy to reuse. The execution of our init script is done through:</p>

<figure class='code'><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'>Exec=/bin/bash --rcfile .consolerc</span></code></pre></td></tr></table></div></figure>


<p>The <code>Icon</code> is the familiar Django icon :</p>

<p><img src="http://mrtn.me/images/django-icon_0.png"></p>

<p>I personally put the <code>.desktop</code> file in <code>$HOME/Desktop</code>, but it also can reside in <code>$HOME/.local/share/applications</code>. In that
case, the entry will be available in the menu. I&#8217;ve tested this under KDE, but it should work also with Gnome.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Checking Google Play signatures with Django]]></title>
    <link href="http://mrtn.me/blog/2012/03/12/checking-google-play-signatures-with-django/"/>
    <updated>2012-03-12T07:43:00+01:00</updated>
    <id>http://mrtn.me/blog/2012/03/12/checking-google-play-signatures-with-django</id>
    <content type="html"><![CDATA[<p>Google play, formerly known as the Android Market, provides in-app billing in several countries.
In the <a href="http://developer.android.com/guide/market/billing/billing_best_practices.html">Security and Design</a> page,
Google states the following:</p>

<blockquote><p>If practical, you should perform signature verification on a remote server and not on a device.
Implementing the verification process on a server makes it difficult for attackers to break the verification process by
reverse engineering your .apk file. If you do offload security processing to a remote server, be sure that the device-server handshake is secure.</p></blockquote>

<p>The signature verification here refers to the signature sent back by the Billing Service to the
<code>GET_PURCHASE_INFORMATION</code>request. The signature is against the JSON payload containing the purchase information. We&#8217;llget back later
on the authentication of the dialog with the server.</p>

<!-- more -->


<p>The JSON payload looks like the following (It has been indented for readability):</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='js'><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="s2">&quot;nonce&quot;</span><span class="o">:</span><span class="mi">7822246098812800204</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;orders&quot;</span><span class="o">:</span><span class="p">[</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="s2">&quot;notificationId&quot;</span><span class="o">:</span><span class="s2">&quot;-915368186294557970&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;orderId&quot;</span><span class="o">:</span><span class="s2">&quot;971056902421676&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;packageName&quot;</span><span class="o">:</span><span class="s2">&quot;com.xxx.yyy&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;productId&quot;</span><span class="o">:</span><span class="s2">&quot;com.xxx.yyy.product&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;purchaseTime&quot;</span><span class="o">:</span><span class="mi">1331562686000</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;purchaseState&quot;</span><span class="o">:</span><span class="mi">1</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;developerPayload&quot;</span><span class="o">:</span><span class="s2">&quot;WEHJSU&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>And we we receive a signature in <code>Base64</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='js'><span class='line'><span class="nx">rKf9B38gLbJaLiyRbQVJNr0i0IvJxBgi3EmsLoZLkFedZvn642s4</span><span class="o">+</span><span class="nx">fz3jYCk6IVWWFSqtBH2Z8ChONJkHWrkDUCK79uSBPLN5s4x4AsRHgQ8aw3sRQLAoEDMFA1ym1gkfYfDz</span><span class="o">+</span><span class="mi">6</span><span class="nx">sxP2Rgg1U</span><span class="o">/</span><span class="nx">qpHIEHWPDbJAdP7zcM1iz2kEWbYvFwKP3NNWExNB4gWH3IFtPR0l</span><span class="o">/</span><span class="nx">KLjKBoqpX5zVukmUeaZW0Skx10eFROa4VhqA5JrbZZQwK0jc6FCYi3u6c1ryIw6W5tcdIv1PFOKpE7VMq67yyD</span><span class="o">+</span><span class="nx">IEXc</span><span class="o">+</span><span class="nx">nl29FN5ByGhkj</span><span class="o">/</span><span class="nx">khNY1KLXcszCCa7ygSYw7mQI</span><span class="o">+</span><span class="nx">omLdyMz6aL3hg</span><span class="o">==</span>
</span></code></pre></td></tr></table></div></figure>


<p>The payload is signed with the Private key associated with you Google Play account. You can grab your public key in
<a href="https://play.google.com/apps/publish/Home#ProfileEditorPlace:">your developer console page</a>.</p>

<p>There are several crypto solutions available in python. In our example, we use <a href="https://www.dlitz.net/software/pycrypto/">pycrypto</a>.
It can easily be installed in your Django virtual environment with:</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='sh'><span class='line'>pip install pycrypto
</span></code></pre></td></tr></table></div></figure>


<p>Then, the following method allows checking of the payload singature:</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>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">Crypto.Signature</span> <span class="kn">import</span> <span class="n">PKCS1_v1_5</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">Crypto.Hash</span> <span class="kn">import</span> <span class="n">SHA</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">Crypto.PublicKey</span> <span class="kn">import</span> <span class="n">RSA</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">base64</span>
</span><span class='line'>
</span><span class='line'><span class="n">PUBLIC_KEY</span><span class="o">=</span><span class="s">&#39;&lt;Put here your public key&gt;&#39;</span>
</span><span class='line'><span class="n">VERIFY_KEY</span><span class="o">=</span> <span class="n">RSA</span><span class="o">.</span><span class="n">importKey</span><span class="p">(</span><span class="n">base64</span><span class="o">.</span><span class="n">decodestring</span><span class="p">(</span><span class="n">PUBLIC_KEY</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">verify_signature</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">signature</span><span class="p">):</span>
</span><span class='line'>    <span class="sd">&#39;&#39;&#39;Verify that signature is the result of signing message&#39;&#39;&#39;</span>
</span><span class='line'>    <span class="c"># Get the hash of the message</span>
</span><span class='line'>    <span class="n">h</span> <span class="o">=</span> <span class="n">SHA</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
</span><span class='line'>    <span class="c"># Create a verifier</span>
</span><span class='line'>    <span class="n">verifier</span> <span class="o">=</span> <span class="n">PKCS1_v1_5</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">VERIFY_KEY</span><span class="p">)</span>
</span><span class='line'>    <span class="c"># decode the signature</span>
</span><span class='line'>    <span class="n">signature</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">decodestring</span><span class="p">(</span><span class="n">signature</span><span class="p">)</span>
</span><span class='line'>    <span class="c"># verify</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">verifier</span><span class="o">.</span><span class="n">verify</span><span class="p">(</span><span class="n">h</span><span class="p">,</span> <span class="n">signature</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>In a next post, we&#8217;ll se how to make sure on the Android application side that the responses to our
requests are really coming from our server.</p>
]]></content>
  </entry>
  
</feed>
