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

<channel>
	<title>BeOSmAn&#039;s Blooog &#187; Mis pequeños proyectos</title>
	<atom:link href="http://beosman.org/archivo/category/proyectos/feed" rel="self" type="application/rss+xml" />
	<link>http://beosman.org</link>
	<description>Breaking with the past to build the future</description>
	<lastBuildDate>Thu, 09 Sep 2010 13:26:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>ScreenCrop v0.1</title>
		<link>http://beosman.org/archivo/2009/proyectos/screencrop.html</link>
		<comments>http://beosman.org/archivo/2009/proyectos/screencrop.html#comments</comments>
		<pubDate>Thu, 26 Nov 2009 18:13:32 +0000</pubDate>
		<dc:creator>Diego</dc:creator>
				<category><![CDATA[Mis pequeños proyectos]]></category>

		<guid isPermaLink="false">http://beosman.org/archivo/2009/proyectos/screencrop.html</guid>
		<description><![CDATA[ScreenCrop es una pequeña utilidad que he creado en Delphi basándome en una similar que trae Windows 7 y que sirve para hacer capturas de pantalla parciales o totales. Basta con iniciar la aplicación y, mediante la técnica de arrastrar y soltar con el ratón, dibujar un cuadrado en la pantalla. El contenido de dicho [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/proyectos/screencrop/">ScreenCrop</a> es una pequeña utilidad que he creado en <a href="http://es.wikipedia.org/wiki/Delphi">Delphi</a> basándome en una similar que trae <a href="http://es.wikipedia.org/wiki/Windows_7">Windows 7</a> y que sirve para hacer capturas de pantalla parciales o totales.</p>
<p>Basta con iniciar la aplicación y, mediante la técnica de arrastrar y soltar con el ratón, dibujar un cuadrado en la pantalla. El contenido de dicho cuadro será copiado al portapapeles en forma de imagen, que luego se podrá pegar en (casi) cualquier sitio.</p>
<p>Si, durante la realización del cuadrado, nos ha quedado mal, se puede cancelar la creación manteniendo pulsada la tecla <code>Control</code> y soltando el botón del ratón. También se puede salir directamente de la aplicación mediante la tecla <code>Escape</code>, o hacer una captura completa mediante la tecla <code>Enter</code>.</p>
<p>Si se hace clic con el botón derecho una vez iniciada la aplicación, aparecerá un menú contextual con las opciones más comunes así como con una pequeña configuración.</p>
<p>Y aquí, como no, una pequeña captura de pantalla (que no, no está hecha con la aplicación <img src='http://beosman.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ):</p>
<p class="imageparagraph">
<a href="/uploads/2009/11/screencrop-capture-big.jpg"><img class="image" src="/uploads/2009/11/screencrop-capture.jpg" alt="Captura de pantalla de la aplicación 'ScreenCrop'" /></a>
</p>
<p>Por supuesto, podéis descargaros el ejecutable y, si queréis el código fuente, sólo tenéis que pedirlo.</p>
<p style="border: 1px solid silver; font-size: 1.3em; text-align: center; text-indent: 0pt;">
<a href="/uploads/2009/11/screencrop_01.zip">Descargar ScreenCrop v0.1 &#8211; ZIP &#8211; 294 <abbr title="Kilobytes">KB</abbr></a></p>
]]></content:encoded>
			<wfw:commentRss>http://beosman.org/archivo/2009/proyectos/screencrop.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mini manual de Subversion</title>
		<link>http://beosman.org/archivo/2009/informatica/mini-manual-de-subversion.html</link>
		<comments>http://beosman.org/archivo/2009/informatica/mini-manual-de-subversion.html#comments</comments>
		<pubDate>Tue, 30 Jun 2009 17:11:55 +0000</pubDate>
		<dc:creator>Diego</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[Mis pequeños proyectos]]></category>

		<guid isPermaLink="false">http://beosman.dyndns.org/archivo/2009/informatica/mini-manual-de-subversion.html</guid>
		<description><![CDATA[He creado un pequeño manual de Subversion donde se muestra lo básico para crear y administrar un repositorio en una máquina con Linux con este sistema de control de versiones. Los contenidos son: Introducción Qué es Subversion Creación y configuración de un repositorio Seguridad básica en un repositorio de Subversion Estructura recomendada de un repositorio [...]]]></description>
			<content:encoded><![CDATA[<p>He creado un <a href="/documentos/mini-manual-de-subversion/">pequeño manual de Subversion</a> donde se muestra lo básico para crear y administrar un repositorio en una máquina con Linux con <a href="http://subversion.tigris.org">este sistema de control de versiones</a>. Los contenidos son:</p>
<ol>
<li><a href="/documentos/mini-manual-de-subversion/#introduccion">Introducción</a></li>
<li><a href="/documentos/mini-manual-de-subversion/#queessubversion">Qué es Subversion</a></li>
<li><a href="/documentos/mini-manual-de-subversion/#creacionrepositorio">Creación y configuración de un repositorio</a></li>
<li><a href="/documentos/mini-manual-de-subversion/#seguridadbasica">Seguridad básica en un repositorio de Subversion</a></li>
<li><a href="/documentos/mini-manual-de-subversion/#estructura">Estructura recomendada de un repositorio</a></li>
<li><a href="/documentos/mini-manual-de-subversion/#creacionproyectos">Creación y manejo de proyectos</a></li>
<li><a href="/documentos/mini-manual-de-subversion/#comandosbasicos">Comandos básicos</a></li>
<li><a href="/documentos/mini-manual-de-subversion/#creacionbranches">Creación y manejo de <em>branches</em> (ramas)</a></li>
<li><a href="/documentos/mini-manual-de-subversion/#resumencomandos">Resumen de comandos</a></li>
<li><a href="/documentos/mini-manual-de-subversion/#anexo">Anexo A: Script de inicio del servidor de Subversion &mdash; svnserve</a></li>
</ol>
<p>Es un manual simple (en papel son apenas ocho páginas) pero que contempla los aspectos básicos de este sistema de control de versiones y es muy útil para empezar a utilizarlo.</p>
<p>Espero que os sirva <img src='http://beosman.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://beosman.org/archivo/2009/informatica/mini-manual-de-subversion.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mis antiguas páginas Web</title>
		<link>http://beosman.org/archivo/2009/web/mis-antiguas-paginas-web.html</link>
		<comments>http://beosman.org/archivo/2009/web/mis-antiguas-paginas-web.html#comments</comments>
		<pubDate>Sun, 01 Mar 2009 21:39:09 +0000</pubDate>
		<dc:creator>Diego</dc:creator>
				<category><![CDATA[Mis pequeños proyectos]]></category>
		<category><![CDATA[Sobre la Web]]></category>

		<guid isPermaLink="false">http://beosman.dyndns.org/archivo/2009/web/mis-antiguas-paginas-web.html</guid>
		<description><![CDATA[Ya en el 2004 cuando estaba finalizando la carrera, se me dio por hacer mi propia página Web por eso de compartir la información y los proyectos que uno hacía. Además, desde cero, sin gestor de contenidos (tampoco sabía lo que era en aquella época) ni nada. Directamente en PHP. Además, también hacía mis pinitos [...]]]></description>
			<content:encoded><![CDATA[<p>Ya en el 2004 cuando estaba finalizando la carrera, se me dio por hacer mi propia página Web por eso de compartir la información y los proyectos que uno hacía. Además, desde cero, sin gestor de contenidos (tampoco sabía lo que era en aquella época) ni nada. Directamente en <a href="http://www.php.net">PHP</a>. Además, también hacía mis <em>pinitos</em> con Photoshop:</p>
<p class="imageparagraph">
<img src="/uploads/2009/02/mi-primera-pagina-web-mini.png" alt="Pantallazo de mi primera página Web (del año 2004)" />
</p>
<p>No podía publicar noticias ni nada, simplemente se añadían más archivos PHP con los datos de las nuevas páginas y listo. Ni siquiera hacía uso de una base de datos.</p>
<p>Luego ya, viendo que la página era de crecimiento limitado, me decidí ha hacer un pequeño gestor de contenidos a medida. También en PHP y esta vez con acceso a bases de datos para las noticias:</p>
<p class="imageparagraph">
<img src="/uploads/2009/03/mi-primer-blog-mini.png" alt="Mi primer blog" />
</p>
<p>Se notaba por aquella época mi predilección por el <a href="http://www.mozilla-europe.org/es/firefox/">Firefox</a> dejando de lado el <acronym title="Internet Explorer">IE</acronym> (y <a href="http://www.anieto2k.com/2009/02/25/noie6day-la-iniciativa-20/">vuelve esa idea</a>), además de la resolución de pantalla y de la &mdash;todavía en uso en muchas páginas que se las dan de <em>estándar</em>&mdash; maquetación usando tablas. Vamos, no tenía casi ni idea de <abbr title="Cascade Style Sheet, Hoja de estilos en cascada"><a href="http://es.wikipedia.org/wiki/Css">CSS</a></abbr> y ni mucho menos de usabilidad y de accesibilidad. Pero por algo hay que empezar y esto era una buena idea.</p>
<p>Incluso hasta tenía una parte de administración con seguridad (usuario y contraseña, como casi todas) desde donde se podían añadir noticias, categorías, gestionar usuarios, proyectos, descargas, estadísticas,&#8230; vamos, como era a medida podía añadir lo que necesitara (¡pedazo de cabecera! Como se notaba que también estaba practicando con el Photoshop):</p>
<p class="imageparagraph">
<img src="/uploads/2009/03/consola-mantenimiento-blog-mini.png" alt="Consola de mantenimiento del blog personalizada" />
</p>
<p><strong>¿Alguien se acuerda de todo esto?</strong></p>
<p>Luego descubrí <a href="http://wordpress.org">WordPress</a> (la versión 2.0), lo instalé y a funcionar. Y con él sigo.</p>
<p>La verdad es que desarrollando un blog hubiera aprendido mucho de PHP, además del HTML correspondiente y su maquetación, sobre todo por los fallos de principiante, esos que veo ahora que miro el código <img src='http://beosman.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>De todas formas, por aquella época (más o menos el 2004) ya tenía más o menos bastante claro como hacer un software mantenible, ya que había hecho que todo se procesase desde el <code>index.php</code> cargando éste las partes que eran necesarias, cosa que sigo llevando a la práctica.</p>
<p>Ahora, eso sí, con un pequeño <em>framework</em> en PHP personal, no para el blog pero sí para otros pequeños proyectos.</p>
]]></content:encoded>
			<wfw:commentRss>http://beosman.org/archivo/2009/web/mis-antiguas-paginas-web.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nueva versión del plugin jQuery TimePicker</title>
		<link>http://beosman.org/archivo/2008/web/nueva-version-del-plugin-jquery-timepicker.html</link>
		<comments>http://beosman.org/archivo/2008/web/nueva-version-del-plugin-jquery-timepicker.html#comments</comments>
		<pubDate>Sun, 23 Nov 2008 23:09:55 +0000</pubDate>
		<dc:creator>Diego</dc:creator>
				<category><![CDATA[Mis pequeños proyectos]]></category>
		<category><![CDATA[Sobre la Web]]></category>

		<guid isPermaLink="false">http://beosman.dyndns.org/archivo/2008/web/nueva-version-del-plugin-jquery-timepicker.html</guid>
		<description><![CDATA[He reescrito de nuevo el plugin para jQuery que hice hace tiempo, jQuery TimePicker, que sirve para seleccionar la hora (horas y minutos) dentro de una caja de texto mediante la rueda del ratón. Este plugin ha sido totalmente reescrito ya que no funcionaba correctamente en Internet Explorer y en algunas versiones de Firefox. Además, [...]]]></description>
			<content:encoded><![CDATA[<p>He reescrito de nuevo el plugin para <a href="http://jquery.com">jQuery</a> que <a href="http://beosman.dyndns.org/archivo/2008/informatica/timepicker-mi-primer-plugin-para-jquery.html">hice hace tiempo</a>, <a href="http://beosman.dyndns.org/proyectos/timepicker">jQuery TimePicker</a>, que sirve para seleccionar la hora (horas y minutos) dentro de una caja de texto mediante la rueda del ratón.</p>
<p>Este plugin ha sido totalmente reescrito ya que no funcionaba correctamente en Internet Explorer y en algunas versiones de Firefox. Además, ahora usa la nueva versión del plugin <a href="http://www.ogonek.net/mousewheel/jquery-demo.html">jQueryMouseWheel</a> que corrige algunos fallos de la anterior versión (de hecho ha cambiado hasta de desarrollador).</p>
<p>Ahora funciona correctamente en Firefox 3 para Windows y Linux, Firefox 2 para Windows y en Internet Explorer 6 y 7, aunque no funciona correctamente en Google Chrome (extrañamente suma las horas y los minutos de dos en dos).</p>
<p>Espero que ahora sea algo más útil que en su versión anterior (que no valía para nada, la verdad). Ya me contaréis si esta versión funciona correctamente en todos los sistemas o si hay que añadirle o <a href="http://beosman.dyndns.org/archivo/2007/citas/perfeccion.html">quitarle</a> algo.</p>
]]></content:encoded>
			<wfw:commentRss>http://beosman.org/archivo/2008/web/nueva-version-del-plugin-jquery-timepicker.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clase Image en PHP</title>
		<link>http://beosman.org/archivo/2008/informatica/clase-image-en-php.html</link>
		<comments>http://beosman.org/archivo/2008/informatica/clase-image-en-php.html#comments</comments>
		<pubDate>Fri, 22 Aug 2008 19:19:07 +0000</pubDate>
		<dc:creator>Diego</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[Mis pequeños proyectos]]></category>

		<guid isPermaLink="false">http://beosman.dyndns.org/archivo/2008/informatica/clase-image-en-php.html</guid>
		<description><![CDATA[El otro día estaba haciendo un captcha para la página con las primitivas de dibujado de imágenes de PHP y al final me decidí por lo más lógico para que me sirva para un futuro: hacer una clase Image en PHP con todas las primitivas y hacer una clase CaptchaImage que herede de la clase [...]]]></description>
			<content:encoded><![CDATA[<p>El otro día estaba haciendo un <a href="http://es.wikipedia.org/wiki/Captcha">captcha</a> para la página con las primitivas de dibujado de imágenes de PHP y al final me decidí por lo más lógico para que me sirva para un futuro: hacer una clase <code>Image</code> en PHP con todas las primitivas y hacer una clase <code>CaptchaImage</code> que herede de la clase <code>Image</code>.</p>
<p>De momento no voy a poner aquí el código porque está sin terminar, pero vamos, es tan sencillo como hacer una clase en PHP que tenga las funciones de dibujar dentro de ella y que sepa cargar imágenes desde archivos.</p>
<p>El problema me surgió cuando intenté posicionar texto de fuentes <a href="http://es.wikipedia.org/wiki/True_type">True Type</a> rotado con un ángulo determinado, ya que al rotar dicho texto, las posiciones de X e Y así como el ancho y algo del contenido cambian.</p>
<p>Para esto, PHP tiene una función que se llama <code><a href="http://es2.php.net/manual/es/function.imagettfbbox.php">imagettfbbox(...)</a></code> que dado un texto, el tamaño, el ángulo y la fuente, devuelve un array con las posiciones de todos sus puntos, es decir, las coordenadas (x,y) de las 4 posiciones de color azul que se muestran en la imagen:</p>
<p class="imageparagraph">
<img src="/uploads/2008/08/caja-de-texto.png" alt="Caja de texto" />
</p>
<p>Pero para poder posicionar ese texto dentro de la imagen, lo que necesitamos saber son las posiciones de los puntos naranjas. O, mejor aún, el ancho y el alto del cuadrado naranja y ya daremos nosotros la posición de la izquierda y de arriba para posicionar la caja completa.</p>
<p>Hay que tener en cuenta que las coordenadas que devuelve la función de PHP siempre se refieren a la caja de texto como si este estuviese horizontal, es decir, si rotamos el texto 180 grados, las coordenadas (6,7), por ejemplo, seguirían siendo la posición superior izquierda aunque visualmente estuviesen en la posición inferior derecha.</p>
<p>Mirando en la documentación de la función en cuestión, hay varias personas que han puesto sus funciones de posicionado, (bastante complicadas, por cierto). Pero las he probado y no van bien, sobre todo con texto rotado, que al fin y al cabo, es la cuestión de la función, así que me hice la mía:</p>
<div class="terminal">
<p>  <span style="color:blue;">function</span> calculateTextBox(<span style="color:maroon;">$text,</span><span style="color:maroon;">$fontFile</span>,<span style="color:maroon;">$fontSize</span>,<span style="color:maroon;">$fontAngle</span>) {<br />
    <span style="color:maroon;">$rect</span> = imagettfbbox(<span style="color:maroon;">$fontSize</span>,<span style="color:maroon;">$fontAngle</span>,<span style="color:maroon;">$fontFile</span>,<span style="color:maroon;">$text</span>);</p>
<p>    <span style="color:maroon;">$minX</span> = min(<span style="color:blue;">array</span>(<span style="color:maroon;">$rect</span>[<span style="color:red;">0</span>],<span style="color:maroon;">$rect</span>[<span style="color:red;">2</span>],<span style="color:maroon;">$rect</span>[<span style="color:red;">4</span>],<span style="color:maroon;">$rect</span>[<span style="color:red;">6</span>]));<br />
    <span style="color:maroon;">$maxX</span> = max(<span style="color:blue;">array</span>(<span style="color:maroon;">$rect</span>[<span style="color:red;">0</span>],<span style="color:maroon;">$rect</span>[<span style="color:red;">2</span>],<span style="color:maroon;">$rect</span>[<span style="color:red;">4</span>],<span style="color:maroon;">$rect</span>[<span style="color:red;">6</span>]));<br />
    <span style="color:maroon;">$minY</span> = min(<span style="color:blue;">array</span>(<span style="color:maroon;">$rect</span>[<span style="color:red;">1</span>],<span style="color:maroon;">$rect</span>[<span style="color:red;">3</span>],<span style="color:maroon;">$rect</span>[<span style="color:red;">5</span>],<span style="color:maroon;">$rect</span>[<span style="color:red;">7</span>]));<br />
    <span style="color:maroon;">$maxY</span> = max(<span style="color:blue;">array</span>(<span style="color:maroon;">$rect</span>[<span style="color:red;">1</span>],<span style="color:maroon;">$rect</span>[<span style="color:red;">3</span>],<span style="color:maroon;">$rect</span>[<span style="color:red;">5</span>],<span style="color:maroon;">$rect</span>[<span style="color:red;">7</span>]));</p>
<p>    <span style="color:blue;">return</span> <span style="color:blue;">array</span>(<br />
      <span style="color:fuchsia;">&#8220;left&#8221;</span>   => abs(<span style="color:maroon;">$minX</span>),<br />
      <span style="color:fuchsia;">&#8220;top&#8221;</span>    => abs(<span style="color:maroon;">$minY</span>),<br />
      <span style="color:fuchsia;">&#8220;width&#8221;</span>  => <span style="color:maroon;">$maxX</span> &#8211; <span style="color:maroon;">$minX</span>,<br />
      <span style="color:fuchsia;">&#8220;height&#8221;</span> => <span style="color:maroon;">$maxY</span> &#8211; <span style="color:maroon;">$minY</span>,<br />
      <span style="color:fuchsia;">&#8220;box&#8221;</span>    => <span style="color:maroon;">$rect</span><br />
    );<br />
  }</p>
<p>  <span style="color:maroon;">$mystring</span> = <span style="color:fuchsia;">&#8220;Hello world!&#8221;</span>;</p>
<p>  <span style="color:maroon;">$imgWidth</span> = <span style="color:red;">300</span>;<br />
  <span style="color:maroon;">$imgHeight</span> = <span style="color:red;">150</span>;<br />
  <span style="color:maroon;">$angle</span> = <span style="color:red;">40</span>;</p>
<p>  <span style="color:maroon;">$image</span> = imagecreate(<span style="color:maroon;">$imgWidth</span>,<span style="color:maroon;">$imgHeight</span>);</p>
<p>  imagefill(<span style="color:maroon;">$image</span>,<span style="color:red;">0</span>,<span style="color:red;">0</span>,imagecolorallocate(<span style="color:maroon;">$image</span>,<span style="color:red;">200</span>,<span style="color:red;">200</span>,<span style="color:red;">200</span>));</p>
<p>  <span style="color:maroon;">$box</span> = calculateTextBox(<span style="color:maroon;">$mystring</span>,<span style="color:fuchsia;">&#8220;./Verdana.ttf&#8221;</span>,<span style="color:red;">15</span>,<span style="color:maroon;">$angle</span>);<br />
  <span style="color:maroon;">$color</span> = imagecolorallocate(<span style="color:maroon;">$image</span>,<span style="color:red;">0</span>,<span style="color:red;">0</span>,<span style="color:red;">0</span>);<br />
  imagettftext(<span style="color:maroon;">$image</span>,<br />
               <span style="color:red;">15</span>,<br />
               <span style="color:maroon;">$angle</span>,<br />
               <span style="color:maroon;">$box</span>[<span style="color:fuchsia;">"left"</span>] + (<span style="color:maroon;">$imgWidth</span> / <span style="color:red;">2</span>) &#8211; (<span style="color:maroon;">$box</span>[<span style="color:fuchsia;">"width"</span>] / <span style="color:red;">2</span>),<br />
               <span style="color:maroon;">$box</span>[<span style="color:fuchsia;">"top"</span>] + (<span style="color:maroon;">$imgHeight</span> / <span style="color:red;">2</span>) &#8211; (<span style="color:maroon;">$box</span>[<span style="color:fuchsia;">"height"</span>] / <span style="color:red;">2</span>),<br />
               <span style="color:maroon;">$color</span>,<br />
              <span style="color:fuchsia;">&#8220;./Verdana.ttf&#8221;</span>,<br />
               <span style="color:maroon;">$mystring</span>);</p>
<p>  header(<span style="color:fuchsia;">&#8220;Content-Type: image/x-png&#8221;</span>);<br />
  imagepng(<span style="color:maroon;">$image</span>);<br />
  imagedestroy(<span style="color:maroon;">$image</span>);</p>
</div>
<p>La función <code>calculateTextBox(...)</code> calcula la caja real donde encaja el texto dado, con su alto y ancho además de las posiciones de izquierda y derecha (necesarias para un correcto posicionamiento).</p>
<p>Luego ya sólo es necesario crear una imagen y dibujar el texto centrado sabiendo lo que ocupa.</p>
<p>Yo esto lo tengo dentro de un par de clases de PHP que me solucionan bastante los problemas. En cuanto estén listas las pongo por aquí por si a alguien les sirven de ayuda.</p>
]]></content:encoded>
			<wfw:commentRss>http://beosman.org/archivo/2008/informatica/clase-image-en-php.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>DiskSpace 1.20</title>
		<link>http://beosman.org/archivo/2008/proyectos/diskspace-1-20.html</link>
		<comments>http://beosman.org/archivo/2008/proyectos/diskspace-1-20.html#comments</comments>
		<pubDate>Tue, 15 Jul 2008 20:33:59 +0000</pubDate>
		<dc:creator>Diego</dc:creator>
				<category><![CDATA[Mis pequeños proyectos]]></category>

		<guid isPermaLink="false">http://beosman.dyndns.org/archivo/2008/proyectos/diskspace-1-20.html</guid>
		<description><![CDATA[En otro de mis ratos libres (que no tengo muchos, pero alguno hay) he actualizado la versión de DiskSpace a la 1.20 añadiendo alguna que otra mejora, entre ellas: Icono en la bandeja del sistema. Dicho icono parpadea según se realicen cambios en el disco monitorizado. La aplicación ahora se minimiza a la bandeja del [...]]]></description>
			<content:encoded><![CDATA[<p>En otro de mis ratos libres (que no tengo muchos, pero alguno hay) he actualizado la versión de <a href="http://beosman.dyndns.org/downloads/diskspace/">DiskSpace</a> a la 1.20 añadiendo alguna que otra mejora, entre ellas:</p>
<ul>
<li>Icono en la bandeja del sistema.</li>
<li>Dicho icono parpadea según se realicen cambios en el disco monitorizado.</li>
<li>La aplicación ahora se minimiza a la bandeja del sistema.</li>
<li>Información de la unidad en un globo de ayuda.</li>
<li>Algún que otro <em><a href="http://es.wikipedia.org/wiki/Error_de_software">bug</a></em> corregido.</li>
</ul>
<p class="imageparagraph">
<img class="image" src="/uploads/2008/07/diskspace120.png" alt="Captura de pantalla de la versión 1.20 de DiskSpace" />
</p>
<p>Y como siempre, podéis bajaros el ejecutable y si queréis el código fuente, sólo tenéis que pedirlo. Por cierto, está hecho en Delphi:</p>
<p style="font-size:1.3em;text-align:center;border:1px solid silver;text-indent:0;">
<a href="/wp-content/downloads/diskspace/DiskSpace_1.20.rar">Descargar DiskSpace v1.20 &#8211; 481 KB</a></p>
]]></content:encoded>
			<wfw:commentRss>http://beosman.org/archivo/2008/proyectos/diskspace-1-20.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Server Live Load</title>
		<link>http://beosman.org/archivo/2008/informatica/server-live-load.html</link>
		<comments>http://beosman.org/archivo/2008/informatica/server-live-load.html#comments</comments>
		<pubDate>Fri, 30 May 2008 18:53:39 +0000</pubDate>
		<dc:creator>Diego</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[Mis pequeños proyectos]]></category>
		<category><![CDATA[Sobre la Web]]></category>

		<guid isPermaLink="false">http://beosman.dyndns.org/archivo/2008/informatica/server-live-load.html</guid>
		<description><![CDATA[Otro pequeño proyecto que presento aquí para los que les guste cacharrear un poco con esto de la programación. El proyecto se llama &#171;Server Live Load&#187; y lo que hace es mostrar la carga instantánea del procesador o procesadores del sistema vía Web al mejor estilo de htop: Mediante esta aplicación se puede monitorizar la [...]]]></description>
			<content:encoded><![CDATA[<p>Otro pequeño proyecto que presento aquí para los que les guste cacharrear un poco con esto de la programación. El proyecto se llama &laquo;Server Live Load&raquo; y lo que hace es mostrar la carga instantánea del procesador o procesadores del sistema vía Web al mejor estilo de <code><a href="http://htop.sourceforge.net/">htop</a></code>:</p>
<p class="imageparagraph">
<a href="/uploads/2008/05/sll-screenshot.png"><img src="/uploads/2008/05/sll-screenshot-mini.png" alt="Pantallazo del proyecto Server Live Load" /></a>
</p>
<p>Mediante esta aplicación se puede monitorizar la carga instantánea del procesador o procesadores del sistema mediante información textual y mediante unas barras que, según su tamaño, indican la carga en porcentaje de cada uno de los procesadores.</p>
<p>La información textual cuenta con el nombre del servidor, el <em>uptime</em> o tiempo que lleva encendida la máquina, el número de tareas totales y las que están en ejecución y la <a href="http://en.wikipedia.org/wiki/Load_average">carga media</a> al minuto, 5 minutos y 15 minutos.</p>
<p>La aplicación está desarrollada en <a href="http://php.net">PHP</a> y la librería <a href="http://jquery.com">jQuery</a> de Javascript. Lógicamente, para la actualización de los valores de carga se usa <acronym title="Asynchronous JavaScript And XML"><a href="http://es.wikipedia.org/wiki/Ajax">AJAX</a></acronym> también mediante jQuery.</p>
<p>Para que funcione sólo es necesario tener un servidor con Linux (con Windows como que no funciona), desplegarla en cualquier directorio al que tenga acceso Apache (o lighttpd o cualquier otro servidor Web que soporte PHP) y listo. Lo único a tener en cuenta es que el usuario con el que se ejecute el servidor Web debe tener permiso de acceso al programa <code>/bin/cat</code> y a los directorios <code>/proc/stat</code> y <code>/proc/uptime.</code></p>
<p>Por supuesto y como (casi) siempre, se puede ver una <a href="http://beosman.dyndns.org/demos/cpu-load/">demostración de esta misma máquina</a>. Y también, si queréis ver las chapuzas de programas que hago, lo podéis descargar:</p>
<p style="border: 1px solid #B5BDCF; padding: 4px;font-size:1.3em;text-align:center;text-indent:0;">
<a title="CPULoadWebViewer0.1.tar.gz - 24 KB" href="/uploads/misc/CPULoadWebViewer0.1.tar.gz">Descargar CPULoadWebViewer0.1.tar.gz</a>
</p>
<p>Para la siguiente versión a ver si pongo la memoria y el <em>swap</em> además de que sea un poco más configurable. Y ya de estar, aunque quizás sea para la 0.3, un histórico del uso de CPU. Pero bueno, eso con tiempo.</p>
<p>También se podrían poner las tareas que se están ejecutando en cada momento, pero eso cargaría demasiado el sistema, así que ahí se queda.</p>
]]></content:encoded>
			<wfw:commentRss>http://beosman.org/archivo/2008/informatica/server-live-load.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>TimePicker: mi primer plugin para jQuery</title>
		<link>http://beosman.org/archivo/2008/informatica/timepicker-mi-primer-plugin-para-jquery.html</link>
		<comments>http://beosman.org/archivo/2008/informatica/timepicker-mi-primer-plugin-para-jquery.html#comments</comments>
		<pubDate>Thu, 29 May 2008 18:17:45 +0000</pubDate>
		<dc:creator>Diego</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[Mis pequeños proyectos]]></category>
		<category><![CDATA[Sobre la Web]]></category>

		<guid isPermaLink="false">http://beosman.dyndns.org/archivo/2008/informatica/timepicker-mi-primer-plugin-para-jquery.html</guid>
		<description><![CDATA[Dentro de la página de plugins de jQuery existen varios que muestran un calendario para selccionar una fecha en un formulario. Pero he visto muy pocos (casi ninguno) que muestre un selector de hora, por ejemplo, para seleccionar un horario de trabajo. Y los que he visto tampoco es que sean muy interesantes (aunque es [...]]]></description>
			<content:encoded><![CDATA[<p>Dentro de la <a href="http://plugins.jquery.com/">página de <em>plugins</em> de jQuery</a> existen varios que muestran un calendario para selccionar una fecha en un formulario. Pero he visto muy pocos (casi ninguno) que muestre un selector de hora, por ejemplo, para seleccionar un horario de trabajo. Y los que he visto tampoco es que sean muy interesantes (aunque es cierto que he visto uno muy bueno llamado <a href="http://www.nogray.com/time_picker.php">NoGray Time Picker</a> pero es con la librería <a href="http://mootools.net/">Moo Tools</a>).</p>
<p>Por eso, he hecho mi primer <em>plugin</em> para jQuery que es eso mismo, un selector de hora.</p>
<p>Mediante este <em>plugin</em>, en el <code>input</code> que esté activado, saldrá un selector con la hora actual en formato <code><acronym title="Horas">HH</acronym>:<acronym title="Minutos">MM</acronym></code> donde, mediante la rueda del ratón, se podrá seleccionar una hora que se asignará automáticamente al <code>input</code>.</p>
<p>Este plugin require <a href="http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.2.6.pack.js">jQuery versión igual o mayor a la 1.2.6</a> y el plugin <a href="http://plugins.jquery.com/project/mousewheel">jQuery MouseWheel versión igual o mayor a la 3.0</a>. Para instalarlo basta con incluir las siguientes líneas en el código HTML (en el mismo orden):</p>
<p class="terminal">
&lt;script type=&#8221;text/javascript&#8221; src=&#8221;jquery.js&#8221;&gt;&lt;/script&gt;<br />
&lt;script type=&#8221;text/javascript&#8221; src=&#8221;jquery.mousewheel.js&#8221;&gt;&lt;/script&gt;<br />
&lt;script type=&#8221;text/javascript&#8221; src=&#8221;jquery.timepicker.js&#8221;&gt;&lt;/script&gt;
</p>
<p>Y para activarlo se usa el siguiente código:</p>
<p class="terminal">
&lt;html&gt;<br />
[...]<br />
  &lt;script type=&#8221;text/javascript&#8221;&gt;<br />
    $(document).ready(function() {<br />
      $(&#8220;#timepicker&#8221;).timepicker();<br />
    });<br />
  &lt;/script&gt;<br />
  [...]<br />
  &lt;body&gt;<br />
    [...]<br />
    &lt;input type=&#8221;text&#8221; id=&#8221;timepicker&#8221; name=&#8221;timepicker&#8221; value=&#8221;" /&gt;<br />
    [...]<br />
  &lt;/body&gt;<br />
&lt;/html&gt;
</p>
<p>El <code>id</code> que se le asigna dentro del HTML es <code>__timepicker</code> con lo que se pueden usar hojas de estilo personalizadas.</p>
<p>El plugin está en la versión 0.1 y por dentro está bastante chapucero (es lo que hay <img src='http://beosman.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) pero más o menos funciona tanto para Firefox en Windows y Linux como para Internet Explorer. Un problema que he detectado es que en IE versión 6 o menores no carga la hoja de estilos propia del <code>TimePicker</code>. Y un problema muy grave que no he corregido es que ¿qué pasa si tu ratón no tiene rueda? Pues que no puedes asignar la hora más que escribiéndola, por tanto el <em>plugin</em> no sirve para nada. A ver si soluciono esto de una forma elegante sin añadir las típicas flechitas de para arriba y para abajo. ¿Alguna sugerencia?</p>
<p>Podéis ver <a href="/demos/timepicker/demo.html">una demostración</a> y, por supuesto, también podéis descargarlo en el siguiente enlace. Por supuesto que se agradece cualqueir comentario sobre todo de los que digan <em>&laquo;¡Hey, que esto no va!&raquo;</em>:</p>
<p style="border: 1px solid #B5BDCF; padding: 4px;font-size:1.3em;text-align:center;text-indent:0;">
<a title="jQueryTimePicker0.1.zip (35 KB)" href="/uploads/misc/jQueryTimePicker0.1.zip">Descargar jQuery TimePicker Plugin v0.1</a></p>
]]></content:encoded>
			<wfw:commentRss>http://beosman.org/archivo/2008/informatica/timepicker-mi-primer-plugin-para-jquery.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>TFileSystemWatcher</title>
		<link>http://beosman.org/archivo/2008/informatica/tfilesystemwatcher.html</link>
		<comments>http://beosman.org/archivo/2008/informatica/tfilesystemwatcher.html#comments</comments>
		<pubDate>Tue, 18 Mar 2008 23:42:48 +0000</pubDate>
		<dc:creator>Diego</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[Mis pequeños proyectos]]></category>

		<guid isPermaLink="false">http://beosman.dyndns.org/archivo/2008/informatica/tfilesystemwatcher.html</guid>
		<description><![CDATA[Hacía ya bastante tiempo que no programaba por placer, principalmente por la falta de eso mismo, de tiempo libre. Pero hace poco, revisando lo que tenían por el disco duro, me encontré con una aplicación que había desarrollado hacía bastante y decidí que era un buen momento para retomar su desarrollo. Esta aplicación está hecha [...]]]></description>
			<content:encoded><![CDATA[<p>Hacía ya bastante tiempo que no programaba por placer, principalmente por la falta de eso mismo, de tiempo libre.</p>
<p>Pero hace poco, revisando lo que tenían por el disco duro, me encontré con una aplicación que había desarrollado hacía bastante y decidí que era un buen momento para retomar su desarrollo.</p>
<p>Esta aplicación está hecha en mi querido <a href="http://es.wikipedia.org/wiki/Delphi">Delphi</a> (¡lo que he aprendido yo gracias a él!) para plataformas Windows (creo que vale cualquiera aunque lo he probado en Windows XP) y <strong>lo que muestra son todos los cambios que se producen en los archivos de nuestro sistema de archivos</strong> indicando si lo que ha cambiado es un archivo o un directorio, el tipo de cambio (adición, modificación, borrado o renombrado) y la ruta donde se ha producido el cambio.</p>
<p>Pero en realidad esta aplicación <em>patata</em> es el test que sirve para desarrollar una clase de Delphi que monitoriza los cambios que se producen en la ruta indicada de nuestro sistema de archivos: <code><strong>TFileSystemWatcher</strong></code>.</p>
<p class="imageparagraph">
<a href="/uploads/2008/03/filesystemwatcher.png"><img src="/uploads/2008/03/filesystemwatcher-mini.png" alt="File System Watcher en ejecución mostrando los cambios en el sistema de archivos" title="File System Watcher en ejecución mostrando los cambios en el sistema de archivos" /></a>
</p>
<p>Como Delphi es un lenguaje de <a href="http://es.wikipedia.org/wiki/Programaci%F3n_dirigida_por_eventos">programación dirigida por eventos</a>, cada vez que se produce un cambio en nuestros archivos o directorios, nuestra <em>maravillosa</em> clase, una vez arrancada, generará dos eventos: uno muy genérico dando información de qué ha pasado y otro más específico para poder realizar acciones propias de los cambios que queremos monitorizar.</p>
<p>Si se quiere ver como es por dentro la clase y los eventos que genera, se puede echar un vistazo a continuación:</p>
<div class="terminal" style="overflow: auto; font-size:.9em;">
<p><span style="color:gray;">{**<br />
 * @author Diego Lago &lt;<a href="mailto:beosman@gmail.com">beosman@gmail.com</a>&gt;<br />
 * @version 0.1 20080318<br />
 * @license Creative Commons 2.5 &#8211; Reconocimiento &#8211; Compartir Igual<br />
 *<br />
 * @class TFileSystemWatcher<br />
 *<br />
 * Esta clase hereda de TThread y sirve para monitorizar los cambios en el sistema de<br />
 * archivos dada una ruta.<br />
 *<br />
 * Se pueden instanciar cuantas veces se quiera para monitorizar cualquier directorio.<br />
 * Los cambios que se pueden monitorizar son adiciones, borrados, modificaciones y<br />
 * renombraciones de archivos y directorios.<br />
 *<br />
 * Para cada acción se genera un evento genérico que siempre que hay una acción se activa,<br />
 * pero también hay eventos más específicos que se activan según el tipo de acción que<br />
 * ha ocurrido y según el tipo de archivo (si es archivo o directorio).<br />
 *<br />
 *}</span></p>
<p><span style="color:navy;">type</span></p>
<p>  <span style="color:gray;">{**<br />
   * Tipo de entrada, archivo o directorio, para el evento principal.<br />
   *}</span><br />
  TEntryType = (etDirectory,etFile);</p>
<p>  <span style="color:gray;">{**<br />
   * Tipo de acción que se produce sobre el sistema de archivos.<br />
   *}</span><br />
  TFileSystemAction = (fsaNoAction,<br />
                       fsaFileAdded,<br />
                       fsaFileRemoved,<br />
                       fsaFileModified,<br />
                       fsaFileRenamedOldName,<br />
                       fsaFileRenamedNewName);</p>
<p>  <span style="color:gray;">{**<br />
   * Tipos de eventos producidos por esta clase.<br />
   *<br />
   * TFileSystemaChangeEvent: Evento genérico. Se produce siempre que hay un cambio en<br />
   * el sistema de archivos.<br />
   * TFileChangeEvent: Tipo de evento más específico. Se produce cuando hay un cambio en<br />
   * archivos o directorios de añadir, borrar y modificar.<br />
   * TFileRenamedEvent: Tipo de evento que se produce cuando se renombra un archivo o un<br />
   * directorio.<br />
   *<br />
   * Para más información ver los eventos declarados en la clase.<br />
   *}</span><br />
  TFileSystemChangeEvent = <span style="color:navy;">procedure</span>(Sender: TObject; EntryType: TEntryType; Path: <span style="color:navy;">string</span>; Action: TFileSystemAction) <span style="color:navy;">of object</span>;<br />
  TFileChangeEvent = <span style="color:navy;">procedure</span>(Sender: TObject; FilePath: <span style="color:navy;">string</span>) <span style="color:navy;">of object</span>;<br />
  TFileRenamedEvent = <span style="color:navy;">procedure</span>(Sender: TObject; FileOldPath: <span style="color:navy;">string</span>; FileNewPath: <span style="color:navy;">string</span>) <span style="color:navy;">of object</span>;</p>
<p>  TFileSystemWatcher = <span style="color:navy;">class</span>(TThread)<br />
    <span style="color:navy;">private</span></p>
<p>      <span title="Datos privados de la clase (ver código fuente)">[...]</span></p>
<p>    <span style="color:navy;">protected</span><br />
      <span style="color:navy;">procedure</span> Execute(); <span style="color:navy;">override</span>;</p>
<p>    <span style="color:navy;">public</span><br />
      <span style="color:gray;">{**<br />
       * Constructor de la clase.<br />
       * @param string FileSystemEntryName Nombre del directorio a monitorizar.<br />
       * @param Boolean WatchSubTree Monitorizar también los subdirectorios.<br />
       *}</span><br />
      <span style="color:navy;">constructor</span> Create(FileSystemEntryName: <span style="color:navy;">string</span>; WatchSubTree: <span style="color:purple;">Boolean</span> = True);<br />
      <span style="color:navy;">destructor</span> Destroy(); <span style="color:navy;">reintroduce</span>;</p>
<p>      <span style="color:navy;">procedure</span> Free();</p>
<p>      <span style="color:gray;">{**<br />
       * Inicia la monitorización en un hilo separado.<br />
       *}</span><br />
      <span style="color:navy;">procedure</span> Start();</p>
<p>      <span style="color:gray;">{**<br />
       * Para la monitorización del directorio.<br />
       *}</span><br />
      <span style="color:navy;">procedure</span> Stop();</p>
<p>      <span style="color:gray;">{**<br />
       * @property string WatchedPath Directorio que se está monitorizando. Cada<br />
       * vez que se cambia se resetean todos los contadores, se para el hilo de ejecución<br />
       * y se vuelve a iniciar en caso de que estuviese activo.<br />
       *}</span><br />
      <span style="color:navy;">property</span> WatchedPath: <span style="color:navy;">string</span> <span style="color:navy;">read</span> fFileSystemEntryName <span style="color:navy;">write</span> setFileSystemEntryName;</p>
<p>      <span style="color:navy;">property</span> WatchSubtree: <span style="color:purple;">Boolean</span> <span style="color:navy;">read</span> fWatchSubtree <span style="color:navy;">write</span> setWatchSubtree;</p>
<p>      <span style="color:gray;">{**<br />
       * @property Cardinal ChangesCount Número de cambios en el sistema de archivos.<br />
       *}</span><br />
      <span style="color:navy;">property</span> ChangesCount: Cardinal <span style="color:navy;">read</span> fChangesCount;</p>
<p>      <span style="color:gray;">{**<br />
       * @property TDateTime Fecha y hora del último cambio en el sistema de archivos.<br />
       *}</span><br />
      <span style="color:navy;">property</span> LastChangeAt: TDateTime <span style="color:navy;">read</span> fLastChangeAt;</p>
<p>      <span style="color:gray;">{**<br />
       * @event TFileSystemChangeEvent OnFileSystemChange Evento que se produce cada<br />
       * vez que hay un cambio en el sistema de archivos.<br />
       *}</span><br />
      <span style="color:navy;">property</span> OnFileSystemChange: TFileSystemChangeEvent <span style="color:navy;">read</span> fFileSystemChangeEvent <span style="color:navy;">write</span> fFileSystemChangeEvent;</p>
<p>      <span style="color:gray;">{**<br />
       * Eventos que se producen cada vez que hay un cambio en el sistema de archivos<br />
       * sólo para archivos (no para directorios):<br />
       *<br />
       * @event TFileChangeEvent OnFileAdded Se lanza cuando se añade un archivo.<br />
       * @event TFileChangeEvent OnFileRemoved Se lanza cuando se borra un archivo.<br />
       * @event TFileChangeEvent OnFileModified Se lanza cuando se modifica un archivo.<br />
       * @event TFileRenamedEvent OnFileRenamed Se lanza cuando se renombra un archivo.<br />
       *}</span><br />
      <span style="color:navy;">property</span> OnFileAdded: TFileChangeEvent <span style="color:navy;">read</span> fFileAddedEvent <span style="color:navy;">write</span> fFileAddedEvent;<br />
      <span style="color:navy;">property</span> OnFileRemoved: TFileChangeEvent <span style="color:navy;">read</span> fFileRemovedEvent <span style="color:navy;">write</span> fFileRemovedEvent;<br />
      <span style="color:navy;">property</span> OnFileModified: TFileChangeEvent <span style="color:navy;">read</span> fFileModifiedEvent <span style="color:navy;">write</span> fFileModifiedEvent;<br />
      <span style="color:navy;">property</span> OnFileRenamed: TFileRenamedEvent <span style="color:navy;">read</span> fFileRenamedEvent <span style="color:navy;">write</span> fFileRenamedEvent;</p>
<p>      <span style="color:gray;">{**<br />
       * Eventos que se producen cada vez que hay un cambio en el sistema de archivos<br />
       * sólo para directorios (no para archivos):<br />
       *<br />
       * @event TFileChangeEvent OnDirectoryAdded Se lanza cuando se añade un directorio.<br />
       * @event TFileChangeEvent OnDirectoryRemoved Se lanza cuando se borra un directorio.<br />
       * @event TFileChangeEvent OnDirectoryModified Se lanza cuando se modifica un directorio.<br />
       * @event TFileRenamedEvent OnDirectoryRenamed Se lanza cuando se renombra un directorio.<br />
       *}</span><br />
      <span style="color:navy;">property</span> OnDirectoryAdded: TFileChangeEvent <span style="color:navy;">read</span> fDirectoryAddedEvent <span style="color:navy;">write</span> fDirectoryAddedEvent;<br />
      <span style="color:navy;">property</span> OnDirectoryRemoved: TFileChangeEvent <span style="color:navy;">read</span> fDirectoryRemovedEvent <span style="color:navy;">write</span> fDirectoryRemovedEvent;<br />
      <span style="color:navy;">property</span> OnDirectoryModified: TFileChangeEvent <span style="color:navy;">read</span> fDirectoryModifiedEvent <span style="color:navy;">write</span> fDirectoryModifiedEvent;<br />
      <span style="color:navy;">property</span> OnDirectoryRenamed: TFileRenamedEvent <span style="color:navy;">read</span> fDirectoryRenamedEvent <span style="color:navy;">write</span> fDirectoryRenamedEvent;</p>
<p>  <span style="color:navy;">end</span>;</p>
</div>
<p>Como os habréis dado cuenta, este código está incompleto, faltan los datos privados, así que no <em>copiéis y peguéis</em> directamente. Lo mejor es bajarse el código fuente y la aplicación de ejemplo:</p>
<p style="text-align: center; font-size: 1.5em;">
<a title="FileSystemWatcher.zip - 383 KB" href="/uploads/2008/03/FileSystemWatcher.zip">Descargar <code>TFileSystemWatcher</code></a>
</p>
<p>Lo interesante de esta aplicación es que se puede sacar la clase <code>TFileSystemWatcher</code> del archivo <code>FileSystemWatcher.pas</code> y se puede incluir en cualquier proyecto que requiera monitorizar una o varias zonas del sistema de archivos. Por ejemplo, para hacer un buscador un poco más eficiente que el que trae el Windows.</p>
<p>La licencia de este software es <a href="http://creativecommons.org/licenses/by-sa/2.5/es/">Creative Commons 2.5 Reconocimiento &#8211; Compartir igual</a>, así que esta clase se puede utilizar para lo que más os guste sin restricciones. Quizás en próximas versiones me pase a la <a href="http://www.gnu.org/licenses/gpl.txt"><acronym title="General Public License">GPL</acronym></a> aunque todavía no la he estudiado lo suficiente (¿cuál es mejor, esta o la GPL?).</p>
<p>Y eso es todo, por el momento. Ahora intentaré continuar con otro proyecto que tengo en mente haciendo uso de esta clase (pues sí, ese buscador más eficiente que el que trae Windows al estilo Google Desktop&#8230; si, venga, vale, ya lo han hecho y funciona bien. Pero yo lo hago por aprender).</p>
<p>Y vosotros, si queréis, podéis probar el <em>aparatín</em> y me contáis <img src='http://beosman.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://beosman.org/archivo/2008/informatica/tfilesystemwatcher.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>D System Info</title>
		<link>http://beosman.org/archivo/2007/proyectos/d-system-info.html</link>
		<comments>http://beosman.org/archivo/2007/proyectos/d-system-info.html#comments</comments>
		<pubDate>Tue, 27 Feb 2007 18:28:05 +0000</pubDate>
		<dc:creator>Diego</dc:creator>
				<category><![CDATA[Mis pequeños proyectos]]></category>

		<guid isPermaLink="false">http://beosman.dyndns.org/archivo/2007/proyectos/d-system-info.html</guid>
		<description><![CDATA[He añadido un nuevo proyecto a mi pequeña lista. Este proyecto es uno que hice hace ya 6 años, cuando me causaba furor el sistema operativo BeOS. Este no es más que una pequeña aplicación para mostrar la información del sistema y lo que pretendía era aprender a programar con su API y, más o [...]]]></description>
			<content:encoded><![CDATA[<p>He añadido <a href="http://beosman.dyndns.org/proyectos/d-system-info/">un nuevo proyecto</a> a mi pequeña lista. Este proyecto es uno que hice hace ya 6 años, cuando me causaba furor el sistema operativo BeOS.</p>
<p>Este no es más que una pequeña aplicación para mostrar la información del sistema y lo que pretendía era aprender a programar con su <acronym title="Application Programmer Interface">API</acronym> y, más o menos, conseguí coger los conceptos básicos, aunque ahora, lógicamente, los tengo casi todos olvidados.</p>
<p style="text-indent: 0; text-align: center;">
<a href="/uploads/2007/02/dsysteminfo.jpg"><img style="padding: 2px; border: 1px solid silver;" src="/uploads/2007/02/dsysteminfo-mini.jpg" alt="Screenshot de D System Info" /></a>
</p>
<p>También he puesto la descarga de esta aplicación junto con su código fuente. Y en un futuro intentaré compilarla en <a href="http://haiku-os.org/">Haiku</a>, ese sistema operativo con el que se me llena la boca al hablar de él.</p>
]]></content:encoded>
			<wfw:commentRss>http://beosman.org/archivo/2007/proyectos/d-system-info.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>QTest</title>
		<link>http://beosman.org/archivo/2007/proyectos/qtest.html</link>
		<comments>http://beosman.org/archivo/2007/proyectos/qtest.html#comments</comments>
		<pubDate>Mon, 05 Feb 2007 11:55:05 +0000</pubDate>
		<dc:creator>Diego</dc:creator>
				<category><![CDATA[Mis pequeños proyectos]]></category>

		<guid isPermaLink="false">http://beosman.dyndns.org/archivo/2007/proyectos/qtest.html</guid>
		<description><![CDATA[Hace ya algún tiempo que estaba un poco viciado con las quinielas (bueno, un poco no, la verdad es que la hice un par de veces y como no gané nada, como siempre, pues desistí). El caso es que aburría bastante hacer las comprobaciones de los resultados a mano por lo que decidí hacer un [...]]]></description>
			<content:encoded><![CDATA[<p style="text-indent: 0;">
<a href="http://beosman.dyndns.org/qtest/"><img style="padding: 2px; border: 1px solid silver;" src="/uploads/2007/02/qtest-mini.jpg" alt="Cabecera de QTest" /></a>
</p>
<p>Hace ya algún tiempo que estaba un poco viciado con las <a href="http://onlae.terra.es/quinielas.htm">quinielas</a> (bueno, un poco no, la verdad es que la hice un par de veces y como no gané nada, como siempre, pues desistí). El caso es que aburría bastante hacer las comprobaciones de los resultados a mano por lo que decidí hacer un <em>programilla</em> que lo hiciese automáticamente.</p>
<p>A principio pensé en hacerlo en <a href="http://es.wikipedia.org/wiki/Delphi">Delphi</a> (ya sabéis que me mola) pero luego pensé cómo se podría actualizar y me decidí finalmente en hacerlo vía web.</p>
<p>Cuando analicé el código fuente de la <a href="http://onlae.terra.es/qsorteos.asp">web de donde podía sacar los resultados</a> (la propia de la <acronym title="Organización Nacional de Loterías y Apuestas del Estado">ONLAE</acronym>), vi que era un infierno. En serio. Todo sin estructurar, sin <code>id</code> en las <em>tags</em> <acronym title="HyperText Markup Language">HTML</acronym>, sin seguir estándares con CSS, usando etiquetas <code>&lt;font ... &gt;</code>&#8230; lo dicho, un infierno.</p>
<p>Así que no me quedó otro remedio que buscar los resultados a mano, es decir, mediante una librería en <a href="http://es.wikipedia.org/wiki/Javascript">JavaScript</a>, exactamente <a href="http://jquery.com/">jQuery</a>, recorriendo el <a href="http://es.wikipedia.org/wiki/DOM"><acronym title="Document Object Model">DOM</acronym></a> del documento y contando las etiquetas de cierto tipo que me debería encontrar antes de la que quería. Vamos, una chapuza en toda regla pero todavía no me ha dado tiempo a pensar en otra forma un poco más <em>óptima</em>.</p>
<p>El caso es que se ejecuta en el lado del cliente (JavaScript) por lo que por el momento es <strong>muy lento</strong> y <strong>puede fallar</strong> debido a que si me cambian la estructura de aquel documento pues me <del>joden</del> fastidian.</p>
<p>Bueno, no me enrollo más: desde <a href="http://beosman.dyndns.org/qtest/">la página del proyecto</a> se pueden ver los resultados de la quiniela de la última jornada de liga de fútbol y comprobar los resultados de tu quiniela. Basta con introducir todos los resultados seguidos, en forma de cadena de unos, equis y doses, presionar el botón <em>&laquo;Comprobar resultados&raquo;</em> y listo. Ahí os saldrán los aciertos que tenéis y el premio que os lleváis.</p>
<p>Espero que tengamos suerte&#8230; algún día.</p>
]]></content:encoded>
			<wfw:commentRss>http://beosman.org/archivo/2007/proyectos/qtest.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
