<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title><![CDATA[renaud.io]]></title>
  <link href="http://blog.renaud.io/atom.xml" rel="self"/>
  <link href="http://blog.renaud.io/"/>
  <updated>2012-10-15T14:00:04+02:00</updated>
  <id>http://blog.renaud.io/</id>
  <author>
    <name><![CDATA[Renaud Aubin]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
    <entry>
      




<title type="html"><![CDATA[Are you kidding me? This video can't have been recorded in 1946!]]></title>
<link href="http://blog.renaud.io/2012/10/09/are-you-kidding-me-this-video-cant-have-been-recorded-in-1946/"/>
<updated>2012-10-09T01:16:00+02:00</updated>
<id>http://blog.renaud.io/2012/10/09/are-you-kidding-me-this-video-cant-have-been-recorded-in-1946</id>

      <content type="html"><![CDATA[<p><img class="right" src="http://blog.renaud.io/images/ffmpeg_android_timestamp_workaround.png"></p>

<p><span itemprop="description">Today, I made some experiment with avconv on videos made with some android devices and found out that the <code>creation_time</code> of a video of mine recorded back in june seems to be crippled since the value returned by ffprobe is <code>1946-06-26 12:30:42</code>! That can&#8217;t be possible…</span></p>

<h2>Googling time</h2>

<p>That&#8217;s strange but there are only few relevant results returned by Google on that crippled timestamp. After some digging, I found out that <a href="https://ffmpeg.org/trac/ffmpeg/ticket/1471">FFmpeg issue</a>. In fact, that&#8217;s the fourth result of a Google search on <code>android video creation_time</code> but it&#8217;s like always, you just need to find the good keywords.</p>

<h2>Matter fixed</h2>

<p>The ticket&#8217;s status is <code>closed defect: fixed</code>. OK but the issue tracker doesn&#8217;t contain any reference to the fix.</p>

<pre><code>$ git clone git://source.ffmpeg.org/ffmpeg.git
$ git log --grep=1471
[…]
commit 23eeffcd48a15e73fb2649b712870b6d101c5471
Author: Michael Niedermayer &lt;michaelni@gmx.at&gt;
Date:   Sun Jul 1 21:41:06 2012 +0200

    mov: add workaround for incorrect 0 time point.

    Fixes Ticket1471

    Signed-off-by: Michael Niedermayer &lt;michaelni@gmx.at&gt;
[…]

$ git show 23eeffcd48a15e73fb2649b712870b6d101c5471
commit 23eeffcd48a15e73fb2649b712870b6d101c5471
Author: Michael Niedermayer &lt;michaelni@gmx.at&gt;
Date:   Sun Jul 1 21:41:06 2012 +0200

    mov: add workaround for incorrect 0 time point.

    Fixes Ticket1471

    Signed-off-by: Michael Niedermayer &lt;michaelni@gmx.at&gt;

diff --git a/libavformat/mov.c b/libavformat/mov.c
index af5b126..faa8c65 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -780,7 +780,8 @@ static void mov_metadata_creation_time(AVDictionary **metadata, time_t time)
     char buffer[32];
     if (time) {
         struct tm *ptm;
-        time -= 2082844800;  /* seconds between 1904-01-01 and Epoch */
+        if(time &gt;= 2082844800)
+            time -= 2082844800;  /* seconds between 1904-01-01 and Epoch */
         ptm = gmtime(&amp;time);
         if (!ptm) return;
         strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", ptm);
</code></pre>

<p>Uh!</p>

<h2>Compile time</h2>

<p>ATTOW, the debian package version of <code>libav-tools</code> is <code>0.8.xx</code> and a <code>git log --tags --simplify-by-decoration --pretty="format:%ai %d"</code> shows that the <code>0.9</code> tag has been bumped in the late 2011… Too bad… I&#8217;ll need to compile that myself if I really wanted that <code>creation_date</code>.</p>

<h2>Update</h2>

<p>The wording of the <em>Compile time</em> is unclear at least, so:</p>

<ul>
<li><p>libav and FFmpeg has forked.</p></li>
<li><p>libav is now the default on Debian GNU/Linux.</p></li>
<li><p><code>libavformat/mov.c</code> has evolved differently but FFmpeg seems to provide a fix (that must be
verified) but that doesn&#8217;t mean that the issue has not been fixed in the libav edge, only that
I&#8217;ve found only clue that the issue has been adressed by the FFmpeg project.</p></li>
</ul>

<p><a rel="bookmark" href="http://blog.renaud.io/2012/10/09/are-you-kidding-me-this-video-cant-have-been-recorded-in-1946/">&#9875; Permalink</a></p>]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[The not so short guide to compile Android Jelly Bean 4.1.1_r4 for the Galaxy Nexus]]></title>
<link href="http://blog.renaud.io/2012/09/11/the-not-so-short-guide-to-compile-android-jelly-bean-4-dot-1-1-r4-for-the-galaxy-nexus/"/>
<updated>2012-09-11T02:30:00+02:00</updated>
<id>http://blog.renaud.io/2012/09/11/the-not-so-short-guide-to-compile-android-jelly-bean-4-dot-1-1-r4-for-the-galaxy-nexus</id>

      <content type="html"><![CDATA[<h2>Introduction</h2>

<p><span itemprop="description">Back to the beginning of this year, I succeded in compiling ICS AOSP
4.0.3_r1 for the Galaxy Nexus. At that time, I didn&#8217;t have much time to post a full entry on the
whole compilation process (including the diﬀerent hacks needed to get a fully functional ROM).</p>

<p>With the Jelly Bean AOSP release and my third ROM compilation, I&#8217;ve succesfully compiled 4.1
back in July. Now we have 4.1.1_r4 and it&#8217;s due time for me to document the process using Debian
GNU/Linux.</span></p>

<p>Without the <a href="http://source.android.com/">Android Open Source Project</a>, nothing has been possible and
the website clearly describes how to proceed to get the code and compile it for a supported
target. I will not rewrite the provided documentation but I&#8217;d rather provide a  guide on
how I have obtained my own ROM. Feel free to review and I will update accordingly.</p>

<p><em>DISCLAIMER: Please do not do anything described in this post if you have no idea of what you are
doing! I will not be held responsible for bricking your phone or invalidate your device warranty! Do
not forget to backup your data before doing anything since any issue may involve a factory reset!</em></p>

<p>My ﬁrst advices are:</p>

<ul>
<li>Browse the AOSP website</li>
<li>Read that whole post a ﬁrst time before doing anything</li>
<li>Unlock your bootloader</li>
<li>Flash clockworkmod</li>
<li>Backup your ROM</li>
</ul>


<h2>Get the Android Open Source Project code</h2>

<p>Follow the instructions given by the <a href="http://source.android.com/source/downloading.html">&#8220;Downloading the Source&#8221; section</a> of the AOSP website.</p>

<pre><code>$ mkdir ~/foo/bar/android
$ cd ~/foo/bar/android
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.1.1_r4
$ repo sync
</code></pre>

<p>These commands apply even to an existing Android source tree but you will need to clean up your source tree from a previous build by using:</p>

<pre><code>$ make clobber
</code></pre>

<p>That&#8217;s the ﬁrst step to get a JRO03L rom…</p>

<h2>Prerequisites for hardware support</h2>

<p>To get a fully functional rom, you need to get the hardware support. Unfortunately, we only have access to
the binaries distributed for the JRO03H rom <a href="https://developers.google.com/android/nexus/drivers#magurojro03h">Galaxy Nexus (GSM/HSPA+) binaries for Android 4.1.1 (JRO03H)</a>:</p>

<pre><code>$ mkdir ~/foo/android_prereq
$ cd ~/foo/android_prereq
$ export BINARIES="broadcom-maguro-jro03h-4cc54d09,imgtec-maguro-jro03h-827bcb4c,invensense-maguro-jro03h-682067a4,samsung-maguro-jro03h-0655880b"
$ curl -# -OOOO https://dl.google.com/dl/android/aosp/{${BINARIES}}.tgz
$ md5sum *
b05a41ed3096c5f19ebc5b172f034e93  broadcom-maguro-jro03h-4cc54d09.tgz
cabedd37a42a9cbe47e1702a122421e0  imgtec-maguro-jro03h-827bcb4c.tgz
c575cc3a712ef61d2ef5eb5e08f054eb  invensense-maguro-jro03h-682067a4.tgz
cda04a52492ee9762196248abb2834d1  samsung-maguro-jro03h-0655880b.tgz
$ unset BINARIES
</code></pre>

<p>Retrieve the installation scripts:</p>

<pre><code>$ cd ~/foo/bar/android
$ find ~/foo/android_prereq -maxdepth 1 -type f -exec tar xzvf {} \;
</code></pre>

<p>Finally, it is the time to extract the binaries to the source tree:</p>

<pre><code>$ for i in `ls -1 extract-*-maguro.sh`; do ./$i; done;
</code></pre>

<p><em>DISCLAIMER: You must accept the terms of each of the licences before going further!</em></p>

<h2>Initialize the build environment</h2>

<p>In the past, I&#8217;ve always compiled a <code>userdebug</code> rom. Now, I would like to get a <code>user</code> rom since I&#8217;m
happy with an unthemed and odexed rom.</p>

<pre><code>$ . build/envsetup.sh
$ lunch full_maguro-user

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.1.1
TARGET_PRODUCT=full_maguro
TARGET_BUILD_VARIANT=user
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.2.0-3-amd64-x86_64-with-debian-wheezy-sid
HOST_BUILD_TYPE=release
BUILD_ID=JRO03L
OUT_DIR=out
============================================
</code></pre>

<p>If you prefer a userdebug build, just do:</p>

<pre><code>$ . build/envsetup.sh
$ lunch full_maguro-userdebug

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.1.1
TARGET_PRODUCT=full_maguro
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.2.0-3-amd64-x86_64-with-debian-wheezy-sid
HOST_BUILD_TYPE=release
BUILD_ID=JRO03L
OUT_DIR=out
============================================
</code></pre>

<h2>Flash the bootloader and the baseband ﬁrmware to the latest versions available</h2>

<p>Get the latest factory image &#8220;yakju&#8221; for Galaxy Nexus &#8220;maguro&#8221; (GSM/HSPA+) JR003C</p>

<pre><code>$ mkdir ~/foo/android_prereq/jro03c
$ cd ~/foo/android_prereq/jro03c
$ curl -#O https://dl.google.com/dl/android/aosp/yakju-jro03c-factory-3174c1e5.tgz
</code></pre>

<p>We will need fastboot to flash images to the device. More over, since it&#8217;s the time to compile some
host utilities, we take the opportunity to get <code>adb</code> (necessary to interact with the device for
debug purposes) and the <code>simg2img</code> (usefull to convert a sparse image ﬁle to a raw image ﬁle).</p>

<pre><code>$ cd ~/foo/bar/android
$ make fastboot adb simg2img
</code></pre>

<p>The resulting host binaries could be found in the <code>~/foo/bar/android/out/host/linux-x86/bin</code>
directory.</p>

<p>If your bootloader is not already unlocked, you will need to boot in fastboot mode:</p>

<blockquote><p>Press and hold both Volume Up and Volume Down, then press and hold Power.</p><footer><strong>AOSP Website</strong> <cite>Booting Into Fastboot Mode Section for the Maguro Device</cite></footer></blockquote>


<p>We deﬁne a linux local alias to simplify the use of the brand new fastboot (using the <code>_aosp</code>
suﬃx).</p>

<pre><code>$ alias fastboot_aosp=/home/renaud/git/android_ics/out/host/linux-x86/bin/fastboot
</code></pre>

<p>Let&#8217;s get and flash the bootloader and the baseband from the JRO03C factory to the actual device:</p>

<pre><code>$ cd ~/foo/android_prereq
$ tar xzvf yakju-jro03c-factory-3174c1e5.tgz
$ tar xzf yakju-jro03c-factory-3174c1e5.tgz
$ cd yakju-jro03c
$ fastboot_aosp flash bootloader bootloader-maguro-primelc03.img
$ fastboot reboot-bootloader
$ fastboot flash radio radio-maguro-i9250xxlf1.img
$ fastboot reboot-bootloader
</code></pre>

<p>The bootloader now display:</p>

<pre><code>[…]
BOOTLOADER VERSION - PRIMELC03
BASEBAND VERSION - I9250XXLF1
[…]
</code></pre>

<h2>Getting root or injecting <code>su</code> and <code>Superuser</code> to the source tree</h2>

<p>Make a backup of the original <code>su</code> source:</p>

<pre><code>$ mkdir ~/android_backup
$ cp -rf ~/foo/bar/android/system/extras/su .
</code></pre>

<p>Then inject <a href="https://github.com/ChainsDD/su-binary">ChainsDD/su-binary</a> using my slightly modiﬁed
fork:</p>

<pre><code>$ cd ~/foo/bar/android/system/extras
$ git clone https://github.com/nibua-r/su-binary.git su
</code></pre>

<p>I want the <code>su</code> binary to be compiled in the very same time of the full AOSP
build. As a consequence, I have modiﬁed the original <code>Android.mk</code> ﬁle by setting
<code>LOCAL_MODULE_TAGS := optional</code> and adding the <code>su</code> module to <code>PRODUCT_PACKAGES</code> into the
<code>build/target/product/core.mk</code> ﬁle to force the inclusion.</p>

<p>I want to have the <a href="https://github.com/ChainsDD/Superuser">ChainsDD/Superuser</a> apk included into the
build as a system app:</p>

<pre><code>$ cd ~/foo/bar/android/packages/apps
$ git clone https://github.com/nibua-r/Superuser.git
</code></pre>

<p>and add <code>Superuser</code> to <code>PRODUCT_PACKAGES</code> into the <code>build/target/product/core.mk</code>.</p>

<p>You will need to generate your own certiﬁcate for Superuser using:</p>

<pre><code>$ cd ~/foo/bar/android
$ development/tools/make_key superuser '/C=US/ST=State/L=Location/O=YourOrg/OU=WhateverYouWant/CN=WhateverYouWant/emailAddress=root@example.org'
$ mv superuser.pk8 build/target/product/security/
</code></pre>

<p>If <code>superuser.pk8</code> is not there, the compilation process will fail… Don&#8217;t go too far away from your
computer since the Superuser compilation will require your password to get the build done.</p>

<h2>Time to compile</h2>

<p>You&#8217;ll need to read
<a href="http://source.android.com/source/building.html">the building section of the AOSP website</a> as a
prerequisite.</p>

<p>After setting <code>ccache</code> to ﬁt with your resources, just do:</p>

<pre><code>$ cd ~/foo/bar/android
$ make -j4
</code></pre>

<p>You normally end up with flashable images located in <code>out/target/product/maguro/</code>.
The whole compilation process took a very long time on my machine… so be it and be warned!</p>

<h2>Flash the images to the devices</h2>

<p>Assuming the <code>fastboot_aosp</code> alias is deﬁned and the battery of your device is decently charged,
just flash the whole system with:</p>

<pre><code>$ fastboot_aosp flashall
</code></pre>

<p>If you upgrade from a previous Android version, you should wipe your data using the <code>-w</code> switch:</p>

<pre><code>$ fastboot_aosp -w flashall
</code></pre>

<p>The whole flashing process took about 1 min. to ﬁnish on rebooting the device. Congrats! But wait,
this is not the end…</p>

<p><em>If you have clockworkmod installed on your recovery partition, flashall will overwrite it with the
 nominal android recovery.</em></p>

<h2>Flash or reflash clockworkmod recovery (for later use)</h2>

<p>The clockworkmod recovery enable us to backup and/or restore our ROMs and apply zip update ﬁles.</p>

<p>Get the <a href="http://www.clockworkmod.com/rommanager">Koushik Dutta&#8217;s clockworkmod recovery</a>
(<a href="http://download2.clockworkmod.com/recoveries/recovery-clockwork-touch-6.0.1.0-maguro.img">direct link ATTOW</a>).</p>

<h2>Some hardware parts are not properly supported!</h2>

<p>If you test the gps or the camera, you certainly are already grumbling…</p>

<p>Some binaries are distributed by Google, some aren&#8217;t and since the famous <code>extract-files.sh</code> have
been suppressed from this release, you will have to hunt down some missing libraries. You&#8217;ll need to
play with <code>find</code>/<code>sort</code>/<code>diff</code> combos to ﬁgure out which one are needed.</p>

<p>OK, but on which reference data? Remember the <code>simg2img</code> host compilation? Time to use it…</p>

<p>Some inoﬀensive linux commands:</p>

<pre><code>$ simg2img system.img system.img.raw
$ mkdir mnt-point
$ sudo mount -t ext4 -o loop system.img.raw mnt-point/
</code></pre>

<p><em>Please read the following section before hunting down the missing ﬁles…</em></p>

<h2>Where are my GApps!</h2>

<p>The GApps are not-so-useless on Android but they are not Open Source and therefore not distributed
by Google AFAIK… Considering the situation, Google seems flexible, up to now, about the various
gapps packagings out there…</p>

<p>The short version: Go get a gapps update ﬁle on <a href="http://goo.im/gapps/">Goo.im/gapps</a>
(<code>gapps-jb-20120726-signed.zip</code> ATTOW). Use <code>adb</code> to put that ﬁle on the device storage, reboot to
clockworkmod and apply…</p>

<p>You should (in not <em>must</em>) locally unzip the ﬁle to see what&#8217;s into it <em>before flashing and before
processing the previous section…</em></p>

<h2>Conclusion</h2>

<p>That post is more a personal log than a real guide and although some parts could be automated, the
manual toying is a full learning experience!</p>

<p>Have fun!</p>
<p><a rel="bookmark" href="http://blog.renaud.io/2012/09/11/the-not-so-short-guide-to-compile-android-jelly-bean-4-dot-1-1-r4-for-the-galaxy-nexus/">&#9875; Permalink</a></p>]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Integrate google-code-prettify to Enki blog (i.e. a rails 3 application)]]></title>
<link href="http://blog.renaud.io/2012/02/02/integrate-google-code-prettify-to-enki-blog-i-e-a-rails-3-application/"/>
<updated>2012-02-02T23:20:00+01:00</updated>
<id>http://blog.renaud.io/2012/02/02/integrate-google-code-prettify-to-enki-blog-i-e-a-rails-3-application</id>

      <content type="html"><![CDATA[<p><span itemprop="description">This blog is powered by <a href="http://www.enkiblog.com/">Enki</a> and as technical blog, I&#8217;d like to insert some code snippets to the entries. As a rails 3 application, integrating <a href="http://code.google.com/p/google-code-prettify/">google-code-prettify</a> is relatively simple.</span></p>

<p>First download the installation bundle (I experienced some difficulties, with perl, to make a distribution package from the svn):</p>

<pre><code>$ curl --progress-bar -o prettify-1-Jun-2011.tar.bz2 \
    http://google-code-prettify.googlecode.com/files/prettify-1-Jun-2011.tar.bz2
</code></pre>

<p>Now, copy the <code>.js</code> and the <code>pretiffy.css</code> to your rails application public folder:</p>

<pre><code>$ cd google-code-prettify/distrib/google-code-prettify
$ cp *.js /path/to/my/railsapp/public/javascripts/
$ cp prettify.css public/stylesheets/
</code></pre>

<p>You can use <a href="http://google-code-prettify.googlecode.com/svn/trunk/styles/index.html">one of the other styles</a> by using the corresponding <code>.css</code> file.</p>

<p>Insert <code>&lt;%= stylesheet_link_tag 'prettify' %&gt;</code> and <code>&lt;%= javascript_include_tag 'prettify' %&gt;</code> within
the <code>head</code> element of your <code>/path/to/my/railsapp/app/views/layouts/application.html.erb</code> file. Add
the <code>onLoad="prettyPrint()"</code> attribute to the <code>body</code> element.</p>

<p>Test and enjoy the efficient syntax highlighting!</p>
<p><a rel="bookmark" href="http://blog.renaud.io/2012/02/02/integrate-google-code-prettify-to-enki-blog-i-e-a-rails-3-application/">&#9875; Permalink</a></p>]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[ViewPager &amp; the verticality of Fragments]]></title>
<link href="http://blog.renaud.io/2012/01/12/viewpager-and-the-verticality-of-fragments/"/>
<updated>2012-01-12T20:31:00+01:00</updated>
<id>http://blog.renaud.io/2012/01/12/viewpager-and-the-verticality-of-fragments</id>

      <content type="html"><![CDATA[<p><img class="right" src="http://blog.renaud.io/images/verticality.png"></p>

<p><span itemprop="description">Back to august 2010, <a href="https://plus.google.com/115995639636688350464/posts">Rich Hyndman</a> posts an <a href="http://android-developers.blogspot.com/2011/08/horizontal-view-swiping-with-viewpager.html">entry on the android developers&#8217; blog</a> entitled &#8220;Horizontal View Swiping with ViewPager&#8221;. I already was really enthusiastic about the Android Support Package at that time because of the introduction of the LoaderManager which save us big headaches on the proper cursor management (but that&#8217;s another story). In an application of mine, I&#8217;ve used an onFling/swipe gesture based on some 2009 codes found on the Web (<a href="http://www.codeshogun.com/blog/2009/04/16/how-to-implement-swipe-action-in-android/">codeshogun.com</a> and/or <a href="http://www.ceveni.com/2009/08/android-gestures-detection-sample-code.html">ceveni.com</a> for example).</span></p>

<p>The main drawbacks on my onFling approach and implementation are:</p>

<ol>
<li>That is based on a threshold velocity</li>
<li>Once initiated, the animation goes on and can&#8217;t be reversed</li>
<li>The gesture is the trigger of a startActivity call and each of those activities are… activities!</li>
</ol>


<p>Surely my onFling implementation was too dumb and since I read Rich&#8217;s post, I have the secret personal project to use the ViewPager and one of the underlying adapters to reimplement that ugly onFling part of our application.</p>

<p>Well, the time has come with the Christmas holidays!</p>

<p>The point is that my onFling-based activity is now composed by two fragment and the FragmentPagerAdapter is nice but manage only one Fragment as a ViewPager current page content.</p>

<p>Now, what if a want a vertical stack of several fragments? ⇒ Read and adapt the FragmentPagerAdapter source code from the Support Package (compact version without comments):</p>

<figure class='code'><div class='highlight'><table><td class='gutter'><pre class='line-numbers'><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
<span class='line-number'>124</span>
<span class='line-number'>125</span>
<span class='line-number'>126</span>
<span class='line-number'>127</span>
<span class='line-number'>128</span>
<span class='line-number'>129</span>
<span class='line-number'>130</span>
<span class='line-number'>131</span>
<span class='line-number'>132</span>
<span class='line-number'>133</span>
<span class='line-number'>134</span>
<span class='line-number'>135</span>
<span class='line-number'>136</span>
<span class='line-number'>137</span>
<span class='line-number'>138</span>
<span class='line-number'>139</span>
<span class='line-number'>140</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">VerticalFragmentsPagerAdapter</span> <span class="kd">extends</span> <span class="n">PagerAdapter</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">TAG</span> <span class="o">=</span> <span class="s">&quot;VerticalFragmentsPagerAdapter&quot;</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">boolean</span> <span class="n">DEBUG</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kd">final</span> <span class="n">FragmentManager</span> <span class="n">mFragmentManager</span><span class="o">;</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">mRows</span><span class="o">;</span>
</span><span class='line'>    <span class="kd">private</span> <span class="n">FragmentTransaction</span> <span class="n">mCurTransaction</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>    <span class="kd">private</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Fragment</span><span class="o">&gt;</span> <span class="n">mCurrentPrimaryItem</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">VerticalFragmentsPagerAdapter</span><span class="o">(</span><span class="n">FragmentManager</span> <span class="n">fm</span><span class="o">,</span> <span class="kt">int</span> <span class="n">rows</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">mFragmentManager</span> <span class="o">=</span> <span class="n">fm</span><span class="o">;</span>
</span><span class='line'>        <span class="n">mRows</span> <span class="o">=</span> <span class="n">rows</span><span class="o">;</span>
</span><span class='line'>        <span class="n">mCurrentPrimaryItem</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Fragment</span><span class="o">&gt;(</span><span class="n">mRows</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Return the Fragments associated with a specified position.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">abstract</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Fragment</span><span class="o">&gt;</span> <span class="n">getItem</span><span class="o">(</span><span class="kt">int</span> <span class="n">position</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">startUpdate</span><span class="o">(</span><span class="n">ViewGroup</span> <span class="n">container</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="n">Object</span> <span class="nf">instantiateItem</span><span class="o">(</span><span class="n">ViewGroup</span> <span class="n">container</span><span class="o">,</span> <span class="kt">int</span> <span class="n">position</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="o">(</span><span class="n">mCurTransaction</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">mCurTransaction</span> <span class="o">=</span> <span class="n">mFragmentManager</span><span class="o">.</span><span class="na">beginTransaction</span><span class="o">();</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">Context</span> <span class="n">ctx</span> <span class="o">=</span> <span class="n">container</span><span class="o">.</span><span class="na">getContext</span><span class="o">();</span>
</span><span class='line'>        <span class="n">LayoutInflater</span> <span class="n">inflater</span> <span class="o">=</span>
</span><span class='line'>                <span class="o">(</span><span class="n">LayoutInflater</span><span class="o">)</span> <span class="n">ctx</span><span class="o">.</span><span class="na">getSystemService</span><span class="o">(</span><span class="n">Context</span><span class="o">.</span><span class="na">LAYOUT_INFLATER_SERVICE</span><span class="o">);</span>
</span><span class='line'>        <span class="n">View</span> <span class="n">layout</span> <span class="o">=</span> <span class="n">inflater</span><span class="o">.</span><span class="na">inflate</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">layout</span><span class="o">.</span><span class="na">pager</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span>
</span><span class='line'>        <span class="n">layout</span><span class="o">.</span><span class="na">setId</span><span class="o">(</span><span class="mi">6109</span> <span class="o">+</span> <span class="n">position</span><span class="o">);</span>
</span><span class='line'>        <span class="n">LinearLayout</span> <span class="n">ll</span> <span class="o">=</span> <span class="o">(</span><span class="n">LinearLayout</span><span class="o">)</span> <span class="n">layout</span><span class="o">.</span><span class="na">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">pager_linear_layout</span><span class="o">);</span>
</span><span class='line'>        <span class="n">ll</span><span class="o">.</span><span class="na">setId</span><span class="o">(</span><span class="mi">900913</span> <span class="o">+</span> <span class="n">position</span><span class="o">);</span>
</span><span class='line'>        <span class="o">((</span><span class="n">ViewPager</span><span class="o">)</span> <span class="n">container</span><span class="o">).</span><span class="na">addView</span><span class="o">(</span><span class="n">layout</span><span class="o">);</span>
</span><span class='line'>        <span class="n">Fragment</span> <span class="n">firstFragment</span> <span class="o">=</span>
</span><span class='line'>                <span class="n">mFragmentManager</span><span class="o">.</span><span class="na">findFragmentByTag</span><span class="o">(</span>
</span><span class='line'>                        <span class="n">makeFragmentName</span><span class="o">(</span><span class="n">container</span><span class="o">.</span><span class="na">getId</span><span class="o">(),</span> <span class="n">position</span><span class="o">,</span> <span class="mi">0</span><span class="o">));</span>
</span><span class='line'>        <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Fragment</span><span class="o">&gt;</span> <span class="n">frags</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="o">(</span><span class="n">firstFragment</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">frags</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Fragment</span><span class="o">&gt;(</span><span class="n">mRows</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">mRows</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">frags</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">mFragmentManager</span><span class="o">.</span><span class="na">findFragmentByTag</span><span class="o">(</span>
</span><span class='line'>                        <span class="n">makeFragmentName</span><span class="o">(</span><span class="n">container</span><span class="o">.</span><span class="na">getId</span><span class="o">(),</span> <span class="n">position</span><span class="o">,</span> <span class="n">i</span><span class="o">)));</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">for</span> <span class="o">(</span><span class="n">Fragment</span> <span class="n">f</span> <span class="o">:</span> <span class="n">frags</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">DEBUG</span><span class="o">)</span> <span class="n">Log</span><span class="o">.</span><span class="na">v</span><span class="o">(</span><span class="n">TAG</span><span class="o">,</span> <span class="s">&quot;Attaching item #&quot;</span> <span class="o">+</span> <span class="n">position</span> <span class="o">+</span> <span class="s">&quot;: f=&quot;</span> <span class="o">+</span> <span class="n">f</span><span class="o">);</span>
</span><span class='line'>                <span class="n">mCurTransaction</span><span class="o">.</span><span class="na">attach</span><span class="o">(</span><span class="n">f</span><span class="o">);</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>        <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">frags</span> <span class="o">=</span> <span class="n">getItem</span><span class="o">(</span><span class="n">position</span><span class="o">);</span>
</span><span class='line'>            <span class="kt">int</span> <span class="n">currentRow</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">for</span> <span class="o">(</span><span class="n">Fragment</span> <span class="n">f</span> <span class="o">:</span> <span class="n">frags</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">DEBUG</span><span class="o">)</span> <span class="n">Log</span><span class="o">.</span><span class="na">v</span><span class="o">(</span><span class="n">TAG</span><span class="o">,</span> <span class="s">&quot;instanciateItem / Adding item #&quot;</span> <span class="o">+</span> <span class="n">position</span> <span class="o">+</span> <span class="s">&quot;: f= &quot;</span> <span class="o">+</span> <span class="n">f</span><span class="o">);</span>
</span><span class='line'>                <span class="n">mCurTransaction</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">ll</span><span class="o">.</span><span class="na">getId</span><span class="o">(),</span> <span class="n">f</span><span class="o">,</span>
</span><span class='line'>                        <span class="n">makeFragmentName</span><span class="o">(</span><span class="n">container</span><span class="o">.</span><span class="na">getId</span><span class="o">(),</span> <span class="n">position</span><span class="o">,</span> <span class="n">currentRow</span><span class="o">));</span>
</span><span class='line'>                <span class="n">currentRow</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">if</span> <span class="o">(</span><span class="n">frags</span> <span class="o">!=</span> <span class="n">mCurrentPrimaryItem</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="k">for</span> <span class="o">(</span><span class="n">Fragment</span> <span class="n">f</span> <span class="o">:</span> <span class="n">frags</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">f</span><span class="o">.</span><span class="na">setMenuVisibility</span><span class="o">(</span><span class="kc">false</span><span class="o">);</span>
</span><span class='line'>                <span class="n">f</span><span class="o">.</span><span class="na">setUserVisibleHint</span><span class="o">(</span><span class="kc">false</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">layout</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">destroyItem</span><span class="o">(</span><span class="n">ViewGroup</span> <span class="n">container</span><span class="o">,</span> <span class="kt">int</span> <span class="n">position</span><span class="o">,</span> <span class="n">Object</span> <span class="n">object</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">mCurTransaction</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">mCurTransaction</span> <span class="o">=</span> <span class="n">mFragmentManager</span><span class="o">.</span><span class="na">beginTransaction</span><span class="o">();</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">mRows</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="o">(</span><span class="n">DEBUG</span><span class="o">)</span> <span class="n">Log</span><span class="o">.</span><span class="na">v</span><span class="o">(</span><span class="n">TAG</span><span class="o">,</span> <span class="s">&quot;destroyItem / Detaching item #&quot;</span> <span class="o">+</span> <span class="n">position</span> <span class="o">+</span> <span class="s">&quot;: row=&quot;</span> <span class="o">+</span> <span class="n">i</span><span class="o">);</span>
</span><span class='line'>            <span class="n">mCurTransaction</span><span class="o">.</span><span class="na">detach</span><span class="o">(</span>
</span><span class='line'>                    <span class="n">mFragmentManager</span><span class="o">.</span><span class="na">findFragmentByTag</span><span class="o">(</span>
</span><span class='line'>                            <span class="n">makeFragmentName</span><span class="o">(</span><span class="n">container</span><span class="o">.</span><span class="na">getId</span><span class="o">(),</span> <span class="n">position</span><span class="o">,</span> <span class="n">i</span><span class="o">)));</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>        <span class="o">((</span><span class="n">ViewPager</span><span class="o">)</span> <span class="n">container</span><span class="o">).</span><span class="na">removeView</span><span class="o">((</span><span class="n">View</span><span class="o">)</span><span class="n">object</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">setPrimaryItem</span><span class="o">(</span><span class="n">ViewGroup</span> <span class="n">container</span><span class="o">,</span> <span class="kt">int</span> <span class="n">position</span><span class="o">,</span> <span class="n">Object</span> <span class="n">object</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Fragment</span><span class="o">&gt;</span> <span class="n">frags</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Fragment</span><span class="o">&gt;(</span><span class="n">mRows</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">mRows</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">frags</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">mFragmentManager</span><span class="o">.</span><span class="na">findFragmentByTag</span><span class="o">(</span>
</span><span class='line'>                    <span class="n">makeFragmentName</span><span class="o">(</span><span class="n">container</span><span class="o">.</span><span class="na">getId</span><span class="o">(),</span> <span class="n">position</span><span class="o">,</span> <span class="n">i</span><span class="o">)));</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="o">(!</span><span class="n">frags</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">mCurrentPrimaryItem</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">mCurrentPrimaryItem</span><span class="o">.</span><span class="na">isEmpty</span><span class="o">()</span> <span class="o">&amp;&amp;</span> <span class="o">(</span><span class="n">mCurrentPrimaryItem</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">)</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">))</span> <span class="o">{</span>
</span><span class='line'>                <span class="k">for</span> <span class="o">(</span><span class="n">Fragment</span> <span class="n">f</span> <span class="o">:</span> <span class="n">mCurrentPrimaryItem</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                    <span class="n">f</span><span class="o">.</span><span class="na">setMenuVisibility</span><span class="o">(</span><span class="kc">false</span><span class="o">);</span>
</span><span class='line'>                    <span class="n">f</span><span class="o">.</span><span class="na">setUserVisibleHint</span><span class="o">(</span><span class="kc">false</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">if</span> <span class="o">(!</span><span class="n">frags</span><span class="o">.</span><span class="na">isEmpty</span><span class="o">()</span> <span class="o">&amp;&amp;</span> <span class="o">(</span><span class="n">frags</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">)</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">))</span> <span class="o">{</span>
</span><span class='line'>                <span class="k">for</span> <span class="o">(</span><span class="n">Fragment</span> <span class="n">f</span> <span class="o">:</span> <span class="n">frags</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                    <span class="n">f</span><span class="o">.</span><span class="na">setMenuVisibility</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
</span><span class='line'>                    <span class="n">f</span><span class="o">.</span><span class="na">setUserVisibleHint</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
</span><span class='line'>                <span class="o">}</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>            <span class="n">mCurrentPrimaryItem</span> <span class="o">=</span> <span class="o">(</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Fragment</span><span class="o">&gt;)</span> <span class="n">frags</span><span class="o">.</span><span class="na">clone</span><span class="o">();</span>
</span><span class='line'>            <span class="k">if</span> <span class="o">(</span><span class="n">DEBUG</span><span class="o">)</span> <span class="n">Log</span><span class="o">.</span><span class="na">v</span><span class="o">(</span><span class="n">TAG</span><span class="o">,</span> <span class="s">&quot;setPrimaryItem #&quot;</span> <span class="o">+</span> <span class="n">position</span> <span class="o">+</span> <span class="s">&quot;: &quot;</span> <span class="o">+</span> <span class="n">mCurrentPrimaryItem</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="nd">@Override</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">finishUpdate</span><span class="o">(</span><span class="n">ViewGroup</span> <span class="n">container</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">mCurTransaction</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">mCurTransaction</span><span class="o">.</span><span class="na">commitAllowingStateLoss</span><span class="o">();</span>
</span><span class='line'>            <span class="n">mCurTransaction</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>            <span class="n">mFragmentManager</span><span class="o">.</span><span class="na">executePendingTransactions</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="nd">@Override</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">isViewFromObject</span><span class="o">(</span><span class="n">View</span> <span class="n">view</span><span class="o">,</span> <span class="n">Object</span> <span class="n">object</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="n">view</span> <span class="o">==</span> <span class="o">((</span><span class="n">View</span><span class="o">)</span> <span class="n">object</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="n">Parcelable</span> <span class="nf">saveState</span><span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="kc">null</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">restoreState</span><span class="o">(</span><span class="n">Parcelable</span> <span class="n">state</span><span class="o">,</span> <span class="n">ClassLoader</span> <span class="n">loader</span><span class="o">)</span> <span class="o">{}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">static</span> <span class="n">String</span> <span class="nf">makeFragmentName</span><span class="o">(</span><span class="kt">int</span> <span class="n">viewId</span><span class="o">,</span> <span class="kt">int</span> <span class="n">index</span><span class="o">,</span> <span class="kt">int</span> <span class="n">subindex</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s">&quot;android:switcher:&quot;</span> <span class="o">+</span> <span class="n">viewId</span> <span class="o">+</span> <span class="s">&quot;:&quot;</span> <span class="o">+</span> <span class="n">index</span> <span class="o">+</span> <span class="s">&quot;:&quot;</span> <span class="o">+</span> <span class="n">subindex</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>This implementation uses ArrayList as the fragments&#8217; container. The trick here is that instead of returning a fragment from instanciateItem, I return a  containing a LinearLayout.</p>

<p>Be warned: don&#8217;t use several instances of the same fragment for a given position! That adapter is not designed to do that…</p>

<p>From the above code, it&#8217;s now trivial to figure out how to extends that adapter: &#8220;Uh… the <code>getItem</code> should return an ArrayList of Fragments?&#8221; − &#8220;Yup!&#8221;</p>

<p>A trivial example is available on <a href="https://github.com/nibua-r/org.summo.blog.verticality">github</a>. Just clone and run <code>ant debug &amp;&amp; ant installd</code>… Feel free to fork, improve and return your feedback.</p>
<p><a rel="bookmark" href="http://blog.renaud.io/2012/01/12/viewpager-and-the-verticality-of-fragments/">&#9875; Permalink</a></p>]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Add Google Analytics to Enki blog (i.e. a rails 3 application)]]></title>
<link href="http://blog.renaud.io/2011/11/20/add-google-analytics-to-enki-blog-i-e-a-rails-3-application/"/>
<updated>2011-11-20T15:23:00+01:00</updated>
<id>http://blog.renaud.io/2011/11/20/add-google-analytics-to-enki-blog-i-e-a-rails-3-application</id>

      <content type="html"><![CDATA[<p><span itemprop="description">This blog is powered by <a href="http://www.enkiblog.com/">Enki</a> and I&#8217;d like to monitor the (absence of?) frequentation. As a rails 3 application, integrating <a href="http://www.google.com/analytics/index.html">Google Analytics</a> is dead simple thanks to the <a href="http://rubygems.org/gems/rack-google_analytics">rack-google_analytics ruby gem</a> and <a href="https://github.com/ambethia/rack-google_analytics#readme">the associated documentation</a></span></p>

<p>Just add the following to your <code>Gemfile</code>:</p>

<figure class='code'><div class='highlight'><table><td class='gutter'><pre class='line-numbers'><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">group</span> <span class="ss">:production</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">gem</span> <span class="s1">&#39;rack-google_analytics&#39;</span><span class="p">,</span> <span class="ss">:require</span> <span class="o">=&gt;</span> <span class="s2">&quot;rack/google_analytics&quot;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>and this conﬁguration entry to your <code>config/environments/production.rb</code>:</p>

<figure class='code'><div class='highlight'><table><td class='gutter'><pre class='line-numbers'><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># Configure Rack::GoogleAnalytics</span>
</span><span class='line'><span class="n">config</span><span class="o">.</span><span class="n">middleware</span><span class="o">.</span><span class="n">use</span><span class="p">(</span><span class="s2">&quot;Rack::GoogleAnalytics&quot;</span><span class="p">,</span> <span class="ss">:web_property_id</span> <span class="o">=&gt;</span> <span class="s2">&quot;UA-12345678-1&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>with the <code>web_property_id</code> provided by Analytics.</p>

<p>I told you: dead simple!</p>
<p><a rel="bookmark" href="http://blog.renaud.io/2011/11/20/add-google-analytics-to-enki-blog-i-e-a-rails-3-application/">&#9875; Permalink</a></p>]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[QR codes − From strings to a full-ﬂedged pdf ﬁle]]></title>
<link href="http://blog.renaud.io/2011/11/19/qr-codes-from-strings-to-a-full-fledged-pdf-file/"/>
<updated>2011-11-19T01:10:00+01:00</updated>
<id>http://blog.renaud.io/2011/11/19/qr-codes-from-strings-to-a-full-fledged-pdf-file</id>

      <content type="html"><![CDATA[<p><img class="right" src="http://blog.renaud.io/images/qr.png"></p>

<p><span itemprop="description">Last days at work, we integrate some QR codes recognition development on android using <a href="http://code.google.com/p/zxing/">ZXing</a>. Although we have a special printer, we need some test cases and a standalone solution to generate and print out several QR codes on a standard printer. At ﬁrst, a colleague of mine has used some online QR generator but it does not scale very well. Fortunately, a C library and a derived command line tool exists in the <a href="http://fukuchi.org/works/qrencode/index.en.html">libqrencode project</a>, thanks to Kentaro Fukuchi. Moreover, that&#8217;s packaged on debian…</span></p>

<p>qrencode is the right tool, the unix way. However, our use case requires that we get an organized output for testing. To be more speciﬁc, we need to sequentially recognize several sets of QR codes.</p>

<h2>Black box description</h2>

<p>The input is a sequence of strings. As for the output, I need to obtain a standalone printed document. As a consequence, I choose to use the pdf format to not be bothered with any printing issue, even if the content is pure raster.</p>

<h2>Input data sample</h2>

<p>I will not provide there my real data. The sample data are:</p>

<ol>
<li>Lorem ipsum dolor sit amet duis mattis ullamcorper ultricies aliquam sit amet vestibulum augue</li>
<li>Aenean ut orci eget nisi tincidunt pulvinar</li>
<li>Aenean eleifend tellus ac lacus convallis fermentum</li>
</ol>


<h2>Be prepared…</h2>

<p>I have already used ImageMagick in the past to do composition and conversion operations and my feelings at the beginning were that ImageMagick is all I need to get my formatted output.</p>

<p>Obviously, we need to install qrencode and ImageMagick (and the associated verbose documentation):</p>

<pre><code>$ sudo apt-get install qrencode imagemagick imagemagick-doc
</code></pre>

<p>But, wait, I need a multipage pdf in the end. I certainly need some pdf merging tool. Go with the installation of pdfsam then:</p>

<pre><code>$ sudo apt-get install pdfsam
</code></pre>

<h2>QR codes generation with human-readable label</h2>

<p>Pretty straightforward. An example on the ﬁrst dataset:</p>

<figure class='code'><div class='highlight'><table><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='bash'><span class='line'><span class="k">for </span>i in lorem ipsum dolor sit amet duis mattis ullamcorper
</span><span class='line'><span class="k">do</span>
</span><span class='line'><span class="k">    </span>qrencode -l Q -s 20 -m 10 -o <span class="nv">$i</span>.png <span class="nv">$i</span>
</span><span class='line'>    composite -geometry +0+40 -font Lucida-Sans-Typewriter-Regular -pointsize 40 <span class="se">\</span>
</span><span class='line'>        -gravity north label:<span class="s2">&quot;${i}&quot;</span> <span class="nv">$i</span>.png <span class="nv">$i</span>.png
</span><span class='line'><span class="k">done</span>
</span></code></pre></td></tr></table></div></figure>


<p>The <code>qrencode</code> call is to generate each png from a single string. The <code>-l Q</code> option is to set the error correction level to Q (25% of codewords can be restored), <code>-s 20</code> is to specify the size of dot and <code>-m 10</code> is to set the margin width.</p>

<p>ImageMagick <code>composite</code> is used to add a human-readable label to each png. The <code>Lucida-Sans-Typewriter-Regular</code> font is provided by the <code>sun-java6-fonts</code> debian package. You can use whatever font you like as listed by <code>identify -list font</code>.</p>

<h2>Generate a multipage pdf ﬁle for each dataset</h2>

<p>From the generated png ﬁles, we use ImageMagick <code>montage</code> to arrange a multipage pdf (2 rows / 3 columns) with the following command:</p>

<pre><code>$ montage -page A4+20-20 -tile 2x3 -geometry +1+1 \
  -transparent white 'input files' \
  -font Lucida-Sans-Typewriter-Regular -pointsize 40 \
  -title "A title" output.pdf
</code></pre>

<p>with <code>input files</code> the list of the png input ﬁles. The <code>-transparent white</code> option is really important to enable the correct insertion of the title. Without that option, the title would be overridden by the white pixels of the input ﬁles.</p>

<h2>Putting it all together and merge the result to a standalone pdf ﬁle</h2>

<p>Once we have the intermediate pdf ﬁles, it is simple to merge them into one using <code>pdfsam-console</code>. The ﬁnal quick-and-dirty bash script is:</p>

<figure class='code'><div class='highlight'><table><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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#!/bin/bash</span>
</span><span class='line'>
</span><span class='line'><span class="nv">LABEL</span><span class="o">=(</span><span class="s2">&quot;first&quot;</span> <span class="s2">&quot;second&quot;</span> <span class="s2">&quot;third&quot;</span><span class="o">)</span>
</span><span class='line'><span class="nv">DATA</span><span class="o">=(</span><span class="s2">&quot;Lorem ipsum dolor sit amet duis mattis ullamcorper ultricies aliquam sit amet vestibulum augue&quot;</span> <span class="se">\</span>
</span><span class='line'>    <span class="s2">&quot;Aenean ut orci eget nisi tincidunt pulvinar&quot;</span> <span class="se">\</span>
</span><span class='line'>    <span class="s2">&quot;Aene eleifend tellus ac lacus convallis fermentum&quot;</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'><span class="nv">dataLen</span><span class="o">=</span><span class="k">${#</span><span class="nv">DATA</span><span class="p">[@]</span><span class="k">}</span>
</span><span class='line'>
</span><span class='line'><span class="nv">FILE</span><span class="o">=()</span>
</span><span class='line'>
</span><span class='line'><span class="k">for</span> <span class="o">((</span> <span class="nv">j</span><span class="o">=</span>0; j&lt;<span class="k">${</span><span class="nv">dataLen</span><span class="k">}</span>; j++ <span class="o">))</span>;
</span><span class='line'><span class="k">do</span>
</span><span class='line'><span class="k">    for </span>i in <span class="k">${</span><span class="nv">DATA</span><span class="p">[</span><span class="nv">$j</span><span class="p">]</span><span class="k">}</span>
</span><span class='line'>    <span class="k">do</span>
</span><span class='line'>        <span class="c"># Generate the QR codes</span>
</span><span class='line'>        qrencode -l Q -s 5 -m 50 -o <span class="nv">$i</span>.png <span class="nv">$i</span>
</span><span class='line'>        <span class="c"># Add a human-readable label</span>
</span><span class='line'>        composite -geometry +0+40 -font Lucida-Sans-Typewriter-Regular -pointsize 40 <span class="se">\</span>
</span><span class='line'>            -gravity north label:<span class="s2">&quot;${i}&quot;</span> <span class="nv">$i</span>.png <span class="nv">$i</span>.png
</span><span class='line'>        FILE<span class="o">[</span><span class="nv">$j</span><span class="o">]=</span><span class="s2">&quot;${FILE[$j]} ${i}.png&quot;</span>
</span><span class='line'>    <span class="k">done</span>
</span><span class='line'>    <span class="c"># Assemble them into a pdf</span>
</span><span class='line'>    montage -page A4+20-20 -tile 2x3 -geometry +1+1 -transparent white <span class="k">${</span><span class="nv">FILE</span><span class="p">[</span><span class="nv">$j</span><span class="p">]</span><span class="k">}</span> <span class="se">\</span>
</span><span class='line'>        -font Lucida-Sans-Typewriter-Regular -pointsize 40 <span class="se">\</span>
</span><span class='line'>        -title <span class="s2">&quot;${LABEL[$j]}&quot;</span> <span class="k">${</span><span class="nv">LABEL</span><span class="p">[</span><span class="nv">$j</span><span class="p">]</span><span class="k">}</span>.pdf
</span><span class='line'><span class="k">done</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Create the final pdf</span>
</span><span class='line'><span class="k">if</span> <span class="o">[</span> -f output.pdf <span class="o">]</span>; <span class="k">then </span>rm -rf <span class="nv">$PWD</span>/output.pdf; <span class="k">fi</span>;
</span><span class='line'>pdfsam-console -o <span class="nv">$PWD</span>/output.pdf -d <span class="nv">$PWD</span>/ concat
</span><span class='line'>
</span><span class='line'><span class="c"># Delete all the intermediate files</span>
</span><span class='line'><span class="k">for </span>i in <span class="k">${</span><span class="nv">DATA</span><span class="p">[@]</span><span class="k">}</span>; <span class="k">do </span>rm -rf <span class="k">${</span><span class="nv">i</span><span class="k">}</span>.png ;<span class="k">done</span>;
</span><span class='line'><span class="k">for</span> <span class="o">((</span> <span class="nv">i</span><span class="o">=</span>0; i&lt;<span class="k">${</span><span class="nv">dataLen</span><span class="k">}</span>; i++ <span class="o">))</span>; <span class="k">do </span>rm -rf <span class="k">${</span><span class="nv">LABEL</span><span class="p">[</span><span class="nv">$i</span><span class="p">]</span><span class="k">}</span>.pdf; <span class="k">done</span>;
</span></code></pre></td></tr></table></div></figure>


<p>Check out <a href="http://blog.renaud.io/data/qr.pdf">the resulting pdf ﬁle</a>… Et voilà !</p>
<p><a rel="bookmark" href="http://blog.renaud.io/2011/11/19/qr-codes-from-strings-to-a-full-fledged-pdf-file/">&#9875; Permalink</a></p>]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Build and setup GNU Emacs 24 from git the alternatives way on Debian GNU/Linux]]></title>
<link href="http://blog.renaud.io/2011/11/01/build-and-setup-gnu-emacs-24-from-git-the-alternatives-way-on-debian-gnu-linux/"/>
<updated>2011-11-01T00:17:00+01:00</updated>
<id>http://blog.renaud.io/2011/11/01/build-and-setup-gnu-emacs-24-from-git-the-alternatives-way-on-debian-gnu-linux</id>

      <content type="html"><![CDATA[<h2>Get the source from the Savannah git repository</h2>

<p>I am just interested in the recent history and would like to save some precious bandwidth, so I just use <code>--depth 1</code> to get <em>only</em> what is needed:</p>

<pre><code>$ git clone --depth 1 git://git.savannah.gnu.org/emacs.git
</code></pre>

<h2>Build</h2>

<p>An <code>./autogen.sh</code> is needed to generate the <code>configure</code> script:</p>

<pre><code>$ cd emacs
$ ./autogen.sh
</code></pre>

<p>I have some emacs binary packages installed, so I have chosen to install my new emacs to <code>/usr/local</code>. Moreover, I have the gtk3 dev packages. As a consequence, my <code>configure</code> call is:</p>

<pre><code>$ ./configure --prefix=/usr/local --with-x-toolkit=gtk3
</code></pre>

<p>At this step, you will have to retrieve the required and wanted <code>libWhatTheF**k-dev</code> dependencies by yourself…
For me, the <code>configure</code> step returns with:</p>

<pre><code>Configured for `x86_64-unknown-linux-gnu'.

  Where should the build process find the source code?    /foo/bar/git/emacs
  What operating system and machine description files should Emacs use?
        `s/gnu-linux.h' and `m/amdx86-64.h'
  What compiler should emacs be built with?               gcc -std=gnu99 -g -O2
  Should Emacs use the GNU version of malloc?             yes
      (Using Doug Lea's new malloc from the GNU C Library.)
  Should Emacs use a relocating allocator for buffers?    no
  Should Emacs use mmap(2) for buffer allocation?         no
  What window system should Emacs use?                    x11
  What toolkit should Emacs use?                          GTK
  Where do we find X Windows header files?                Standard dirs
  Where do we find X Windows libraries?                   Standard dirs
  Does Emacs use -lXaw3d?                                 no
  Does Emacs use -lXpm?                                   yes
  Does Emacs use -ljpeg?                                  yes
  Does Emacs use -ltiff?                                  yes
  Does Emacs use a gif library?                           yes -lgif
  Does Emacs use -lpng?                                   yes
  Does Emacs use -lrsvg-2?                                yes
  Does Emacs use imagemagick?                             yes
  Does Emacs use -lgpm?                                   yes
  Does Emacs use -ldbus?                                  yes
  Does Emacs use -lgconf?                                 yes
  Does Emacs use GSettings?                               yes
  Does Emacs use -lselinux?                               yes
  Does Emacs use -lgnutls (2.6.x or higher)?              yes
  Does Emacs use -lxml2?                                  yes
  Does Emacs use -lfreetype?                              yes
  Does Emacs use -lm17n-flt?                              yes
  Does Emacs use -lotf?                                   yes
  Does Emacs use -lxft?                                   yes
  Does Emacs use toolkit scroll bars?                     yes
</code></pre>

<p>Now, just compile, install and fix <code>blessmail</code> as required using:</p>

<pre><code>$ make all &amp;&amp; make install
$ sudo lib-src/blessmail /usr/local/libexec/emacs/24.0.91/x86_64-unknown-linux-gnu/movemail
</code></pre>

<h2>Configure Debian GNU/Linux to use your brand new emacs</h2>

<p>Rename your new binaries with the following bash script (reusable after each recompilation):</p>

<figure class='code'><div class='highlight'><table><td class='gutter'><pre class='line-numbers'><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="k">for </span>i in etags ctags emacsclient ebrowse rcs-checkin grep-changelog emacs
</span><span class='line'><span class="k">do</span>
</span><span class='line'><span class="k">    if</span> <span class="o">[</span> -f /usr/local/bin/<span class="nv">$i</span> <span class="o">]</span>; <span class="k">then</span>
</span><span class='line'><span class="k">        if</span> <span class="o">[</span> -f /usr/local/bin/<span class="nv">$i</span>.emacs24 <span class="o">]</span>; <span class="k">then</span>
</span><span class='line'><span class="k">            </span>rm /usr/local/bin/<span class="nv">$i</span>.emacs24
</span><span class='line'>        <span class="k">fi</span>
</span><span class='line'><span class="k">        </span>mv /usr/local/bin/<span class="nv">$i</span> /usr/local/bin/<span class="nv">$i</span>.emacs24
</span><span class='line'>    <span class="k">fi</span>
</span><span class='line'><span class="k">done</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="o">[</span> -f /usr/local/bin/emacs.emacs24 <span class="o">]</span>; <span class="k">then</span>
</span><span class='line'><span class="k">    if</span> <span class="o">[</span> -f /usr/local/bin/emacs24-x <span class="o">]</span>; <span class="k">then</span>
</span><span class='line'><span class="k">        </span>rm /usr/local/bin/emacs24-x
</span><span class='line'>    <span class="k">fi</span>
</span><span class='line'><span class="k">    </span>ln -s /usr/local/bin/emacs.emacs24 /usr/local/bin/emacs24-x
</span><span class='line'><span class="k">fi</span>
</span></code></pre></td></tr></table></div></figure>


<p>Install the <em>ad hoc</em> new alternatives (needed just once, even if you recompile and reinstall emacs after a <code>git pull origin</code>):</p>

<pre><code>sudo update-alternatives --install /usr/bin/emacs emacs \
  /usr/local/bin/emacs24-x 30 \
  --slave /usr/share/icons/hicolor/128x128/apps/emacs.png emacs-128x128.png \
  /usr/local/share/icons/hicolor/128x128/apps/emacs.png \
  --slave /usr/share/icons/hicolor/16x16/apps/emacs.png emacs-16x16.png \
  /usr/local/share/icons/hicolor/16x16/apps/emacs.png \
  --slave /usr/share/icons/hicolor/24x24/apps/emacs.png emacs-24x24.png \
  /usr/local/share/icons/hicolor/24x24/apps/emacs.png \
  --slave /usr/share/icons/hicolor/32x32/apps/emacs.png emacs-32x32.png \
  /usr/local/share/icons/hicolor/32x32/apps/emacs.png \
  --slave /usr/share/icons/hicolor/48x48/apps/emacs.png emacs-48x48.png \
  /usr/local/share/icons/hicolor/48x48/apps/emacs.png \
  --slave /usr/share/icons/hicolor/scalable/mimetypes/emacs-document.svg emacs-document.svg \
  /usr/local/share/icons/hicolor/scalable/mimetypes/emacs-document.svg \
  --slave /usr/share/man/man1/emacs.1.gz emacs.1.gz \
  /usr/local/share/man/man1/emacs.1.gz \
  --slave /usr/share/icons/hicolor/scalable/apps/emacs.png emacs.svg \
  /usr/local/share/icons/hicolor/scalable/apps/emacs.svg

sudo update-alternatives --install /usr/bin/etags etags \
  /usr/local/bin/etags.emacs24 35 \
  --slave /usr/share/man/man1/etags.1.gz etags.1.gz \
  /usr/local/share/man/man1/etags.1.gz

sudo update-alternatives --install /usr/bin/ctags ctags \
  /usr/local/bin/ctags.emacs24 35 \
  --slave /usr/share/man/man1/ctags.1.gz ctags.1.gz \
  /usr/local/share/man/man1/ctags.1.gz

sudo update-alternatives --install /usr/bin/emacsclient emacsclient \
  /usr/local/bin/emacsclient.emacs24 30 \
  --slave /usr/share/man/man1/emacsclient.1.gz emacsclient.1.gz \
  /usr/local/share/man/man1/emacsclient.1.gz

sudo update-alternatives --install /usr/bin/ebrowse ebrowse \
  /usr/local/bin/ebrowse.emacs24 30 \
  --slave /usr/share/man/man1/ebrowse.1.gz ebrowse.1.gz \
  /usr/local/share/man/man1/ebrowse.1.gz

sudo update-alternatives --install /usr/bin/rcs-checkin rcs-checkin \
  /usr/local/bin/rcs-checkin.emacs24 30 \
  --slave /usr/share/man/man1/rcs-checkin.1.gz rcs-checkin.1.gz \
  /usr/local/share/man/man1/rcs-checkin.1.gz

sudo update-alternatives --install /usr/bin/grep-changelog \
  grep-changelog /usr/local/bin/grep-changelog.emacs24 30 \
  --slave /usr/share/man/man1/grep-changelog.1.gz grep-changelog.1.gz \
  /usr/local/share/man/man1/grep-changelog.1.gz&lt;/code&gt;&lt;/pre&gt;
</code></pre>

<p>The given priorities are higher than the other alternatives. To finish, I set all those alternatives to the automatic mode:</p>

<pre><code>for i in ctags etags emacs emacsclient ebrowse rcs-checkin grep-changelog
do
    sudo update-alternatives --auto $i
done
</code></pre>

<p>Now, my new emacs will always be the default choice, even if I upgrade my distro and the emacs binary packages!</p>

<h2>Bonus point?</h2>

<p>The default editor is ruled by two alternatives on my system: <code>editor</code> and <code>gnome-text-editor</code>. I set them up to use my new emacs by default.</p>

<p>Et voilà !</p>
<p><a rel="bookmark" href="http://blog.renaud.io/2011/11/01/build-and-setup-gnu-emacs-24-from-git-the-alternatives-way-on-debian-gnu-linux/">&#9875; Permalink</a></p>]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Android − My life in gray!]]></title>
<link href="http://blog.renaud.io/2011/10/21/android-my-life-in-gray/"/>
<updated>2011-10-21T14:06:00+02:00</updated>
<id>http://blog.renaud.io/2011/10/21/android-my-life-in-gray</id>

      <content type="html"><![CDATA[<p>After some existencial questions on how the gray level colors should be deﬁned in our android projects, I&#8217;ve decided to check the predeﬁned colors on the android platform:</p>

<pre><code>$ find . -type f -name "colors.xml" -print0 | xargs -0 grep grey
$ find . -type f -name "colors.xml" -print0 | xargs -0 grep gray
./platforms/android-4/data/res/values/colors.xml:    &lt;color name="lighter_gray"&gt;#ddd&lt;/color&gt;
./platforms/android-4/data/res/values/colors.xml:    &lt;color name="darker_gray"&gt;#aaa&lt;/color&gt;
[…]
./platforms/android-10/data/res/values/colors.xml:    &lt;color name="lighter_gray"&gt;#ddd&lt;/color&gt;
./platforms/android-10/data/res/values/colors.xml:    &lt;color name="darker_gray"&gt;#aaa&lt;/color&gt;
[…]
</code></pre>

<p>Ok, the ﬁrst conclusion is that the android platform deﬁnetely used a US convention… No surprises there. Two gray level colors are deﬁned in platforms. Now, I should check on the android developers website: <a href="http://developer.android.com/reference/android/graphics/Color.html">here</a> and <a href="http://developer.android.com/reference/android/R.color.html">there</a> and search for gray level colors. According to this documentation, only <code>darker_gray</code> seems to be public, although <code>lighter_gray</code> is deﬁned within <code>data/res/values/colors.xml</code>…</p>

<p>Ok, make a sample stupid project:</p>

<pre><code>$ android create project --name Grayish \
 --target android-10 --path /foo/bar/Grayish \
 --package org.summo.grayish --activity MyLifeInGray
</code></pre>

<p>Let&#8217;s deﬁne some colors in the project <code>res/values/colors.xml</code> ﬁle:</p>

<figure class='code'><div class='highlight'><table><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='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;resources&gt;</span>
</span><span class='line'>  <span class="nt">&lt;color</span> <span class="na">name=</span><span class="s">&quot;lighter_gray&quot;</span><span class="nt">&gt;</span>#ddd<span class="nt">&lt;/color&gt;</span>
</span><span class='line'>  <span class="nt">&lt;color</span> <span class="na">name=</span><span class="s">&quot;darker_gray&quot;</span><span class="nt">&gt;</span>#aaa<span class="nt">&lt;/color&gt;</span>
</span><span class='line'>  <span class="nt">&lt;color</span> <span class="na">name=</span><span class="s">&quot;gray_40&quot;</span><span class="nt">&gt;</span>#696969<span class="nt">&lt;/color&gt;</span>
</span><span class='line'><span class="nt">&lt;/resources&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Use them (<code>res/layout/main.xml</code> file):</p>

<figure class='code'><div class='highlight'><table><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>
</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;LinearLayout</span> <span class="na">xmlns:android=</span><span class="s">&quot;http://schemas.android.com/apk/res/android&quot;</span>
</span><span class='line'>              <span class="na">android:orientation=</span><span class="s">&quot;vertical&quot;</span>
</span><span class='line'>              <span class="na">android:layout_width=</span><span class="s">&quot;fill_parent&quot;</span>
</span><span class='line'>              <span class="na">android:layout_height=</span><span class="s">&quot;fill_parent&quot;</span> <span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;TextView</span>
</span><span class='line'>      <span class="na">android:background=</span><span class="s">&quot;@android:color/darker_gray&quot;</span>
</span><span class='line'>      <span class="na">android:layout_width=</span><span class="s">&quot;fill_parent&quot;</span>
</span><span class='line'>      <span class="na">android:layout_height=</span><span class="s">&quot;wrap_content&quot;</span>
</span><span class='line'>      <span class="na">android:text=</span><span class="s">&quot;@android:color/darker_gray&quot;</span>
</span><span class='line'>      <span class="na">android:textColor=</span><span class="s">&quot;@android:color/black&quot;</span>
</span><span class='line'>      <span class="nt">/&gt;</span>
</span><span class='line'>  <span class="nt">&lt;TextView</span>
</span><span class='line'>      <span class="na">android:background=</span><span class="s">&quot;@color/lighter_gray&quot;</span>
</span><span class='line'>      <span class="na">android:layout_width=</span><span class="s">&quot;fill_parent&quot;</span>
</span><span class='line'>      <span class="na">android:layout_height=</span><span class="s">&quot;wrap_content&quot;</span>
</span><span class='line'>      <span class="na">android:text=</span><span class="s">&quot;@color/lighter_gray&quot;</span>
</span><span class='line'>      <span class="na">android:textColor=</span><span class="s">&quot;@android:color/black&quot;</span>
</span><span class='line'>      <span class="nt">/&gt;</span>
</span><span class='line'>  <span class="nt">&lt;TextView</span>
</span><span class='line'>      <span class="na">android:background=</span><span class="s">&quot;@color/darker_gray&quot;</span>
</span><span class='line'>      <span class="na">android:layout_width=</span><span class="s">&quot;fill_parent&quot;</span>
</span><span class='line'>      <span class="na">android:layout_height=</span><span class="s">&quot;wrap_content&quot;</span>
</span><span class='line'>      <span class="na">android:text=</span><span class="s">&quot;@color/darker_gray&quot;</span>
</span><span class='line'>      <span class="na">android:textColor=</span><span class="s">&quot;@android:color/black&quot;</span>
</span><span class='line'>      <span class="nt">/&gt;</span>
</span><span class='line'>  <span class="nt">&lt;TextView</span>
</span><span class='line'>      <span class="na">android:background=</span><span class="s">&quot;@color/gray_40&quot;</span>
</span><span class='line'>      <span class="na">android:layout_width=</span><span class="s">&quot;fill_parent&quot;</span>
</span><span class='line'>      <span class="na">android:layout_height=</span><span class="s">&quot;wrap_content&quot;</span>
</span><span class='line'>      <span class="na">android:text=</span><span class="s">&quot;@color/gray_40&quot;</span>
</span><span class='line'>      <span class="na">android:textColor=</span><span class="s">&quot;@android:color/black&quot;</span>
</span><span class='line'>      <span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;/LinearLayout&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Compile and install the project on your device:</p>

<pre><code>$ ant install
</code></pre>

<p>A ddms screenshot and a cropping later:</p>

<p><img class="center" src="http://blog.summo.org/images/mylifeingray.png"></p>

<p>That&#8217;s weird but <code>lighter_gray</code> is not public… We have access to only one gray system color! To conclude: although we could use the system colors, and since one and only one color is just useless, we would rather deﬁne <code>lighter_gray</code> and <code>darker_gray</code> in our own <code>res/values/colors.xml</code> ﬁle and if we need more grayish colors, we would use a <code>gray_xx</code>, <code>xx</code> corresponding to the percentage of white color.</p>

<p>Et voilà !</p>
<p><a rel="bookmark" href="http://blog.renaud.io/2011/10/21/android-my-life-in-gray/">&#9875; Permalink</a></p>]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Handling the GNU Compiler Collection with debian alternatives]]></title>
<link href="http://blog.renaud.io/2011/10/06/handling-the-gnu-compiler-collection-with-debian-alternatives/"/>
<updated>2011-10-06T17:06:00+02:00</updated>
<id>http://blog.renaud.io/2011/10/06/handling-the-gnu-compiler-collection-with-debian-alternatives</id>

      <content type="html"><![CDATA[<p>The story so far: I have several versions of gcc and g++ on my debian distro and during some external project compilation I went to version-related compilation issues. OK, gcc should be managed by the alternatives debian stuﬀ…</p>

<p>Just after a <code>$ sudo update-alternative --config gcc[tab][tab]</code>, I discovered that gcc, g++, gcov, <em>etc.</em> are NOT managed the alternatives way… OK, there are some alternatives deﬁned for <code>c++</code>, <code>cc</code> and <code>cpp</code>, but these alternatives are symbolic links to… symbolic links:</p>

<pre><code>foo@bar:/etc/alternatives$ ls -al c++ cc cpp
lrwxrwxrwx 1 root root 12  2 avril  2011 c++ -&gt; /usr/bin/g++
lrwxrwxrwx 1 root root 12  2 avril  2011 cc -&gt; /usr/bin/gcc
lrwxrwxrwx 1 root root 12  1 août  23:41 cpp -&gt; /usr/bin/cpp
foo@bar:/etc/alternatives$ ls -al /usr/bin/g++ /usr/bin/gcc /usr/bin/cpp
lrwxrwxrwx 1 root root 7  1 août  23:32 /usr/bin/cpp -&gt; cpp-4.6
lrwxrwxrwx 1 root root 7  9 juil. 19:39 /usr/bin/g++ -&gt; g++-4.6
lrwxrwxrwx 1 root root 7  9 juil. 19:39 /usr/bin/gcc -&gt; gcc-4.6
</code></pre>

<p>It&#8217;s really really strange since <code>c++</code> and <code>cc</code> are generic but not <code>cpp</code>. Here is my proposal to have a better management for <code>cpp</code>, <code>gcc</code>, <code>g++</code> and <code>gcov</code>, assuming that you have 4.4 and 4.6 versions on your system:</p>

<pre><code>foo@bar:/etc/alternatives$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 10
foo@bar:/etc/alternatives$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 1
foo@bar:/etc/alternatives$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 10
foo@bar:/etc/alternatives$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 1
foo@bar:/etc/alternatives$ sudo update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-4.6 10
foo@bar:/etc/alternatives$ sudo update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-4.4 1
foo@bar:/etc/alternatives$ sudo rm /usr/bin/cpp
foo@bar:/etc/alternatives$ sudo update-alternatives --install /usr/bin/cpp cpp /usr/bin/cpp-4.6 10
foo@bar:/etc/alternatives$ sudo update-alternatives --install /usr/bin/cpp cpp /usr/bin/cpp-4.4 1
</code></pre>

<p>Obviously, you should adapt the previous commands to your system (<em>i.e.</em> which versions are present).</p>

<p>Now, when you need <code>gcc-4.4</code> for a speciﬁc compilation and if <code>$ export CC=/usr/bin/gcc-4.4</code> is not sufficient, you just have to do <code>$ sudo update-alternative --config gcc</code> and manually select <code>gcc-4.4</code>… to reset to <code>gcc-4.6</code> if you nominally need it.</p>

<p>That&#8217;s it!</p>
<p><a rel="bookmark" href="http://blog.renaud.io/2011/10/06/handling-the-gnu-compiler-collection-with-debian-alternatives/">&#9875; Permalink</a></p>]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Rails 3: Migrate your data from SQLite to PostgreSQL]]></title>
<link href="http://blog.renaud.io/2011/10/05/rails-3-migrate-your-data-from-sqlite-to-postgresql/"/>
<updated>2011-10-05T23:29:00+02:00</updated>
<id>http://blog.renaud.io/2011/10/05/rails-3-migrate-your-data-from-sqlite-to-postgresql</id>

      <content type="html"><![CDATA[<p>Using my brand new enki blog instance with a SQLite database, I wrote my ﬁrst post… then I told myself that it could be nice to use a PostgreSQL database, just for fun…</p>

<p>Google and <a href="http://stackoverflow.com/questions/1670154/convert-a-ruby-on-rails-app-from-sqlite-to-mysql">a stackoverflow entry</a> gives me the answer, here the step-by-step result for a <code>RAILS_ENV="production"</code>:</p>

<ul>
<li>Install PostgreSQL (see my previous post <a href="http://blog.renaud.io/2011/10/05/postgresql-installation-on-debian-wheezy">Postgresql installation on debian Wheezy</a>)</li>
<li><code>$ cp config/database.yml config.database.yml.sqlite3</code></li>
<li>Install <a href="https://github.com/ludicast/yaml_db#readme">yaml_db</a>: <code>$ sudo gem install yaml_db</code> and add that gem to your Gemﬁle</li>
<li>Add the PostgreSQL support: <code>$ sudo gem install pg</code> and add that gem to your Gemﬁle</li>
<li>Add a new <code>config/database.yml.pg</code> ﬁle:</li>
</ul>


<figure class='code'><div class='highlight'><table><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='ruby'><span class='line'><span class="c1"># PostgreSQL version</span>
</span><span class='line'><span class="c1">#   gem install pg</span>
</span><span class='line'><span class="n">development</span><span class="p">:</span>
</span><span class='line'>  <span class="n">adapter</span><span class="p">:</span> <span class="n">postgresql</span>
</span><span class='line'>  <span class="n">encoding</span><span class="p">:</span> <span class="n">unicode</span>
</span><span class='line'>  <span class="n">database</span><span class="p">:</span> <span class="n">blog_development</span>
</span><span class='line'>  <span class="n">pool</span><span class="p">:</span> <span class="mi">5</span>
</span><span class='line'>  <span class="n">username</span><span class="p">:</span> <span class="n">blog</span>
</span><span class='line'>  <span class="n">password</span><span class="p">:</span> <span class="n">blurp</span>
</span><span class='line'>  <span class="n">host</span><span class="p">:</span> <span class="n">localhost</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Warning: The database defined as &quot;test&quot; will be erased and</span>
</span><span class='line'><span class="c1"># re-generated from your development database when you run &quot;rake&quot;.</span>
</span><span class='line'><span class="c1"># Do not set this db to the same as development or production.</span>
</span><span class='line'><span class="nb">test</span><span class="p">:</span>
</span><span class='line'>  <span class="n">adapter</span><span class="p">:</span> <span class="n">postgresql</span>
</span><span class='line'>  <span class="n">encoding</span><span class="p">:</span> <span class="n">unicode</span>
</span><span class='line'>  <span class="n">database</span><span class="p">:</span> <span class="n">blog_test</span>
</span><span class='line'>  <span class="n">pool</span><span class="p">:</span> <span class="mi">5</span>
</span><span class='line'>  <span class="n">username</span><span class="p">:</span> <span class="n">blog</span>
</span><span class='line'>  <span class="n">password</span><span class="p">:</span> <span class="n">blurp</span>
</span><span class='line'>  <span class="n">host</span><span class="p">:</span> <span class="n">localhost</span>
</span><span class='line'>
</span><span class='line'><span class="n">production</span><span class="p">:</span>
</span><span class='line'>  <span class="n">adapter</span><span class="p">:</span> <span class="n">postgresql</span>
</span><span class='line'>  <span class="n">encoding</span><span class="p">:</span> <span class="n">unicode</span>
</span><span class='line'>  <span class="n">database</span><span class="p">:</span> <span class="n">blog_production</span>
</span><span class='line'>  <span class="n">pool</span><span class="p">:</span> <span class="mi">5</span>
</span><span class='line'>  <span class="n">username</span><span class="p">:</span> <span class="n">blog</span>
</span><span class='line'>  <span class="n">password</span><span class="p">:</span> <span class="n">blurp</span>
</span><span class='line'>  <span class="n">host</span><span class="p">:</span> <span class="n">localhost</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>Backup your SQLite data with yaml_db: <code>$ rake db:dump RAILS_ENV="production"</code></li>
<li>Configure Rails to use your new PostgreSQL configuration: <code>$ cp config/database.yml.pg config/database.yml</code></li>
<li>Create the database and the associated tables: <code>$ rake db:create RAILS_ENV="production"</code></li>
<li>Load your schema: <code>$ rake db:schema:load  RAILS_ENV="production"</code></li>
<li>Load your data with yaml_db:<code>$ rake db:load RAILS_ENV="production"</code></li>
</ul>


<p>Et voilà !</p>
<p><a rel="bookmark" href="http://blog.renaud.io/2011/10/05/rails-3-migrate-your-data-from-sqlite-to-postgresql/">&#9875; Permalink</a></p>]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Postgresql installation on debian Wheezy]]></title>
<link href="http://blog.renaud.io/2011/10/05/postgresql-installation-on-debian-wheezy/"/>
<updated>2011-10-05T13:47:00+02:00</updated>
<id>http://blog.renaud.io/2011/10/05/postgresql-installation-on-debian-wheezy</id>

      <content type="html"><![CDATA[<h2>Packages installation</h2>

<pre><code>$ sudo apt-get update &amp;&amp; sudo apt-get install postgresql postgresql-client postgresql-contrib postgresql-doc
</code></pre>

<p>The installation process takes care of the <code>postgres</code> user creation as of the starting of the server.</p>

<h2>PostgreSQL configuration</h2>

<p>We now have to set up the administrative password:</p>

<pre><code>$ sudo passwd postgres
</code></pre>

<p>Then, we could create a new super-user:</p>

<pre><code>$ su - postgres
$ create user
</code></pre>

<p>and define a password for that user using</p>

<pre><code>$ psql -d template1 -c "alter user MyNewUser with password 'TheNewPassword'"
</code></pre>

<h2>Remote administration</h2>

<p>On the server side, you may configure PostgreSQL by editing the <code>/etc/postgresql/9.1/main/pg_hba.conf</code>. Check the <a href="http://developer.postgresql.org/pgdocs/postgres/auth-pg-hba-conf.html">pgi_hba.conf File official documentation</a> for further information.</p>

<p>On the client-side, we could install pgadmin3</p>

<pre><code>$ sudo apt-get install pgadmin3
</code></pre>

<p>Et voilà !</p>
<p><a rel="bookmark" href="http://blog.renaud.io/2011/10/05/postgresql-installation-on-debian-wheezy/">&#9875; Permalink</a></p>]]></content>
    </entry>
  
</feed>
