El Blog del Manuelillo - All Geek's stuff http://manuelinux.info/ Manuelinux (c) 2008-2009 manuelinux.info Sun, 17 Jan 2010 13:37:27 -0500 http://www.textmotion.org Manejando el puerto serial en java http://manuelinux.info/blog/view/256/manejando-el-puerto-serial-en-java http://manuelinux.info/blog/view/256/manejando-el-puerto-serial-en-java <p><p style="text-align: left"><a href="http://rxtx.qbang.org">RXTX</a> es una clase diseñada para hacer uso de la commAPI de java que nos ofrece controlar el puerto serial y paralelo de nuestra computadora en varias arquitecturas y sistemas operativos.</p> <p></p><p style="text-align: left">Para hacer uso de esta tecnología primero hay que descargar el .jar de rxtx desde <a href="http://rxtx.qbang.org/ToyBox/2.1-7-build1/RXTXcomm.jar">aqui</a> ademas de encontrar la libreria necesaria para nuestro sistema operativo y arquitectura dentro del <a href="http://rxtx.qbang.org/ToyBox/2.1-7-build1/">ToyBox</a> del proyecto</p><p style="text-align: left">Una vez que tenemos ambos archivos creamos un proyecto nuevo en netbeans o eclipse y añadimos una referencia al RXTXcomm.jar que previamente descargamos para que pueda ser importado dentro de nuestro codigo. El archivo de librería en el caso de sistemas GNU/Linux debe ser copiado al directorio <i>/usr/lib</i> y en el caso de sistemas windows debemos ubicar el archivo .dll en el directorio donde se esta ejecutando la aplicación.</p><p style="text-align: left">Y para empezar un pequeño script para descubrir los puertos disponibles en nuestro sistema. Lo primero es importar las clases necesarias agregando la siguiente linea:</p><p style="text-align: left"><code>import gnu.io.*; </code>y después situamos la función que enumera los puertos y la función que nos regresa el tipo de puerto.</p><pre><p style="text-align: left"><span> static void listPorts()</p> <p>{</p> <p>java.util.Enumeration<commportidentifier> portEnum = CommPortIdentifier.getPortIdentifiers();</p> <p>while ( portEnum.hasMoreElements() )</p> <p>{</p> <p>CommPortIdentifier portIdentifier = portEnum.nextElement();</p> <p>System.out.println(portIdentifier.getName() + “ - ” + getPortTypeName(portIdentifier.getPortType()) );</p> <p>}</p> <p>}</p> <p></p> <p>static String getPortTypeName ( int portType )</p> <p>{</p> <p>switch ( portType )</p> <p>{</p> <p>case CommPortIdentifier.PORT_I2C:</p> <p>return “I2C”;</p> <p>case CommPortIdentifier.PORT_PARALLEL:</p> <p>return “Parallel”;</p> <p>case CommPortIdentifier.PORT_RAW:</p> <p>return “Raw”;</p> <p>case CommPortIdentifier.PORT_RS485:</p> <p>return “RS485”;</p> <p>case CommPortIdentifier.PORT_SERIAL:</p> <p>return “Serial”;</p> <p>default:</p> <p>return “unknown type”;</p> <p>}</commportidentifier></span></p></p> <p><p style="text-align: left"> }</p></pre> <p style="text-align: left">Recordemos que en sistemas Windows los puertos se nombran como com1, com2 comN mientras en GNU/Linux son llamados /dev/ttySO(N)</p></p> avisos@manuelinux.info (Manuel Aguirre) Sun, 17 Jan 2010 13:37:27 -0500 Yotidescargo http://manuelinux.info/blog/view/254/yotidescargo http://manuelinux.info/blog/view/254/yotidescargo <p><!-- END SMALLHEAD DIV --> <!-- END HEAD DIV --> <div class="content_full"> <div style="text-align: left" class="bText"> <p></p><span><p>Un día mientras andaban en el ciberpachequeo a <a title="Manuelinux" href="http://manuelinux.info" target="_blank">Manuelinux</a> y a <a title="Bucio" href="http://bucio.com.mx/" target="_blank">Bucio</a> se les ocurrio empezar un proyecto para descargar videos desde youtube y convertirlos a diferentes formatos. Bucio estaba fumando gtkdialog en ese entonces y Manuelinux andaba metido con todo en C#</p> <p>Nunca llegaron a un acuerdo, así que Manuelinux en un día de aburrimiento decidió retomar el proyecto y usarlo como escape del estress del trabajo, el resultado es la version actual de Yotidescargo.</p> <p>Espero que esta aplicación sirva de algo para alguien más y no solo haya sido una bonita perdida de tiempo.</p><p>Sigue los avances de este proyecto desde su <a href="http://yotidescargo.phsistemas.net">web oficial</a></p> <p></p></span><p></p> </div> </div></p> avisos@manuelinux.info (Manuel Aguirre) Sun, 10 Jan 2010 15:36:08 -0500 Recursividad http://manuelinux.info/blog/view/246/recursividad http://manuelinux.info/blog/view/246/recursividad <p>/blog/recursividad.jpg</p> avisos@manuelinux.info (Manuel Aguirre) Wed, 16 Dec 2009 23:24:41 -0500 Depresion post-launch http://manuelinux.info/blog/view/244/depresion-post-launch http://manuelinux.info/blog/view/244/depresion-post-launch <p>Despues de casi 6 meses trabajando en ese proyecto cuyos detalles no puedo revelar porque es interno ayer fue el lanzamiento oficial… sentado en mi silla esperando reportes ocacionales de bugs menores y feedback… es oficial, estoy deprimido, ayer me dio alegria el anuncio del lanzamiento, hoy extraño las jornadas estresantes…. Hasta el proximo proyecto, por ahora no me busquen conectado por las noches, estoy descansando despues de dias de dormir muy mal…</p> avisos@manuelinux.info (Manuel Aguirre) Wed, 09 Dec 2009 18:47:05 -0500 Curso de Programacion Multiplataforma en Tehuacan Puebla http://manuelinux.info/blog/view/240/curso-de-programacion-multiplataforma-en-tehuacan-puebla http://manuelinux.info/blog/view/240/curso-de-programacion-multiplataforma-en-tehuacan-puebla <p><p style="text-align: left">Como este año no se hizo el Congreso Internacional de Ingeniería en Sistemas del Instituto Tecnológico de Tehuacan recibí la invitación de parte de los chavos de <a href="http://clx-clx.blogspot.com/">CLX</a> para impartir mi curso en las instalaciones de La Piramide(El mejor centro de entretenimiento de Tehuacan) y como ya tenia ganas de un viajesito me lance.</p><p style="text-align: left">El nombre del curso fue: “Llega a todas las plataformas desde Linux, Programación multiplataforma usando herramientas de Software Libre” en el que abordamos programación usando C# a través del Framework <a href="http://www.mono-project.com/Main_Page">Mono</a>, usando como herramienta <a href="http://monodevelop.com/">MonoDevelop</a>. Los temas que vimos sobre C# fueron Programas de consola, programas usando windows forms y <a href="http://gtk-sharp.sourceforge.net/">GTK#</a> además de ejecución de procesos y aplicaciones externas. También vimos un poco de Java usando <a href="http://www.netbeans.org/">Netbeans</a> y las clases de <a href="http://jchart2d.sourceforge.net/">jChart2D</a> para la creación de gráficas.</p><p style="text-align: left">Por mi parte creo que fue un buen curso y que todos salimos de ahí con alguna buena enseñanza y la principal intención se cumplió que era dar opciones para la programación a los alumnos del Tecnológico que asistieron al curso.</p> <p></p><p style="text-align: left">Como parte de mi visita a Tehuacan también pase a saludar a Almiux en su oficina.</p><p style="text-align: left"><!--begin photo--></p><div class="photo block-center"> <a href="http://manuelinux.info/data/uploads/tehuas.jpg"><img class="picbox-photo" src="http://manuelinux.info/data/thumbs/280_f08ac7542514e029bdb3b903ff3561d1_tehuas.jpg" height="210" width="280" /></a> </div><!--end photo--><p></p> <p>Para ver mas fotos de mi visita a Tehuacan pasen al siguiente <a href="http://www.facebook.com/album.php?aid=31753&amp;id=1639675344&amp;l=cb007b868d">enlace</a></p> avisos@manuelinux.info (Manuel Aguirre) Mon, 23 Nov 2009 14:51:51 -0500 Mis retos en el sector empresarial http://manuelinux.info/blog/view/236/mis-retos-en-el-sector-empresarial http://manuelinux.info/blog/view/236/mis-retos-en-el-sector-empresarial <p><p style="text-align: left">Durante esta semana y con el marco del X aniversario del Instituto Tecnológico Superior de Zapopan(Universidad en que curse mis estudios de ingeniería) me invitaron a ser parte de algunos eventos.</p><p style="text-align: left">En primer lugar el martes por la mañana junto con mi amigo <a href="http://samuelg.info">Samuel Garcia</a> impartí una platica informal que se llamó “Quiero ser programador ¿como le hago? dirigida principalmente a los estudiantes de ingeniería en sistemas interesados en hacer su carrera en el sector de la ingeniería del software. La dinámica fue muy sencilla, solo me pare al frente a contarles mis experiencias profesionales, a contarles como es que llegue al trabajo en el que me encuentro ahora, que cosas tuve que aprender. Al final los muchachos estuvieron muy interesados haciéndome preguntas y creo que al menos unos cuantos salieron de ahí con un panorama mas claro de lo que quieren lograr. El mismo día por la tarde y acompañado por Jose Ruiz, ingeniero de aplicaciones en Freescale y amigo mio dimos una platica llamada ”Sistemas y Electrónica, dos carreras que van de la mano" donde además de detallarles el panorama en las empresas tecnológicas tratamos todo el tiempo de inculcarles la idea de que un electrónico y alguien de sistemas trabajando juntos pueden llegar a hacer proyectos muy interesantes.</p><p style="text-align: left">El viernes por la tarde me invitaron a participar en el foro “Experiencias de nuestros egresados en el ambito profesional” donde varios egresados “destacados” del Tecnológico(eso quiere decir que soy destacado) expusimos a lo largo de 10 minutos cada quien nuestras experiencias en el sector empresarial, anécdotas y retos a los que nos hemos enfrentado en un ambiente de buena vibra. Tuve el orgullo de estar en el panel junto a dos muy grandes amigos Hector Garcia Benavides quien fue mi profesor de sistemas digitales y posteriormente compañero de oficina en Freescale y Cesar Moya con quien alguna vez hice equipo para ganar un concurso de programación estatal.</p><p style="text-align: left">Ya por la noche tuvimos una reunión mas informal donde pudimos compartir bebidas y platica amena y donde al final resulto una empresa(creada por ex alumnos de electromecánica) interesada en crear software útil para controlar su negocio.</p> <p></p><p style="text-align: left">Espero que despues alguien me pase alguna foto para ponerla aqui</p> <p></p><p style="text-align: left"></p> <p></p></p> avisos@manuelinux.info (Manuel Aguirre) Sun, 01 Nov 2009 20:43:55 -0500 Linux Embedded http://manuelinux.info/blog/view/219/linux-embedded http://manuelinux.info/blog/view/219/linux-embedded <p><p><b></b></p><p style="text-align: left"><span><b>Linux embebido o empotrado</b> (en <a title="Idioma inglés" href="http://es.wikipedia.org/wiki/Idioma_ingl%C3%A9s">inglés</a>: <i>Embedded Linux</i>) se refiere al uso del sistema operativo <a class="mw-redirect" title="Linux" href="http://es.wikipedia.org/wiki/Linux">Linux</a> en un <a title="Sistema integrado" href="http://es.wikipedia.org/wiki/Sistema_integrado">sistema embebido</a>, como por ejemplo <a title="PDA" href="http://es.wikipedia.org/wiki/PDA">PDA's</a>, teléfonos móviles, robots, enrutadores / servidores, dispositivos electrónicos y aplicaciones industriales con <a class="mw-redirect" title="Microcontroladores" href="http://es.wikipedia.org/wiki/Microcontroladores">microcontroladores</a> y <a class="mw-redirect" title="Microprocesadores" href="http://es.wikipedia.org/wiki/Microprocesadores">microprocesadores</a>. En el pasado, el desarrollo de empotrados fue llevado a cabo en su mayoría utilizando <a title="Software propietario" href="http://es.wikipedia.org/wiki/Software_propietario">código propietario</a> escrito en <a class="mw-redirect" title="Assembler" href="http://es.wikipedia.org/wiki/Assembler">assembler</a>. Los desarrolladores debían escribir los controladores para los dispositivos de <a title="Hardware" href="http://es.wikipedia.org/wiki/Hardware">hardware</a> y las <a title="Interfaz" href="http://es.wikipedia.org/wiki/Interfaz">interfaces</a> desde cero. El <a title="Linux (núcleo)" href="http://es.wikipedia.org/wiki/Linux_%28n%C3%BAcleo%29">núcleo Linux</a>, combinado con un conjunto de algunas otras utilidades de <a class="mw-redirect" title="Software Libre" href="http://es.wikipedia.org/wiki/Software_Libre">Software Libre</a>, puede ajustarse dentro del limitado espacio de <a title="Hardware" href="http://es.wikipedia.org/wiki/Hardware">hardware</a> de los sistemas embedidos. Una instalación típica de un Linux empotrado ocupa en promedio 2 <a title="Megabyte" href="http://es.wikipedia.org/wiki/Megabyte">MB</a>. Existen otros <a class="mw-redirect" title="Sistemas operativos" href="http://es.wikipedia.org/wiki/Sistemas_operativos">sistemas operativos</a> empotrados como el <a title="QNX" href="http://es.wikipedia.org/wiki/QNX">QNX</a>, <a title="LynxOS" href="http://es.wikipedia.org/wiki/LynxOS">LynxOS</a>, <a title="Windows CE" href="http://es.wikipedia.org/wiki/Windows_CE">Windows CE</a>, <a title="Windows NT" href="http://es.wikipedia.org/wiki/Windows_NT">Windows NT Embedded</a>, <a title="Palm OS" href="http://es.wikipedia.org/wiki/Palm_OS">Palm OS</a>. Linux Empotrado tiene algunas ventajas en relación a otros <a class="mw-redirect" title="Sistemas operativos" href="http://es.wikipedia.org/wiki/Sistemas_operativos">sistemas operativos</a> empotrados, como pueden ser el <a title="Código abierto" href="http://es.wikipedia.org/wiki/C%C3%B3digo_abierto">Código abierto</a>, pequeño (Windows CE ocupa 21 MB comparado con los 2 MB para Linux Empotrado), puede no tener costos por derechos, maduro y estable (Más de 10 años de edad y utilizado en muchos dispositivos) y con respaldado.</span></p><p style="text-align: left"></p> <p><span></span></p><p style="text-align: left"><span>Actualmente como parte de mi trabajo en Pounce Embedded estoy desarrollando una aplicación en una tarjeta de evaluación de <a href="http://www.freescale.com/">Freescale</a></span></p><p style="text-align: left"><span>la cual tiene instalada una version especial de <a href="http://www.uclinux.org/">uCLinux</a> para micros ColdFire asi es que el mundo de los embebidos empieza a ser muy emocionante para mi, aunque he tenido que recordar muchas cosas de programacion en C(si, C puro sin el ++) y he tenido que crear ventanitas desde codigo.</span></p><p style="text-align: left"></p> <p><span></span></p><p style="text-align: left"><span>La definición de Linux embedded la saque de <a href="http://es.wikipedia.org/wiki/Linux_empotrado">aqui</a></p> <p></span></p> avisos@manuelinux.info (Manuel Aguirre) Sun, 30 Aug 2009 19:27:43 -0400 Ejecutando Procesos en C#(II) http://manuelinux.info/blog/view/185/ejecutando-procesos-en-c-ii http://manuelinux.info/blog/view/185/ejecutando-procesos-en-c-ii <p><p style="text-align: left">La semana pasada vimos como crear una instancia de la clase process para ejecutar un proceso o aplicación externo desde nuestra aplicación. Pero hay ocasiones en las que necesitaremos esperar a que un proceso haya terminado para seguir adelante con la aplicacion, es el caso de una descarga desde internet o un proceso de conversión doble.</p><p style="text-align: left">Si no manejamos las señales del evento y tenemos por ejemplo lo siguiente:</p><p style="text-align: left"></p><blockquote><span><p style="text-align: left">pr.Start();</p><p style="text-align: left">Console.Writeline(“El archivo ha sido descargado”);</p><p style="text-align: left">[más lineas de codigo]</p></span></blockquote><p style="text-align: left">El mensaje escrito en la consola seguira inmediatamente despues de haber lanzado la ejecución del proceso por lo que no sabremos si en realidad termino o no. Si queremos que nuestra aplicacion por ejemplo descargue un video desde youtube y despues lo convierta a avi(usando ffmpeg por ejemplo) la conversión será lanzada inmediatamente despues de la descarga cuando aun no contamos con el video entre nuestros archivos. Para poder manejar estos eventos hacemos uso de algunas propiedades o metodos de la clase process, por ejemplo podemos tener algo asi:</p><p style="text-align: left"></p><blockquote><span><p style="text-align: left">pr.Start();</p><p style="text-align: left">Console.WriteLine(“Descargando el archivo, espere…”);</p><p style="text-align: left">while(!pr.HasExited);</p><p style="text-align: left">Console.WriteLine(“Ahora procedo a convertirlo….”);</p></span></blockquote><p style="text-align: left">De esta manera se mostrara en pantalla el primer mensaje y la aplicación se quedara sin hacer nada hasta que reciba la noticia de que el proceso ha sido terminado(HasExited solo avisa de la terminación del evento más no de su resultado final) una vez terminado el proceso mostrara el segundo aviso y continuara ejecutando el codigo.</p><p style="text-align: left">Si quieres conocer mas detalles sobre la clase process puedes hacerlo en el siguiente <a href="http://msdn.microsoft.com/es-es/library/system.diagnostics.process%28VS.80%29.aspx">enlace</a></p> avisos@manuelinux.info (Manuel Aguirre) Sun, 07 Jun 2009 17:51:20 -0400 Loop Love http://manuelinux.info/blog/view/184/loop-love http://manuelinux.info/blog/view/184/loop-love <p><p style="text-align: left">for(int i=0; i<span style="color: rgb(255, 0, 0); font-size: x-large">&lt;3</span>; i++)</p><p style="text-align: left">{</p><p style="text-align: left"> slaves[i].red=frmmixer.red;</p> avisos@manuelinux.info (Manuel Aguirre) Thu, 04 Jun 2009 18:30:00 -0400 Ejecutando Procesos en C# http://manuelinux.info/blog/view/182/ejecutando-procesos-en-c http://manuelinux.info/blog/view/182/ejecutando-procesos-en-c <p><p style="text-align: left">En algunas ocasiones necesitamos que nuestra aplicación ejecute procesos o aplicaciones externas para agregar funcionalidades extra.</p><p style="text-align: left">Para lograrlo en C#(usando mono preferentemente:)) contamos con la clase Process la cual se encuentra dentro del espacio de nombres System.Diagnostics. Para poder usarla es necesario incluir entre las referencias de nuestra aplicacion lo siguiente:</p><p style="text-align: left"><blockquote>using System.Diagnostics;</blockquote></p><p style="text-align: left">El siguiente paso sería ubicar el codigo correspondiente en donde es necesario, primero declaramos una instancia de la clase proces:</p><p style="text-align: left"><blockquote>Process pr = new Process();</blockquote>Ahora se debe definir el proceso externo que la aplicación llamara, por ejemplo ls</p><p style="text-align: left"><blockquote>pr.StartInfo.FileName=“ls”;</p> <p>pr.Start();</p> <p></blockquote>En una aplicación de consola esto ejecutara un ls y nos devolvera el resultado como si lo hubieramos ejecutado nosotros mismos en la consola. ¿y eso para que Manuel?</p><p style="text-align: left">Pues eso era un ejemplo bastante sencillo, ahora supongamos que queremos hacer una aplicación que convierta videos de flv a avi entonces el proceso quedaría como sigue:</p><blockquote><p style="text-align: left"><span>pr.StartInfo.FileName=“ffmpeg”;</span></p><p style="text-align: left"><span>pr.StartInfo.Arguments=“-i video.flv video.avi”</p> <p></span></p><p style="text-align: left"><span> pr.Start();</span></p> </blockquote><p style="text-align: left">StartInfo.Arguments permite construir una cadena con los parametros que deseamos pasar a la aplicación, por lo que los parametros no necesariamente deben ir dentro del codigo en una manera hard coded, esos parametros se pueden obtener ya sea pidiendolos en consola o haciendo un frontend usando windows forms o gtk#</p><p style="text-align: left">La proxima semana los espero con las información acerca de los procesos.</p> avisos@manuelinux.info (Manuel Aguirre) Sun, 31 May 2009 12:09:08 -0400 Instalar y configurar PostgreSQL http://manuelinux.info/blog/view/147/instalar-y-configurar-postgresql http://manuelinux.info/blog/view/147/instalar-y-configurar-postgresql <p>Siguiendo con las clases de .NET se me ocurrió hacer una aplicación con acceso a base de datos, entonces primero tenemos que instalar y configurar un gestor de base de datos, escogí PostgreSQL porque es el que he estado usando con los ejemplos del libro Aplicaciones :NET Multiplataforma así que aquí describo el proceso de instalacion y configuracion.</p> <p>Para empezar instalaremos los paquetes necesarios en Debian:</p> <p><blockquote>eve:/home/manuelinux# apt-get install postgresql</blockquote>para iniciar o detener el servicio usamos las ordenes habituales:</p> <p><blockquote><span>#/etc/init.d/postgresql-8.3 start</p> <p>#/etc/init.d/postgresql-8.3 stop</span></blockquote>Para poder acceder a la linea de comandos de postgres es necesario editar como root el archivo <i>/etc/postgresql/8.3/main/pg_hba.conf</i></p> <p>cambiamos la linea</p> <p>local all all ident sameuser</p> <p>por una que diga asi</p> <p>local all all trust</p> <p>y la que dice</p> <p>host all all 127.0.0.1/32 md5</p> <p>por</p> <p>host all all 127.0.0.1/32 trust</p> <p>tambien cambiamos</p> <p>local all postgres ident sameuser</p> <p>por</p> <p>local all postgres trust</p> <p>Guardamos los cambios y reiniciamos el servicio de postgres</p> <p>/etc/init.d/postgresql-8.3 restart</p> <p>ahora ya se puede conectar escribiendo en linea de comandos</p> <p><blockquote><span>$psql -U postgres</span></blockquote>Ahora para cambiar la contraseña del usuario postgres ejecutamos</p> <p><blockquote><span>postgres=# alter user postgres with password 'abcde';</p> <p>ALTER ROLE</span></blockquote>y el password fue cambiado.</p> <p>Ahora como primer ejercicio crearemos una base de datos. Primero nos conectaremos a la linea de comandos de postgres</p> <p><blockquote>$psql -U postgres -W</blockquote>y escribimos el password. Ahora crearemos una base de datos llamada directorio.</p> <p><blockquote>postgres=# create database directorio;</blockquote>salimos de postgres con \q para conectarnos ahora a la base de datos directorio.</p> <p><blockquote>$psql -U postgres -W -d directorio</blockquote>y creamos una tabla llamada contactos</p> <p><blockquote><span>directorio=# create table contactos(</p> <p>directorio(# nombre varchar(30) PRIMARY KEY NOT NULL,</p> <p>directorio(# direccion varchar(30) NOT NULL,</p> <p>directorio(# telefono varchar(10) NOT NULL);</p> <p>NOTICE: CREATE TABLE / PRIMARY KEY creará el índice implícito <blockquote>contactos_pkey</blockquote> para la tabla <blockquote>contactos</blockquote></p> <p>CREATE TABLE</span></blockquote>Ahora insertaremos algunos datos a nuestra tabla</p> <p><blockquote><span>directorio=# INSERT INTO contactos VALUES ('Manuel Aguirre','privada del agua # 30','3338976543');</p> <p>INSERT 0 1</span></blockquote>y repetimos el proceso hasta agregar varios contactos.</p> <p>La proxima semana haremos una aplicacion con C# para leer esos datos.</p> avisos@manuelinux.info (Manuel Aguirre) Sun, 29 Mar 2009 15:54:08 -0400 Geany un editor de programación http://manuelinux.info/blog/view/144/geany-un-editor-de-programacion http://manuelinux.info/blog/view/144/geany-un-editor-de-programacion <p>Hace algunos años intenté introducir entre los alumnos de bachillerato el uso de livecds de linux para las clases de programación en las que se usaba sobre todo C++. Nadie quería cambiar en aquel entonces la comodidad de TurboC al momento de compilar, no era lo mismo presionar F9 para que la magia ocurriera que tener que escribir g++ programa.cpp -o programa cosa que a mi no me disgusta pero a un chavo de entre 15 y 18 años puede que si.</p> <p>Hace poco descubrí Geany que es como el sueño hecho realidad de muchos, geany es un editor multilenguaje que sirve para C, C++, php, html, java entre otros, incluido python y hasta C#.</p> <p>En su interfaz cuenta con dos simples botones para compilar y ejecutar nuestras aplicaciones, el unico requisito es tener instalados en nuestro sistema los compiladores en linea de comandos de los diferentes lenguajes y por supuesto xterm que es la terminal en que los resultados se visualizaran. Para usarlo solo lo instalamos e instalamos lo necesario, como podria ser:</p> <p><blockquote>#apt-get install xterm gcc gcj geany</blockquote>Y por supuesto podemos seguir este <a href="http://manuelinux.info/blog/view/124/programando-con-net-en-linux-i">enlace</a> para instalar mono</p> <p>Pareciera que geany solo funciona para proyectos de un solo archivo, pero la verdad es que en proyectos grandes podemos modificar siempre la orden de compilación para incluir diversos archivos. Espero disfruten su tiempo programando con este buen IDE</p> <!--begin photo--><div class="photo block-center"> <a href="http://manuelinux.info/data/uploads/2009-02-28-211400_1024x600_scrot.png"><img class="picbox-photo" src="http://manuelinux.info/data/thumbs/280_4a2dadf31991cdf376fa6115e40badaf_0_1024x600_scrot.png" height="165" width="280" /></a> </div><!--end photo--> avisos@manuelinux.info (Manuel Aguirre) Sun, 22 Mar 2009 22:21:35 -0400 Generación Dinamica de Controles en C#(usando mono claro) http://manuelinux.info/blog/view/137/generacion-dinamica-de-controles-en-c-usando-mono-claro http://manuelinux.info/blog/view/137/generacion-dinamica-de-controles-en-c-usando-mono-claro <p><b>Uso de FlowLayoutPanel</b></p> <p>En algunas ocasiones no conocemos de antemano el numero de controles que usaremos para una aplicación y ya dependerá de las necesidades concretas que tenga el usuario, por lo cual sera necesario crear controles en tiempo de ejecución, Ahora el problema sería lograr acomodarlos, definir las coordenadas para cada uno de ellos.</p> <p>Pues no es necesario hacerlo, el framework de .NET cuenta con algunos paneles especializados para la recepción de varios controles dándoles un acomodo automático. Ilustrare lo siguiente con un ejemplo.</p> <p>Abrimos nuestro diseñador de interfaces mwf-designer y crearemos un nuevo formulario, llenaremos los datos como sigue:</p> <p><blockquote><span>namespace: flowlayout</p> <p>class: flow</p> <p>file: flow.cs</span></blockquote>Agregamos un control FlowLayoutPanel y definimos algunas de sus propiedades:</p> <p><blockquote><span>size: 128,240</p> <p>AutoScroll: true</p> <p>name: panel</p> <p></span></blockquote>Agregamos a la derecha un label con el texto “Numero de controles”</p> <p>y debajo de este agregamos un ComboBox al cual cambiaremos algunas propiedades:</p> <p><blockquote><span>name: cmbcontrols</p> <p>text: 0</p> <p>Items; una colección del 1 al 9(1,2,…,9)</p> <p></span></blockquote>Y ya tenemos nuestro form listo para agregar el código</p> <p>Abrimos monodevelop y creamos una nueva solución de C#, proyecto vació, el nombre del proyecto sera flowlayout agregamos las referencias a System, System.data, system.drawing y system.windows.forms</p> <p>agregamos los archivos flow.cs y flow.Designer.cs</p> <p>Creamos un nuevo archivo Program.cs donde definiremos el metodo main de nuestra aplicación.</p> <p><blockquote><span>public static void Main()</p> <p>{</p> <p>Application.Run(new flow());</p> <p>}</span></blockquote></p> <p>Ejecutamos solo para asegurarnos de que el diseño se ve como queremos</p> <p>Ahora necesitamos agregar un arreglo de controles del tipo textbox, en esta ocasión el numero máximo de controles es de 9 y</p> <p>esta limitado por los números del ComboBox así que en el flow.cs declaramos un arreglo de textbox dentro de la clase flow</p> <p>private TextBox[] txtcontrols;</p> <p>Ahora falta crear un método para que cada que cambie el valor del ComboBox los elementos sean eliminados y se proceda a crear</p> <p>nuevos de acuerdo al numero seleccionado. Primero crearemos el evento en flow.cs</p> <p><blockquote><span>private void cmbcontrols_SelectedValueChanged(object sender, EventArgs e)</p> <p>{</p> <p>txtcontrols = new System.Windows.Forms.TextBox[Convert.ToInt32(cmbcontrols.Text)];</p> <p>panel.Controls.Clear();</p> <p>for(int i=0; i&lt;convert.toint32(cmbcontrols.text); i++)=&quot;&quot;&gt;</p> <p>{</p> <p>txtcontrols[i]=new TextBox();</p> <p>txtcontrols[i].Text = (i+1).ToString();</p> <p>panel.Controls.Add(txtcontrols[i]);</p> <p>}</p> <p>}</p> <p>&lt;/convert.toint32(cmbcontrols.text);&gt;</span></blockquote>y dentro de flow.Designer.cs agregamos el manejador</p> <p><blockquote><span>this.cmbcontrols.SelectedValueChanged += new System.EventHandler(cmbcontrols_SelectedValueChanged);</p> <p></span></blockquote>ahora solo resta compilar y ejecutar. Si MonoDevelop se les pone nena como a mi, la compilación en linea de comandos sería:</p> <p><blockquote><span>gmcs flow.cs flow.Designer.cs Program.cs -pkg:dotnet</p> <p></span></blockquote>y ejecutamos con</p> <p>mono flow.exe</p> <p>Una vez más gracias por su atención a mis cursos, les dejo el <a href="http://manuelinux.info/files/download?path=%2Ffiles%2Fflowlayout.zip">archivo comprimido</a> del ejemplo y para la próxima semana veremos el uso de TableLayoutPanel para ir pasando a cosas mas interesantes.</p> <!--begin photo--><div class="photo block-center"> <a href="http://manuelinux.info/data/uploads/2009-03-15-131713_1024x600_scrot.png"><img class="picbox-photo" src="http://manuelinux.info/data/thumbs/280_2b88fab5dff14ad06ced6580c41a2ed9_3_1024x600_scrot.png" height="165" width="280" /></a> </div><!--end photo--> avisos@manuelinux.info (Manuel Aguirre) Sun, 15 Mar 2009 15:40:58 -0400 Programando con .net en linux(IV) http://manuelinux.info/blog/view/133/programando-con-net-en-linux-iv http://manuelinux.info/blog/view/133/programando-con-net-en-linux-iv <p>Llegamos a la cuarta entrega de esta serie de tutoriales que espero estén siendo aprovechados por mis 5 o 6 lectores, en esta ocasión abordare el uso de un diseñador de interfaces para no tener que escribir a mano todo el código necesario para crear una interfaz gráfica.</p> <p><b>Usando MWF-Designer</b></p> <p>Mono Windows Forms Designer es una herramienta que aun continua en desarrollo por lo que cuenta con muchos bugs y es muy probable que algunas acciones ocacionen el cierre de la misma, por lo que como advertencia les sugiero guardar cada que agreguen un control para evitar perdidas en nuestro trabajo(no digan que no se los adverti)</p> <p>Lo primero que hay que hacer es descargar el MWF-Designer desde su version svn, para lo cual necesitamos tener instalado en nuestro sistema un programa de control de versiones</p> <p><blockquote>#apt-get install subversion</blockquote>una vez que tenemos el control de versiones procedemos a descargar</p> <p><blockquote>svn co svn://anonsvn.mono-project.com/source/trunk/mwf-designer</blockquote>mwf-designer esta programado en C# usando mono, asi que hay que movernos a su directorio con <blockquote>cd mwf-designer</blockquote>y luego hacemos</p> <p><blockquote>make mono-design</p> <p>make run</p> <p></blockquote>nota: en posteriores ocasiones solo sera necesario entrar al directorio y ejecutar el make run para abrir la aplicación, la cual tiene un aspecto como el siguiente:</p> <!--begin photo--><div class="photo float-left"> <a href="http://manuelinux.info/data/uploads/2009-03-08-125928_1024x600_scrot.png"><img class="picbox-photo" src="http://manuelinux.info/data/thumbs/280_52e89269bcd48d07bb33b0ee58fa034a_8_1024x600_scrot.png" height="165" width="280" /></a> </div><!--end photo--><p>Crearemos una aplicación muy sencilla, similar al ejemplo de consola donde pedíamos la edad del usuario, solo verificaremos si el usuario es mayor de edad y se lo haremos saber con un mensaje en pantalla. Con el diseñador de interfaces abierto empezaremos creando un nuevo proyecto haciendo click en File-New</p> <p>llenamos los datos de la siguiente manera:</p> <p><blockquote><span>Namespace: appedades</p> <p>Class: edades</p> <p>File: edades.cs</span></blockquote>Con lo cual ante nosotros aparece un formulario ya creado y listo para que le agreguemos controles. Lo primero que haremos es reducir el tamaño, por lo que en la venta de propiedades de la derecha modificamos los valores de size y los ponemos como 200,100.</p> <p>Agregamos un label, cambiamos la propiedad Text por “edad” y ponemos autosize en true.</p> <p>Agregamos un textbox, cambiamos name por txtedad y el Text lo dejamos en blanco.</p> <p>Agregamos un control button, cambiamos el text a OK y el name por btnedad</p> <p>Nuestro diseño debería verse así(sin la ventanita del scrot XD):</p> <!--begin photo--><div class="photo block-center"> <a href="http://manuelinux.info/data/uploads/2009-03-08-131747_1024x600_scrot.png"><img class="picbox-photo" src="http://manuelinux.info/data/thumbs/280_3bd44bb4aff6e71ccfcdd13bba006c25_7_1024x600_scrot.png" height="165" width="280" /></a> </div><!--end photo--><p>Guardamos los cambios y tendremos dos archivos el edades.cs y edades-designer.cs, asi que ahora procedemos a unir esos dos archivos para crear nuestro proyecto con lo que pasamos al siguiente tema.</p> <p><b>Usando Monodevelop</b></p> <p>Si, ya se que me tarde un poco para llegar a Monodevelop pero es que anteriormente no era tan necesario. Abrimos Monodevelop y esperamos a que cargue el entorno de desarrollo.</p> <p>Damos click en Archivo - Nueva Solucion seleccionamos C# - Proyecto vacio y llenamos los datos correspondientes poniendo en nombre appedades y la carpeta donde se alojara el proyecto. Click en adelante y aceptar. La solución esta creada pero para empezar agregaremos las referencias necesarias por lo que a la izquierda en el explorador de la solución damos click secundario en referencias y seleccionamos editar referencias. Agregamos las referencias a System, system.drawing, system.data y system.windows.forms. Click en aceptar.</p> <p>Ahora hacemos click derecho en el nombre de la solucion(appedades) y seleccionamos añadir archivos. navegamos hasta la carpeta donde tenemos el mwf-designer/build y seleccionamos los archivos edades.cs y edades.Designer.cs</p> <p>Ahora crearemos un archivo para controlar la solucion el cual llamaremos program.cs</p> <p>para ello damos click derecho en el nombre de la solución y damos en añadir - nuevo archivo, seleccionamos general - clase vacia</p> <p>dentro de ese archivo creamos un metodo main con el siguiente codigo:</p> <p><blockquote><span>static void Main()</p> <p>{</p> <p>Application.Run(new edades());</p> <p>}</span></blockquote>Ahora haciendo uso de los botones en la barra de herramientas ya podemos compilar nuestro proyecto y ejecutarlo desde ahi mismo, con lo que obtendremos una ventana asi:</p> <!--begin photo--><div class="photo block-center"> <a href="http://manuelinux.info/data/uploads/2009-03-08-134346_1024x600_scrot.png"><img class="picbox-photo" src="http://manuelinux.info/data/thumbs/280_623ed1442cc80e32e0e6f30faf9a9788_6_1024x600_scrot.png" height="165" width="280" /></a> </div><!--end photo--><p>La cual aun no tienen ninguna funcionalidad pues falta agregar un controlador de evento para el botón OK.</p> <p>Primero abrimos el archivo edades.Designer.cs y en la parte de la declaracion de btnedad agregamos la siguiente linea:</p> <p><blockquote>this.btnedad.Click += new System.EventHandler(btnedad_click);</blockquote>y dentro de edades.cs creamos el controlador del evento con el siguiente codigo:</p> <p><blockquote><span>private void btnedad_click(object sender, System.EventArgs e)</p> <p>{</p> <p>if(Convert.ToInt32(txtedad.Text)&lt;18)</p> <p>MessageBox.Show(“Eres menor de edad”);</p> <p>else</p> <p>MessageBox.Show(“Eres mayor de edad”);</p> <p>}</span></blockquote>Ahora si nuestra aplicacion hace lo que queremos, las posibilidades a partir de ahora son infinitas y ya depende de las aplicaciones que cada quien quiera crear. Estoy abierto a sugerencias sobre aplicaciones que les interese que desarrolle en este espacio y tratare de ayudarlos en la medida de lo posible, para la proxima semana existe la posibilidad de un color mixer para saber el valor en hexa de un color o generacion dinamica de controles, asi que escucho sus votos.</p> <p>Y para no perder la costumbre, aqui esta el <a href="http://manuelinux.info/files/download?path=%2Ffiles%2Fappedades.zip">archivo comprimido</a> de este ejemplo</p> avisos@manuelinux.info (Manuel Aguirre) Sun, 08 Mar 2009 15:59:00 -0400 Programando con .net en linux(III) http://manuelinux.info/blog/view/131/programando-con-net-en-linux-iii http://manuelinux.info/blog/view/131/programando-con-net-en-linux-iii <p><meta> <title></title> <meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)"> <style type="text/css"> <!-- @page { size: 21.59cm 27.94cm; margin: 2cm } P { margin-bottom: 0.21cm } --> </style> <p style="margin-bottom: 0cm"><b>Usando Windows Forms</b></p> <p style="margin-bottom: 0cm"></p> <p></p> <p style="margin-bottom: 0cm">Despues de la breve introducción a la programación en C# de la semana pasada llegamos ahora a la parte de la programación grafica. Se puede usar gtk# para esto, pero orientandonos a una programación multiplataforma y tomando en cuenta que windows forms ya esta implementado en mono, usaremos dicha tecnologia que ademas convierte la programación de interfaces graficas en algo verdaderamente sencillo.</p> <p style="margin-bottom: 0cm"></p> <p></p> <p style="margin-bottom: 0cm"><b>Las Bibliotecas</b></p> <p style="margin-bottom: 0cm">Para un proyecto grafico tenemos que incluir ademas de system dos librerias mas:</p> <p style="margin-bottom: 0cm"></p> <p style="margin-bottom: 0cm"></p><blockquote><span><p style="margin-bottom: 0cm">using System;</p> <p style="margin-bottom: 0cm">using System.Windows.Forms;</p> <p style="margin-bottom: 0cm">using System.Drawing;</p> </span></blockquote> <p style="margin-bottom: 0cm"><b>Nuestra primera ventana</b></p> <p style="margin-bottom: 0cm">Crear una ventana es algo bastante sencillo, solo hay que crear una clase que derive de la clase Form y eso sera suficiente, nuestra primera ventana quedaria en codigo de la siguiente manera.</p> <p style="margin-bottom: 0cm"></p> <p></p> <p style="margin-bottom: 0cm"></p><blockquote><span><p style="margin-bottom: 0cm">Public class ventanita : Form</p> <p style="margin-bottom: 0cm">{</p> <p style="margin-bottom: 0cm"> public ventanita()</p> <p style="margin-bottom: 0cm"> {</p> <p style="margin-bottom: 0cm"> }</p> <p style="margin-bottom: 0cm"> public static void Main()</p> <p style="margin-bottom: 0cm"> {</p> <p style="margin-bottom: 0cm"> Application.Run(new ventanita();</p> <p style="margin-bottom: 0cm"> }</p> <p style="margin-bottom: 0cm">}</p> </span></blockquote><p style="margin-bottom: 0cm">Esto lo escribimos en cualquier editor, agregando las directivas using que mencione en un principio, para escribirlo usamos cualquier editor de texto, recomiendo usar geany, ayer descubrí que tambien funciona bien con proyectos de C#. Guardaremos el archivo como ventanita.cs</p> <p style="margin-bottom: 0cm">para compilarlo ejecutamos la siguiente orden:</p> <p style="margin-bottom: 0cm"></p> <p></p> <p style="margin-bottom: 0cm"><blockquote>gmcs ventanita.cs -pkg:dotnet</blockquote></p> <p style="margin-bottom: 0cm">y ejecutamos normalmente</p> <p style="margin-bottom: 0cm"></p> <p></p> <p style="margin-bottom: 0cm"><blockquote>mono ventanita.exe</blockquote></p><p style="margin-bottom: 0cm">puedes acomodar geany para compilar haciendo click en construir – inclusiones y argumentos y editando la linea para compilar dejandola asi:</p> <p style="margin-bottom: 0cm"></p> <p></p> <p style="margin-bottom: 0cm"><blockquote>gmcs “%f” -pkg:dotnet</blockquote></p><p style="margin-bottom: 0cm">lo de ejecutar aun no me sale, si lo consigo se los hago saber.</p><p style="margin-bottom: 0cm"><!--begin photo--></p><div class="photo float-left"> <a href="http://manuelinux.info/data/uploads/2009-02-28-211400_1024x600_scrot.png"><img class="picbox-photo" src="http://manuelinux.info/data/thumbs/280_4a2dadf31991cdf376fa6115e40badaf_0_1024x600_scrot.png" height="165" width="280" /></a> </div><!--end photo--><p><p style="margin-bottom: 0cm">Bien, ya tenemos una venta muy generica, pero podemos cambiar sus propiedades como el tamaño y el texto que se montrara en la barra de arriba, para ello crearemos un metodo que llamaremos dentro del constructor, he nombrado el metodo como InitializeComponents</p> <p style="margin-bottom: 0cm"></p> <p></p> <p style="margin-bottom: 0cm"></p><blockquote><span><p style="margin-bottom: 0cm">public ventanita()</p> <p style="margin-bottom: 0cm"> {</p> <p style="margin-bottom: 0cm"> InitializeComponents();</p> <p style="margin-bottom: 0cm"> }</p> <p style="margin-bottom: 0cm"> private void InitializeComponents()</p> <p style="margin-bottom: 0cm"> {</p> <p style="margin-bottom: 0cm"> ClientSize = new Size(200,200);</p> <p style="margin-bottom: 0cm"> Name=“ventanita”;</p> <p style="margin-bottom: 0cm"> Text= “El mundo es cruel”;</p> <p style="margin-bottom: 0cm"> }</p> <p style="margin-bottom: 0cm"> public static void Main()</p> <p style="margin-bottom: 0cm"> {</p> <p style="margin-bottom: 0cm"> Application.Run(new ventanita());</p> <p style="margin-bottom: 0cm"> }</p> <p style="margin-bottom: 0cm">}</p> </span></blockquote> <p style="margin-bottom: 0cm">la ejecución nos daría como resultado algo asi:</p> <p style="margin-bottom: 0cm"></p> <p></p> <p style="margin-bottom: 0cm"><!--begin photo--></p><div class="photo block-center"> <a href="http://manuelinux.info/data/uploads/2009-03-01-144411_1024x600_scrot.png"><img class="picbox-photo" src="http://manuelinux.info/data/thumbs/206_1470ccce6ad079e4157dac9be93d28ac_1_1024x600_scrot.png" height="206" width="185" /></a> </div><!--end photo--><p><p style="margin-bottom: 0cm"></p> <p style="margin-bottom: 0cm"><b>Agregando elementos a nuestra ventana</b></p> <p style="margin-bottom: 0cm"></p> <p></p> <p style="margin-bottom: 0cm">Ahora usando el mismo esqueleto agregaremos una etiqueta y un boton, para lograrlo agregaremos las variables correspondientes en la definición de la clase, antes del constructor</p> <p style="margin-bottom: 0cm"></p><blockquote><span><p style="margin-bottom: 0cm"></p> <p></p> <p style="margin-bottom: 0cm">private Label lblSaludo;</p> <p style="margin-bottom: 0cm"> private Button btnSaludo;</p></span></blockquote><p style="margin-bottom: 0cm"></p> <p style="margin-bottom: 0cm">ahora dentro del metodo InitializeComponentes crearemos las instancias y modificaremos algunas propiedades para la etiqueta</p> <p style="margin-bottom: 0cm"></p> <p></p> <p style="margin-bottom: 0cm"></p><blockquote><span><p style="margin-bottom: 0cm">lblSaludo= new Label(); //nueva instancia</p> <p style="margin-bottom: 0cm"> lblSaludo.Text=“Hola Mundo!!!”; //texto</p> <p style="margin-bottom: 0cm"> lblSaludo.TextAlign = ContentAlignment.MiddleCenter; //alineacion</p> <p style="margin-bottom: 0cm"> lblSaludo.Location = new Point(53,48); //ubicación</p> <p style="margin-bottom: 0cm"> lblSaludo.Size = new Size(187,35); //tamaño</p> <p style="margin-bottom: 0cm"> Controls.Add(lblSaludo); //agregamos el control al formulario</p> </span></blockquote><p style="margin-bottom: 0cm"></p> <p></p> <p style="margin-bottom: 0cm">y lo siguiente es para el botón</p> <p style="margin-bottom: 0cm"></p> <p></p> <p style="margin-bottom: 0cm"></p><blockquote><span><p style="margin-bottom: 0cm">btnSaludo = new Button(); //nueva instancia</p> <p style="margin-bottom: 0cm"> btnSaludo.Text = “Estoy Amargado”; //texto del boton</p> <p style="margin-bottom: 0cm"> btnSaludo.Location = new Point(53,90); //ubicación</p> <p style="margin-bottom: 0cm"> btnSaludo.Size = new Size(187,23); //tamaño</p> <p style="margin-bottom: 0cm"> Controls.Add(btnSaludo); //agregamos al formulario</p> <p style="margin-bottom: 0cm"></p></span></blockquote><p style="margin-bottom: 0cm">Ahora compilamos para observar el resultado, como podemos ver nuestro boton no hace nada por el momento, para ello hay que crear un manejador para el evento click del boton, para ello antes de agregarlo al formulario incluimos lo siguiente</p> <p style="margin-bottom: 0cm"><blockquote>btnSaludo.Click += new System.EventHandler(btnSaludo_Click);</blockquote></p> <p style="margin-bottom: 0cm">lo cual indica que agregamos un manejador para el evento click</p> <p style="margin-bottom: 0cm">Ahora en antes del metodo Main definimos el metodo para el manejador del evento de la siguiente manera:</p> <p style="margin-bottom: 0cm"></p> <p></p> <p style="margin-bottom: 0cm"></p><blockquote><span><p style="margin-bottom: 0cm">private void btnSaludo_Click(object sender, EventArgs e)</p> <p style="margin-bottom: 0cm"> {</p> <p style="margin-bottom: 0cm"> lblSaludo.Text = “El mundo es cruel!!!”;</p> <p style="margin-bottom: 0cm"> }</p> </span></blockquote><p style="margin-bottom: 0cm"></p> <p></p> <p style="margin-bottom: 0cm">ahora al hacer click en el boton el texto del label cambiara</p> <p style="margin-bottom: 0cm"><!--begin photo--></p><div class="photo float-left"> <a href="http://manuelinux.info/data/uploads/2009-03-01-145554_1024x600_scrot.png"><img class="picbox-photo" src="http://manuelinux.info/data/thumbs/219_d283547367f764c19c826609fd91c030_4_1024x600_scrot.png" height="161" width="219" /></a> </div><!--end photo--><p><p style="margin-bottom: 0cm"></p> <p style="margin-bottom: 0cm">Pues bien, les dejo como siempre el <a href="http://manuelinux.info/files/download?path=%2Ffiles%2Fwinform1.zip">archivo comprimido</a> de los sources de ambos ejemplos y los invito a crear sus propios ejemplos, como pueden ver crear formularios a base de codigo es un poco dificil, por lo que en la proxima entrega de este curso apŕenderemos el uso de un diseñador de interfaces y Monodevelop ahora si.</p> <p style="margin-bottom: 0cm">Espero sus dudas y comentarios, asi como sugerencias, de mi parte solo queda una entrega mas sobre esto, pero estoy abierto a escuchar peticiones.</p> </meta></meta></p> avisos@manuelinux.info (Manuel Aguirre) Sun, 01 Mar 2009 16:06:26 -0500