<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>La fatiga del Geek</title>
	
	<link>http://nauj27.com/blog</link>
	<description>Reflexiones y cacharreos de nauj27</description>
	<lastBuildDate>Wed, 01 Feb 2012 19:17:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/LaFatigaDelGeek" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="lafatigadelgeek" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Fuse layer for ADB – adbfuse</title>
		<link>http://nauj27.com/blog/2012/02/01/fuse-layer-for-adb-adbfuse/</link>
		<comments>http://nauj27.com/blog/2012/02/01/fuse-layer-for-adb-adbfuse/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 19:17:55 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[filesystem]]></category>
		<category><![CDATA[fuse]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=912</guid>
		<description><![CDATA[En los últimos días he estado trabajando en un proyecto que permite mostrar el contenido de un móvil con Android como si fuese una unidad de disco externa. Las ventajas que tiene respecto a activar la conexión por USB que trae Android de serie son varias, entre ellas: Acceso completo al sistema de ficheros del [...]]]></description>
			<content:encoded><![CDATA[<p>En los últimos días he estado trabajando en un proyecto que permite mostrar el contenido de un móvil con <a href="http://www.android.com/">Android</a> como si fuese una unidad de disco externa.</p>
<p>Las ventajas que tiene respecto a activar la conexión por USB que trae Android de serie son varias, entre ellas:</p>
<ul>
<li><strong>Acceso completo al sistema de ficheros</strong> del teléfono. La tarjeta de memoria interna es accesible en <em>/mnt/sdcard</em>.</li>
<li><strong>Acceso simultáneo desde el teléfono y desde el ordenador</strong>. De este modo no dejarán de funcionar las aplicaciones que han sido pasadas a la tarjeta de memoria mientras la usamos desde el ordenador.</li>
</ul>
<p>Se trata de una primera versión y en directorios donde hay muchos archivos, por ejemplo la carpeta de fotos o de música, el acceso puede ser algo lento. Las siguientes versiones de <a title="Fuse layer for ADB" href="http://code.google.com/p/adbfuse/">adbfuse</a> irán mejorando este y otros aspectos.</p>
<p>Se trata de algo para usuarios avanzados, ya que el teléfono ha de estar <em>rooteado</em>, tener instalado BusyBox, y saber montar un sistema de archivos FUSE en Linux.</p>
<p>Se puede descargar en <a href="http://code.google.com/p/adbfuse/">la web del proyecto</a> tanto la <a href="http://code.google.com/p/adbfuse/downloads/detail?name=adbfuse.tar.bz2">versión empaquetada</a> como el código fuente con <a href="http://mercurial.selenic.com/">Mercurial</a>. El proyecto ha sido liberado bajo la licencia <a href="http://gplv3.fsf.org/">GNU GPLv3</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2012/02/01/fuse-layer-for-adb-adbfuse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MetaWatch Firmware</title>
		<link>http://nauj27.com/blog/2011/11/03/metawatch-firmware/</link>
		<comments>http://nauj27.com/blog/2011/11/03/metawatch-firmware/#comments</comments>
		<pubDate>Thu, 03 Nov 2011 18:32:11 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[metawatch]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=895</guid>
		<description><![CDATA[Este verano me compré un reloj MetaWatch. Este reloj nace según sus creadores como una plataforma para desarrollo de manera que está documentado desde antes de venderse. La documentación la actualizan, el firmware lo actualizan y la aplicación para Android la actualizan también. Además proporcionan el código fuente tanto de la aplicación para Android como [...]]]></description>
			<content:encoded><![CDATA[<p>Este verano <a href="https://estore.ti.com/MSP-WDS430BT2000D-Bluetooth-Wearable-Watch-development-system-with-Digital-display-P2447.aspx">me compré</a> un reloj <a href="http://www.metawatch.org">MetaWatch</a>. Este reloj nace según sus creadores como una <a href="http://www.metawatch.org/developers/">plataforma para desarrollo</a> de manera que está documentado desde antes de venderse. La documentación la actualizan, el firmware lo actualizan y la aplicación para Android la actualizan también.</p>
<p>Además proporcionan el código fuente tanto de la <a href="https://github.com/MetaWatchOpenProjects/MWM-for-Android">aplicación para Android</a> como del <a href="https://github.com/MetaWatchOpenProjects/MetaWatch-WDS11x-IAR">Firmware</a> del mismo. Se me ocurrió hacerle una modificación, y es que cuando se pulsa el primer botón, el de arriba a la derecha, aparece mi tarjeta de visita. En este artículo explicaré de forma resumida el proceso para conseguir mi objetivo.</p>
<p>Lo primero es generar un <a href="http://es.wikipedia.org/wiki/C%C3%B3digo_QR">qrcode</a> en la web de <a href="http://zxing.appspot.com/generator/">zxing</a>. Se rellena la información pertinente y se genera de tamaño S para que quepa en la pantalla de 96&#215;96 del reloj. Aunque la imagen generada es un poco más grande aprovecharemos el hecho de que tiene un marco blanco alrededor despreciable sin pérdida de información. Una vez generado se abre con Gimp y se cambia el tamaño del lienzo a 96&#215;96 recortando la zona blanca del alrededor tanto como sea necesario para que entre, sin redimensionar la imagen. Se guarda como BMP indexado de dos colores sin comprimir y ya tenemos la imagen preparada.</p>
<p>En el código fuente del firmware del reloj, las imágenes se encuentran directamente en el formato aceptado por el búfer de la pantalla, es decir, como array de bytes. Al tener la pantalla 96&#215;96 píxeles como ya decíamos antes, se tiene un array de 96 filas con 12 bytes por fila. Doce bytes por ocho bits por byte hacen un total de 96 columnas.</p>
<p>Para convertir cualquier imagen BMP indexada con dos colores a array de bytes he realizado este pequeño script en python usando parte del código de <a href="https://github.com/travisgoodspeed/PyMetaWatch">PyMetaWatch</a>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> Image
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
  image = Image.<span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
  pix = image.<span style="color: black;">load</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #ff7700;font-weight:bold;">for</span> y <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">96</span><span style="color: black;">&#41;</span>:
    rowdat = <span style="color: #483d8b;">&quot;&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>,<span style="color: #ff4500;">96</span>,<span style="color: #ff4500;">8</span><span style="color: black;">&#41;</span>:
      byte=<span style="color: #ff4500;">0</span>
      <span style="color: #ff7700;font-weight:bold;">for</span> pindex <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>,<span style="color: #ff4500;">8</span><span style="color: black;">&#41;</span>:
        pixel=pix<span style="color: black;">&#91;</span>x+pindex,y<span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>pixel <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>:
          pixel = <span style="color: #ff4500;">1</span>
&nbsp;
        byte=<span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>byte<span style="color: #66cc66;">&gt;&gt;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>|<span style="color: black;">&#40;</span>pixel<span style="color: #66cc66;">&lt;&lt;</span><span style="color: #ff4500;">7</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
      rowdat=<span style="color: #483d8b;">&quot;%s%s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>rowdat,<span style="color: #008000;">chr</span><span style="color: black;">&#40;</span>byte<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    myrow = <span style="color: #483d8b;">&quot;&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> dat <span style="color: #ff7700;font-weight:bold;">in</span> rowdat:
      myrow += <span style="color: #483d8b;">&quot;0x%02x,&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">ord</span><span style="color: black;">&#40;</span>dat<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">print</span> myrow
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
  main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>Pasando como parámetro el nombre del archivo BMP devuelve un bloque de caracteres que habrá que usar en el código fuente del firmware. Lo que hice fue volcar la salida a un fichero y después copiar y pegar el resultado. Con eso es suficiente para nuestro objetivo final, no buscábamos hacer un programa de conversión sino que tan solo ha sido una herramienta intermedia.</p>
<p>Finalmente hay que buscar en el fichero <a href="https://github.com/MetaWatchOpenProjects/MetaWatch-WDS11x-IAR/blob/master/Watch/Application/LcdDisplay.c">LcdDisplay.c</a> la definición de <a href="https://github.com/MetaWatchOpenProjects/MetaWatch-WDS11x-IAR/blob/master/Watch/Application/LcdDisplay.c#L2019">pBarCodeImage</a> y sustituir su valor por el generado por el script anterior. Se compila el proyecto y se programa el nuevo firmware al reloj siguiendo las mismas instruciones que existen para la <a href="http://www.metawatch.org/assets/images/developers/MetaWatch_Reflash_your_Watch_Firmware_1.0.pdf">actualización oficial</a>. Y <a href="https://twitter.com/#!/nauj27/status/131725636778725376">ya está</a>.</p>
<p>Gracias a <a href="http://draxus.org/">draxus</a> por encontrar la ubicación del QRCode original en el código fuente del firmware.</p>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2011/11/03/metawatch-firmware/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Threads y animaciones en Android</title>
		<link>http://nauj27.com/blog/2011/05/14/threads-y-animaciones-en-android/</link>
		<comments>http://nauj27.com/blog/2011/05/14/threads-y-animaciones-en-android/#comments</comments>
		<pubDate>Sat, 14 May 2011 10:17:07 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=881</guid>
		<description><![CDATA[En la entrada anterior vimos cómo convertir un gif animado en una animación para Android. Lo siguiente que queremos hacer es usar esa animación en una aplicación. Es un problema conocido que si se llama al método AnimationDrawable.start() desde métodos del Activity como en Activity.onCreate(), la animación no se moverá, y solo se verá la [...]]]></description>
			<content:encoded><![CDATA[<p>En <a title="Uso de gif animado en Android" href="http://nauj27.com/blog/2011/02/08/uso-de-gif-animado-en-android/">la entrada anterior</a> vimos cómo convertir un gif animado en una animación para Android. Lo siguiente que queremos hacer es usar esa animación en una aplicación.</p>
<p><a title="Issue 1818 - AnimationDrawable.start()  doesn't work" href="http://code.google.com/p/android/issues/detail?id=1818">Es un problema conocido</a> que si se llama al método <a href="http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html#start%28%29"><em>AnimationDrawable.start()</em></a> desde métodos del Activity como en <a href="http://developer.android.com/reference/android/app/Activity.html#onCreate%28android.os.Bundle%29"><em>Activity.onCreate()</em></a>, la animación no se moverá, y solo se verá la primera imagen de la misma. No habrá ningún error, no habrá ningún problema, y sin embargo la animación no se moverá.</p>
<p><a title="Solución al problema" href="http://code.google.com/p/android/issues/detail?id=1818#c5">La solución</a> la aporta un usuario en la misma <a title="Issue 1818" href="http://code.google.com/p/android/issues/detail?id=1818">hebra del problema</a>, y viene a decir que hay que crear una clase <em>Starter</em> que implemente la interfaz <a href="http://developer.android.com/reference/java/lang/Runnable.html"><em>Runnable</em></a> y crear un objeto de este tipo dentro del método <a title="En realidad el método post() viene heredado de View" href="http://developer.android.com/reference/android/view/View.html#post%28java.lang.Runnable%29"><em>ImageView.post()</em></a>. De este modo el método <a href="http://developer.android.com/reference/java/lang/Runnable.html#run%28%29"><em>run()</em></a> de la clase Starter se ejecutará en la misma hebra que el método del Activity (la hebra de interfaz del usuario &#8211; <a title="Solo se debe modificar la interfaz desde ésta hebra principal" href="http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html">UI Thread</a>) y además después de que nuestro ImageView haya sido correctamente inicializado y mostrado en pantalla.</p>
<p>Esta primera parte iría en el método del <em>Activity</em> donde queremos asignar e iniciar la animación.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// --- %&lt; ---</span>
imageView.<span style="color: #006633;">setBackgroundResource</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">throbber</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
AnimationDrawable d <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>AnimationDrawable<span style="color: #009900;">&#41;</span>imageView.<span style="color: #006633;">getBackground</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
imageView.<span style="color: #006633;">post</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Starter<span style="color: #009900;">&#40;</span>d<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// --- %&lt; ---</span></pre></td></tr></table></div>

<p>Y por otro lado tendríamos que crear una clase Starter() como la siguiente.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #008000; font-style: italic; font-weight: bold;">/**
* Starts the animation drawable passed to the constructor.
*/</span>
<span style="color: #000000; font-weight: bold;">class</span> Starter <span style="color: #000000; font-weight: bold;">implements</span> <span style="color: #003399;">Runnable</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> AnimationDrawable animationDrawable <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> Starter<span style="color: #009900;">&#40;</span>AnimationDrawable animationDrawable<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">animationDrawable</span> <span style="color: #339933;">=</span> animationDrawable<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> run<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">animationDrawable</span>.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2011/05/14/threads-y-animaciones-en-android/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Uso de gif animado en Android</title>
		<link>http://nauj27.com/blog/2011/02/08/uso-de-gif-animado-en-android/</link>
		<comments>http://nauj27.com/blog/2011/02/08/uso-de-gif-animado-en-android/#comments</comments>
		<pubDate>Tue, 08 Feb 2011 17:43:47 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[animación]]></category>
		<category><![CDATA[gif]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=872</guid>
		<description><![CDATA[En Android se suele usar un ImageView para dibujar una imagen. La imagen puede provenir de un recurso interno, de una imagen externa, o de un objeto drawable que se le pase directamente al método .setImageDrawable(). En cualquier caso, en la mayoría de dispositivos no será posible mostrar en este tipo de contenedor un gif [...]]]></description>
			<content:encoded><![CDATA[<p>En Android se suele usar un <a href="http://developer.android.com/reference/android/widget/ImageView.html">ImageView</a> para dibujar una imagen. La imagen puede provenir de un recurso interno, de una imagen externa, o de un objeto drawable que se le pase directamente al método <a href="http://developer.android.com/reference/android/widget/ImageView.html#setImageDrawable(android.graphics.drawable.Drawable)">.setImageDrawable()</a>.</p>
<p>En cualquier caso, en la mayoría de dispositivos no será posible mostrar en este tipo de contenedor un gif animado, ya que según la documentación tan solo se representará el primer frame de la imagen animada.</p>
<p>El modo de representar correctamente una animación en android es usando un <a href="http://developer.android.com/guide/topics/resources/animation-resource.html">recurso creado específicamente para ello</a>. De los dos tipos de animaciones que se pueden crear en Android la que nos interesa en esta ocasión es la que se conoce como <a href="http://developer.android.com/guide/topics/resources/animation-resource.html#Frame">Frame Animation</a>. La idea es sencilla y es muy similar a la de los GIF animados: un archivo xml define qué imágenes se muestran y durante cuánto tiempo, las imágenes deben de encontrarse accesibles como recursos internos de la aplicación. Para más información véase la documentación sobre <a href="http://developer.android.com/guide/topics/resources/animation-resource.html#Frame">Frame Animation</a>.</p>
<p>La cuestión es que hay un montón de GIFs animados que podemos querer incluir en nuestra aplicación para Android, así que es necesario hacer una conversión de un formato a otro de un modo más o menos automatizado.</p>
<p>El siguiente guión en python extrae los frames completos así como la información temporal y espacial de cada uno de ellos regenerando imágenes en caso de tratarse de un GIF optimizado, para formar un recurso de imagen completo para Android. La <a href="http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html">animación así creada</a> funcionará correctamente en cualquier dispositivo en cualquier versión de Android. Para más información véase la clase <a href="http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html">AnimationDrawable</a>.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #808080; font-style: italic;"># -*- encoding: utf-8 -*-</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>, <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">subprocess</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># When no delay is specified in a gif file, 100ms is default</span>
DEFAULT_DELAY_MS = <span style="color: #ff4500;">100</span>
&nbsp;
input_file = <span style="color: #008000;">None</span>
output_file = <span style="color: #008000;">None</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">try</span>:
    input_file = <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
    output_file = <span style="color: #483d8b;">&quot;%s.xml&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>input_file.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;.&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>,<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">except</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Usage: %s &lt;input.gif&gt;&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>,<span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Anim<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">content</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> add_header<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">content</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">content</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&lt;animation-list<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">content</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'    xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">content</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'    android:oneshot=&quot;false&quot;&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> add_item<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #dc143c;">resource</span>, duration<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">content</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span>
            <span style="color: #483d8b;">'    &lt;item android:drawable=&quot;@drawable/%s&quot; android:duration=&quot;%d&quot; /&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span> <span style="color: #66cc66;">%</span>
            <span style="color: black;">&#40;</span><span style="color: #dc143c;">resource</span>, duration<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> add_footer<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">content</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&lt;/animation-list&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> write_file<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        file_descriptor = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>output_file, <span style="color: #483d8b;">&quot;w&quot;</span><span style="color: black;">&#41;</span>
        file_descriptor.<span style="color: black;">writelines</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">content</span><span style="color: black;">&#41;</span>
        file_descriptor.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Gif<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, gif<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">input_file</span> = gif
        gif_info = <span style="color: #dc143c;">subprocess</span>.<span style="color: black;">Popen</span><span style="color: black;">&#40;</span>
            <span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;gifsicle&quot;</span>, <span style="color: #483d8b;">&quot;--info&quot;</span>, input_file<span style="color: black;">&#93;</span>,
            stdout=<span style="color: #dc143c;">subprocess</span>.<span style="color: black;">PIPE</span>,
            stderr=<span style="color: #dc143c;">subprocess</span>.<span style="color: black;">PIPE</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: black;">&#40;</span>gif_info_out, gif_info_error<span style="color: black;">&#41;</span> = gif_info.<span style="color: black;">communicate</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">gif_info_lines</span> = gif_info_out.<span style="color: black;">splitlines</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_info<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">gif_info_lines</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> explode<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:    
        return_code = <span style="color: #dc143c;">subprocess</span>.<span style="color: black;">call</span><span style="color: black;">&#40;</span>
            <span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;gifsicle&quot;</span>, <span style="color: #483d8b;">&quot;--explode&quot;</span>, <span style="color: #483d8b;">&quot;--unoptimize&quot;</span>, <span style="color: #008000;">self</span>.<span style="color: black;">input_file</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff7700;font-weight:bold;">not</span> return_code
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> to_png<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, gif_frame<span style="color: black;">&#41;</span>:
        return_code = <span style="color: #dc143c;">subprocess</span>.<span style="color: black;">call</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;gif2png&quot;</span>, <span style="color: #483d8b;">&quot;-d&quot;</span>, <span style="color: #483d8b;">&quot;-s&quot;</span>, <span style="color: #483d8b;">&quot;-O&quot;</span>, gif_frame<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> return_code
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Processing %s...&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>input_file,<span style="color: black;">&#41;</span>
&nbsp;
    anim = Anim<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    anim.<span style="color: black;">add_header</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> 
&nbsp;
    gif = Gif<span style="color: black;">&#40;</span>input_file<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> gif.<span style="color: black;">explode</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Error exploding gif input file %s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>input_file,<span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;">#sys.exit(1)</span>
&nbsp;
    info_lines = gif.<span style="color: black;">get_info</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    counter = <span style="color: #ff4500;">0</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> info_lines:
        line = line.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> line.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;disposal&quot;</span><span style="color: black;">&#41;</span>:
            line_items = line.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>line_items<span style="color: black;">&#41;</span> == <span style="color: #ff4500;">4</span>:
                milliseconds = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #008000;">round</span><span style="color: black;">&#40;</span><span style="color: #008000;">float</span><span style="color: black;">&#40;</span>line_items<span style="color: black;">&#91;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">1000</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                milliseconds = DEFAULT_DELAY_MS
&nbsp;
            <span style="color: #808080; font-style: italic;"># Rename and convert gif to optimized png</span>
            renamed_gif = <span style="color: #483d8b;">&quot;%s_%03d.gif&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>input_file.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;.&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>, counter<span style="color: black;">&#41;</span>
            <span style="color: #dc143c;">os</span>.<span style="color: black;">rename</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%s.%03d&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>input_file, counter<span style="color: black;">&#41;</span>, renamed_gif<span style="color: black;">&#41;</span>
            result = gif.<span style="color: black;">to_png</span><span style="color: black;">&#40;</span>renamed_gif<span style="color: black;">&#41;</span>
&nbsp;
            anim.<span style="color: black;">add_item</span><span style="color: black;">&#40;</span>renamed_gif.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;.&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>, milliseconds<span style="color: black;">&#41;</span>
            counter = counter + <span style="color: #ff4500;">1</span>
&nbsp;
    anim.<span style="color: black;">add_footer</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    anim.<span style="color: black;">write_file</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #dc143c;">os</span>.<span style="color: black;">unlink</span><span style="color: black;">&#40;</span>input_file<span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>Es necesario tener instalado <a href="http://www.lcdf.org/gifsicle/">gifsicle</a>, y para la optimización en tamaño y conversión a png de las imágenes resultantes es necesario tener también instalado, y en el <strong>$PATH</strong>, <a href="http://catb.org/~esr/gif2png/">gif2png</a>.</p>
<p>Descargar <a href='http://nauj27.com/blog/wp-content/uploads/2011/02/getanim.zip'>getanim.py</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2011/02/08/uso-de-gif-animado-en-android/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bitmap desde NV21 en Android</title>
		<link>http://nauj27.com/blog/2010/12/13/bitmap-desde-nv21-en-android/</link>
		<comments>http://nauj27.com/blog/2010/12/13/bitmap-desde-nv21-en-android/#comments</comments>
		<pubDate>Mon, 13 Dec 2010 21:32:46 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[camera]]></category>
		<category><![CDATA[color]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[nv21]]></category>
		<category><![CDATA[ycbcr]]></category>
		<category><![CDATA[yuv]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=858</guid>
		<description><![CDATA[En el nuevo proyecto que estoy escribiendo para Android, me he visto en la necesidad de analizar cada una de las imágenes que recoge la cámara durante la vista previa de la misma. Según la documentación el formato que deben de implementar los dispositivos con Android es YCbCr_420_SP codificado como NV21. Aunque en principio se [...]]]></description>
			<content:encoded><![CDATA[<p>En el nuevo proyecto que estoy escribiendo para Android, me he visto en la necesidad de analizar cada una de las imágenes que recoge la cámara durante la vista previa de la misma. Según la documentación el formato que deben de implementar los dispositivos con Android es <a href="http://developer.android.com/reference/android/hardware/Camera.PreviewCallback.html#onPreviewFrame(byte[],%20android.hardware.Camera)">YCbCr_420_SP codificado como NV21</a>. Aunque en principio se podrían especificar otros formatos es extraño que algún terminal tenga otro formato implementado así que deberemos de usar ese si queremos que funcione en el mayor número de plataformas y dispositivos posibles.</p>
<div id="attachment_859" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-859" title="Cylon detector" src="http://nauj27.com/blog/wp-content/uploads/2010/12/cylondetector.jpg" alt="Cylon detector pre-early release" width="500" height="312" /><p class="wp-caption-text">Desarrollo de Cylon Detector para Android</p></div>
<p>En cada frame recibido se desea analizar si existe la cara de una persona, por lo que hay que convertir la imagen a <a href="http://developer.android.com/reference/android/graphics/Bitmap.html">Bitmap</a> y pasarla al <a href="http://developer.android.com/reference/android/media/FaceDetector.html">detector de caras</a> que provee el API. Pues bien, existe un problema y es que <a href="http://code.google.com/p/android/issues/detail?id=823">la factoría para crear Bitmaps no acepta ese formato</a>. Hay <a href="http://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/PlanarYUVLuminanceSource.java?r=1677">varias soluciones</a> por la red, pero unas son para Android 2.2 en adelante, otras son implementaciones en C para hacerlas usando el NDK como librería independiente, y otras símplemente son demasiado complejas para lo que aquí se necesita.</p>
<p>Al final lo que he hecho es analizar el formato de los datos en base a su <a href="http://www.fourcc.org/yuv.php#NV21">definición</a> y crear el Bitmap a partir de estos datos para la imagenen blanco y negro. Podría hacerse para la imagen en color símplemente leyendo todos los datos y haciendo uso de las funciones de <a href="http://www.fourcc.org/fccyvrgb.php">conversión de YCrCb a RGB</a> pero ello requeriría mayor tiempo de proceso incluyendo varias multiplicaciones en coma flotante. Aquí solo necesitamos en principio detectar si hay una cara en la imagen o no, y para ello es suficiente con que la imagen sea en blanco y negro. Para obtener la imagen en blanco y negro lo que he hecho ha sido leer los valores de luminancia (luminosidad), que según el formato NV21 están en la primera parte del array y convertir cada valor a un punto RGB con el mismo valor. El resultado, aunque no se aprecia demasiado bien en la imagen anterior, no es completamente una imagen en blanco y negro, sino que aparecen zonas saturadas de un color amarillo. La conversión que estoy realizando no es del todo correcta pero es cuestión de convertir y acotar correctamente los valores.</p>
<p>Por si a alguien le es de utilidad, esto es un recorte de la parte más importante que he programado para la conversión de NV21 a Bitmap:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * @author nauj27
 * The Utils class contains utilities for CylonDetector.
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Utils <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * See http://www.fourcc.org/yuv.php#NV21 for more information.
	 * We only read luminance for speed up the whole process. 
	 * All colors of the image are set to the luminance value and
	 * this way we obtains a black and white image for processing.
	 * 
	 * @param data The data array in NV21 (YCbCr_420_SP) format.
	 * @return Black and white bitmap decoded from NV21 input data.
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> Bitmap getBitmapFromNV21<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> data, <span style="color: #000066; font-weight: bold;">int</span> width, <span style="color: #000066; font-weight: bold;">int</span> height<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000066; font-weight: bold;">int</span> pixelsNumber <span style="color: #339933;">=</span> width <span style="color: #339933;">*</span> height<span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> colors <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span>pixelsNumber<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> pixel <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> pixel <span style="color: #339933;">&lt;</span> pixelsNumber<span style="color: #339933;">;</span> pixel<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			colors<span style="color: #009900;">&#91;</span>pixel<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #003399;">Color</span>.<span style="color: #006633;">rgb</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#91;</span>pixel<span style="color: #009900;">&#93;</span>, data<span style="color: #009900;">&#91;</span>pixel<span style="color: #009900;">&#93;</span>, data<span style="color: #009900;">&#91;</span>pixel<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> Bitmap.<span style="color: #006633;">createBitmap</span><span style="color: #009900;">&#40;</span>colors, width, height, Bitmap.<span style="color: #006633;">Config</span>.<span style="color: #006633;">ARGB_8888</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><b>Editada:</b> El modo correcto de convertir el valor de luminancia a escala de grises para crear la imagen lo he sacado finalmente del proyecto zxing, y es el que dejo a continuación:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">grey <span style="color: #339933;">=</span> data<span style="color: #009900;">&#91;</span>pixel<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&amp;</span> 0xff<span style="color: #339933;">;</span>
colors<span style="color: #009900;">&#91;</span>pixel<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> 0xff000000 <span style="color: #339933;">|</span> <span style="color: #009900;">&#40;</span>grey <span style="color: #339933;">*</span> 0x00010101<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Esto es lo que iría dentro del bucle <i>for</i> para que sea interpretado correctamente por el <b>Bitmap.createBitmap</b> como mapa de color <b>ARGB_8888</b>.</p>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2010/12/13/bitmap-desde-nv21-en-android/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>HTML5 Canvas</title>
		<link>http://nauj27.com/blog/2010/12/10/html5-canvas/</link>
		<comments>http://nauj27.com/blog/2010/12/10/html5-canvas/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 23:06:57 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=837</guid>
		<description><![CDATA[Me he decidido a echarle un vistazo al HTML5 y a la representación de una superficie Canvas para dibujar en 2D. Este tipo de superficie permitirá en un futuro que ya está aquí hacer juegos para la web en HTML real que se puedan usar en cualquier dispositivo sin necesidad de complementos de terceros, léase [...]]]></description>
			<content:encoded><![CDATA[<p>Me he decidido a echarle un vistazo al <a href="http://dev.w3.org/html5/spec/">HTML5</a> y a la representación de una superficie <a href="http://dev.w3.org/html5/2dcontext/">Canvas para dibujar en 2D</a>. Este tipo de superficie permitirá en un futuro que ya está aquí hacer juegos para la web en HTML real que se puedan usar en cualquier dispositivo sin necesidad de complementos de terceros, léase Adobe Flash.</p>
<p>La verdadera utilidad y potencia es poder dibujar en tiempo real sobre la superficie y a provechar todas las características de dibujo que nos proporciona, cosas que no he usado en mi ejercicio particular. Sin embargo me ha servido como introducción al uso de canvas en HTML y aquí queda como ejemplo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;HTML 5 Canvas example&lt;/title&gt;
    <span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
        <span style="color: #003366; font-weight: bold;">var</span> x <span style="color: #339933;">=</span> <span style="color: #CC0000;">50</span><span style="color: #339933;">;</span>
        <span style="color: #003366; font-weight: bold;">var</span> y <span style="color: #339933;">=</span> <span style="color: #CC0000;">50</span><span style="color: #339933;">;</span>
        <span style="color: #003366; font-weight: bold;">var</span> dx <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
        <span style="color: #003366; font-weight: bold;">var</span> dy <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003366; font-weight: bold;">var</span> myCanvas<span style="color: #339933;">;</span>
        <span style="color: #003366; font-weight: bold;">var</span> myContext<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003366; font-weight: bold;">var</span> pelota<span style="color: #339933;">;</span>
        <span style="color: #003366; font-weight: bold;">var</span> fondo<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003366; font-weight: bold;">var</span> main <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #006600; font-style: italic;">// Se inicializa el canvas</span>
            myCanvas <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;mycanvas&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            myContext <span style="color: #339933;">=</span> myCanvas.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;2d&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #006600; font-style: italic;">// Se cogen los elementos de imagen para pintar</span>
            pelota <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;pelota&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fondo <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;fondo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #006600; font-style: italic;">// Se pinta el fondo y la pelota en el canvas</span>
            myContext.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>fondo<span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> fondo.<span style="color: #660066;">width</span><span style="color: #339933;">,</span> fondo.<span style="color: #660066;">height</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            myContext.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>pelota<span style="color: #339933;">,</span> x<span style="color: #339933;">,</span> y<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            window.<span style="color: #660066;">setInterval</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;moverPelota()&quot;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003366; font-weight: bold;">var</span> moverPelota <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>x <span style="color: #339933;">&gt;</span> myCanvas.<span style="color: #660066;">width</span> <span style="color: #339933;">-</span> pelota.<span style="color: #660066;">width</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                dx <span style="color: #339933;">=</span> <span style="color: #339933;">-</span>dx<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">&gt;</span> myCanvas.<span style="color: #660066;">height</span> <span style="color: #339933;">-</span> pelota.<span style="color: #660066;">height</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                dy <span style="color: #339933;">=</span> <span style="color: #339933;">-</span>dy<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            x <span style="color: #339933;">+=</span> dx<span style="color: #339933;">;</span>
            y <span style="color: #339933;">+=</span> dy<span style="color: #339933;">;</span>
&nbsp;
            myContext.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>fondo<span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> fondo.<span style="color: #660066;">width</span><span style="color: #339933;">,</span> fondo.<span style="color: #660066;">height</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            myContext.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>pelota<span style="color: #339933;">,</span> x<span style="color: #339933;">,</span> y<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span>
    &lt;style type=&quot;text/css&quot;&gt;
      canvas { border: 2px solid black; }
      canvas#mycanvas { width: 320px; height: 170px; }
      img { display: none; }
    &lt;/style&gt;
  &lt;/head&gt;
  &lt;body onload=&quot;main();&quot;&gt;
&nbsp;
    &lt;canvas id=&quot;mycanvas&quot;&gt;
        Aquí debería de aparecer un balón rebotando.
    &lt;/canvas&gt;
&nbsp;
    &lt;img id=&quot;pelota&quot; src=&quot;pelota.png&quot; width=&quot;49px&quot; height=&quot;49px&quot; /&gt;
    &lt;img id=&quot;fondo&quot; src=&quot;fondo.jpg&quot; width=&quot;320px&quot; height=&quot;170px&quot; /&gt;
&nbsp;
  &lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p>El resultado puede verse en la <a href="http://nauj27.com/html5/canvas.html">web del ejemplo de uso de canvas</a>.</p>
<p>Las imágenes se precargan ocultas (con display: none) porque según la <a href="http://dev.w3.org/html5/2dcontext/#images">especificación del HTML5</a> si la imagen no ha sido completamente cargada no se pintará nada. Cargándolas de este modo nos aseguramos de que se han leído completamente antes de su uso en el canvas.</p>
<p>Las pruebas las he realizado sobre Mozilla Firefox 4.0 Beta 7. En cualquier navegador que implemente canvas sobre html5 debería de representarse correctamente. Entre estos navegadores se incluyen Safari, Opera o Chrome. Si eres usuario de Internet Explorer ¿a qué esperas para cambiar a un navegador real?</p>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2010/12/10/html5-canvas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>¿Qué significan los 600Hz que anuncian ahora?</title>
		<link>http://nauj27.com/blog/2010/11/07/%c2%bfque-significan-los-600hz-que-anuncian-ahora/</link>
		<comments>http://nauj27.com/blog/2010/11/07/%c2%bfque-significan-los-600hz-que-anuncian-ahora/#comments</comments>
		<pubDate>Sun, 07 Nov 2010 20:11:58 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[Multimedia]]></category>
		<category><![CDATA[Video]]></category>
		<category><![CDATA[600hz]]></category>
		<category><![CDATA[60hz]]></category>
		<category><![CDATA[anuncio]]></category>
		<category><![CDATA[samsung]]></category>
		<category><![CDATA[subfield]]></category>
		<category><![CDATA[tv]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=826</guid>
		<description><![CDATA[Quizá hayáis visto el anuncio de Samsung donde se anuncia una televisión 3D que según ellos muestra la imagen a 600Hz. Tendemos a comparar las cosas nuevas que vemos y oímos con aquellas que conocemos, por lo que mi reacción al ver el anuncio fue pensar: Menuda tontería ponerle 600Hz, si por encima de los [...]]]></description>
			<content:encoded><![CDATA[<p>Quizá hayáis visto el anuncio de Samsung donde se anuncia una televisión 3D que según ellos muestra la imagen a 600Hz. Tendemos a comparar las cosas nuevas que vemos y oímos con aquellas que conocemos, por lo que mi reacción al ver el anuncio fue pensar:</p>
<blockquote><p>Menuda tontería ponerle 600Hz, si por encima de los 85Hz nadie es capaz de apreciar la diferencia, ¿qué sentido tiene?</p></blockquote>
<p><a href="http://nauj27.com/blog/wp-content/uploads/2010/11/subfielddrive_en1.jpg"><img class="alignnone size-full wp-image-832" title="subfielddrive_en" src="http://nauj27.com/blog/wp-content/uploads/2010/11/subfielddrive_en1.jpg" alt="" width="500" height="165" /></a></p>
<p>Pues bien, buscando un poco en Google he encontrado lo siguiente en una <a href="https://panasonic.ca/English/audiovideo/plasma/viera2.asp">web oficial de Panasonic de Canadá</a>:</p>
<blockquote><p>A standard video signal is actually a series of still images, flashed on screen so quickly that we believe we are watching a moving image. The typical frame rate used in North America is 60 frames per second (60Hz) meaning that a TV would display 60 individual still images every second. Sub-field drive is the method used to flash the individual image elements (dots) on a plasma panel. For each frame displayed on the TV the Sub-field drive flashes the dots 10 times or more, meaning that the dots are flashing 600 times per second (600Hz) or more. (Example: 60 frames per second x 10 sub-fields = 600 flashes per second).</p></blockquote>
<p>Lo que significa en una traducción más o menos libre:</p>
<blockquote><p>Una señal estándar de video es una serie de imágenes fijas, que pasan por la pantalla tan rápido que hacen creer que se está viendo una imagen en movimiento. La tasa de refresco usual usada en Norte América es de 60 imágenes por segundo (60 Hz) lo cual significa que una TV mostrará 60 imágenes únicas por segundo. Sub-field motion es el método usado en los paneles de plasma para encender cada punto individual de la imagen (píxeles). Para cada imagen mostrada en la pantalla, el método sub-field motion enciende los puntitos 10 veces o más, al mostrar 60 imágenes por segundo esto hace que la imagen se pinte 600 veces por segundo, que son los 600Hz del anuncio.</p></blockquote>
<p>La imagen aparece más nítida al ojo por la tecnología usada para mantener cada fotograma en pantalla, pero en realidad la frecuencia de cambio de imagen es la misma que en otras televisiones.</p>
<p><a href="http://www.tvlampsnbulbs.com/2009/03/what-does-600hz-subfield-motion-mean/">Sitio en inglés</a> donde encontré que explicaban lo mismo.</p>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2010/11/07/%c2%bfque-significan-los-600hz-que-anuncian-ahora/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Configuración MMS con Simyo en Android</title>
		<link>http://nauj27.com/blog/2010/10/29/configuracion-mms-con-simyo-en-android/</link>
		<comments>http://nauj27.com/blog/2010/10/29/configuracion-mms-con-simyo-en-android/#comments</comments>
		<pubDate>Fri, 29 Oct 2010 10:34:58 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[mms]]></category>
		<category><![CDATA[simyo]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=822</guid>
		<description><![CDATA[Siempre que pierdo la configuración me tiro unos días buscando la forma de volver a hacer funcionar los mensajes MMS con Android. Todas las configuraciones que por ahí aparecen hablan de crear dos perfiles, uno para Internet y otro para los MMS. Finalmente habría que ir a la configuración de los mensajes y asignar el [...]]]></description>
			<content:encoded><![CDATA[<p>Siempre que pierdo la configuración me tiro unos días buscando la forma de volver a hacer funcionar los mensajes MMS con Android. Todas las configuraciones que por ahí aparecen hablan de crear dos perfiles, uno para Internet y otro para los MMS. Finalmente habría que ir a la configuración de los mensajes y asignar el perfil de MMS.</p>
<p>El problema es que en Android no funciona así. Desde la configuración de los mensajes no se puede elegir un perfil y si se crean dos perfiles distintos hay que elegir uno y el otro no se usa para nada.</p>
<p>La solución es crear un único perfil con una mezcla de las dos configuraciones. Lo voy a poner aquí, porque siempre que pierdo la configuración por el cambio de ROM me cuesta volver a hacerlo funcionar.</p>
<p>En el menú Ajustes &gt; Conexiones inalámbricas &gt; Redes móviles &gt; APN &gt; MENÚ &gt; APN nuevo:</p>
<blockquote><p>Nombre: Simyo<br />
APN: gprs-service.com<br />
Proxy:<br />
Puerto:<br />
Nombre de usuario:<br />
Contraseña:<br />
Servidor:<br />
MMSC: http://217.18.32.180:8080<br />
Proxy MMS: 217.18.32.181<br />
Puerto de MMS: 8080<br />
Protocolo MMS: WAP 2.0<br />
MMC: 214<br />
MNC: 19<br />
Tipo de autenticación: Ninguno<br />
Tipo de APN: default,mms</p></blockquote>
<p>Y funcionará así tanto la conexión de red GPRS/3G/HDSPA/HDSPA+ como los mensajes MMS.</p>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2010/10/29/configuracion-mms-con-simyo-en-android/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Color Picker es GPL3</title>
		<link>http://nauj27.com/blog/2010/10/02/color-picker-es-gpl3/</link>
		<comments>http://nauj27.com/blog/2010/10/02/color-picker-es-gpl3/#comments</comments>
		<pubDate>Sat, 02 Oct 2010 19:38:14 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[colorpicker]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=818</guid>
		<description><![CDATA[Desde que empecé el desarrollo de ColorPicker para Android tenía en mente liberar el código, pero hasta ahora ponía las típicas excusas: que si el código está muy feo, que si tengo que ponerme. Hoy ya se puede decir que he cumplido con lo que anuncié. Acabo de liberar el código con la versión GPL [...]]]></description>
			<content:encoded><![CDATA[<p>Desde que empecé el desarrollo de <a href="http://nauj27.com/blog/2010/04/28/color-picker/">ColorPicker</a> para Android tenía en mente liberar el código, pero hasta ahora ponía las <a href="http://osl.ugr.es/2010/09/30/excusas-frecuentemente-puestas-para-no-liberar-software-y-su-contraargumento-correspondiente/">típicas excusas</a>: que si el código está muy feo, que si tengo que ponerme. Hoy ya se puede decir que he cumplido con lo que anuncié. Acabo de liberar el código con la versión GPL v3 en <a href="http://code.google.com/p/colorpicker/">la web oficial de ColorPicker</a>.</p>
<p>Para mantener el control de los cambios he venido usando Mercurial. El mejor modo de descargarse el código fuente de ColorPicker es usando por tanto un cliente de Mercurial, disponible para todas las plataformas más usadas.</p>
<p>Tengo varias ideas en mente para esta aplicación, unas que se me ocurrieron y otras muchas que me han ido sugiriendo tanto en persona como en los comentarios del propio Android Market. En las próximas semanas podrán verse novedades y actualizaciones de la aplicación.</p>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2010/10/02/color-picker-es-gpl3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Río Dílar: Pinchazo de vuelta</title>
		<link>http://nauj27.com/blog/2010/06/23/rio-dilar-pinchazo-de-vuelta/</link>
		<comments>http://nauj27.com/blog/2010/06/23/rio-dilar-pinchazo-de-vuelta/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 17:14:25 +0000</pubDate>
		<dc:creator>manol32</dc:creator>
				<category><![CDATA[MTB]]></category>
		<category><![CDATA[dílar]]></category>
		<category><![CDATA[excursión]]></category>
		<category><![CDATA[mountain]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=813</guid>
		<description><![CDATA[Hoy nos acompaña un nuevo &#8220;artilugio&#8221;, es un &#8220;cuentakilómetrosgpsaltímetro&#8230;&#8221; y por supuesto se ha convertido en la estrella de la excursión. Comprobamos que va bien de velocidad, va bien de distancia, va bien de&#8230;todo, este aparato funciona a la primera y sin libro de instrucciones. Llegamos a Dílar, disfrute de su agua, de sus vistas, [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy nos acompaña un nuevo &#8220;artilugio&#8221;, es un  &#8220;cuentakilómetrosgpsaltímetro&#8230;&#8221; y por supuesto se ha convertido  en la estrella de la excursión. Comprobamos que va bien de velocidad, va  bien de distancia, va bien de&#8230;<strong>todo</strong>, este aparato funciona a la  primera y sin libro de instrucciones.</p>
<div id=":dl">Llegamos a Dílar, disfrute de su agua, de sus vistas, de sus caminos,  pasamos por debajo del nogal y ya estamos en el río. ¡Podrían haber  dejado algo sin asfalto para los nostálgicos de la arenilla suelta y el  rachazo fácil!, así que toca poner la suspensión bien blanda y en menos  de nada estamos arriba del todo, hoy no podemos beber agua de nuestra  fuente favorita, pero ver el rio a tope de agua conforta y relaja, como  siempre mogollón de gente andando, con el perro suelto y ciclistas (ojo,  que vimos a una chica y esto merece un punto de atención). <em>En este  momento nos damos cuenta que hay caminos, excursiones y rutas que son  buenas aunque sea la enésima vez que las hagas, y subir al río es de lo  mejor que podemos realizar en menos de 2 horas.</em></div>
<div></div>
<div></div>
<p><iframe frameBorder="0" src="http://es.wikiloc.com/wikiloc/spatialArtifacts.do?event=view&#038;id=984085&#038;measures=off&#038;title=off&#038;near=off&#038;images=off&#038;maptype=S" width="500px" height="400px"></iframe></p>
<div><em> </em><br />
A la vuelta, empiezan los percances:</p>
<ul>
<li> Un mosquito del tamaño de un  747 decide aterrizar en el ojo derecho de uno de nosotros.</li>
<li>Se  avería el cuentakilómetros (no el maxifunción que va de cine) que  por  supuesto es arreglado en un periquete.</li>
<li>Cuando llegamos a Dílar de vuelta noto que la rueda de atrás va   desinflándose poco a poco, pero cuando es inevitable que debe ser   hinchada paramos en la gasolinera y la pongo a tope, como siempre, los   pinchazos son por rachas y nos iremos preparando para lo que venga, otra   cosa que no me gusta es ver el maldito pincho en la rueda, NUNCA SE   DEBE QUITAR aunque esté ahí diciéndome ¡Sácame! porque una vez que lo  quites la rueda ya no se desinflará poco a poco, sino rápidamente.</li>
</ul>
<p>Hasta otra&#8230;</p></div>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2010/06/23/rio-dilar-pinchazo-de-vuelta/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

