<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">

<channel>
	<title>Planet Warp</title>
	<link>http://planet.warp.es</link>
	<language>en</language>
	<description>Planet Warp - http://planet.warp.es</description>

<item>
	<title>Golo: Acertijo Java (Solución)</title>
	<guid>http://www.capitangolo.net/Blog/?p=418</guid>
	<link>http://www.capitangolo.net/Blog/?p=418</link>
	<description>&lt;p&gt;
A principios de mes proponía un &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=394&quot;&gt;Acertijo Java&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
¿Qué sale por pantalla al ejecutar la clase FooBar?
&lt;/p&gt;
&lt;pre&gt;
import static java.lang.System.*;
public class FooBar {
  public FooBar() {
    out.print(&quot; Instance &quot;);
  }
  static {
    out.print(&quot; Static &quot;);
  }
  public static void main (String args) {
    out.print(&quot; Main &quot;);
    new FooBar();
  }
}
&lt;/pre&gt;
&lt;p&gt;
Simplificando, lo que ocurre es lo siguiente:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt; Se &lt;strong&gt;carga&lt;/strong&gt; la clase FooBar en memoria &lt;/li&gt;
&lt;li&gt; Se ejecutan los &lt;strong&gt;bloques estáticos:&lt;/strong&gt; static{} &lt;/li&gt;
&lt;li&gt; &lt;strong&gt;out.print(&amp;#8221; Static &amp;#8220;);&lt;/strong&gt; está en un bloque estático &lt;/li&gt;
&lt;li&gt; Una vez cargada la clase, ya se pueden ejecutar &lt;strong&gt;métodos estáticos&lt;/strong&gt; como main &lt;/li&gt;
&lt;li&gt; &lt;strong&gt;out.print(&amp;#8221; Main &amp;#8220;);&lt;/strong&gt; está dentro del método main &lt;/li&gt;
&lt;li&gt; Se crea una instancia de la clase FooBar en el método main &lt;/li&gt;
&lt;li&gt; Para ello se ejecuta el &lt;strong&gt;constructor&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt; &lt;strong&gt;out.print(&amp;#8221; Instance &amp;#8220;);&lt;/strong&gt; está en el constructor &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Siguiendo este razonamiento, la opción correcta sería la c: &amp;#8220;Static Main Instance&amp;#8221;.
&lt;/p&gt;
&lt;p&gt;
La opción c parece correcta, &lt;strong&gt;pero no se llega a ejecutar el método main&lt;/strong&gt;. Recordemos la firma que tiene que tener el método main para ser la entrada de un programa java:
&lt;/p&gt;
&lt;pre&gt;
  public static void main (String[] args) {}
&lt;/pre&gt;
&lt;p&gt;
Ha de ser esa o equivalente. ¿Ves la diferencia? El parámetro args tiene que ser un array [] de String, ya que representa los &lt;strong&gt;argumentos&lt;/strong&gt; introducidos por línea de comandos. En la clase FooBar el parámetro args es simplemente un String.
&lt;/p&gt;
&lt;p&gt;
Por ello, el código no se ejcutará. Java mostrará un error indicando que en la clase FooBar no existe un método main. Es por ello que &lt;strong&gt;la opción correcta era la f: No se ejecutará&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
En el día a día, un programador no sólo tiene que saber traducir ideas a código. En algunas ocasiones el código no se comporta como queremos y es cuando hay que buscar el &lt;strong&gt;detalle&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
La agilidad con la que uno detecta pequeños detalles marca la &lt;strong&gt;diferencia&lt;/strong&gt;. Algunos factores que afectan a esta agilidad son, la paciencia, saber escribir código claro, y sobre todo el &lt;strong&gt;conocimiento&lt;/strong&gt; de las herramientas con las que uno trabaja.
&lt;/p&gt;
&lt;p&gt;
Igual que hice en el otro post, animo a cualquiera a &lt;a href=&quot;http://www.amazon.co.uk/dp/0071591060/&quot;&gt;ponerse a prueba estudiando&lt;/a&gt; la certificación de Programador Java o acudir a uno de los &lt;a href=&quot;http://warp.es/blog/2010/06/01/formacion-java-y-mysql-en-zaragoza-calendario-2010-2/&quot;&gt;cursos oficiales que imparto&lt;/a&gt;, es toda una experiencia.&lt;/p&gt;</description>
	<pubDate>Fri, 27 Aug 2010 20:00:06 +0000</pubDate>
</item>
<item>
	<title>Hector: MeeGo Handset Bootchart on Aava Mobile</title>
	<guid>http://people.warp.es/~xtor/blog/?p=983</guid>
	<link>http://people.warp.es/~xtor/blog/?p=983</link>
	<description>&lt;p&gt;Below is a bootchart showing an &lt;a href=&quot;http://people.warp.es/~xtor/blog/?p=939&quot;&gt;Aava Mobile&lt;/a&gt;&amp;#8217;s &lt;a href=&quot;http://www.bootchart.org/&quot;&gt;bootchart&lt;/a&gt; using MeeGo Handheld. I used the &lt;code&gt;meego-handset-ia32-aava-mtf-1.0.80.15.20100813.1-sda.bin&lt;/code&gt; image.&lt;/p&gt;
&lt;p&gt;To generate the bootchart, you just need to mic-chroot and install these two packages (the default kernel has process accounting enabled):&lt;/p&gt;
&lt;p&gt;&lt;code&gt;yum install bootchart acct&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Then, just copy the image to the boot media, and turn the power on &lt;img src=&quot;http://xtor.warp.es/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt;  Your chart will be stored in &lt;code&gt;/var/log/bootchart-YYYYMMDD-HHMM.svg&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://people.warp.es/~xtor/img/bootchart-19591231-1632.svg&quot;&gt;&lt;img width=&quot;100%&quot; src=&quot;http://people.warp.es/~xtor/img/bootchart-19591231-1632.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://people.warp.es/~xtor/img/bootchart-19591231-1632.svg&quot;&gt;(Click to enlarge)&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 26 Aug 2010 16:25:44 +0000</pubDate>
</item>
<item>
	<title>Hector: MeeGo Handset: from power-on to system init</title>
	<guid>http://people.warp.es/~xtor/blog/?p=978</guid>
	<link>http://people.warp.es/~xtor/blog/?p=978</link>
	<description>&lt;p&gt;Being fully aware of what&amp;#8217;s happening on your system, since the very first stages, is one of the things that I really love about open source software.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;http://people.warp.es/~xtor/blog/?p=939&quot;&gt;this lovely Aava Mobile&lt;/a&gt; running &lt;a href=&quot;http://en.wikipedia.org/wiki/MeeGo&quot;&gt;MeeGo&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/MeeGo#Handset&quot;&gt;Handset&lt;/a&gt; &lt;img src=&quot;http://xtor.warp.es/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2&gt;Boot loader&lt;/h2&gt;
&lt;p&gt;MeeGo Handheld uses &lt;a href=&quot;http://kboot.sourceforge.net/&quot;&gt;kboot&lt;/a&gt; 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.&lt;/p&gt;
&lt;h2&gt;Kernel&lt;/h2&gt;
&lt;p&gt;MeeGo Handheld &lt;a href=&quot;http://en.wikipedia.org/wiki/Linux_kernel&quot;&gt;kernel&lt;/a&gt;&amp;#8217;s default &lt;a href=&quot;http://www.kernel.org/doc/Documentation/kernel-parameters.txt&quot;&gt;parameters&lt;/a&gt; are:&lt;/p&gt;
&lt;pre&gt;ro pci=noearly console=tty1 console=ttyS0 earlyprintk=mrst loglevel=8 nosplash s0ix_latency=160&lt;/pre&gt;
&lt;p&gt;An brief explanation for each parameter is included below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ro&lt;/code&gt;: mount root device read-only on boot.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pci=noearly&lt;/code&gt;: skip any early type 1 scanning.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;console=tty1&lt;/code&gt;: set tty1 as output console device. &lt;/li&gt;
&lt;li&gt;&lt;code&gt;console=ttyS0&lt;/code&gt;: set ttyS0 (serial) as output console device.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;earlyprintk=mrst&lt;/code&gt;: early printk feature (mrst =&amp;gt; Moorestown) for debugging during the early stages of the bootup. It allows to use printks even before the real console drivers are available.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;loglevel=8&lt;/code&gt;: full debug. Any kernel message will be printed to the console.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nosplash&lt;/code&gt;: not used by the kernel, but forwarded to the root filesystem&amp;#8217;s system init.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;s0ix_latency=160&lt;/code&gt;: related with the advanced power management capabilites of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Moorestown_(computing_platform)&quot;&gt;Moorestown&lt;/a&gt; platform.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Ramdisk&lt;/h2&gt;
&lt;p&gt;Once the kernel is loaded, it enters the &lt;a href=&quot;http://en.wikipedia.org/wiki/Initrd&quot;&gt;ramdisk&lt;/a&gt; initialization sequence. Its main goal is finding and mounting a suitable root partition, so you don&amp;#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.&lt;/p&gt;
&lt;p&gt;MeeGo Handheld ramdisk is based on &lt;a href=&quot;http://en.wikipedia.org/wiki/Fedora_(operating_system)&quot;&gt;Fedora&lt;/a&gt;&amp;#8217;s. It includes a basic selection of early user space commands, but -surprisingly for an embedded environment-, it is not &lt;a href=&quot;http://en.wikipedia.org/wiki/Busybox&quot;&gt;Busybox&lt;/a&gt; based, sporting a complete &lt;a href=&quot;http://en.wikipedia.org/wiki/Bash_%28Unix_shell%29&quot;&gt;bash shell&lt;/a&gt; and the full-fledged version of these tools.&lt;/p&gt;
&lt;h3&gt;Filesystem layout&lt;/h3&gt;
&lt;p&gt;The ramdisk contents are a bare bones UNIX system, stripped down to contain just the basic stuff:&lt;/p&gt;
&lt;pre&gt;
├── bin
│   ├── bash
│   ├── cat
│   ├── chmod
│   ├── cut
│   ├── dd
│   ├── dmesg
│   ├── echo
│   ├── env
│   ├── grep
│   ├── kill
│   ├── less
│   ├── ln
│   ├── ls
│   ├── mkdir
│   ├── mknod
│   ├── mount
│   ├── rm
│   ├── sed
│   ├── sh -&amp;gt; bash
│   ├── sleep
│   └── umount
├── dev
├── etc
│   ├── fstab
│   └── udev
│       └── rules.d
&lt;strong&gt;├── init&lt;/strong&gt;
├── 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
│   ├── &lt;strong&gt;run-init&lt;/strong&gt;
│   ├── udevadm
│   └── udevd
├── sys
├── sysroot
└── usr
    └── lib
        ├── libblkid.so.1
        ├── libdevmapper.so.1.02
        └── libuuid.so.1
&lt;/pre&gt;
&lt;h3&gt;/init script&lt;/h3&gt;
&lt;p&gt;Once the kernel loads, it starts executing the /init script, that:&lt;/p&gt;
&lt;ol&gt;
&lt;li dir=&quot;ltr&quot;&gt;Sets up the basic environment&lt;/li&gt;
&lt;li dir=&quot;ltr&quot;&gt;Parses kernel command line options&lt;/li&gt;
&lt;li dir=&quot;ltr&quot;&gt;Sets up root filesystem&lt;/li&gt;
&lt;li dir=&quot;ltr&quot;&gt;Transfers control to the root filesystem&amp;#8217;s init&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We are going to walk through this small piece of code, skipping some setup and debug sections for clarity&amp;#8217;s sake.&lt;/p&gt;
&lt;h4&gt;1. Set up the basic environment&lt;/h4&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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&amp;#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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Setting up &lt;a href=&quot;http://en.wikipedia.org/wiki/Udev&quot;&gt;udev&lt;/a&gt;&amp;#8217;s basic environment under /dev (mount udev and create basic device files under /dev: console, null, kmsg, pts, shm, fd, stdin, stdout, stderr)&lt;/li&gt;
&lt;li&gt;Mounting pseudo filesystems (/proc and /sys)&lt;/li&gt;
&lt;li&gt;Disable the usermode helper hotplug mechanism (it relies on udevd instead)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. Parse kernel command line options&lt;/h4&gt;
&lt;p&gt;It parses the command line options, and then:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Overrides the default values if any specific ones are provided.&lt;/li&gt;
&lt;li&gt;Blacklists any module that may interfere with the system.&lt;/li&gt;
&lt;li&gt;Handles the kernel module options, writing them on the ramdisk&amp;#8217;s modprobe.conf&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The main variables used by the script are detailed below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;init&lt;/code&gt;: specifies the program which will be executed once the initial ramdisk stage ends.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ro, rw&lt;/code&gt; =&amp;gt; &lt;code&gt;root_ro, root_rw&lt;/code&gt; variables, control wether the root file system is mounted read-only or read-write.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;quiet&lt;/code&gt;: enable or disable boot process debug messages.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shell&lt;/code&gt;: if enabled, drops the user to a shell, just after setting up /dev/root.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eshell&lt;/code&gt;: if enabled, drops the user to a shell, just before init.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other variables, like &lt;code&gt;live_ram&lt;/code&gt;, &lt;code&gt;live_locale&lt;/code&gt;, &lt;code&gt;overlay&lt;/code&gt; or &lt;code&gt;check&lt;/code&gt;, are not used.&lt;/p&gt;
&lt;h4&gt;3. Set up root filesystem&lt;/h4&gt;
&lt;p&gt;Most of the /init script code handle setting up the root filesystem.&lt;/p&gt;
&lt;p&gt;The detection has two clear execution paths, depending on the &quot;&lt;code&gt;autodetect&lt;/code&gt;&quot; variable&amp;#8217;s value. This variable is not defined or processed from the kernel&amp;#8217;s command line, so it seems it&amp;#8217;s just some dead code from another MeeGo initrd.&lt;/p&gt;
&lt;p&gt;First, three variables are initialized from the embedded /etc/fstab file, or the related kernel command line options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;root&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rootflags&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rootfstype&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For instance, the default &lt;code&gt;/etc/fstab&lt;/code&gt; file, stored inside the ramdisk, holds this root filesystem definition:&lt;/p&gt;
&lt;pre&gt;/dev/sda1 / ext3 defaults,noatime 0 0&lt;/pre&gt;
&lt;p&gt;Once these variables are set, if &lt;code&gt;autodetect&lt;/code&gt; is enabled, it adds different udev rules, depending on how the root filesystem is specified via the &lt;code&gt;root&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;autodetect&lt;/code&gt; 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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SD devices: &lt;code&gt;mmcblk0, mmcblk1, mmcblk2, mmcblk3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;USB devices: &lt;code&gt;sda, sdb, sdc, sdd, sde, sdf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;NAND devices: &lt;code&gt;nda, ndb, ndc&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After this process, the &lt;code&gt;thingtomount&lt;/code&gt; variable must be set, or an error has occurred.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(At this point, if the &quot;shell&quot; parameter is enabled, the user is dropped on a bash shell)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The final stage of the root filesystem setup involves making sure the device specified by &lt;code&gt;thingtomount&lt;/code&gt; holds a suitable root file system, composing mountoptions with &lt;code&gt;rootflags&lt;/code&gt;, &lt;code&gt;root_rw&lt;/code&gt; and &lt;code&gt;root_ro&lt;/code&gt;, and, finally, mounting the root filesystem at &lt;code&gt;/sysroot&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;4. Transfer control to the root filesystem&amp;#8217;s init&lt;/h4&gt;
&lt;p&gt;Once the new root filesystem is available, the process is almost done. The script just:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sets wether or not to pass kernel cmdline to the root filesystem&amp;#8217;s init (because init can be overriden by a kernel parameter)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(At this point, if the &quot;eshell&quot; parameter is enabled, the user is dropped on a bash shell)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Kills udevd to enable the new system to take control of the plugging events.&lt;/li&gt;
&lt;li&gt;Calls &lt;code&gt;/sbin/run-init &quot;$@&quot;&lt;/code&gt;, which is in charge of this little piece of black magic: &lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
#!/bin/bash
cd /sysroot
mount --move . /
exec /sbin/chroot . &quot;$init&quot; &quot;$@&quot;&lt;/pre&gt;
&lt;p&gt;At this point, everything is ready for the system initialization to start&amp;#8230;&lt;/p&gt;</description>
	<pubDate>Mon, 16 Aug 2010 16:07:38 +0000</pubDate>
</item>
<item>
	<title>Hector: x86 MeeGo handhelds on their way…</title>
	<guid>http://people.warp.es/~xtor/blog/?p=939</guid>
	<link>http://people.warp.es/~xtor/blog/?p=939</link>
	<description>&lt;p&gt;Since I started to &lt;a href=&quot;http://xtor.warp.es/?p=172&quot;&gt;play&lt;/a&gt; with &lt;a href=&quot;http://en.wikipedia.org/wiki/Intel_Atom&quot;&gt;Atom&lt;/a&gt; based devices, this is the first time I have a real &amp;#8220;handheld&amp;#8221; in my hands: the &lt;a href=&quot;http://www.aavamobile.com/&quot;&gt;Aava Mobile&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s still a little bigger than a &lt;a href=&quot;http://en.wikipedia.org/wiki/Google_phone&quot;&gt;Nexus One&lt;/a&gt;, but anyway, it&amp;#8217;s amazing how &lt;a href=&quot;http://en.wikipedia.org/wiki/Intel&quot;&gt;they&lt;/a&gt; managed to miniaturize a complete computer into a &lt;a href=&quot;http://en.wikipedia.org/wiki/System-on-a-chip&quot;&gt;SOC&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://people.warp.es/~xtor/img/meego_horizontal.jpg&quot;&gt;&lt;img src=&quot;http://people.warp.es/~xtor/img/meego_horizontal_small.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://people.warp.es/~xtor/img/meego_vertical.jpg&quot;&gt;&lt;img src=&quot;http://people.warp.es/~xtor/img/meego_vertical_small.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://people.warp.es/~xtor/img/meego_tumba-os.jpg&quot;&gt;&lt;img src=&quot;http://people.warp.es/~xtor/img/meego_tumba-os_small.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Since mid 2007, a device like a &lt;a href=&quot;http://xtor.warp.es/?p=172&quot;&gt;Samsung Q1 Ultra&lt;/a&gt; has reduced four times its size, sporting some new goodies like a bunch of sensors (ambient light, proximity, 3D compass, accelerometer&amp;#8230;).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/MeeGo&quot;&gt;MeeGo&lt;/a&gt; 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!&lt;/p&gt;</description>
	<pubDate>Thu, 12 Aug 2010 21:05:12 +0000</pubDate>
</item>
<item>
	<title>Golo: Acertijo Java</title>
	<guid>http://www.capitangolo.net/Blog/?p=394</guid>
	<link>http://www.capitangolo.net/Blog/?p=394</link>
	<description>&lt;p&gt;
Volvemos después de la resaca de año nuevo con un acertijo java.
&lt;/p&gt;
&lt;p&gt;
Suponiendo que el contenido del archivo FooBar.java es el siguiente&amp;#8230; ¿Qué saldrá por pantalla al ejecutar la clase FooBar?
&lt;/p&gt;
&lt;pre&gt;

import static java.lang.System.*;
public class FooBar {
  public FooBar() {
    out.print(&quot; Instance &quot;);
  }
  static {
    out.print(&quot; Static &quot;);
  }
  public static void main (String args) {
    out.print(&quot; Main &quot;);
    new FooBar();
  }
}
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt; Main Static Instance &lt;/li&gt;
&lt;li&gt; Instance Static Main &lt;/li&gt;
&lt;li&gt; Static Main Instance &lt;/li&gt;
&lt;li&gt; Main Instance &lt;/li&gt;
&lt;li&gt; No compilará &lt;/li&gt;
&lt;li&gt; No se ejecutará &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Hagan sus apuestas&amp;#8230;
&lt;/p&gt;
&lt;p&gt;
Antes de empezar a preparar la certificación SCJP (Sun Certified Java Programmer) no había caído en la cuenta de cuántas cosas desconocía de programación.
&lt;/p&gt;
&lt;p&gt;
Estés preparando o no la certificación de programador, recomiendo &lt;a href=&quot;http://www.amazon.co.uk/dp/0071591060/&quot;&gt;la guía de Kathy Sierra&lt;/a&gt;. Además, si quieres que un experto en java (modestia aparte) te asista, puedes invitarme a tomar una cerveza, o apuntarte al curso oficial que impartiré en septiembre: &lt;a href=&quot;http://www.facebook.com/l.php?u=http%3A%2F%2Feducation.oracle.com%2Fpls%2Fweb_prod-plq-dad%2Fdb_pages.getCourseDesc%3Fdc%3DD61750GC10&amp;#038;h=d1a55&quot;&gt;SL-275-SE6 Java Programming Language&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
¡Date prisa, al tercero que me invite a una cerveza ya no hablaré coherentemente, y el curso tiene las plazas limitadas!
&lt;/p&gt;
&lt;p&gt;
Un Saludo!
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Actualizado:&lt;/strong&gt; Puedes encontrar la solución &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=418&quot;&gt;aquí&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Mon, 02 Aug 2010 14:30:06 +0000</pubDate>
</item>
<item>
	<title>Hector: Private clouds</title>
	<guid>http://people.warp.es/~xtor/blog/?p=916</guid>
	<link>http://people.warp.es/~xtor/blog/?p=916</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://skillsmatter.com/podcast/agile-scrum/private-clouds-for-agile-teams&quot;&gt;Private clouds for Agile teams&lt;/a&gt; was the name of a brief introduction to some existing cloud technologies, held last Thursday in &lt;a href=&quot;http://skillsmatter.com&quot;&gt;SkillsMatters&lt;/a&gt; by Toby Hobson from &lt;a href=&quot;http://www.raptorconsultants.com/&quot;&gt;Raptor Consultants&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The first half of the talk outlined some of the features and practical problems of &lt;a href=&quot;http://xtor.warp.es/?feed=rss2&quot;&gt;cloud computing&lt;/a&gt;. For instance, the lack of a suitable &lt;b&gt;licensing&lt;/b&gt; scheme from some OS/application vendors, the difficulties integrating &lt;b&gt;legacy&lt;/b&gt; systems, or the concerns about the &lt;b&gt;security&lt;/b&gt; of production environments. This problems, especially the last one, are limiting cloud deployments to development and integration environments, using private cloud technologies.&lt;/p&gt;
&lt;p&gt;Then he went on comparing some of the main offerings for the deployment of these sort of clouds:&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;&lt;a href=&quot;http://www.3tera.com/Cloud-computing/&quot;&gt;3Tera&lt;/a&gt;: easy to use GUI, most suited to non-techies.
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.redhat.com/solutions/cloud/foundations/&quot;&gt;Red Hat&lt;/a&gt;: good support, but probably you still need to buy professional services. Best option for Red Hat shops doing strategic investment.
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openqrm-enterprise.com/&quot;&gt;OpenQRM&lt;/a&gt;: 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.
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ubuntu.com/cloud/private&quot;&gt;Ubuntu Enterprise Cloud&lt;/a&gt;: excellent EC2 support (using &lt;a href=&quot;http://en.wikipedia.org/wiki/Eucalyptus_(computing)&quot;&gt;Eucalyptus&lt;/a&gt;, &lt;a href=&quot;http://xtor.warp.es/?p=29&amp;#038;cpage=1#comment-95&quot;&gt;hi Mårten! &lt;img src=&quot;http://xtor.warp.es/wp-includes/images/smilies/icon_razz.gif&quot; alt=&quot;:P&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/a&gt;), easy to setup, good documentation and excellent support. The best option to deploy quickly a private cloud.
&lt;/li&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Regarding the &amp;#8220;for Agile teams&amp;#8221; part, unfortunately the talk didn&amp;#8217;t delve deeper into development topics, but it mentioned build and test automation, and the need for a good scripting platform/API.&lt;/p&gt;
&lt;p&gt;You can &lt;a href=&quot;http://skillsmatter.com/podcast/agile-scrum/private-clouds-for-agile-teams&quot;&gt;find the podcast here&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Sun, 01 Aug 2010 09:39:59 +0000</pubDate>
</item>
<item>
	<title>Hector: Business Analysts and Agile projects</title>
	<guid>http://people.warp.es/~xtor/blog/?p=900</guid>
	<link>http://people.warp.es/~xtor/blog/?p=900</link>
	<description>&lt;p&gt;Yesterday, I attended &lt;a href=&quot;http://skillsmatter.com/podcast/agile-scrum/allan-kelly-the-business-analysts-role-on-agile-projects&quot;&gt;The Business Analyst&amp;#8217;s role on Agile projects&lt;/a&gt; at &lt;a href=&quot;http://skillsmatter.com&quot;&gt;Skills Matters&lt;/a&gt;. &lt;a href=&quot;http://www.allankelly.net&quot;&gt;Allan Kelly&lt;/a&gt; spoke about &amp;#8220;business analysis&amp;#8221; and how it fits in an agile project.&lt;/p&gt;
&lt;p&gt;He talked about how naive some of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Extreme_programming&quot;&gt;Extreme Programming&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Agile_Manifesto&quot;&gt;Agile&lt;/a&gt; original principles were, regarding analysis activities. Replacing &amp;#8220;the customer&amp;#8221; in &lt;b&gt;make the customer always available&lt;/b&gt; 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.&lt;/p&gt;
&lt;p&gt;I liked his explanation -with actual data from the MIT Sloan review-, of why, in an organizational improvement context, &lt;i&gt;doing the things right&lt;/i&gt; before is better than &lt;i&gt;doing the things right&lt;/i&gt; at first. (Slide 18, The Alignment Trap)&lt;/p&gt;
&lt;p&gt;When he talked about &lt;i&gt;Just In Time Requirements&lt;/i&gt;, 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.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t agree, at least as a general definition, with his standpoint of SCRUM as a &amp;#8220;project management method without a project manager&amp;#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).&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://allankelly.blogspot.com/2010/07/slides-from-skills-matter-ba-role-in.html&quot;&gt;slides and video are available&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Fri, 23 Jul 2010 15:05:32 +0000</pubDate>
</item>
<item>
	<title>Dani: Yo y mis juguetes 3G</title>
	<guid>http://dani.warp.es/?p=271</guid>
	<link>http://dani.warp.es/?p=271</link>
	<description>&lt;p&gt;Es verdad, hay que confesarlo. Tengo un problema con los aparatos&amp;#8230; No puedo estar quieto con ellos.&lt;/p&gt;
&lt;p&gt;Hace menos de un mes acabó cayendo en mis manos un lector de tinta electrónica &lt;a href=&quot;http://www.sonystyle.com/webapp/wcs/stores/servlet/ProductDisplay?catalogId=10551&amp;#038;storeId=10151&amp;#038;langId=-1&amp;#038;productId=8198552921666064650&quot;&gt;Sony PRS.900&lt;/a&gt;. El aparato en sí está bastante bien. Una pantalla de 7&amp;#8242;, pantalla táctil (aunque admito todo tipo de críticas acerca de los reflejos que produce) e incluso 3G que permanece el 99,999% del tiempo desactivado porque no sirve para nada excepto para comprar libros en la tienda online de Sony. Para más INRI, el aparato es &amp;#8220;Sold in USA&amp;#8221;, por lo que el 3G sólo funciona en el país yankee.&lt;/p&gt;
&lt;p&gt;Para hablar acerca de editoriales, libros, precios, gobiernos o de por qué hay bestsellers en Amazon Reino Unido que cuestan un 40% lo que cuestan en la Fnac, ya hay otras páginas. Yo he venido aquí a hablar de mi libro&amp;#8230; o sea, de mi problema&amp;#8230; o sea, de dejar quieto un aparato sin meterle la zarpa, actualización, firmware, flash, update o una sarta de bits que le provoquen convulsiones y deje de funcionar como debía.&lt;/p&gt;
&lt;p&gt;Desde el principio el tema que más me picó fue el tema del 3G. Tener un aparato que funciona al 99% está bien, pero saber que nunca vas a poder usar ese 1% es terrible. Eso sí, conseguir que funcione ese 1% aunque jamás necesites utilizarlo es la bomba. Por tanto, había que conseguir que funcionase el 3G.&lt;/p&gt;
&lt;p&gt;Como primer paso, busqué lo que había disponible sobre el aparato. Encontré unos firmwares de unos rusos muy listos (o desesperados) que habían traducido el interfaz a la lengua de las muñecas Matroskas. Genial, la parte dificil estaba hecha. Más si habían metido fuentes cirílicas. Para lo que me interesaba: la gente ya sabía &amp;#8220;flashear&amp;#8221; un dispositivo de estos.&lt;/p&gt;
&lt;p&gt;El Sony PRS-900 contiene un sistema Linux (LinuxLink) de TimeSys. El sistema contiene un sistema de ficheros de tipo cramfs y con algunos pequeños tutoriales, es razonablemente sencillo cambiarlo. El mayor problema es que para flashearlo es necesario un equipo con windows (hay que hacer llamadas a una DLL de windows para entrar en modo recovery).&lt;/p&gt;
&lt;p&gt;Pim Pam Pum, lector flasheado. Si había funcionado la primera vez con un firmware ruso, la siguiente podía funcionar con un firmware Made in Spain. Así, descomprimí la imagen cramfs y me puse a mirarle las tripas al aparato. Por dentro del directorio /opt/sony/ebook/application&amp;#8230; se encuentra la mayor parte del software que ve el usuario. Parece una aplicación bastante flexible, que supongo que será la piedra angular de Sony para sus lectores. Muy probablemente, un sólo software podrán utilizarlo para el PRS-300, PRS-500, PRS-505, etc ya que afecta a todo el dispositivo; desde el cambio de hora, hasta las características soportadas por el dispositivo, pasando por la configuración del APN del 3G (uhmmm &lt;img src=&quot;http://dani.warp.es/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt;  ).&lt;/p&gt;
&lt;p&gt;Me propuse cambiar ese valor para &amp;#8220;esquivar&amp;#8221; el APN que tienen en consorcio Sony y AT&amp;#038;T en Estados Unidos, y lo cambié por el de movistar (junto con una SIM). Además, quité la configuración del proxy que también estaba presente, ya que parece que la tienda que muestra el PRS-900 es a través de un navegador web reducido.&lt;/p&gt;
&lt;p&gt;Hechos los cambios, nueva imagen, y a flashear. Fracaso total. El lector no conectaba y lloraba pidiendo que le quitase esa SIM del infierno. &lt;/p&gt;
&lt;p&gt;Los rusos listos también habían encontrado el modo de pruebas de hardware del equipo. Gracias a una pequeña combinación de botones, se puede acceder a todo un menu interno del aparato para probar pantalla, calibrarla, y/o acceder a otra información o configuraciones. Lo mejor de todo es que algunas de las opciones mostraban un volcado de los registros del aparato. Click. Volcado a la SD. A investigar&amp;#8230;&lt;/p&gt;
&lt;p&gt;En los logs del sistema (nada parecido a un log Unix), aparecen 3 tipos de archivos. Los que están en formato binario puro (ya si eso les voy pidiendo el manual a Sony&amp;#8230;), los que traducen el formato binario a un formato legible, aunque mediante códigos (o llamo a un egiptólogo para que me lo descifre por asociaciones), y por último, los que muestran esos códigos traducidos a cosas más humanas.&lt;/p&gt;
&lt;p&gt;Como ejemplo:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
0,  Wed 31 Dec 1969 19:00:08,  883687, CM, Call API, Create Instance,  0,  0,  0&lt;br /&gt;
1,  Wed 31 Dec 1969 19:00:09,  36165, log, start,  0,  0,  0,  0&lt;br /&gt;
2,  Wed 31 Dec 1969 19:00:09,  43897, pm, stateChangeLockReq, Run,  0,  0,  0&lt;br /&gt;
3,  Wed 31 Dec 1969 19:00:09,  69969, pm, doStateChange, Off, Run,  0,  0&lt;br /&gt;
4,  Wed 31 Dec 1969 19:00:09,  70066, pm, deviceStateChange, Start, Run,  0,  0&lt;br /&gt;
5,  Wed 31 Dec 1969 19:00:09,  71506, pm, deviceStateChange, Finish, Run,  0,  0&lt;br /&gt;
6,  Sat 10 Jan 2009 03:30:36,  116727, subCPU, send, system, bootFinish,  0,  0&lt;br /&gt;
7,  Sat 10 Jan 2009 03:30:36,  124550, subCPU, send, key, onOff,  822083584,  0&lt;br /&gt;
8,  Sat 10 Jan 2009 03:30:36,  134396, subCPU, send, touchpanel, onOff,  822083584,  0&lt;br /&gt;
9,  Sat 10 Jan 2009 03:30:36,  144468, subCPU, send, touchpanel, sampling,  50331648,  0&lt;br /&gt;
10,  Sat 10 Jan 2009 03:30:36,  154418, subCPU, send, touchpanel, breaktime,  16777216,  0&lt;br /&gt;
11,  Sat 10 Jan 2009 03:30:36,  164455, subCPU, send, LED, LED,  0,  0&lt;br /&gt;
12,  Sat 10 Jan 2009 03:30:36,  174444, subCPU, send, battery, queryLevel,  0,  0&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Bastante aceptable&amp;#8230;&lt;/p&gt;
&lt;p&gt;Ahora era cuestión de investigar qué narices estaba pasando con el módulo 3G&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
CM, Received UR,  [*EMRDY: 1]&lt;br /&gt;
CM, State, Radio Off,  0,  0,  0&lt;br /&gt;
CM, Sent ATCom, ATE0, OK,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT+CMEE=1, OK,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT+CPIN?, OK,  0,  0&lt;br /&gt;
CM, Info, Sleep Mode, Can Sleep,  0,  0&lt;br /&gt;
WAN, getInfo,  0,  0,  0,  0&lt;br /&gt;
WAN, stateChange, partialOn,  2,  2,  8&lt;br /&gt;
CM, Sent ATCom, AT+CGSN, OK,  0,  0&lt;br /&gt;
CM, Call API, Get Info,  0,  0,  0&lt;br /&gt;
WAN, getInfo,  0,  0,  0,  0&lt;br /&gt;
WAN, lock,  1,  0,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT+CRSM=176,12258,0,0,10, OK,  0,  0&lt;br /&gt;
WAN, unlock,  0,  0,  0,  0&lt;br /&gt;
WAN, lock,  1,  0,  0,  0&lt;br /&gt;
Call API, Stop,  0,  0,  0&lt;br /&gt;
WAN, stop,  0,  0,  0,  0&lt;br /&gt;
WAN, stateChange, waitStop,  2,  2,  7&lt;br /&gt;
CM, Sent ATCom, AT+CFUN=0, OK,  0,  0&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;A grosso modo, lo que se ve es que el dispositivo despierta (*EMRDY: 1), oculta el eco local (ATE0), activa los errores numéricos del módulo (AT+CMEE=1) y consulta si necesita PIN (como lo tenía desactivado, todo sin problemas). Después, solicita el número de serie del aparato (normalmente se hace para mostrarlo en algún menú para información del usuario), y llega a un punto en el que lee de forma binaria la SIM, haciendo:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
AT+CRSM=176,12258,0,0,10&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
comando que lee el número de identificación de la SIM (ICCID). Tras esta lectura (teoricamente fructuosa), se ve mucho &amp;#8220;Stop&amp;#8221; y un AT+CFUN=0 que acaba apagando el módulo de telefonía.&lt;/p&gt;
&lt;p&gt;Hasta este punto, es común tanto para la SIM de Movistar como para la de AT&amp;#038;T.&lt;/p&gt;
&lt;p&gt;Si seguimos indagando, parece que con la SIM de AT&amp;#038;T, el módulo ya no sigue progresando. Recibe notificaciones para intentar despertarse de nuevo y seguir conectando, pero no hay más comandos AT, sino sólo estos intentos en vano. Sin embargo, con la SIM de Movistar, se puede ver:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
CM, Received UR,  [*EMRDY: 1]&lt;br /&gt;
CM, State, Radio Off,  0,  0,  0&lt;br /&gt;
CM, Sent ATCom, ATE0, OK,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT+CMEE=1, OK,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT+CPIN?, OK,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT+CREG=1, OK,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT+CGREG=1, OK,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT*E2CFUN=1, OK,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT+CFUN=1, OK,  0,  0&lt;br /&gt;
CM, Received UR,  [*E2CFUN: 1, 1, 0&lt;br /&gt;
CM, State, No Service,  0,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT*EIAD=0, OK,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT*EIAC=1, OK,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT+CSCS=IRA, OK,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT*EIAPSW=1,1, OK,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT*EIAAUW=1,1, OK,  0,  0&lt;br /&gt;
WAN, stateChange, on,  2,  2,  4&lt;br /&gt;
CM, Received UR,  [*ESTKSMENU: mo&lt;br /&gt;
CM, Received UR,  [+CREG: 1]&lt;br /&gt;
CM, Received UR,  [+CGREG: 1]&lt;br /&gt;
CM, State, Attached,  0,  0,  0&lt;br /&gt;
WAN, notifyState, registered,  0,  0,  0&lt;br /&gt;
CM, Received UR,  [*EMWI: 1, 0]&lt;br /&gt;
CM, Received UR,  [+PACSP0]&lt;br /&gt;
CM, Sent ATCom, AT*E2OTR=1, OK,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT+CIND?, ERROR,  100,  0&lt;br /&gt;
CM, Sent ATCom, AT+CIND?, ERROR,  100,  0&lt;br /&gt;
CM, Sent ATCom, AT+CIND?, ERROR,  100,  0&lt;br /&gt;
CM, Info, Sleep Mode, Can Sleep,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT*ERINFO=1, OK,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT*ERINFO?, OK,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT*E2NAP=1, OK,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT*ENAP=1,1, OK,  0,  0&lt;br /&gt;
CM, Info, Sleep Mode, Can not Sleep,  0,  0&lt;br /&gt;
WAN, notifyState, error,  0,  0,  0&lt;br /&gt;
CM, Received UR,  [*E2NAP: 2]&lt;br /&gt;
CM, Sent ATCom, AT*E2CFUN=1, OK,  0,  0&lt;br /&gt;
WAN, stateChange, waitOff,  7,  2,  6&lt;br /&gt;
CM, Sent ATCom, AT+CFUN=4, OK,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT*E2OTR=0, OK,  0,  0&lt;br /&gt;
WAN, unlock,  0,  0,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT*ERINFO=0, OK,  0,  0&lt;br /&gt;
CM, Received UR,  [*E2NAP: 0]&lt;br /&gt;
CM, Error, Connection,  0,  0,  0&lt;br /&gt;
CM, Received UR,  [+CREG: 4]&lt;br /&gt;
CM, Received UR,  [*E2CFUN: 1, 4, 0&lt;br /&gt;
CM, State, Radio Off,  0,  0,  0&lt;br /&gt;
CM, Sent ATCom, AT+CFUN=0, OK,  0,  0&lt;br /&gt;
CM, Info, Adjust State, Radio Off,  0,  0&lt;br /&gt;
CM, State, Module Off,  0,  0,  0&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Se puede analizar con calma todos los comandos. Aproximadamente el formato es:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
accion,comando,parametros_recibidos&lt;br /&gt;
o&lt;br /&gt;
accion,comando,respuesta,codigo_de_error&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt; Básicamente, se activan notificaciones, sensores de temperatura, se reinician los contextos de conexión a internet, se crean nuevos (incluso con mis datos cambiados del APN), así todo correcto hasta que se llega al a línea:&lt;br /&gt;
&lt;code&gt;CM, Sent ATCom, AT+CIND?, ERROR,  100,  0&lt;/code&gt;&lt;br /&gt;
La cual quiere decir: &lt;em&gt;AT+CIND Indicator control (ver. 5) &amp;#8211; Check the current status of indicators and states in the phone, for example, check if a charger is connected, check the current state for a call setup, and so on.&lt;/em&gt; Comprueba ciertos estados internos del teléfono y ¿como respuesta?, da un ERROR. Cagada. Como error CME asociado a esta respuesta el número 100&amp;#8230; Miramos la tabla de errores, y ¿qué encontramos? Error 100: Unknown. Doble cagada con tirabuzón.&lt;/p&gt;
&lt;p&gt;En resumen, cabe la posibilidad de que el dispositivo esté bloqueado para SIMs de AT&amp;#038;T. Puede que incluso esté bloqueado para que sólo funcione con la SIM que venía con el lector. Puede que se hagan comprobaciones en el software, además de en el módulo de telefonía, para saber si el aparato debe funcionar en España&amp;#8230; Al menos hay una cosa a agradecer, el módulo no es CDMA, lo cual sería posible que funcionase en redes GSM europeas (de hecho, eso dice en las hojas de especificación, aunque la página de Sony diga lo contrario). Pero ahora&amp;#8230; pueden ser tantas cosas que el siguiente paso es incierto. Una opción podría ser tratar de conseguir un módulo Ericsson F3507G liberado de operadoras, para ver si únicamente está bloqueado. &lt;a href=&quot;http://shop.ebay.com/?_from=R40&amp;#038;_trksid=m570&amp;#038;_nkw=Ericsson%2BF3507G&amp;#038;_sacat=See-All-Categories&quot;&gt;No es una locura, pero tampoco es barato&lt;/a&gt;. También se podría intentar colocar otro módulo distinto de otro fabricante, aunque entonces implicaría perder toda la integración del software (y tener que compilar un módulo del kernel como mínimo, o un kernel nuevo)&amp;#8230; muy arriesgado. &lt;/p&gt;
&lt;p&gt;Quizá también podría estar quietecito por una vez con estos aparatos, pero&amp;#8230; entonces no tendría el problema que me ha hecho escribir el post &lt;img src=&quot;http://dani.warp.es/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Referencias: &lt;a href=&quot;http://3g-modem.wetpaint.com/page/Ericsson+F3507G&quot;&gt;Información sobre el módulo del lector&lt;/a&gt;, &lt;a href=&quot;http://www.natisbad.org/E4300/Dell_Wireless_5530_AT_cmd_ref.html&quot;&gt;una pequeña introducción sobre los comandos soportados&lt;/a&gt;, &lt;a href=&quot;http://www.euromobile-ukraine.com.ua/files/documents/GX64%20AT%20Command%20Manual%20P1B%20(P1A072).pdf&quot;&gt;Manual de comandos AT GX64&lt;/a&gt; y la lista de &lt;a href=&quot;http://developer.sonyericsson.com/cws/download/1/707/466/1262690267/DW-65054-dg_at_2006--09_r15a.pdf&quot;&gt;comandos AT para teléfonos Sony Ericsson&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 09 Jun 2010 23:56:24 +0000</pubDate>
</item>
<item>
	<title>David Pellicer: Lego mindstorms, little-big robots</title>
	<guid>http://dpellicer.warp.es/?p=17</guid>
	<link>http://dpellicer.warp.es/?p=17</link>
	<description>&lt;p&gt;For the final project of my computer-science degree at &lt;a href=&quot;http://www.unizar.es/&quot;&gt;Universidad de Zaragoza&lt;/a&gt;, I am developing a complete navigation system for &lt;a href=&quot;http://mindstorms.lego.com/en-us/default.aspx&quot;&gt;Lego Mindstorm robots&lt;/a&gt;. Using all the sensors availible for this kind of robost, my goal is to study how trustly can these robots be.&lt;br /&gt;
I used &lt;a href=&quot;http://lejos.sourceforge.net/&quot;&gt;Lejos OS&lt;/a&gt; for the robot brick, and I developed a visual application for PCs that using a bluetooth connection can monitor the robot sensors, the position and the speed of the robot. It is also a remote control to the robot, if you don&amp;#8217;t want to trust in its artificial intelligence.&lt;br /&gt;
It navigates using a preload map, and helped with the camera and the ultrasonics sensor it can update the map with the obstacles it detects. When you send a command with the position you want the robot will go, it calculates the best path to go, and if it detects an obstacle while is moving, it updates the map, recalculates the path and send all information to the control application on the PC by bluetooth. It uses a closed-loop control movement, based on its calculated path on a cell based map. &lt;/p&gt;
&lt;p&gt;This is a video of the robot avoiding obstacles and getting into the goal position.&lt;/p&gt;
&lt;p&gt;&lt;embed src=&quot;http://www.youtube.com/v/5O99zhX3Lno&amp;#038;hl=es_ES&amp;#038;fs=1&amp;#038;&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;640&quot; height=&quot;385&quot;&gt;&lt;/embed&gt;&lt;/p&gt;
&lt;p&gt;Using a camera, it is also able to follow color objects, like a red ball. And based in the size of what it sees, it open and close a clamp to catch it, here it is a video of a demostration of it. &lt;/p&gt;
&lt;p&gt;&lt;embed src=&quot;http://www.youtube.com/v/84s1FiJzmUk&amp;#038;hl=es_ES&amp;#038;fs=1&amp;#038;&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;640&quot; height=&quot;385&quot;&gt;&lt;/embed&gt;&lt;/p&gt;
&lt;p&gt;This robots has a diferncial movement, now I am working in a car-like robot, I will upload more information as soon as possible.&lt;/p&gt;</description>
	<pubDate>Sun, 16 May 2010 14:34:59 +0000</pubDate>
</item>
<item>
	<title>David Pellicer: First steps in Caribou keyboard</title>
	<guid>http://dpellicer.warp.es/?p=6</guid>
	<link>http://dpellicer.warp.es/?p=6</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://live.gnome.org/Caribou&quot; target=&quot;_blank&quot;&gt;Caribou&lt;/a&gt; is a text entry and UI navigation application being developed as an alternative to the &lt;a href=&quot;http://www.gnome.org/&quot;&gt;Gnome&lt;/a&gt; &lt;a href=&quot;http://live.gnome.org/Gok&quot;&gt;On-screen Keyboard&lt;/a&gt;. The overarching goal for &lt;a href=&quot;http://live.gnome.org/Caribou&quot; target=&quot;_blank&quot;&gt;Caribou&lt;/a&gt; is to create a usable solution for people whose primary way of accessing a computer is a switch device.&lt;/p&gt;
&lt;p&gt;The initial goal is to make an in-place on-screen keyboard suitable for people who can use a mouse but not a hardware keyboard. This on-screen keyboard may also be useful for touch screen or tablet users.&lt;/p&gt;
&lt;p&gt;With the funding from the &lt;a href=&quot;http://www.consorciofernandodelosrios.es&quot;&gt;Consorcio Fernando de los Rios&lt;/a&gt; from &lt;a href=&quot;http://www.juntadeandalucia.es/index.html&quot;&gt;Junta de Andalucia&lt;/a&gt; (Spain), &lt;a href=&quot;http://www.warp.es&quot;&gt;Warp&lt;/a&gt; is developing improvements to &lt;a href=&quot;http://live.gnome.org/Caribou&quot; target=&quot;_blank&quot;&gt;Caribou&lt;/a&gt; keyboard like predictive text, spanish layouts or the posibility of use with a switch device.&lt;br /&gt;
&lt;a href=&quot;http://www.warp.es/&quot;&gt;Warp&lt;/a&gt; has an early implementation of a &lt;a href=&quot;http://en.wikipedia.org/wiki/D-Bus&quot;&gt;DBUS service&lt;/a&gt; that provide prediction to the keyboard (or any application) using &lt;a href=&quot;http://presage.sourceforge.net&quot;&gt;Presage&lt;/a&gt; prediction library, and using a &lt;a href=&quot;https://bugzilla.gnome.org/show_bug.cgi?id=613229&quot;&gt;patch developed by Joaquim Rocha &lt;/a&gt; we have a different keyboard layout specified with a &lt;a href=&quot;http://json.org/&quot;&gt;JSON&lt;/a&gt; file.&lt;/p&gt;
&lt;p&gt;This is a little video-demo of what is able to do at the moment.&lt;/p&gt;
&lt;p&gt;&lt;embed src=&quot;http://vimeo.com/moogaloop.swf?clip_id=11686075&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;400&quot; height=&quot;360&quot;&gt;&lt;/embed&gt;&lt;/p&gt;
&lt;p&gt;I will report on progress of the project in the coming days.&lt;/p&gt;</description>
	<pubDate>Wed, 12 May 2010 15:54:49 +0000</pubDate>
</item>
<item>
	<title>David Pellicer: Hello co!</title>
	<guid>http://dpellicer.warp.es/?p=1</guid>
	<link>http://dpellicer.warp.es/?p=1</link>
	<description>&lt;p&gt;Hello all!!!&lt;/p&gt;
&lt;p&gt;The aim of this blog is to report my advances and my &lt;span id=&quot;result_box&quot;&gt;&lt;span&gt;ideas and my thoughts on various subjects that I like. &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span id=&quot;result_box&quot;&gt;&lt;span&gt;I hope  to publish many posts but no promises&amp;#8230;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 12 May 2010 13:06:17 +0000</pubDate>
</item>
<item>
	<title>Dani: GNOME Marketing Hackfest en Zaragoza</title>
	<guid>http://dani.warp.es/?p=242</guid>
	<link>http://dani.warp.es/?p=242</link>
	<description>&lt;p&gt;Tal y como &lt;a href=&quot;http://warp.es/blog/2010/05/04/marketing-hackfest-gnome-30-en-zaragoza/&quot;&gt;contábamos&lt;/a&gt;, se celebró la semana pasada en Zaragoza el &lt;a href=&quot;http://live.gnome.org/Hackfests/Marketing-2010-05&quot;&gt;GNOME Marketing Hackfest&lt;/a&gt;. Gracias a los &lt;a href=&quot;http://live.gnome.org/Hackfests/Marketing-2010-05#Sponsors&quot;&gt;sponsors&lt;/a&gt;, un grupo de GNOME Marketing se reunió en la Biblioteca del Agua de Zaragoza para preparar el lanzamiento de GNOME 3.&lt;/p&gt;
&lt;p&gt;Primero se &lt;a href=&quot;http://live.gnome.org/ThreePointZero/MarketingRoadmap&quot;&gt;definió una campaña&lt;/a&gt; de marketing, con muchas actuaciones a atacar. Todo está planificado con fechas concretas y gente a la que perseguir, lo que ayudará a que se vayan cumpliendo todos los puntos.&lt;/p&gt;
&lt;p&gt;También se comenzó el diseño de la &lt;a href=&quot;http://live.gnome.org/gnome3.org&quot;&gt;página web de presentación de GNOME 3&lt;/a&gt;. Ya salieron unos cuantos bocetos, y realmente puede quedar muy limpia y ordenada. Genial! &lt;img src=&quot;http://dani.warp.es/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Otra de las iniciativas interesantes fue la preparación de los &lt;a href=&quot;http://live.gnome.org/GnomeMarketing/Gnome3In30Seconds&quot;&gt;vídeos para la web&lt;/a&gt;. La idea es preparar unos pequeños &lt;em&gt;spots&lt;/em&gt; mostrando las novedades que traerá GNOME 3. Además, se ha preparado un how-to para que cualquiera que quiera ayudar o localizar los vídeos, pueda hacerlo de manera sencilla (aunque requieren bastante material &lt;img src=&quot;http://dani.warp.es/wp-includes/images/smilies/icon_razz.gif&quot; alt=&quot;:P&quot; class=&quot;wp-smiley&quot; /&gt; )&lt;/p&gt;
&lt;p&gt;Hubo más temas a tratar e ideas geniales, pero alguna sorpresa hay que guardar&amp;#8230; Os invito a que entréis a las páginas del wiki para descubrir todo lo que se habló.&lt;/p&gt;
&lt;p&gt;Y aquí está la foto de la gente que estuvo en el Hackfest&lt;br /&gt;
&lt;div id=&quot;attachment_254&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://dani.warp.es/wp-content//uploads/2010/05/DSC00701.JPG&quot;&gt;&lt;img src=&quot;http://dani.warp.es/wp-content//uploads/2010/05/DSC00701.JPG&quot; alt=&quot;GNOME Marketing Hackfest&quot; title=&quot;GNOME Marketing Hackfest&quot; width=&quot;500&quot; height=&quot;376&quot; class=&quot;size-full wp-image-254&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;GNOME Marketing Hackfest&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Además de lo que fue trabajo 100% GNOME, también hubo presentaciones de casos de éxito tanto de la Administración local como de la regional, así como de las empresas de aquí. Mención especial a las empresas del sur (&lt;a href=&quot;http://www.yaco.es&quot;&gt;Yaco&lt;/a&gt; y &lt;a href=&quot;http://www.emergya.es&quot;&gt;Emergya&lt;/a&gt;) que se vinieron a pasar &lt;a href=&quot;http://sphotos.ak.fbcdn.net/hphotos-ak-sjc1/hs571.snc3/31165_438196322515_700917515_5861316_6158641_n.jpg&quot;&gt;un ventoso día&lt;/a&gt; con nosotros. Éstas, junto con &lt;a href=&quot;http://www.onirica.com&quot;&gt;Onirica&lt;/a&gt;, &lt;a href=&quot;http://www.warp.es&quot;&gt;Warp&lt;/a&gt; y con el &lt;a href=&quot;http://www.consorciofernandodelosrios.es/&quot;&gt;Consorcio Fernando de los Ríos&lt;/a&gt; son quienes ahora mismo quieren darle un empujón a la Accesibilidad de GNOME. ¡A ver hasta donde se llega!&lt;/p&gt;</description>
	<pubDate>Tue, 11 May 2010 09:51:25 +0000</pubDate>
</item>
<item>
	<title>Dani: Cumpleaños feliz!</title>
	<guid>http://dani.warp.es/?p=240</guid>
	<link>http://dani.warp.es/?p=240</link>
	<description>&lt;p&gt;Esta canción es la que hace unas horas le he cantado a &lt;a href=&quot;https://review.source.android.com/#change,9761&quot;&gt;mi parche sobre el código de Android&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tras un año completo, sigo esperando una revisión efectiva del parche y que lo acepten (o se quejen) por parte de Google. Entiendo que los ingenieros estén ocupados, pero no sé hasta qué punto a la comunidad que están creando alrededor de Android se le permite colaborar con el proyecto principal.&lt;/p&gt;
&lt;p&gt;Es una sensación rara&amp;#8230; en &lt;a href=&quot;http://www.gnome.org&quot;&gt;otros proyectos&lt;/a&gt; parece que hay más facilidades de cara a las colaboraciones externas&amp;#8230; Habrá que meditar con cuidado sobre el tema &lt;/p&gt;</description>
	<pubDate>Fri, 07 May 2010 23:34:31 +0000</pubDate>
</item>
<item>
	<title>Warp Networks: Marketing Hackfest Gnome 3.0 en Zaragoza</title>
	<guid>http://warp.es/?p=314</guid>
	<link>http://feedproxy.google.com/~r/WarpNetworks/~3/BsN0vDBqagI/</link>
	<description>&lt;p&gt;El equipo de diseño y marketing de la comunidad internacional de Software Libre&lt;strong&gt; GNOME&lt;/strong&gt;, se reúne en Zaragoza entre el &lt;strong&gt;4 y el 7 de mayo&lt;/strong&gt; con el objetivo de tratar temas estratégicos en el lanzamiento de la versión &lt;strong&gt;GNOME 3.0&lt;/strong&gt;, que será una verdadera revolución de este popular entorno de escritorio.&lt;/p&gt;
&lt;p&gt;El encuentro será sobre todo una reunión de trabajo, dónde se prevé definir y planificar los recursos de diseño y marketing para GNOME 3.0. Además, una parte muy importante de la agenda, liderada por Vincent Untz, incluye acercamientos con los gobiernos locales y con miembros de la comunidad GNOME, con la intención de consolidar los vínculos y conocer de cerca sus proyectos.&lt;/p&gt;
&lt;p&gt;Esta reunión de expertos cuenta con el apoyo del Gobierno de Aragón, Instituto Tecnológico de Aragón, Ayuntamiento de Zaragoza y de las asociaciones Asolif y Cesla. Es importante destacar que el apoyo institucional y su compromiso alrededor de una efectiva implantación del Software Libre han sido fundamentales para que la organización eligiese nuestra ciudad como sede de este encuentro.&lt;/p&gt;
&lt;p&gt;Detalles en &lt;a href=&quot;http://live.gnome.org/Hackfests/Marketing-2010-05#Relevant_GNOME_team&quot;&gt;GNOME 3.0 Marketing Hackfest&lt;/a&gt;&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/WarpNetworks/~4/BsN0vDBqagI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 04 May 2010 08:58:51 +0000</pubDate>
</item>
<item>
	<title>Pablo: python-messaging: SMS encoder/decoder for the masses</title>
	<guid>http://minimoesfuerzo.org/2010/04/18/python-messaging-sms-encoderdecoder-masses/</guid>
	<link>http://minimoesfuerzo.org/2010/04/18/python-messaging-sms-encoderdecoder-masses/</link>
	<description>&lt;p&gt;&lt;a class=&quot;reference external&quot; href=&quot;http://github.com/pmarti/python-messaging&quot;&gt;python-messaging&lt;/a&gt; is a pure python SMS encoder decoder. Some of its features:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;7bit/8bit/UCS2 encoding: Now you can text your Chinese friend&lt;/li&gt;
&lt;li&gt;Multipart SMS: Because sometimes 140 chars are not enough&lt;/li&gt;
&lt;li&gt;SMS status report: Be sure they read it&lt;/li&gt;
&lt;li&gt;Stuff you take for granted: Alphanumeric addresses, timezone awareness, good test coverage&lt;/li&gt;
&lt;li&gt;Used in production by several projects: &lt;a class=&quot;reference external&quot; href=&quot;http://www.wader-project.org&quot;&gt;Wader&lt;/a&gt;, &lt;a class=&quot;reference external&quot; href=&quot;https://forge.betavine.net/projects/bcm&quot;&gt;BCM&lt;/a&gt; and &lt;a class=&quot;reference external&quot; href=&quot;http://mobilemanager.movilforum.com&quot;&gt;MobileManager&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;As far as we know, is the most advanced SMS encoder/decoder written in pure Python (otherwise we would be using it ;) If you need a PDU encoder/decoder for your project, &lt;a class=&quot;reference external&quot; href=&quot;http://github.com/pmarti/python-messaging&quot;&gt;python-messaging&lt;/a&gt; should fit your needs.&lt;/p&gt;
&lt;h3&gt;API walkthrough&lt;/h3&gt;&lt;pre class=&quot;prettyprint&quot;&gt;&amp;gt;&amp;gt;&amp;gt; from messaging import PDU
&amp;gt;&amp;gt;&amp;gt; p = PDU()
&amp;gt;&amp;gt;&amp;gt; p.encode_pdu('+342323312', 'hello')
[(18, '001100099143323213F20000AA05E8329BFD06')]
&amp;gt;&amp;gt;&amp;gt; p.encode_pdu('+342323312', 'hello', csca='+345343234')
[(18, '069143353432F41101099143323213F20000AA05E8329BFD06')]
&amp;gt;&amp;gt;&amp;gt; p.encode_pdu('+342323312', 'hello', csca='+345343234', request_status=True)
[(18, '069143353432F43102099143323213F20000AA05E8329BFD06')]&lt;/pre&gt;&lt;p&gt;The only class you need to deal with is &lt;a class=&quot;reference external&quot; href=&quot;http://github.com/pmarti/python-messaging/blob/master/messaging/pdu.py&quot;&gt;PDU&lt;/a&gt;. It is able to encode and decode PDUs with two simple functions: &lt;cite&gt;encode_pdu&lt;/cite&gt; and &lt;cite&gt;decode_pdu&lt;/cite&gt;. encode_pdu receives a number and the text you want to send, plus a number of optional parameters where you can specify smsc, validity, reference number, whether you want a confirmation or not, etc. The function returns a list of tuples with the pdu length and the pdu as a string ready to be sent via the serial port. Why a list of tuples? Well, you might want to send a SMS with more than 140 chars. If so, every fragment of the SMS will be a tuple in the list.&lt;/p&gt;
&lt;p&gt;python-messaging can not send the SMS, is just an encoder! This is what you need to do in order to send a SMS with pyserial and python-messaging:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;import messaging
import serial

def send_text(number, text, path='/dev/ttyUSB0'):
    # encode the SMS
    p = messaging.PDU()
    # notice how I get the first returned element, this does
    # not deal with concatenated SMS.
    pdu_length, pdu = p.encode_pdu(number, text)[0]
    # open the modem port (assumes Linux)
    ser = serial.Serial(path, timeout=1)
    # write the PDU length and wait 1 second till the
    # prompt appears (a more robust implementation
    # would wait till the prompt appeared)
    ser.write('AT+CMGS=%d\r' % pdu_length)
    print ser.readlines()
    # write the PDU and send a Ctrl+z escape
    ser.write('%s\x1a' % pdu)
    ser.close()

send_text('+3223223', 'hey how are you?')&lt;/pre&gt;&lt;p&gt;&lt;em&gt;Updated&lt;/em&gt;: The above snippet had an error, it was trying to send the SMS with GMCS instead of CMGS, thanks Jakob for spotting it.&lt;/p&gt;
&lt;p&gt;It was not too hard was it? This code does not deal with PIN authentication by the way, so be sure your device is already authenticated, or auth is disabled. Oh by the way, sending a UCS2 encoded message is easy, just pass a unicode string and the PDU object will do the right thing.&lt;/p&gt;
&lt;p&gt;Decoding a PDU is a no brainer:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&amp;gt;&amp;gt;&amp;gt; p.decode_pdu('07911326040000F0040B911346610089F60000208062917314080CC8F71D14969741F977FD07')
{'cnt': 0, 'seq': 0, 'text': u'How are you?', 'fmt': 0, 'pid': 0, 'csca': '+31624000000', 'number': '+31641600986', 'type': 0, 'date': '02/08/26 19:37:41', 'ref': 0}&lt;/pre&gt;&lt;p&gt;This PDU string was taken from &lt;cite&gt;redxanela&lt;/cite&gt;'s online decoder default text, you can compare &lt;a class=&quot;reference external&quot; href=&quot;http://github.com/pmarti/python-messaging&quot;&gt;python-messaging&lt;/a&gt;'s output with redxanela. Check out the method signatures for what options accepts. I need to write a thorough documentation one of this days, this is an initial effort in that way.&lt;/p&gt;
&lt;p&gt;Hope you liked this walkthrough and that &lt;a class=&quot;reference external&quot; href=&quot;http://github.com/pmarti/python-messaging&quot;&gt;python-messaging&lt;/a&gt; fits your project needs. I didn't want to bother you with the project's history, you can check it out in the &lt;a class=&quot;reference external&quot; href=&quot;http://github.com/pmarti/python-messaging/blob/master/README&quot;&gt;README&lt;/a&gt;. Looking forward to any questions/contributions ;-)&lt;/p&gt;</description>
	<pubDate>Sun, 18 Apr 2010 10:08:23 +0000</pubDate>
</item>
<item>
	<title>Warp Networks: Cursos certificados Java y MySQL</title>
	<guid>http://warp.es/?p=311</guid>
	<link>http://feedproxy.google.com/~r/WarpNetworks/~3/wvE76A3ruK8/</link>
	<description>&lt;h3 id=&quot;toc-calendario-de-cursos-mayo-julio-2010-zaragoza&quot;&gt;CALENDARIO DE CURSOS MAYO-JULIO 2010 - ZARAGOZA&lt;/h3&gt;
&lt;p&gt;Warp Networks como partner oficial de Sun Microsystems,  imparte formación certificada MySQL y JAVA. También puede proveer a los interesados de vouchers para certificaciones Sun.&lt;/p&gt;
&lt;p&gt;Los cursos se imparten de forma presencial en Zaragoza.&lt;/p&gt;
&lt;p&gt;Apúntate ahora, las plazas son limitadas!&lt;/p&gt;
&lt;h3 id=&quot;toc-formacion-java&quot;&gt;FORMACIÓN JAVA:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;Desarrollo de Aplicaciones Java EE (FJ-310-EE5): Mayo 31 - Junio 4 &lt;/strong&gt;(Último día de inscripción 20 de Mayo)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Programación Java (SL-275-SE6): Junio 21-25&lt;br /&gt;
&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Desarrollo de aplicaciones con Java SE Platform (SL-285-SE6): Junio 28 - Julio 2&lt;br /&gt;
&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;toc-formacion-mysql&quot;&gt;FORMACIÓN MYSQL:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;MySQL Alta Disponibilidad: Mayo 10-12 &lt;/strong&gt;(Último día de inscripción 22 de Abril)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MySQL Optimización del Rendimiento: Mayo 17-20&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MySQL Cluster: Mayo 24-26&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MySQL para Administradores de Bases de Datos: Junio 14-18&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;toc-inscripciones-e-informacion-trainingwarpes-34-976-392-644&quot;&gt;&lt;strong&gt;INSCRIPCIONES E INFORMACION: training@warp.es / +34 976 392 644&lt;/strong&gt;&lt;/h4&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/WarpNetworks/~4/wvE76A3ruK8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 15 Apr 2010 09:06:37 +0000</pubDate>
</item>
<item>
	<title>Dani: Y nos quedamos como estamos…</title>
	<guid>http://dani.warp.es/?p=235</guid>
	<link>http://dani.warp.es/?p=235</link>
	<description>&lt;p&gt;Pues si, así es. Nos quedamos tal y como ya estábamos&amp;#8230; Como ya comenté en un &lt;a href=&quot;http://dani.warp.es/?p=216&quot;&gt;post anterior&lt;/a&gt;, Google va liberando cada cierto tiempo información sobre cuántos usuarios utilizan qué versión de Android. Afortunada o desgraciadamente, esta semana han actualizado &lt;a href=&quot;http://developer.android.com/resources/dashboard/platform-versions.html&quot;&gt;las estadísticas&lt;/a&gt;. ¿Y qué podemos ver?&lt;/p&gt;
&lt;p&gt;Pues esto:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignnone&quot; title=&quot;Google Dashboard&quot; src=&quot;http://chart.apis.google.com/chart?&amp;amp;cht=p&amp;amp;chs=400x250&amp;amp;chd=t:0.1,38.0,31.6,0.3,2.7,27.3&amp;amp;chl=Android%201.1|Android%201.5|Android%201.6|Android%202.0|Android%202.0.1|Android%202.1&amp;amp;chco=c4df9b,6fad0c&quot; alt=&quot;&quot; width=&quot;400&quot; height=&quot;250&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Lo que quiere decir que, aproximadamente (y salvando un poco las distancias), las versiones están repartidas casi a partes iguales. Esto provoca que los desarrolladores de aplicaciones para Android todavía no puedan descartar ninguna versión del sistema de Google (excepto la 1.1), y si quieren cierto éxito sin desechar una gran fuente de usuarios y oportunidades, han de soportar todas ellas.&lt;/p&gt;
&lt;p&gt;¡Estamos de enhorabuena! Hacer tres veces el trabajo para conseguir lo mismo&amp;#8230; Esperemos que a partir de ahora Google se tome las cosas con algo más de calma y no saque cuatro versiones distintas del sistema cada año, ayudando a frenar un poco este caos.&lt;/p&gt;
&lt;p&gt;De todas formas, pensándolo bien, todavía no estamos a la par que los desarrolladores web y la compatibilidad entre navegadores, algo es algo O:-)&lt;/p&gt;</description>
	<pubDate>Wed, 14 Apr 2010 22:04:32 +0000</pubDate>
</item>
<item>
	<title>Dani: OpenStreetMap en Tecnimap</title>
	<guid>http://people.warp.es/~dani/blog/?p=224</guid>
	<link>http://dani.warp.es/?p=224</link>
	<description>&lt;p&gt;Desde que descubrí &lt;a href=&quot;http://www.openstreetmap.org&quot;&gt;OpenStreetMap&lt;/a&gt; (OSM) hace ya unos años, el proyecto me ha fascinado. Al principio me parecía en realidad una cosa de locos. Llevar adelante un proyecto como la wikipedia, parece que se puede acometer si se tiene a la suficiente gente disponible, pero&amp;#8230; ¿un mapa global? ¿Tener a miles de personas con su GPS tomando muestras para luego enviar los datos a internet? ¿y de manera voluntaria? Lo dicho, parece de locos.&lt;/p&gt;
&lt;p&gt;El resultado es que después de cerca de 6 años en marcha, ahora &lt;a href=&quot;http://wiki.openstreetmap.org/wiki/Stats&quot;&gt;hay más de 230.000 usuarios&lt;/a&gt; en el proyecto. Más de 1.300 millones de puntos, y unos mapas con una calidad asombrosa. De hecho, tan asombroso como puede resultar la wikipedia. Sólo con entrar en &lt;a href=&quot;http://www.openstreetmap.org&quot;&gt;http://www.openstreetmap.org&lt;/a&gt;, uno queda maravillado.&lt;/p&gt;
&lt;p&gt;Además de toda esta información en forma de mapa, OSM ofrece otras formas de acceder a la información, por medio de una &lt;a href=&quot;http://wiki.openstreetmap.org/wiki/API_v0.6&quot;&gt;API abierta&lt;/a&gt; y muy bien documentada. Sobre OSM, su API, su &lt;a href=&quot;http://www.readwriteweb.com/archives/flickr_now_supports_openstreetmap_tags.php&quot;&gt;integración con otros servicios como flickr&lt;/a&gt;, y el uso de formatos estándar del W3C estaré hablando en una de las sesiones paralelas de &lt;a href=&quot;http://www.tecnimap.es&quot;&gt;Tecnimap&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;El día 8, a las 9:30 de la mañana os veo en &amp;#8220;&lt;strong&gt;W3C. El Futuro de la Información Pública en la Web&lt;/strong&gt;&amp;#8221; y &lt;a href=&quot;http://people.warp.es/~dani/OSM_en_Tecnimap.pdf&quot;&gt;aqui podéis encontrar ya disponible la presentación&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Una pena que en el último momento no haya podido entrar en Tecnimap &lt;a href=&quot;http://warp.es/blog/2010/04/06/movid-llave-usb-para-la-firma-electronica/&quot;&gt;la otra comunicación&lt;/a&gt; que Warp tenía preparada. Al menos está disponible la presentación que preparamos en su día para el evento.&lt;/p&gt;</description>
	<pubDate>Tue, 06 Apr 2010 12:54:49 +0000</pubDate>
</item>
<item>
	<title>Warp Networks: MovID: llave USB para la firma electrónica</title>
	<guid>http://warp.es/?p=300</guid>
	<link>http://feedproxy.google.com/~r/WarpNetworks/~3/UOfxD4Ew5ac/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://warp.es/wp-content/uploads/2010/04/movid.jpg&quot;&gt;&lt;img class=&quot;alignright size-medium wp-image-302&quot; title=&quot;movid&quot; src=&quot;http://warp.es/wp-content/uploads/2010/04/movid.jpg&quot; alt=&quot;&quot; width=&quot;256&quot; height=&quot;98&quot; /&gt;&lt;/a&gt;Warp Networks, con el patrocinio de la Diputación de Teruel, ha desarrollado MovID, una solución llave USB en mano para la firma electrónica.&lt;/p&gt;
&lt;p&gt;MovID incluye, dentro de una llave USB, todo lo necesario para trabajar de forma segura:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Almacén de certificados&lt;/li&gt;
&lt;li&gt;Distribución Linux como entorno de trabajo&lt;/li&gt;
&lt;li&gt;Memoria disponible para el almacenamiento de documentos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La solución consiste en un almacén hardware de alta seguridad para la firma digital, protegido mediante contraseña, y contra accesos físicos, pudiendo gestionar y acceder a todos los certificados. Además, proporciona un entorno de trabajo itinerante para aplicaciones y documentos de todo tipo.&lt;/p&gt;
&lt;p&gt;Warp ofrece servicios de personalización de la apariencia, de las aplicaciones disponibles y adaptación del entorno de trabajo, siempre manteniendo la premisa del respeto a los estándares, pudiendo acceder a su contenido y funcionalidades desde cualquier ordenador con USB, independientemente del sistema operativo que se utilice.&lt;/p&gt;
&lt;p&gt;Con motivo del &lt;a href=&quot;http://www.tecnimap.es&quot;&gt;Tecnimap 2010&lt;/a&gt; que se celebra en Zaragoza, Warp presentó una ponencia para divulgar la solución desarrollada, destinada principalmente a Administraciones Públicas. Finalmente no será posible realizar la comunicación en el marco Tecnimap, pero se pueden &lt;a href=&quot;http://warp.es/wp-content/uploads/2010/04/movid-slideshow.pdf&quot;&gt;descargar las transparencias&lt;/a&gt; desde esta misma entrada.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://warp.es/wp-content/uploads/2010/04/movid-slideshow.pdf&quot;&gt;Descargar presentación MovID&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Acerca del proyecto:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;El desarrollo de la solución llave USB en mano, con las características descritas, surge debido al requerimiento y especificaciones de la Diputación Provincial de Teruel, y la cofinanciación del Ministerio de Industria, Turismo y Comercio, a través del Plan Avanza.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/WarpNetworks/~4/UOfxD4Ew5ac&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 06 Apr 2010 11:09:29 +0000</pubDate>
</item>
<item>
	<title>Pablo: reStructuredText directive for google-code-prettify</title>
	<guid>http://minimoesfuerzo.org/2010/04/3/restructuredtext-directive-google-code-prettify/</guid>
	<link>http://minimoesfuerzo.org/2010/04/3/restructuredtext-directive-google-code-prettify/</link>
	<description>&lt;p&gt;&lt;a class=&quot;reference external&quot; href=&quot;http://docutils.sourceforge.net/rst.html&quot;&gt;reStructuredText&lt;/a&gt; is &lt;em&gt;teh&lt;/em&gt; light markup format, if you never heard about it go check it out. If you are still living in a &lt;cite&gt;Docbook&lt;/cite&gt; world, you would be amazed of what rst and &lt;a class=&quot;reference external&quot; href=&quot;http://sphinx.pocoo.org/&quot;&gt;Sphinx&lt;/a&gt; can do for your productivity.&lt;/p&gt;
&lt;p&gt;Anyway, for the last articles I needed a prettify solution to publish several code listings. I use &lt;a class=&quot;reference external&quot; href=&quot;http://github.com/montylounge/django-mingus&quot;&gt;django-mingus&lt;/a&gt; as my blog engine, it comes with not one but two solutions for this problem. The first one is &lt;a class=&quot;reference external&quot; href=&quot;http://pygments.org/&quot;&gt;Pygments&lt;/a&gt;, which is very nice but no matter what I &lt;a class=&quot;reference external&quot; href=&quot;http://pygments.org/docs/rstdirective/&quot;&gt;tried&lt;/a&gt; could not make it work. The second is &lt;a class=&quot;reference external&quot; href=&quot;http://code.google.com/p/google-code-prettify/&quot;&gt;prettify.js&lt;/a&gt;, a javascript module plus some css, that prettifies in the client side at runtime.&lt;/p&gt;
&lt;p&gt;The only problem of this approach is that the code list will not show up prettified in RSS and such. But you suffered the same problem with Pygments anyway unless you inlined the styles.&lt;/p&gt;
&lt;h3&gt;The reStructuredText directive&lt;/h3&gt;&lt;p&gt;The code is deadly simple:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;from cgi import escape

from docutils import nodes
from docutils.parsers.rst import directives, Directive


class CodeDirective(Directive):
    &quot;&quot;&quot;
    reStructuredText directive to show code listings with google-code-prettify
    &quot;&quot;&quot;

    has_content = True

    def run(self):
        self.assert_has_content()
        text = '&amp;lt;pre class=&quot;prettyprint&quot;&amp;gt;%s&amp;lt;/pre&amp;gt;' % self._get_escaped_content()
        return [nodes.raw('', text, format='html')]

    def _get_escaped_content(self):
        return '\n'.join(map(escape, self.content))

directives.register_directive(&quot;code-list&quot;, CodeDirective)
directives.register_directive(&quot;sourcecode&quot;, CodeDirective)&lt;/pre&gt;&lt;p&gt;It just wraps the code in &lt;cite&gt;&amp;lt;pre class=&quot;prettyprint&quot;&amp;gt;&lt;/cite&gt; and &lt;cite&gt;&amp;lt;/pre&amp;gt;&lt;/cite&gt;, and that's it. Oh well, it also wanted the content to be escaped, fortunately Python comes with a handy function for it: &lt;a class=&quot;reference external&quot; href=&quot;http://docs.python.org/library/cgi.html#cgi.escape&quot;&gt;cgi.escape&lt;/a&gt;. I will probably write an article about rst directives soon, there is not that much documentation about it.&lt;/p&gt;</description>
	<pubDate>Sat, 03 Apr 2010 12:31:14 +0000</pubDate>
</item>
<item>
	<title>Hector: How to test the Subversion odt checking pre-commit hook</title>
	<guid>http://people.warp.es/~xtor/blog/?p=770</guid>
	<link>http://people.warp.es/~xtor/blog/?p=770</link>
	<description>&lt;p&gt;As I promised, after &lt;a href=&quot;http://people.warp.es/~xtor/blog/?p=730&quot;&gt;explaining the pre-commit hook code&lt;/a&gt;, 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:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Commiting to the repository (and thus triggering a new transaction).
&lt;/li&gt;
&lt;li&gt;Using an existing transaction, through the &lt;tt&gt;--revision&lt;/tt&gt; command line option (intended for testing).
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In both cases, you must install &lt;a href=&quot;http://people.warp.es/~xtor/blog/?p=717&quot;&gt;LanguageTool&lt;/a&gt; before.&lt;/p&gt;
&lt;p&gt;To create a brand new repository and test it:&lt;/p&gt;
&lt;pre&gt;
# 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
&lt;/pre&gt;
&lt;p&gt;Now, just copy an odt document to &lt;tt&gt;/tmp/devel/svn/foobar&lt;/tt&gt;, add it to the repo and try to commit&amp;#8230; You should see the pre-commit hook fail.&lt;/p&gt;
&lt;p&gt;Or, if you have a repository with &lt;a href=&quot;http://en.wikipedia.org/wiki/Open_Document&quot;&gt;OpenDocument&lt;/a&gt; files commited, you can just call the pre-commit hook as a regular script, with the &lt;tt&gt;--revision&lt;/tt&gt; parameter:&lt;/p&gt;
&lt;pre&gt;
# Usage: pre-commit path/to/repo --revision rev_num
/tmp/srv/svn/foobar/hooks/pre-commit /tmp/srv/svn/foobar/ --revision 1
&lt;/pre&gt;
&lt;p&gt;Enjoy it! &lt;img src=&quot;http://xtor.warp.es/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;</description>
	<pubDate>Thu, 01 Apr 2010 09:03:39 +0000</pubDate>
</item>
<item>
	<title>Hector: Agile and CMMi in small settings</title>
	<guid>http://people.warp.es/~xtor/blog/?p=812</guid>
	<link>http://people.warp.es/~xtor/blog/?p=812</link>
	<description>&lt;p&gt;If you use agile methodologies, but are trying to benefit from the huge amount of &lt;a href=&quot;http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/80000/4000/500/84510/84510.strip.gif&quot;&gt;industry knowledge&lt;/a&gt; stored in process frameworks like &lt;a href=&quot;http://en.wikipedia.org/wiki/CMMI&quot;&gt;CMMi&lt;/a&gt;, you need to pay attention to some important facts about it. These are lessons that we have learnt at &lt;a href=&quot;http://warp.es&quot;&gt;Warp&lt;/a&gt; while trying to mix &lt;a href=&quot;http://en.wikipedia.org/wiki/Agile_software_development&quot;&gt;agile methodologies&lt;/a&gt; with CMMi level 2 and 3 practices.&lt;/p&gt;
&lt;h2&gt;CMMi 2 complements agile methodologies&lt;/h2&gt;
&lt;p&gt;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, &lt;a href=&quot;http://en.wikipedia.org/wiki/Process_area_(CMMI)#Measurement_and_Analysis_.28MA.29&quot;&gt;Measurement and Analysis&lt;/a&gt; will help you to define business goals and &lt;a href=&quot;http://en.wikipedia.org/wiki/Key_performance_indicator&quot;&gt;KPIs&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The model must be interpreted&lt;/h2&gt;
&lt;p&gt;Theorically, the CMMi model is &amp;#8220;methodology-agnostic&amp;#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.&lt;/p&gt;
&lt;h2&gt;The model must be fitted to your software lifecycles&lt;/h2&gt;
&lt;p&gt;For instance, CMMi defines two process areas for project management: &lt;a href=&quot;http://en.wikipedia.org/wiki/Process_area_(CMMI)#Project_Planning_.28PP.29&quot;&gt;Project Planning&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Process_area_(CMMI)#Project_Monitoring_and_Control_.28PMC.29&quot;&gt;Project Monitoring and Control&lt;/a&gt;. 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.&lt;/p&gt;
&lt;h2&gt;Your projects should be alike&lt;/h2&gt;
&lt;p&gt;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 &lt;b&gt;right&lt;/b&gt; choice for each project is an ad-hoc technique, you would end up documenting a whole different process for each project!&lt;/p&gt;
&lt;h2&gt;Quality, but not at any cost&lt;/h2&gt;
&lt;p&gt;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 &lt;a href=&quot;http://en.wikipedia.org/wiki/Process_area_(CMMI)#Process_and_Product_Quality_Assurance_.28PPQA.29&quot;&gt;Process and Product Quality Assurance&lt;/a&gt;, 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 &amp;#8220;software testing&amp;#8221;).&lt;/p&gt;
&lt;h2&gt;Implementing CMMi and passing a CMMi appraisal are different things&lt;/h2&gt;
&lt;p&gt;CMMi appraisals require a lot of extra work (or plain waste), that you simply don&amp;#8217;t need if you are just interested in enhancing the way you work. For example, each time you review a project&amp;#8217;s deviation, if the project is on track you will need to record that &lt;i&gt;&amp;#8220;you have reviewed the project&amp;#8221;&lt;/i&gt;, and that &lt;i&gt;&amp;#8220;the project is on track&amp;#8221;&lt;/i&gt;. So instead of adopting common sense management rules, you will be focused on creating &lt;a href=&quot;http://en.wikipedia.org/wiki/Muda_%28Japanese_term%29&quot;&gt;Muda&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;To sum up: avoid judging CMMi beforehand, learn about it and just get the good things which add value and minimize waste.&lt;/p&gt;</description>
	<pubDate>Wed, 31 Mar 2010 21:58:37 +0000</pubDate>
</item>
<item>
	<title>Pablo: Playing with QML and DBus (Part 2)</title>
	<guid>http://minimoesfuerzo.org/2010/03/31/playing-qml-and-dbus-part-2/</guid>
	<link>http://minimoesfuerzo.org/2010/03/31/playing-qml-and-dbus-part-2/</link>
	<description>&lt;p&gt;In &lt;a class=&quot;reference external&quot; href=&quot;http://minimoesfuerzo.org/2010/03/30/playing-qml-and-dbus/&quot;&gt;part 1&lt;/a&gt; I showed how to modify the &lt;cite&gt;recipes.qml&lt;/cite&gt; example in order
to show contacts instead of recipes, and a basic skeleton to provide
a &lt;a class=&quot;reference external&quot; href=&quot;http://doc.qt.nokia.com/4.7-snapshot/qml-listmodel.html#details&quot;&gt;ListModel&lt;/a&gt; with contact data from QT/C++ space.&lt;/p&gt;
&lt;p&gt;In part 2, I am going to show how to retrieve this contact data from
a DBus-backed application, &lt;a class=&quot;reference external&quot; href=&quot;http://www.wader-project.org/&quot;&gt;Wader&lt;/a&gt; in this case, and the required steps
to make it work.&lt;/p&gt;
&lt;h3&gt;Wader, ModemManager and Betavine Connection Manager&lt;/h3&gt;&lt;p&gt;Wader is a 3G daemon accessible via DBus, written in Python and released
under the GPLv2. Wader runs on Linux and OSX and supports more than fifty
heterogeneous devices. Wader also happens to implement the &lt;a class=&quot;reference external&quot; href=&quot;http://trac.warp.es/wader/wiki/WhatsModemManager&quot;&gt;ModemManager&lt;/a&gt;
API.&lt;/p&gt;
&lt;p&gt;ModemManager is a joint effort between the &lt;a class=&quot;reference external&quot; href=&quot;http://projects.gnome.org/NetworkManager/&quot;&gt;NetworkManager&lt;/a&gt; and &lt;a class=&quot;reference external&quot; href=&quot;http://www.wader-project.org/&quot;&gt;Wader&lt;/a&gt;
projects to produce a modern 3G DBus API that can be reused by other
applications of the Unix Desktop. You can have a look at the
&lt;a class=&quot;reference external&quot; href=&quot;http://projects.gnome.org/NetworkManager/developers/mm-spec-04.html&quot;&gt;ModemManager specification&lt;/a&gt; to get a glimpse of it.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;reference external&quot; href=&quot;https://forge.betavine.net/projects/bcm&quot;&gt;Betavine Connection Manager&lt;/a&gt; is the third generation of Vodafone's
open source mobile connect project, hosted at &lt;a class=&quot;reference external&quot; href=&quot;http://www.betavine.net&quot;&gt;Betavine&lt;/a&gt;'s site. BCM 3.0
is built upon Wader core, with a brand new user interface and
completely integrated in the Linux desktop.&lt;/p&gt;
&lt;h3&gt;ModemManager internals&lt;/h3&gt;&lt;p&gt;ModemManager is a heavy user of DBus interfaces, we are going to interact
with just four of the &lt;a class=&quot;reference external&quot; href=&quot;http://projects.gnome.org/NetworkManager/developers/mm-spec-04.html&quot;&gt;ModemManager specification&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;&lt;a class=&quot;reference external&quot; href=&quot;http://projects.gnome.org/NetworkManager/developers/mm-spec-04.html#org.freedesktop.ModemManager&quot;&gt;org.freedesktop.ModemManager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;reference external&quot; href=&quot;http://projects.gnome.org/NetworkManager/developers/mm-spec-04.html#org.freedesktop.ModemManager.Modem&quot;&gt;org.freedesktop.ModemManager.Modem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;reference external&quot; href=&quot;http://projects.gnome.org/NetworkManager/developers/mm-spec-04.html#org.freedesktop.ModemManager.Modem.Gsm.Contacts&quot;&gt;org.freedesktop.ModemManager.Modem.Gsm.Contacts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;reference external&quot; href=&quot;http://projects.gnome.org/NetworkManager/developers/mm-spec-04.html#org.freedesktop.ModemManager.Modem.Gsm.Sms&quot;&gt;org.freedesktop.ModemManager.Modem.Gsm.Sms&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;First we need to get a list with the object paths of the devices registered
in the system. To do so we will call &lt;a class=&quot;reference external&quot; href=&quot;http://projects.gnome.org/NetworkManager/developers/mm-spec-04.html#org.freedesktop.ModemManager.EnumerateDevices&quot;&gt;EnumerateDevices&lt;/a&gt;, this will return
an array of object paths. We will use the first element in this array for
the rest of the operations.&lt;/p&gt;
&lt;p&gt;Once we have the object path, we need to setup the device with the
&lt;a class=&quot;reference external&quot; href=&quot;http://projects.gnome.org/NetworkManager/developers/mm-spec-04.html#org.freedesktop.ModemManager.Modem.Enable&quot;&gt;Enable&lt;/a&gt; method. This method accepts a boolean indicating whether to
enable or disable the device. This method may be interrupted if PIN
authentication is enabled, for simplicity we are not going to handle
possible &lt;a class=&quot;reference external&quot; href=&quot;http://projects.gnome.org/NetworkManager/developers/mm-spec-04.html#org.freedesktop.ModemManager.Modem.Gsm.SimPinRequired&quot;&gt;SimPinRequired&lt;/a&gt; errors. So make sure that authentication
is disabled, or else send the PIN with minicom beforehand.&lt;/p&gt;
&lt;p&gt;With the device enabled, we are just two calls away from finishing!
We are going to get the list of contacts and messages, and we will
correlate them before populating our classes. We tried to provide
a set of common operations in ModemManager, and the &lt;a class=&quot;reference external&quot; href=&quot;http://projects.gnome.org/NetworkManager/developers/mm-spec-04.html#org.freedesktop.ModemManager.Modem.Gsm.Contacts&quot;&gt;Contacts&lt;/a&gt; and
&lt;a class=&quot;reference external&quot; href=&quot;http://projects.gnome.org/NetworkManager/developers/mm-spec-04.html#org.freedesktop.ModemManager.Modem.Gsm.Sms&quot;&gt;Sms&lt;/a&gt; APIs are the best examples. Both provide a &lt;cite&gt;List&lt;/cite&gt; method
that will return the contacts or messages list.&lt;/p&gt;
&lt;h3&gt;How to wrap a DBus daemon with QT&lt;/h3&gt;&lt;p&gt;Wrapping a DBus daemon with QT could not be any easier thanks to
&lt;a class=&quot;reference external&quot; href=&quot;http://doc.trolltech.com/4.6/qdbusxml2cpp.html&quot;&gt;qdbusxml2cpp&lt;/a&gt;. This tool will parse the ModemManager interfaces
that we are going to use and will generate the necessary boilerplate
to make calls to remote objects. First things first, create the
following files in ~/devel/git/contacts:&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;org.freedesktop.ModemManager.xml&lt;/cite&gt;&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&amp;lt;!DOCTYPE node PUBLIC &quot;-//freedesktop//DTD D-BUS Object Introspection 1.0//EN&quot;
        &quot;http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd&quot;&amp;gt;
&amp;lt;node name=&quot;/org/freedesktop/ModemManager&quot;&amp;gt;
    &amp;lt;interface name=&quot;org.freedesktop.ModemManager&quot;&amp;gt;
        &amp;lt;method name=&quot;EnumerateDevices&quot;&amp;gt;
            &amp;lt;annotation name=&quot;com.trolltech.QtDBus.QtTypeName.Out0&quot; value=&quot;QList&amp;lt;QDBusObjectPath&amp;gt;&quot;/&amp;gt;
            &amp;lt;arg name=&quot;devicesList&quot; type=&quot;ao&quot; direction=&quot;out&quot; /&amp;gt;
        &amp;lt;/method&amp;gt;
    &amp;lt;/interface&amp;gt;
&amp;lt;/node&amp;gt;&lt;/pre&gt;&lt;p&gt;&lt;cite&gt;org.freedesktop.ModemManager.Modem.xml&lt;/cite&gt;&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&amp;lt;!DOCTYPE node PUBLIC &quot;-//freedesktop//DTD D-BUS Object Introspection 1.0//EN&quot;
        &quot;http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd&quot;&amp;gt;
&amp;lt;node name=&quot;/&quot;&amp;gt;
    &amp;lt;interface name=&quot;org.freedesktop.ModemManager.Modem&quot;&amp;gt;
        &amp;lt;method name=&quot;Enable&quot;&amp;gt;
            &amp;lt;arg name=&quot;enable&quot; type=&quot;b&quot; direction=&quot;in&quot; /&amp;gt;
        &amp;lt;/method&amp;gt;
    &amp;lt;/interface&amp;gt;
&amp;lt;/node&amp;gt;&lt;/pre&gt;&lt;p&gt;&lt;cite&gt;org.freedesktop.ModemManager.Modem.Gsm.Contacts.xml&lt;/cite&gt;&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&amp;lt;!DOCTYPE node PUBLIC &quot;-//freedesktop//DTD D-BUS Object Introspection 1.0//EN&quot;
        &quot;http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd&quot;&amp;gt;
&amp;lt;node name=&quot;/&quot;&amp;gt;
    &amp;lt;interface name=&quot;org.freedesktop.ModemManager.Modem.Gsm.Contacts&quot;&amp;gt;
        &amp;lt;method name=&quot;List&quot;&amp;gt;
            &amp;lt;annotation name=&quot;com.trolltech.QtDBus.QtTypeName.Out0&quot; value=&quot;QList&amp;lt;ContactStruct&amp;gt;&quot;/&amp;gt;
            &amp;lt;arg name=&quot;contactList&quot; type=&quot;a(uss)&quot; direction=&quot;out&quot; /&amp;gt;
        &amp;lt;/method&amp;gt;
    &amp;lt;/interface&amp;gt;
&amp;lt;/node&amp;gt;&lt;/pre&gt;&lt;p&gt;&lt;cite&gt;org.freedesktop.ModemManager.Modem.Gsm.Sms.xml&lt;/cite&gt;&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&amp;lt;!DOCTYPE node PUBLIC &quot;-//freedesktop//DTD D-BUS Object Introspection 1.0//EN&quot;
        &quot;http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd&quot;&amp;gt;
&amp;lt;node name=&quot;/&quot;&amp;gt;
    &amp;lt;interface name=&quot;org.freedesktop.ModemManager.Modem.Gsm.Sms&quot;&amp;gt;
        &amp;lt;method name=&quot;List&quot;&amp;gt;
            &amp;lt;annotation name=&quot;com.trolltech.QtDBus.QtTypeName.Out0&quot; value=&quot;QList&amp;lt;QVariantMap&amp;gt;&quot;/&amp;gt;
            &amp;lt;arg name=&quot;smsList&quot; type=&quot;a{sv}&quot; direction=&quot;out&quot; /&amp;gt;
        &amp;lt;/method&amp;gt;
    &amp;lt;/interface&amp;gt;
&amp;lt;/node&amp;gt;&lt;/pre&gt;&lt;p&gt;This files follow the &lt;a class=&quot;reference external&quot; href=&quot;http://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format&quot;&gt;DBus introspection format&lt;/a&gt; and describe the methods
available in each interface (only the ones we are going to use actually) and
their arguments. If the type is a generic one, we can just use the standard
DBus syntax -i.e. 'b' for bool. If on the other hand the response has a
custom type, we need to provide an annotation for it with its type plus
some boilerplate code so that the QT type system is able to transform in
runtime a DBus response to a QT struct/class. We will revisit this point
later on.&lt;/p&gt;
&lt;p&gt;Now we are going to create a script that will generate the necessary code to
access the ModemManager service. For each of the four interfaces that we are
going to interact with, we need to create a proxy to it. The code bellow
generates the static code necessary to access them.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;generate-interfaces.sh&lt;/cite&gt;&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;#!/bin/sh

set -e

qdbusxml2cpp -N -c ModemManagerProxy \
             -p modemmanager_generic.h:modemmanager_generic.cpp \
             org.freedesktop.ModemManager.xml \
             org.freedesktop.ModemManager

qdbusxml2cpp -N -c ModemManagerModemProxy \
             -p modemmanager_modem.h:modemmanager_modem.cpp \
             org.freedesktop.ModemManager.Modem.xml \
             org.freedesktop.ModemManager.Modem

qdbusxml2cpp -N -c ModemManagerContactsProxy \
             -p modemmanager_contacts.h:modemmanager_contacts.cpp \
             org.freedesktop.ModemManager.Modem.Gsm.Contacts.xml \
             org.freedesktop.ModemManager.Modem.Gsm.Contacts

qdbusxml2cpp -N -c ModemManagerSmsProxy \
             -p modemmanager_sms.h:modemmanager_sms.cpp \
             org.freedesktop.ModemManager.Modem.Gsm.Sms.xml \
             org.freedesktop.ModemManager.Modem.Gsm.Sms&lt;/pre&gt;&lt;p&gt;This commands generate a class with the &lt;cite&gt;-c&lt;/cite&gt; switch (first argument),
contained in a .cpp and .h files (second argument), by reading the
given interface description (third argument) and finally the name
of the accessed interface as fourth argument. Note the initial switch
&lt;cite&gt;-N&lt;/cite&gt; that produces classes with no namespaces, we had to use it as
it would not work otherwise. I think it has to do with the different
&quot;depths&quot; of the interfaces used here. Check out &lt;a class=&quot;reference external&quot; href=&quot;http://doc.trolltech.com/4.6/qdbusxml2cpp.html&quot;&gt;qdbusxml2cpp&lt;/a&gt;
documentation for more details.&lt;/p&gt;
&lt;p&gt;Add this new files to &lt;cite&gt;contacts.pro&lt;/cite&gt;:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;TEMPLATE = app
TARGET = contacts
DEPENDPATH += .
INCLUDEPATH += .
CONFIG += qdbus
QT += declarative

# Input
SOURCES += contact.cpp modemmanager_generic.cpp \
           modemmanager_modem.cpp modemmanager_contacts.cpp \
           modemmanager_sms.cpp main.cpp
HEADERS += contact.h modemmanager_generic.h modemmanager_modem.h \
           modemmanager_contacts.h modemmanager_sms.h
RESOURCES += contacts.qrc
sources.files = $$SOURCES $$HEADERS $$RESOURCES contacts.pro contacts.qml
sources.path = .
target.path = .

INSTALLS += sources target&lt;/pre&gt;&lt;p&gt;Now add the &lt;cite&gt;modemmanager_*&lt;/cite&gt; headers to main.cpp, generate the interfaces
and make sure it compiles after this last changes:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
chmod +x generate-interfaces.sh
./generate-interfaces.sh
/usr/local/Trolltech/Qt-4.7.0/bin/qmake contacts.pro
make
&lt;/pre&gt;
&lt;p&gt;We are about to access a DBus daemon written in Python, from a small C++
binary that will in turn show the results in a QML application. Interesting
mix isn't it?&lt;/p&gt;
&lt;p&gt;We need to obtain the object path of the device first, to do so add this
in your main.cpp (right after the &lt;cite&gt;QApplication&lt;/cite&gt; declaration):&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;ModemManagerProxy *proxy = new ModemManagerProxy(&quot;org.freedesktop.ModemManager&quot;,
                                                 &quot;/org/freedesktop/ModemManager&quot;,
                                                 QDBusConnection::systemBus(),
                                                 static_cast&amp;lt;QObject*&amp;gt;(&amp;amp;app));

QDBusObjectPath opath;
QDBusPendingReply&amp;lt;QList&amp;lt;QDBusObjectPath&amp;gt; &amp;gt; reply = proxy-&amp;gt;EnumerateDevices();
reply.waitForFinished();
if (reply.isError()) {
    qDebug() &amp;lt;&amp;lt; reply.error();
    app.exit(1);
} else {
    opath = reply.value().first();
    qDebug() &amp;lt;&amp;lt; opath.path();
}

ModemManagerModemProxy *modem_proxy = new ModemManagerModemProxy(
                                                 &quot;org.freedesktop.ModemManager&quot;,
                                                 opath.path(),
                                                 QDBusConnection::systemBus(),
                                                 proxy);
QDBusPendingReply&amp;lt;&amp;gt; modem_reply = modem_proxy-&amp;gt;Enable(true);
modem_reply.waitForFinished();
if (modem_reply.isError()) {
    qDebug() &amp;lt;&amp;lt; &quot;Error enabling device: &quot; &amp;lt;&amp;lt; modem_reply.error();
    app.exit(1);
}&lt;/pre&gt;&lt;p&gt;This code instantiates a new object, &lt;cite&gt;proxy&lt;/cite&gt; which is a pointer to the
&lt;cite&gt;ModemManagerProxy&lt;/cite&gt; class we've just created in &lt;cite&gt;generate-interfaces.sh&lt;/cite&gt;. The
constructor receives the service and object path of the object as first
and second arguments, and the system bus is used. Ignore the fourth argument
for now.&lt;/p&gt;
&lt;p&gt;We call &lt;cite&gt;EnumerateDevices&lt;/cite&gt;, check that the reply has no errors, and we store
the first value of the response in the &lt;cite&gt;opath&lt;/cite&gt; variable. This object path
identifies our device in ModemManager and thus will be used in the rest of
the tutorial.&lt;/p&gt;
&lt;p&gt;The next step is to enable the device with &lt;cite&gt;Enable&lt;/cite&gt;, &lt;cite&gt;ModemManagerModemProxy&lt;/cite&gt;
is instantiated and receives the object path of the device this time.
&lt;cite&gt;Enable&lt;/cite&gt; does not return anything, so we only check for errors in the
reply object.&lt;/p&gt;
&lt;p&gt;At this point we have an enabled device ready to receive operations, guess
what's next? Yep, retrieving the list of contacts and messages, correlate
them and populate the data model with it. Add the following code before
the &lt;cite&gt;main&lt;/cite&gt; function:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;QList&amp;lt;QObject*&amp;gt; GetContacts(QDBusObjectPath opath)
{
    ModemManagerContactsProxy *cts_proxy = new ModemManagerContactsProxy(
                                                 &quot;org.freedesktop.ModemManager&quot;,
                                                 opath.path(),
                                                 QDBusConnection::systemBus(),
                                                 0);
    ModemManagerSmsProxy *sms_proxy = new ModemManagerSmsProxy(
                                                 &quot;org.freedesktop.ModemManager&quot;,
                                                 opath.path(),
                                                 QDBusConnection::systemBus(),
                                                 0);

    QList&amp;lt;QObject*&amp;gt; ret;

    QList&amp;lt;ContactStruct&amp;gt; contactList;
    QDBusPendingReply&amp;lt;QList&amp;lt;ContactStruct&amp;gt; &amp;gt; cts_reply = cts_proxy-&amp;gt;List();
    cts_reply.waitForFinished();
    if (cts_reply.isError()) {
        qDebug() &amp;lt;&amp;lt; cts_reply.error();
        return ret;
    } else {
        contactList = cts_reply.value();
    }

    QList&amp;lt;QVariantMap&amp;gt; messagesList;
    QDBusPendingReply&amp;lt;QList&amp;lt;QVariantMap&amp;gt; &amp;gt; sms_reply = sms_proxy-&amp;gt;List();
    sms_reply.waitForFinished();
    if (sms_reply.isError()) {
        qDebug() &amp;lt;&amp;lt; sms_reply.error();
        return ret;
    } else {
        messagesList = sms_reply.value();
    }

    const QString picture = QString(&quot;qrc:/content/pics/person.png&quot;);

    foreach(ContactStruct contact, contactList) {
        QList&amp;lt;QString&amp;gt; smsList;
        foreach(QVariantMap sms, messagesList) {
            if (sms.value(&quot;number&quot;).toString().endsWith(contact.number)) {
                smsList.append(sms.value(&quot;text&quot;).toString());
            }
        }
        QString messages = &quot;&amp;lt;html&amp;gt;&amp;lt;ul&amp;gt;&quot;;
        if (!smsList.size()) {
            messages.append(&quot;&amp;lt;li&amp;gt;No messages!&amp;lt;/li&amp;gt;&quot;);
        } else {
            foreach(QString sms, smsList) {
                messages.append(QString(&quot;&amp;lt;li&amp;gt;%1&amp;lt;/li&amp;gt;&quot;).arg(sms));
            }
        }
        messages.append(&quot;&amp;lt;/ul&amp;gt;&amp;lt;/html&amp;gt;&quot;);
        ret.append(new Contact(contact.name, contact.number, messages, picture));
    }

    delete cts_proxy;
    delete sms_proxy;

    return ret;
}&lt;/pre&gt;&lt;p&gt;This method accepts the object path of a device, obtains the list of contacts and
messages, correlates them and returns a &lt;cite&gt;QList&amp;lt;QObject *&amp;gt;&lt;/cite&gt; object with the data.
If you try to compile it as it is, it will fail by several reasons: First
&lt;cite&gt;ContactStruct&lt;/cite&gt; (Gsm.Contacts.List return value) is undefined, second we need
to register it with the QT type system, and third we need to provide
marshalling functions to serialize/deserialize &lt;cite&gt;ContactStruct&lt;/cite&gt; from DBus.&lt;/p&gt;
&lt;p&gt;Create the following file &lt;cite&gt;dbustypes.h&lt;/cite&gt; and import it in main.cpp before
the &lt;cite&gt;modemmanager_*&lt;/cite&gt; ones:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;#include &amp;lt;QtDBus&amp;gt;

struct ContactStruct {
     uint index;
     QString name;
     QString number;
};

Q_DECLARE_METATYPE(ContactStruct);
Q_DECLARE_METATYPE(QList&amp;lt;ContactStruct&amp;gt;);
Q_DECLARE_METATYPE(QList&amp;lt;QVariantMap&amp;gt;);

// Marshall the ContactStruct data into a D-BUS argument
QDBusArgument &amp;amp;operator&amp;lt;&amp;lt;(QDBusArgument &amp;amp;argument, const ContactStruct &amp;amp;mystruct)
{
     argument.beginStructure();
     argument &amp;lt;&amp;lt; mystruct.index &amp;lt;&amp;lt; mystruct.name &amp;lt;&amp;lt; mystruct.number;
     argument.endStructure();
     return argument;
}

// Retrieve the ContactStruct data from the D-BUS argument
const QDBusArgument &amp;amp;operator&amp;gt;&amp;gt;(const QDBusArgument &amp;amp;argument, ContactStruct &amp;amp;mystruct)
{
     argument.beginStructure();
     argument &amp;gt;&amp;gt; mystruct.index &amp;gt;&amp;gt; mystruct.name &amp;gt;&amp;gt; mystruct.number;
     argument.endStructure();
     return argument;
}&lt;/pre&gt;&lt;p&gt;Now, before &lt;cite&gt;ModemManagerProxy&lt;/cite&gt;'s instantiation, add this lines in main.cpp:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;qDBusRegisterMetaType&amp;lt;ContactStruct&amp;gt;();
qDBusRegisterMetaType&amp;lt;QList&amp;lt;ContactStruct&amp;gt; &amp;gt;();
qDBusRegisterMetaType&amp;lt;QList&amp;lt;QVariantMap&amp;gt; &amp;gt;();&lt;/pre&gt;&lt;p&gt;This will register the compound types that we are going to use in the DBus
calls, without this lines the project will not compile.&lt;/p&gt;
&lt;p&gt;At this point we are ready to hook &lt;cite&gt;GetContacts&lt;/cite&gt; in main.cpp. Add after the
&lt;cite&gt;modem_reply&lt;/cite&gt; block the following lines:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;QList&amp;lt;QObject*&amp;gt; dataList;
foreach(QObject* contact, GetContacts(opath)) {
    dataList.append(contact);
}&lt;/pre&gt;&lt;p&gt;This will populate our data model with the DBus data, and we are ready to go:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
make clean
rm -rf modemmanager_*
./generate-interfaces.sh
/usr/local/Trolltech/Qt-4.7.0/bin/qmake contacts.pro
make
./contacts
&lt;/pre&gt;
&lt;p&gt;Here you can see the end result of part 2, best viewed with Chrome/Firefox 3.6:&lt;/p&gt;

Your Browser does not support the video tag, upgrade to Firefox 3.5+/Chrome
&lt;p&gt;This is the &lt;a class=&quot;reference external&quot; href=&quot;http://minimoesfuerzo.org/media/static/contacts-part2.tar.gz&quot;&gt;current source&lt;/a&gt; of the tutorial. Next (and last) part of the tutorial will look at retrieving this data at runtime from QML.&lt;/p&gt;</description>
	<pubDate>Wed, 31 Mar 2010 12:31:10 +0000</pubDate>
</item>
<item>
	<title>Pablo: Playing with QML and DBus (Part 1)</title>
	<guid>http://minimoesfuerzo.org/2010/03/30/playing-qml-and-dbus/</guid>
	<link>http://minimoesfuerzo.org/2010/03/30/playing-qml-and-dbus/</link>
	<description>&lt;h2&gt;How to integrate your DBus app and a QML UI&lt;/h2&gt;&lt;p&gt;In this tutorials I am going to explain the necessary steps to integrate
an existing codebase with DBus IPC and a QML (a.k.a. QtQuick) user
interface. In this case, I am going to write a QML interface that will
query a &lt;a class=&quot;reference external&quot; href=&quot;http://trac.warp.es/wader/wiki/WhatsModemManager&quot;&gt;ModemManager&lt;/a&gt; instance running in the background. It will be
possible to see the contacts in the SIM card and each contact will have
a detail page where you will be able to see all the SMS sent to that
contact.&lt;/p&gt;
&lt;h3&gt;Preparation&lt;/h3&gt;&lt;p&gt;You need to &lt;a class=&quot;reference external&quot; href=&quot;http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.7.0-tp.tar.gz&quot;&gt;download QT 4.7&lt;/a&gt; -at the time of writing still an alpha version-
and compile it by yourself. Bear in mind that this process might take several
hours. Also I recommend you to start using the wonderful &lt;a class=&quot;reference external&quot; href=&quot;http://get.qt.nokia.com/qtcreator/qt-creator-linux-x86-opensource-2.0.0-alpha1.bin&quot;&gt;QT Creator 2.0&lt;/a&gt;
-an alpha version too at the time of writing- as IDE. It has a decent VIM
integration and several goodies, like a visual QML editor. Do not even think
about it start downloading them now! Note that the QT 4.7 API might have
changed since I wrote this, and some parts might need minor fixes. Also
make sure to download the most recent version of both QT and QT Creator
instead of the alpha versions I had to use.&lt;/p&gt;
&lt;h4&gt;Start the project&lt;/h4&gt;&lt;p&gt;First I created a new &quot;Qt Gui&quot; project. I've used the ~/devel/git/contacts path.
This will create a bunch of files, some of them need some editing. But first...
design is not one of my strong points, so I started by reusing one of the
examples included in the documentation, the recipes example:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
cp -R ~/software/qt-everywhere-opensource-src-4.7.0-tp/examples/declarative/listview/* ~/devel/git/contacts
&lt;/pre&gt;
&lt;p&gt;Now remove the following files, as we won't need them:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
cd ~/devel/git/contacts
rm dynamic.qml highlight.qml itemlist.qml listview.qml sections.qml
rm -rf dummydata content/ClickAutoRepeating.qml
&lt;/pre&gt;
&lt;p&gt;Move MediaButton to the top level:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
mv content/MediaButton.qml .
&lt;/pre&gt;
&lt;p&gt;Edit &lt;a class=&quot;reference external&quot; href=&quot;http://qt.gitorious.org/qt/qt/blobs/4.7/examples/declarative/listview/content/MediaButton.qml#line10&quot;&gt;the&lt;/a&gt; &lt;a class=&quot;reference external&quot; href=&quot;http://qt.gitorious.org/qt/qt/blobs/4.7/examples/declarative/listview/content/MediaButton.qml#line14&quot;&gt;lines&lt;/a&gt; starting with &quot;source:&quot; and add &lt;cite&gt;content/&lt;/cite&gt; to the path to
reflect that we just moved it to the top level.&lt;/p&gt;
&lt;p&gt;Download the default image for our contacts:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
wget http://minimoesfuerzo.org/media/photos/person.png -O content/pics/person.png
&lt;/pre&gt;
&lt;p&gt;Rename recipes.qml to contacts.qml:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
mv recipes.qml contacts.qml
&lt;/pre&gt;
&lt;h4&gt;Understand what is going on under the hood&lt;/h4&gt;&lt;p&gt;Before we go on, I think it will be good to provide a minimal overview of
how &lt;a class=&quot;reference external&quot; href=&quot;http://qt.gitorious.org/qt/qt/blobs/4.7/examples/declarative/listview/recipes.qml&quot;&gt;recipes.qml&lt;/a&gt; works, and what our goal is. Note that this tutorial assumes
certain familiarity with QML/QT and related concepts, if you never heard of
this technologies, it is a good moment to &lt;a class=&quot;reference external&quot; href=&quot;http://doc.qt.nokia.com/4.7-snapshot/qt4-7-intro.html&quot;&gt;check out the docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;reference external&quot; href=&quot;http://qt.gitorious.org/qt/qt/blobs/4.7/examples/declarative/listview/recipes.qml&quot;&gt;recipes.qml&lt;/a&gt; imports &quot;content&quot; at the beginning of the script, and that folder
contains a bunch of images and a &lt;a class=&quot;reference external&quot; href=&quot;http://qt.gitorious.org/qt/qt/blobs/4.7/examples/declarative/listview/content/MediaButton.qml&quot;&gt;MediaButton.qml&lt;/a&gt; script. A QML script can
import other QML scripts and refer to other files. In addition, &quot;dummydata&quot;
is also imported and that is where the hardcoded data for recipes resides,
check out &lt;a class=&quot;reference external&quot; href=&quot;http://qt.gitorious.org/qt/qt/blobs/4.7/examples/declarative/listview/dummydata/Recipes.qml&quot;&gt;dummydata/Recipes.qml&lt;/a&gt; and look at its structure and attributes.&lt;/p&gt;
&lt;p&gt;So when you run recipes.qml, it imports in turn a bunch of other scripts and
one of them happens to be a &lt;a class=&quot;reference external&quot; href=&quot;http://doc.qt.nokia.com/4.7-snapshot/qml-listmodel.html#details&quot;&gt;ListModel&lt;/a&gt; that contains the initial data that you
get to see. How is that data referenced in recipes.qml then? Very easy, in
recipes.qml &lt;a class=&quot;reference external&quot; href=&quot;http://qt.gitorious.org/qt/qt/blobs/4.7/examples/declarative/listview/recipes.qml#line137&quot;&gt;line 137&lt;/a&gt; you can see that a ListView is defined and has a model
named &lt;cite&gt;Recipes&lt;/cite&gt;. A ListView will always have a delegate for painting and
showing the model's data. The delegate for this ListView is &lt;cite&gt;recipeDelegate&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;recipeDelegate&lt;/cite&gt; is a &lt;a class=&quot;reference external&quot; href=&quot;http://doc.qt.nokia.com/4.7-snapshot/qml-component.html#details&quot;&gt;Component&lt;/a&gt; declared in &lt;a class=&quot;reference external&quot; href=&quot;http://qt.gitorious.org/qt/qt/blobs/4.7/examples/declarative/listview/recipes.qml#line13&quot;&gt;line 13&lt;/a&gt;, and inside the block if
you want to show/paint the model's data, you just use the name of the
attribute in the model. For example, if with the current model I want to show
the title of the recipe, I need to use 'text: title'. Similarly, if I want to
show the details of a recipe, I would use 'text: details'.&lt;/p&gt;
&lt;p&gt;So our goal is to get rid of that hardcoded data model, and use a custom one
populated by ModemManager via DBus.&lt;/p&gt;
&lt;h4&gt;Initial steps&lt;/h4&gt;

Instead save the following lines in ~/devel/git/contacts/contacts.pro:&lt;pre class=&quot;prettyprint&quot;&gt;TEMPLATE = app
TARGET = contacts
DEPENDPATH += .
INCLUDEPATH += .
CONFIG += qdbus
QT += declarative

# Input
SOURCES += main.cpp contact.cpp
HEADERS += contact.h
RESOURCES += contacts.qrc
sources.files = $$SOURCES $$HEADERS $$RESOURCES contacts.pro contacts.qml
sources.path = .
target.path = .

INSTALLS += sources target&lt;/pre&gt;&lt;p&gt;This is a minimal QT project template with all the parts that we, initially,
need for the task. The target will be a binary named &quot;contacts&quot;, for now
the project will use main.cpp and contact.cpp as sources, contact.h as
headers and will use the QtDBus and QDeclarative libraries for obvious
reasons.&lt;/p&gt;
&lt;p&gt;Initial main.cpp implementation:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;#include &amp;lt;QApplication&amp;gt;

#include &amp;lt;qdeclarativeengine.h&amp;gt;
#include &amp;lt;qdeclarativecontext.h&amp;gt;
#include &amp;lt;qdeclarative.h&amp;gt;
#include &amp;lt;qdeclarativeitem.h&amp;gt;
#include &amp;lt;qdeclarativeview.h&amp;gt;

#include &quot;contact.h&quot;

int main(int argc, char ** argv)
{
    QApplication app(argc, argv);

    const QString picture = QString(&quot;qrc:/content/pics/person.png&quot;);
    const QString messages = QString(&quot;&amp;lt;html&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;No SMS!&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/html&amp;gt;&quot;);

    QList&amp;lt;QObject*&amp;gt; dataList;
    dataList.append(new Contact(&quot;John&quot;, &quot;+34243234232&quot;, messages, picture));

    QDeclarativeView view;
    QDeclarativeContext *ctxt = view.rootContext();
    ctxt-&amp;gt;setContextProperty(&quot;myModel&quot;, QVariant::fromValue(dataList));

    view.setSource(QUrl(&quot;qrc:contacts.qml&quot;));
    view.show();

    return app.exec();
}&lt;/pre&gt;&lt;p&gt;Initial contact.h:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;#ifndef CONTACT_H
#define CONTACT_H

#include &amp;lt;QObject&amp;gt;

class Contact : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QString name READ name WRITE setName)
    Q_PROPERTY(QString number READ number WRITE setNumber)
    Q_PROPERTY(QString picture READ picture WRITE setPicture)
    Q_PROPERTY(QString messages READ messages)

public:
    Contact(QObject *parent=0);
    Contact(const QString &amp;amp;name, const QString &amp;amp;number,
            const QString &amp;amp;messages, const QString &amp;amp;picture,
            QObject *parent=0);

    QString name() const;
    void setName(const QString &amp;amp;name);

    QString number() const;
    void setNumber(const QString &amp;amp;number);

    QString picture() const;
    void setPicture(const QString &amp;amp;picture);

    QString messages() const;

private:
    QString m_name;
    QString m_number;
    QString m_messages;
    QString m_picture;
};

#endif // CONTACT_H&lt;/pre&gt;&lt;p&gt;Initial contact.cpp implementation:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;#include &quot;contact.h&quot;

Contact::Contact(QObject *parent)
    : QObject(parent)
{
}

Contact::Contact(const QString &amp;amp;name, const QString &amp;amp;number,
                 const QString &amp;amp;messages, const QString &amp;amp;picture,
                 QObject *parent)
    : QObject(parent), m_name(name), m_number(number),
      m_messages(messages), m_picture(picture)
{
}

QString Contact::name() const
{
    return m_name;
}

void Contact::setName(const QString &amp;amp;name)
{
    m_name = name;
}

QString Contact::number() const
{
    return m_number;
}

void Contact::setNumber(const QString &amp;amp;number)
{
    m_number = number;
}

QString Contact::picture() const
{
    return m_picture;
}

void Contact::setPicture(const QString &amp;amp;picture)
{
    m_picture = picture;
}

QString Contact::messages() const
{
    return m_messages;
}&lt;/pre&gt;&lt;p&gt;What did we just do? We have declared a QObject class, Person, with
four properties (name, number, messages, picture) that will be accessed
from QML space transparently.&lt;/p&gt;
&lt;h4&gt;Modify contacts.qml&lt;/h4&gt;&lt;p&gt;At this point, contacts.qml still has the contents of recipes.qml, and needs
to be changed. We are going to change the references to old attributes, to
the new ones that we will use.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;In &lt;a class=&quot;reference external&quot; href=&quot;http://qt.gitorious.org/qt/qt/blobs/4.7/examples/declarative/listview/recipes.qml#line57&quot;&gt;line 57&lt;/a&gt;: Change 'text: title' to 'text: model.name'&lt;/li&gt;
&lt;li&gt;In &lt;a class=&quot;reference external&quot; href=&quot;http://qt.gitorious.org/qt/qt/blobs/4.7/examples/declarative/listview/recipes.qml#line59&quot;&gt;line 59&lt;/a&gt;: Change 'text: &quot;Ingredients&quot;' to 'text: &quot;Details&quot;'&lt;/li&gt;
&lt;li&gt;In &lt;a class=&quot;reference external&quot; href=&quot;http://qt.gitorious.org/qt/qt/blobs/4.7/examples/declarative/listview/recipes.qml#line63&quot;&gt;line 63&lt;/a&gt;: Change 'text: ingredients' to 'text: model.name'&lt;/li&gt;
&lt;li&gt;In &lt;a class=&quot;reference external&quot; href=&quot;http://qt.gitorious.org/qt/qt/blobs/4.7/examples/declarative/listview/recipes.qml#line78&quot;&gt;line 78&lt;/a&gt;: Change 'text: &quot;Method&quot;' to 'text: &quot;List of Messages&quot;'&lt;/li&gt;
&lt;li&gt;In &lt;a class=&quot;reference external&quot; href=&quot;http://qt.gitorious.org/qt/qt/blobs/4.7/examples/declarative/listview/recipes.qml#line85&quot;&gt;line 85&lt;/a&gt;: Change 'text: method' to 'text: model.messages'&lt;/li&gt;
&lt;li&gt;In &lt;a class=&quot;reference external&quot; href=&quot;http://qt.gitorious.org/qt/qt/blobs/4.7/examples/declarative/listview/recipes.qml#line137&quot;&gt;line 137&lt;/a&gt;: Change 'model: Recipes' to 'model: myModel'&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;To sum up, we have changed the old attributes in the model (title, picture,
ingredients and method) to (name, number, messages and picture). And the
model name (from &lt;cite&gt;Recipes&lt;/cite&gt; to &lt;cite&gt;myModel&lt;/cite&gt; as that's the name we've used in
main.cpp). A saavy reader will have noticed by now that there's no mention
of the number attribute in the current contacts.qml file and that's true,
to include it we just need this last modification to contacts.qml, &lt;a class=&quot;reference external&quot; href=&quot;http://qt.gitorious.org/qt/qt/blobs/4.7/examples/declarative/listview/recipes.qml#line44&quot;&gt;line
44&lt;/a&gt; defines the &lt;cite&gt;topLayout&lt;/cite&gt; Row and should look like this after the changes:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;Row {
    id: topLayout
    x: 10; y: 10; height: recipePic.height; width: parent.width
    spacing: 10

    Image {
        id: recipePic
        source: model.picture; width: 48; height: 48
    }

    Column {
        height: recipePic.height; width: background.width-recipePic.width-20
        spacing: 5

        Column {
            Text { id: title; text: model.name; font.bold: true; font.pointSize: 15 }
            Text { id: phone; text: model.number; font.bold: true; font.pointSize: 9 }
        }

        Text {
            text: &quot;Details&quot;; font.pointSize: 12; font.bold: true
            opacity: wrapper.detailsOpacity
        }
        Text {
            text: model.name; wrap: true; width: parent.width
            opacity: wrapper.detailsOpacity
        }
    }
}&lt;/pre&gt;&lt;p&gt;Now is a good time to remove all the outstanding references to the old
attributes in the code, I've done the following substitutions in contacts.qml:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
sed -i 's/recipeDelegate/contactDelegate/g' contacts.qml
sed -i 's/recipePic/contactPic/g' contacts.qml
sed -i 's/methodTitle/smsListTitle/g' contacts.qml
&lt;/pre&gt;
&lt;p&gt;The last thing we need to do is provide an initial contacts.qrc:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&amp;lt;!DOCTYPE RCC&amp;gt;&amp;lt;RCC version=&quot;1.0&quot;&amp;gt;
&amp;lt;qresource&amp;gt;
    &amp;lt;file&amp;gt;contacts.qml&amp;lt;/file&amp;gt;
    &amp;lt;file&amp;gt;MediaButton.qml&amp;lt;/file&amp;gt;
    &amp;lt;file&amp;gt;content/pics/button.png&amp;lt;/file&amp;gt;
    &amp;lt;file&amp;gt;content/pics/button-pressed.png&amp;lt;/file&amp;gt;
    &amp;lt;file&amp;gt;content/pics/person.png&amp;lt;/file&amp;gt;
    &amp;lt;file&amp;gt;content/pics/moreDown.png&amp;lt;/file&amp;gt;
    &amp;lt;file&amp;gt;content/pics/moreUp.png&amp;lt;/file&amp;gt;
&amp;lt;/qresource&amp;gt;
&amp;lt;/RCC&amp;gt;&lt;/pre&gt;&lt;p&gt;This file references every QML component/asset that is going to be used
in the project. If they are not referenced here, you will get an error
message for each time you try to access from QML an asset not included
in contacts.qrc.&lt;/p&gt;
&lt;p&gt;At this point, we are ready to compile our project and run our project:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
qmake contacts.pro
make
&lt;/pre&gt;
&lt;p&gt;Make sure that the qmake you have used is the 4.7 one, otherwise some of the
required libraries, such as QtDeclarative* will not be found. Now launch
the &lt;cite&gt;contacts&lt;/cite&gt; binary and rejoy!&lt;/p&gt;
&lt;p&gt;Make sure to read &lt;a class=&quot;reference external&quot; href=&quot;http://minimoesfuerzo.org/2010/03/31/playing-qml-and-dbus-part-2/&quot;&gt;part 2&lt;/a&gt; of this post where I will show how to retrieve
the contacts and messages from the SIM via &lt;a class=&quot;reference external&quot; href=&quot;http://trac.warp.es/wader/wiki/WhatsModemManager&quot;&gt;ModemManager&lt;/a&gt; . This is the current
source for the project &lt;a class=&quot;reference external&quot; href=&quot;http://minimoesfuerzo.org/media/static/contacts-part1.tar.gz&quot;&gt;contacts-part1.tar.gz&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Updated: I have added a small video showing the current state of the project, so you can have a quick look of what we are building. Thanks Andrew!&lt;/p&gt;

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

   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())
&lt;/pre&gt;
&lt;p&gt;&lt;tt&gt;transaction.check()&lt;/tt&gt; extracts the files affected and call the actual file checker, storing messages and errors raised to be used afterwards. &lt;/p&gt;
&lt;pre&gt;
   def check(self):
      &quot;&quot;&quot;&quot;Checks all the files added or changed in the transaction, returning
      the number or errors found.&quot;&quot;&quot;

      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
&lt;/pre&gt;
&lt;p&gt;Each call to &lt;tt&gt;checker.check()&lt;/tt&gt; checks the file handled by the &lt;tt&gt;checker&lt;/tt&gt; object, using the next tools:&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;&lt;a href=&quot;http://stosberg.net/odt2txt/&quot;&gt;odt2txt&lt;/a&gt;: converts the OpenDocument Text file into a plain text file.
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Aspell&quot;&gt;aspell&lt;/a&gt;: checks spelling.
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://people.warp.es/~xtor/blog/?p=717&quot;&gt;LanguageTool&lt;/a&gt;: checks grammar.
&lt;/li&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;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&amp;#8230;&lt;/p&gt;
&lt;pre&gt;
   def check(self):
      &quot;Checks the OpenDocument file, returning the number or errors found.&quot;

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

      return self._n_spelling_err + self._n_grammar_err

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

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

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

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

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

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

SVNLOOK = '/usr/bin/svnlook'
&lt;/pre&gt;
&lt;p&gt;In a forthcoming post, I will explain two different ways to test this pre-commit hook, so stay tuned &lt;img src=&quot;http://xtor.warp.es/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;See also:&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;&lt;a href=&quot;http://people.warp.es/~xtor/blog/?p=730&quot;&gt;A Subversion pre-commit hook for spell and grammar checking&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://people.warp.es/~xtor/blog/?p=717&quot;&gt;Grammar checking for OpenOffice.org&lt;/a&gt;&lt;/li&gt;
&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 28 Mar 2010 17:57:29 +0000</pubDate>
</item>
<item>
	<title>Hector: A Subversion pre-commit hook for spell and grammar checking</title>
	<guid>http://people.warp.es/~xtor/blog/?p=730</guid>
	<link>http://people.warp.es/~xtor/blog/?p=730</link>
	<description>&lt;p&gt;When a manager is aware of the power of sofware (beyond a couple of self-written clumsy MSOffice macros that nobody else understands), there is a huge amount of power waiting to be unleased &lt;img src=&quot;http://xtor.warp.es/wp-includes/images/smilies/icon_razz.gif&quot; alt=&quot;:P&quot; class=&quot;wp-smiley&quot; /&gt;  As a humble software engineer turned into a manager years ago, I would like to show in this post an example of how development workflows can be used to streamline business processes.&lt;/p&gt;
&lt;p&gt;At &lt;a href=&quot;http://warp.es&quot;&gt;Warp&lt;/a&gt;, we use &lt;a href=&quot;http://en.wikipedia.org/wiki/Trac&quot;&gt;Trac&lt;/a&gt; to manage all the company&amp;#8217;s processes, including the offer writing and reviewing. After a new offer has been written, it must pass a peer-review phase, where adherence to standards or technical feasibility is reviewed.&lt;/p&gt;
&lt;p&gt;But sometimes, small spelling or grammatical mistakes are made, even when you are using the built-in &lt;a href=&quot;http://en.wikipedia.org/wiki/Openoffice.org&quot;&gt;OpenOffice.org&lt;/a&gt;&amp;#8217;s tools, or external ones like &lt;a href=&quot;http://people.warp.es/~xtor/blog/?p=717&quot;&gt;LanguageTool&lt;/a&gt;. At the same time, these mistakes can be easily detected with just passing the above mentioned tools.  So, why bother if you can write a &lt;a href=&quot;http://www.thinkgeek.com/tshirts-apparel/unisex/frustrations/374d/&quot;&gt;small script&lt;/a&gt; to do the work? &lt;img src=&quot;http://xtor.warp.es/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;We store the offers in a &lt;a href=&quot;http://en.wikipedia.org/wiki/Subversion_(software)&quot;&gt;Subversion&lt;/a&gt; repository, so we link the files with the related tickets. But the nice thing about this is that we can use Subversion&amp;#8217;s pre-commit hooks to check the files before they are actually commited.&lt;/p&gt;
&lt;p&gt;So here is my &lt;a href=&quot;http://people.warp.es/~xtor/pre-commit-oo.org&quot;&gt;spell and grammar checking pre-commit hook for Subversion&lt;/a&gt;, which I will explain in a later post&amp;#8230;&lt;/p&gt;</description>
	<pubDate>Sat, 27 Mar 2010 14:03:34 +0000</pubDate>
</item>
<item>
	<title>Hector: Grammar checking for OpenOffice.org</title>
	<guid>http://people.warp.es/~xtor/blog/?p=717</guid>
	<link>http://people.warp.es/~xtor/blog/?p=717</link>
	<description>&lt;p&gt;&lt;i&gt;Disclaimer: despite the title, this post is not related with my previous flex/bison ones &lt;img src=&quot;http://xtor.warp.es/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/i&gt;&lt;/p&gt;
&lt;p&gt;I found a nice app called &lt;a href=&quot;http://www.languagetool.org/&quot;&gt;Language Tool&lt;/a&gt;, which is an open source, Java based, grammar checker supporting a lot of different languages, including &lt;a href=&quot;http://uncyclopedia.wikia.com/wiki/Spanish&quot;&gt;Spanish&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can download it as an &lt;a href=&quot;http://en.wikipedia.org/wiki/OpenOffice.org&quot;&gt;OpenOffice.org&lt;/a&gt; extension (.oxt file) from its web page. Unzipping this package with &lt;tt&gt;unzip&lt;/tt&gt; you can use it as a command line checker aswell. To check a plain text file written in &lt;a href=&quot;http://uncyclopedia.wikia.com/wiki/Spanish&quot;&gt;Spanish&lt;/a&gt;, just write:&lt;/p&gt;
&lt;pre&gt;
$ java -jar LanguageTool.jar --language es file.txt
&lt;/pre&gt;</description>
	<pubDate>Tue, 23 Mar 2010 15:39:18 +0000</pubDate>
</item>
<item>
	<title>Hector: Flex with cmake</title>
	<guid>http://people.warp.es/~xtor/blog/?p=708</guid>
	<link>http://people.warp.es/~xtor/blog/?p=708</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Cmake&quot;&gt;CMake&lt;/a&gt; supports &lt;a href=&quot;http://en.wikipedia.org/wiki/Flex_lexical_analyser&quot;&gt;flex&lt;/a&gt; (and &lt;a href=&quot;http://en.wikipedia.org/wiki/GNU_bison&quot;&gt;bison&lt;/a&gt;), allowing you to include these tools easily in your build chain:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;CMakeLists.txt&lt;/b&gt;&lt;/p&gt;
&lt;pre&gt;
find_package(FLEX)

FLEX_TARGET(Scanner  atiza.l  ${CMAKE_CURRENT_BINARY_DIR}/lex.yy.cc)

add_executable(atiza ${FLEX_Scanner_OUTPUTS})
&lt;/pre&gt;
&lt;p&gt;Running &lt;tt&gt;find_package(FLEX)&lt;/tt&gt; successfully allows us to use &lt;tt&gt;FLEX_TARGET&lt;/tt&gt; to build the &lt;tt&gt;Parser&lt;/tt&gt; target, creating the &lt;tt&gt;lex.yy.cc&lt;/tt&gt; file from &lt;tt&gt;atiza.l&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Then we use this file as the input to create the &lt;tt&gt;atiza&lt;/tt&gt; executable, and &lt;tt&gt;g++&lt;/tt&gt; is ran transparently to build it.&lt;/p&gt;</description>
	<pubDate>Mon, 22 Mar 2010 19:52:16 +0000</pubDate>
</item>
<item>
	<title>Hector: Simple flex C++ example</title>
	<guid>http://people.warp.es/~xtor/blog/?p=691</guid>
	<link>http://people.warp.es/~xtor/blog/?p=691</link>
	<description>&lt;p&gt;Simple, working examples are usually the best way to start customizing an existing software tool to fit your needs.&lt;/p&gt;
&lt;p&gt;Today I was testing &lt;a href=&quot;http://en.wikipedia.org/wiki/Flex_lexical_analyser&quot;&gt;flex&lt;/a&gt;&amp;#8217;s C++ generation and unfortunately the &lt;a href=&quot;http://flex.sourceforge.net/manual/Cxx.html#Cxx&quot;&gt;provided sample&lt;/a&gt; is not working, and it also lacks a ready-to-go Makefile. Some of the error messages look like missing dependencies:&lt;/p&gt;
&lt;pre&gt;
`cout' undeclared
. . .
undefined reference to `yywrap'
&lt;/pre&gt;
&lt;p&gt;The fixes &lt;a href=&quot;http://www.hjackson.org/cgi-bin/programming/flex.pl&quot;&gt;are trivial&lt;/a&gt;, so it was easy to get a working flex &lt;tt&gt;foobar.l&lt;/tt&gt; source and &lt;tt&gt;Makefile&lt;/tt&gt;:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;tt&gt;foobar.l&lt;/tt&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre&gt;
%option noyywrap c++

%{
using namespace std;

int mylineno = 0;
%}

string  \&quot;[^\n&quot;]+\&quot;

ws      [ \t]+

alpha   [A-Za-z]
dig     [0-9]
name    ({alpha}|{dig}|\$)({alpha}|{dig}|[_.\-/$])*
num1    [-+]?{dig}+\.?([eE][-+]?{dig}+)?
num2    [-+]?{dig}*\.{dig}+([eE][-+]?{dig}+)?
number  {num1}|{num2}

%%

{ws}    /* skip blanks and tabs */

&quot;/*&quot;    {
        int c;

        while((c = yyinput()) != 0)
            {
            if(c == '\n')
                ++mylineno;

            else if(c == '*')
                {
                if((c = yyinput()) == '/')
                    break;
                else
                    unput(c);
                }
            }
        }

{number}  cout &lt; &lt; &quot;number &quot; &lt;&lt; YYText() &lt;&lt; '\n';

\n        mylineno++;

{name}    cout &lt;&lt; &quot;name &quot; &lt;&lt; YYText() &lt;&lt; '\n';

{string}  cout &lt;&lt; &quot;string &quot; &lt;&lt; YYText() &lt;&lt; '\n';

%%

int main( int /* argc */, char** /* argv */ ) {
    FlexLexer* lexer = new yyFlexLexer;
    while(lexer-&gt;yylex() != 0);
    return 0;
}
&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;&lt;tt&gt;Makefile&lt;/tt&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre&gt;
all: lex.yy.o
	g++ lex.yy.o -o parser -lfl

lex.yy.o: lex.yy.cc
	g++ -c -o lex.yy.o lex.yy.cc

lex.yy.cc: foobar.l
	flex++ foobar.l

clean:
	rm lex.yy.* parser
&lt;/pre&gt;
&lt;p&gt;So here is a nice, working parser to start with &lt;img src=&quot;http://xtor.warp.es/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;pre&gt;
$ make
flex++ foobar.l
g++ -c -o lex.yy.o lex.yy.cc
g++ lex.yy.o -o parser -lfl

$ ./parser
2524
number 2524
dqedwqde
name dqedwqde
-1111
number -1111
. . .
&lt;/pre&gt;</description>
	<pubDate>Sun, 21 Mar 2010 14:07:03 +0000</pubDate>
</item>
<item>
	<title>Pablo: Testing ntrack</title>
	<guid>http://minimoesfuerzo.org/2010/03/12/testing-ntrack/</guid>
	<link>http://minimoesfuerzo.org/2010/03/12/testing-ntrack/</link>
	<description>&lt;h4&gt;Background&lt;/h4&gt;
&lt;p&gt;Until &lt;a href=&quot;http://projects.gnome.org/NetworkManager/&quot;&gt;NetworkManager&lt;/a&gt; appeared in scene, network management was painful on Linux. Connecting to a wireless network or a VPN involved several command line scripts, editing files with alien syntax, etc. Seriously, it was a joke when compared to what other operating systems had available. So when NetworkManager was released it filled a nice gap in the Linux Desktop, and everyone rejoiced.&lt;/p&gt;
&lt;h4&gt;The problem&lt;/h4&gt;
&lt;p&gt;In early 2008, some key apps of the Linux desktop were patched to listen to NetworkManager for connectivity status. Applications such as &lt;a href=&quot;http://www.mozilla.com/en-US/firefox/firefox.html&quot;&gt;Firefox&lt;/a&gt; or &lt;a href=&quot;http://www.pidgin.im/&quot;&gt;pidgin&lt;/a&gt; would not work if &lt;strong&gt;NetworkManager considered&lt;/strong&gt; the system wasn't online.&lt;/p&gt;
&lt;p&gt;As you might know, I have been involved in Linux connection managers since late 2006. The software were I have spent most of my energies, &lt;a href=&quot;http://www.wader-project.org/&quot;&gt;Wader&lt;/a&gt;, suffered from this. As the connection was established without NetworkManager, the applications that listened to its signals thought they were offline and thus did not work. Some apps had a workaround (like Firefox) while others didn't (pidgin).&lt;/p&gt;
&lt;p&gt;Say you want to connect via a competing connection manager, such as &lt;a href=&quot;http://wicd.sourceforge.net/&quot;&gt;WICD&lt;/a&gt;, Firefox &amp;amp; co will not work. Say you are a token ring user, well you are out of luck, NetworkManager has no plans to support token ring. As you can see the current status is not that good if you are not a NetworkManager developer/user.&lt;/p&gt;
&lt;h4&gt;The solution&lt;/h4&gt;
&lt;p&gt;Thankfully, &lt;a href=&quot;http://www.asoftsite.org/s9y/&quot;&gt;Alexander Sack&lt;/a&gt; stepped up and started working on &lt;a href=&quot;http://launchpad.net/ntrack&quot;&gt;ntrack&lt;/a&gt; after some talks we had in a &lt;a href=&quot;https://wiki.ubuntu.com/UDS&quot;&gt;UDS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;ntrack is described on its homepage as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;ntrack aims to be a lightweight and easy to use library for application developers that
want to get events on network online status changes such as online, offline or route changes.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ntrack does one thing, and excels at it. It just listens for Netlink messages regarding route changes, and will infer if it is connected from them. As you can see, this approach will work regardless of the connection manager or underlying technology used. In order to be online, you &lt;strong&gt;must&lt;/strong&gt; create a route. Thus the responsibility of determining whether we are connected or not resides on a small daemon completely &lt;b&gt;independent&lt;/b&gt; of the connection manager. This is a good thing.&lt;/p&gt;
&lt;p&gt;Today I have tested the last ntrack release (0.6) and a patched &lt;a href=&quot;http://live.gnome.org/Empathy&quot;&gt;empathy&lt;/a&gt; that listens to ntrack rather than NetworkManager and it worked wonderfully! I tested it with both PPP and NDIS (HSO) dialup and ntrack detected immediately if I was connected or not. Nice job Alexander :)&lt;/p&gt;
&lt;h4&gt;Future steps&lt;/h4&gt;
&lt;p&gt;We are going to &quot;lobby&quot; for its inclusion on Debian/Ubuntu, and patch those applications listening to NetworkManager to listen to ntrack instead. ntrack has already &lt;a href=&quot;http://packages.qa.debian.org/n/ntrack/news/20100310T134745Z.html&quot;&gt;been accepted in Debian&lt;/a&gt; and it will automatically appear in the next Ubuntu version (Lucid+1). Hopefully the rest of the distros will follow, and in 1-2 years we will have recovered from this error.&lt;/p&gt;</description>
	<pubDate>Fri, 12 Mar 2010 09:54:30 +0000</pubDate>
</item>
<item>
	<title>Warp Networks: Abierta incripción: MySQL 5.1 para administradores de bases de datos</title>
	<guid>http://warp.es/?p=298</guid>
	<link>http://feedproxy.google.com/~r/WarpNetworks/~3/UX6puApPouo/</link>
	<description>&lt;p class=&quot;western&quot;&gt;&lt;span&gt;&lt;span&gt;Abierta la inscripción para el curso &lt;strong&gt;MySQL 5.1 para administradores de bases de datos. &lt;/strong&gt;En este curso &lt;span lang=&quot;es-ES&quot;&gt;&lt;span&gt;un instructor autorizado MySQL te enseñará como instalar MySQL, crear y ejecutar estrategias de &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;&lt;span&gt;&lt;span&gt;&lt;span lang=&quot;es-ES&quot;&gt;&lt;span&gt;backup&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;span&gt;&lt;span&gt;&lt;span lang=&quot;es-ES&quot;&gt;&lt;span&gt;, crear procedimientos almacenados de forma segura, y mucho más. Además, el curso incluye la preparación para obtener el&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span lang=&quot;es-ES&quot;&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;&lt;span lang=&quot;es-ES&quot;&gt;&lt;strong&gt;Certified MySQL 5.0 DBA.&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;&lt;span&gt;&lt;span lang=&quot;es-ES&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;western&quot;&gt;
&lt;p class=&quot;western&quot; lang=&quot;es-ES&quot;&gt;&lt;span&gt;&lt;span&gt;El número de plazas limitado. &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;&lt;a href=&quot;http://warp.es/inscripcion/47/&quot;&gt;Inscribete ya&lt;/a&gt;, y asegura tu formación!&lt;/strong&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; &lt;span&gt;&lt;span&gt;Fechas: &lt;strong&gt;5 al 9 de 	abril 2010&lt;br /&gt;
&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;Duración: &lt;strong&gt;40 horas&lt;/strong&gt; distribuidas en 5 sesiones (lunes a viernes)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;Lugar: Zaragoza&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;Inversión: 1.500€&lt;/span&gt;&lt;/span&gt; (*)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;Requisitos: Haber 	realizado el curso MySQL for Beginners, o tener conocimientos 	previos en Bases de datos y SQL.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;western&quot; lang=&quot;es-ES&quot;&gt;&lt;em&gt;&lt;span&gt;&lt;span&gt;(*) Informate sobre como subvencionar la inscripción a través de la &lt;a title=&quot;Fundación Tripartita&quot; href=&quot;http://www.fundaciontripartita.org/&quot;&gt;Fundación Tripartita&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;western&quot; lang=&quot;es-ES&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;western&quot; lang=&quot;es-ES&quot;&gt;&lt;span&gt;&lt;span&gt;Otros cursos MySQL con período de inscripción abierto:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p class=&quot;western&quot;&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;&lt;span lang=&quot;es-ES&quot;&gt;&lt;span&gt;&lt;strong&gt;MySQL 	Alta Disponibilidad:&lt;/strong&gt; 3 al 5 de mayo &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;&lt;span&gt;&lt;span lang=&quot;es-ES&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class=&quot;western&quot;&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;&lt;span lang=&quot;es-ES&quot;&gt;&lt;span&gt;&lt;strong&gt;MySQL 	Optimización del Rendimiento:&lt;/strong&gt; 17 al 20 de mayo &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class=&quot;western&quot;&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;&lt;span lang=&quot;es-ES&quot;&gt;&lt;span&gt;&lt;strong&gt;MySQL 	Cluster: &lt;/strong&gt;24 al 26 de mayo &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;&lt;span&gt;&lt;span lang=&quot;es-ES&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class=&quot;western&quot;&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;&lt;span lang=&quot;es-ES&quot;&gt;&lt;span&gt;&lt;strong&gt;MySQL 	para Administradores de Bases de Datos: &lt;/strong&gt;14 al 18 de junio&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Contacto para consultas e inscripciones: &lt;a href=&quot;mailto:training@warp.es&quot;&gt;training@warp.es&lt;/a&gt; / +34 976 392 644&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/WarpNetworks/~4/UX6puApPouo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 08 Mar 2010 17:39:43 +0000</pubDate>
</item>
<item>
	<title>Blaxter: Code Monkey like Fritos</title>
	<guid>http://bicosyes.com/?p=922</guid>
	<link>http://bicosyes.com/code-monkey-like-fritos/</link>
	<description>&lt;p&gt;Until now I've never heard about this song, about a code monkey, funny and nice at the same time. The same songwriter, &lt;a href=&quot;http://en.wikipedia.org/wiki/Jonathan_Coulton&quot;&gt;Jonathan Coulton&lt;/a&gt;, has a lot more of similar (geek) songs. Awesome.&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;embed src=&quot;http://www.youtube.com/v/7s8S7QxpjeY&amp;hl=es_ES&amp;fs=1&amp;rel=0&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;/embed&gt;&lt;/div&gt;
&lt;blockquote&gt;&lt;p&gt;
Code Monkey get up get coffee&lt;br /&gt;
Code Monkey go to job&lt;br /&gt;
Code Monkey have boring meeting with boring manager Rob&lt;br /&gt;
Rob say Code Monkey very diligent&lt;br /&gt;
but his output stink&lt;br /&gt;
his code not functional or elegant&lt;br /&gt;
what do Code Monkey think&lt;br /&gt;
Code Monkey think maybe manager want to write goddamn login page himself&lt;br /&gt;
Code Monkey not say it out loud&lt;br /&gt;
Code Monkey not crazy just proud&lt;/p&gt;
&lt;p&gt;Code Monkey like Fritos&lt;br /&gt;
Code Monkey like Tab and Mountain Dew&lt;br /&gt;
Code Monkey very simple man&lt;br /&gt;
with big warm fuzzy secret heart&lt;br /&gt;
Code Monkey like you&lt;br /&gt;
Code Monkey like you&lt;/p&gt;
&lt;p&gt;Code Monkey hang around at front desk&lt;br /&gt;
tell you sweater look nice&lt;br /&gt;
Code Monkey offer buy you soda&lt;br /&gt;
bring you cup bring you ice&lt;br /&gt;
you say no thank you for the soda cause&lt;br /&gt;
soda make you fat&lt;br /&gt;
anyway you busy with the telephone&lt;br /&gt;
no time for chat&lt;/p&gt;
&lt;p&gt;Code Monkey have long walk back to cubicle&lt;br /&gt;
he sit down pretend to work&lt;br /&gt;
Code Monkey not thinking so straight&lt;br /&gt;
Code Monkey not feeling so great&lt;/p&gt;
&lt;p&gt;Code Monkey like Fritos&lt;br /&gt;
Code Monkey like Tab and Mountain Dew&lt;br /&gt;
Code Monkey very simple man&lt;br /&gt;
with big warm fuzzy secret heart&lt;br /&gt;
Code Monkey like you&lt;br /&gt;
Code Monkey like you a lot&lt;/p&gt;
&lt;p&gt;Code Monkey have every reason&lt;br /&gt;
to get out this place&lt;br /&gt;
Code Monkey just keep on working&lt;br /&gt;
to see your soft pretty face&lt;br /&gt;
Much rather wake up eat a coffee cake&lt;br /&gt;
Take bath, take nap&lt;br /&gt;
This job fulfilling in creative way&lt;br /&gt;
such a load of crap&lt;br /&gt;
Code Monkey think someday he have everything even pretty girl like you&lt;br /&gt;
Code Monkey just waiting for now&lt;br /&gt;
Code Monkey say someday, somehow&lt;/p&gt;
&lt;p&gt;Code Monkey like Fritos&lt;br /&gt;
Code Monkey like Tab and Mountain Dew&lt;br /&gt;
Code Monkey very simple man&lt;br /&gt;
with big warm fuzzy secret heart&lt;br /&gt;
Code Monkey like you&lt;br /&gt;
Code Monkey like you&lt;/p&gt;&lt;/blockquote&gt;
&lt;img src=&quot;http://bicosyes.com/?ak_action=api_record_view&amp;id=922&amp;type=feed&quot; alt=&quot;&quot; /&gt;</description>
	<pubDate>Sat, 06 Mar 2010 20:01:55 +0000</pubDate>
</item>
<item>
	<title>Warp Networks: Curso certificado eBox en el CTA de Zaragoza</title>
	<guid>http://warp.es/?p=290</guid>
	<link>http://feedproxy.google.com/~r/WarpNetworks/~3/5ElK3WfGcf8/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://warp.es/wp-content/uploads/2010/02/eboxtrainingpartner.png&quot;&gt;&lt;img class=&quot;size-medium wp-image-296 alignright&quot; title=&quot;eBox Training Partner&quot; src=&quot;http://warp.es/wp-content/uploads/2010/02/eboxtrainingpartner.png&quot; alt=&quot;&quot; width=&quot;280&quot; height=&quot;111&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Warp Networks,  como partner oficial de formación de &lt;a href=&quot;http://www.ebox-technologies.com/&quot;&gt;eBox Technologies&lt;/a&gt;, informa que en  el &lt;a href=&quot;http://inaem.aragon.es/portal/page/portal/INA/CentroFormacion/CTA%20Centro%20Tecnologias%20Avanzadas%20Zaragoza&quot;&gt;Centro de Tecnologías Avanzadas (CTA) de Zaragoza&lt;/a&gt;, se van a impartir dos cursos de la plataforma certificada eBox (marzo 2010). Los cursos, &lt;a href=&quot;http://inaem.aragon.es/portal/page/portal/INA/CentroFormacion/CTA%20Centro%20Tecnologias%20Avanzadas%20Zaragoza/CTA%20Programa%20TIC/CTA%20Programacion%20TIC/CTA%20eBox&quot;&gt;&amp;#8220;Administración de sistemas con Ubuntu - Aplicación eBox&amp;#8221;&lt;/a&gt;, se dirigen a los empleados, desempleados y profesionales independientes  interesados en la gestión de redes basada en Linux. Ambos cursos van a impartirse por el equipo docente de Warp Networks, que cuenta con profesores certificados en la plataforma eBox.&lt;/p&gt;
&lt;p&gt;Los cursos están subvencionados al 100% por el Instituto Aragonés de Empleo y se desarrollarán entre el 8 y el 26 de marzo - uno en horario de mañanas, con una duración total de 60 horas y otro en horario de tardes, con una duración total de 48 horas. Ambos cursos  se imparte en castellano e incluyen un examen de certificación. Los alumnos interesados &lt;a href=&quot;http://inaem.aragon.es/portal/page/portal/INA/CentroFormacion/CTA%20Centro%20Tecnologias%20Avanzadas%20Zaragoza/CTA%20Inscripcion&quot;&gt;pueden solicitar,   hasta el 26 de febrero, su preinscripción&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Estos cursos están dirigidos a  profesionales con conocimientos básicos sobre la gestión de redes informáticas. Por ejemplo, administradores de sistemas Windows que estén interesados en conseguir de manera rápida experiencia en la gestión de redes informáticas con sistemas basados en Linux. Después de recibir estos cursos, los estudiantes serán capaces de entender conceptos sobre gestión de equipos de red y de crear las redes de &lt;span&gt;pequeñas y  medianas &lt;/span&gt;&lt;span&gt;empresas mediante la plataforma eBox.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Los cursos incluyen un amplio conjunto de ejercicios prácticos con la plataforma eBox, todas ellas llevadas a cabo en un entorno virtual instalado en el PC de cada estudiante.&lt;span&gt; &lt;/span&gt;El &lt;a href=&quot;http://inaem.aragon.es/portal/page/portal/INA/CentroFormacion/CTA%20Centro%20Tecnologias%20Avanzadas%20Zaragoza/CTA%20Programa%20TIC/CTA%20Programacion%20TIC/CTA%20eBox&quot;&gt;programa detallado del curso está disponible en la página web del CTA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;El número máximo de estudiantes aceptados para cada curso será de 15 y los estudiantes serán seleccionados en base a su currículum vítae y un examen de conocimientos previos, que se realizará el próximo 1 de marzo en las instalaciones del CTA.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/WarpNetworks/~4/5ElK3WfGcf8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 23 Feb 2010 16:40:37 +0000</pubDate>
</item>
<item>
	<title>Hector: Wader-UI prototyping with Qt and D-BUS</title>
	<guid>http://people.warp.es/~xtor/blog/?p=664</guid>
	<link>http://people.warp.es/~xtor/blog/?p=664</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://wader-project.org&quot;&gt;Wader&lt;/a&gt;, and &lt;a href=&quot;https://forge.betavine.net/projects/bcm/&quot;&gt;Betavine Connection Manager&lt;/a&gt; &lt;a href=&quot;http://www.vodafone.com/start/innovation/betavine/vodafone_mobile_connect.html&quot;&gt;since 3.0&lt;/a&gt;, your favorite cellnet connection managers, sport a nice GTK+ user interface completely decoupled from their core functionality, which runs as a standalone component, using &lt;a href=&quot;http://en.wikipedia.org/wiki/D-Bus&quot;&gt;D-BUS&lt;/a&gt; for &lt;a href=&quot;http://en.wikipedia.org/wiki/Inter-process_communication&quot;&gt;IPC&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As one of my regular hacking activities, this weekend I decided to take a look at Qt&amp;#8217;s Python bindings, and try to build a proof-of-concept Qt Wader UI interacting with a core using D-BUS.&lt;/p&gt;
&lt;p&gt;I tried the two existing Qt Python bindings,&lt;a href=&quot;http://en.wikipedia.org/wiki/PyQt&quot;&gt; Riverbank&amp;#8217;s PyQt4&lt;/a&gt; (GPL) and &lt;a href=&quot;http://en.wikipedia.org/wiki/PySide&quot;&gt;Nokia&amp;#8217;s PySide&lt;/a&gt; (LGPL), concluding that, at the moment, the former offers a more mature and reliable alternative.&lt;/p&gt;
&lt;p&gt;The first step was reproducing Wader main window with &lt;a href=&quot;http://qt.nokia.com/products/developer-tools/developer-tools&quot;&gt;Qt Designer&lt;/a&gt;. Here is my first try &lt;img src=&quot;http://xtor.warp.es/wp-includes/images/smilies/icon_razz.gif&quot; alt=&quot;:P&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://people.warp.es/~xtor/img/wader_1st_try.png&quot; title=&quot;¿Pero tú has visto cutééééé?&quot; class=&quot;aligncenter&quot; width=&quot;266&quot; height=&quot;177&quot; /&gt;&lt;/p&gt;
&lt;p&gt;After some minutes tweaking the interface, I was able to remove most of the &lt;i&gt;ugliness&lt;/i&gt; &amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://people.warp.es/~xtor/img/wader_qter.png&quot; title=&quot;Second qtry...&quot; class=&quot;aligncenter&quot; width=&quot;183&quot; height=&quot;112.5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I played with both QtUiTools&amp;#8217; UiLoader (UI built in runtime) and Python uic (UI built in &amp;#8220;compile&amp;#8221; time), getting a neat MainWindow class generated with the user interface compiler. I prefer this approach because it allows subclassing the MainWindow, and so it gives me a cleaner code with the autoconnection features (e.g. &lt;tt&gt;on_connButton_clicked&lt;/tt&gt;):&lt;/p&gt;
&lt;pre&gt;
class MainWindow(QMainWindow, Ui_MainWindow):

	def __init__(self, parent=None):
		super(MainWindow, self).__init__(parent)
		self.setupUi(self)

	def on_connButton_clicked(self):
		print &quot;Connect button clicked&quot;
		self.dbus.screenOff()
&lt;/pre&gt;
&lt;p&gt;Then I created a simple class to bridge between D-BUS and the UI. I implemented two simple features: a call to a method which turns the screen off, and a handler for the screensaver activation signal. This way I was able to test D-BUS methods and signals with a single action &lt;img src=&quot;http://xtor.warp.es/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt;  The code worked with both Qt and Glib main loops:&lt;/p&gt;
&lt;pre&gt;
class DBusBridge():

	def __init__(self):

		self.mainloop = dbus.mainloop.qt.DBusQtMainLoop(set_as_default=True)

		self.sessionBus = dbus.SessionBus()
		self.powerdevil = self.sessionBus.get_object('org.freedesktop.PowerManagement', '/modules/powerdevil')
		self.screensaver = self.sessionBus.get_object('org.freedesktop.ScreenSaver', '/ScreenSaver')

		dbus.set_default_main_loop(self.mainloop)

		self.screensaver.connect_to_signal('ActiveChanged', self.screensaverActivated, sender_keyword='sender', destination_keyword='dest', interface_keyword='interface', member_keyword='member', path_keyword='path', message_keyword='message')

		print &quot;D-BUS bridge initialized&quot;

	# D-BUS method call
	def screenOff(self):
		self.powerdevil.turnOffScreen(dbus_interface='org.kde.PowerDevil')

	# D-BUS signal handler
	def screensaverActivated(self, *args, **kwargs):
		print &quot;got signal from %s&quot; % kwargs
		print kwargs['message'].get_args_list()
&lt;/pre&gt;
&lt;p&gt;So here is the main program code: it just creates the D-BUS bridge and the main window, shows it, and then lets main loop to take control:&lt;/p&gt;
&lt;pre&gt;
from PyQt4 import *
from MainWindow import *
from DBusBridge import *

import sys

if __name__ == &quot;__main__&quot;:
	app = QApplication(sys.argv)

	bridge = DBusBridge()

	mainWindow = MainWindow(bridge)
	mainWindow.show()

	sys.exit(app.exec_())
&lt;/pre&gt;
&lt;p&gt;To be able to link the connect button with the D-BUS method, we pass bridge as a parameter to MainWindow&amp;#8217;s constructor, and then add the call in &lt;tt&gt;on_connButton_clicked&lt;/tt&gt;:&lt;/p&gt;
&lt;pre&gt;
from PyQt4.QtGui import *
from Ui_MainWindow import *

class MainWindow(QMainWindow, Ui_MainWindow):

	def __init__(self, bridge, parent=None):
		super(MainWindow, self).__init__(parent)
		self.setupUi(self)
		self.dbus = bridge

	def on_connButton_clicked(self):
		print &quot;Connect button clicked&quot;
		self.dbus.screenOff()
&lt;/pre&gt;
&lt;p&gt;To conclude, some interesting tutorials and examples about Python and D-BUS:&lt;/p&gt;
&lt;li&gt;&lt;a href=&quot;http://techbase.kde.org/Development/Languages/Python/PyKDE_DBus_Tutorial&quot;&gt;PyKDE D-BUS Tutorial&lt;/a&gt;: powerdevil stuff and method invocation example (Qt and KDE centric)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://lateral.netmanagers.com.ar/stories/BBS54.html&quot;&gt;D-BUS Reactor&lt;/a&gt;: includes a signal handler example and a nice step by step explanation
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html&quot;&gt;Python-DBUS Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.pyside.org/docs/pyside/dbus.html&quot;&gt;PySide D-BUS integration example&lt;/a&gt;&lt;/li&gt;</description>
	<pubDate>Sun, 14 Feb 2010 13:59:47 +0000</pubDate>
</item>
<item>
	<title>Jorge: Review of Android OS looking at the Top 5 apps in the Market</title>
	<guid>http://people.warp.es/~jorge/blog/?p=242</guid>
	<link>http://people.warp.es/~jorge/blog/?p=242</link>
	<description>&lt;p&gt;As a heavy user of my Android powered mobile phone, I&amp;#8217;ve detected some &amp;#8216;must to have&amp;#8217; improvements, not yet officialy developed by Google.&lt;/p&gt;
&lt;p&gt;A possible solution to these Android lacks, could be installing the Top 5 paid apps in the Market, but it isn&amp;#8217;t the final solution whatsoever. Let&amp;#8217;s see some of the top apps in the market:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Power manager: short battery life is not only an Android related issue, but I&amp;#8217;m sure they could make more efforts to improve the battery life.&lt;/li&gt;
&lt;li&gt;Task manager: probably related with the short battery life, but an easy way to close opened applications shouldn&amp;#8217;t be so difficult to implement. Something to learn from Palm WebOS is their impressive window manager, you can see all the opened apps a la expose, and/or close a choosen app. They call it &lt;em&gt;&lt;a href=&quot;http://developer.palm.com/index.php?option=com_content&amp;#038;view=article&amp;#038;id=1761&amp;#038;Itemid=42&amp;#038;limitstart=1&quot;&gt;card view&lt;/a&gt;&lt;/em&gt;. It&amp;#8217;s the mayor usability improvement I&amp;#8217;ve seen in the latest couple of OS-mobile-development years.&lt;/li&gt;
&lt;li&gt;Better keyboard: this is a very big problem for me. My little experience with the iPhone virtual keyboard was pretty nice, but on Android devices, with the same or better screen resolution, it&amp;#8217;s very hard to write without having mistakes. A new keyboard layout, with more space bettwen rows of letters could be the solution.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google, please, listen to my prayers&amp;#8230; or you could paid &lt;a href=&quot;http://warp.es&quot;&gt;Warp&lt;/a&gt; to do the job &lt;img src=&quot;http://people.warp.es/~jorge/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;div id=&quot;mainphotoarea&quot;&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 12 Feb 2010 20:57:33 +0000</pubDate>
</item>
<item>
	<title>Jorge: Como mejorar las reuniones de trabajo</title>
	<guid>http://people.warp.es/~jorge/blog/?p=202</guid>
	<link>http://people.warp.es/~jorge/blog/?p=202</link>
	<description>&lt;p&gt;Hace poco leí un artículo que sugería diferentes acciones para mejorar y hacer más productiva una reunión de trabajo. Este artículo me llevo a otro, este a otro, y a otro&amp;#8230;&lt;/p&gt;
&lt;p&gt;Lo cierto es que recopilé unos cuantas sugerencias que luego contaré, y que deberíamos aplicar por Warp, pero también me di cuenta de que, por lo visto, hay dos tipos de productividad en las reuniones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Las que terminan lo más rápido posible&lt;/li&gt;
&lt;li&gt;Las que terminan con conclusiones, y tareas, sobre lo que has ido a hablar, centrándote en la agenda&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yo me quedo con la segunda, ya que la primera, aunque no dediques ni 10 minutos, pueden significar 10 minutos tirados a la basura.&lt;/p&gt;
&lt;p&gt;Las ideas que me han parecido más significativas para sacar provecho de una reunión son las siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reloj de pared para tener bien presente la hora en todo momento&lt;/li&gt;
&lt;li&gt;Asignar un note-taker. Nadie más puede tener distracciones electrónicas, salvo él.&lt;/li&gt;
&lt;li&gt;Prohibir telefonos, ordenadores, etc. Las distracciones fuera.&lt;/li&gt;
&lt;li&gt;Tener agenda previa, y seguirla en todo momento. El note-taker es la figura indicada para desempeñar esta función&lt;/li&gt;
&lt;li&gt;No planificar reuniones largas, después se alargarán ellas solas, además demasiados puntos en el orden del día sugieren que no tendrán demasiada relación entre si, y podría estar más justificado hacer varios encuentros, con personas diferentes&lt;/li&gt;
&lt;li&gt;Al finalizar, hacer un repaso de las conclusiones y tareas, para evitar olvidarnos alguna cosa. Estimar todas las tareas es una buena idea, así podemos planificar el siguiente encuentro para repasar si hemos alcanzado los objetivos que habían resultado de la reunión previa&lt;/li&gt;
&lt;li&gt;Stand-up meetings. Esta me ha gustado especialmente. Si todo el mundo está de pie, se centrarán en los puntos de la reunión, con el único objetivo de no cansarse o acabar con los pies molidos &lt;img src=&quot;http://people.warp.es/~jorge/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;div id=&quot;mainphotoarea&quot;&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 12 Feb 2010 09:10:15 +0000</pubDate>
</item>
<item>
	<title>Koke: Spotify is the new Napster</title>
	<guid>http://www.jorgebernal.info/?p=495</guid>
	<link>http://www.jorgebernal.info/technology/spotify-napster</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/3538385447/&quot;&gt;&lt;img src=&quot;http://www.jorgebernal.info/wp-content/uploads/2010/01/3538385447_4d8a4d7450.jpg&quot; alt=&quot;&quot; title=&quot;Music&quot; width=&quot;700&quot; height=&quot;200&quot; class=&quot;alignnone size-full wp-image-503&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I was searching for a solution to a small Spotify bug and found this user praise: &lt;a href=&quot;http://getsatisfaction.com/spotify/topics/spotify_is_what_napster_was_for_ten_years_ago&quot;&gt;Spotify is what napster was for ten years ago&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then another user replied:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;how do you mean?&lt;/p&gt;
&lt;p&gt;ten years ago Napster was an illegal channel for sharing and downloading music, built p2p.&lt;/p&gt;
&lt;p&gt;are you ironic and i missed the punchline? &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Fair enough. But still this guy had a point. &lt;strong&gt;Spotify is not the same thing as Napster, but another milestone in the Music Industry transformation&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Napster started a revolution. I&amp;#8217;m not talking about piracy, I&amp;#8217;m talking about spreading the message that the current formats were obsolete and people had different musical needs. The success of the iTunes Store is a good proof of that.&lt;/p&gt;
&lt;p&gt;Spotify, as I see it, is the beginning of the end of that revolution. Say goodbye to useless CDs and DVDs. Goodbye to paying for an album with a couple of good songs and crap for filling.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The next logical step would be a &lt;em&gt;Spotify for video&lt;/em&gt;. &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The only thing I&amp;#8217;ve seen coming from the (music and movie) industry in the last 10 years has been the message that piracy was illegal, and immoral, and that it would kill the music and movies. Maybe they have a point, maybe not.&lt;/p&gt;
&lt;p&gt;Recently, they&amp;#8217;ve been &lt;a href=&quot;http://www.msnbc.msn.com/id/34769344/ns/technology_and_science-tech_and_gadgets/&quot;&gt;trying to ban&lt;/a&gt; download sites in Spain. What then? Without P2P:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I can only get movies on theaters (when/where they want) or DVD (how they want). Theaters are expensive (especially if you account for most of the movies not being worth the price) and I just don&amp;#8217;t see myself going to a store or having to wait for a DVD to arrive to watch a movie&lt;/li&gt;
&lt;li&gt;If you want movies in VO, there are little options. Thankfully we have now one cinema playing VO movies in our town, but still not enough&lt;/li&gt;
&lt;li&gt;If you want TV Shows on VO you have to wait until the DVD comes out. Most of the successful shows are on TV, but delayed for weeks (or even months) and in Spanish&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I found a &lt;a href=&quot;http://sam.brown.tc/entry/398/andy-budd-on-the-uk-film-and-tv-industry&quot;&gt;quote&lt;/a&gt; yesterday that summed it up pretty well:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;“People don&amp;#8217;t go out of their way to pirate movies and TV programs; they&amp;#8217;re not intrinsically bad people. They do it because often it&amp;#8217;s quicker and easier than legitimate means. The quicker the film and TV industries recognise this and make it as easy to buy legal content as it is to download illegitimate content, the more likely they are to stem the flow.”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;But I believe if they shut up for a minute and &lt;strong&gt;listen&lt;/strong&gt;, they&amp;#8217;d realize &lt;strong&gt;there&amp;#8217;s people willing to pay, but they are not selling to them&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 class=&quot;related_post_title&quot;&gt;Related posts&lt;/h3&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/innovation/fair-price&quot; title=&quot;Fair price&quot;&gt;Fair price&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description>
	<pubDate>Mon, 18 Jan 2010 15:14:48 +0000</pubDate>
</item>
<item>
	<title>Dani: Datos y no especulaciones</title>
	<guid>http://people.warp.es/~dani/blog/?p=216</guid>
	<link>http://dani.warp.es/?p=216</link>
	<description>&lt;p&gt;El día 5 de Enero (como regalo de la noche de Reyes, dirán algunos), Google presentó su propio terminal Android: &lt;a href=&quot;http://www.google.com/phone/?locale=en_US&amp;#038;s7e=&quot;&gt;Nexus On&lt;/a&gt;e. Este móvil se lanzó con su propia versión de &lt;a href=&quot;http://developer.android.com/sdk/android-2.1.html&quot;&gt;la plataforma Android, la 2.1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Durante estos días &lt;a href=&quot;http://www.eleconomista.es/telecomunicaciones-tecnologia/noticias/1829743/01/10/El-Nexus-One-de-Google-pincha-en-el-mercado-y-solo-vende-20000-unidades-.html&quot;&gt;se ha especulado&lt;/a&gt; sobre la cantidad de terminales vendidos (~20.000) en los primeros días, pero no se sabe a ciencia cierta cual es la cuota real de estos terminales o lo que han supuesto sobre el total del mercado.&lt;/p&gt;
&lt;p&gt;Aparte, Google lanzó como recurso de programación el &lt;a href=&quot;http://developer.android.com/resources/dashboard/platform-versions.html&quot;&gt;Android Dashboard&lt;/a&gt;, una página que muestra cual es la cuota del mercado Android, diferenciado por versiones del SDK. Los cálculos se realizan desde quince días antes de la fecha indicada, y muestra un sencillo gráfico para que los programadores calculen si les interesa o no soportar determinada plataforma.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://chart.apis.google.com/chart?cht=p&amp;#038;chs=400x250&amp;#038;chd=t:0.3,31.0,47.6,0.7,20.4&amp;#038;chl=Android%201.1|Android%201.5|Android%201.6|Android%202.0|Android%202.0.1&amp;#038;chco=c4df9b,6fad0c&quot; alt=&quot;Vista actual del Android Dashboard&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Hoy muestra como fecha final de análisis, la del día anterior a la presentación de Nexus One, lo que quiere decir que pronto crecerá el sector de la plataforma 2.1, y veremos cuál es el impacto real de este pequeño aparatito.&lt;/p&gt;</description>
	<pubDate>Mon, 18 Jan 2010 10:16:40 +0000</pubDate>
</item>
<item>
	<title>Dani: Android no significa “garantía de éxito” (II)</title>
	<guid>http://people.warp.es/~dani/blog/?p=188</guid>
	<link>http://dani.warp.es/?p=188</link>
	<description>&lt;p&gt;Ha pasado algo más de un mes desde el último post. No quería que hubiera pasado tanto, pero ha sido un mes Android bastante interesante. Han salidos nuevos dispositivos, aplicaciones interesantes, juegos divertidísimos, pero como se quedó colgando en el post anterior: &amp;#8220;Android no significa garantía de éxito&amp;#8221;.&lt;/p&gt;
&lt;p&gt;El por qué tiene un nombre propio: Samsung Galaxy. Cualquiera que vea las &lt;a href=&quot;http://www.gsmarena.com/samsung_i7500_galaxy-2791.php&quot;&gt;prestaciones del aparato&lt;/a&gt; puede quedarse bastante impresionado: buena cámara, buenísima pantalla, batería de gran duración&amp;#8230; pero, ¿y qué tal se comporta Android? ¿qué tal está integrado? ¿cómo es que no tiene esa serigrafía que dice &amp;#8220;with Google&amp;#8221;?&lt;/p&gt;
&lt;p&gt;Bien, empecemos con un poco de historia. Este terminal fue puesto a la venta (aproximadamente) en Julio de 2008. Quizá muchos usuarios no tenían muy claro entonces de lo que era aquello de &amp;#8220;with Google&amp;#8221; pero la explicación es sencilla: &amp;#8221; &amp;#8216;with Google&amp;#8217; marca aquellos dispositivos desarrollados conjuntamente con Google, y los cuales dispondrán de actualizaciones OTA&amp;#8221;. OTA significa &amp;#8216;over-the-air&amp;#8217; y quiere decir que estos móviles pueden actualizarse descargandose un archivo dentro del móvil y reiniciando. Fin de complicaciones.&lt;/p&gt;
&lt;p&gt;¿Y si no tienes un móvil &amp;#8216;with Google&amp;#8217;? Pues entonces pasará como con Samsung Galaxy, que has de disponer de un paquete de software provisto por el fabricante que te permitirá actualizar tu terminal. Aquí empieza el calvario de Galaxy. El software provisto por Samsung:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Es una aplicación bastante pesada&lt;/li&gt;
&lt;li&gt;Realiza muchas operaciones que no quiero (por ejemplo sincronizar contactos, tarea que ya hace Android con mi cuenta Google)&lt;/li&gt;
&lt;li&gt;Sólo es para Windows. El resto de sistemas operativos pueden irse a plantar patatas al campo&lt;/li&gt;
&lt;li&gt;Y la más divertida de todas&amp;#8230;. &lt;strong&gt;La aplicación no soporta Samsung Galaxy!&lt;/strong&gt; Por lo que por mucho que la tengas instalada, sólo servirá para el resto de los dispositivos Samsung, pero no para este móvil&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aunque la aplicación para actualizar el teléfono, no funcione porque no lo soporta, Samsung ha ido colgando firmwares en su web durante meses. Y la gente los ha usado&amp;#8230; pero para ello han tenido que fabricarse una herramienta que pudiera &amp;#8220;inyectar&amp;#8221; las actualizaciones (más que necesarias) al teléfono.&lt;/p&gt;
&lt;p&gt;Actualizar un buen móvil puede ser una tarea casi innecesaria, puede pensar cualquiera, pero Galaxy habrá tenido entre 7 y 10 firmwares distintos. Con éxitos y fracasos a partes bastante desiguales. En uno de los más sonados firmwares rotos, la fantástica batería que en reposo debería durar 450 horas, duraba 4 aproximadamente. Una centena de veces menos que lo que afirmaba el fabricante! Para asustarse&amp;#8230;&lt;/p&gt;
&lt;p&gt;Pero esto fue un suma y sigue:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;¿La brujula electrónica?&lt;/em&gt; Tiene un bug su firmware que hace que muchas aplicaciones tengan que adaptarse específicamente para este terminal&lt;/li&gt;
&lt;li&gt;&lt;em&gt;¿Y el GPS?&lt;/em&gt;Bien gracias, siempre que no lo actives junto con la WiFi, porque entones la conexión inalámbrica empieza a fallar. No escanea redes algunas veces, muy alto consumo de batería&amp;#8230; genial&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Pero la pantalla es buena, ¿no?&lt;/em&gt; La pantalla es una de las mejores que he visto para un móvil, pero&amp;#8230; nunca había visto que el módulo de telefonía haga interferencias y se pueda ver cuando se está asociando a la red o le llega un SMS porque la pantalla tiemble&lt;/li&gt;
&lt;li&gt;El soporte de 3D está bastante estropeado&lt;/li&gt;
&lt;li&gt;Incluso el botón para hacer fotos con la cámara integrada tiene un bug, por el cual, aunque esté bloqueado el móvil, si el botón se pulsa parcialmente, el teléfono se activa perdiendo batería. Si a esto le sumamos que la funda del móvil, por diseño, deja pulsado parcialmente el botón de la cámara&amp;#8230;&lt;/li&gt;
&lt;li&gt;También se puede disfrutar de una capa de telefonía a la que le faltan partes por terminar de implementar y fallos en cosas como el teclado de teléfono, el cual muchas veces no puede ser utilizado durante la llamada para enviar tonos DTMF (los contéstadores de Telefónica nunca oirán un Galaxy)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;¿Ocurre todo esto en los terminales de HTC? Pues no lo sé ciertamente, pero lo dudo, porque se han desarrollado &amp;#8216;with Google&amp;#8217; &lt;img src=&quot;http://dani.warp.es/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Mirando las tripas que corren dentro del móvil, también se pueden observar procesos extras. Por ejemplo está el que ayuda a la comunicación con la suite de la que antes hablábamos&amp;#8230; que lógicamente no funciona, por lo que sólo sirve para gastar batería del terminal. O buscando por las trazas del sistema, puedes encontrar &amp;#8220;explosiones&amp;#8221; de demonios del sistema operativo, o incluso de la capa de telefonía.&lt;/p&gt;
&lt;p&gt;Si no supiéramos que es Android, y fuera un firmware X desarrollado por el fabricante, este terminal no tendría más de un 2 sobre 10 en su calificación. Y es lo que tienen las cosas a medio hacer, que por muy buen hardware y software base que exista detrás, si no hay una cuidadosa labor de integración entre ambas partes, no sirve de nada.&lt;/p&gt;
&lt;p&gt;Por suerte, las cosas cambiaron hace muy pocas semanas con la aparición de dos nuevos firmwares (abreviados como IK4 e IK5) que resuelven el 90% de los problemas&amp;#8230; pero segun los rumores que corren, Galaxy no tendrá actualizaciones posteriores a Android 1.5, cuando la mayoría del resto de terminales si.&lt;/p&gt;
&lt;p&gt;Por tanto, por mucho Android que se pueda disfrutar, queda un sabor bastante descafeinado y muy lejos de ser un terminal &amp;#8220;de éxito&amp;#8221;. Aunque de todas formas, no tiene por qué ser todo tan malo en el mundo de Android si uno no va de la mano de Google, ¿no?&lt;/p&gt;</description>
	<pubDate>Thu, 14 Jan 2010 00:33:29 +0000</pubDate>
</item>
<item>
	<title>Blaxter: Practical Reporting with Ruby and Rails</title>
	<guid>http://bicosyes.com/?p=911</guid>
	<link>http://bicosyes.com/practical-reporting-with-ruby-and-rails/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://bicosyes.com/wp-content/uploads/2010/01/practicalreporting.jpg&quot;&gt;&lt;img src=&quot;http://bicosyes.com/wp-content/uploads/2010/01/practicalreporting-227x300.jpg&quot; alt=&quot;practical reporting with ruby and rails&quot; title=&quot;practical reporting with ruby and rails&quot; width=&quot;127&quot; class=&quot;noframe alignleft size-medium wp-image-913&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://bicosyes.com/feed/Practical Reporting with Ruby and Rails&quot;&gt;Practical Reporting with Ruby and Rails&lt;/a&gt; es un libro escrito por &lt;a href=&quot;http://dtb.me/&quot;&gt;David Berube&lt;/a&gt; sobre reporting con la ayuda de ruby. Se compone de varios capítulos que van desde generar un gráfico con &lt;a href=&quot;http://nubyonrails.com/pages/gruff&quot;&gt;gruff&lt;/a&gt;, generar &lt;a href=&quot;http://github.com/clivecrous/remarkably&quot;&gt;xml&lt;/a&gt;/&lt;a href=&quot;http://fastercsv.rubyforge.org/&quot;&gt;csv&lt;/a&gt;/&lt;a href=&quot;http://ruby-pdf.rubyforge.org/pdf-writer/&quot;&gt;pdf&lt;/a&gt;, importaciones desde &lt;a href=&quot;http://sporkmonger.com/projects/feedtools&quot;&gt;feeds&lt;/a&gt;, hojas de cálculo o &lt;a href=&quot;http://ruby-doc.org/stdlib/libdoc/win32ole/rdoc/index.html&quot;&gt;Microsoft Office&lt;/a&gt;. Todo esto suena bastante bien, pero es el propio carácter del libro, &lt;em&gt;practical&lt;/em&gt;, que hace que pierda bastante puntos por su simpleza y falta de profundidad a la hora de tocar los distintos temas.&lt;/p&gt;
&lt;p&gt;Es un libro realmente bueno si lo lees con las expectativas apropiadas, y puede llegar a ser un auténtico fiasco en otros casos. En mi particular caso fue el último escenario.&lt;/p&gt;
&lt;p&gt;Ya es la segunda vez que me pasa con libros de esta editorial, &lt;a href=&quot;http://www.apress.com/&quot;&gt;Apress&lt;/a&gt;. Son libros bien escritos, tratando muchos temas, pero con un nivel bastante bajo en cuanto a profundidad de conceptos y nivel requerido. Esto no es malo, por supuesto, simplemente es algo a tener en cuenta para saber si es un libro que te reportará algún beneficio y satisfacción.&lt;/p&gt;
&lt;p&gt;Cada capítulo suele seguir la siguiente estructura: (1) Puesta en contexto del problema a resolver, (2) introducción de herramientas a usar, (3) trozo de código, (4) explicación del código. Donde las dos últimas partes suelen ser prácticamente la totalidad del capítulo. El código suele ser bastante simple y sencillo de entender, pero a pesar de ello tendremos luego un considerable número de páginas para explicar obviedades para cualquiera que haya programado mínimamente en ruby o en reporting en general. Si a esto añadimos que el libro no es muy extenso en páginas (280 aprox.) tenemos que se podría resumir el libro en un listado de referencias a herramientas usadas y 5 o 6 &lt;em&gt;snippets&lt;/em&gt; de código interesantes de no más de 200 líneas.&lt;/p&gt;
&lt;p&gt;De todas formas, para alguien que esté interesado en estos temas (reporting) y que no tenga mucha experiencia (en reporting, en ruby o en ambos), es un libro bastante bueno, bien redactado, bien explicado (demasiado) y de rápida lectura. En otros casos no lo recomendaría, y personalmente no me ha gustado mucho que digamos.&lt;/p&gt;
&lt;img src=&quot;http://bicosyes.com/?ak_action=api_record_view&amp;id=911&amp;type=feed&quot; alt=&quot;&quot; /&gt;</description>
	<pubDate>Mon, 11 Jan 2010 11:58:40 +0000</pubDate>
</item>
<item>
	<title>Warp Networks: Formación JAVA y MySQL en Zaragoza. Calendario 2010.</title>
	<guid>http://warp.es/?p=279</guid>
	<link>http://feedproxy.google.com/~r/WarpNetworks/~3/B53H5pCSR_o/</link>
	<description>&lt;p&gt;Os informamos de los cursos públicos JAVA y MySQL,  que se van a impartir en el primer semestre de 2010,  en Zaragoza.&lt;/p&gt;
&lt;p&gt;Warp Networks como partner oficial de Sun Microsystems,  imparte formación certificada MySQL y JAVA.&lt;/p&gt;
&lt;p&gt;También puede proveer a los interesados de vouchers para certificaciones Sun.&lt;/p&gt;
&lt;h3 id=&quot;toc-formacion-java-en-zaragoza&quot;&gt;FORMACIÓN JAVA EN ZARAGOZA:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;Desarrollo de aplicaciones con Java SE Platform (SL-285-SE6): Febrero 1-5&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Desarrollo de Aplicaciones Java EE (FJ-310-EE5): 31 Mayo-4 Junio&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Programación Java (SL-275-SE6): Junio 21-25&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Desarrollo de aplicaciones con Java SE Platform (SL-285-SE6):28 Junio-2 Julio&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;toc-formacion-mysql-en-zaragoza&quot;&gt;FORMACIÓN MYSQL EN ZARAGOZA:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MySQL para Administradores de Bases de Datos: Abril 5-9&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MySQL Alta Disponibilidad; Mayo 3-5&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MySQL Optimización del Rendimiento: Mayo 17-20&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MySQL Cluster: mayo 24-26&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MySQL para Administradores de Bases de Datos: Junio 14-18&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;INSCRIPCIONES E INFORMACION: training@warp.es&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/WarpNetworks/~4/B53H5pCSR_o&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 11 Jan 2010 10:36:21 +0000</pubDate>
</item>
<item>
	<title>Koke: My 2009 in pictures</title>
	<guid>http://www.jorgebernal.info/?p=491</guid>
	<link>http://www.jorgebernal.info/photography/2009-pictures</link>
	<description>&lt;p&gt;Looking back at 2009, it seems I haven&amp;#8217;t been taking so many pictures as I did in 2008, but I see more variety. Here are some of those, some I feel proud of, some bring some good memories and some just make me smile&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/3468699733/in/dateposted/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3605/3468699733_f06d0d4e0f.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/3503844931/in/dateposted/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3632/3503844931_d8d7a5deb1.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/3567227866/in/dateposted/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3655/3567227866_6449966f08.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/3696218688/in/dateposted/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3578/3696218688_7f259a45c4.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/3698417080/in/dateposted/&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2447/3698417080_9c1ae6ec2b.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/3777057023/in/dateposted/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3498/3777057023_b3d424dbc7.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/3782814342/in/dateposted/&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2549/3782814342_b89f5138a6.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/3828210238/in/dateposted/&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2519/3828210238_a0b35258b7.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/3827399125/in/dateposted/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3570/3827399125_a2e40e4c7c.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/3827394549/in/dateposted/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3423/3827394549_661324f87f.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/3827393339/in/dateposted/&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2586/3827393339_b989fdef4a.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/3827387237/in/dateposted/&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2581/3827387237_622d8500d3.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/3839885322/in/dateposted/&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2644/3839885322_0ab4ae50d9.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/4065342358/in/dateposted/&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2713/4065342358_0480e4e4fa.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/4124481931/in/dateposted/&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2589/4124481931_230433445d.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/4143138565/in/dateposted/&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2657/4143138565_6aeb8306c2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 class=&quot;related_post_title&quot;&gt;Most Commented Posts&lt;/h3&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/innovation/ibuy&quot; title=&quot;Shop in Amazon from your iPhone with iBuy&quot;&gt;Shop in Amazon from your iPhone with iBuy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/dev-random/fake-ad-i-presume&quot; title=&quot;Fake ad, I presume&quot;&gt;Fake ad, I presume&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/innovation/amazing-new-image-resizing-technology&quot; title=&quot;Amazing new image resizing technology&quot;&gt;Amazing new image resizing technology&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/wtf/whats-wrong-with-colors-in-firefox&quot; title=&quot;What&amp;#8217;s wrong with colors in Firefox?&quot;&gt;What&amp;#8217;s wrong with colors in Firefox?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/opensource/is-ubuntu-the-new-linux&quot; title=&quot;Is Ubuntu the new Linux?&quot;&gt;Is Ubuntu the new Linux?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description>
	<pubDate>Wed, 06 Jan 2010 23:01:55 +0000</pubDate>
</item>
<item>
	<title>Pablo: minimoesfuerzo.org site details</title>
	<guid>http://minimoesfuerzo.org/2009/12/29/minimoesfuerzoorg-site-details/</guid>
	<link>http://minimoesfuerzo.org/2009/12/29/minimoesfuerzoorg-site-details/</link>
	<description>&lt;p&gt;I got interested in &lt;a href=&quot;http://www.djangoproject.com/&quot;&gt;Django&lt;/a&gt; around mid 2007 (0.96 timeline), I quickly built a django blog following a known early &lt;a href=&quot;http://www.rossp.org/blog/2006/jan/23/building-blog-django-1/&quot;&gt;tutorial&lt;/a&gt; in the matter. It was lean and fast, but some basic features were missing.&lt;/p&gt;
&lt;p&gt;Around that time Nat released django-basic-blog (now a part of &lt;a href=&quot;http://code.google.com/p/django-basic-apps/&quot;&gt;django-basic-apps&lt;/a&gt;), it offered pretty much what you need from a basic blog, but still I wanted to do something on my own.&lt;/p&gt;
&lt;p&gt;I started a couple of half-baked attempts before I lost all interest, it was fun but I couldn't help but thinking that I was reimplementing other people's apps. That's when &lt;a href=&quot;http://github.com/montylounge/django-mingus/&quot;&gt;django-mingus&lt;/a&gt; appeared on my radar.&lt;/p&gt;
&lt;h2&gt;django-mingus&lt;/h2&gt;
&lt;p&gt;Mingus is a blog engine leveraging reusable apps for all its features, its &lt;a href=&quot;http://blog.montylounge.com/&quot;&gt;author&lt;/a&gt; explained the apps that power django-mingus in great &lt;a href=&quot;http://blog.montylounge.com/2009/sep/24/apps-that-power-django-mingus/&quot;&gt;detail&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I quickly knew that this is what I intended to build in first place, so I just &lt;a href=&quot;http://github.com/pmarti/django-mingus/&quot;&gt;forked&lt;/a&gt; it and started customizing it.&lt;/p&gt;
&lt;h2&gt;Customizations&lt;/h2&gt;
&lt;p&gt;Apart from some CSS tweaks, I was generally pleased with the feature set provided by Mingus. The only grip that I initially had is that Mingus (as Wordpress IIRC) sports both &quot;Categories&quot; and &quot;Tags&quot;, I didn't quite like the overlap between them so I removed all the categories uses by tags'. I added restructuredtext support too as that's my favourite lightweight markup. I also removed the quoteme related functionality, as I didn't picture myself using it much.&lt;/p&gt;
&lt;h2&gt;Deployment&lt;/h2&gt;
&lt;p&gt;This site is deployed with &lt;a href=&quot;http://code.google.com/p/modwsgi/&quot;&gt;mod_wsgi&lt;/a&gt; and it was quite easy, mod_wsgi should be the blessed deployment method rather than mod_python by a mile!&lt;/p&gt;</description>
	<pubDate>Tue, 29 Dec 2009 14:41:38 +0000</pubDate>
</item>
<item>
	<title>Blaxter: boost::asio, synchronous read with timeout</title>
	<guid>http://bicosyes.com/?p=833</guid>
	<link>http://bicosyes.com/boostasio-synchronous-read-with-timeout/</link>
	<description>&lt;p&gt;The &lt;strong&gt;&lt;a href=&quot;http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio.html&quot;&gt;boost::asio&lt;/a&gt;&lt;/strong&gt; (which means asynchronous input/output) library, is quite powerful library for asynchronous i/o, but it could be a bit difficult at first to figure out how to do a normal &lt;strong&gt;synchronous&lt;/strong&gt; read. So, as a reminder for my future-me, and for you, this snippet it'll be very useful to accomplish that. Probably there will be another ways for doing that, but this is how I managed to do it:&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;span&gt;using&lt;/span&gt; &lt;span&gt;namespace&lt;/span&gt; boost::&lt;span&gt;asio&lt;/span&gt;;
&lt;span&gt;using&lt;/span&gt; &lt;span&gt;namespace&lt;/span&gt; boost::&lt;span&gt;system&lt;/span&gt;;
&lt;span&gt;using&lt;/span&gt; boost::&lt;span&gt;optional&lt;/span&gt;;
&amp;nbsp;
ip::&lt;span&gt;tcp&lt;/span&gt;::&lt;span&gt;socket&lt;/span&gt; _socket; &lt;span&gt;// it could be another kind of socket, not only ip::tcp&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;/**
 * Dumb function to be used as handler argument and save the error_code
 * into a pointer
 *
 * e.g.: boost::bind( &amp;amp;set_result, some_pointer, _1 )
 */&lt;/span&gt;
&lt;span&gt;void&lt;/span&gt; set_result&lt;span&gt;&amp;#40;&lt;/span&gt; optional&amp;lt;error_code&amp;gt;* a, error_code b &lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
  a-&amp;gt;reset&lt;span&gt;&amp;#40;&lt;/span&gt; b &lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;#define TIMEOUT 60&lt;/span&gt;
&lt;span&gt;/**
 * it uses _socket
 * if timeout happends throw a system_error exception
 */&lt;/span&gt;
template&amp;lt;typename MutableBufferSequence&amp;gt;
optional&amp;lt;error_code&amp;gt; read_with_timeout&lt;span&gt;&amp;#40;&lt;/span&gt;
    &lt;span&gt;const&lt;/span&gt; MutableBufferSequence&amp;amp; buffer
  &lt;span&gt;&amp;#41;&lt;/span&gt; throw&lt;span&gt;&amp;#40;&lt;/span&gt; system_error &lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
  optional&amp;lt;error_code&amp;gt; timer_result;
  optional&amp;lt;error_code&amp;gt; read_result;
&amp;nbsp;
  deadline_timer timer&lt;span&gt;&amp;#40;&lt;/span&gt; _socket.&lt;span&gt;io_service&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
  timer.&lt;span&gt;expires_from_now&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt; seconds&lt;span&gt;&amp;#40;&lt;/span&gt;TIMEOUT&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;;
  timer.&lt;span&gt;async_wait&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt; boost::&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&amp;amp;set_result, &amp;amp;timer_result, _1&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
  boost::&lt;span&gt;asio&lt;/span&gt;::&lt;span&gt;async_read&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;
      _socket,
      buffer,
      boost::&lt;span&gt;asio&lt;/span&gt;::&lt;span&gt;transfer_at_least&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt; buffer_size_helper&lt;span&gt;&amp;#40;&lt;/span&gt;buffer&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;,
      boost::&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt; &amp;amp;set_result, &amp;amp;read_result, _1 &lt;span&gt;&amp;#41;&lt;/span&gt;
    &lt;span&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
  _socket.&lt;span&gt;io_service&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;reset&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
  &lt;span&gt;while&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt; _socket.&lt;span&gt;io_service&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;run_one&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;
  &lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt; read_result &lt;span&gt;&amp;#41;&lt;/span&gt;
    &lt;span&gt;&amp;#123;&lt;/span&gt;
      timer.&lt;span&gt;cancel&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
    &lt;span&gt;&amp;#125;&lt;/span&gt;
    &lt;span&gt;else&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt; timer_result &lt;span&gt;&amp;#41;&lt;/span&gt;
    &lt;span&gt;&amp;#123;&lt;/span&gt;
      _socket.&lt;span&gt;cancel&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
      throw system_error&lt;span&gt;&amp;#40;&lt;/span&gt;
          error_code&lt;span&gt;&amp;#40;&lt;/span&gt; errc::&lt;span&gt;timed_out&lt;/span&gt;, get_generic_category&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;
        &lt;span&gt;&amp;#41;&lt;/span&gt;;
    &lt;span&gt;&amp;#125;&lt;/span&gt;
  &lt;span&gt;&amp;#125;&lt;/span&gt;
  &lt;span&gt;return&lt;/span&gt; read_result;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;I hope it will be useful, have fun.&lt;/p&gt;
&lt;img src=&quot;http://bicosyes.com/?ak_action=api_record_view&amp;id=833&amp;type=feed&quot; alt=&quot;&quot; /&gt;</description>
	<pubDate>Sun, 20 Dec 2009 20:48:25 +0000</pubDate>
</item>
<item>
	<title>Jorge: Probando la fotografía réflex digital</title>
	<guid>http://people.warp.es/~jorge/blog/?p=234</guid>
	<link>http://people.warp.es/~jorge/blog/?p=234</link>
	<description>&lt;p&gt;Ya me he decidido a aprender un poco más en serio sobre fotografía, y para hacerlo&amp;#8230; empezaré a usar la cámara que me han regalado hace poco, una Nikon D90.&lt;/p&gt;
&lt;p&gt;Estas son las primeras fotos que hice en modo automático, sin complicaciones vamos:&lt;/p&gt;
				&lt;div id=&quot;gallery-efaf3d1f&quot; class=&quot;flickr-gallery photoset&quot;&gt;
													&lt;div class=&quot;flickr-thumb&quot;&gt;
									&lt;a href=&quot;http://flickr.com/photo.gne?id=4158510486&quot;&gt;&lt;img class=&quot;photo&quot; title=&quot;Pingo&quot; src=&quot;http://farm3.static.flickr.com/2518/4158510486_4a90a8a12f_s.jpg&quot; alt=&quot;Pingo&quot; /&gt;&lt;/a&gt;
								&lt;/div&gt;
															&lt;div class=&quot;flickr-thumb&quot;&gt;
									&lt;a href=&quot;http://flickr.com/photo.gne?id=4158513822&quot;&gt;&lt;img class=&quot;photo&quot; title=&quot;Pingo&quot; src=&quot;http://farm5.static.flickr.com/4002/4158513822_dea3d39eb4_s.jpg&quot; alt=&quot;Pingo&quot; /&gt;&lt;/a&gt;
								&lt;/div&gt;
															&lt;div class=&quot;flickr-thumb&quot;&gt;
									&lt;a href=&quot;http://flickr.com/photo.gne?id=4157755353&quot;&gt;&lt;img class=&quot;photo&quot; title=&quot;Pingo&quot; src=&quot;http://farm3.static.flickr.com/2660/4157755353_52fbcb5382_s.jpg&quot; alt=&quot;Pingo&quot; /&gt;&lt;/a&gt;
								&lt;/div&gt;
															&lt;div class=&quot;flickr-thumb&quot;&gt;
									&lt;a href=&quot;http://flickr.com/photo.gne?id=4157759279&quot;&gt;&lt;img class=&quot;photo&quot; title=&quot;Pingo&quot; src=&quot;http://farm3.static.flickr.com/2735/4157759279_e5d303b8c1_s.jpg&quot; alt=&quot;Pingo&quot; /&gt;&lt;/a&gt;
								&lt;/div&gt;
															&lt;div class=&quot;flickr-thumb&quot;&gt;
									&lt;a href=&quot;http://flickr.com/photo.gne?id=4160406017&quot;&gt;&lt;img class=&quot;photo&quot; title=&quot;Pingo&quot; src=&quot;http://farm3.static.flickr.com/2511/4160406017_1113ce613d_s.jpg&quot; alt=&quot;Pingo&quot; /&gt;&lt;/a&gt;
								&lt;/div&gt;
															&lt;div class=&quot;flickr-thumb&quot;&gt;
									&lt;a href=&quot;http://flickr.com/photo.gne?id=4161169924&quot;&gt;&lt;img class=&quot;photo&quot; title=&quot;Pingo&quot; src=&quot;http://farm3.static.flickr.com/2620/4161169924_eae0e3b268_s.jpg&quot; alt=&quot;Pingo&quot; /&gt;&lt;/a&gt;
								&lt;/div&gt;
															&lt;div class=&quot;flickr-thumb&quot;&gt;
									&lt;a href=&quot;http://flickr.com/photo.gne?id=4161176808&quot;&gt;&lt;img class=&quot;photo&quot; title=&quot;Pingo&quot; src=&quot;http://farm3.static.flickr.com/2589/4161176808_e681363c33_s.jpg&quot; alt=&quot;Pingo&quot; /&gt;&lt;/a&gt;
								&lt;/div&gt;
															&lt;div class=&quot;flickr-thumb&quot;&gt;
									&lt;a href=&quot;http://flickr.com/photo.gne?id=4282483894&quot;&gt;&lt;img class=&quot;photo&quot; title=&quot;Pingo!&quot; src=&quot;http://farm3.static.flickr.com/2774/4282483894_1edf325477_s.jpg&quot; alt=&quot;Pingo!&quot; /&gt;&lt;/a&gt;
								&lt;/div&gt;
															&lt;div class=&quot;flickr-thumb&quot;&gt;
									&lt;a href=&quot;http://flickr.com/photo.gne?id=4281748217&quot;&gt;&lt;img class=&quot;photo&quot; title=&quot;Interesante&quot; src=&quot;http://farm5.static.flickr.com/4028/4281748217_76da374a39_s.jpg&quot; alt=&quot;Interesante&quot; /&gt;&lt;/a&gt;
								&lt;/div&gt;
															&lt;div class=&quot;flickr-thumb&quot;&gt;
									&lt;a href=&quot;http://flickr.com/photo.gne?id=4282500198&quot;&gt;&lt;img class=&quot;photo&quot; title=&quot;Pingo cabezón&quot; src=&quot;http://farm5.static.flickr.com/4001/4282500198_42e9b441e5_s.jpg&quot; alt=&quot;Pingo cabezón&quot; /&gt;&lt;/a&gt;
								&lt;/div&gt;
															&lt;div class=&quot;flickr-thumb&quot;&gt;
									&lt;a href=&quot;http://flickr.com/photo.gne?id=4282507532&quot;&gt;&lt;img class=&quot;photo&quot; title=&quot;Pingo tiene sueño&quot; src=&quot;http://farm3.static.flickr.com/2682/4282507532_95cb810c01_s.jpg&quot; alt=&quot;Pingo tiene sueño&quot; /&gt;&lt;/a&gt;
								&lt;/div&gt;
															&lt;div class=&quot;flickr-thumb&quot;&gt;
									&lt;a href=&quot;http://flickr.com/photo.gne?id=4281774769&quot;&gt;&lt;img class=&quot;photo&quot; title=&quot;Mmmm&quot; src=&quot;http://farm3.static.flickr.com/2774/4281774769_ae4f8eac4c_s.jpg&quot; alt=&quot;Mmmm&quot; /&gt;&lt;/a&gt;
								&lt;/div&gt;
															&lt;div class=&quot;flickr-thumb&quot;&gt;
									&lt;a href=&quot;http://flickr.com/photo.gne?id=4281786215&quot;&gt;&lt;img class=&quot;photo&quot; title=&quot;A dormir!!!&quot; src=&quot;http://farm5.static.flickr.com/4061/4281786215_b2bed4c830_s.jpg&quot; alt=&quot;A dormir!!!&quot; /&gt;&lt;/a&gt;
								&lt;/div&gt;
															&lt;div class=&quot;flickr-thumb&quot;&gt;
									&lt;a href=&quot;http://flickr.com/photo.gne?id=4281795801&quot;&gt;&lt;img class=&quot;photo&quot; title=&quot;Pingo posando&quot; src=&quot;http://farm3.static.flickr.com/2706/4281795801_3e1d462813_s.jpg&quot; alt=&quot;Pingo posando&quot; /&gt;&lt;/a&gt;
								&lt;/div&gt;
															&lt;div class=&quot;flickr-thumb&quot;&gt;
									&lt;a href=&quot;http://flickr.com/photo.gne?id=4282549516&quot;&gt;&lt;img class=&quot;photo&quot; title=&quot;Que tienes en la mano?&quot; src=&quot;http://farm5.static.flickr.com/4005/4282549516_8eb910880d_s.jpg&quot; alt=&quot;Que tienes en la mano?&quot; /&gt;&lt;/a&gt;
								&lt;/div&gt;
															&lt;div class=&quot;flickr-thumb&quot;&gt;
									&lt;a href=&quot;http://flickr.com/photo.gne?id=4281814565&quot;&gt;&lt;img class=&quot;photo&quot; title=&quot;C-o-m-i-d-a&quot; src=&quot;http://farm3.static.flickr.com/2698/4281814565_1c1ca0e045_s.jpg&quot; alt=&quot;C-o-m-i-d-a&quot; /&gt;&lt;/a&gt;
								&lt;/div&gt;
															&lt;div class=&quot;flickr-thumb&quot;&gt;
									&lt;a href=&quot;http://flickr.com/photo.gne?id=4282568622&quot;&gt;&lt;img class=&quot;photo&quot; title=&quot;Esparta!!!&quot; src=&quot;http://farm5.static.flickr.com/4014/4282568622_a788eb8e8f_s.jpg&quot; alt=&quot;Esparta!!!&quot; /&gt;&lt;/a&gt;
								&lt;/div&gt;
												&lt;div class=&quot;fg-clear&quot;&gt;&lt;/div&gt;
				&lt;/div&gt;
													&lt;div class=&quot;fg-clear alignright&quot;&gt;Powered by &lt;a href=&quot;http://co.deme.me/projects/flickr-gallery/&quot;&gt;Flickr Gallery&lt;/a&gt;&lt;/div&gt;
								&lt;div class=&quot;fg-clear&quot;&gt;&lt;/div&gt;
							
			
&lt;div id=&quot;mainphotoarea&quot;&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 09 Dec 2009 15:29:07 +0000</pubDate>
</item>
<item>
	<title>Dani: Android no significa “garantía de éxito” (I)</title>
	<guid>http://people.warp.es/~dani/blog/?p=186</guid>
	<link>http://dani.warp.es/?p=186</link>
	<description>&lt;p&gt;Hablar de Android hoy en día ya no resulta raro para casi nadie. Hace dos años y un mes, Google desveló &lt;a href=&quot;http://www.android.com&quot;&gt;el proyecto&lt;/a&gt; en el que estaban trabajando desde hacía ya tiempo: un sistema operativo para móviles basado en GNU/Linux. &lt;a href=&quot;http://www.google.com/intl/en/press/pressrel/20071105_mobile_open.html&quot;&gt;Ya entonces&lt;/a&gt;, y antes de que apareciera ningún dispositivo móvil liberaron un &lt;a href=&quot;http://developer.android.com/intl/de/sdk/index.html&quot;&gt;juego de bibliotecas&lt;/a&gt; y una &lt;a href=&quot;http://developer.android.com/intl/de/reference/android/view/Display.html&quot;&gt;extensa documentación&lt;/a&gt; para el desarrollo de aplicaciones. Desde entonces y hasta casi un año después, &lt;a href=&quot;http://www.htc.com/www/press.aspx?id=66338&amp;#038;lang=1033&quot;&gt;cuando apareció el HTC Dream&lt;/a&gt; (el primer terminal Android), la gente ya había podido comenzar a desarrollar aplicaciones.&lt;/p&gt;
&lt;p&gt;¿Cuál fue la mayor consecuencia de una acción así? Sencillo, facilitar el desarrollo de aplicaciones significó que los primeros terminales que salieron al mercado ya podían disponer de un gran número de aplicaciones.&lt;/p&gt;
&lt;p&gt;Además del anuncio con el que comenzaba toda esta historia, se le dio la puntilla al proyecto: &amp;#8220;La mayor parte de Android será un proyecto liberado bajo la licencia Apache 2.0&amp;#8243;. Fantástico. Sencillamente, era díficil pedir más. Y comenzaron a dedicar recursos. &lt;a href=&quot;http://developer.android.com&quot;&gt;Un sitio&lt;/a&gt;, &lt;a href=&quot;http://android.git.kernel.org&quot;&gt;un repositorio&lt;/a&gt;, &lt;a href=&quot;http://source.android.com/discuss&quot;&gt;listas de correo&lt;/a&gt;, etc. &lt;/p&gt;
&lt;p&gt;En las listas de correo se pueden encontrar fácilmente las respuestas de ingenieros de Google. Uno de los que tienen más dedicación (por ser exactamente este su trabajo) es &lt;a href=&quot;http://jbq.livejournal.com/&quot;&gt;Jean Baptiste Queru&lt;/a&gt;, quien aguanta todas las preguntas que tiene la comunidad, y encima trabaja de sol a sol por que todo el mundo pueda construir la versión deseada de Android. Su trabajo es admirable. Otra de sus grandes tareas es &lt;a href=&quot;http://groups.google.com/group/repo-discuss/msg/9342e2f300ce702f&quot;&gt;mantener una sincronía&lt;/a&gt; entre los repositorios de Android; ya que existen dos repositorios: los internos, sobre los que trabaja Google, y los externos, para la comunidad. Tanto los arreglos que la comunidad envía al proyecto, como las nuevas características desarrolladas, son transferidas de un repositorio a otro por él. También existen rumores de la fusión entre ambos repositorios, aunque parece difícil que ocurra, y más cuando (por poner un ejemplo) la &lt;a href=&quot;http://groups.google.com/group/android-platform/msg/89897d6567f13986?pli=1&quot;&gt;publicación del código de Android 2.0&lt;/a&gt; se hizo solo dos semanas más tarde de &lt;a href=&quot;http://mediacenter.motorola.com/content/detail.aspx?ReleaseID=12058&amp;#038;NewsAreaID=2&quot;&gt;la presentación oficial&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aparte de todo este esfuerzo para la comunidad, Google también (es obvio) tiene sus acuerdos/contratos con los fabricantes para poder desarrollar terminales que funcionen impecablemente con este sistema operativo. &lt;/p&gt;
&lt;p&gt;Resumiendo un poco algunos de los detalles del proyecto, tenemos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un nuevo sistema operativo basado en GNU/Linux&lt;/li&gt;
&lt;li&gt;Disponibilidad de la mayor parte del código fuente con licencia Apache 2.0 (o la correspondiente, según el subproyecto)&lt;/li&gt;
&lt;li&gt;Muchos materiales disponibles para que se pueda crear un amplio abanico de aplicaciones&lt;/li&gt;
&lt;li&gt;Posibilidad de modificar el propio sistema operativo según las necesidades concretas de cada caso&lt;/li&gt;
&lt;li&gt;Recursos dedicados por la empresa para que cualquiera pueda adquirir conocimientos, modificar el código, adaptarlo, etc&lt;/li&gt;
&lt;li&gt;Trabajo directo con los fabricantes para fabricar terminales modernos, y así completar el único hueco al que &amp;#8220;todavía&amp;#8221; no se dedica Google, el hardware&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pero, si tenemos todo este material en nuestras manos, y todo parece tan perfecto, ¿por qué no es &amp;#8220;garantía de éxito&amp;#8221;?&lt;/p&gt;</description>
	<pubDate>Mon, 07 Dec 2009 10:20:38 +0000</pubDate>
</item>
<item>
	<title>Blaxter: Mostrar iconos en los botones y menús de gnome</title>
	<guid>http://bicosyes.com/?p=904</guid>
	<link>http://bicosyes.com/mostrar-iconos-en-los-botones-y-menus-de-gnome/</link>
	<description>&lt;p&gt;En la última versión de &lt;a href=&quot;http://www.gnome.org/&quot;&gt;gnome&lt;/a&gt;, han decidido poner por defecto &lt;a href=&quot;http://www.osnews.com/story/21935/GNOME_To_Drop_Icons_in_Buttons_Menus&quot;&gt;que &lt;strong&gt;no&lt;/strong&gt; salgan iconos ni en los botones, ni en los menús&lt;/a&gt;. Hasta ahora, tenías iconos en todos lados, esto implicaba que los botones eran siempre más grandes de los normal (por incluir dentro de ellos el icono pertinente) lo que hacia que en general, en gnome, las cosas fuesen como &lt;em&gt;más grandes&lt;/em&gt;. Con este cambio los layouts van a ser más compactos, aunque también más rancios y menos usuables, &lt;acronym title=&quot;en mi opinión&quot;&gt;IMHO&lt;/acronym&gt;.&lt;/p&gt;
&lt;p&gt;No me gusta nada este cambio, más vale una imagen que mil palabras, teniendo iconos vas más rápido porque los reconoces y no necesitas leer cosas, aparte que uno de los aspectos que más me gusta de gnome es esa sensación de que todo es grandote &lt;img src=&quot;http://bicosyes.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; . Al menos volver a tenerlos es tarea simple, activa &lt;em&gt;/desktop/gnome/interface/buttons_have_icons&lt;/em&gt; y &lt;em&gt;/desktop/gnome/interface/menus_have_icons&lt;/em&gt; en el editor de configuración de gnome y ya los tendrás.&lt;/p&gt;
&lt;pre&gt;$ gconftool-2 --type bool --set /desktop/gnome/interface/buttons_have_icons true
$ gconftool-2 --type bool --set /desktop/gnome/interface/menus_have_icons true&lt;/pre&gt;
&lt;img src=&quot;http://bicosyes.com/?ak_action=api_record_view&amp;id=904&amp;type=feed&quot; alt=&quot;&quot; /&gt;</description>
	<pubDate>Wed, 02 Dec 2009 20:14:24 +0000</pubDate>
</item>
<item>
	<title>Koke: How we track outbound links with Google Analytics Events API</title>
	<guid>http://www.jorgebernal.info/?p=474</guid>
	<link>http://www.jorgebernal.info/development/track-outbound-links-google-analytics-events-api</link>
	<description>&lt;p&gt;&lt;img src=&quot;http://www.jorgebernal.info/wp-content/uploads/2009/12/ebox.jpg&quot; alt=&quot;eBox Platform homepage&quot; title=&quot;eBox Platform homepage&quot; width=&quot;700&quot; height=&quot;200&quot; class=&quot;alignnone size-full wp-image-480&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Since the &lt;a href=&quot;http://www.jorgebernal.info/business/ebox/redesigning-ebox-homepage&quot;&gt;redesign of eBox platform&lt;/a&gt;, our bounce rate increased dramatically. After a short investigation, it made sense: our new website was just the homepage and news, and the rest of the content was on different domains (&lt;a href=&quot;http://trac.ebox-platform.com/&quot;&gt;trac&lt;/a&gt;, &lt;a href=&quot;http://www.ebox-technologies.com/&quot;&gt;eBox Technologies&lt;/a&gt;, &amp;#8230;).&lt;/p&gt;
&lt;p&gt;So our bounces were either real bounces, or &lt;strong&gt;people visiting our other sites&lt;/strong&gt; (which I wouldn&amp;#8217;t count as bounces).&lt;/p&gt;
&lt;p&gt;My solution: &lt;strong&gt;track outgoing links&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I searched for a solution and found &lt;a href=&quot;http://think2loud.com/use-jquery-with-google-analytics-to-track-clicks-on-outgoing-links-from-your-site/&quot;&gt;this article&lt;/a&gt;, but it wasn&amp;#8217;t exactly what I wanted.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s a good first approach, but tracking external links as pageviews makes the analytics reports more confusing. &lt;a href=&quot;http://code.google.com/apis/analytics/docs/tracking/eventTrackerGuide.html&quot;&gt;Events Tracking API&lt;/a&gt; to the rescue! This API was conceived to track actions that don&amp;#8217;t match a page view, like video plays and other application interactions.&lt;/p&gt;
&lt;p&gt;So, with events we could track our exits separately, get the information we need, and get a more accurate Bounce rate.&lt;/p&gt;
&lt;p&gt;The extra code:&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;The original article used &lt;code&gt;rel=&quot;external&quot;&lt;/code&gt; to mark the links to track. There is an easiest way: searching for absolute URLS in the &lt;code&gt;href&lt;/code&gt; attribute. Also, I&amp;#8217;m using the &lt;strong&gt;action&lt;/strong&gt; parameter to differentiate between internal (our other websites) and external (facebook, twitter,&amp;#8230;) links.&lt;/p&gt;
&lt;p&gt;What we are tracking, and will be able to see on the Analytics reports is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Exits. Could have been called &amp;#8216;outbound links&amp;#8217;, or any other variation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Action:&lt;/strong&gt; external or internal&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Label:&lt;/strong&gt; the destination URL&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Value:&lt;/strong&gt; not using it. This could be useful for other kind of events, like &lt;a href=&quot;http://code.google.com/apis/analytics/docs/tracking/eventTrackerGuide.html#Values&quot;&gt;tracking video load times&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; your bounce rate will probably drop by tracking events. For us, it reflects our visits more accurately, but that might not be your case.&lt;/p&gt;
&lt;p&gt;This is what google has to say on &lt;a href=&quot;http://code.google.com/apis/analytics/docs/tracking/eventTrackerGuide.html#implementationConsiderations&quot;&gt;bounce rate impact&lt;/a&gt;: &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
In general, a &amp;#8220;bounce&amp;#8221; is described as a single-page visit to your site. In Analytics, a bounce is calculated specifically as a session that triggers only a single GIF request, such as when a user comes to a single page on your website and then exits without causing any other request to the Analytics server for that session. However, if you implement Event Tracking for your site, you might notice a change in bounce rate metrics for those pages where Event Tracking is present. This is because Event Tracking, like page tracking is classified as an interaction request.&lt;/p&gt;
&lt;p&gt;For example, suppose you have a page with a video player where the bounce rate is historically high, and you have not implemented Event Tracking for the page. If you subsequently set up Event Tracking for the player, you might notice a decrease in the bounce rate for that page, because Analytics will record user interaction with the player and send that interaction to the server as an additional GIF request. Thus, even though the same percentage of visitors to the page might still exit without viewing any other page on your site, their interaction with the video player triggers Event Tracking calls, which disqualifies their visit as a bounce.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In this way, &amp;#8220;bounces&amp;#8221; for your event-enabled pages means something slightly different: a single-page visit that includes no user interaction on tracked events.&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 class=&quot;related_post_title&quot;&gt;Related posts&lt;/h3&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/business/ebox/redesigning-ebox-homepage&quot; title=&quot;Redesigning eBox homepage&quot;&gt;Redesigning eBox homepage&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/photography/discovr-flickr-experiment-wrong&quot; title=&quot;Discovr: a flickr experiment gone wrong&quot;&gt;Discovr: a flickr experiment gone wrong&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/business/ebox/ebox-technologies-website&quot; title=&quot;eBox Technologies new website&quot;&gt;eBox Technologies new website&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/business/ebox/local-global&quot; title=&quot;Local vs. global&quot;&gt;Local vs. global&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/business/ebox/planet-ebox-running&quot; title=&quot;Planet eBox up and running&quot;&gt;Planet eBox up and running&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description>
	<pubDate>Tue, 01 Dec 2009 18:12:30 +0000</pubDate>
</item>
<item>
	<title>Hector: Is it… me?</title>
	<guid>http://people.warp.es/~xtor/blog/?p=655</guid>
	<link>http://people.warp.es/~xtor/blog/?p=655</link>
	<description>&lt;p&gt;I have completed BBC&amp;#8217;s &lt;a href=&quot;https://www.bbc.co.uk/labuk/experiments/personality&quot;&gt;The Big Personality Test&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You just need to create an account, and after answering some questions, you will get your &lt;a href=&quot;http://en.wikipedia.org/wiki/Big_Five_personality_traits&quot;&gt;Big Five personality traits&lt;/a&gt;, with your scores for Openness, Conscientiousness, Extroversion, Agreeableness and Extroversion.&lt;/p&gt;
&lt;p&gt;These are my results:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Openness&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You scored 4.5 out of 5 for Openness&lt;/p&gt;
&lt;p&gt;You scored high on Openness.&lt;/p&gt;
&lt;p&gt;This trait is sometimes known as ‘Openness to experience’. People with scores like yours tend to be imaginative and curious about a wide range of things, from appreciating different art forms to exploring new places, cultures and foods.&lt;/p&gt;
&lt;p&gt;Generating lots of imaginative ideas probably comes very easily to you. However, it&amp;#8217;s likely that you are prone to daydreaming too.&lt;/p&gt;
&lt;p&gt;Innovators, investigators and creators often score highly on this trait. It has also been suggested that Openness is related to a person&amp;#8217;s likelihood to hold unusual beliefs. Do you enjoy the odd conspiracy &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conscientiousness&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You scored 4.2 out of 5 for Conscientiousness&lt;/p&gt;
&lt;p&gt;You scored high on Conscientiousness.&lt;/p&gt;
&lt;p&gt;Conscientiousness describes how dependable, organised and hard-working a person is likely to be. This may be the reason why, of all the personality traits, Conscientiousness is the most consistent indicator of job success. People with scores like yours tend to be extremely dependable and organised. It&amp;#8217;s likely that your life is well-planned and you approach things in a thorough manner.&lt;/p&gt;
&lt;p&gt;At work, you probably approach tasks methodically and thoroughly, with everything in its right place.&lt;/p&gt;
&lt;p&gt;Some studies have shown the more Conscientious an individual is, the more disciplined they are likely to be about exercise and diet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Extroversion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You scored 3.1 out of 5 for Extroversion&lt;/p&gt;
&lt;p&gt;You scored medium on Extroversion.&lt;/p&gt;
&lt;p&gt;Extroversion is characterised by positive emotions and the tendency to seek out pleasure-stimulating or risk-taking activities. People with scores like yours are likely to be comfortable meeting new people and will usually enjoy social occasions.&lt;/p&gt;
&lt;p&gt;You are likely to have a generally positive outlook on life and may display a greater gift for leadership compared to those with low scores on this trait.&lt;/p&gt;
&lt;p&gt;People with high Extroversion are more likely to lead risky lifestyles and take greater risks in pursuit of rewards. Health studies have shown they are more likely to smoke and less likely to get enough sleep than people who score less highly on this trait.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agreeableness&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You scored 4 out of 5 for Agreeableness&lt;/p&gt;
&lt;p&gt;You scored high on Agreeableness.&lt;/p&gt;
&lt;p&gt;Agreeableness measures how sympathetic and considerate a person is likely to be. People with scores like yours are likely to find it very easy to get along with other people. You probably find that you are sensitive to the feelings of others and that people find it easy to warm to you.&lt;/p&gt;
&lt;p&gt;As a &amp;#8216;people person&amp;#8217; you will probably be very comfortable in situations that require teamwork.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Neuroticism&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You scored 3.9 out of 5 for Neuroticism&lt;/p&gt;
&lt;p&gt;You scored high on Neuroticism.&lt;/p&gt;
&lt;p&gt;In the context of the Big Five personality traits, the term &amp;#8216;Neuroticism&amp;#8217; relates to a person’s response to threatening or stressful situations. People with scores like yours may find that they often feel tense or anxious, and may well experience changeable moods.&lt;/p&gt;
&lt;p&gt;Some scientists have suggested that Neuroticism was beneficial in evolutionary terms. Early man may have found it advantageous to live in a population where certain individuals had a high sensitivity to threats to the group&amp;#8217;s survival.&lt;/p&gt;
&lt;p&gt;There is evidence to suggest that Neuroticism, when combined with high scores in personality traits such as Conscientiousness, can result in a powerful work ethic and a will to succeed.&lt;/p&gt;</description>
	<pubDate>Sun, 29 Nov 2009 20:35:43 +0000</pubDate>
</item>
<item>
	<title>Blaxter: Mostrar notificaciones emergentes desde la consola</title>
	<guid>http://bicosyes.com/?p=894</guid>
	<link>http://bicosyes.com/mostrar-notificaciones-emergentes-desde-la-consola/</link>
	<description>&lt;p&gt;A veces es útil mostrar algún tipo de notificación gráfica para informarte, por ejemplo, de cuándo se ha terminado una tarea. &lt;a href=&quot;https://wiki.ubuntu.com/NotifyOSD&quot;&gt;Las notificaciones emergentes de Ubuntu&lt;/a&gt;, añadidas hace un par de versiones, son una muy buena opción.&lt;/p&gt;
&lt;p&gt;Dos opciones, (1) instalarnos esta librería de perl &lt;em&gt;libnet-dbus-perl&lt;/em&gt;, y nos ponemos esta función en nuestro &lt;em&gt;~/.bashrc&lt;/em&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;span&gt;function&lt;/span&gt; notify&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;perl&lt;/span&gt; -e &lt;span&gt;&quot;use Net::DBus; my &lt;span&gt;\$&lt;/span&gt;sessionBus = Net::DBus-&amp;gt;session; my &lt;span&gt;\$&lt;/span&gt;notificat
ionsService = &lt;span&gt;\$&lt;/span&gt;sessionBus-&amp;gt;get_service('org.freedesktop.Notifications'); my &lt;span&gt;\$&lt;/span&gt;n
otificationsObject = &lt;span&gt;\$&lt;/span&gt;notificationsService-&amp;gt;get_object('/org/freedesktop/Notifi
cations', 'org.freedesktop.Notifications'); my &lt;span&gt;\$&lt;/span&gt;notificationId; &lt;span&gt;\$&lt;/span&gt;notificationI
d = &lt;span&gt;\$&lt;/span&gt;notificationsObject-&amp;gt;Notify(shift, 0, '', '$1', '$2', [], {}, -1);&quot;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;$ notify foooooooo baaarrr&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;http://bicosyes.com/wp-content/uploads/2009/11/notify.png&quot;&gt;&lt;img src=&quot;http://bicosyes.com/wp-content/uploads/2009/11/notify.png&quot; alt=&quot;notify&quot; title=&quot;notify&quot; width=&quot;357&quot; height=&quot;204&quot; class=&quot;aligncenter size-full wp-image-895&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;El primer parámetro es el título y el segundo el contenido. &lt;/p&gt;
&lt;p&gt;Otra forma (2) todavía más fácil es instalarnos el paquete &lt;em&gt;libnotify-bin&lt;/em&gt;, el cual contiene el binario &lt;em&gt;notify-send&lt;/em&gt; que hace justamente esto. Probablemente la primera solución nos servirá para cualquier distro, mientras que la segunda solo en debian, ubuntu y derivados. Ambas funcionan exactamente igual y sin problemas.&lt;/p&gt;
&lt;img src=&quot;http://bicosyes.com/?ak_action=api_record_view&amp;id=894&amp;type=feed&quot; alt=&quot;&quot; /&gt;</description>
	<pubDate>Sun, 29 Nov 2009 14:20:21 +0000</pubDate>
</item>
<item>
	<title>Koke: Redesigning eBox homepage</title>
	<guid>http://www.jorgebernal.info/?p=463</guid>
	<link>http://www.jorgebernal.info/business/ebox/redesigning-ebox-homepage</link>
	<description>&lt;div id=&quot;__ss_2597686&quot;&gt;&lt;embed src=&quot;http://static.slidesharecdn.com/swf/ssplayerd.swf?doc=progression-091127105020-phpapp02&amp;#038;rel=0&amp;#038;stripped_title=redesign-ebox-platform-homepage-2597686&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;477&quot; height=&quot;510&quot;&gt;&lt;/embed&gt;
&lt;div&gt;&lt;a href=&quot;http://www.slideshare.net/koke/redesign-ebox-platform-homepage-2597686&quot; title=&quot;Redesign eBox Platform homepage&quot;&gt;Redesign eBox Platform homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;View more &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;documents&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/koke&quot;&gt;Jorge Bernal&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It&amp;#8217;s been 3 weeks since we &lt;a href=&quot;http://twitter.com/eboxplatform/status/5475628078&quot;&gt;launched&lt;/a&gt; the new &lt;a href=&quot;http://www.ebox-platform.com&quot;&gt;eBox Platform&lt;/a&gt; homepage, and I wanted to share the different steps through the redesign.&lt;/p&gt;
&lt;p&gt;Do you like the new design?&lt;/p&gt;
&lt;p&gt;Do you like any of the previous steps better?&lt;/p&gt;
&lt;p&gt;Do you have any suggestions?&lt;/p&gt;
&lt;h3 class=&quot;related_post_title&quot;&gt;Related posts&lt;/h3&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/development/track-outbound-links-google-analytics-events-api&quot; title=&quot;How we track outbound links with Google Analytics Events API&quot;&gt;How we track outbound links with Google Analytics Events API&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/business/ebox/ebox-technologies-website&quot; title=&quot;eBox Technologies new website&quot;&gt;eBox Technologies new website&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/business/ebox/local-global&quot; title=&quot;Local vs. global&quot;&gt;Local vs. global&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/business/ebox/planet-ebox-running&quot; title=&quot;Planet eBox up and running&quot;&gt;Planet eBox up and running&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/business/innovate-09&quot; title=&quot;Innovate 09 is over&quot;&gt;Innovate 09 is over&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description>
	<pubDate>Fri, 27 Nov 2009 16:57:58 +0000</pubDate>
</item>
<item>
	<title>Blaxter: How to know, in ruby, which methods have been added and by whom?</title>
	<guid>http://bicosyes.com/?p=885</guid>
	<link>http://bicosyes.com/how-to-know-in-ruby-which-methods-have-been-added-and-by-whom/</link>
	<description>&lt;p&gt;If you are not very careful, monkeypatching could be very harmful. One thing to remember is that you should &lt;strong&gt;never&lt;/strong&gt; override a method to &lt;strong&gt;add&lt;/strong&gt; funcionality, for those kind of thinks you must use &lt;em&gt;alias chain method pattern&lt;/em&gt;, a safer way of doing that. &lt;/p&gt;
&lt;p&gt;For the rest of the &lt;em&gt;monkeypatching&lt;/em&gt;, i.e. add new methods, you could debug them really easy with something like this:&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;span&gt;class&lt;/span&gt; &lt;span&gt;Class&lt;/span&gt;
   &lt;span&gt;def&lt;/span&gt; method_added&lt;span&gt;&amp;#40;&lt;/span&gt;method_name&lt;span&gt;&amp;#41;&lt;/span&gt;
      &lt;span&gt;puts&lt;/span&gt; &lt;span&gt;&quot;#{method_name} added to #{self}, callstack:&quot;&lt;/span&gt;
      &lt;span&gt;puts&lt;/span&gt; &lt;span&gt;caller&lt;/span&gt;.&lt;span&gt;map&lt;/span&gt;&lt;span&gt;&amp;#123;&lt;/span&gt;|line| &lt;span&gt;&quot;&lt;span&gt;\t&lt;/span&gt;#{line}&quot;&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;.&lt;span&gt;join&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&quot;&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
   &lt;span&gt;end&lt;/span&gt;
&lt;span&gt;end&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;You can always add more code to filter by class or by method's name. Let's see an example:&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;$ more example.&lt;span&gt;rb&lt;/span&gt;
&lt;span&gt;require&lt;/span&gt; &lt;span&gt;'date'&lt;/span&gt;
&lt;span&gt;require&lt;/span&gt; &lt;span&gt;'time'&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;class&lt;/span&gt; &lt;span&gt;Class&lt;/span&gt;
   &lt;span&gt;def&lt;/span&gt; method_added&lt;span&gt;&amp;#40;&lt;/span&gt;method_name&lt;span&gt;&amp;#41;&lt;/span&gt;
      &lt;span&gt;return&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; %w&lt;span&gt;&amp;#40;&lt;/span&gt;method_added&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;include&lt;/span&gt;? method_name.&lt;span&gt;to_s&lt;/span&gt;
      &lt;span&gt;puts&lt;/span&gt; &lt;span&gt;&quot;#{method_name} added to #{self}, callstack:&quot;&lt;/span&gt;
      &lt;span&gt;puts&lt;/span&gt; &lt;span&gt;caller&lt;/span&gt;.&lt;span&gt;map&lt;/span&gt;&lt;span&gt;&amp;#123;&lt;/span&gt;|line| &lt;span&gt;&quot;&lt;span&gt;\t&lt;/span&gt;#{line}&quot;&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;.&lt;span&gt;join&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&quot;&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
   &lt;span&gt;end&lt;/span&gt;
&lt;span&gt;end&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;class&lt;/span&gt; &lt;span&gt;Time&lt;/span&gt;
   &lt;span&gt;def&lt;/span&gt; to_date
      &lt;span&gt;Date&lt;/span&gt;.&lt;span&gt;ordinal&lt;/span&gt; &lt;span&gt;self&lt;/span&gt;.&lt;span&gt;year&lt;/span&gt;, &lt;span&gt;self&lt;/span&gt;.&lt;span&gt;yday&lt;/span&gt;
   &lt;span&gt;end&lt;/span&gt;
&lt;span&gt;end&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;class&lt;/span&gt; &lt;span&gt;Date&lt;/span&gt;
   &lt;span&gt;def&lt;/span&gt; to_time
      &lt;span&gt;Time&lt;/span&gt;.&lt;span&gt;parse&lt;/span&gt; &lt;span&gt;self&lt;/span&gt;.&lt;span&gt;to_s&lt;/span&gt;
   &lt;span&gt;end&lt;/span&gt;
&lt;span&gt;end&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;raise&lt;/span&gt; &lt;span&gt;&quot;to_date not working&quot;&lt;/span&gt; &lt;span&gt;unless&lt;/span&gt;
   &lt;span&gt;Time&lt;/span&gt;.&lt;span&gt;now&lt;/span&gt;.&lt;span&gt;to_date&lt;/span&gt; == &lt;span&gt;Date&lt;/span&gt;.&lt;span&gt;today&lt;/span&gt;
&lt;span&gt;raise&lt;/span&gt; &lt;span&gt;&quot;to time not working&quot;&lt;/span&gt; &lt;span&gt;unless&lt;/span&gt;
   &lt;span&gt;Time&lt;/span&gt;.&lt;span&gt;now&lt;/span&gt;.&lt;span&gt;to_date&lt;/span&gt;.&lt;span&gt;to_time&lt;/span&gt; == &lt;span&gt;Date&lt;/span&gt;.&lt;span&gt;today&lt;/span&gt;.&lt;span&gt;to_time&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;The output will be:&lt;/p&gt;
&lt;pre&gt;$ ruby example.rb
to_date added to Time, callstack:
	example.rb:13
to_time added to Date, callstack:
	example.rb:19&lt;/pre&gt;
&lt;p&gt;Nice, isn't it?. Remember to be carefull with your monkeypatching, with great power comes great responsibility, it's just a tool, neither magic nor the panacea.&lt;/p&gt;
&lt;img src=&quot;http://bicosyes.com/?ak_action=api_record_view&amp;id=885&amp;type=feed&quot; alt=&quot;&quot; /&gt;</description>
	<pubDate>Mon, 23 Nov 2009 19:50:37 +0000</pubDate>
</item>
<item>
	<title>Blaxter: Comandos Windows para linuxeros: kill -9, ps, route, servicios</title>
	<guid>http://bicosyes.com/?p=862</guid>
	<link>http://bicosyes.com/comandos-windows-para-linuxeros-kill-9-ps-route-servicios/</link>
	<description>&lt;p&gt;Si por cuestiones del destino tienes la mala suerte de tener que lidiar con este sistema operativo, he aquí unas pequeñas ayudas para típicas tareas a realizar, traduciendo desde comandos *nix.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Matar un proceso
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Linux&lt;/em&gt;: &lt;tt&gt;kill -9 PID&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Windows&lt;/em&gt;: &lt;tt&gt;taskkill /f /pid PID&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mirar procesos y filtrarlos
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Linux&lt;/em&gt;: &lt;tt&gt;ps aux | grep PID&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Windows&lt;/em&gt;: &lt;tt&gt;tasklist /fi &quot;PID eq $PID&quot; | filter $PID&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Establecer la ruta por defecto
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Linux&lt;/em&gt;: &lt;tt&gt;route add default gw IP&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Windows&lt;/em&gt;: &lt;tt&gt;route change 0.0.0.0 mask 0.0.0.0 IP&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Iniciar/parar servicios
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Linux&lt;/em&gt;: &lt;tt&gt;/etc/init.d/foobar start|stop&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Windows&lt;/em&gt;: &lt;tt&gt;net start|stop foobar&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Espero que nunca tengas que usarlos, por el bien de tu salud mental. Si llega a ser el caso, y no hay forma de salir del atolladero sin matar gente, te recomiendo usar &lt;a href=&quot;http://www.mingw.org/wiki/msys&quot;&gt;alguna que&lt;/a&gt; &lt;a href=&quot;http://gnuwin32.sourceforge.net/packages.html&quot;&gt;otra ayuda&lt;/a&gt; en este hostil, adverso y aciago entorno.&lt;/p&gt;
&lt;img src=&quot;http://bicosyes.com/?ak_action=api_record_view&amp;id=862&amp;type=feed&quot; alt=&quot;&quot; /&gt;</description>
	<pubDate>Sat, 21 Nov 2009 15:24:36 +0000</pubDate>
</item>
<item>
	<title>Blaxter: Hola qué tal</title>
	<guid>http://bicosyes.com/?p=874</guid>
	<link>http://bicosyes.com/hola-que-tal/</link>
	<description>&lt;p&gt;Cuando no apetece escribir, simplemente no apetece escribir, qué le vamos a hacer. Después de mucho tiempo creo que toca ya volver a dar mal por estos lares. Van ya cerca de 5 años con el blog, y aunque últimamente las &lt;strong&gt;redes sociales&lt;/strong&gt; y el &lt;strong&gt;microblogging&lt;/strong&gt; han quitado muchos usuarios a los blogs (posiblemente todos aquellos que creaban un blog y a los cuatro post lo dejaban abandonado), a &lt;em&gt;la blogosfera&lt;/em&gt; la veo mejor que nunca.&lt;/p&gt;
&lt;p&gt;De nuevo, como otras muchas veces, tengo el dilema sobre qué &lt;strong&gt;idioma&lt;/strong&gt; elegir, español o inglés. Mientras que con el primero puedo conseguir, a veces, no cometer faltas ortográficas y crear frases coherentes y comprensibles por otros seres humanos, el segundo, por suerte o desgracia, es el idioma neutral y empleado principalmente en esto del &lt;em&gt;interné&lt;/em&gt;, nuevas tecnologías y especialmente en el desarrollo de software. Posiblemente iré decidiéndolo post a post, intercalando, para dar emoción al asunto.&lt;/p&gt;
&lt;p&gt;Y tú, ¿has dejado de escribir en tu blog? Él no lo haría.&lt;/p&gt;
&lt;img src=&quot;http://bicosyes.com/?ak_action=api_record_view&amp;id=874&amp;type=feed&quot; alt=&quot;&quot; /&gt;</description>
	<pubDate>Sat, 21 Nov 2009 13:14:27 +0000</pubDate>
</item>
<item>
	<title>Koke: Fixing Snow Leopard ruby readline</title>
	<guid>http://www.jorgebernal.info/?p=453</guid>
	<link>http://www.jorgebernal.info/development/fixing-snow-leopard-ruby-readline</link>
	<description>&lt;p&gt;&lt;img src=&quot;http://www.jorgebernal.info/wp-content/uploads/2009/11/Default.png&quot; alt=&quot;Building ruby readline&quot; title=&quot;Building ruby readline&quot; width=&quot;700&quot; height=&quot;200&quot; class=&quot;alignnone size-full wp-image-458&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Since I upgraded to Snow Leopard I&amp;#8217;ve been missing readline whe using irb. As I discovered in &lt;a href=&quot;http://henrik.nyh.se/2008/03/irb-readline&quot;&gt;this article&lt;/a&gt;, this is due to apple&amp;#8217;s ruby linking to libedit instead of libreadline. I didn&amp;#8217;t have that problem before the upgrade since I had compiled ruby myself.&lt;/p&gt;
&lt;p&gt;This time, I was looking for another solution. I could have compiled ruby with readline support, but then probably I&amp;#8217;d had to reinstall some gems too. So I present you the quick way to fix your readline&lt;/p&gt;
&lt;h3&gt;Step 0: Setup temp dir&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;mkdir -p /tmp/rlruby&lt;br /&gt;
cd /tmp/rlruby&lt;br /&gt;
sudo -s&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Step 1: Install readline&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;curl -O ftp://ftp.cwru.edu/pub/bash/readline-6.0.tar.gz&lt;br /&gt;
tar xvf readline-6.0.tar.gz&lt;br /&gt;
cd readline-6.0&lt;br /&gt;
./configure &amp;#038;&amp;#038; make &amp;#038;&amp;#038; make install&lt;br /&gt;
cd ..&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Step 2: Get ruby source&lt;/h3&gt;
&lt;p&gt;To keep the complications to a minimum, I downloaded ruby from apple (check &lt;a href=&quot;http://www.opensource.apple.com/release/mac-os-x-1062/&quot;&gt;10.6.2 open source&lt;/a&gt;, or &lt;a href=&quot;http://www.opensource.apple.com/&quot;&gt;other releases&lt;/a&gt;). The current patchlevel is ruby-75 so fetch that one:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;curl -O http://www.opensource.apple.com/tarballs/ruby/ruby-75.tar.gz&lt;br /&gt;
tar xvf ruby-75.tar.gz&lt;br /&gt;
cd ruby-75&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Step 4: Build readline extension&lt;/h3&gt;
&lt;p&gt;We don&amp;#8217;t need to build all ruby, just the readline extension&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cd ruby/ext/readline/&lt;br /&gt;
ruby extconf.rb&lt;br /&gt;
make&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;At this point, you&amp;#8217;ll probably get the following error:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;readline.c: In function ‘username_completion_proc_call’:&lt;br /&gt;
readline.c:730: error: ‘username_completion_function’ undeclared (first use in this function)&lt;br /&gt;
readline.c:730: error: (Each undeclared identifier is reported only once&lt;br /&gt;
readline.c:730: error: for each function it appears in.)&lt;br /&gt;
readline.c: In function ‘username_completion_proc_call’:&lt;br /&gt;
readline.c:730: error: ‘username_completion_function’ undeclared (first use in this function)&lt;br /&gt;
readline.c:730: error: (Each undeclared identifier is reported only once&lt;br /&gt;
readline.c:730: error: for each function it appears in.)&lt;br /&gt;
lipo: can't open input file: /var/folders/s4/s4qO7oueE3ijABAH7qB6Dk+++TI/-Tmp-//ccW5lOLL.out (No such file or directory)&lt;br /&gt;
make: *** [readline.o] Error 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;We need to tell gcc that our readline is in /usr/local&lt;/p&gt;
&lt;p&gt;&lt;code&gt;make readline.o CFLAGS='-I/usr/local/include -DHAVE_RL_USERNAME_COMPLETION_FUNCTION'&lt;br /&gt;
cc -arch i386 -arch x86_64 -pipe -bundle -undefined dynamic_lookup -o readline.bundle readline.o -L/usr/local/lib -L/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib -L. -arch i386 -arch x86_64     -lruby -lreadline -lncurses  -lpthread -ldl&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;To be sure we are using the real readline run otool and make sure libedit doesn&amp;#8217;t appear on the results:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$ otool -L readline.bundle&lt;br /&gt;
readline.bundle:&lt;br /&gt;
        /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/libruby.1.dylib (compatibility version 1.8.0, current version 1.8.7)&lt;br /&gt;
        /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)&lt;br /&gt;
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.0)&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Step 5: Replace readline.bundle&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;cd /System/Library/Frameworks/Ruby.framework/Versions/Current/usr/lib/ruby/1.8/universal-darwin10.0/&lt;br /&gt;
mv readline.bundle readline.bundle.libedit&lt;br /&gt;
cp /tmp/rlruby/ruby-75/ruby/ext/readline/readline.bundle readline.bundle&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now launch irb and check if all your favorite shortcuts are in place&lt;/p&gt;
&lt;h3 class=&quot;related_post_title&quot;&gt;Most Commented Posts&lt;/h3&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/innovation/ibuy&quot; title=&quot;Shop in Amazon from your iPhone with iBuy&quot;&gt;Shop in Amazon from your iPhone with iBuy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/dev-random/fake-ad-i-presume&quot; title=&quot;Fake ad, I presume&quot;&gt;Fake ad, I presume&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/innovation/amazing-new-image-resizing-technology&quot; title=&quot;Amazing new image resizing technology&quot;&gt;Amazing new image resizing technology&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/wtf/whats-wrong-with-colors-in-firefox&quot; title=&quot;What&amp;#8217;s wrong with colors in Firefox?&quot;&gt;What&amp;#8217;s wrong with colors in Firefox?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/opensource/is-ubuntu-the-new-linux&quot; title=&quot;Is Ubuntu the new Linux?&quot;&gt;Is Ubuntu the new Linux?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description>
	<pubDate>Wed, 18 Nov 2009 15:36:51 +0000</pubDate>
</item>
<item>
	<title>Koke: Sick of getting your wordpress hacked? (contest below)</title>
	<guid>http://www.jorgebernal.info/?p=431</guid>
	<link>http://www.jorgebernal.info/opensource/sick-wordpress-hacked-contest</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/4065346502/&quot;&gt;&lt;img src=&quot;http://www.jorgebernal.info/wp-content/uploads/2009/11/DSC_8408.jpg&quot; alt=&quot;Crashed again&quot; title=&quot;Crashed again&quot; width=&quot;700&quot; height=&quot;200&quot; class=&quot;alignnone size-full wp-image-446&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I sure am. After a proper installation/configuration, the most important factor is to &lt;strong&gt;always stay updated&lt;/strong&gt; to the last version. I&amp;#8217;m managing at this time 8 or more blogs/websites running different versions of &lt;a href=&quot;http://wordpress.org/&quot;&gt;WordPress&lt;/a&gt; and it&amp;#8217;s hard to keep them up to date. &lt;/p&gt;
&lt;p&gt;Automatic upgrades help, although they still terrify me after the &lt;a href=&quot;http://www.jorgebernal.info/technology/open-source-technology/upgrade-wordpress-28&quot;&gt;2.8 crash&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The problem is, some of these blogs are set up for friends or old projects, and I forgot to frequently check if they are using the latest version. Most of the times, they become crammed with spam, and eventually trigger google&amp;#8217;s malware detectors. Most of the times I notice the hack because of firefox &lt;a href=&quot;http://www.mozilla.com/firefox/its-an-attack.html&quot;&gt;malware warning&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;So I started a side project to help me keep track of all those blogs and their versions, and it&amp;#8217;s seems is close to see the light. This is how it looks right now:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.jorgebernal.info/wp-content/uploads/2009/11/wp2date.jpg&quot; alt=&quot;beta screenshot&quot; width=&quot;700&quot; height=&quot;264&quot; class=&quot;size-full wp-image-435&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I will need testing, so if you want to &lt;strong&gt;participate in the beta&lt;/strong&gt;, fill the &lt;a href=&quot;http://eepurl.com/eSAj&quot;&gt;signup form&lt;/a&gt;, and I&amp;#8217;ll send some invitations.&lt;/p&gt;
&lt;p&gt;Also, I&amp;#8217;m looking for a nice name for &lt;em&gt;the thing&lt;/em&gt;. If you have a good idea, put it in the &amp;#8216;Proposed name&amp;#8217; field on the &lt;a href=&quot;http://eepurl.com/eSAj&quot;&gt;signup form&lt;/a&gt;. The winner(*) will get the &lt;strong&gt;first beta invitation and free full access&lt;/strong&gt; to the product for 1 year after it launches. Make sure a .com &lt;a href=&quot;https://domize.com/&quot;&gt;domain is available&lt;/a&gt; for the name you propose or it won&amp;#8217;t have many chances.&lt;/p&gt;
&lt;p&gt;(*) There will be only 1 winner: the first person to propose the chosen product name. Simple rules, but&amp;#8230; &lt;a href=&quot;http://www.imdb.com/title/tt0994491/quotes#qt0246522&quot;&gt;without rules we are nothing but savages&lt;/a&gt;.&lt;/p&gt;
&lt;h3 class=&quot;related_post_title&quot;&gt;Related posts&lt;/h3&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/business/lock-screen-osx-saving-energy&quot; title=&quot;Lock screen in OSX while saving energy&quot;&gt;Lock screen in OSX while saving energy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/opensource/upgrade-wordpress-28&quot; title=&quot;Don&amp;#8217;t upgrade to wordpress 2.8&quot;&gt;Don&amp;#8217;t upgrade to wordpress 2.8&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/wtf/pay-attention-blog&quot; title=&quot;You don&amp;#8217;t pay much attention to your blog when&amp;#8230;&quot;&gt;You don&amp;#8217;t pay much attention to your blog when&amp;#8230;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/opensource/introducing-wordpress-scripts-01&quot; title=&quot;Introducing wordpress-scripts 0.1 (0.2 out)&quot;&gt;Introducing wordpress-scripts 0.1 (0.2 out)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/business/does-your-company-have-happiness-engineers&quot; title=&quot;Does your company have Happiness Engineers?&quot;&gt;Does your company have Happiness Engineers?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description>
	<pubDate>Tue, 10 Nov 2009 02:35:11 +0000</pubDate>
</item>
<item>
	<title>Koke: Discovr: a flickr experiment gone wrong</title>
	<guid>http://www.jorgebernal.info/?p=414</guid>
	<link>http://www.jorgebernal.info/photography/discovr-flickr-experiment-wrong</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/koke/4086924614/&quot;&gt;&lt;img class=&quot;alignnone&quot; title=&quot;discovr screenshot&quot; src=&quot;http://farm3.static.flickr.com/2572/4086924614_f258e658df.jpg&quot; alt=&quot;&quot; width=&quot;500&quot; height=&quot;331&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I need help with this. I had a dream&amp;#8230; Well, not so much as a dream, maybe a &amp;#8220;It&amp;#8217;d be cool to&amp;#8230;&amp;#8221;&lt;/p&gt;
&lt;p&gt;I thought it&amp;#8217;d be nice to discover new photos on flickr using your favorite photos and the people who also favorited those photos, and the &lt;strong&gt;favorite photos of those who also favorited my pictures&lt;/strong&gt;. Still with me?&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s actually a quite simple code (about 500 lines, check it on github: &lt;a href=&quot;http://github.com/koke/discovr/&quot;&gt;discovr&lt;/a&gt;), but it&amp;#8217;s terribly slow. Some possible reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Way too much data. I&amp;#8217;ve found people with &lt;del&gt;around&lt;/del&gt; &lt;a href=&quot;http://www.flickr.com/photos/astrokid/favorites/&quot;&gt;more than 18000 favorites&lt;/a&gt;, and there are photos with &lt;a href=&quot;http://www.flickr.com/photos/jonlucas/1290276/&quot;&gt;more than 2k fans&lt;/a&gt;. After limiting to 50 last favorites, the numbers are still creepy. Following from my &lt;a href=&quot;http://www.flickr.com/photos/koke/favorites/&quot;&gt;personal favorites&lt;/a&gt; (366), I discovered 1268 users and 52632 photos&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Too complicated for an API&lt;/strong&gt;. This is the kind of feature that wouldn&amp;#8217;t be so hard to implement if you have access to the flickr database directly, but having to do so many requests adds a lot of time to the process.&lt;/li&gt;
&lt;li&gt;Inefficient library. I had to do some modifications to the flickr ruby library just to make it work, but it&amp;#8217;s still quite inefficient in some cases. Want to know the url of a picture (knowing the picture id)? 4 (completely unnecessary) API calls&lt;/li&gt;
&lt;li&gt;My code is bad. OK, I know it&amp;#8217;s ugly to start blaming everyone else. I know my code is not very good, as it&amp;#8217;s a quick prototype. Still, I&amp;#8217;m not sure if making my code/libraries better would be enough improvement given the network/api bottleneck&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The simplified algorithm goes like this.&lt;/p&gt;

&lt;div class=&quot;wp_codebox_msgheader&quot;&gt;&lt;span class=&quot;right&quot;&gt;&lt;sup&gt;&lt;a href=&quot;http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples&quot; target=&quot;_blank&quot; title=&quot;WP-CodeBox HowTo?&quot;&gt;&lt;span&gt;?&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;left&quot;&gt;&lt;a href=&quot;javascript:;&quot;&gt;View Code&lt;/a&gt; RUBY&lt;/span&gt;&lt;div class=&quot;codebox_clear&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p4142&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p414code2&quot;&gt;&lt;pre class=&quot;ruby&quot;&gt;  &lt;span&gt;# method from class User&lt;/span&gt;
  &lt;span&gt;def&lt;/span&gt; similar_pictures
    similar = &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    favorites.&lt;span&gt;each&lt;/span&gt; &lt;span&gt;do&lt;/span&gt; &lt;span&gt;|&lt;/span&gt;favorite&lt;span&gt;|&lt;/span&gt;
      favorite.&lt;span&gt;favorited_by&lt;/span&gt;.&lt;span&gt;each&lt;/span&gt; &lt;span&gt;do&lt;/span&gt; &lt;span&gt;|&lt;/span&gt;user&lt;span&gt;|&lt;/span&gt;
        user.&lt;span&gt;favorites&lt;/span&gt;.&lt;span&gt;each&lt;/span&gt; &lt;span&gt;do&lt;/span&gt; &lt;span&gt;|&lt;/span&gt;v&lt;span&gt;|&lt;/span&gt;
          similar&lt;span&gt;&amp;#91;&lt;/span&gt;k&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;||&lt;/span&gt;= &lt;span&gt;&amp;#123;&lt;/span&gt;:weight &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;, &lt;span&gt;:picture&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; v&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;:picture&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;
          similar&lt;span&gt;&amp;#91;&lt;/span&gt;k&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;:weight&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;+&lt;/span&gt;= &lt;span&gt;1&lt;/span&gt;
        &lt;span&gt;end&lt;/span&gt;
      &lt;span&gt;end&lt;/span&gt;
    &lt;span&gt;end&lt;/span&gt;
&amp;nbsp;
    similar.&lt;span&gt;values&lt;/span&gt;.&lt;span&gt;sort&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;a,b&lt;span&gt;|&lt;/span&gt; b&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;:weight&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;&amp;lt;=&amp;gt;&lt;/span&gt; a&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;:weight&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;.&lt;span&gt;select&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;v&lt;span&gt;|&lt;/span&gt; v&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;:weight&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;1&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;
  &lt;span&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So I&amp;#8217;ve created a github repository and uploaded the code: &lt;a href=&quot;http://github.com/koke/discovr/&quot;&gt;discovr at github&lt;/a&gt;. Feel free to clone, test and improve&lt;/p&gt;
&lt;h3 class=&quot;related_post_title&quot;&gt;Related posts&lt;/h3&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/development/track-outbound-links-google-analytics-events-api&quot; title=&quot;How we track outbound links with Google Analytics Events API&quot;&gt;How we track outbound links with Google Analytics Events API&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/opensource/mysql-conference-2009-i-need-an-idea&quot; title=&quot;MySQL Conference 2009, I need an idea&quot;&gt;MySQL Conference 2009, I need an idea&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/opensource/flickr-commentr&quot; title=&quot;Flickr commentr&quot;&gt;Flickr commentr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/opensource/introducing-wordpress-scripts-01&quot; title=&quot;Introducing wordpress-scripts 0.1 (0.2 out)&quot;&gt;Introducing wordpress-scripts 0.1 (0.2 out)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.jorgebernal.info/technology/function-of-the-day-rgrep&quot; title=&quot;Function of the day: rgrep&quot;&gt;Function of the day: rgrep&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description>
	<pubDate>Sun, 08 Nov 2009 19:41:51 +0000</pubDate>
</item>
<item>
	<title>Golo: Cómo me quedé sin teléfono (VIII)</title>
	<guid>http://www.capitangolo.net/Blog/?p=340</guid>
	<link>http://www.capitangolo.net/Blog/?p=340</link>
	<description>&lt;p&gt;
Este verano estuve un par de semanas sin teléfono, por culpa de una portabilidad. Partes &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=280&quot;&gt;I&lt;/a&gt;, &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=284&quot;&gt;II&lt;/a&gt;, &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=288&quot;&gt;III&lt;/a&gt;, &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=328&quot;&gt;IV&lt;/a&gt;, &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=332&quot;&gt;V&lt;/a&gt;, &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=334&quot;&gt;VI&lt;/a&gt;, y &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=335&quot;&gt;VII&lt;/a&gt;
&lt;/p&gt;
&lt;h3&gt;Mi Terminal&lt;/h3&gt;
&lt;p&gt;
Por un &lt;strong&gt;fallo del distribuidor&lt;/strong&gt; en mi última portabilidad, tengo un &lt;strong&gt;compromiso de permanencia&lt;/strong&gt;. Esta experiencia me ha servido para darme cuenta del &lt;strong&gt;chollo&lt;/strong&gt; que suponen los distribuidores para la operadora.
&lt;/p&gt;
&lt;p&gt;
Si el distribuidor comete un fallo, la operadora alega que yo no he firmado el contrato con ellos, y el distribuidor alega que el operador no le ayuda con el problema. En definitiva, entre unos y otros el &lt;strong&gt;cliente se come los mocos&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
Justo después de que este distribuidor intente darme largas, paso por el distribuidor de un amigo, donde sí tienen &lt;strong&gt;el terminal que yo quería&lt;/strong&gt; con mi primera portabilidad.
&lt;/p&gt;
&lt;p&gt;
Con el calentón no me lo pienso Así que inicio la portabilidad, y sin problemas, en una semana&amp;#8230; &lt;strong&gt;¡¡¡Lo tengo!!! ¡¡¡eoeooeoeoeeo!!!&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Y todavía no me lo acabo de creer &lt;img src=&quot;http://www.capitangolo.net/Blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; .
&lt;/p&gt;
&lt;p&gt;
Eso sí, me costará entrar en la &lt;strong&gt;lista de morosos&lt;/strong&gt; por no pagar un compromiso de permanencia que &lt;strong&gt;no tengo que pagar&lt;/strong&gt;. Y reclamaciones, juicios y lo que haga falta para volver a salir&amp;#8230; pero&amp;#8230; &lt;strong&gt;¡¡¡Lo tengo!!!&lt;/strong&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 04 Nov 2009 15:00:07 +0000</pubDate>
</item>
<item>
	<title>Golo: Cómo me quedé sin teléfono (VII)</title>
	<guid>http://www.capitangolo.net/Blog/?p=335</guid>
	<link>http://www.capitangolo.net/Blog/?p=335</link>
	<description>&lt;p&gt;
Este verano estuve un par de semanas sin teléfono, por culpa de una portabilidad. Partes &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=280&quot;&gt;I&lt;/a&gt;, &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=284&quot;&gt;II&lt;/a&gt;, &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=288&quot;&gt;III&lt;/a&gt;, &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=328&quot;&gt;IV&lt;/a&gt;, &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=332&quot;&gt;V&lt;/a&gt;, y &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=334&quot;&gt;VI&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Estoy sin contrato ni compromiso de permanencia, &lt;strong&gt;huyo&lt;/strong&gt; de mi distribuidor.
&lt;/p&gt;
&lt;h3&gt;Compromiso de Permanencia&lt;/h3&gt;
&lt;p&gt;
El plan es, &lt;strong&gt;vuelvo a mi operador anterior&lt;/strong&gt;, con el terminal que ya tengo, y como si nada hubiera pasado. Eso sí, vuelvo &lt;strong&gt;sin compromiso de permanencia&lt;/strong&gt;, que ya me canso de que me tengan agarrao.
&lt;/p&gt;
&lt;p&gt;
Todo es tan bonito&amp;#8230; hasta que la comercial se equivoca al hacer los papeles, y me pone permanencia de 18 meses.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt; &amp;#8211; Oye perdona, habíamos quedado que si no me llevo terminal, no tenía compromiso de permanencia&amp;#8230;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt; &amp;#8211; ¡Ay!, Sí, perdona, vaya, ahora no me deja cambiarlo el sistema, lo cambiamos en el contrato, vuelve la semana que viene y lo cambiamos por teléfono en el sistema.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
La semana siguiente estoy de vacaciones. Me paso cuando puedo, pero la chica está de vacaciones. &lt;em&gt;&amp;#8220;Vuelve la semana que viene&amp;#8221;&lt;/em&gt;. Tengo mudanzas por medio, estoy un poco liado, me paso un par de meses después. &lt;em&gt;&amp;#8220;Es que la chica ya no trabaja aquí, te digo donde trabaja y te pasas.&amp;#8221;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Y hasta ahí aguanto. Yo hice el contrato con el distribuidor, no con una comercial. &lt;em&gt;&amp;#8220;Veremos a ver si podemos hacer algo desde aquí.&amp;#8221;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Pues más les vale, porque en mi copia del contrato dice que &lt;strong&gt;no tengo compromiso de permanencia&lt;/strong&gt;.&lt;/p&gt;</description>
	<pubDate>Tue, 03 Nov 2009 15:00:05 +0000</pubDate>
</item>
<item>
	<title>Golo: Cómo me quedé sin teléfono (VI)</title>
	<guid>http://www.capitangolo.net/Blog/?p=334</guid>
	<link>http://www.capitangolo.net/Blog/?p=334</link>
	<description>&lt;p&gt;
Este verano estuve un par de semanas sin teléfono, por culpa de una portabilidad. Partes &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=280&quot;&gt;I&lt;/a&gt;, &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=284&quot;&gt;II&lt;/a&gt;, &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=288&quot;&gt;III&lt;/a&gt;, &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=328&quot;&gt;IV&lt;/a&gt;, y &lt;a href=&quot;http://www.capitangolo.net/Blog/?p=332&quot;&gt;V&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
En una hoja de reclamaciones el distribuidor se compromete a darme el terminal solicitado en cuanto tenga existencias. ¿Será verdad?
&lt;/p&gt;
&lt;h3&gt;Camino de vuelta&lt;/h3&gt;
&lt;p&gt;
Desgraciadamente, para contratos de &lt;strong&gt;empresa&lt;/strong&gt;, el procedimiento de reclamación se realiza vía &lt;strong&gt;burofax&lt;/strong&gt;. Mi hoja de reclamaciones no sirve para nada &lt;img src=&quot;http://www.capitangolo.net/Blog/wp-includes/images/smilies/icon_sad.gif&quot; alt=&quot;:(&quot; class=&quot;wp-smiley&quot; /&gt; .
&lt;/p&gt;
&lt;p&gt;
El distribuidor se pone en contacto conmigo para indicarme que si no me llevo un teléfono antes de final de mes, darán de &lt;strong&gt;baja&lt;/strong&gt; mi número de teléfono.
&lt;/p&gt;
&lt;p&gt;
Después de varias quejas en todos los medios de atención al cliente del operador, y llamadas casi diarias al distribuidor (que ya empezaba a cansarse de mí), el distribuidor accede a cancelarme el contrato. Eso sí, manteniéndome el número &lt;strong&gt;sin compromiso de permanencia&lt;/strong&gt;, para que pueda portar a otro operador.
&lt;/p&gt;
&lt;p&gt;
Así que acudo a un distribuidor de mi viejo operador para realizar otra &lt;strong&gt;portabilidad&lt;/strong&gt;, la segunda en un mes.&lt;/p&gt;</description>
	<pubDate>Mon, 02 Nov 2009 15:00:04 +0000</pubDate>
</item>

</channel>
</rss>
