<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Catarsis</title>
	<atom:link href="http://people.warp.es/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://people.warp.es/~xtor/blog</link>
	<description>Eliminación de recuerdos que perturban la conciencia o el equilibrio nervioso</description>
	<lastBuildDate>Sun, 05 Sep 2010 16:48:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Android apps on MeeGo / IA?</title>
		<link>http://people.warp.es/~xtor/blog/?p=992</link>
		<comments>http://people.warp.es/~xtor/blog/?p=992#comments</comments>
		<pubDate>Sun, 05 Sep 2010 12:26:36 +0000</pubDate>
		<dc:creator>Héctor Blanco Alcaine</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Free Software]]></category>
		<category><![CDATA[Gadgets]]></category>

		<guid isPermaLink="false">http://people.warp.es/~xtor/blog/?p=992</guid>
		<description><![CDATA[As Chippy reports, a German joint-venture has just showcased the WeTab, an iPad competitor and, provided ther rumours get confirmed, the first MeeGo-based tablet available. 

The interesting point here, assuming WeTab OS is actually a customised MeeGo version, would be that it is capable of runnning Android applications. It was tried before for Ubuntu, but [...]]]></description>
			<content:encoded><![CDATA[<p>As <a href="http://twitter.com/chippy/status/23044612897">Chippy reports</a>, a <a href="http://wetab.mobi/en/about-us">German joint-venture</a> has just showcased the <a href="http://wetab.mobi/en">WeTab</a>, an iPad competitor and, provided ther rumours get confirmed, the first <a href="http://en.wikipedia.org/wiki/MeeGo">MeeGo</a>-based tablet available. </p>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/ILfUHv0mTlc?fs=1&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/ILfUHv0mTlc?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<p>The interesting point here, assuming <a href="http://wetab.mobi/files/product_specifications_WeTab_version2.0_100506.pdf">WeTab OS</a> is actually a customised MeeGo version, would be that it is capable of <strong>runnning Android applications</strong>. It was <a href="http://brainstorm.ubuntu.com/idea/23492/">tried before for Ubuntu</a>, but they <a href="http://mjfrey.blogspot.com/">faced some problems</a> because Google was not open sourcing crucial Android components.</p>
<p>But the WeTab is not restricted to Android apps; instead, it uses a <strong>meta-store</strong>, supporting native, Java, Linux, Adobe AIR® and Android Apps.</p>
<p><a href="http://en.wikipedia.org/wiki/WeTab">WeTab</a> is also based on <a href="http://en.wikipedia.org/wiki/Intel_Atom">Intel Atom</a>, so another distinctive point is that would be the first commercial contender fulfilling fundamental <a href="http://www.android-x86.org/">Android x86 project</a> goals: <strong>port vanilla Android</strong>, which has important ARM dependencies in core services and libraries (e.g. instruction set architecture optimizations), to Intel Architecture platforms and its streaming <a href="http://en.wikipedia.org/wiki/SIMD">SIMD</a> instructions.</p>
<p>These facts, and the <strong>customized </strong><a href="http://en.wikipedia.org/wiki/User_interface"><strong>UI</strong></a> (showed in the above video), may be interpreted as side-effects of platform commodization: differentiation efforts and value-added proposals. I bet the future deserves us these sort of offers, at least from the heavy-weight contenders in the mobile arena.</p>
<p>And, while I am writing these lines, the WeTab has already become the <a href="http://www.amazon.de/gp/bestsellers/computers/429874031/ref=pd_ts_computers_nav">best selling Tablet-PC in Amazon.de</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://people.warp.es/~xtor/blog/?feed=rss2&amp;p=992</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Searching Android Framework&#8217;s source code</title>
		<link>http://people.warp.es/~xtor/blog/?p=990</link>
		<comments>http://people.warp.es/~xtor/blog/?p=990#comments</comments>
		<pubDate>Sat, 04 Sep 2010 09:37:02 +0000</pubDate>
		<dc:creator>Héctor Blanco Alcaine</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Free Software]]></category>

		<guid isPermaLink="false">http://people.warp.es/~xtor/blog/?p=990</guid>
		<description><![CDATA[Although Android&#8217;s developer documentation is basically clear and well organised, sometimes you come across tips like:
&#34;To use something other than TextViews for the array display, for instance, ImageViews, or to have some of data besides toString() results fill the views, override getView(int, View, ViewGroup) to return the type of view you want&#34;.

And then you have [...]]]></description>
			<content:encoded><![CDATA[<p>Although <a href="http://developer.android.com/">Android&#8217;s developer documentation</a> is basically clear and well organised, sometimes you come across tips <a href="http://developer.android.com/reference/android/widget/ArrayAdapter.html">like</a>:</p>
<blockquote><p>&quot;To use something other than TextViews for the array display, for instance, ImageViews, or to have some of data besides toString() results fill the views, <strong>override getView(int, View, ViewGroup) to return the type of view you want</strong>&quot;.</p>
</blockquote>
<p>And then you have an <a href="http://developer.android.com/reference/android/widget/ArrayAdapter.html#getView%28int,%20android.view.View,%20android.view.ViewGroup%29">insightful and extensive method description</a> like:</p>
<pre>public View getView (int position, View convertView, ViewGroup parent)</pre>
<p>So&#8230; how do I override <code>getView</code> to make everything work as expected?</p>
<p>The best answer lies, as usual, in the Android Framework&#8217;s Java implementation. Using the <code>getView</code> original code as a template, it is really easy to figure out the details of your reimplementation:</p>
<pre>
    public View getView(int position, View convertView, ViewGroup parent) {
        return createViewFromResource(position, convertView, parent, mResource);
    }

    private View createViewFromResource(int position, View convertView, ViewGroup parent,
            int resource) {
        View view;
        TextView text;

        if (convertView == null) {
            view = mInflater.inflate(resource, parent, false);
        } else {
            view = convertView;
        }

        try {
            if (mFieldId == 0) {
                //  If no custom field is assigned, assume the whole resource is a TextView
                text = (TextView) view;
            } else {
                //  Otherwise, find the TextView field within the layout
                text = (TextView) view.findViewById(mFieldId);
            }
        } catch (ClassCastException e) {
            Log.e(&quot;ArrayAdapter&quot;, &quot;You must supply a resource ID for a TextView&quot;);
            throw new IllegalStateException(
                    &quot;ArrayAdapter requires the resource ID to be a TextView&quot;, e);
        }

        T item = getItem(position);
        if (item instanceof CharSequence) {
            text.setText((CharSequence)item);
        } else {
            text.setText(item.toString());
        }

        return view;
    }
</pre>
<p>To search and browse Android Framework&#8217;s code, a very useful tool is <a href="http://www.google.com/codesearch">Google&#8217;s codesearch</a>. For instance <a href="http://www.google.com/codesearch?q=android+arrayadapter+getview&#038;hl=en">searching for &quot;android arrayadapter getview&quot;</a> points us directly to the <code>ArrayAdapter.java getView</code> code, and there we can use the left-hand &quot;<code>Outline</code>&quot; tab to browse the different methods&#8230; (Of course, real men <code>grep -r</code> their local git)</p>
]]></content:encoded>
			<wfw:commentRss>http://people.warp.es/~xtor/blog/?feed=rss2&amp;p=990</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MeeGo Handset Bootchart on Aava Mobile</title>
		<link>http://people.warp.es/~xtor/blog/?p=983</link>
		<comments>http://people.warp.es/~xtor/blog/?p=983#comments</comments>
		<pubDate>Thu, 26 Aug 2010 16:25:44 +0000</pubDate>
		<dc:creator>Héctor Blanco Alcaine</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Free Software]]></category>
		<category><![CDATA[Gadgets]]></category>

		<guid isPermaLink="false">http://people.warp.es/~xtor/blog/?p=983</guid>
		<description><![CDATA[Below is a bootchart showing an Aava Mobile&#8217;s bootchart using MeeGo Handheld. I used the meego-handset-ia32-aava-mtf-1.0.80.15.20100813.1-sda.bin image.
To generate the bootchart, you just need to mic-chroot and install these two packages (the default kernel has process accounting enabled):
yum install bootchart acct
Then, just copy the image to the boot media, and turn the power on   [...]]]></description>
			<content:encoded><![CDATA[<p>Below is a bootchart showing an <a href="http://people.warp.es/~xtor/blog/?p=939">Aava Mobile</a>&#8217;s <a href="http://www.bootchart.org/">bootchart</a> using MeeGo Handheld. I used the <code>meego-handset-ia32-aava-mtf-1.0.80.15.20100813.1-sda.bin</code> image.</p>
<p>To generate the bootchart, you just need to mic-chroot and install these two packages (the default kernel has process accounting enabled):</p>
<p><code>yum install bootchart acct</code></p>
<p>Then, just copy the image to the boot media, and turn the power on <img src='http://xtor.warp.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Your chart will be stored in <code>/var/log/bootchart-YYYYMMDD-HHMM.svg</code></p>
<p><a href="http://people.warp.es/~xtor/img/bootchart-19591231-1632.svg"><img width="100%" src="http://people.warp.es/~xtor/img/bootchart-19591231-1632.png" /></a></p>
<p><a href="http://people.warp.es/~xtor/img/bootchart-19591231-1632.svg">(Click to enlarge)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://people.warp.es/~xtor/blog/?feed=rss2&amp;p=983</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MeeGo Handset: from power-on to system init</title>
		<link>http://people.warp.es/~xtor/blog/?p=978</link>
		<comments>http://people.warp.es/~xtor/blog/?p=978#comments</comments>
		<pubDate>Mon, 16 Aug 2010 16:07:38 +0000</pubDate>
		<dc:creator>Héctor Blanco Alcaine</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Free Software]]></category>
		<category><![CDATA[Gadgets]]></category>

		<guid isPermaLink="false">http://people.warp.es/~xtor/blog/?p=978</guid>
		<description><![CDATA[Being fully aware of what&#8217;s happening on your system, since the very first stages, is one of the things that I really love about open source software.
I used to spend hours and hours dissecting different live cd systems, or setting up network boot scenarios, so it was likely that I would end up doing the [...]]]></description>
			<content:encoded><![CDATA[<p>Being fully aware of what&#8217;s happening on your system, since the very first stages, is one of the things that I really love about open source software.</p>
<p>I used to spend hours and hours dissecting different live cd systems, or setting up network boot scenarios, so it was likely that I would end up doing the same with <a href="http://people.warp.es/~xtor/blog/?p=939">this lovely Aava Mobile</a> running <a href="http://en.wikipedia.org/wiki/MeeGo">MeeGo</a> <a href="http://en.wikipedia.org/wiki/MeeGo#Handset">Handset</a> <img src='http://xtor.warp.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>In this post, I will explain just the first stages of its boot sequence, involving the boot loader, the kernel and the initial ramdisk. Details about the system and the graphic session initializations will be presented in next posts.</p>
<h2>Boot loader</h2>
<p>MeeGo Handheld uses <a href="http://kboot.sourceforge.net/">kboot</a> as bootloader, and a two-step boot sequence. Basically, it involves booting the kernel, and then running an intermediate, ramdisk based system, before loading the root filesystem and letting the classic UNIX system init process start.</p>
<h2>Kernel</h2>
<p>MeeGo Handheld <a href="http://en.wikipedia.org/wiki/Linux_kernel">kernel</a>&#8217;s default <a href="http://www.kernel.org/doc/Documentation/kernel-parameters.txt">parameters</a> are:</p>
<pre>ro pci=noearly console=tty1 console=ttyS0 earlyprintk=mrst loglevel=8 nosplash s0ix_latency=160</pre>
<p>An brief explanation for each parameter is included below:</p>
<ul>
<li><code>ro</code>: mount root device read-only on boot.</li>
<li><code>pci=noearly</code>: skip any early type 1 scanning.</li>
<li><code>console=tty1</code>: set tty1 as output console device. </li>
<li><code>console=ttyS0</code>: set ttyS0 (serial) as output console device.</li>
<li><code>earlyprintk=mrst</code>: early printk feature (mrst =&gt; Moorestown) for debugging during the early stages of the bootup. It allows to use printks even before the real console drivers are available.</li>
<li><code>loglevel=8</code>: full debug. Any kernel message will be printed to the console.</li>
<li><code>nosplash</code>: not used by the kernel, but forwarded to the root filesystem&#8217;s system init.</li>
<li><code>s0ix_latency=160</code>: related with the advanced power management capabilites of the <a href="http://en.wikipedia.org/wiki/Moorestown_(computing_platform)">Moorestown</a> platform.</li>
</ul>
<h2>Ramdisk</h2>
<p>Once the kernel is loaded, it enters the <a href="http://en.wikipedia.org/wiki/Initrd">ramdisk</a> initialization sequence. Its main goal is finding and mounting a suitable root partition, so you don&#8217;t need to hardcode it, and the same image can be reused regardless you are storing the root partition on an SD, USB or NAND device.</p>
<p>MeeGo Handheld ramdisk is based on <a href="http://en.wikipedia.org/wiki/Fedora_(operating_system)">Fedora</a>&#8217;s. It includes a basic selection of early user space commands, but -surprisingly for an embedded environment-, it is not <a href="http://en.wikipedia.org/wiki/Busybox">Busybox</a> based, sporting a complete <a href="http://en.wikipedia.org/wiki/Bash_%28Unix_shell%29">bash shell</a> and the full-fledged version of these tools.</p>
<h3>Filesystem layout</h3>
<p>The ramdisk contents are a bare bones UNIX system, stripped down to contain just the basic stuff:</p>
<pre>
├── bin
│   ├── bash
│   ├── cat
│   ├── chmod
│   ├── cut
│   ├── dd
│   ├── dmesg
│   ├── echo
│   ├── env
│   ├── grep
│   ├── kill
│   ├── less
│   ├── ln
│   ├── ls
│   ├── mkdir
│   ├── mknod
│   ├── mount
│   ├── rm
│   ├── sed
│   ├── sh -&gt; bash
│   ├── sleep
│   └── umount
├── dev
├── etc
│   ├── fstab
│   └── udev
│       └── rules.d
<strong>├── init</strong>
├── lib
│   ├── ld-linux.so.2
│   ├── libacl.so.1
│   ├── libattr.so.1
│   ├── libcap.so.2
│   ├── libc.so.6
│   ├── libdl.so.2
│   ├── libpcre.so.0
│   ├── libpthread.so.0
│   ├── librt.so.1
│   ├── libtinfo.so.5
│   ├── terminfo
│   │   ├── a
│   │   │   └── ansi
│   │   ├── d
│   │   │   └── dumb
│   │   ├── l
│   │   │   └── linux
│   │   └── v
│   │       ├── vt100
│   │       ├── vt100-am
│   │       ├── vt100-nav
│   │       ├── vt102
│   │       ├── vt200
│   │       ├── vt220
│   │       └── vt52
│   └── udev
│       └── rules.d
├── proc
├── sbin
│   ├── blkid
│   ├── blockdev
│   ├── chroot
│   ├── dmsetup
│   ├── insmod
│   ├── killall5
│   ├── losetup
│   ├── lsmod
│   ├── modprobe
│   ├── pidof
│   ├── <strong>run-init</strong>
│   ├── udevadm
│   └── udevd
├── sys
├── sysroot
└── usr
    └── lib
        ├── libblkid.so.1
        ├── libdevmapper.so.1.02
        └── libuuid.so.1
</pre>
<h3>/init script</h3>
<p>Once the kernel loads, it starts executing the /init script, that:</p>
<ol>
<li dir="ltr">Sets up the basic environment</li>
<li dir="ltr">Parses kernel command line options</li>
<li dir="ltr">Sets up root filesystem</li>
<li dir="ltr">Transfers control to the root filesystem&#8217;s init</li>
</ol>
<p>We are going to walk through this small piece of code, skipping some setup and debug sections for clarity&#8217;s sake.</p>
<h4>1. Set up the basic environment</h4>
<p>First, it redirects standard output and error to /dev/console. This is important for debugging, as the console device /dev/console is handled by the kernel, and we can change it using boot params, e.g. to access display-less devices using a serial interface.</p>
<p>Then, the minimal facilities are set up. An initramdisk is a very early, almost &quot;naked&quot; user-space, so we need a way to interact with the operating system: some device files and the Linux kernel&#8217;s pseudo filesystems. From this point on, any executable on the ramdisk has a way to perceive and interact with the system. Basically, this stage involves:</p>
<ul>
<li>Setting up <a href="http://en.wikipedia.org/wiki/Udev">udev</a>&#8217;s basic environment under /dev (mount udev and create basic device files under /dev: console, null, kmsg, pts, shm, fd, stdin, stdout, stderr)</li>
<li>Mounting pseudo filesystems (/proc and /sys)</li>
<li>Disable the usermode helper hotplug mechanism (it relies on udevd instead)</li>
</ul>
<h4>2. Parse kernel command line options</h4>
<p>It parses the command line options, and then:</p>
<ul>
<li>Overrides the default values if any specific ones are provided.</li>
<li>Blacklists any module that may interfere with the system.</li>
<li>Handles the kernel module options, writing them on the ramdisk&#8217;s modprobe.conf</li>
</ul>
<p>The main variables used by the script are detailed below:</p>
<ul>
<li><code>init</code>: specifies the program which will be executed once the initial ramdisk stage ends.</li>
<li><code>ro, rw</code> =&gt; <code>root_ro, root_rw</code> variables, control wether the root file system is mounted read-only or read-write.</li>
<li><code>quiet</code>: enable or disable boot process debug messages.</li>
<li><code>shell</code>: if enabled, drops the user to a shell, just after setting up /dev/root.</li>
<li><code>eshell</code>: if enabled, drops the user to a shell, just before init.</li>
</ul>
<p>Other variables, like <code>live_ram</code>, <code>live_locale</code>, <code>overlay</code> or <code>check</code>, are not used.</p>
<h4>3. Set up root filesystem</h4>
<p>Most of the /init script code handle setting up the root filesystem.</p>
<p>The detection has two clear execution paths, depending on the &quot;<code>autodetect</code>&quot; variable&#8217;s value. This variable is not defined or processed from the kernel&#8217;s command line, so it seems it&#8217;s just some dead code from another MeeGo initrd.</p>
<p>First, three variables are initialized from the embedded /etc/fstab file, or the related kernel command line options:</p>
<ul>
<li><code>root</code></li>
<li><code>rootflags</code></li>
<li><code>rootfstype</code></li>
</ul>
<p>For instance, the default <code>/etc/fstab</code> file, stored inside the ramdisk, holds this root filesystem definition:</p>
<pre>/dev/sda1 / ext3 defaults,noatime 0 0</pre>
<p>Once these variables are set, if <code>autodetect</code> is enabled, it adds different udev rules, depending on how the root filesystem is specified via the <code>root</code> variable, like /dev/disk/by-label, /dev/disk/by-id, CDLABEL, LABEL, UUID, etc. It just does nothing if root is specified by another /dev/* path.</p>
<p>If <code>autodetect</code> is not enabled (or not defined, which seems the case), it just starts udev, waits for it to be settled, and then searches for a filesystem at:</p>
<ul>
<li>SD devices: <code>mmcblk0, mmcblk1, mmcblk2, mmcblk3</code></li>
<li>USB devices: <code>sda, sdb, sdc, sdd, sde, sdf</code></li>
<li>NAND devices: <code>nda, ndb, ndc</code></li>
</ul>
<p>After this process, the <code>thingtomount</code> variable must be set, or an error has occurred.</p>
<p><em>(At this point, if the &quot;shell&quot; parameter is enabled, the user is dropped on a bash shell)</em></p>
<p>The final stage of the root filesystem setup involves making sure the device specified by <code>thingtomount</code> holds a suitable root file system, composing mountoptions with <code>rootflags</code>, <code>root_rw</code> and <code>root_ro</code>, and, finally, mounting the root filesystem at <code>/sysroot</code></p>
<h4>4. Transfer control to the root filesystem&#8217;s init</h4>
<p>Once the new root filesystem is available, the process is almost done. The script just:</p>
<ul>
<li>Sets wether or not to pass kernel cmdline to the root filesystem&#8217;s init (because init can be overriden by a kernel parameter)</li>
<li><em>(At this point, if the &quot;eshell&quot; parameter is enabled, the user is dropped on a bash shell)</em></li>
<li>Kills udevd to enable the new system to take control of the plugging events.</li>
<li>Calls <code>/sbin/run-init &quot;$@&quot;</code>, which is in charge of this little piece of black magic: </li>
</ul>
<pre>
#!/bin/bash
cd /sysroot
mount --move . /
exec /sbin/chroot . &quot;$init&quot; &quot;$@&quot;</pre>
<p>At this point, everything is ready for the system initialization to start&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://people.warp.es/~xtor/blog/?feed=rss2&amp;p=978</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>x86 MeeGo handhelds on their way&#8230;</title>
		<link>http://people.warp.es/~xtor/blog/?p=939</link>
		<comments>http://people.warp.es/~xtor/blog/?p=939#comments</comments>
		<pubDate>Thu, 12 Aug 2010 21:05:12 +0000</pubDate>
		<dc:creator>Héctor Blanco Alcaine</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Free Software]]></category>
		<category><![CDATA[Gadgets]]></category>

		<guid isPermaLink="false">http://people.warp.es/~xtor/blog/?p=939</guid>
		<description><![CDATA[Since I started to play with Atom based devices, this is the first time I have a real &#8220;handheld&#8221; in my hands: the Aava Mobile.
It&#8217;s still a little bigger than a Nexus One, but anyway, it&#8217;s amazing how they managed to miniaturize a complete computer into a SOC:



Since mid 2007, a device like a Samsung [...]]]></description>
			<content:encoded><![CDATA[<p>Since I started to <a href="http://xtor.warp.es/?p=172">play</a> with <a href="http://en.wikipedia.org/wiki/Intel_Atom">Atom</a> based devices, this is the first time I have a real &#8220;handheld&#8221; in my hands: the <a href="http://www.aavamobile.com/">Aava Mobile</a>.</p>
<p>It&#8217;s still a little bigger than a <a href="http://en.wikipedia.org/wiki/Google_phone">Nexus One</a>, but anyway, it&#8217;s amazing how <a href="http://en.wikipedia.org/wiki/Intel">they</a> managed to miniaturize a complete computer into a <a href="http://en.wikipedia.org/wiki/System-on-a-chip">SOC</a>:</p>
<p><a href="http://people.warp.es/~xtor/img/meego_horizontal.jpg"><img src="http://people.warp.es/~xtor/img/meego_horizontal_small.jpg" /></a></p>
<p><a href="http://people.warp.es/~xtor/img/meego_vertical.jpg"><img src="http://people.warp.es/~xtor/img/meego_vertical_small.jpg" /></a></p>
<p><a href="http://people.warp.es/~xtor/img/meego_tumba-os.jpg"><img src="http://people.warp.es/~xtor/img/meego_tumba-os_small.jpg" /></a></p>
<p>Since mid 2007, a device like a <a href="http://xtor.warp.es/?p=172">Samsung Q1 Ultra</a> has reduced four times its size, sporting some new goodies like a bunch of sensors (ambient light, proximity, 3D compass, accelerometer&#8230;).</p>
<p><a href="http://en.wikipedia.org/wiki/MeeGo">MeeGo</a> for Handhelds is under heavy development, and Intel and Nokia efforts for creating a compeling environment for users, but also for developers, are going to be really, really interesting. Exciting times ahead!</p>
]]></content:encoded>
			<wfw:commentRss>http://people.warp.es/~xtor/blog/?feed=rss2&amp;p=939</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Private clouds</title>
		<link>http://people.warp.es/~xtor/blog/?p=916</link>
		<comments>http://people.warp.es/~xtor/blog/?p=916#comments</comments>
		<pubDate>Sun, 01 Aug 2010 09:39:59 +0000</pubDate>
		<dc:creator>Héctor Blanco Alcaine</dc:creator>
				<category><![CDATA[Chronicles]]></category>
		<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Free Software]]></category>

		<guid isPermaLink="false">http://people.warp.es/~xtor/blog/?p=916</guid>
		<description><![CDATA[Private clouds for Agile teams was the name of a brief introduction to some existing cloud technologies, held last Thursday in SkillsMatters by Toby Hobson from Raptor Consultants.
The first half of the talk outlined some of the features and practical problems of cloud computing. For instance, the lack of a suitable licensing scheme from some [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://skillsmatter.com/podcast/agile-scrum/private-clouds-for-agile-teams">Private clouds for Agile teams</a> was the name of a brief introduction to some existing cloud technologies, held last Thursday in <a href="http://skillsmatter.com">SkillsMatters</a> by Toby Hobson from <a href="http://www.raptorconsultants.com/">Raptor Consultants</a>.</p>
<p>The first half of the talk outlined some of the features and practical problems of <a href="">cloud computing</a>. For instance, the lack of a suitable <b>licensing</b> scheme from some OS/application vendors, the difficulties integrating <b>legacy</b> systems, or the concerns about the <b>security</b> of production environments. This problems, especially the last one, are limiting cloud deployments to development and integration environments, using private cloud technologies.</p>
<p>Then he went on comparing some of the main offerings for the deployment of these sort of clouds:<br />
<il></p>
<li><a href="http://www.3tera.com/Cloud-computing/">3Tera</a>: easy to use GUI, most suited to non-techies.
</li>
<li><a href="http://www.redhat.com/solutions/cloud/foundations/">Red Hat</a>: good support, but probably you still need to buy professional services. Best option for Red Hat shops doing strategic investment.
</li>
<li><a href="http://www.openqrm-enterprise.com/">OpenQRM</a>: not just a private cloud system but a more general datacenter management solution. Suited for environments involving legacy systems. Complex to configure, but offering an excellent and customer focused support.
</li>
<li><a href="http://www.ubuntu.com/cloud/private">Ubuntu Enterprise Cloud</a>: excellent EC2 support (using <a href="http://en.wikipedia.org/wiki/Eucalyptus_(computing)">Eucalyptus</a>, <a href="http://xtor.warp.es/?p=29&#038;cpage=1#comment-95">hi Mårten! <img src='http://xtor.warp.es/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </a>), easy to setup, good documentation and excellent support. The best option to deploy quickly a private cloud.
</li>
<p></il></p>
<p>Regarding the &#8220;for Agile teams&#8221; part, unfortunately the talk didn&#8217;t delve deeper into development topics, but it mentioned build and test automation, and the need for a good scripting platform/API.</p>
<p>You can <a href="http://skillsmatter.com/podcast/agile-scrum/private-clouds-for-agile-teams">find the podcast here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://people.warp.es/~xtor/blog/?feed=rss2&amp;p=916</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Business Analysts and Agile projects</title>
		<link>http://people.warp.es/~xtor/blog/?p=900</link>
		<comments>http://people.warp.es/~xtor/blog/?p=900#comments</comments>
		<pubDate>Fri, 23 Jul 2010 15:05:32 +0000</pubDate>
		<dc:creator>Héctor Blanco Alcaine</dc:creator>
				<category><![CDATA[Chronicles]]></category>
		<category><![CDATA[Engineering]]></category>

		<guid isPermaLink="false">http://people.warp.es/~xtor/blog/?p=900</guid>
		<description><![CDATA[Yesterday, I attended The Business Analyst&#8217;s role on Agile projects at Skills Matters. Allan Kelly spoke about &#8220;business analysis&#8221; and how it fits in an agile project.
He talked about how naive some of the Extreme Programming and Agile original principles were, regarding analysis activities. Replacing &#8220;the customer&#8221; in make the customer always available with a [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday, I attended <a href="http://skillsmatter.com/podcast/agile-scrum/allan-kelly-the-business-analysts-role-on-agile-projects">The Business Analyst&#8217;s role on Agile projects</a> at <a href="http://skillsmatter.com">Skills Matters</a>. <a href="http://www.allankelly.net">Allan Kelly</a> spoke about &#8220;business analysis&#8221; and how it fits in an agile project.</p>
<p>He talked about how naive some of the <a href="http://en.wikipedia.org/wiki/Extreme_programming">Extreme Programming</a> and <a href="http://en.wikipedia.org/wiki/Agile_Manifesto">Agile</a> original principles were, regarding analysis activities. Replacing &#8220;the customer&#8221; in <b>make the customer always available</b> with a business analyst (a customer proxy) is the way he proposed to deal with this problem. E.g. in an SCRUM team, he proposed a Product Owner role encompassing technical leadership, product management and business analysis duties.</p>
<p>I liked his explanation -with actual data from the MIT Sloan review-, of why, in an organizational improvement context, <i>doing the things right</i> before is better than <i>doing the things right</i> at first. (Slide 18, The Alignment Trap)</p>
<p>When he talked about <i>Just In Time Requirements</i>, I was confronted with the same thoughts I have most of the times I apply this technique: clients, especially top management, are reluctant to this kind of uncertainty. It takes time, and a tactful approach, to convince them.</p>
<p>I don&#8217;t agree, at least as a general definition, with his standpoint of SCRUM as a &#8220;project management method without a project manager&#8221;. Besides pure managerial tasks (like some staffing details), I think a separate person is still needed to have a full (not iteration-centric) management view of projects, and most important, to avoid distractions and cope with unplanned or non-deterministic events (e.g. chasing equipment providers or busy external stakeholders).</p>
<p>The <a href="http://allankelly.blogspot.com/2010/07/slides-from-skills-matter-ba-role-in.html">slides and video are available</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://people.warp.es/~xtor/blog/?feed=rss2&amp;p=900</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to test the Subversion odt checking pre-commit hook</title>
		<link>http://people.warp.es/~xtor/blog/?p=770</link>
		<comments>http://people.warp.es/~xtor/blog/?p=770#comments</comments>
		<pubDate>Thu, 01 Apr 2010 09:03:39 +0000</pubDate>
		<dc:creator>Héctor Blanco Alcaine</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Free Software]]></category>

		<guid isPermaLink="false">http://people.warp.es/~xtor/blog/?p=770</guid>
		<description><![CDATA[As I promised, after explaining the pre-commit hook code, here we go with some tips to give it a try. There are two ways of testing this pre-commit hook, both involving an existing Subversion repository:

Commiting to the repository (and thus triggering a new transaction).

Using an existing transaction, through the --revision command line option (intended for [...]]]></description>
			<content:encoded><![CDATA[<p>As I promised, after <a href="http://people.warp.es/~xtor/blog/?p=730">explaining the pre-commit hook code</a>, here we go with some tips to give it a try. There are two ways of testing this pre-commit hook, both involving an existing Subversion repository:</p>
<ol>
<li>Commiting to the repository (and thus triggering a new transaction).
</li>
<li>Using an existing transaction, through the <tt>--revision</tt> command line option (intended for testing).
</li>
</ol>
<p>In both cases, you must install <a href="http://people.warp.es/~xtor/blog/?p=717">LanguageTool</a> before.</p>
<p>To create a brand new repository and test it:</p>
<pre>
# Download dependencies
sudo aptitude install subversion
# Set up local repo, downloading the script to the appropiate directory
mkdir -p /tmp/srv/svn/foobar
svnadmin create /tmp/srv/svn/foobar
wget http://people.warp.es/~xtor/pre-commit-oo.org -O /tmp/srv/svn/foobar/hooks/pre-commit
chmod a+x /tmp/srv/svn/foobar/hooks/pre-commit
# Do a local checkout
mkdir -p /tmp/devel/svn/foobar
svn checkout file:///tmp/srv/svn/foobar /tmp/devel/svn/foobar
cd /tmp/devel/svn/foobar
</pre>
<p>Now, just copy an odt document to <tt>/tmp/devel/svn/foobar</tt>, add it to the repo and try to commit&#8230; You should see the pre-commit hook fail.</p>
<p>Or, if you have a repository with <a href="http://en.wikipedia.org/wiki/Open_Document">OpenDocument</a> files commited, you can just call the pre-commit hook as a regular script, with the <tt>--revision</tt> parameter:</p>
<pre>
# Usage: pre-commit path/to/repo --revision rev_num
/tmp/srv/svn/foobar/hooks/pre-commit /tmp/srv/svn/foobar/ --revision 1
</pre>
<p>Enjoy it! <img src='http://xtor.warp.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://people.warp.es/~xtor/blog/?feed=rss2&amp;p=770</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile and CMMi in small settings</title>
		<link>http://people.warp.es/~xtor/blog/?p=812</link>
		<comments>http://people.warp.es/~xtor/blog/?p=812#comments</comments>
		<pubDate>Wed, 31 Mar 2010 21:58:37 +0000</pubDate>
		<dc:creator>Héctor Blanco Alcaine</dc:creator>
				<category><![CDATA[Engineering]]></category>

		<guid isPermaLink="false">http://people.warp.es/~xtor/blog/?p=812</guid>
		<description><![CDATA[If you use agile methodologies, but are trying to benefit from the huge amount of industry knowledge stored in process frameworks like CMMi, you need to pay attention to some important facts about it. These are lessons that we have learnt at Warp while trying to mix agile methodologies with CMMi level 2 and 3 [...]]]></description>
			<content:encoded><![CDATA[<p>If you use agile methodologies, but are trying to benefit from the huge amount of <a href="http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/80000/4000/500/84510/84510.strip.gif">industry knowledge</a> stored in process frameworks like <a href="http://en.wikipedia.org/wiki/CMMI">CMMi</a>, you need to pay attention to some important facts about it. These are lessons that we have learnt at <a href="http://warp.es">Warp</a> while trying to mix <a href="http://en.wikipedia.org/wiki/Agile_software_development">agile methodologies</a> with CMMi level 2 and 3 practices.</p>
<h2>CMMi 2 complements agile methodologies</h2>
<p>Agile methodologies focus on development activities, while the first level of the staged CMMi (which in turn is level 2) focus on management. If your team is great developing software, you can still learn a lot of things from CMMi from a management point of view. For example, <a href="http://en.wikipedia.org/wiki/Process_area_(CMMI)#Measurement_and_Analysis_.28MA.29">Measurement and Analysis</a> will help you to define business goals and <a href="http://en.wikipedia.org/wiki/Key_performance_indicator">KPIs</a>.</p>
<h2>The model must be interpreted</h2>
<p>Theorically, the CMMi model is &#8220;methodology-agnostic&#8221;, but most of the examples you are going to find trying to explain it are assuming waterfall lifecycles or other heavy-weight process customs. You will need to be creative interpreting the model and the examples.</p>
<h2>The model must be fitted to your software lifecycles</h2>
<p>For instance, CMMi defines two process areas for project management: <a href="http://en.wikipedia.org/wiki/Process_area_(CMMI)#Project_Planning_.28PP.29">Project Planning</a> and <a href="http://en.wikipedia.org/wiki/Process_area_(CMMI)#Project_Monitoring_and_Control_.28PMC.29">Project Monitoring and Control</a>. It is a perfect fit for a predictive methodology with two clear Planning and Implementation phases, but when you are using an agile approach you will have planning and monitoring each iteration, and sometimes an additional planning phase prior to start working.</p>
<h2>Your projects should be alike</h2>
<p>For processes to be repeatable, and fulfill a lot of the standarization requirements covered by the generic practices, you need to repeat the same kind of projects. For instance, at Warp we do projects that range from ERP/CRM stuff to embedded systems, so we use different requirements and estimation techniques. CMMi wants you to standarize estimation tools and techniques, document every detail, and make sure everybody is aware and uses them. But when the <b>right</b> choice for each project is an ad-hoc technique, you would end up documenting a whole different process for each project!</p>
<h2>Quality, but not at any cost</h2>
<p>An important fact, especially if you are a small custom software development company with about 20 people, is that you need to find a trade-off between fully implementing some practices, like <a href="http://en.wikipedia.org/wiki/Process_area_(CMMI)#Process_and_Product_Quality_Assurance_.28PPQA.29">Process and Product Quality Assurance</a>, and how it translates to your cost structure. For example, you will need to relax some practices to avoid hiring PPQA people. (For those not acquainted with CMMi, PPQA is different from &#8220;software testing&#8221;).</p>
<h2>Implementing CMMi and passing a CMMi appraisal are different things</h2>
<p>CMMi appraisals require a lot of extra work (or plain waste), that you simply don&#8217;t need if you are just interested in enhancing the way you work. For example, each time you review a project&#8217;s deviation, if the project is on track you will need to record that <i>&#8220;you have reviewed the project&#8221;</i>, and that <i>&#8220;the project is on track&#8221;</i>. So instead of adopting common sense management rules, you will be focused on creating <a href="http://en.wikipedia.org/wiki/Muda_%28Japanese_term%29">Muda</a>!</p>
<p></p>
<p>To sum up: avoid judging CMMi beforehand, learn about it and just get the good things which add value and minimize waste.</p>
]]></content:encoded>
			<wfw:commentRss>http://people.warp.es/~xtor/blog/?feed=rss2&amp;p=812</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subversion pre-commit hook to check OpenDocument, explained</title>
		<link>http://people.warp.es/~xtor/blog/?p=745</link>
		<comments>http://people.warp.es/~xtor/blog/?p=745#comments</comments>
		<pubDate>Sun, 28 Mar 2010 17:57:29 +0000</pubDate>
		<dc:creator>Héctor Blanco Alcaine</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Free Software]]></category>

		<guid isPermaLink="false">http://people.warp.es/~xtor/blog/?p=745</guid>
		<description><![CDATA[In a previous post, I introduced the context for this pre-commit hook. Now I will explain the small Python script which does the work. If you are not familiar with Subversion hooks, you could take a look at this nice Wordaligned&#8217;s article before, but the whole idea is fairly easy to understand:

Our pre-commit hook has [...]]]></description>
			<content:encoded><![CDATA[<p>In a <a href="http://people.warp.es/~xtor/blog/?p=730">previous post</a>, I introduced the context for <a href="http://people.warp.es/~xtor/pre-commit-oo.org">this pre-commit hook</a>. Now I will explain the small <a href="http://en.wikipedia.org/wiki/Python_(programming_language)">Python</a> script which does the work. If you are not familiar with <a href="http://en.wikipedia.org/wiki/Subversion_(software)">Subversion</a> hooks, you could take a look at this nice <a href="http://wordaligned.org">Wordaligned</a>&#8217;s <a href="http://wordaligned.org/articles/a-subversion-pre-commit-hook">article</a> before, but the whole idea is fairly easy to understand:</p>
<ol>
<li>Our pre-commit hook has a transaction as its input.
 </li>
<li>A transaction is composed of changes to different files.
 </li>
<li>For each file changed, we check it against a set of rules.
 </li>
<li>If we found any error, the transaction fails and the commit is aborted.
</li>
</ol>
<p>So our pre-commit hook has two main classes:<br />
<il></p>
<li><tt>SvnTransaction</tt>: offers the main check method, and also handles how to know which files are modified in the transaction, dumps their contents, etc.
</li>
<li><tt>OdtFileChecker</tt>: checks an <a href="http://en.wikipedia.org/wiki/Opendocument">OpenDocument</a> Text file. We convert to text before, so it&#8217;s easier to run the other tools in a server. Our example just implements spelling and grammar checking.
</li>
<p></il></p>
<p>There is also a small auxiliary function, <tt>create_option_parser</tt> which creates the argument parser, feeding SvnTransaction with the required parameters.</p>
<p>So the hook&#8217;s main snippet is:</p>
<pre>
def main():
   "Executes the pre commmit hook program."

   parser = create_option_parser()

   try:
      transaction = SvnTransaction(parser.parse_args())
   except:
      parser.print_help()
      return 1

   errors = transaction.check()
   sys.stderr.write(transaction.message())

   return errors

if __name__ == '__main__':
   import sys
   sys.exit(main())
</pre>
<p><tt>transaction.check()</tt> extracts the files affected and call the actual file checker, storing messages and errors raised to be used afterwards. </p>
<pre>
   def check(self):
      """"Checks all the files added or changed in the transaction, returning
      the number or errors found."""

      errors = 0

      for file_name in self._files_changed():
         tmp_file = self._dump_file_content(file_name)

         checker = OdtChecker(tmp_file.name)
         errors += checker.check()
         self._message += checker.message()

         tmp_file.close()

      return errors
</pre>
<p>Each call to <tt>checker.check()</tt> checks the file handled by the <tt>checker</tt> object, using the next tools:<br />
<il></p>
<li><a href="http://stosberg.net/odt2txt/">odt2txt</a>: converts the OpenDocument Text file into a plain text file.
</li>
<li><a href="http://en.wikipedia.org/wiki/Aspell">aspell</a>: checks spelling.
</li>
<li><a href="http://people.warp.es/~xtor/blog/?p=717">LanguageTool</a>: checks grammar.
</li>
<p></il></p>
<p>Keep in mind that the current version uses Spanish language checks, and also the standard aspell dictionary. For your own usage, you would probably want to create a custom dictionary including terms like VAT, NDA, SPA&#8230;</p>
<pre>
   def check(self):
      "Checks the OpenDocument file, returning the number or errors found."

      self._odt2txt()
      self._check_ortography()
      self._check_grammar()

      return self._n_spelling_err + self._n_grammar_err

   def _odt2txt(self):
      "Converts the OpenDocument Text file into a plain text file."

      odt2txt_cmd = '%s %s --width=-1 --output=%s' \
                    % (ODT2TXT, self._path, self._tmp_file)
      odt2txt_msg = getoutput(odt2txt_cmd)

   def _check_ortography(self):
      "Checks the plain text file looking for spelling errors with aspell."

      check_cmd = 'cat %s | %s --lang=es list | sort | uniq' \
                  % (self._tmp_file, ASPELL)
      self._spelling_err += "\nChecking ortography using %s\n\n" % check_cmd
      self._spelling_err += getoutput(check_cmd) + "\n"
      self._n_spelling_err += len(self._spelling_err)

   def _check_grammar(self):
      "Checks the plain text file looking for grammar errors with LanguageTool."

      check_cmd = '%s -jar %s --language es -d WHITESPACE_RULE %s' \
                  % (JAVA, LANGUAGETOOL, self._tmp_file)
      self._grammar_err += "\nChecking grammar using %s\n\n" % check_cmd
      self._grammar_err += getoutput(check_cmd) + "\n"
      # 2 leading lines + 1 at the end, and 5 per error
      self._n_grammar_err += (len(self._grammar_err)-3) / 5
</pre>
<p>The paths to the different tools can be customized at the beginning of the file:</p>
<pre>
ASPELL = '/usr/bin/aspell'
JAVA = '/usr/bin/java'
LANGUAGETOOL = '/tmp/Language/LanguageTool.jar'
ODT2TXT = '/usr/bin/odt2txt'

SVNLOOK = '/usr/bin/svnlook'
</pre>
<p>In a forthcoming post, I will explain two different ways to test this pre-commit hook, so stay tuned <img src='http://xtor.warp.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>See also:<br />
<il></p>
<li><a href="http://people.warp.es/~xtor/blog/?p=730">A Subversion pre-commit hook for spell and grammar checking</a>
</li>
<li><a href="http://people.warp.es/~xtor/blog/?p=717">Grammar checking for OpenOffice.org</a></li>
<p></il></p>
]]></content:encoded>
			<wfw:commentRss>http://people.warp.es/~xtor/blog/?feed=rss2&amp;p=745</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
