<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Código Fuente</title>
	<atom:link href="http://salomonrt.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://salomonrt.wordpress.com</link>
	<description>Hay 10 tipos de informáticos: los que saben binario y los que no</description>
	<lastBuildDate>Fri, 20 Nov 2009 04:25:19 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='salomonrt.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/703235416e38af954ce4e3a192b2aec9?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Código Fuente</title>
		<link>http://salomonrt.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://salomonrt.wordpress.com/osd.xml" title="Código Fuente" />
		<item>
		<title>Enseñar Software Libre: Obligación de las universidades</title>
		<link>http://salomonrt.wordpress.com/2009/11/19/ensenar-software-libre-obligacion-de-las-universidades/</link>
		<comments>http://salomonrt.wordpress.com/2009/11/19/ensenar-software-libre-obligacion-de-las-universidades/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 04:25:19 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[Mi punto de vista]]></category>
		<category><![CDATA[enseñar software libre]]></category>
		<category><![CDATA[software libre en universidades]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=233</guid>
		<description><![CDATA[Lamentablemente, en la mayoría de las universidades sólo enseñan herramientas de software privativo y no mencionan en absoluto el software libre. Desde luego hay paises en los que en algunas universidades no sólo lo mencionan sino que además promueven su uso; lástima que México no sea uno de esos países.
Pienso que las universidades tienen la [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=233&subd=salomonrt&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Lamentablemente, en la mayoría de las universidades sólo enseñan herramientas de software privativo y no mencionan en absoluto el software libre. Desde luego hay paises en los que en algunas universidades no sólo lo mencionan sino que además promueven su uso; lástima que México no sea uno de esos países.</p>
<p>Pienso que las universidades tienen la obligación moral de enseñar software libre. No estoy diciendo que sólo se enseñe software libre, no estoy en contra de que se eneseñe software privativo, pero si estoy en contra de que únicamente se enseñe software privativo.</p>
<p>Para que quede claro, en la mayoría de las universidades (al menos de México, pero no dudo que sea el caso de muchos otros países) a los estudiantes de sistemas/informática, etc. prácticamente sólo se les enseña a usar software de Microsoft (a excepción de Java que es de Sun y no hace mucho se publicó bajo licencia GPL2), y si bien les va de Borland, y a los estudiantes de otras carreras sólo la suite de oficina de Microsoft (Office).</p>
<p><strong>¿Porque digo que las universidades tienen la obligación moral de enseñar software libre?</strong></p>
<p>Las universidades públicas reciben un presupuesto del gobierno porque éste está obligado a proporcionar educación a los ciudadanos, todo ciudadano debería tener la oportunidad de recibir educación de calidad que le permita desempeñar un trabajo de calidad y estar preparado para competir en éste mundo cada vez más globalizado, independientemente de su situación financiera, es decir, en teoría, un estudiante de pocos recursos económicos debería estar tan preparado como uno que tenga padres millonarios.</p>
<p>Pero ¿qué pasa si al estudiante de informática de una universidad pública, que en ocasiones no tiene ni para el pasaje del transporte público para ir de su casa a la universidad sólo le enseñan a usar Microsoft Office y a programar en Visual Studio versión x?. Supongamos que ese estudiante tuviera la fortuna de haber logrado comprar una computadora con el sacrificio de sus padres, o el suyo propio porque trabaja en las noches en x o y fábrica; dicha computadora si acaso viene con la licencia de Windows versión x instalado, pero no trae Microsoft Office y mucho menos Visual Studio, la universidad estaría casi obligando a este estudiante a desembolsar un dinero extra (considerable además) para que adquiriera las licencias de dichos paquetes, porque desde luego que no esperamos que una universidad fomente la actividad a la cual las empresas desarrolladoras de software privativo más grandes del mundo llaman &#8220;piratería&#8221;.</p>
<p>No se debe condicionar el aprendizaje a quienes pueden pagar las licencias de uso de software privativo. Cabe mencionar que software libre no significa software grátis, pero afortunadamente, la gran mayoría del software libre resulta que es también grátis.</p>
<p>Dejando de lado la cuestión económica (recordemos también que la principal ventaja del software libre no es el ahorro en el costo de la licencia, sino la independencia tecnológica que nos brinda), el estudiante tiene derecho a saber que existen otras opciones y más aún debería tener la oportunidad de conocerlas y decidir libremente que sistema operativo, suite de oficina o herramienta de programación usar en el futuro (me refiero a su vida profesional).</p>
<p>Las universidades privadas que no enseñan software libre están limitando las opciones de desarrollo profesional de sus estudiantes ya que muchas de las instituciones y empresas líderes en diferentes ramos usan software libre, tal es el caso de la NASA, Google, Cisco Systems, IBM, Intel, Oracle, Yahoo, Silicon Graphics, Dreamworks, SAP, Merril Lynch (recientemente adquirida por Bank Of America) por mencionar sólo algunas.</p>
<p>El hecho de que los servidores de Yahoo corran FreeBSD no es porque Yahoo no pueda pagar las licencias de algún sistema operativo privativo, sino por la estabilidad, seguridad, etc. que FreeBSD ofrece.</p>
<p>Aquí un par de enlaces que pueden ser de interés, el primero es de hace ya algún tiempo pero fue escrito por uno de los co-fundadores de Yahoo</p>
<p><a href="http://zer0.org/daemons/yahoobsd.html" target="_blank">http://zer0.org/daemons/yahoobsd.html</a></p>
<p><a href="http://www.freebsd.org/doc/es/books/handbook/nutshell.html" target="_blank">http://www.freebsd.org/doc/es/books/handbook/nutshell.html</a></p>
<p>Aglunas empresas &#8220;regalan&#8221; licencias de sus paquetes a las universidades e incluso a escuelas de niveles educativos inferiores (preparatorias, secundarias y hasta primarias), realmente esas empresas no consideran que están regalando las licencias de sus paquetes, lo que están haciendo es que están invirtiendo en publicidad y mercadotecnia, están creando futuros consumidores de sus productos. Si un niño aprende a usar únicamente un sistema operativo y una única suite de oficina, no querrá aprender a usar otra cosa en el futuro, por que no querrá invertir tiempo en ello, y hay quienes estarán dispuestos a pagar lo que les pidan con tal de no invertir tiempo en aprender a usar otra cosa, sin importar si ese otro sistema operativo sea mejor que el único que el sabe usar.</p>
<p>Esta práctica es la que emplean con mucho éxito los narcomenudistas, regalan las primeras dósis para &#8220;enganchar&#8221; a quien será su futuro cliente incondicional.</p>
<p>No dejemos que el sistema educativo de todo un país dependa de una empresa, que nuestros alumnos no sean &#8220;clientes&#8221; de ninguna corporación (nacional o extranjera). Enseñar software libre en las universidades garantiza la independencia tecnológica de los ciudadanos que serán los pilares del país en el futuro.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/233/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=233&subd=salomonrt&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2009/11/19/ensenar-software-libre-obligacion-de-las-universidades/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>
	</item>
		<item>
		<title>Agregar archivos a una imágen de disco</title>
		<link>http://salomonrt.wordpress.com/2009/10/05/agregar-archivos-a-una-imagen-de-disco/</link>
		<comments>http://salomonrt.wordpress.com/2009/10/05/agregar-archivos-a-una-imagen-de-disco/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 17:07:58 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[agregar archivo a imagen dd]]></category>
		<category><![CDATA[agregar archivos a una disk image desde Linux]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=229</guid>
		<description><![CDATA[Quienes no sepan que es una imágen de disco pueden encontrar información al respecto en el siguiente enlace http://en.wikipedia.org/wiki/Disk_image.
A continuación voy a poner un ejemplo de cómo agregar y borrar archivos a una imágen de disco desde GNU/Linux.
Para este ejemplo, vamos a utilizar una imágen de disco de FreeDOS llamada balder10.img (se puede decargar de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=229&subd=salomonrt&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Quienes no sepan que es una imágen de disco pueden encontrar información al respecto en el siguiente enlace <a href="http://en.wikipedia.org/wiki/Disk_image" target="_blank">http://en.wikipedia.org/wiki/Disk_image</a>.</p>
<p>A continuación voy a poner un ejemplo de cómo agregar y borrar archivos a una imágen de disco desde GNU/Linux.</p>
<p>Para este ejemplo, vamos a utilizar una imágen de disco de FreeDOS llamada balder10.img (se puede decargar de aquí: <a href="http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/unofficial/balder/" target="_blank">http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/unofficial/balder/</a>); esta es una imágen de disco de 1.44Mb con formato DOS.</p>
<p>Primero debemos crear un directorio para montar la imágen de disco (en este caso creé un directorio llamado imagendisco en mi home).</p>
<p>mkdir /home/salomon/imagendisco</p>
<p>Ahora montamos la imágen de disco indicando el tipo de sistema de archivos (en este caso vfat porque es formato DOS) y que la montaremos con permisos de lectura y escritura (rw).</p>
<p>sudo mount -t vfat -o loop,rw,umask=0002 balder10.img /home/salomon/imagendisco</p>
<p>Si hacemos un ls al directorio /home/salomon/imagendisco veremos el contenido de la imágen de disco</p>
<p>append.exe    defrag.hlp    fdapm.com     keyb.exe      share.com<br />
assign.com    deltree.com   fdconfig.sys  keyboard.sys  shrdrv86.exe<br />
attrib.com    devload.com   fdisk.exe     keybrd2.sys   shsucdhd.exe<br />
autoexec.bat  diskcomp.com  fdisk.ini     label.exe     shsucdx.com<br />
cdrcache.sys  diskcopy.exe  fdiskpt.ini   lbacache.com  subst.exe<br />
chkdsk.exe    diskcopy.ini  fdshield.com  loadcd.bat    sys.com<br />
choice.exe    display.exe   fdxms286.sys  mem.exe       tickle.com<br />
command.com   dosfsck.exe   find.com      mode.com      tree.com<br />
comp.com      drvon.com     format.exe    more.exe      unzip.exe<br />
country.sys   edit.exe      graph-hp.com  move.exe      xcdrom.sys<br />
ctmouse.exe   edit.hlp      graphpin.com  nansi.sys     xcopy.exe<br />
cwsdpmi.exe   edlin.exe     graph-ps.com  nlsfunc.exe   xdma.sys<br />
debug.com     emm386.exe    himem.exe     pcisleep.com  zip.exe<br />
defrag.exe    fc.exe        kernel.sys    replace.exe</p>
<p>supongamos que queremos agregar un archivo llamado leeme.txt, basta con copiar el archivo al directorio en donde montamos la imágen de disco</p>
<p>sudo cp leeme.txt /home/salomon/imagendisco</p>
<p>si ahora hacemos un ls vemos que el archivo ha sido agregado</p>
<p>append.exe    defrag.hlp    fdapm.com     keyb.exe      replace.exe<br />
assign.com    deltree.com   fdconfig.sys  keyboard.sys  share.com<br />
attrib.com    devload.com   fdisk.exe     keybrd2.sys   shrdrv86.exe<br />
autoexec.bat  diskcomp.com  fdisk.ini     label.exe     shsucdhd.exe<br />
cdrcache.sys  diskcopy.exe  fdiskpt.ini   lbacache.com  shsucdx.com<br />
chkdsk.exe    diskcopy.ini  fdshield.com  <span style="color:#3366ff;">leeme.txt </span> subst.exe<br />
choice.exe    display.exe   fdxms286.sys  loadcd.bat    sys.com<br />
command.com   dosfsck.exe   find.com      mem.exe       tickle.com<br />
comp.com      drvon.com     format.exe    mode.com      tree.com<br />
country.sys   edit.exe      graph-hp.com  more.exe      unzip.exe<br />
ctmouse.exe   edit.hlp      graphpin.com  move.exe      xcdrom.sys<br />
cwsdpmi.exe   edlin.exe     graph-ps.com  nansi.sys     xcopy.exe<br />
debug.com     emm386.exe    himem.exe     nlsfunc.exe   xdma.sys<br />
defrag.exe    fc.exe        kernel.sys    pcisleep.com  zip.exe</p>
<p>Ahorsa sólo desmontamos la imágen de disco</p>
<p>sudo umount /home/salomon/imagendisco</p>
<p>y eso es todo.</p>
<p>El borrado de archivos de la imágen de disco una vez montada es igualmente simple, supongamos que quisieramos borrar el archivo unzip.exe, bastaría con hacer</p>
<p>sudo rm /home/salomon/imagendisco/unzip.exe</p>
<p>Podemos montar la imágen con permisos de sólo lectura si sólo queremos ver el contedido y no vamos a aregar ni borrar archivos de la misma.</p>
<p>sudo mount -t vfat -o loop,ro,umask=0222 balder10.img /home/salomon/imagendisco</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/229/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/229/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/229/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/229/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/229/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=229&subd=salomonrt&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2009/10/05/agregar-archivos-a-una-imagen-de-disco/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>
	</item>
		<item>
		<title>Educando a los usuarios</title>
		<link>http://salomonrt.wordpress.com/2009/08/28/educando-a-los-usuarios/</link>
		<comments>http://salomonrt.wordpress.com/2009/08/28/educando-a-los-usuarios/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 18:59:31 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[Mi punto de vista]]></category>
		<category><![CDATA[desarrollo de software a medida]]></category>
		<category><![CDATA[educar al usuario final]]></category>
		<category><![CDATA[especificación de requisitos]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=222</guid>
		<description><![CDATA[Cuando desarrollamos un software a la medida, es común encontrar que el usuario (la empresa o persona) a quien se le desarrolla la aplicación, no tiene ni la más remota idea de cómo es el proceso de desarrollo de software; es más, muchos no saben ni como copiar archivos de una carpeta a otra en [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=222&subd=salomonrt&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Cuando desarrollamos un software a la medida, es común encontrar que el usuario (la empresa o persona) a quien se le desarrolla la aplicación, no tiene ni la más remota idea de cómo es el proceso de desarrollo de software; es más, muchos no saben ni como copiar archivos de una carpeta a otra en una PC, pero bueno, eso ya es otro tema.</p>
<p>Lo que yo he optado por hacer y hasta ahora me ha funcionado, es explicarles que el proceso de desarrollo de una aplicación es parecido al proceso de construcción de una casa. Primero le decimos al arquitecto lo que tenemos en mente para que el haga el plano, nos lo muestre y nosotros lo aprobemos o le indiquemos si queremos que le haga algunos cambios.</p>
<p>En el caso de que le hayamos indicado que haga cambios al plano, el arquitecto debe hacer un nuevo plano con los cambios y volver a mostrarnoslo para que lo aprobemos. Este proceso se repite hasta que nosotros aprobemos el plano. Es hasta que el plano (arquitectónico) está aprobado por nosotros que el arquitecto empieza a crear los demás planos que se requieren (eléctrico, hidráulico, etc.)</p>
<p>De igual forma, después de que el usuario nos dice que tiene en mente, lo que debemos hacer es la especificación de requisitos, que será la base para el desarrollo de la aplicación. En este documento se describe la funcionalidad que tendrá la aplicación y debe ser aprobado por el usuario. Una vez que la especificación de requisitos es aprobada por el usuario, empezamos a hacer el diagrama entidad-relación de la base de datos, etc.</p>
<p>El que el usuario espere ver la primer pantalla de la aplicación un dia después de que nos dijo cuáles son sus necesidades, es tanto como esperar que el arquitecto levante la primera barda inmediatamente después de que le dijimos lo que tenemos en mente, sin que haga un plano que nos muestre para que lo aprobemos, es ilógico ¿no creen?</p>
<p>Así como en el proceso de construcción de una casa, no le preguntamos al arquitecto a la mitad de la obra &#8220;¿en dónde va a estar ubicada la cancha de tenis?&#8221;, siendo que en el plano que nos mostró y que nosotros aprobamos no aparece ninguna cancha de tenis, está por demás explicarle al usuario que no esperamos que a la mitad del desarrollo de la aplicación nos pregunte &#8220;¿En qué menú estará la opción de facturación?&#8221;, cuando en la especificación de requisitos que le mostramos y que aprobó no se habla en ningún momento de un módulo de facturación.</p>
<p>Otra analogía entre el desarrollo de una aplicación y la construcción de una casa que utilizo es para hacerles entender que cuesta mas agregar funcionalidad a un módulo ya hecho que incluir dicha funcionalidad en el módulo desde un principio.</p>
<p>Supongamos que el arquitecto ya terminó la planta baja de nuestra casa, está construyendo la planta alta y le decimos que queremos que el medio baño de la planta baja, que está junto a la sala, ahora sea baño completo. &#8220;¿Se puede hacer esa modificación?&#8221;, probablemente si, pero desde luego costará más de lo que hubiera costado si desde que nos mostró el plano para que lo aprobaramos le hubieramos pedido esto, cuesta más porque ahora hay que instalar más tubería para que llegue agua caliente a la regadera que se instalaŕa en ese baño, y probablemente habrá que tirar algún muro para que haya espacio para la ducha en ese baño.</p>
<p>De igual forma, generalmente el agregar a un módulo ya hecho funcionalidad que no se contempló desde un inicio, cuesta más porque implica más trabajo. Así de simple.</p>
<p>En conclusión, debemos hacer entender al usuario que no debe asumir que la aplicación tendrá funcionalidad que en la especificación de requisitos no se dijo que tendría. Nada de que &#8220;yo pensé&#8221;, &#8220;es que es obvio&#8221;, y otras frases por el estilo.</p>
<p>Si desarrollas software a medida, te recomiendo hacer la especificación de requisitos y que el usuario la firme como aprobada antes de empezar con el desarrollo. Evitarás malos entendidos y problemas posteriores.</p>
<p>Y si tu eres usuario final, desconfia de la capacidad de cualquier &#8220;profesional de sistemas&#8221; que te prometa mostrarte avances de la aplicación sin antes haber hecho la especificación de requisitos y sobre todo, antes de haber construido el diagrama entidad-relación de la base de datos y demás &#8220;planos&#8221;. Es equivalente a que el arquitecto que construirá tu casa te diga que verás la primera barda sin antes haberte mostrado el plano.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/222/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=222&subd=salomonrt&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2009/08/28/educando-a-los-usuarios/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>
	</item>
		<item>
		<title>Reviviendo PC&#8217;s &#8220;obsoletas&#8221;, (según para que)</title>
		<link>http://salomonrt.wordpress.com/2009/08/04/reviviendo-pcs-obsoletas-segun-para-que/</link>
		<comments>http://salomonrt.wordpress.com/2009/08/04/reviviendo-pcs-obsoletas-segun-para-que/#comments</comments>
		<pubDate>Wed, 05 Aug 2009 00:24:50 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[Por diversión, y otros temas]]></category>
		<category><![CDATA[Linux en 386]]></category>
		<category><![CDATA[Linux en 486]]></category>
		<category><![CDATA[reutilizar computadora vieja.]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=191</guid>
		<description><![CDATA[Desde hace algún tiempo quería instalar un sistema operativo tipo Unix en 2 PC&#8217;s antiguas que tenía por ahi sin usar; ya sea alguna distribución de GNU/Linux o algún BSD (FreeBSD, NetBSD, etc.). Después de varios días de pruebas e investigación, logré dicho propósito.
Equipo 1
PC con procesador AMD 386SX a 40Mhz, sin FPU (coprocesador matemático), [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=191&subd=salomonrt&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Desde hace algún tiempo quería instalar un sistema operativo tipo Unix en 2 PC&#8217;s antiguas que tenía por ahi sin usar; ya sea alguna distribución de GNU/Linux o algún BSD (FreeBSD, NetBSD, etc.). Después de varios días de pruebas e investigación, logré dicho propósito.</p>
<p><strong>Equipo 1</strong></p>
<p>PC con procesador <a href="http://commons.wikimedia.org/wiki/File:Ic-photo-AMD--Am386SX-40--(NG80386SX-40)--(386-CPU).png" target="_blank">AMD 386SX a 40Mhz</a>, sin <a href="http://es.wikipedia.org/wiki/FPU" target="_blank">FPU</a> (coprocesador matemático), 4MB de memoria RAM, de los cuales el motherboard toma los 640K de memoria base. El motherboard tiene 2 bancos de memoria de 2 slots cada uno (utliza SIMMS de 30 pins) y soporta un máximo de 16MB de RAM. Floppy de 3.5&#8243; 1.44MB y CD-ROM SCSI conectado a tarjeta de sonido Pro Audio 16.</p>
<p><strong>Equipo 2</strong></p>
<p>PC con procesador Cyrix 486DLC a 40Mhz, con FPU y también 4MB de memoria RAM, este motherboard tiene 2 bancos de 4 slots cada uno, también utiliza SIMMS de 30 pins y soporta un máximo de 32MB de RAM. Floppy de 3.5&#8243; 1.44MB y no tiene CD-ROM.</p>
<p><strong>Antecedentes</strong></p>
<p>De alguna forma, la mayoría de la información que encontré en internet no satisfacía mis requerimientos.</p>
<p>Mucha información de distribuciones GNU/Linux para &#8220;equipos antiguos&#8221; o &#8220;con pocos recursos&#8221; se refería a PC&#8217;s Pentium I con 128MB de RAM o a equipos mas recientes, si bien el Pentium I no es el procesador más potente en este año 2009, hay muchas distribuciones GNU/Linux con las que ese equipo puede funcionar de manera bastante aceptable; pero para una 386SX las opciones disminuyen considerablemente.</p>
<p>Las opciones mas viables eran distribuciones del tipo <a href="http://www.damnsmalllinux.org/" target="_blank">DSL (Damm Small Linux)</a>, <a href="http://www.angelfire.com/anime/db/gcl/" target="_blank">Gray Cat Linux</a>, <a href="http://www.volny.cz/basiclinux/" target="_blank">BasicLinux</a>, <a href="http://mulinux.dotsrc.org/" target="_blank">MuLinux</a>, etc., pero yo no quería un livecd, ni una distribución que funcionara en RAM, en un loop, desde floppy o instalada sobre DOS, ni cosas por el estilo, sino un sistema operativo que se instalara en disco duro, que arrancara desde ahi y utilizara su partición swap, etc., es decir, una instalación &#8220;normal&#8221;. No me importaba que fuera sólo consola, sin las X (el ambiente gráfico).</p>
<p><strong>Recopilando hardware faltante para llevar a cabo la misión<br />
</strong></p>
<p>Ninguno de los Bios de los 2 motherboards trae la opción para arrancar desde CD. Asi que tenía que ser una instalación por red, desde luego otra opción era instalar conectando otra PC por el puerto serial y desde ahi hacer la instalación, o poner el disco duro en una PC &#8220;moderna&#8221;, instalar ahi y regresar el disco, pero eso para mi es tanto como evitar el desafío, y de paso perderse la diversión.</p>
<p>También me di cuenta que con menos de 4MB de RAM reales (recuerden que comenté que de esos 4MB, el motherboard toma 640K para la memoria base), era practicamente imposible instalar un sistema operativo tipo Unix que no estuviera &#8220;tan&#8221; desactualizado; así que compré por internet 2 tarjetas de red ISA Ethernet 10baseT usadas y un lote de módulos de memoria en donde venían SIMMS de 30 pins de 1MB y de 4MB, también incluía unos SIMMS de 72 pins y uno que otro DIMM de 168 pins.</p>
<p>Tenía varios discos duros antiguos de los cuales seleccione para la 386SX uno de 630MB y uno de poco mas de 200MB; para la 486DLC elegi uno de 2GB (varios Motherboards antiguos tienen un Bios que no reconoce discos de mas de 2GB, y algunos otros no reconocen discos de mas de 500MB).</p>
<p>Finalmente la 386SX quedó con 16MB de RAM</p>
<p><img class="aligncenter size-full wp-image-197" title="386sx_screen" src="http://salomonrt.files.wordpress.com/2009/08/386sx_screen.jpg?w=450&#038;h=177" alt="386sx_screen" width="450" height="177" /></p>
<p>y la 486DLC con 32MB</p>
<p><img class="aligncenter size-full wp-image-198" title="486dlc_screen" src="http://salomonrt.files.wordpress.com/2009/08/486dlc_screen.jpg?w=449&#038;h=189" alt="486dlc_screen" width="449" height="189" /></p>
<p><strong>Las pruebas</strong></p>
<p>Las tarjetas de red que consegui son una 3com modelo 3C509B-TPO y una AT/LANTIC con chip DP83905AVQ, que es un clon de las tarjetas NE2000.</p>
<p>Ninguna de estas tarjetas es configurable via jumpers, sólo se pueden configurar mediante un programa hecho por el respectivo fabricante. Bueno, la AT/LANTIC tiene una entrada para un jumper, si pones el jumper en dicha entrada, la tarjeta queda configurada en la dirección io=0&#215;300, irq=3; de lo contratio, tomará la io e irq que se le haya configurado mediante el software mencionado.</p>
<p><span style="color:#3366ff;"><span style="color:#0000ff;"><span style="text-decoration:underline;">FreeBSD</span></span> </span>quitó el soporte para el procesador 80386 desde la versión 5.0 (<a href="http://www.freebsd.org/releases/5.0R/relnotes-i386.html" target="_blank">http://www.freebsd.org/releases/5.0R/relnotes-i386.html</a>), así que tenia que probar con una versión anterior. La documentación de <a href="http://www.freebsd.org/releases/4.11R/installation-i386.html" target="_blank">FreeBSD versión 4.11</a> dice que funciona en una PC con procesador 80386 y que el programa de instalación requiere 16MB de RAM así que probé instalarlo en la 386SX, todo funcionó aparentemente bien hasta que terminada la instalación llegó el momento de reiniciar la Pc, ya con FreeBSD 4.11 instalado. En un momento del arranque, empezó a enviar el siguiente mensaje n veces</p>
<p>microuptime() went backwards (44525.3954411 -&gt; 44524.563978)</p>
<p>microuptime() went backwards (57425.4282241 -&gt; 57424.766121)</p>
<p>microuptime() went backwards (57425.4282241 -&gt; 57424.845844)</p>
<p>Los números antes y después del símbolo &#8220;&gt;&#8221; cambiaban en cada renglón, pero parecía haberse ciclado.</p>
<p>Busqué en internet información al respecto y encontré varios post de otros usuarios reportando lo mismo, a algunos no les pasaba al momento de reincicar la máquina, sino depués, a otros les enviaba el mensaje esporádicamente, etc. pero nunca encontré un post en donde se dijera como solucionarlo, al parecer era un problema en el kernel de algunas versiones de FreeBSD que se presentaba en algunos equipos.</p>
<p><span style="color:#0000ff;"><span style="text-decoration:underline;">NetBSD</span></span> por su parte, incluyó la leyenda &#8220;Removed support for 80386 level CPUs&#8221;  en el anuncio de su versión 5.0 (<a href="http://netbsd.org/releases/formal-5/NetBSD-5.0.html" target="_blank">http://netbsd.org/releases/formal-5/NetBSD-5.0.html</a>) por lo que probé con la versión 4.0.1. A pesar de que en la <a href="http://ftp.netbsd.org/pub/NetBSD/NetBSD-4.0.1/i386/INSTALL.html" target="_blank">documentación</a> dice textualmente:</p>
<p>&#8220;NetBSD 4.0.1 runs on ISA (AT-Bus), EISA, MCA, PCI, and VL-bus systems with 386-family processors, with or without math coprocessors. The minimal configuration is said to require 4 MB of RAM and 50 MB of disk space, though we do not know of anyone running with a system quite this minimal today&#8221;</p>
<p>Probé con sólo 8MB de RAM en la 386SX pero la máquina se reiniciaba después de insertar el segundo floppy, agregué los otros 8MB y probé con 16MB de RAM pero sucedio lo mismo.</p>
<p>Probé entónces con la versión 3.1.1 y esta si logré instalarla</p>
<p><img class="aligncenter size-full wp-image-203" title="NetBSD_3_1_1" src="http://salomonrt.files.wordpress.com/2009/08/netbsd_3_1_12.jpg?w=450&#038;h=337" alt="NetBSD_3_1_1" width="450" height="337" />Pero, lo que me descepcionó fue que como podrán comprobar en el sitio <a href="http://ftp.netbsd.org/pub/NetBSD/NetBSD-archive/NetBSD-3.1.1/i386/" target="_blank">http://ftp.netbsd.org/pub/NetBSD/NetBSD-archive/NetBSD-3.1.1/i386/</a> no se encuentran los packages o el arbol de ports, sólo están los paquetes del kernel y los sets básicos, asi que no es posible instalarle programas ya compilados (los packages) ni bajar los fuente de los programas para esa versión para compilarlos. Lo que hice fue bajar de <a href="http://ftp.netbsd.org/pub/NetBSD/packages/distfiles/" target="_blank">http://ftp.netbsd.org/pub/NetBSD/packages/distfiles/</a> unos fuente para compilarlos y ver si era viable o no, ya que por la capacidad de la máquina, la compilación iba a tardar bastante, además de que esos fuente no dice si son independientes de la versión, lo más probable es que sean para la versión current (en este caso la 5.0.1) por lo que probablemente no funciarían en esta versión 3.1.1</p>
<p>Empece por compilar el mc (midnight comander) y al ejecutar el ./configure, encontró que no pudo descargar unas dependencias, me parece que una versión de glibc que requería.</p>
<p>Traté entónces con el paquete bash, el ./configure si terminó de ejecutarse correctamente después de varias horas por lo que pase a la compilación con el respectivo make install clean, pero tuve que darle Ctrl-C porque ya llevaba 10 horas compilando y no terminaba. La conclusión es que aunque se pudo instalar, debido a que no existen los packages, la instalación de programas compilando los fuentes no es viable por el tiempo que se lleva.</p>
<p>En verdad no le veo mucho sentido a tener un sitio de archivo de NetBSD, si no van a archivar los packages y el arbol de ports de todas las versiones, FreeBSD y Debian si lo tienen (como debe de ser).</p>
<p>Intenté otras distribuciones como Slackware, Feather, etc. pero ninguna funcionó (no voy a aburrirlos con los detalles de los errores que marcaban).</p>
<p>La distribución GNU/Linux (que cumpliera los requisitos que mencioné al principio del post) con la que logré hacer funcionar la 386SX fue <span style="color:#0000ff;"><span style="text-decoration:underline;">Debian 3.0 (Woody).</span></span></p>
<p><img class="aligncenter size-full wp-image-207" title="debian_3_0" src="http://salomonrt.files.wordpress.com/2009/08/debian_3_01.jpg?w=450&#038;h=337" alt="debian_3_0" width="450" height="337" /></p>
<p>A la 486DLC logré instalarle NetBSD 4.0.1 pero funcionaba extremadamente lento, además de que debido a la política de NetBSD de no guardar los packages de versiones archivadas, una vez que archiven esta versión, no habrá forma &#8220;viable&#8221; de instalarle programas a esta PC, y como eso definitivamente para mi es inaceptable, opté por FreeBSD.</p>
<p>Probé instalar FreeBSD 5.0 en la 486DLC y funcionó</p>
<p><img class="aligncenter size-full wp-image-208" title="FreeBSD_5_0" src="http://salomonrt.files.wordpress.com/2009/08/freebsd_5_0.jpg?w=450&#038;h=337" alt="FreeBSD_5_0" width="450" height="337" /></p>
<p>Pude instalar los packages de mc, bash, sudo y nano sin problemas y sin esperar horas y horas.</p>
<p>Desde luego no crean que los primeros intentos por instalar los sistemas operativos con que finalmente quedaron las máquinas funcionaron a la primera, tuve problemas para configurar las tarjetas de red tanto en Debian como en FreeBSD, ya sea porque entraba en conflicto el irq que tenian programado con el irq de algún otro dispositivo como el puerto serial, etc. Estuve cambiando la configuración de las tarjetas, cambiando las tarjetas de una máquina a otra e indicando a la hora de la instalación que cargara el driver correspondiente especificando las direcciones io, etc.</p>
<p>Con FreeBSD sucedió algo curioso, en 2 ocasiones al estar instalando, una con la tajeta de red 3com y otra con la AT/LANTIC al llegar al punto en donde debería empezar a descargar los paquetes, se quedaba &#8220;trabado&#8221; al intentar logearse al servidor ftp ftp://ftp-archive.freebsd.org/, intenté utilizando un mirror, específicamente el servidor ftp://ftp.ru.freebsd.org/ y funcionó bastante bien, de hecho se descargo rápido (para ser con una tarjeta de red a 10Mbps).</p>
<p>Además de buscar información en internet cada vez que algo no funcionaba con la instalación, entré varias veces a canales de IRC de NetBSD, FreeBSD, Debian, etc. Encontré algunas personas que me proporcionaron información que me ayudó a resolver el problema, otras sugerencias no resultaron efectivas pero igualmente agradezco a aquellas personas que intentaron ayudarme. Desafortunadamente también encontré mucha gente ignorante, y lamentablemente fue en todos los canales de IRC a los que entré, que lejos de ayudar, hacia comentarios ridículos como &#8220;Actualmente puedes comprar una Pentium con mucha mas RAM por x cantidad&#8221;, o &#8220;Eso es una pérdida de tiempo&#8221;. Aún cuando comenté que desde luego que cuento con una PC con mejores características que esas máquinas, pero el atractivo del proyecto era por un lado el reto que implicaba, y por otro, demostrar que PC&#8217;s como esas sirven &#8220;perfectamente&#8221; para desarrollar aplicaciones simples en C, o usando C y ncurses, o C++, etc.</p>
<p>Una 386 o 486 con un sistema operativo tipo Unix puede funcionar como servidor de archivos (desde luego no con una carga excesiva), servidor de impresión y muchos otros usos mas. Por ejemplo, pienso hacer pruebas con la 486DLC para ver si puede funcionar como thin client utilizando <a href="http://www.ltsp.org/" target="_blank">LTSP</a>, de acuerdo a las especificaciones mínimas descritas en <a href="http://wiki.ltsp.org/twiki/bin/view/Ltsp/LTSPTerminal" target="_blank">http://wiki.ltsp.org/twiki/bin/view/Ltsp/LTSPTerminal</a> parece que si.</p>
<p>En fin, probablemente quienes no programaron (por lo menos el &#8220;hola mundo&#8221;) antes de 1990, no vean el atractivo que tienen este tipo de proyectos, y digo probablemente porqe habrá quienes no necesiten mayor explicación para ver lo interesante que son.</p>
<p>Pero la cuestión es muy simple, si yo no lo entiendo, se me hace muy complicado porque no se usar una PC si no tiene ambiente gráfico, mis conocimientos en la materia son muy pocos , o simplemente no me interesa, pues no opino y me quedo callado antes de decir tonterías con las que únicamente logro que las otras personas en el canal se den cuenta de que además de ignorante soy un intolerante.</p>
<p>Les presento a Frank (la 386SX)</p>
<p><img class="aligncenter size-full wp-image-210" title="386sx_full" src="http://salomonrt.files.wordpress.com/2009/08/386sx_full.jpg?w=450&#038;h=243" alt="386sx_full" width="450" height="243" /></p>
<p>y a Frank2 (la 486DLC).</p>
<p><img class="aligncenter size-full wp-image-211" title="486dlc_full" src="http://salomonrt.files.wordpress.com/2009/08/486dlc_full.jpg?w=450&#038;h=243" alt="486dlc_full" width="450" height="243" /></p>
<p>Los nombres son alusivos a Frankenstain desde luego :).</p>
<p>En las 2 PC tomé el tiempo que pasa desde que se prende la PC hasta que pide el login y estos son los resultados.</p>
<p>La 386SX con 16MB de RAM y Debian 3.0 tarda 3 minutos</p>
<p>La 486DLC con 32MB de RAM y FreeBSD 5.0 tarda 12 minutos</p>
<p>Esto no quiere decir que Debian 3.0 sea mejor que FreeBSD 5.0 ya que están instalados en hardware diferente y el tiempo de arranque sólo nos dice eso, &#8220;el tiempo de arranque&#8221; y nada mas, sólo quise ponerlo como mero dato informativo.</p>
<p>Y sin hacer caso a los comentarios de aquellos ignorantes e intolerantes que no son dignos representantes de la comunidad de usuarios y desarrolladores de software libre, mucho menos de la comunidad informática, les comento que tengo una PC con procesador 80286 y 4MB de RAM en la que pienso instalar FreeDOS. Tengo también unos motherboards 8088 con 512K de RAM creo, pero tendría que desarmar la 286 para utilizar tarjeta controladora, de video, etc.</p>
<div id="_mcePaste" style="overflow:hidden;position:absolute;left:-10000px;top:2021px;width:1px;height:1px;">http://netbsd.org/releases/formal-5/NetBSD-5.0.html</div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/191/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=191&subd=salomonrt&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2009/08/04/reviviendo-pcs-obsoletas-segun-para-que/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>

		<media:content url="http://salomonrt.files.wordpress.com/2009/08/386sx_screen.jpg" medium="image">
			<media:title type="html">386sx_screen</media:title>
		</media:content>

		<media:content url="http://salomonrt.files.wordpress.com/2009/08/486dlc_screen.jpg" medium="image">
			<media:title type="html">486dlc_screen</media:title>
		</media:content>

		<media:content url="http://salomonrt.files.wordpress.com/2009/08/netbsd_3_1_12.jpg" medium="image">
			<media:title type="html">NetBSD_3_1_1</media:title>
		</media:content>

		<media:content url="http://salomonrt.files.wordpress.com/2009/08/debian_3_01.jpg" medium="image">
			<media:title type="html">debian_3_0</media:title>
		</media:content>

		<media:content url="http://salomonrt.files.wordpress.com/2009/08/freebsd_5_0.jpg" medium="image">
			<media:title type="html">FreeBSD_5_0</media:title>
		</media:content>

		<media:content url="http://salomonrt.files.wordpress.com/2009/08/386sx_full.jpg" medium="image">
			<media:title type="html">386sx_full</media:title>
		</media:content>

		<media:content url="http://salomonrt.files.wordpress.com/2009/08/486dlc_full.jpg" medium="image">
			<media:title type="html">486dlc_full</media:title>
		</media:content>
	</item>
		<item>
		<title>Capturar sólo números en C++ Builder</title>
		<link>http://salomonrt.wordpress.com/2009/06/22/capturar-solo-numeros-en-c-builder/</link>
		<comments>http://salomonrt.wordpress.com/2009/06/22/capturar-solo-numeros-en-c-builder/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 01:12:00 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[C++ Builder]]></category>
		<category><![CDATA[capturar solo numeros en c++ builder]]></category>
		<category><![CDATA[OnKeyPress]]></category>
		<category><![CDATA[validar TEdit]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=182</guid>
		<description><![CDATA[En ocasiones necesitamos validar que en un control TEdit el usuario sólo pueda teclear números. Lo que hay que hacer es poner el siguiente código en el evento OnKeyPress de nuestro TEdit.


void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &#38;Key)
{
 if (!((Key &#62;= '0' &#38;&#38; Key &#60;= '9') &#124;&#124; Key == '\b'))
    Key = 0;
}

Lo que hace este [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=182&subd=salomonrt&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>En ocasiones necesitamos validar que en un control TEdit el usuario sólo pueda teclear números. Lo que hay que hacer es poner el siguiente código en el evento OnKeyPress de nuestro TEdit.</p>
<pre class="brush: cpp;">

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &amp;Key)
{
 if (!((Key &gt;= '0' &amp;&amp; Key &lt;= '9') || Key == '\b'))
    Key = 0;
}
</pre>
<p>Lo que hace este código es ignorar la tecla pulsada si dicha tecla no está dentro del rango de 0 a 9 y tampoco es el backspace (retroceso). Si queremos que los números estén alineados a la derecha, el truco es no utilizar un TEdit, sino un control TMemo haciendolo del tamaño deseado y seleccionando la opción taRightJustify en la propiedad <strong>Alignment</strong> e indicando el número máximo de caracteres en la propiedad <strong>MaxLength</strong>.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/182/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=182&subd=salomonrt&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2009/06/22/capturar-solo-numeros-en-c-builder/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>
	</item>
		<item>
		<title>Alternativas a GNU/Linux</title>
		<link>http://salomonrt.wordpress.com/2009/05/22/alternativas-a-gnulinux/</link>
		<comments>http://salomonrt.wordpress.com/2009/05/22/alternativas-a-gnulinux/#comments</comments>
		<pubDate>Fri, 22 May 2009 19:04:25 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[alternativas linux]]></category>
		<category><![CDATA[otros sistemas operativos]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=172</guid>
		<description><![CDATA[Recibí un comentario de Pedro en la página &#8220;Acerca de&#8230;&#8221; de este blog, y este post es en respuesta a su comentario ya que creo que alguien más puede tener la misma inquietud.
Es cierto que existen otros sistemas operativos y algunos seguramente mejores que GNU/Linux, por ejemplo en mi opinión, los BSD (FreeBSD, NetDBSD, etc.) [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=172&subd=salomonrt&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Recibí un comentario de Pedro en la página &#8220;<a href="http://salomonrt.wordpress.com/about/" target="_blank">Acerca de&#8230;</a>&#8221; de este blog, y este post es en respuesta a su comentario ya que creo que alguien más puede tener la misma inquietud.</p>
<p>Es cierto que existen otros sistemas operativos y algunos seguramente mejores que GNU/Linux, por ejemplo en mi opinión, los BSD (FreeBSD, NetDBSD, etc.) son un poco mas robustos y eficientes que GNU/Linux.<br />
El que un sistema operativo sea mejor que otro tiene una parte subjetiva, ya que hay que tomar en cuenta el tipo de computadora para la que estemos seleccionando el sistema operativo y también la función que desempeñará la computadora en cuestión.</p>
<p>Por tipo de computadora no me refiero a el procesador, sino a la clasificación, es decir PC&#8217;s (notese que en esta categoría entran también las Mac, ya que PC significa computadora personal y la Mac es una computadora personal), mini computadoras (por ejemplo la <a href="http://en.wikipedia.org/wiki/IBM_System_i" target="_blank">AS/400</a>), estaciones de trabajo (como la <a href="http://es.wikipedia.org/wiki/RS/6000" target="_blank">RS/6000</a>), mainframes (como la <a href="http://en.wikipedia.org/wiki/ZSeries" target="_blank">S/390</a>), etc.<br />
Cuando digo &#8220;la función que desempeñará la computadora&#8221; me refiero a tomar en cuenta si es una PC que usará un usuario final para navegar en internet, chatear, escuchar música y enviar y recibir mails o si será un servidor que funcionará como servidor web, servidor de correo, servidor FTP, o cualquier otro uso.</p>
<p>Entonces tenemos que para computadoras personales no hay muchos sistemas operativos que valgan la pena entre los cuales elegir, por ejemplo aparte de GNU/Linux tenemos los basados en BSD (<a href="http://www.freebsd.org/" target="_blank">FreeBSD</a>, <a href="http://netbsd.org/" target="_blank">NetBSD</a>, <a href="http://www.openbsd.org/" target="_blank">OpenBSD</a>, y los derivados de estos 3 como <a href="http://www.pcbsd.org/" target="_blank">PC-BSD</a>, <a href="http://www.desktopbsd.net/" target="_blank">DesktopBSD</a>, <a href="http://www.dragonflybsd.org/" target="_blank">DragonFly BSD</a>, etc.). Dentro de los que no son software libre ni open source, tenemos a <a href="http://en.wikipedia.org/wiki/Mac_OS_X" target="_blank">Mac OS X</a>, el sistema operativo de las Mac, que está basado en <a href="http://es.wikipedia.org/wiki/Darwin_BSD" target="_blank">Darwin</a>. Aunque Mac OS X no es software libre ni open source, y mucho menos gratuito, Darwin si es open source (<a href="http://developer.apple.com/Darwin/" target="_blank">http://developer.apple.com/Darwin</a>).</p>
<p>Ahora, para quienes tienen PC&#8217;s &#8220;antiguas&#8221; con procesadores desde 8088 con 640k de RAM existe <a href="http://www.freedos.org/" target="_blank">FreeDOS</a> que es una alternativa a los DOS que no son open source, como <a href="http://es.wikipedia.org/wiki/MS-DOS" target="_blank">MS-DOS</a> de Microsoft, <a href="http://www.drdos.com/company/index.htm?rnd=1079647522426" target="_blank">DRDOS</a> de la desaparecida Digital Research, <a href="http://es.wikipedia.org/wiki/PC-DOS" target="_blank">PC-DOS</a> de IBM, etc. Para aquellas PC&#8217;s con 512k de RAM o menos, probablemente sirva el sitema operativo <a href="http://www.seasip.demon.co.uk/Cpm/" target="_blank">CP/M</a> que usaban las <a href="http://en.wikipedia.org/wiki/Apple_IIe" target="_blank">Apple IIe</a> y pueden descargar desde aqui <a href="http://www.cpm.z80.de/" target="_blank">http://www.cpm.z80.de/</a> (lean la licencia antes de usarlo)</p>
<p>Como alternativas para servidores (además de GNU/Linux y los BSD) existen varias versiones de Unix como <a href="http://es.wikipedia.org/wiki/Solaris_(sistema_operativo)" target="_blank">Solaris</a> cuya versión open source es <a href="http://opensolaris.org/os/" target="_blank">Open Solaris</a>, <a href="http://es.wikipedia.org/wiki/AIX" target="_blank">AIX</a> de IBM, y otros.</p>
<p>Para las mini computadoras, estaciones de trabajo, etc. existen otros sistemas operativos, la mayoría se puede decir que fueron creados para un modelo específico de computadora, como el <a href="http://es.wikipedia.org/wiki/OS/400" target="_blank">OS/400</a> para las AS/400, el <a href="http://es.wikipedia.org/wiki/OS/390" target="_blank">OS/390</a> para las S/370 y S/390, que antes usaban el sistema operativo <a href="http://es.wikipedia.org/wiki/MVS" target="_blank">MVS</a>. Las computadoras VAX utilizan el sistema operativo <a href="http://es.wikipedia.org/wiki/OpenVMS" target="_blank">OpenVMS</a>, antes llamado sólo VMS.</p>
<p>Espero esto sirva como referencia y ya será iniciativa de cada quien investigar más al respecto.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/172/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/172/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/172/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/172/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/172/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=172&subd=salomonrt&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2009/05/22/alternativas-a-gnulinux/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>
	</item>
		<item>
		<title>Renombrar archivos usando C++ en GNU/Linux</title>
		<link>http://salomonrt.wordpress.com/2009/05/08/renombrar-archivos-usando-c-en-gnulinux/</link>
		<comments>http://salomonrt.wordpress.com/2009/05/08/renombrar-archivos-usando-c-en-gnulinux/#comments</comments>
		<pubDate>Sat, 09 May 2009 01:24:39 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[dirent.h]]></category>
		<category><![CDATA[funcion rename c++]]></category>
		<category><![CDATA[renombrar archivos en c++]]></category>
		<category><![CDATA[renombrar archivos linux]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=163</guid>
		<description><![CDATA[En GNU/Linux (en los sistemas operativos tipo Unix en general, incluidos FreeBSD, etc.) no es recomendable manejar nombres de archivo que contengan espacios.
Puede darse el caso de que copiemos desde otro sistema operativo archivos que contienen espacios en su nombre, a nuestra máquina con GNU/Linux. Entónces, ¿qué hacer en esos casos?
Efectivamente&#8230; &#8220;lo recomendable&#8221; es renombrarlos [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=163&subd=salomonrt&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>En GNU/Linux (en los sistemas operativos tipo Unix en general, incluidos FreeBSD, etc.) no es recomendable manejar nombres de archivo que contengan espacios.</p>
<p>Puede darse el caso de que copiemos desde otro sistema operativo archivos que contienen espacios en su nombre, a nuestra máquina con GNU/Linux. Entónces, ¿qué hacer en esos casos?</p>
<p>Efectivamente&#8230; &#8220;lo recomendable&#8221; es renombrarlos para eliminar los espacios que contiene el nombre de archivo. Como puede ser una cantidad considerable de archivos, nos tomaría mucho tiempo ir renombrando archivo por archivo.</p>
<p>Exísten diferentes opciones para automatizar esa tarea, haciendo un script para bash, utilizando AWK y muchas otras soluciones.</p>
<p>A continuación un programa en C++ al que le podemos enviar una lista de directorios para que renombre todos los archivos que se encuentran en ellos eliminando los espacios del nombre de archivo.</p>
<pre class="brush: cpp;">
/****************************************
 * Archivo: renombrar_archivos.cpp               
 * Autor  : SALOMON RINCON TORRES       
 * Fecha  : 08/05/2009 (dd/mm/yyyy)
 */

#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;sys/types.h&gt;
#include &lt;dirent.h&gt;

using namespace std;

string QuitaEspacios(string s_cadena)
{
 string s_aux;

 for (int i_pos = 0; i_pos &lt; s_cadena.length(); i_pos++)
     {
       if (s_cadena[i_pos] != ' ')
           s_aux += s_cadena[i_pos];
     }
 return s_aux;
}

int main (int argc, char *argv[])
{
 DIR *dirh;
 struct dirent *dirp;
 string s_dir, s_nombre, s_nuevonombre;
 int i_renombrados = 0, i_ok = 0, i_fallos = 0;

 for(int i = 1; i &lt; argc; i++)
    {
     s_dir = argv[i];
     i_renombrados = 0;
     i_ok = 0;
     i_fallos = 0;

     cout &lt;&lt; &quot;******************** Directorio \&quot;&quot; &lt;&lt; s_dir &lt;&lt; &quot;\&quot; ********************\n&quot; &lt;&lt; endl;

     if ((dirh = opendir(s_dir.c_str())) == NULL)
         perror(&quot;No se pudo accesar al directorio &quot;);
     else
        {
         for (dirp = readdir(dirh); dirp != NULL; dirp = readdir(dirh))
             {
              s_nombre = dirp-&gt;d_name;

              // Checamo que no sea el directorio . o ..
              if (s_nombre != &quot;.&quot; &amp;&amp; s_nombre != &quot;..&quot;)
                 {
                  cout &lt;&lt; &quot;Archivo: &quot; &lt;&lt; s_nombre &lt;&lt; endl;

                  // Si el nombre del archivo tiene un espacio, lo renombramos
                  if (s_nombre.find(&quot; &quot;) != string::npos)
                     {           
                      s_nuevonombre = QuitaEspacios(s_nombre);

                      if (rename((s_dir+&quot;/&quot;+dirp-&gt;d_name).c_str(), (s_dir+&quot;/&quot;+s_nuevonombre).c_str()) == 0)
                         {
                          i_renombrados++;
                          cout &lt;&lt; &quot;   === Renombrado como: &quot; &lt;&lt; s_nuevonombre.c_str() &lt;&lt; endl;
                         }
                      else
                          {
                           i_fallos++;
                           perror(&quot;No se pudo renombrar&quot;);
                          }
                     } /* if */
                  else
                      {
                       i_ok++;
                       cout &lt;&lt; &quot;OK\n&quot;;
                      }
                 } /* if */
             } /* for */

         closedir(dirh);
         cout &lt;&lt; endl;
         cout &lt;&lt; &quot;--- Archivos renombrados: &quot; &lt;&lt; i_renombrados &lt;&lt; endl;
         cout &lt;&lt; &quot;--- Archivos OK: &quot; &lt;&lt; i_ok &lt;&lt; endl;
         cout &lt;&lt; &quot;--- Archivos que no se pudieron renombrar: &quot; &lt;&lt; i_fallos &lt;&lt; endl &lt;&lt; endl;
        } /* else */
    } /* for */
 return 0;
}
</pre>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/163/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=163&subd=salomonrt&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2009/05/08/renombrar-archivos-usando-c-en-gnulinux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>
	</item>
		<item>
		<title>Validar Entry en Gtk#</title>
		<link>http://salomonrt.wordpress.com/2009/04/24/validar-entry-en-gtk-sharp/</link>
		<comments>http://salomonrt.wordpress.com/2009/04/24/validar-entry-en-gtk-sharp/#comments</comments>
		<pubDate>Sat, 25 Apr 2009 02:31:06 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Capturar sólo números]]></category>
		<category><![CDATA[Entry Gtk#]]></category>
		<category><![CDATA[Mono]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=145</guid>
		<description><![CDATA[Recientemente necesitaba validar un &#8220;Entry&#8221; en gtk-sharp para que el usuario sólo pudiera capturar números. Nunca antes había programado en Mono y tampoco había desarrollado interfaces gráficas usando Gtk o Gtk#, asi que probablemente este post le sea útil únicamente a novatos en Mono y Gtk# ( como yo :) ).
Buscando en internet encontré 2 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=145&subd=salomonrt&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Recientemente necesitaba validar un &#8220;Entry&#8221; en gtk-sharp para que el usuario sólo pudiera capturar números. Nunca antes había programado en Mono y tampoco había desarrollado interfaces gráficas usando Gtk o Gtk#, asi que probablemente este post le sea útil únicamente a novatos en Mono y Gtk# ( como yo :) ).</p>
<p>Buscando en internet encontré 2 posts, de los cuales tome código y le hice pequeñas adecuaciones para crear 2 clases que son subclases de la clase Entry.</p>
<p>Lo que hace el código es capturar el evento <strong>KeyPress</strong> y verificar la tecla que pulsó el usuario, a partir de ahi decide si es una tecla o caracter permitido o no.</p>
<p>Creé una clase llamada EntryEnteros y una clase llamada EntryDecimales. Las clases son casí idénticas, la diferencia es que la segunda acepta el punto como caracter permitido y la primera no. Esto implica que en la segunda clase se agrega el caracter &#8220;.&#8221; en la cadena s_charvalidos pero también se captura cuando el usuario pulsa el punto del teclado numérico (Gdk.Key.KP_Decimal).</p>
<p>El código del post <a href="http://nexus.developarts.com/limitar_la_captura_de_un_entry#comment-769" target="_blank">http://nexus.developarts.com/limitar_la_captura_de_un_entry#comment-769</a> no funciona si el usuario usa el teclado numérico para introducir datos, sólo acepta los números de la parte superior del teclado; tampoco permite al usuario moverse con las flechas izquierda o derecha. El código que me sirvió de base para incluir eso está en el post <a href="http://mbrenes.blogspot.com/2007_02_01_archive.html" target="_blank">http://mbrenes.blogspot.com/2007_02_01_archive.html</a> pero es para Gtk, así que sólo hice los cambios necesarios para pasarlo a Gtk#.</p>
<p><span style="text-decoration:underline;">Este ejemplo fue realizado en Debian Lenny</span></p>
<p>Esta es la clase EntryEnteros</p>
<pre class="brush: cpp;">
/* Archivo entryenteros.cs */

using System;
using Gtk;

public class EntryEnteros : Entry
{
   public EntryEnteros()
   {
      KeyPressEvent +=  new KeyPressEventHandler(TeclaPulsada);
   }

   // Conectamos el manejador de eventos antes del evento KeyPress
   [GLib.ConnectBefore ()]

   private void TeclaPulsada(object o, KeyPressEventArgs args)
   {
      string s_charvalidos = &quot;0123456789&quot;;

      // Para que al pulsar enter el foco se pase al siguiente control
      if (args.Event.Key == Gdk.Key.Return || args.Event.Key == Gdk.Key.KP_Enter)
         {           
          Toplevel.ChildFocus (DirectionType.TabForward);
          args.RetVal = true;
         }
      else
          // Solo se permiten los caracteres en s_charvalidos, los números del teclado numérico (KP_0...),
          // el backspace, el delete, flecha izquierda, flecha derecha
          if (Array.IndexOf(s_charvalidos.ToCharArray(), Convert.ToChar(args.Event.Key)) == -1 &amp;&amp; args.Event.Key!=Gdk.Key.BackSpace &amp;&amp; args.Event.Key!=Gdk.Key.Delete &amp;&amp; args.Event.Key!=Gdk.Key.Left &amp;&amp; args.Event.Key!=Gdk.Key.Right &amp;&amp; !(args.Event.Key &gt;=Gdk.Key.KP_0 &amp;&amp; args.Event.Key &lt;=Gdk.Key.KP_9))
              args.RetVal = true;     
   }
}
</pre>
<p>Esta es la clase EntryDecimales</p>
<pre class="brush: cpp;">
/* Archivo entrydecimales.cs */

using System;
using Gtk;

public class EntryDecimales : Entry
{
   public EntryDecimales()
   {
      KeyPressEvent +=  new KeyPressEventHandler(TeclaPulsada);
   }

   // Conectamos el manejador de eventos antes del evento KeyPress
   [GLib.ConnectBefore ()]

   private void TeclaPulsada(object o, KeyPressEventArgs args)
   {
      string s_charvalidos = &quot;0123456789.&quot;;

      // Para que al pulsar enter el foco se pase al siguiente control
      if (args.Event.Key == Gdk.Key.Return || args.Event.Key == Gdk.Key.KP_Enter)
         {           
          Toplevel.ChildFocus (DirectionType.TabForward);
          args.RetVal = true;
         }
      else
          // Solo se permiten los caracteres en s_charvalidos, los números del teclado numérico (KP_0...),
          // el backspace, el delete, flecha izquierda, flecha derecha
          if (Array.IndexOf(s_charvalidos.ToCharArray(), Convert.ToChar(args.Event.Key)) == -1 &amp;&amp; args.Event.Key!=Gdk.Key.BackSpace &amp;&amp; args.Event.Key!=Gdk.Key.Delete &amp;&amp; args.Event.Key!=Gdk.Key.Left &amp;&amp; args.Event.Key!=Gdk.Key.Right &amp;&amp; args.Event.Key!=Gdk.Key.KP_Decimal &amp;&amp; !(args.Event.Key &gt;=Gdk.Key.KP_0 &amp;&amp; args.Event.Key &lt;=Gdk.Key.KP_9))
              args.RetVal = true;     
   }
}
</pre>
<p>Con el siguiente programa podemos probar nuestras 2 clases</p>
<pre class="brush: cpp;">
/* Archivo prueba.cs */

using System;
using Gtk;

public class prueba
{
    public static void Main()
    {
        Application.Init();
        Window w_principal = new Window(&quot;Limitar captura en un Entry&quot;);
        w_principal.DeleteEvent += delete_event;

        EntryEnteros e_cantidad = new EntryEnteros ();
        EntryDecimales e_precio = new EntryDecimales ();
        HBox hb_cantidad = new HBox (true, 0);
        HBox hb_precio = new HBox (true, 0);
        VBox vb_contenedor = new VBox();

        hb_cantidad.PackStart (new Label (&quot;Cantidad: &quot;), false, false, 0);
        hb_cantidad.PackStart (e_cantidad);
        hb_precio.PackStart (new Label (&quot;Precio: &quot;), false, false, 0);
        hb_precio.PackStart (e_precio);
        vb_contenedor.PackStart (hb_cantidad, true, true, 0);
        vb_contenedor.PackStart (hb_precio, true, true, 0);

        w_principal.Add(vb_contenedor);
        w_principal.ShowAll();
        Application.Run();
    }

    static void delete_event (object obj, DeleteEventArgs args)
    {
        Application.Quit();
    }
}
</pre>
<p>Compilamos</p>
<p><strong>gmcs -pkg:gtk-sharp-2.0 prueba.cs entryenteros.cs entrydecimales.cs</strong></p>
<p>Con esto tenemos nuestro archivo prueba.exe, el cual ejecutamos tecleando ./prueba.exe</p>
<p>A continuación una captura de la pantalla ya con datos introducidos</p>
<p><img class="aligncenter size-full wp-image-156" title="prueba" src="http://salomonrt.files.wordpress.com/2009/04/prueba.jpg?w=316&#038;h=42" alt="prueba" width="316" height="42" /></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/145/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/145/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/145/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/145/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/145/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/145/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/145/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/145/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/145/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/145/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=145&subd=salomonrt&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2009/04/24/validar-entry-en-gtk-sharp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>

		<media:content url="http://salomonrt.files.wordpress.com/2009/04/prueba.jpg" medium="image">
			<media:title type="html">prueba</media:title>
		</media:content>
	</item>
		<item>
		<title>¿Usar GNU/Linux es dificil?</title>
		<link>http://salomonrt.wordpress.com/2009/03/24/%c2%bfusar-gnulinux-es-dificil/</link>
		<comments>http://salomonrt.wordpress.com/2009/03/24/%c2%bfusar-gnulinux-es-dificil/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 17:53:00 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software Libre]]></category>
		<category><![CDATA[Linux es dificil]]></category>
		<category><![CDATA[usar software libre es complicado]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=140</guid>
		<description><![CDATA[Muchas personas (incluso algunas relacionadas con el campo de la informática) tienen la idea de que usar GNU/Linux (cualquier distribución) es dificil.
Yo considero que no es dificil, el problema es que los que tienen esa idea es porque están acostumbrados a usar otro sistema operativo (generalmene alguna versión de Windows) y les da &#8220;miedo&#8221; o [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=140&subd=salomonrt&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Muchas personas (incluso algunas relacionadas con el campo de la informática) tienen la idea de que usar GNU/Linux (cualquier distribución) es dificil.</p>
<p>Yo considero que no es dificil, el problema es que los que tienen esa idea es porque están acostumbrados a usar otro sistema operativo (generalmene alguna versión de Windows) y les da &#8220;miedo&#8221; o flojera aprender a utilizar un sistema operativo que nunca han usado. Pero lo mismo pasaría si a una persona que aprendió a usar las computadoras y lo hizo utilizando una computadora con GNU/Linux instalado, despues de algunos años se le pide que utilize Windows.</p>
<p>A todos aquellos que no han utilizado GNU/Linux no me queda mas que decirles que no saben de lo que se están perdiendo. Entre algunas de las ventajas que tienen sistemas operativos como GNU/Linux o cualquiera de los BSD (FreeBSD, NetBSD, OpenBSD, etc.) es su estabilidad, el uso eficiente de los recursos, la seguridad, etc.</p>
<p>Si no eres ingeniero/licenciado en sistemas o informática (digamos que eres contador, abogado, estudiante, o cualquiera que sea tu actividad) y estás pensando que es imposible que dejes de usar Windows y empieces a utilizar GNU/Linux, te invito a que sigas leyendo.</p>
<p>Existe una persona en Argentina llamada Maria Elena Casañas que no estudio sistemas, informática ni algo parecido. Después de haber usado Windows por 15 años descubrio (según sus propias palabras) el software libre y decidió de un dia para otro empezar a utilizar Mandriva (una distribución de GNU/Linux).</p>
<p>¿Qué es lo sorprendente de este relato?, bueno, Maria Elena Casañas aprendió a utilizar una computadora despues de los 50 años (esto quiere decir que con mas de 65 años empezó a utilizar GNU/Linux).</p>
<p>En está página pueden leer la reproducción de un post que ella misma escribió</p>
<p><a href="http://www.kriptopolis.org/linux-para-informaticos" target="_blank">http://www.kriptopolis.org/linux-para-informaticos</a></p>
<p>Las sorpresas no terminan ahi, Maria Elena Casañas está tan feliz usando software libre y tan convencida de sus beneficios que tiene una página web dedicada a ayudar a personas comunes, sin conocimientos avanzados de informática a descubrir el mundo del software libre.</p>
<p><a href="http://www.casanas.com.ar/" target="_blank">http://www.casanas.com.ar/</a></p>
<p>Además tiene un blog</p>
<p><a href="http://elblogdemec.blogspot.com/" target="_blank">http://elblogdemec.blogspot.com/</a></p>
<p>En la página podrán encontrar mucho material que además está explicado con un lenguaje fácil de comprender.</p>
<p>Desde luego la migración de software privativo a software libre no tiene que ser de un dia para otro (no tienes que cambiar de Windows a GNU/Linux en 24 horas), lo más recomendable es hacerlo por etapas; puedes por jemplo empezar por utilizar OpenOffice en lugar de Microsoft Office, instalandolo sobre tu PC con Windows sin problema alguno. Open Office además de ser software libre también es gratuito, te permite hacer prácticamente lo mismo que haces con Microsoft Office y puedes leer archivos generados por Microsoft Office y guardar tus archivos con los formatos utilizados por Microsoft Office (.doc. xls, etc.), para que tus archivos los puedan leer personas que no tengan OpenOffice instalado.</p>
<p>Probablemente estes pensando: &#8220;Bueno, el caso de Maria Elena Casañas es un caso extraordinario, no creo que algo asi pase muy seguido&#8221;.</p>
<p>Así que dejame darte otro ejemplo: &#8220;El cocinero que instaló Debian GNU/Linux y tuvo éxito&#8221;</p>
<p><a href="http://casidiablo.net/el-cocinero-que-instalo-debian-gnulinux-y-tuvo-exito/" target="_blank">http://casidiablo.net/el-cocinero-que-instalo-debian-gnulinux-y-tuvo-exito/</a></p>
<p>Te invito a que te hagas las siguientes preguntas:</p>
<ol>
<li>¿Será realmente tan difícil usar GNU/Linux cuando una persona de mas de 65 años, &#8220;no informática&#8221; aprendió a usarlo y lo sigue usando actualmente?</li>
<li>¿Si Maria Elena Casañas pudo dejar de utilizar Windows después de 15 años para utilizar GNU/Linux, no puedo hacerlo yo?</li>
</ol>
<p>Si te animas, la página de Maria Elena Casañas es un buen punto de partida.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/140/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/140/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/140/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/140/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/140/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/140/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/140/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/140/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/140/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/140/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=140&subd=salomonrt&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2009/03/24/%c2%bfusar-gnulinux-es-dificil/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>
	</item>
		<item>
		<title>Agregar y borrar usuarios de Firebird desde C++ builder</title>
		<link>http://salomonrt.wordpress.com/2009/02/23/agregar-y-borrar-usuarios-de-firebird-desde-c-builder/</link>
		<comments>http://salomonrt.wordpress.com/2009/02/23/agregar-y-borrar-usuarios-de-firebird-desde-c-builder/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 01:30:47 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[C++ Builder]]></category>
		<category><![CDATA[agregar usuarios Firebird via sql]]></category>
		<category><![CDATA[SPB Constant Unknown]]></category>
		<category><![CDATA[stored procedure para otorgar grants en Firebird]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=127</guid>
		<description><![CDATA[Agregar usuario
En la pestaña InterBase Admin de C++ builder 6 existe el componente TIBSecurityService, este componente sirve para agregar o borrar usuarios de un servidor de base de datos Firebird, así como para mostrar o modificar su información.
Suponiendo que dejamos la contraseña por default del usuario sysdba de Firebird y tenemos en un formulario de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=127&subd=salomonrt&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Agregar usuario</strong></p>
<p>En la pestaña InterBase Admin de C++ builder 6 existe el componente TIBSecurityService, este componente sirve para agregar o borrar usuarios de un servidor de base de datos Firebird, así como para mostrar o modificar su información.</p>
<p>Suponiendo que dejamos la contraseña por default del usuario sysdba de Firebird y tenemos en un formulario de C++ Builder 6 (llamado Form1) un componente TButton llamado Button1 y 4 componentes TEdit llamados e_usuario, e_nombre, e_apellido y e_clave respectivamente, podríamos agregar un componente TIBSecurityService llamado IBSecurityService1 y poner el siguiente código en el evento OnClick de Button1 para agregar un usuario al servidor Firebird con los datos que contengan los TEdit.</p>
<pre class="brush: cpp;">
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  IBSecurityService1-&gt;Params-&gt;Values[&quot;user_name&quot;]=&quot;sysdba&quot;;
  IBSecurityService1-&gt;Params-&gt;Values[&quot;password&quot;]=&quot;masterkey&quot;;

  IBSecurityService1-&gt;Active = true;
  try
     {
      IBSecurityService1-&gt;UserName = e_usuario-&gt;Text;
      IBSecurityService1-&gt;FirstName = e_nombre-&gt;Text;
      IBSecurityService1-&gt;LastName = e_apellido-&gt;Text;
      IBSecurityService1-&gt;Password = e_clave-&gt;Text;
      IBSecurityService1-&gt;AddUser();
     }
  __finally
           {
            IBSecurityService1-&gt;Active = false;
           }
}
</pre>
<p>Notese que para indicar el usuario y password con el que se conectará el componente TIBSecurityService se usó</p>
<p>IBSecurityService1-&gt;Params-&gt;Values["user_name"]=&#8221;sysdba&#8221;;<br />
IBSecurityService1-&gt;Params-&gt;Values["password"]=&#8221;masterkey&#8221;;</p>
<p>y no:</p>
<p>IBSecurityService1-&gt;Params-&gt;Add(&#8220;user_name = sysdba&#8221;);<br />
IBSecurityService1-&gt;Params-&gt;Add(&#8220;password = masterkey&#8221;);</p>
<p>Ya que marcaría un error como &#8220;<strong>SPB Constant Unknown</strong>&#8220;</p>
<p>Con esto queda agregado el usuario, pero falta hacer los grants para darle permisos de consulta (grant select), inserción (grant insert), borrado (grant delete) y actualización (grant update) sobre las tablas de la base de datos deseada.</p>
<p><strong>Otorgar grants al usuario</strong></p>
<p>Para esto, crearemos un stored procedure (procedimiento almacenado) en la base de datos.</p>
<p>El stored procedure (que llamaremos sp_Grants) otorgará todos los grants a un usuario sobre una tabla determinada; recibirá como parámetros el usuario y el nombre de la tabla.</p>
<pre class="brush: sql;">

/* Este procedure otorga todos los permisos al usuario que recibe como parámetro
   sobre la tabla que recibe como parámetro */

set term !! ;
create procedure sp_Grants(s_tabla varchar(65), s_usuario varchar(8))
as
  begin
        execute statement 'grant all on ' || :s_tabla || ' to ' || :s_usuario;
  end !!
set term ; !!
</pre>
<p>Agregamos a nuestro formulario un componente TIBDatabase llamado IBDatabase1 y un componente TIBStoredProc llamado IBSP_grants. En la propiedad <strong>Database</strong> del TIBStoredProc ponemos IBDatabase1 y en la propiedad <strong>StoredProcName</strong> SP_GRANTS (que es el nombre del stored procedure que creamos en la base de datos).</p>
<p>Por último agregamos un componente TListBox al que llamaremos lb_tablas. Lo que haremos será conectarnos a la base de datos, obtener los nombres de todas las tablas y pasarlos al ListBox, después iremos recorriendo el ListBox para otorgar todos los grants sobre todas las tablas al usuario llamando a nuestro stored procedure.</p>
<p>Basta con agregar el siguiente código al final del código que pusimos anteriormente en el evento OnClick del TButton llamado Button1.</p>
<p>En el ejemplo nuestra base de datos se llama prueba.fdb y se encuentra en el directorio llamado prueba de la unidad c:</p>
<pre class="brush: cpp;">
 // Asigna la ruta a la base de datos
 IBDatabase1-&gt;Params-&gt;Values[&quot;user_name&quot;]=&quot;sysdba&quot;;
 IBDatabase1-&gt;Params-&gt;Values[&quot;password&quot;]=&quot;masterkey&quot;;
 IBDatabase1-&gt;DatabaseName = &quot;c:\\prueba\\prueba.fdb&quot;;

 // Hace la conexión a la base de datos
 IBDatabase1-&gt;Connected=true;

 // Pasa los nombres de las tablas de la base de datos al ListBox
 IBDatabase1-&gt;GetTableNames(lb_tablas-&gt;Items,False);

 // Se desconecta de la base de datos
 IBDatabase1-&gt;Connected=false;

 for (int i_x=0; i_x&lt;lb_tablas-&gt;Items-&gt;Count; i_x++)
     {
      IBSP_grants-&gt;ParamByName(&quot;s_tabla&quot;)-&gt;AsString = Trim(lb_tablas-&gt;Items-&gt;Strings[i_x]);
      IBSP_grants-&gt;ParamByName(&quot;s_usuario&quot;)-&gt;AsString = e_usuario-&gt;Text;
      IBSP_grants-&gt;ExecProc();
      lb_tablas-&gt;ItemIndex++;
     }
 lb_tablas-&gt;Clear();
</pre>
<p>Si queremos que no se vea el ListBox sólo debemos poner false en su propiedad <strong>Visible</strong></p>
<p><strong>Borrar usuario</strong></p>
<p>Agregamos un componente TButton al que llamaremos Button2 y en su evento OnClick pondremos el siguiente código</p>
<pre class="brush: cpp;">

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  IBSecurityService1-&gt;Params-&gt;Values[&quot;user_name&quot;]=&quot;sysdba&quot;;
  IBSecurityService1-&gt;Params-&gt;Values[&quot;password&quot;]=&quot;masterkey&quot;;

  IBSecurityService1-&gt;Active = true;
  try
     {
      IBSecurityService1-&gt;UserName = e_usuario-&gt;Text;     
      IBSecurityService1-&gt;DeleteUser();
     }
  __finally
           {
            IBSecurityService1-&gt;Active = false;
           }
}
</pre>
<p><strong>Nota:</strong> En el post la macro  de wordpress muestra finally, pero debe ser <strong>__finally</strong></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/127/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&blog=6104541&post=127&subd=salomonrt&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2009/02/23/agregar-y-borrar-usuarios-de-firebird-desde-c-builder/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>
	</item>
	</channel>
</rss>