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

<channel>
	<title>Poesía binaria</title>
	<atom:link href="http://totaki.com/poesiabinaria/feed/" rel="self" type="application/rss+xml" />
	<link>http://totaki.com/poesiabinaria</link>
	<description>Programación, Tecnología y Software Libre</description>
	<pubDate>Wed, 01 Sep 2010 09:23:22 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Jugando con ImageMagick (II): Color y rotación</title>
		<link>http://totaki.com/poesiabinaria/2010/09/jugando-con-imagemagick-ii-color-y-rotacion/</link>
		<comments>http://totaki.com/poesiabinaria/2010/09/jugando-con-imagemagick-ii-color-y-rotacion/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 09:23:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Imagen Digital]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[azul]]></category>

		<category><![CDATA[canales]]></category>

		<category><![CDATA[color]]></category>

		<category><![CDATA[efectos]]></category>

		<category><![CDATA[flap]]></category>

		<category><![CDATA[flip]]></category>

		<category><![CDATA[polaroid]]></category>

		<category><![CDATA[rojo]]></category>

		<category><![CDATA[rotacion]]></category>

		<category><![CDATA[transpose]]></category>

		<category><![CDATA[transverse]]></category>

		<category><![CDATA[verde]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=620</guid>
		<description><![CDATA[




Sigo con la serie de posts sobre ImageMagick, anteriormente estuvimos viendo cómo podemos redimensionar, añadir y quitar bordes a la imagen, cambiar y ecualizar el espacio de color, añadir efectos y capturar de la pantalla. Ahora veremos más cosas relacionadas con el color:
Tocando los canales de color
Imagina que queremos aplicar un efecto sólo en un [...]]]></description>
			<content:encoded><![CDATA[<p>Sigo con la serie de posts sobre ImageMagick, <a href="http://totaki.com/poesiabinaria/2010/08/jugando-con-imagemagick-i-dimensiones-captura-color-y-efectos/">anteriormente</a> estuvimos viendo cómo podemos redimensionar, añadir y quitar bordes a la imagen, cambiar y ecualizar el espacio de color, añadir efectos y capturar de la pantalla. Ahora veremos más cosas relacionadas con el color:</p>
<h2>Tocando los canales de color</h2>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_33.jpg"><img class="alignright size-thumbnail wp-image-621" title="hamburgueson_33" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_33-150x150.jpg" alt="hamburgueson_33" width="150" height="150" /></a>Imagina que queremos aplicar un efecto sólo en un canal, por ejemplo, un efecto radial-blur sólo en el canal rojo:</p>
<blockquote><p>$ convert -channel red -radial-blur 30 hamburgueson.jpg hamburgueson_rojo.jpg</p></blockquote>
<p>Donde 30 es el radio del emborronamiento (blur) radial.</p>
<p>Pero por ejemplo, si queremos aumentar el nivel de rojo, verde, o azul (o de los tres valores) de una imagen, podemos modificar los niveles de blanco y negro de la propia imagen.</p>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/tazas.jpg"><img class="aligncenter size-full wp-image-622" title="tazas" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/tazas.jpg" alt="tazas" width="606" height="160" /></a>Para el ejemplo superior:</p>
<blockquote><p>$ convert -level 30,100% taza.jpg taza_oscura.jpg</p>
<p>$ convert -channel blue -level 0,50% taza.jpg taza_azul.jpg</p>
<p>$ convert -channel red -level 30,80% taza.jpg taza_arojo.jpg</p></blockquote>
<p>De izquierda a derecha.</p>
<p>Podemos también obtener la imagen a dos colores (blanco y negro), obtenido desde un valor umbral (valores inferiores, se representarán con negro y superiores con blanco), aunque, como veremos en el ejemplo, también podemos filtrar según el canal:</p>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/tazas1.jpg"><img class="aligncenter size-full wp-image-625" title="tazas1" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/tazas1.jpg" alt="tazas1" width="606" height="160" /></a>Para este ejemplo, hice lo siguiente:</p>
<blockquote><p>$ convert -threshold 25% taza1.jpg tazaBN.jpg</p>
<p>$ convert -channel red,blue -threshold 55% taza.jpg taza_naranja_verde.jpg</p>
<p>$ convert -channel green -threshold 75% taza_magenta.jpg</p></blockquote>
<h2>Más efectos de color</h2>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/taza_3.jpg"><img class="alignright size-thumbnail wp-image-623" title="taza_3" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/taza_3-150x150.jpg" alt="taza_3" width="150" height="150" /></a>Para conseguir el tono sepia hacemos lo siguiente:</p>
<blockquote><p>$ convert -sepia-tone [umbral] origen destino</p></blockquote>
<p>En el ejemplo hice lo siguiente:</p>
<blockquote><p>$ convert -sepia-tone 90% taza.jpg taza_sepia.jpg</p></blockquote>
<p>También disponemos del efecto posterizado (si no se aprecia bien en la miniatura, hacer click para ver en grande). Para conseguir el efecto hacemos lo siguiente:</p>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/taza_31.jpg"><img class="alignleft size-thumbnail wp-image-624" style="margin-left: 10px; margin-right: 10px;" title="taza_31" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/taza_31-150x150.jpg" alt="taza_31" width="150" height="150" /></a></p>
<blockquote><p>$ convert -posterize 4 taza.jpg taza_poster.jpg</p></blockquote>
<p>Donde 4 es el número de niveles con el que vamos a posterizar.</p>
<p>También tenemos el efecto solarizado con el siguiente comando:</p>
<blockquote><p>$ convert -solarize 2% taza.jpg taza_sol.jpg</p></blockquote>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/taza_32.jpg"><img class="alignright size-thumbnail wp-image-626" title="taza_32" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/taza_32-150x150.jpg" alt="taza_32" width="150" height="150" /></a>Donde el 2% es el umbral deseado para el efecto, que vemos en la  siguiente imagen.</p>
<p>Para completar los efectos de color, veamos también cómo podemos cambiar brillo, saturación y tono. Para controlarlo tenemos la orden:</p>
<blockquote><p>$ convert -modulate [brillo],[saturacion],[tono] origen destino</p></blockquote>
<p>Vemos en el siguiente ejemplo las imágenes con los efectos uno a uno:</p>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/tazas2.jpg"><img class="aligncenter size-full wp-image-627" title="tazas2" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/tazas2.jpg" alt="tazas2" width="606" height="160" /></a></p>
<blockquote><p># En la primera se ha modificado el tono de la imagen:</p>
<p>$ convert -modulate 100,100,142 taza.jpg taza_hue.jpg</p>
<p># En la segunda se modificó la saturación</p>
<p>$ convert -modulate 100,142,100 taza.jpg taza_sat.jpg</p>
<p># En la tercera se cambió el brillo:</p>
<p>$ convert -modulate 142,100,100 taza.jpg taza_brillo.jpg</p></blockquote>
<p>Todos estos parámetros se indican en porcentaje.</p>
<h2>Rotación y transposición</h2>
<p>Además de estos efectos de color, encontramos también algunas transformaciones de imagen</p>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/tazas3.jpg"><img class="aligncenter size-full wp-image-628" title="tazas3" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/tazas3.jpg" alt="tazas3" width="606" height="120" /></a></p>
<blockquote><p>$ convert -flip taza.jpg taza1.jpg</p>
<p>$ convert -flop taza.jpg taza2.jpg</p>
<p>$ convert -transpose taza.jpg taza3.jpg</p>
<p>$ convert -transverse taza.jpg taza4.jpg</p></blockquote>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/taza_2.jpg"><img class="size-thumbnail wp-image-629 alignright" style="margin-left: 10px; margin-right: 10px;" title="taza_2" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/taza_2-150x150.jpg" alt="taza_2" width="150" height="150" /></a></p>
<p>Para la rotación de la imagen ejecutamos lo siguiente:</p>
<blockquote><p>$ convert -rotate 40 taza.jpg taza_r.jpg</p></blockquote>
<p>Donde 40 es la cantidad de grados a rotar.</p>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/taza_33.jpg"><img class="alignleft size-thumbnail wp-image-630" style="margin-left: 10px; margin-right: 10px;" title="taza_33" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/taza_33-150x150.jpg" alt="taza_33" width="150" height="150" /></a>Para la rotación hay otra orden muy curiosa: polaroid. La podemos utilizar de la siguiente manera:</p>
<blockquote><p>$ convert -polaroid 40 taza.jpg taza_p.jpg</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2010/09/jugando-con-imagemagick-ii-color-y-rotacion/feed/</wfw:commentRss>
		</item>
		<item>
		<title>REISUB y llamadas remotas a Alt+Sysrq</title>
		<link>http://totaki.com/poesiabinaria/2010/08/reisub-y-llamadas-remotas-a-altsysrq/</link>
		<comments>http://totaki.com/poesiabinaria/2010/08/reisub-y-llamadas-remotas-a-altsysrq/#comments</comments>
		<pubDate>Sun, 29 Aug 2010 08:31:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Bash]]></category>

		<category><![CDATA[General]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[acciones]]></category>

		<category><![CDATA[congelación]]></category>

		<category><![CDATA[cuelgue]]></category>

		<category><![CDATA[estabilidad]]></category>

		<category><![CDATA[inoperativo]]></category>

		<category><![CDATA[kernel]]></category>

		<category><![CDATA[reiniciar]]></category>

		<category><![CDATA[remoto]]></category>

		<category><![CDATA[sistema]]></category>

		<category><![CDATA[sysrq]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=616</guid>
		<description><![CDATA[En muchos sitios, podemos ver esta palabra clave, para muchos RESUIB para otros RESIUB y normalmente REISUB. Y sirve para reiniciar el sistema Linux de forma segura después de que el sistema se congele; de la siguiente forma: Alt+Imprimir Pantalla + R,E,I,S,U,B (no hace falta soltar las teclas Alt + Imprimir pantalla). Cada letra representa [...]]]></description>
			<content:encoded><![CDATA[<p>En muchos sitios, podemos ver esta palabra clave, para muchos RESUIB para otros RESIUB y normalmente REISUB. Y sirve para reiniciar el sistema Linux de forma segura después de que el sistema se congele; de la siguiente forma: Alt+Imprimir Pantalla + R,E,I,S,U,B (no hace falta soltar las teclas Alt + Imprimir pantalla). Cada letra representa una acción del kernel:</p>
<ul>
<li>R (Devuelve el control al teclado unRaw)</li>
<li>E (Termina todos los procesos tErm)</li>
<li>I (Mata los procesos que queden vivos full kIll)</li>
<li>S (Sincroniza los discos Sync)</li>
<li>U (Monta todos los sistemas de archivos como sólo lectura Umount)</li>
<li>B (Reinicia el ordenador Boot)</li>
</ul>
<p>Bien, si tenemos acceso físico al ordenador, no hay problema, pero y si estamos enchufados en otra máquina ? Todo está en el fichero especial /proc/sysrq-trigger.</p>
<h2>Obteniendo información de los procesos</h2>
<p>Enviando a /proc/sysrq-trigger (como root) la letra correspondiente a la acción del kernel vale. Empezaremos pidiendo ayuda:</p>
<blockquote><p>root $ echo &#8220;h&#8221; &gt; /proc/sysrq-trigger</p>
<p>root $ dmesg | tail</p>
<p>&#8230;. # Nos dirá muchas cosas, sólo nos interesa la última línea<br />
SysRq : HELP : loglevel0-8 reBoot tErm Full kIll saK showMem Nice powerOff showPc show-all-timers(Q) unRaw Sync showTasks Unmount shoW-blocked-tasks</p></blockquote>
<p>Vemos cómo el kernel a través de dmesg se comunicará con nosotros. Cada letra mayúscula nos indicará una acción diferente, empezaremos obteniendo información sobre la memoria:</p>
<blockquote><p>root $ echo &#8220;m&#8221; &gt; /proc/sysrq-trigger</p>
<p>root $ dmesg | tail -n 35</p></blockquote>
<p>O información sobre tareas bloqueadas:</p>
<blockquote><p>root $ echo &#8220;m&#8221; &gt; /proc/sysrq-trigger</p>
<p>root $ dmesg</p></blockquote>
<h2>Más acciones</h2>
<p>Incluso podemos lanzar el<a href="http://totaki.com/poesiabinaria/2010/04/cuando-un-proceso-se-come-la-memoria-de-nuestro-sistema/"> OOM killer</a> con la siguiente línea:</p>
<blockquote><p>root $ echo &#8220;f&#8221; &gt; /proc/sysrq-trigger</p></blockquote>
<p>Terminar todos los procesos (igual que comentábamos arriba del todo):</p>
<blockquote><p>root $ echo &#8220;e&#8221; &gt; /proc/sysrq-trigger</p></blockquote>
<p>Cambia el nivel de información de dmesg (del 0 al 8):</p>
<blockquote><p>root $ echo 5 &gt; /proc/sysrq-trigger</p></blockquote>
<p>Para enviar un REISUB es algo más elaborado:</p>
<blockquote><p>root $ nohup bash -c &#8220;for key in s u b; do echo \$key &gt;  /proc/sysrq-trigger; sleep 4; done&#8221;</p></blockquote>
<p>Aunque tendremos que asegurarnos de  que las tareas estén muertas, ya que, nuestra conexión ssh, o nuestro  terminal, o incluso bash, se mueren al mandar un E o un I al kernel  (dando igual el nohup). Por otra parte, la R la podemos quitar, ya que  vale para devolver el control al teclado, y estamos desde un equipo  remoto.</p>
<h2>Seguridad</h2>
<p>Pero tanto por nosotros mismos (debemos de protegernos de meter la pata), como los posibles usuarios del ordenador, tal vez no nos interese que puedan pulsar en teclado alguna combinación de teclas que comprometa al kernel. Para ello, tenemos  /proc/sys/kernel/sysrq o directamente el comando sysctl del cual modificamos la propiedad kernel.sysrq; lo haremos de la siguiente manera:</p>
<blockquote><p>root $ sysctl kernel.sysrq=0 # Para desactivar Alt+SysRq</p>
<p>root $ sysctl kernel.sysrq=1 # Para activarlo</p></blockquote>
<p>Se pueden activar algunos comandos sólo, dependiendo del número que se indique.</p>
]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2010/08/reisub-y-llamadas-remotas-a-altsysrq/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Jugando con ImageMagick (I): Dimensiones, captura, color y efectos</title>
		<link>http://totaki.com/poesiabinaria/2010/08/jugando-con-imagemagick-i-dimensiones-captura-color-y-efectos/</link>
		<comments>http://totaki.com/poesiabinaria/2010/08/jugando-con-imagemagick-i-dimensiones-captura-color-y-efectos/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 10:02:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Imagen Digital]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[aspecto]]></category>

		<category><![CDATA[azul]]></category>

		<category><![CDATA[blur]]></category>

		<category><![CDATA[borde]]></category>

		<category><![CDATA[captura]]></category>

		<category><![CDATA[cmyk]]></category>

		<category><![CDATA[color]]></category>

		<category><![CDATA[ecualización]]></category>

		<category><![CDATA[escalado]]></category>

		<category><![CDATA[espacios]]></category>

		<category><![CDATA[gris]]></category>

		<category><![CDATA[hsl]]></category>

		<category><![CDATA[imagenes]]></category>

		<category><![CDATA[jpeg]]></category>

		<category><![CDATA[manipulacion]]></category>

		<category><![CDATA[movimiento]]></category>

		<category><![CDATA[recortar]]></category>

		<category><![CDATA[redimensionado]]></category>

		<category><![CDATA[rgb]]></category>

		<category><![CDATA[rojo]]></category>

		<category><![CDATA[texto]]></category>

		<category><![CDATA[ventana]]></category>

		<category><![CDATA[verde]]></category>

		<category><![CDATA[wmctrl]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=604</guid>
		<description><![CDATA[A menudo es necesario hacer una manipulación básica de imágenes y da mucha pereza ejecutar GIMP u otro editor de imágenes para una tontería; e incluso a veces necesitamos modificar gran cantidad de imágenes y necesitamos automatizar el proceso:
Ejecución
Aunque ImageMagick, que seguro que lo encontráis en los repositorios de vuestra distribución favorita, da mucho más [...]]]></description>
			<content:encoded><![CDATA[<p>A menudo es necesario hacer una manipulación básica de imágenes y da mucha pereza ejecutar GIMP u otro editor de imágenes para una <em>tontería;</em> e incluso a veces necesitamos modificar gran cantidad de imágenes y necesitamos automatizar el proceso:</p>
<h2>Ejecución</h2>
<p>Aunque ImageMagick, que seguro que lo encontráis en los repositorios de vuestra distribución favorita, da mucho más de sí, aquí veremos ejemplos con <strong>convert</strong>, <strong>import</strong> y <strong>mogrify</strong></p>
<h2>Redimensionado de imágenes</h2>
<blockquote><p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_2.jpg"><img class="alignright size-thumbnail wp-image-605" title="hamburgueson_2" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_2-150x150.jpg" alt="hamburgueson_2" width="150" height="150" /></a>$ convert -resize [dimensión/porcentaje] origen destino</p></blockquote>
<p>Por ejemplo para redimensionar con un ancho de 320 pixels:</p>
<blockquote><p>$ convert -resize 320 hamburgueson.jpg hamburgueson_mini.jpg</p></blockquote>
<p>De esta forma, si especificamos la altura, se ignorará, ya que convert intentará mantener el aspecto de la imagen.</p>
<p>También podemos imponer la altura y que se calcule automáticamente el ancho:</p>
<blockquote><p>$ convert -resize x500 hamburgueson.jpg hamburgueson_mini.jpg</p></blockquote>
<p>O si queremos, podemos también redimensionar con un porcentaje del tamaño original:</p>
<blockquote><p>$ convert -resize 40% hamburgueson.jpg hamburgueson_mini.jpg</p></blockquote>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_21.jpg"><img class="alignright size-thumbnail wp-image-606" title="hamburgueson_21" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_21-150x150.jpg" alt="hamburgueson_21" width="202" height="150" /></a>También es posible la redimensión sin mantener el aspecto (relación ancho/alto) de la siguiente forma:</p>
<blockquote><p>$ convert -resize \!600&#215;300 hamburgueson.jpg hamburgueson_deforme.jpg</p></blockquote>
<p>Y esto mismo, también por porcentaje:</p>
<blockquote><p>$ convert -resize \!100&#215;30% hamburgueson.jpg hamburgueson_deforme.jpg</p></blockquote>
<h2>Capturando el escritorio</h2>
<p>Puede que nuestro entorno preferido de escritorio no venga con esta funcionalidad, o incluso que estemos desde una máquina remota y queramos ver lo que pasa en el escritorio, una captura de pantalla no viene mal. Para ello podemos hacer lo siguiente:</p>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/screenshot-26-08-2010-100842.jpg"><img class="alignleft size-thumbnail wp-image-607" style="margin: 10px;" title="screenshot-26-08-2010-100842" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/screenshot-26-08-2010-100842-150x150.jpg" alt="screenshot-26-08-2010-100842" width="150" height="150" /></a></p>
<blockquote><p>$ import -window root captura.jpg</p></blockquote>
<p>O si queremos capturar una ventana en especial:</p>
<blockquote><p>$ import ventana.jpg</p></blockquote>
<p>Nos aparecerá un puntero especial que nos permitirá seleccionar la ventana a capturar.</p>
<p>O si queremos capturar una ventana en especial sin necesidad de hacer click (muy útil si estamos en un equipo remoto):</p>
<blockquote><p>$ import -window &#8220;Titulo de la ventana&#8221; ventana.jpg</p></blockquote>
<p>También podemos sacar el ID de la ventana con:</p>
<blockquote><p>$ wmctrl -l</p></blockquote>
<p>Y poner en lugar del título, el ID. Es necesario que nos encontremos en el mismo escritorio de la ventana para hacer la captura. Cómo podemos hacer eso remotamente ?</p>
<blockquote><p>$ wmctrl -l # Nos dirá en la segunda columna el escritorio donde está la ventana</p>
<p>$ wmctrl -s [numero] # Saltaremos al escritorio [numero], el primero es el cero.</p></blockquote>
<h2>Espacios de color</h2>
<p>Podemos cambiar el formato del color de forma rápida usando <strong>colorspaces</strong>, dependiendo del formato de salida y la forma en la que la imagen será utilizada, para vídeo, por ejemplo. Aunque también tenemos algunos espacios interesantes como:<a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_3.jpg"><img class="alignright size-thumbnail wp-image-608" title="hamburgueson_3" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_3-150x150.jpg" alt="hamburgueson_3" width="150" height="150" /></a></p>
<blockquote><p>$ convert -colorspace gray hamburgueson.jpg hamburgueson_gris.jpg</p></blockquote>
<p>El tono de gris estará calculado para adecuarse al ojo humano: Gris = 0.299*Rojo+0.587*Verde+0.114*Azul</p>
<p>Aunque también podremos transformar a YUV, XYZ, LAB, HSL, etc; también necesitamos que el formato de salida sea compatible con esos espacios de color. Para ver una lista de todos los colorspaces disponibles:</p>
<blockquote><p>$ covert -list colorspace</p></blockquote>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_31.jpg"><img class="alignright size-thumbnail wp-image-612" title="hamburgueson_31" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_31-150x150.jpg" alt="hamburgueson_31" width="150" height="150" /></a>También podemos ecualizar la imagen con respecto a los diferentes espacios de color de la siguiente forma:</p>
<blockquote><p>$ convert -colorspace [espacio] -equalize origen destino</p></blockquote>
<p>En el ejemplo:</p>
<blockquote><p>$ convert -colorspace hsl -equalice hamburgueson.jpg hamburgueson_hsl.jpg</p></blockquote>
<p>Y si no queremos decir el colorspace, usaremos el actual de la imagen:</p>
<blockquote><p>$ convert -equalize hamburgueson.jpg hamburgueson_e.jpg</p></blockquote>
<h2>Recortar imágenes</h2>
<p>Es más cómodo hacerlo con el ratón, pero en ocasiones querremos <a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_4.jpg"><img class="alignright size-thumbnail wp-image-609" title="hamburgueson_4" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_4-150x150.jpg" alt="hamburgueson_4" width="150" height="150" /></a>automatizar el proceso, y podemos hacerlo de la siguiente forma:</p>
<blockquote><p>$ convert -crop [ancho]x[alto]+[x]+[y]</p></blockquote>
<p>Por ejemplo lo siguiente:</p>
<blockquote><p>$ convert -crop 300&#215;300+100+100</p></blockquote>
<p>Creará una imagen de 300&#215;300 y empezará a partir del punto 100&#215;100 (desde la izquierda/arriba).</p>
<h2>Bordes</h2>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_41.jpg"><img class="alignright size-thumbnail wp-image-610" title="hamburgueson_41" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_41-150x150.jpg" alt="hamburgueson_41" width="150" height="150" /></a>Para añadir un borde podemos hacer lo siguiente:</p>
<blockquote><p>$ convert -bordercolor [color] -border [ancho]x[alto] origen destino</p></blockquote>
<p>En el ejemplo tenemos:</p>
<blockquote><p>$ convert -bordercolor black -border 10&#215;10 hamburgueson.jpg hamburgueson_borde.jpg</p></blockquote>
<p>Para especificar el color podemos hacerlo de varias formas:</p>
<blockquote><p>$ convert -bordercolor black/red/green/blue&#8230; # Por su nombre. Si queremos saber los nombres de color disponibles:</p>
<p>$ convert -list color</p>
<p>$ convert -bordercolor &#8220;#aacc11&#8243; # Por su equivalente hexadecimal</p>
<p>$ convert -bordercolor &#8220;rgb(100,150,200)&#8221; # En función de sus valores RGB</p>
<p>$ convert -bordercolor &#8220;hsl(100,150,200)&#8221; # En función de sus valores HSL</p>
<p>$convert -bordercolor &#8220;cmyk(100,200,150,230)&#8221; # En función de sus valores CMYK</p>
<p>&#8230; etcétera&#8230; tantos formatos como espacios de color.</p></blockquote>
<p>Ahora bien, queremos quitar el reborde añadido:</p>
<blockquote><p>$ convert -trim hamburgueson_borde.jpg hamburgueson_nuevo.jpg</p></blockquote>
<p>Pero es posible que por la compresión jpeg no se detecte bien el borde (es una compresión con pérdida de calidad, y se modifica la imagen; para nosotros el borde es negro, pero para el ordenador hay muchos tonos de negro), entonces podemos hacer lo siguiente:</p>
<blockquote><p>$ convert -fuzz 10% -trim hamburgueson_borde.jpg hamburgueson_nuevo.jpg</p></blockquote>
<p>Con esto damos una tolerancia de un 10% al color, es decir, si se parecen los tonos de negro en menos de un 10% serán considerados iguales.</p>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_42.jpg"><img class="alignright size-thumbnail wp-image-611" title="hamburgueson_42" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_42-150x150.jpg" alt="hamburgueson_42" width="150" height="150" /></a>También podemos añadir un biselado como el del ejemplo de la siguiente manera:</p>
<blockquote><p>$ convert -mattecolor red -frame 20&#215;20+10+10 hamburgueson.jpg hamburgueson_rojo.jpg</p></blockquote>
<h2></h2>
<h2>Filtros y efectos</h2>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_32.jpg"><img class="alignright size-thumbnail wp-image-613" title="hamburgueson_32" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/hamburgueson_32-150x150.jpg" alt="hamburgueson_32" width="150" height="150" /></a>Por si fuera poco, podemos aplicar los filtros típicos a las imágenes como blur, motion-blur, blur gaussiano (gaussian-blur), ruido (noise), carboncillo (charcoal).</p>
<p>En el ejemplo, se ha añadido motion-blur de la siguiente forma:</p>
<blockquote><p>$ convert -motion-blur 10&#215;40+10+0 hamburgueson.jpg hamburgueson_movido.jpg</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2010/08/jugando-con-imagemagick-i-dimensiones-captura-color-y-efectos/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Creando macros de escritorio I: xmacroplay</title>
		<link>http://totaki.com/poesiabinaria/2010/08/creando-macros-de-escritorio-i-xmacroplay/</link>
		<comments>http://totaki.com/poesiabinaria/2010/08/creando-macros-de-escritorio-i-xmacroplay/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 10:47:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[grabacion]]></category>

		<category><![CDATA[macros]]></category>

		<category><![CDATA[programacion]]></category>

		<category><![CDATA[raton]]></category>

		<category><![CDATA[reproducción]]></category>

		<category><![CDATA[servidor]]></category>

		<category><![CDATA[teclado]]></category>

		<category><![CDATA[X]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=600</guid>
		<description><![CDATA[Voy a hablar de dos programas para crear macros, aunque hay más, claro que sí. Los dos programas están basados en la grabación de acciones del servidor X y la simulación de movimientos del ratón, clicks y acciones de teclado.
En principio xmacroplay; lo podemos ejecutar así:
$ xmacrorec2 > mi_macro
donde mi_macro es el archivo donde vamos [...]]]></description>
			<content:encoded><![CDATA[<p>Voy a hablar de dos programas para crear macros, aunque hay más, claro que sí. Los dos programas están basados en la grabación de acciones del servidor X y la simulación de movimientos del ratón, clicks y acciones de teclado.</p>
<p>En principio xmacroplay; lo podemos ejecutar así:</p>
<blockquote><p>$ xmacrorec2 > mi_macro</p></blockquote>
<p>donde mi_macro es el archivo donde vamos a grabar; este archivo, si vemos su contenido tendrá los comandos en un lenguaje muy sencillo e inteligible, lo que nos permite crear macros directamente programándolos, no grabándolos.<br />
Lo primero que debemos hacer tras ejecutar xmacrorec2 es pulsar una tecla, ésta tecla será la que deberemos pulsar para detener la grabación.</p>
<p>Para ejecutar las macros, lo podemos hacer de la siguiente forma:</p>
<blockquote><p>$ xmacroplay :0 < mi_macro</p></blockquote>
<p>donde :0 es la pantalla, el DISPLAY y mi_macro es el nombre de la macro.</p>
<p>Aunque, al menos en la versión 20000911, la última descargable desde sf.net (del año 2001, un poco antigua), se lleva un poco mal con los arrastres de ratón; vamos para hacer macros con clicks bien, pero cuando arrastramos algo, a veces no se reproducen bien las opciones. Se debe a un bug en xmacroplay.cpp, en las siguientes líneas dentro de la función eventLoop(), hay que añadir el código que tiene comentario</p>
<div class="codecolorer-container cpp " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="cpp codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy3">!</span>strcasecmp<span class="br0">&#40;</span><span class="st0">&quot;ButtonPress&quot;</span>,ev<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">cin</span> <span class="sy1">&gt;&gt;</span> b<span class="sy4">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;ButtonPress: &quot;</span> <span class="sy1">&lt;&lt;</span> b <span class="sy1">&lt;&lt;</span> endl<span class="sy4">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XTestFakeButtonEvent <span class="br0">&#40;</span> RemoteDpy, b, <span class="kw2">True</span>, Delay <span class="br0">&#41;</span><span class="sy4">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XFlush <span class="br0">&#40;</span> RemoteDpy <span class="br0">&#41;</span><span class="sy4">;</span> <span class="coMULTI">/* AÑADIR */</span><br />
<span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy3">!</span>strcasecmp<span class="br0">&#40;</span><span class="st0">&quot;ButtonRelease&quot;</span>,ev<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">cin</span> <span class="sy1">&gt;&gt;</span> b<span class="sy4">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;ButtonRelease: &quot;</span> <span class="sy1">&lt;&lt;</span> b <span class="sy1">&lt;&lt;</span> endl<span class="sy4">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XTestFakeButtonEvent <span class="br0">&#40;</span> RemoteDpy, b, <span class="kw2">False</span>, Delay <span class="br0">&#41;</span><span class="sy4">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XFlush <span class="br0">&#40;</span> RemoteDpy <span class="br0">&#41;</span><span class="sy4">;</span><span class="coMULTI">/* AÑADIR */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></td></tr></tbody></table></div>
<p>Con esta modificación todo debe ir bien, podemos, por ejemplo programar ciertas teclas en nuestro ordenador para automáticamente grabar y reproducir macros de teclado y ratón.</p>
<p>Aunque como dije antes, siempre podemos programar nosotros las macros a mano, o modificar lo que hemos grabado para un mejor comportamiento con los siguientes comandos:</p>
<ul>
<li>MotionNotify X Y : Mueve el rató a un punto X,Y de la pantalla</li>
<li>ButtonPress N : Pulsa el botón N del ratón (1=izquierdo, 2=rerecho, 3=centro, 4,5=rueda del ratón en algunos sistemas, etc)</li>
<li>Delay N : Retrasa el script N segundos, deteniendo su ejecución un tiempo</li>
<li>ButtonRelease N : Suelta el botón N del ratón</li>
<li>KeyCodePress C : Pulsa la tecla con el código C (podemos usar xev para ver los códigos de teclas)</li>
<li>KeyCodeRelease C : Suelta la tecla con el código C</li>
<li>KeyStrPress S : Pulsa la tecla llamada S (Es el nombre de forma de cadena de caracteres, por ejemplo &#8220;Escape&#8221;, &#8220;F5&#8243;, &#8220;Control_L&#8221;, etc; podemos utilizar xev para ver los nombres también)</li>
<li>KeyStrRelease S : Suelta la tecla llamada S</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2010/08/creando-macros-de-escritorio-i-xmacroplay/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Colores para stdin y stderr</title>
		<link>http://totaki.com/poesiabinaria/2010/08/colores-para-stdin-y-stderr/</link>
		<comments>http://totaki.com/poesiabinaria/2010/08/colores-para-stdin-y-stderr/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 09:13:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=598</guid>
		<description><![CDATA[Esto fue parte de un experimento que hice, se trata de conseguir que tras la ejecución de un comando la salida estándar del mismo se representara en color verde en mi terminal y la salida de error en color rojo (por supuesto podemos dejar sólo la salida de error en rojo), pero el hecho es [...]]]></description>
			<content:encoded><![CDATA[<p>Esto fue parte de un experimento que hice, se trata de conseguir que tras la ejecución de un comando la salida estándar del mismo se representara en color verde en mi terminal y la salida de error en color rojo (por supuesto podemos dejar sólo la salida de error en rojo), pero el hecho es demostrar que estos dos tipos de salida existen y hay forma de distinguirlas:</p>
<blockquote><p>$ comando <strong>2> >(while read line; do echo -e &#8220;\e[01;31m$line\e[0m&#8221;; done)</strong> <em>1> >(while read line; do echo -e &#8220;\e[01;32m$line\e[0m&#8221;; done)</em></p></blockquote>
<p>En negrita está la redirección para la salida de error, y en cursiva la redirección para la salida estándar. La hemos hecho con códigos ANSI, y podemos encontrar una referencia de colores en: <a href="http://totaki.com/poesiabinaria/2009/05/colores-y-posicionamiento-en-terminales-linux-como-conioh-en-dos/">Colores y posicionamiento en terminales Linux (como conio.h en DOS)<br />
</a>.</p>
<p>Aunque como una referencia rápida incluiré: 31 rojo,  32 verde, 33 amarillo, 34 azul, 35 magenta, 36 cyan, 37 blanco. Y éste será el color a incluir en: echo -e &#8220;\e[01;<strong>32</strong>m$line\e[0m&#8221;;</p>
]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2010/08/colores-para-stdin-y-stderr/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Login a Facebook y acceso a aplicación automatizado</title>
		<link>http://totaki.com/poesiabinaria/2010/08/login-a-facebook-y-acceso-a-aplicacion-automatizado/</link>
		<comments>http://totaki.com/poesiabinaria/2010/08/login-a-facebook-y-acceso-a-aplicacion-automatizado/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 09:21:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Comunicación]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[facebook]]></category>

		<category><![CDATA[acceso]]></category>

		<category><![CDATA[aplicación]]></category>

		<category><![CDATA[identificacion]]></category>

		<category><![CDATA[publicación]]></category>

		<category><![CDATA[red]]></category>

		<category><![CDATA[social]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=596</guid>
		<description><![CDATA[A medida que va creciendo Facebook, los desarrolladores van siendo más imaginativos a la hora de crear aplicaciones que trabajen sobre esta red. Actualmente existen clientes para Facebook que no necesitan que estemos dentro de la página, y lo que presento a continuación es un pequeño ejemplo de todo ello.
Este script es parte investigación / [...]]]></description>
			<content:encoded><![CDATA[<p>A medida que va creciendo Facebook, los desarrolladores van siendo más imaginativos a la hora de crear aplicaciones que trabajen sobre esta red. Actualmente existen clientes para Facebook que no necesitan que estemos dentro de la página, y lo que presento a continuación es un pequeño ejemplo de todo ello.</p>
<p>Este script es parte investigación / parte navegación y lectura de foros en los que no he encontrado la respuesta exacta a mis necesidades. El problema está en que, a pesar de la existencia de Facebook Connect, si queremos automatizar tareas en Facebook tenemos que estar identificados en el sistema y entonces es cuando podemos hacer la tarea en cuestión.</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<br />
<span class="re0">$face_cookie</span><span class="sy0">=</span><span class="st_h">'/tmp/fcbk_cookie'</span><span class="sy0">;</span><br />
<span class="re0">$useragent</span><span class="sy0">=</span><span class="st0">&quot;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3&quot;</span><span class="sy0">;</span><br />
<span class="re0">$login_email</span><span class="sy0">=</span><span class="st_h">'*************'</span><span class="sy0">;</span><br />
<span class="re0">$login_pass</span><span class="sy0">=</span><span class="st_h">'**************'</span><span class="sy0">;</span><br />
<br />
<span class="kw2">function</span> curl_load_url<span class="br0">&#40;</span><span class="re0">$url</span><span class="sy0">,</span> <span class="sy0">&amp;</span><span class="re0">$error</span><span class="sy0">,</span> <span class="re0">$postfields</span><span class="sy0">=</span><span class="kw2">false</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <a href="http://www.php.net/global"><span class="kw3">global</span></a> <span class="re0">$useragent</span><span class="sy0">,</span> <span class="re0">$face_cookie</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$cu</span> <span class="sy0">=</span> curl_init<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; curl_setopt<span class="br0">&#40;</span><span class="re0">$cu</span><span class="sy0">,</span> CURLOPT_URL<span class="sy0">,</span> <span class="re0">$url</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; curl_setopt<span class="br0">&#40;</span><span class="re0">$cu</span><span class="sy0">,</span> CURLOPT_HEADER<span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; curl_setopt<span class="br0">&#40;</span><span class="re0">$cu</span><span class="sy0">,</span> CURLOPT_FOLLOWLOCATION<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; curl_setopt<span class="br0">&#40;</span><span class="re0">$cu</span><span class="sy0">,</span> CURLOPT_SSL_VERIFYPEER<span class="sy0">,</span> <span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; curl_setopt<span class="br0">&#40;</span><span class="re0">$cu</span><span class="sy0">,</span> CURLOPT_RETURNTRANSFER<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; curl_setopt<span class="br0">&#40;</span><span class="re0">$cu</span><span class="sy0">,</span> CURLOPT_USERAGENT<span class="sy0">,</span> <span class="re0">$useragent</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; curl_setopt<span class="br0">&#40;</span><span class="re0">$cu</span><span class="sy0">,</span> CURLOPT_COOKIEJAR<span class="sy0">,</span> <span class="re0">$face_cookie</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; curl_setopt<span class="br0">&#40;</span><span class="re0">$cu</span><span class="sy0">,</span> CURLOPT_COOKIEFILE<span class="sy0">,</span> <span class="re0">$face_cookie</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$postfields</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; curl_setopt<span class="br0">&#40;</span><span class="re0">$cu</span><span class="sy0">,</span> CURLOPT_POSTFIELDS<span class="sy0">,</span> <span class="re0">$postfields</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; curl_setopt<span class="br0">&#40;</span><span class="re0">$cu</span><span class="sy0">,</span> CURLOPT_POST<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; <span class="re0">$cont</span><span class="sy0">=</span>curl_exec<span class="br0">&#40;</span><span class="re0">$cu</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$error</span><span class="sy0">=</span>curl_errno<span class="br0">&#40;</span><span class="re0">$cu</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; curl_close<span class="br0">&#40;</span><span class="re0">$cu</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">return</span> <span class="re0">$cont</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw2">function</span> fb_login<span class="br0">&#40;</span><span class="re0">$email</span><span class="sy0">,</span> <span class="re0">$passwd</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="re0">$error</span><span class="sy0">=</span><span class="kw2">false</span><span class="sy0">;</span><br />
&nbsp; curl_load_url<span class="br0">&#40;</span><span class="st_h">'http://login.facebook.com/login.php'</span><span class="sy0">,</span> <span class="re0">$error</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="re0">$ch_test</span><span class="sy0">=</span><span class="st_h">'&amp;euro;,&amp;acute;,€,´,水,Д,Є'</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$postfields</span><span class="sy0">=</span><span class="st_h">'cuarset_test='</span><span class="sy0">.</span><a href="http://www.php.net/urlencode"><span class="kw3">urlencode</span></a><span class="br0">&#40;</span><span class="re0">$ch_test</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st_h">'&amp;locale=es_ES&amp;email='</span><span class="sy0">.</span><a href="http://www.php.net/urlencode"><span class="kw3">urlencode</span></a><span class="br0">&#40;</span><span class="re0">$email</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st_h">'&amp;pass='</span><span class="sy0">.</span><a href="http://www.php.net/urlencode"><span class="kw3">urlencode</span></a><span class="br0">&#40;</span><span class="re0">$passwd</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st_h">'&amp;pass_placeholder=&amp;cuarset_test='</span><span class="sy0">.</span><a href="http://www.php.net/urlencode"><span class="kw3">urlencode</span></a><span class="br0">&#40;</span><span class="re0">$ch_test</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$cont</span><span class="sy0">=</span>curl_load_url<span class="br0">&#40;</span><span class="st_h">'https://login.facebook.com/login.php?login_attempt=1'</span><span class="sy0">,</span> <span class="re0">$error</span><span class="sy0">,</span> <span class="re0">$postfields</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp;<span class="coMULTI">/* Si hay un error de cURL lo decimos */</span><br />
&nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$error</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp;<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st_h">'Error (cURL): '</span><span class="sy0">.</span><span class="re0">$error</span><span class="sy0">.</span><span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span><br />
<br />
&nbsp;<span class="coMULTI">/* Esta palabra *login_attempt* aparece en los intentos de login de Facebook */</span><br />
&nbsp;<span class="coMULTI">/* es raro que en la página principal salga. */</span><br />
&nbsp;<span class="coMULTI">/* Podemos también, verificar si está el enlace a editaccount.php para decir */</span><br />
&nbsp;<span class="coMULTI">/* que hemos sido identificados correctamente */</span><br />
&nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/strpos"><span class="kw3">strpos</span></a><span class="br0">&#40;</span><span class="re0">$cont</span><span class="sy0">,</span> <span class="st_h">'login_attempt'</span><span class="br0">&#41;</span><span class="sy0">!==</span><span class="kw2">false</span><span class="br0">&#41;</span><br />
<span class="coMULTI">/* &nbsp;if (strpos($cont, 'editaccount.php')===false) */</span><br />
&nbsp; &nbsp;<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st_h">'Error (Facebook): E-mail o contraseña incorrecto'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp;<span class="re0">$err</span><span class="sy0">=</span><span class="nu0">1</span><span class="sy0">;</span><br />
&nbsp; &nbsp;<span class="br0">&#125;</span><br />
&nbsp;<span class="coMULTI">/* Si no hay errores nos daremos por identificados, aunque si el password es incorrecto */</span><br />
&nbsp;<span class="kw1">return</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$err</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw1">if</span> <span class="br0">&#40;</span>fb_login<span class="br0">&#40;</span><span class="re0">$login_email</span><span class="sy0">,</span><span class="re0">$login_pass</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; <span class="re0">$error</span><span class="sy0">=</span><span class="kw2">false</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$cont</span> <span class="sy0">=</span> curl_load_url<span class="br0">&#40;</span><span class="st_h">'http://apps.facebook.com/minutofilosofico/'</span><span class="sy0">,</span> <span class="re0">$error</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="co1">// Mostramos el contenido de la página</span><br />
&nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$cont</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<span class="sy1">?&gt;</span></div></td></tr></tbody></table></div>
<p>¿Qué aplicaciones prácticas puede tener esto? Podemos hacer fácilmente un programa de escritorio para manejar Facebook, enviarnos por e-mail o un sms automáticamente si alguien que esperamos nos escribe, subir fotos de forma más rápida con un script en nuestro ordenador&#8230; o publicar un mensaje a la hora que hayamos especificado.</p>
<p>Como el ejemplo está en cURL será fácil portarlo a otro lenguaje con el que os sintáis más cómodos.</p>
]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2010/08/login-a-facebook-y-acceso-a-aplicacion-automatizado/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Intercalar 2 ó más cadenas en PHP</title>
		<link>http://totaki.com/poesiabinaria/2010/08/intercalar-2-o-mas-cadenas-en-php/</link>
		<comments>http://totaki.com/poesiabinaria/2010/08/intercalar-2-o-mas-cadenas-en-php/#comments</comments>
		<pubDate>Mon, 09 Aug 2010 08:23:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[cadenas]]></category>

		<category><![CDATA[caracteres]]></category>

		<category><![CDATA[clave]]></category>

		<category><![CDATA[contraseña]]></category>

		<category><![CDATA[hash]]></category>

		<category><![CDATA[intercalar]]></category>

		<category><![CDATA[jugar]]></category>

		<category><![CDATA[mensaje]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=592</guid>
		<description><![CDATA[A la hora de crear un hash para una contraseña, es conveniente no incluir sólo la contraseña, sino concatenar una cadena o un número más; lo mismo cuando generamos claves para que interaccionen aplicaciones en varios servidores; aunque hay veces en que, dados los pocos datos de que disponemos a la hora de generar la [...]]]></description>
			<content:encoded><![CDATA[<p>A la hora de crear un hash para una contraseña, es conveniente no incluir sólo la contraseña, sino concatenar una cadena o un número más; lo mismo cuando generamos claves para que interaccionen aplicaciones en varios servidores; aunque hay veces en que, dados los pocos datos de que disponemos a la hora de generar la clave, no tenemos mucho donde elegir a la hora de crear el hash.</p>
<p>Por ese motivo se me ocurrió esta función en PHP, lo que hace es intercalar cadenas, es decir, tenemos dos cadenas, y queremos generar una cadena a partir de las dos anteriores, podemos coger un carácter de una, otro de otra, y así sucesivamente (como si estuviéramos barajando) hasta formar una cadena cuya longitud es la suma de las dos. Por ejemplo si tenemos las palabras &#8220;<strong>poesia</strong>&#8221; y &#8220;<span style="text-decoration: underline;">binaria</span>&#8220;, resultaría la cadena: <strong>p</strong><span style="text-decoration: underline;">b</span><strong>o</strong><span style="text-decoration: underline;">i</span><strong>e</strong><span style="text-decoration: underline;">n</span><strong>s</strong><span style="text-decoration: underline;">a</span><span style="text-decoration: underline;">i</span><strong>ra</strong><span style="text-decoration: underline;">ia</span> .</p>
<p>Aunque, ya que vamos a hacer algo así, ¿ por qué limitarlo ? Hagamos una función que soporte una cantidad indeterminada de cadenas:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">function</span> intercalar<span class="br0">&#40;</span><span class="re0">$cadenas</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="re0">$n_cadenas</span> <span class="sy0">=</span> <a href="http://www.php.net/count"><span class="kw3">count</span></a> <span class="br0">&#40;</span><span class="re0">$cadenas</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$n_cadenas</span><span class="sy0">==</span><span class="nu0">1</span><span class="br0">&#41;</span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* Si sólo hay una cadena, la devolvemos */</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$cadenas</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="coMULTI">/* Contamos los caracteres de cada cadena y los almacenamos en un array */</span><br />
&nbsp; <span class="re0">$chars_cadena</span><span class="sy0">=</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="re0">$i</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> <span class="re0">$i</span><span class="sy0">&lt;</span><span class="re0">$n_cadenas</span><span class="sy0">;</span> <span class="re0">$i</span><span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="re0">$chars_cadena</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="sy0">=</span><a href="http://www.php.net/strlen"><span class="kw3">strlen</span></a><span class="br0">&#40;</span><span class="re0">$cadenas</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="re0">$max_cadena</span> <span class="sy0">=</span> <a href="http://www.php.net/max"><span class="kw3">max</span></a> <span class="br0">&#40;</span><span class="re0">$chars_cadena</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="coMULTI">/* La cadena más larga determina cuándo paramos */</span><br />
&nbsp; <span class="re0">$res</span><span class="sy0">=</span><span class="st_h">''</span><span class="sy0">;</span><br />
&nbsp; <span class="coMULTI">/* Recorremos la longitud de cadena más larga */</span><br />
&nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="re0">$j</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> <span class="re0">$j</span><span class="sy0">&lt;</span><span class="re0">$max_cadena</span><span class="sy0">;</span> <span class="re0">$j</span><span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="coMULTI">/* Recorremos todas las cadenas */</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="re0">$i</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> <span class="re0">$i</span><span class="sy0">&lt;</span><span class="re0">$n_cadenas</span><span class="sy0">;</span> <span class="re0">$i</span><span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="coMULTI">/* Si la cadena no está terminada añadiremos el carácter a la cadena */</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$j</span><span class="sy0">&lt;</span><span class="re0">$chars_cadena</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$res</span><span class="sy0">.=</span><span class="re0">$cadenas</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="re0">$j</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; <span class="kw1">return</span> <span class="re0">$res</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> intercalar <span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&quot;Poesia&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Binaria&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Blog&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Gaspar&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Programacion&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Software&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Libre&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>La cadena resultante de este ejemplo será: <em>PBBGPSLoilaroienosofbsagpgtrirarweairaaamraecion</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2010/08/intercalar-2-o-mas-cadenas-en-php/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Cuando Thunderbird 3 no puede abrir enlaces&#8230;</title>
		<link>http://totaki.com/poesiabinaria/2010/08/cuando-thunderbird-3-no-puede-abrir-enlaces/</link>
		<comments>http://totaki.com/poesiabinaria/2010/08/cuando-thunderbird-3-no-puede-abrir-enlaces/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 08:53:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[abrir]]></category>

		<category><![CDATA[actualización]]></category>

		<category><![CDATA[Enlaces]]></category>

		<category><![CDATA[http]]></category>

		<category><![CDATA[https]]></category>

		<category><![CDATA[protocolo]]></category>

		<category><![CDATA[thunderbird]]></category>

		<category><![CDATA[upgrade]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=573</guid>
		<description><![CDATA[Sobre todo si hacemos un upgrade desde la versión 2, en muchos sistemas, algo no termina de cuajar y puede causar que cuando abrimos un enlace con nuestro gestor de correo, éste no se abra en nuestro navegador preferido.
Podemos hacer dos cosas:

Definir la aplicación con la que abrir los enlaces
Esta es la opción clásica usada [...]]]></description>
			<content:encoded><![CDATA[<p>Sobre todo si hacemos un upgrade desde la versión 2, en muchos sistemas, <em>algo no termina de cuajar</em> y puede causar que cuando abrimos un enlace con nuestro gestor de correo, éste no se abra en nuestro navegador preferido.<br />
Podemos hacer dos cosas:<br />
<a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/07/protohand.jpg"><img class="alignright size-medium wp-image-574" title="protohand" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/07/protohand-300x233.jpg" alt="protohand" width="300" height="233" /></a></p>
<h2>Definir la aplicación con la que abrir los enlaces</h2>
<p>Esta es la opción clásica usada en Thunderbird 2 y no recuerdo bien si también en la primera versión. Tenemos que hacer lo siguiente: Editar/Preferencias/Avanzado/General/Editor de configuración (para usuarios de Windows será Herramientas en lugar de Editar) y ahí buscar <strong>network.protocol-handler.app.http</strong>, y definir su valor a /usr/bin/firefox-bin (por ejemplo, debe ser la ruta y el ejecutable de nuestro navegador). Hacer lo mismo con <strong>network.protocol-handler.app.https</strong>.</p>
<p>Podemos también definir una aplicación para ftp, por ejemplo.</p>
<h2>Pedir que nos pregunte con qué programa abrirlo</h2>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/07/warn-external.jpg"><img class="alignright size-medium wp-image-575" title="warn-external" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/07/warn-external-300x242.jpg" alt="warn-external" width="300" height="242" /></a>Si no funciona lo anterior, este es el método nuevo de Thunderbird 3 y será una asociación de una aplicación al protocolo de otra forma nueva. Aunque vamos a dejar que Thunderbird actúe, sólo vamos a hacer que nos pregunte cómo abrir los enlaces. Para entrar, es lo mismo de antes: Editar/Preferencias/Avanzado/General/Editor de configuración y debemos definir el valor de <strong>network.protocol-handler.warn-external.http</strong> a true (hacer también con <strong>network.protocol-handler.warn-external.http</strong>). Como vemos en la captura de pantalla, podemos definir a true todos los valores que encontramos. De esta manera, Thunderbird nos preguntará la próxima vez que abramos un enlace con qué aplicación abrirlo.</p>
<p>Por otro lado, podremos modificar la aplicación con la que se abrirán, accediendo a Editar/Preferencias/Adjuntos y buscar <strong>http</strong> o <strong>https</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2010/08/cuando-thunderbird-3-no-puede-abrir-enlaces/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Terminal transparente para visualizar logs</title>
		<link>http://totaki.com/poesiabinaria/2010/08/terminal-transparente-para-visualizar-logs/</link>
		<comments>http://totaki.com/poesiabinaria/2010/08/terminal-transparente-para-visualizar-logs/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 08:28:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[aterm]]></category>

		<category><![CDATA[barra]]></category>

		<category><![CDATA[eterm]]></category>

		<category><![CDATA[fichero]]></category>

		<category><![CDATA[fondo]]></category>

		<category><![CDATA[kernel]]></category>

		<category><![CDATA[pantalla]]></category>

		<category><![CDATA[parametros]]></category>

		<category><![CDATA[programas]]></category>

		<category><![CDATA[terminal]]></category>

		<category><![CDATA[transparente]]></category>

		<category><![CDATA[wmctrl]]></category>

		<category><![CDATA[xrootconsole]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=588</guid>
		<description><![CDATA[Es muy de 2002/2003, aunque todavía a muchos les gusta tener un pequeño terminal transparente en el fondo para ejecutar comandos o mostrar logs u otra información importante.
Aquí comentaré algunas soluciones que he encontrado y cómo obtenerlas.
xrootconsole
Es muy ligero y rápido. Y vale para mostrar logs en xroot; el fondo es supuestamente transparente, aunque si [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/screenshot-01-08-2010-140805.jpg"><img class="alignnone size-medium wp-image-589" style="margin-left: 10px; margin-right: 10px;" title="screenshot-01-08-2010-140805" src="http://totaki.com/poesiabinaria/wp-content/uploads/2010/08/screenshot-01-08-2010-140805-300x225.jpg" alt="screenshot-01-08-2010-140805" width="300" height="225" /></a>Es muy de 2002/2003, aunque todavía a muchos les gusta tener un pequeño terminal transparente en el fondo para ejecutar comandos o mostrar logs u otra información importante.</p>
<p>Aquí comentaré algunas soluciones que he encontrado y cómo obtenerlas.</p>
<h1>xrootconsole</h1>
<p>Es muy ligero y rápido. Y vale para mostrar logs en xroot; el fondo es supuestamente transparente, aunque si cambiamos el fondo veremos que no, ya que en la ventana de xrootconsole se mantendrá el fondo anterior. Está bien para hacer el apaño, pero no lo recomiendo. La forma de ejecutar xrootconsole es:</p>
<blockquote><p>$ xrootconsole [fichero]</p></blockquote>
<p>donde fichero es el que vamos a vigilar, la visualización se actualiza automáticamente con cada cambio que se observa en el archivo. Es ideal para ver /var/log/messages.</p>
<h1>aterm</h1>
<p>Muestra un terminal transparente, con muchas opciones, y que podemos ejecutar de la siguiente manera para mostrar las últimas líneas de <em>dmesg</em> en el escritorio:</p>
<blockquote><p>$ aterm -fg black -geometry 100&#215;10+0+0 -e <strong>watch &#8211;no-title -n10 -d &#8216;dmesg | tail&#8217;</strong></p></blockquote>
<p>donde:</p>
<table style="height: 29px;" border="0" width="293">
<tbody>
<tr>
<td>-fg</td>
<td>Indica el color de las letras</td>
</tr>
<tr>
<td>-geometry</td>
<td>Indica la posición y dimensiones de la ventana: ancho x alto + x + y</td>
</tr>
<tr>
<td>-e</td>
<td>Ejecuta el comando que especificamos a continuación (La referencia del comando watch la incluyo al final del post</td>
</tr>
</tbody>
</table>
<p>Por supuesto podemos sustituir el comando que esta en negrita por lo que queramos mostrar.<br />
Aún así, de esta forma aterm nos muestra decoración de ventana, barra de scroll y no es transparente. Esto lo podemos solucionar ejecutando aterm de la siguiente manera:</p>
<blockquote><p>$ aterm -tr -bl -sb -fg black -geometry 100&#215;10+0+0 -e <strong>watch &#8211;no-title -n10 -d &#8216;dmesg | tail&#8217;</strong></p></blockquote>
<table style="height: 29px;" border="0" width="293">
<tbody>
<tr>
<td style="width: 150px;">-tr</td>
<td>Ventana transparente</td>
</tr>
<tr>
<td>-bl</td>
<td>Ventana sin borde</td>
</tr>
<tr>
<td>-sb</td>
<td>Ventana sin barra de desplazamiento (scrollbar)</td>
</tr>
</tbody>
</table>
<p>O, editando el archivo $HOME/.Xdefaults y añadiendo estas líneas</p>
<blockquote><p>aterm*transparent:true<br />
aterm*borderLess:true<br />
aterm*scrollBar:false</p></blockquote>
<p>El problema de aterm es que no admite sombra en las letras, por lo que la lectura sobre algunos fondos es algo complicada.</p>
<h1>Eterm</h1>
<p>Este emulador de terminal es el más completo y tiene más opciones, y por lo menos es el que soporta poner sombra en las letras, lo que proporciona una mejor visibilidad, y es el que aparece en la captura de pantalla que hay arriba. Para ello, lo podemos ejecutar de la siguiente forma:</p>
<blockquote><p>Eterm &#8211;buttonbar 0 &#8211;scrollbar off -f white -n dmessenger -g 211&#215;10+0+0 -O -0 -e watch &#8211;no-title -n10 -d &#8216;dmesg | tail&#8217;</p></blockquote>
<table style="height: 408px;" border="0" width="466">
<tbody>
<tr>
<td style="width: 100px;">&#8211;buttonbar 0</td>
<td>Elimina la barra de menú y botones superior</td>
</tr>
<tr>
<td>&#8211;scrollbar off</td>
<td>Elimina la barra de desplazamiento.</td>
</tr>
<tr>
<td>-f white</td>
<td>Especifica el color de las letras (blanco en este caso)</td>
</tr>
<tr>
<td>-n dmessenger</td>
<td>Especificamos el nombre de la aplicación, la llamamos <em>dmessenger</em>. Será útil más adelante.</td>
</tr>
<tr>
<td>&#8211;O (letra o)</td>
<td>Hace la ventana transparente</td>
</tr>
<tr>
<td>-0 (cero)</td>
<td>Activa algunas optimizaciones de transparencia (sobre todo para ventanas que no se moverán demasiado), desactivar esta opción si no funciona correctamente o hay fallos en la ventana.</td>
</tr>
<tr>
<td>-x</td>
<td>La pondré más adelante, elimina la decoración de la ventana y oculta el terminal de la barra de aplicaciones.</td>
</tr>
<tr>
<td>-g</td>
<td>Indica la posición y dimensiones de la ventana: ancho x alto + x + y</td>
</tr>
<tr>
<td>-e</td>
<td>Ejecuta el comando que especificamos a continuación (La referencia del comando watch la incluyo al final del post</td>
</tr>
</tbody>
</table>
<p>Aunque veremos un problema, la decoración de la ventana, para ello hay varias soluciones, dependiendo del sistema en el que trabajemos, para muchos, la solución será incluir el parámetro -x:</p>
<blockquote><p>$ Eterm -x &#8211;buttonbar 0 &#8211;scrollbar off -f white <em>-n dmessenger</em> -g 211&#215;10+0+0 -O -0 -e <strong>watch &#8211;no-title -n10 -d &#8216;dmesg | tail&#8217;</strong></p></blockquote>
<p>(en negrita aparece el comando, en cursiva un comando opcional), aunque a veces el entorno de ventanas, entre ellos Fluxbox, el que uso actualmente, no se lleva muy bien con ese modo sin decoración de ventanas, y aunque se muestra bien, la ventana aparece sobre todas las demás (on top).<br />
Para solucionar eso, nos vamos a complicar un poco la vida. Para ello, editamos el archivo $HOME/.fluxbox/apps y añadimos las siguientes líneas:</p>
<blockquote><p>[app] (name=dmessenger)<br />
[Deco]        {NONE}<br />
[Sticky]      {yes}<br />
[Layer]       {10}<br />
[end]</p></blockquote>
<p>Y a la hora de ejecutar Eterm lo hacemos de la siguiente manera:</p>
<blockquote><p>Eterm &#8211;buttonbar 0 &#8211;scrollbar off -f white -n dmessenger -g 211&#215;10+0+0 -O -0 -e <strong>watch &#8211;no-title -n10 -d &#8216;dmesg | tail&#8217;</strong> <span style="text-decoration: underline;">&amp; sleep 2 &amp;&amp; wmctrl -r dmessenger -b add,skip_taskbar</span></p></blockquote>
<p>donde ejecutamos Eterm en segundo plano (al terminar el comando con &amp;) y ejecutamos un sleep 2 (para esperar 2 segundos antes de ejecutar el siguiente comando), a continuación ejecutamos wmctrl donde,</p>
<table style="height: 29px;" border="0" width="293">
<tbody>
<tr>
<td style="width: 100px">-r dmessenger</td>
<td>Especificamos el nombre de la ventana a ocultar; en este caso <em>dmessenger</em></td>
</tr>
<tr>
<td>-b add,skip_taskbar</td>
<td>Eliminamos la aplicación Eterm de la barra de aplicaciones, si queremos que la ventana aparezca también por debajo de las demás ventanas, podemos añadir la opción <em>below</em> de la siguiente forma: -b add,skip_taskbar,below</td>
</tr>
</tbody>
</table>
<h1>dmesg</h1>
<p>En el ejemplo estamos ejecutando dmesg de la siguiente forma (con la ayuda de watch):</p>
<blockquote><p>watch &#8211;no-title -n10 -d &#8216;dmesg | tail&#8217;</p></blockquote>
<p>donde,</p>
<table style="height: 29px;" border="0" width="293">
<tbody>
<tr>
<td style="width: 100px">&#8211;no-title</td>
<td>watch introduce un título donde indica el periodo de actualización, con este modificador lo eliminamos.</td>
</tr>
<tr>
<td>-n10</td>
<td>dmesg no está cambiando continuamente, por lo que escogemos un periodo de actualización de 10segundos (podemos modificar este parámetro como queramos)</td>
</tr>
<tr>
<td>-d &#8216;dmesg | tail&#8217;</td>
<td>Obtenemos los últimos 10 mensajes del kernel, podemos incluir un modificador -n4 a tail para obtener sólo las últimas 4.</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2010/08/terminal-transparente-para-visualizar-logs/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Cumplir los plazos en el desarrollo de software</title>
		<link>http://totaki.com/poesiabinaria/2010/08/cumplir-los-plazos-en-el-desarrollo-de-software/</link>
		<comments>http://totaki.com/poesiabinaria/2010/08/cumplir-los-plazos-en-el-desarrollo-de-software/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 08:32:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Interneteando]]></category>

		<category><![CDATA[cliente]]></category>

		<category><![CDATA[plazo]]></category>

		<category><![CDATA[presupuesto]]></category>

		<category><![CDATA[programacion]]></category>

		<category><![CDATA[proyectos]]></category>

		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=584</guid>
		<description><![CDATA[Leo un artículo en Sitepoint muy interesante de cara a establecer los plazos de entrega de nuestros proyectos de desarrollo.
Sinceramente es un tema peliagudo, sobre todo porque la mayoría de los clientes no tienen claro lo que quieren, sólo saben que quieren el precio lo más ajustado posible, y que lo quieren para ayer; y [...]]]></description>
			<content:encoded><![CDATA[<p>Leo un artículo en <a href="http://www.sitepoint.com/blogs/2010/07/29/10-reasons-why-software-project-estimates-fail/" class="extlink" target="_blank">Sitepoint</a> muy interesante de cara a establecer los plazos de entrega de nuestros proyectos de desarrollo.</p>
<p>Sinceramente es un tema peliagudo, sobre todo porque la mayoría de los clientes <strong>no tienen claro lo que quieren</strong>, sólo saben que quieren el precio lo más ajustado posible, y que lo quieren para ayer; y muchos creen que es decir la menor cantidad de detalles posible, omiten características importantes que tal vez en su idea son esenciales, pero actualmente desconozco su idea. Es muy importante dejar claros todos los puntos del desarrollo y que no haya vacíos ni aspectos sin definir (eso viene con la experiencia). </p>
<p>Recomiendo la lectura del artículo (está en inglés), aunque pongo aquí los algunos puntos clave:</p>
<ul>
<li>Proyectos mal especificados</li>
<li>Más desarrolladores NO IMPLICA desarrollo más rápido</li>
<li>Plazos demasiado optimistas</li>
<li>Cambios <em>repentinos</em> del proyecto: Ésta es la que peor llevo, el cliente muchas veces pide <em>pequeños</em> cambios; algunos, pueden ser pequeños para el cliente, pero implican retocar muchas cosas que ya están hechas, por otra parte, muchos pequeños cambios requieren mucho tiempo; y a veces es difícil hacer ver al cliente que eso cambia los plazos y el presupuesto. Imaginad que necesito un edificio, y cuando está la estructura hecha, pido que el ascensor lo quiero en otro sitio&#8230;</li>
<li>No se incluye el tiempo de pruebas: Es cierto, que los proyectos requieren una serie de pruebas, por parte del usuario final, a veces como programadores hay cosas que <em>no vemos</em>, y sólo las detectará el que utiliza la aplicación. Aunque también es cierto que como el cliente quiere los proyectos <em>para ayer</em> a veces se elimina el tiempo de pruebas a conciencia, para <em>adelgazar</em> el plazo</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2010/08/cumplir-los-plazos-en-el-desarrollo-de-software/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
