tag:blogger.com,1999:blog-323853022024-03-13T17:59:06.125-07:00Software Libre y algo más ......De todo aquello que hago y que pienso hacerjpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.comBlogger71125tag:blogger.com,1999:blog-32385302.post-71245938600205439952009-08-22T23:21:00.000-07:002009-08-22T23:29:06.056-07:00Enabling the Bluetooth device on Lenovo Thinkpad SL400Quick post:<br /><br />To enable the bluetooth device on Lenovo Thinkpad SL400 laptop (and others features like hot-keys), use the lenovo-sl-laptop kernel module, available in:<br /><br /><a href="http://github.com/tetromino/lenovo-sl-laptop/tree/master">http://github.com/tetromino/lenovo-sl-laptop/tree/master</a><br /><br />Thanks nelchael.<br /><br /><a href="http://dev.gentoo.org/%7Enelchael/SL400-NRH4MPB.html">http://dev.gentoo.org/~nelchael/SL400-NRH4MPB.html</a>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com7tag:blogger.com,1999:blog-32385302.post-61047759646892812022009-07-15T19:35:00.000-07:002009-07-15T21:55:21.954-07:00Plantilla única para las acciones de un módulo en Symfony<div style="text-align: justify;">Una forma sencilla de utlizar una única plantilla para las acciones de un módulo en Symfony, es declarando un método <span style="font-style: italic;">preExecute</span> y usando el método de la clase <span style="font-weight: bold;">sfActions</span> llamado<span style="font-style: italic;"> setTemplate</span>, de la siguiente forma: </div><pre><br />class miModuloActions extends sfActions<br />{<br /> public function preExecute()<br /> {<br /> $this->setTemplate('miplantilla');<br /> }<br /><br /> public function executeIndex()<br /> {<br /> // codigo ......<br /><br /> }<br />}<br /></pre><br /><div style="text-align: justify;">De esta manera todas las acciones buscarán la plantilla llamada <span style="font-style: italic;">miplantillaSuccess.php</span>, sin necesidad de retornar un atributo de la clase <span style="font-weight: bold;">sfView</span>.<br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com2tag:blogger.com,1999:blog-32385302.post-75501973969625456142009-07-01T21:13:00.000-07:002009-07-01T21:21:38.940-07:00PostgreSQL 8.4 ha sido liberadoCopio el anuncio de la lista oficial de soporte en español:<br /><br /><div style="text-align: justify;">1 de julio, 2009: El Grupo Global de Desarrollo de PostgreSQL ha liberado la versión 8.4, continuando con el rápido desarrollo de la base de datos de código abierto más avanzada del mundo. Esta versióncontiene una gran cantidad de mejoras para hacer la administración,consulta y programación en PostgreSQL mucho más fácil que nunca. Con las 293 funcionalidades nuevas o mejoradas en la versión 8.4, hay aún más motivos para escoger PostgreSQL para sus futuros proyectos.<br /></div><br /><div style="text-align: justify;"> La mayoría de los cambios en PostgreSQL 8.4 son herramientas y órdenes de administración y monitoreo, nuevas o mejoradas. Cada usuario tiene su funcionalidad favorita que hace su trabajo cotidiano con PostgreSQL más fácil y productivo.<br /></div><br /><div style="text-align: justify;"> “Hemos usado PostgreSQL durante siete años, y estamos entusiasmados con varias funcionalidades de 8.4, especialmente los privilegios por columna, configuración regional en cada base de datos, búsquedas parciales en índices GIN y excepciones definidas por usuario”, dice Jeffrey Webster, CTO de ZooLoo.com. “PostgreSQL nos ha permitido crecer sin sacrificar la integridad de nuestros datos”.<br /></div><br />Entre las mejoras más populares están:<br /><br /><ul style="text-align: justify;"><li>Restauración de bases de datos en procesos paralelos, que acelerarecuperación de un respaldo hasta 8 veces.</li><li>Privilegios por columna, que permiten un control más granular de datos confidenciales.</li><li>Configuración de ordenamiento configurable por base de datos, lo cual hace a PostgreSQL más útil en entornos con múltiples idiomas.</li><li>Actualizaciones “en el lugar” desde 8.3 a 8.4 con muy bajo downtime, gracias al uso de pg_migrator beta.</li><li>Nuevas herramientas de monitoreo de consultas que le otorgan a los administradores mayor información sobre la actividad del sistema.<br /></li></ul><br /><div style="text-align: justify;"> La versión 8.4 hace el análisis de datos mucho más sencillo a través de funcionalidades avanzadas de ANSI SQL:2003, como las funciones window, expresiones comunes de tabla y joins recursivos. “Estas estructuras de consulta aumentan sustancialmente la expresividad del dialecto SQL de PostgreSQL, permitiendo a los usuarios hacer preguntas interesantes en una sola consulta, que habría sido imposible de construir antes”, explica Sailesh Krishnamurthy, fundador de Truviso. Las mejoras en los procedimientos almacenados, como los valores por omisión para los argumentos y los argumentos de largo variable hacen más simple y compacta la programación en la base de datos.<br /><br />La nueva versión además mejora el rendimiento de las aplicaciones, como comenta Kevin Grittner, Administrador de base de datos del Sistema de Cortes de Wisconsin: “PostgreSQL continúa mejorando el rendimiento en cada versión. La versión 8.4 ha añadido muchas optimizaciones, como semi-joins y anti-joins, que otorgan una notable mejora en el tiempo de ejecución de algunas de nuestras consultas más exigentes”.<br /><br />Debido a estas nuevas características PostgreSQL 8.4 podrá atender a muchos más usuarios que antes, como el proyecto OpenStreetMap. “A medida que diseñábamos la nueva versión de la API de OpenStreetMap, estuvo claro que necesitábamos una base de datos de clase mundial que no sólo dijera que tenía las funcionalidades deseadas, sino que realmente corriera bien en la escala que nosotros necesitábamos. Aunque existen varias bases de datos de código abierto, PostgreSQL era la elección obvia”, dice Tom Hughes, administrador de sistemas de OpenStreetMap.<br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com0tag:blogger.com,1999:blog-32385302.post-26160105271183116452009-05-21T22:54:00.000-07:002009-05-21T23:08:25.520-07:00Bloqueo de cuentas de usuario en Solaris/OpenSolaris y Linux<div style="text-align: justify;">En el siguiente artículo expongo una corta descripción acerca del bloqueo de cuentas de usuario tanto en Solaris/OpenSolaris como en Linux. El artículo completo se puede descargar de:<br /></div><br /><div style="text-align: center;"><a href="http://glud.udistrital.edu.co/jpromerobx/articulos/BloqueoCuentasUsuarios.pdf">http://glud.udistrital.edu.co/jpromerobx/articulos/BloqueoCuentasUsuarios.pdf</a><br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com1tag:blogger.com,1999:blog-32385302.post-67208198056045698382009-03-18T23:27:00.000-07:002009-04-04T22:16:51.609-07:00Se actualiza la certificación LPI a partir de Abril<div style="text-align: justify;">A través de la lista de discusión de LPI, se ha hecho el anuncio oficial de la actualización de los exámenes de certificación para los niveles junior y advanced (LPIC-1 y LPIC-2, respectivamente). Aunque en mi opinión no hay cambios drásticos, se incluyen nuevos temas, como por ejemplo el manejo básico del lenguaje <a href="http://es.wikipedia.org/wiki/Celda_activa">SQL</a>, localización y administración de dispositivos con <a href="http://es.wikipedia.org/wiki/Udev">udev</a>. En resumen los nuevos temas, a parte de los mencionados anteriormente son:<br /><ul><li>Accesibilidad</li><li>Encripción de datos</li><li>Un enfoque más fuerte en seguridad</li><li>Más sobre LVM</li><li>Protocolos IMAP/POP</li></ul>En la página del <a href="http://www.lpi.org">lpi</a>, se pueden encontrar los temas en detalle, además de enlaces hacia las nuevas guías de estudio (muchas de ellas serán publicadas hasta junio de este año.)<br /><br />Otra fuente importante es el wiki de los exámenes:<br /><br /><div style="text-align: center;"><a href="https://group.lpi.org/publicwiki/bin/view/Examdev/WebHome">https://group.lpi.org/publicwiki/bin/view/Examdev/WebHome</a><br /></div><br /><br /><br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com5tag:blogger.com,1999:blog-32385302.post-81253919740392079102009-02-22T23:31:00.000-08:002009-04-04T20:58:47.730-07:00Installation of Sakai 2.5 under Solaris 10u6 using MySQL 5.1 CS<div style="text-align: justify;">Sakai is a great virtual collaboration and learning environment designed mainly for research activities. It' s written in Java using a several open source componets such that: apache maven, apache tomcat, hibernate and others. Sakai is published under terms of <a href="http://www.opensource.org/licenses/ecl1.php">Educational Community License v. 1.0</a>., which is certified for OSI Initiative. More information about Sakai:<br /><span style="display: block;" id="formatbar_Buttons"><span class="down" style="display: block;" id="formatbar_CreateLink" title="Enlace" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"><img src="http://www.blogger.com/img/blank.gif" alt="Enlace" class="gl_link" border="0" /></span></span><br /><div style="text-align: center;"><a href="http://sakaiproject.org/">http://sakaiproject.org</a><br /></div><br />Well, and now, i'm going to describe the installation process of Sakai from the sources under Solaris 10 OS (update 6), using the MySQL Server version 5.1 (Community Server). I think, this same instructions can be usefull for OpenSolaris (and Linux distros, with some changes !)<br /><br />The summary of installation process:<br /><ol> <li>Download the Sakai sources and other components as the servlet container, the Java SDK, etc,,<br /></li> <li>Install the database server (in this case MySQL) and create the Sakai's database. </li> <li>Create the environment to compile and deploy Sakai.<br /></li> <li>Compile and deploy Sakai<br /></li> <li>Connect Sakai with database Server.<br /></li> <li>Start the Tomcat Server<br /></li> </ol><br /><span style="font-weight: bold;">Step 1: Download the necessary software:</span><br /><br />To compile an deploy Sakai, with MySQL support, we need:<br /><ul> <li><a href="http://sakaiproject.org/portal/site/sakai-downloads/page/6faced6e-dd0a-4cd0-a528-d30eae3a4670">Sakai sources, version 2.5.4 </a><br /></li><li><a href="http://java.sun.com/javase/downloads/index_jdk5.jsp">Java SDK 1.5.0.16 or higher</a> (the 1.6.0 or higher versions is not supported yet)</li> <li><a href="http://archive.apache.org/dist/tomcat/tomcat-5/v5.5.26/">Apache Tomcat (5.5.26)</a><br /></li> <li><a href="http://maven.apache.org/download.html">Apache Maven</a> (2.0.x. I've used 2.0.10)<br /></li> <li><a href="http://dev.mysql.com/downloads/mysql/5.1.html">MySQL server</a> (5.0.x or higher. I've used 5.1.31 CS)<br /></li> <li><a href="http://dev.mysql.com/downloads/connector/j/5.1.html">MySQL connector for Java</a> (depends of version of MySQL Server. I've used 5.1.7)</li> </ul><br />All this software may be downloaded on /opt directory, although you can choose another location.<br /><br />Remark: The shell used for installation process is Bash. If you use another shell, for instance KSH or C-Shell, consult the documentation for export environment variables and execute files.<br /><br /><span style="font-weight: bold;">Step 2: Install the MySQL Server</span><br /><br />Before to install the MySQL server, you must to create the mysql user and group:<br /><br /># groupadd mysql<br /># useradd -d /var/lib/mysql -s /bin/bash mysql<br /># usermod -G mysql mysql<br /><br />And now, we can to install and start the MySQL server:<br /><br /># cd /opt<br /># gunzip mysql-5.1.31-solaris10-i386.pkg.gz<br /># pkgadd -d mysql-5.1.31-solaris10-i386.pkg all<br /># /etc/init.d/mysql start<br /><br />Add the mysql commands to the PATH:<br /><br /># export PATH=$PATH:/opt/mysql/mysql/bin<br /><br />Verify the connection: (The root user has an empty password )<br /><br /># mysql -u root -p<br /><br />Enter password:<br />Welcome to the MySQL monitor. Commands end with ; or \g.<br />Your MySQL connection id is 2<br />Server version: 5.1.31 MySQL Community Server (GPL)<br /><br />Type 'help;' or '\h' for help. Type '\c' to clear the buffer.<br /><br />mysql><br /><br />Create the Sakai database:<br /><br />mysql> create database sakai default character set utf8;<br /><pre>Query OK, 1 row affected (0.00 sec)</pre><br />Note: If you want, you can to add the mySQL service as part of SMF. See: <a href="http://pastebin.com/f2c7200bd">http://pastebin.com/f2c7200bd</a><br /><br /><span style="font-weight: bold; font-style: italic;">For step 3 and 4, the main reference is the </span><a style="font-weight: bold; font-style: italic;" href="http://confluence.sakaiproject.org/confluence/display/DOC/Install+Guide+-+Source+Install+%282.5%29#InstallGuide-SourceInstall%282.5%29-sourceinstall">install guide of Sakai 2.4.5</a><span style="font-weight: bold; font-style: italic;">, however it can be summarized:</span><span style="font-style: italic;"> </span><br /><br /><span style="font-weight: bold;">Step 3: Create the environment to compile and deploy Sakai: </span><br /><br /><br /><span style="font-size:85%;"># cd /opt<br /># tar xzf apache-tomcat-5.5.26.tar.gz<br /># tar xzf apache-maven-2.0.10-bin.tar.gz<br /># ln -s apache-tomcat-5.5.26 tomcat<br /># ./jdk-1_5_0_17-solaris-i586.sh<br /># export JAVA_HOME=/opt/jdk1.5.0_17<br /># export PATH=$PATH:$JAVA_HOME/bin<br />#export JAVA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m"<br /># export CATALINA_HOME=/opt/tomcat<br /># export PATH=$PATH:/opt/tomcat/bin<br /># export MAVEN_HOME=/opt/apache-maven-2.0.10/<br /># export PATH=$PATH:/opt/apache-maven-2.0.10/bin<br />#export MAVEN_OPTS='-Xms256m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=128m'<span style="display: block;" id="formatbar_Buttons"><span class="" style="display: block;" id="formatbar_CreateLink" title="Enlace" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"><img src="http://www.blogger.com/img/blank.gif" alt="Enlace" class="gl_link" border="0" /></span></span># cd $HOME<br /># mkdir -p .m2/repository<br /># vi .m2/settings.xml /* with this content: See: <a href="http://confluence.sakaiproject.org/confluence/display/DOC/Install+Guide+-+Source+Install+%282.5%29#InstallGuide-SourceInstall%282.5%29-mvnsettingsxml">Install Guide of Saka 2.5.4</a>. section Maven; subsection: create a maven settings.xml file. */<span style="text-decoration: underline;"></span></span><br /><settings xmlns="http://maven.apache.org/POM/4.0.0" xsi="http://www.w3.org/2001/XMLSchema-instance" schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"><profiles><profile><properties><surefire.usefile></surefire.usefile><br /> </properties></profile></profiles></settings><br />After, create the setenv.sh file in /opt/tomcat/bin, with this content:<br /><br /><span style="font-size:85%;">export JAVA_OPTS="-server -XX:+UseParallelGC -Xmx768m -XX:MaxPermSize=160m -Djava.awt.headless=true"</span><br /><br /><br />Note: You can save the environment variables declared above in your .bashrc file.<br /><br />Modify the /opt/tomcat/bin/catalina.sh file and change the shell binary:<br /><br />#!/bin/sh for:<br />#!/bin/bash<br /><br /><span style="font-weight: bold;">Step 4: Compile and deploy Sakai: </span><br /><br /># cd /opt<br /># tar xzf sakai-src-2.5.4.tar.gz<br /># cd sakai-src-2.5.4/master<br /># mvn clean install<br />(outpur truncated ...)<br /># cd ..<br /># mvn clean install sakai:deploy -Dmaven.tomcat.home=/opt/tomcat<br />(meanwhile you can drink a coffee! )<br /><br />If the Build is successfull, you can to go a the next step ....<br /><br /><span style="font-weight: bold;">Step 5: Connect Sakai with database Server.</span><br /><br /># tar xvzf mysql-connector-java-5.1.7.tar.gz<br /># cp mysql-connector-java-5.1.7/*.jar /opt/tomcat/common/lib<br /><br />Copy the sakai.properties file located at:<br /><br />/opt/sakai-src-2.5.4/component/component-api/component/src/config/org/sakaiproject/config/sakai.properties<br /><br />to /opt/tomcat/sakai<br /><br />To add the information about the database vendor (MySQL), change for the<br /><div style="text-align: left;" id="result_box" dir="ltr">appropriate values:<br /></div><br /># Usser and password to database access:<br /><br />username@javax.sql.BaseDataSource=root<br />password@javax.sql.BaseDataSource=123456<br /><br /># MySQL settings - make sure to alter as appropriate<br />vendor@org.sakaiproject.db.api.SqlService=mysql<br />driverClassName@javax.sql.BaseDataSource=com.mysql.jdbc.Driver<br />hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect<br />url@javax.sql.BaseDataSource=jdbc:mysql://127.0.0.1:3306/sakai?useUnicode=true&characterEncoding=UTF-8<br />validationQuery@javax.sql.BaseDataSource=select 1 from DUAL<br />defaultTransactionIsolationString@javax.sql.BaseDataSource=TRANSACTION_READ_COMMITTED<br /><br />Step 6: Start the tomcat server:<br /><br />To finish:<br /><br /># startup.sh<br /><br />Ready, Sakai is installed !. To access it: <server_url>http://{server-name}:8080/portal<br /><br /><br /></server_url></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com6tag:blogger.com,1999:blog-32385302.post-47737131108371281612009-02-22T17:29:00.000-08:002009-02-22T19:01:45.216-08:00Principiante en matemáticas<div style="text-align: justify;">Las matemáticas son una ciencia, que tiene tanto de largo como de ancho. Es impresionante observar los diversos campos de estudio alrededor de ellas y como constituyen un lenguaje unificador para las demás ciencias.<br /><br />Hace unos días en la lista de discusión de <a href="http://www.math.utexas.edu/mailman/listinfo/maxima">Maxima</a>, una <a href="http://www.math.utexas.edu/pipermail/maxima/2009/015833.html">persona escribió</a> un correo pidiendo información sobre algún documento o libro para un principiante en matemáticas. Hubo varias respuestas, de parte de algunos de los desarrolladores de Maxima y muchos coincidian en que no era fácil recomendar un libro, debido a que la pregunta estaba planteada de manera muy general; y recomendaron a la persona que aclarara cuales eran sus intereses (topología, geometría, álgebra lineal, teoría de números, etc,.), para poder así recomendar algo más adecuado. Sin embargo, dentro de las sugerencias, no sabía que había un libro de cálculo del MIT disponible en formato PDF, una muy buena referencia:<br /><br /><div style="text-align: center;"><a href="http://ocw.mit.edu/ans7870/resources/Strang/strangtext.htm">http://ocw.mit.edu/ans7870/resources/Strang/strangtext.htm</a><br /></div><br />Otra referencia para el estudio del cálculo elemental:<br /><br /><div style="text-align: center;"><a href="http://www.math.wisc.edu/%7Ekeisler/calc.html">http://www.math.wisc.edu/~keisler/calc.html</a><br /></div><br />Y para rematar, uno de los manuscritos de <a href="http://es.wikipedia.org/wiki/Euler">Euler</a>, publicado en 1748:<br /><br /><div style="text-align: center;"><a href="http://math.dartmouth.edu/%7Eeuler/pages/E101.html">http://math.dartmouth.edu/~euler/pages/E101.html</a><br /></div><br />Defitivamente, hay mucho por conocer sobre matemáticas, aunque con las herramientas que poseemos actualmente, el camino se facilita bastante y el aprendizaje se vuelve más interactivo.<br /><br /><br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com0tag:blogger.com,1999:blog-32385302.post-75795441557621904882009-01-28T18:06:00.000-08:002009-01-28T18:40:35.652-08:00Agregando información de versión de SVN en la cabecera de los archivos<div style="text-align: justify;">Bueno, personalmente encuentro muy útil al momento de desarrollar (usando Subversion) que en las cabeceras de los archivos se encuentre información referente al número de revisión, autor y fecha de la misma. Desde hace ya rato, que venía intentando lograr escribir esa información de mis archivos sin éxito. Sin embargo, en <a href="http://blog.ibao.net/linux/2004/10/29/snv-id-tags/">un "mini-articulo" de Linux Journal</a> encontré la solución:<br /><br />Simplemente al archivo que se desea colocar dicha cabecera (en mi caso archivos PHP), agrego la línea: $Id: $. Por ejemplo:<br /><br /><span style="font-family: courier new;"><?php </span><br /><span style="font-family: courier new;">/**</span><br /><span style="font-family: courier new;"> * @author .....</span><br /><span style="font-family: courier new;"> * @version SVN $Id: $</span><br /><span style="font-family: courier new;"> */</span> <br /><span style="font-family: courier new;">..........</span><br /><br />Después agrego una propiedad a el ó los archivos:<br /><br /><span style="font-family: courier new;">$ svn propset svn:keywords Id archivo.php</span><br /><br />o si quiero a todos los archivos .php de mi proyecto:<br /><br /><span style="font-family: courier new;">$ find . -name "*.php" -exec svn propset svn:keywords Id {} \;</span><br /><br />Después configuro mi cliente SVN, agregando la siguiente línea en la sección auto-props:<br /><br /><span style="font-family: courier new;">*.php = svn:keywords=Id</span><br /><br />Y listo, una vez se haga commit en el servidor, la información de revisión, autor y fecha será agregada en medio de la etiqueta Id:<br /><br /><span style="font-family: courier new;">* @version SVN $Id: Notificacion.php 95 2009-01-29 02:01:01Z jpromerob $</span><br /><span style="font-family: courier new;"> */</span><br /><br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com0tag:blogger.com,1999:blog-32385302.post-6967467637185399072009-01-24T23:30:00.000-08:002009-01-25T19:22:51.133-08:00Por qué no pensar en usar Symfony para Orfeo ?<div style="text-align: justify;">Bueno, últimamente he estado probando y mirando algunos de los aspectos de <a href="http://orfeogpl.org/">Orfeo</a> (el gestor documental libre) y realmente no pensé que fuera un software tan grande y al hablar con algunas personas del medio no conocía que ya estuviera implementado en varias entidades públicas del país y empresas del sector privado, desde luego con éxito. Sin embargo, y lo digo sin conocimiento de causa, creo que el software ha llegado a un punto en que hacerlo mantenible es una tarea de gran esfuerzo, debido a que observo que no existe una arquitectura muy definida y algo importante como lo es la división por capas, se encuentra totalmente ausente. Reitero, que no conozco los motivos por los cuales el proyecto ha avanzado en esa forma, es sólo lo que he observado desde hace unos tres meses. Pero, como la labor no es criticar si no brindar soluciones a los problemas y brindar mejoras sobre lo existente, después de reflexionar un poco, pienso que una buena manera de empezar a darle forma al proyecto es la adopción de un framework para su desarrollo; y desde luego que pienso en <a href="http://www.symfony-project.org/">Symfony</a> como una gran alternativa, por sus características y por el grado de madurez que ha alcanzado. Revisando el roadmap de la versión 4.0 de Orfeo, veo que se considera la elección de un framework (<a href="http://www.springsource.org/about">Spring</a>) que supone desde luego un cambio de lenguaje, diría yo bastante drástico, que en buena medida desaprovecharía el trabajo realizado hasta ahora, no digo que Java no sea adecuado, pero supondría una esfuerzo adicional, tanto a nivel de test como de equipo de desarrollo, por la experiencia que se ha ganado. No obstante en la guia de discusión de Orfeo (<a href="http://orfeogpl.org/ata/sites/default/files/GuiadiscusionOrfeoV01.odt">disponible en el sitio web</a>), se consideran algunas características que debe tener el lenguaje de programación:
<br />
<br /><ul><li> <meta equiv="CONTENT-TYPE" content="text/html; charset=utf-8"> Características del lenguaje y nivel de abstracción.</li><li><meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)"> <style type="text/css"> <!-- @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } - </style> Desempeño del lenguaje</li><li>Simplicidad y rapidez de desarrollo</li><li>Experticia de los programadores</li><li>Frameworks disponibles y sus prestaciones</li><li>Facilidades de escalabilidad y alta disponibilidad</li><li>Transacciones</li><li>Existencia de módulos reusables. </li></ul>Aunque son bastante generales, dichos requerimientos se pueden satisfacer plenamente con el uso de Symfony, repasemos cada uno de estos puntos:
<br />
<br /><span style="font-weight: bold;">Características del lenguaje y nivel de abstracción
<br />
<br /></span>Desde PHP 5.x, es claro para aquellos que han usado PHP, el buen trabajo respecto al soporte para programación orientada a objetos, aunque se debe reconocer que no es total. Sin embargo, esta "deficiencia" se suple con la arquitectura que plantea Symfony y las grandes facilidades y herramientas que brinda. (<a href="http://assets.expectnation.com/15/event/1/symfony_%20simplify%20professional%20web%20development%20with%20PHP%20_Prince%20PDF%20version_.pdf">Ver un resumen</a>), por ejemplo la utilización de una capa de abstracción a base de datos potente (estan disponibles <a href="http://propel.phpdb.org/trac/">Propel</a> y <a href="http://www.doctrine-project.org/about">Doctrine</a>), separación de las reglas de negocio, manejo de patrón MVC, núcleo de clases que incluye: validación, seguridad, etc. <span style="font-weight: bold;">
<br />
<br />Desempeño del lenguaje</span>
<br />
<br />Aunque el desempeño de los lenguajes interpretados es un poco menor al de los compilados, existen mecanismos que permiten acelerar y mejorar esta característica. Symfony incorpora un sistema de cache, del lado servidor bastante flexible y configurable. (Ver <a href="http://www.symfony-project.org/book/1_2/12-Caching">Uso de la cache</a>)
<br />
<br />Simplicidad y rapidez en el desarrollo
<br />
<br />Como lo mencioné anteriormente, Symfony provee una serie de clases y mecanismos que brindan al desarrollador bastante libertad y lo permiten concentrarse en las labores específicas del desarrollo y no en cuestiones inherentes a todo desarrollo web, por ejemplo el manejo de usuarios, sesiones, formularios, validación, etc. Se basa en la premisa de: c<span style="font-style: italic;">onvenir en vez de configurar, en la que el desarrollador sólo debe configurar aquello que no es convencional. </span>(Tomado del Libro de Symfony en castellano, Capítulo 1)
<br />
<br /><span style="font-weight: bold;">Experticia de los programadores</span>
<br />
<br />Desde su concepción, Orfeo ha sido desarrollado en PHP y la experticia que han ganado las personas involuradas en el proyecto, es una ventaja enorme, que no debe ser desaprovechada y por el contrario aplicada al manejo del framework.
<br />
<br /><span style="font-weight: bold;">Frameworks disponibles y sus prestaciones</span>
<br />
<br />Creo que esto no requiere de una explicación. Más información en:
<br />
<br /><div style="text-align: center;"><a href="http://www.symfony-project.org/">http://www.symfony-project.org</a>
<br /></div>
<br /><span style="font-weight: bold;">Facilidades de escalabilidad y alta disponibilidad</span>
<br />
<br />Symfony ha sido concebido para que las aplicaciones desarrolladas con este framework sean fácilmente mantenibles y por ende escalables. De hecho se proveen mecanismos para hacer actualizaciones entre versiones del framework. Además, la separación por capas, hace que el código generado sea más claro, aumentando la legibilidad, una ventaja en proyectos en donde muchas personas participan. De otro lado, Symfony es un proyecto con bastante respaldo y que cuenta con la colaboración y soporte de muchas personas en el mundo, como buen proyecto de Software Libre.
<br />
<br />Transacciones
<br />
<br />Aunque esto depende en gran medida del motor de base de datos que se utilice, Symfony incluye el ORM Doctrine, que soporta el trabajo con transacciones. <a href="http://www.doctrine-project.org/documentation/manual/1_0/en/transactions">Más información. </a>
<br />
<br /><span style="font-weight: bold;">Existencia de módulos reusables</span>
<br />
<br />Symfony provee un mecanismo de plugins, para su extensión y reutilización. De hecho actualmente existen 416 plugins en diversas categorías, que se pueden "reusar" y adaptar.
<br />
<br />Bien, hasta aqui sólo he descrito algunas características de Symfony y el porqué pienso que el proyecto Orfeo debería mirar hacia este framework, además de otros proyectos como <a href="http://www.owasp.org/index.php/Main_Page">OWASP</a>. Desde luego, que queda mucho por evaluar y revisar (<a href="http://conf.phpquebec.com/">la conferencia PHP de 2009 en Quebec</a> traerá bastantes novedades).
<br />
<br />Opiniones ?? Sugerencias ??
<br />
<br />
<br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com3tag:blogger.com,1999:blog-32385302.post-1860978126810041242009-01-08T15:32:00.000-08:002009-01-09T20:52:12.466-08:00Subiendo mis fotos y videos a Picasa con Python<div style="text-align: justify;">En mi opinión Picasa es uno de los mejores servicios que ofrece Google para compartir imágenes. Sin embargo, la versión actual del cliente para sistemas operativos Linux está aún en fase de desarrollo y por lo menos desde mi experiencia no he podido hacerlo funcionar al 100 %, dado que la funcionalidad de subir las fotos al album web no trabaja (de hecho la versión para Linux de Picasa es simplemente un ejecutable de windows que emula wine) y no encuentro la razón.<br /><br />Como muchos de mis familiares comparten sus fotos en Picasa, me vi obligado a buscar una solución al problema, pues aunque desde la interfaz web de Picasa se pueden subir las fotos, es mucho más cómodo hacerlo desde un programa cliente y con una mínima intervención de parte del usuario. Adicionalmente, toda mi colección de fotografías la mantengo usando Digikam, un excelente software para manejo de colecciones de imágenes, que tiene un plugin para creacion de albumes y subida de fotos a PIcasa; sin embargo, el plugin tiene un bug al subir fotos a albumes cuyo nombre contiene espacios o algún carácter no ascii. Por lo tanto me fui en busca de otra solución.<br /><br />Buscando dentro dentro de los blogs de Google, encontré que existe un API llamada <a href="http://code.google.com/intl/es-ES/apis/gdata/">GData</a>, escrita en Python, que establece un protocolo para la lectura e introducción de datos en la web de Google (blogger, picasa, googledocs, etc). Hay numerosos ejemplos de uso y ahora la estoy usando para subir mis fotos y algunos videos cortos a Picasa, apoyado en un conjunto de scripts que encontré en:<br /><br /><a href="http://wanted.eu.org/en/computers/linux/uploading_photos_to_picasaweb">http://wanted.eu.org/en/computers/linux/uploading_photos_to_picasaweb</a><br /><br />El script que permite subir las fotos, consultando la base de datos de digikam, también me ha permitido subir algunos videos (tras algunas modificaciones).<br /><br />TODO:<br /><ul><li>Implementar un método que me permita identificar la clase de archivo (video o imagen) y que se encargue de hacer la optimización. Por el momento el script base usa la python imaging library para la modificaciones de imágenes. Mi idea es usar Pymedia para la modificación y optimización de los videos.<br /></li><li>Compilar Pymedia, pues he tenido algunos incovenientes.</li></ul>Bueno, eso es por el momento. Espero publicar pronto los resultados.<br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com1tag:blogger.com,1999:blog-32385302.post-43510769384474745882008-12-10T21:31:00.000-08:002008-12-10T21:50:33.250-08:00Gran publicación<div style="text-align: justify;">Después, de varios días de bastante trabajo, recibí por la lista de anuncios de Nmap, una gran noticia: Se ha publicado un completo libro sobre <a href="http://nmap.org">nmap</a>, la clásica herramienta de escaneo de redes. Realmente, es una gran noticia, debido a que nmap es una de las herramientas que considero más completas y poderosas, pero precisamente debido a su fleixibilidad y variedad de opciones, en ocasiones es compleja de utilizar. El libro está escrito por Fyodor (el desarrollador principal) con la colaboración de un grupo bastante de amplio y echando un vistazo rápido a la <a href="http://nmap.org/book/toc.html">tabla de contenido</a>, luce bastante interesante.<br /><br />La página oficial del libro es: <a href="http://nmap.org/book/">http://nmap.org/book/</a> y se puede adquirir en amazon por un precio de 33 dólares. También se encuentra disponible una versión en linea, que no contiene algunos capítulos como escaneo de puertos, que si incluye la versión impresa.<br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com0tag:blogger.com,1999:blog-32385302.post-66056484875403029742008-10-20T03:42:00.000-07:002008-10-20T03:50:50.473-07:00Insertando la salida de un comando de shell en un buffer de Emacs<div style="text-align: justify;">Hace un rato que estaba buscando una forma de insertar la salida de un comando de shell en un buffer de Emacs, sin necesidad de copiar y pegar (así fuera entre buffers, lo cual me parece muy tedioso). Pues bien, encontré en el comp.emacs de USENET, una solución muy adecuada, simplemente agregando las siguientes líneas en el .emacs:<br /><br />------<br /><br />(defun my-shell-command-on-region nil<br />"Replace region with ``shell-command-on-region''.<br />By default, this will make mark active if it is not and then prompt<br />you for a shell command to run and replaces region with the results.<br />This is handy for doing things like getting external program locations<br />in scripts and running grep and whatnot on a region."<br />(interactive)<br />(save-excursion<br />(if (equal mark-active nil)<br />(push-mark nil nil -1))<br />(setq string<br />(read-from-minibuffer "Shell command on region: " nil nil nil<br />'shell-command-history))<br />(shell-command-on-region (region-beginning) (region-end) string -1)<br />; Get rid of final newline cause I normally did by hand anyway.<br />(delete-char -1)))<br /><br />;;------------------------------------------------------------------------<br />(defun insert-output-from-shell-command (commandstr)<br />"Insert output from a shell command at point"<br />(interactive "*sInsert From Command:")<br />(shell-command commandstr 1))<br /><br />(global-set-key "\M-oi" 'insert-output-from-shell-command)<br />(global-set-key "\M-or" 'my-shell-command-on-region)<br /><br />----<br /><br />Bien, ahora con sólo Esc-oi, escribo el comando a ejecutar y la salida se inserta en el punto en donde se encuentra el cursor. Bastante útil !.<br /><br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com0tag:blogger.com,1999:blog-32385302.post-65268772586526284472008-09-16T21:44:00.000-07:002008-09-16T22:59:50.735-07:00Maxima 5.16.3 on OpenSolaris 2008.05/x86<div style="text-align: justify;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvR6Bsq54mrZAqFYjSz51-uwUKtJhtVIZQXx9vcobg13rDozPVJLO-1v4GXIzJ81RXnGGb7SA3rxhp8jS8rbKatMZR4_ZFGE8MlRF46QXY79hThX5YuC3GDhJTseJYxwueUvvgzg/s1600-h/opensolaris_and_maxima.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvR6Bsq54mrZAqFYjSz51-uwUKtJhtVIZQXx9vcobg13rDozPVJLO-1v4GXIzJ81RXnGGb7SA3rxhp8jS8rbKatMZR4_ZFGE8MlRF46QXY79hThX5YuC3GDhJTseJYxwueUvvgzg/s320/opensolaris_and_maxima.png" alt="" id="BLOGGER_PHOTO_ID_5246856582191540802" border="0" /></a>The current stable release of Maxima is 5.16.3, which one works very good in my Linux box (Debian Lenny with GCL and CLisp), the whole test suite (a set of programs to test the Maxima infraestructure) was passed. Across the mailing list, some developers reported the successfully build of this release en several Linux flavors under many Lisp implementations (like GCL and CLisp); in the same way the reports about another UNIX platforms, but the OpenSolaris OS was not included.<br /></div><div style="text-align: justify;"><br />As a new user of this operating system, i started the build of Maxima, with the CLisp 2.39 (i hope to try with others implementations, is a promise !) and the results are:<br /><ul><li>The installation of CLisp was perform across Blastwave Software Stack (http://www.blastwave.org/packages.php)[1], like other packages as GnuPlot.</li><li>The OpenSolaris's make implementation don't work with the Makefile generated with the configure script (make: Fatal error in reader: Makefile, line 659: Unexpected end of line seen); instead i used the GNU Make (gmake package).</li><li>The only test failed was rtest14.mac (errors 231, 232 and 242 - test_bessel).<br /></li><li>At the moment to run make install, the share and contrib packages were not installed successfully, to solve the problem of loading packages, copy files at the MAXIMA_INSTALL_DIRECTORY (usually /usr/local/share/maxima/$maxima_version) in the share folder:<br /></li></ul><span style="font-style: italic;">cp -r $MAXIMA_COMPILE_DIR/share/* $MAXIMA_INSTALL_DIR/share</span><br /><br />And now enjoy Maxima on OpenSolaris !.<br /><br /><span style="font-weight: bold;">Update:</span><br /><br />With SBCL 1.0.7 the test suite works fine. No problems and errors.<br /><br />---<br /><br />[1] Good repository of Free/OpenSource Software for Solaris 10<br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com0tag:blogger.com,1999:blog-32385302.post-5642241841195899422008-09-13T22:55:00.000-07:002008-09-14T01:46:11.305-07:00Migrando hacia Software Libre (I)<div style="text-align: justify;">La migración hacia Software Libre es un tema bastante interesante, aunque bastante espinoso, en gran parte por las exigencias respecto a cambio en la cultura de los usuarios y al nuevo mundo al que se enfrentan. Mucho se ha escrito acerca de los procesos de migración, de lo que representa y que en la mayoría de los casos resulta más costoso, en términos de dinero y tiempo, que el uso de software privativo, claro está en las primeras etapas de la migración. Una de las principales motivaciones en las organizaciones que quieren dar el salto a las tecnologías libres, es el ahorro, y no es para menos. Sin embargo, desde mi punto de vista, es un enfoque poco profundo, superficial sobre lo que verdaderamente el Software Libre significa, sin caer en los extremos filosóficos casi fundamentalistas; pienso que una de las grandes motivaciones para emprender una transición en esa dirección es la apropiación tecnológica y la reinversión en talento nacional o local, pues el hecho de manipular, desarrollar y controlar (y ser parte de una cadena de valor) la tecnología de la cual hago uso, es un importante activo para la organización. Desde luego, que el conocer cómo funciona la tecnología y lograr adaptarla a mis necesidades tiene unos costos de inversión asociados en tiempo, dinero e infraestructura, eso es claro, y es algo que se debe tener en cuenta y decir de frente, sin tapujos; pues en ocasiones proyectos de migración son "vendidos" bajo la promesa de costo cero, lo cual es falso.<br /><br />Hace unos meses la revista <a href="http://www.aclibre.org/essentia-libre/essentia-libre-9/">Essentia Libre en su número 9</a> publicó un especial acerca de migraciones, en el cual se documentan algunos casos de éxito y recomendaciones especiales de personas que han intervenido en procesos de migración, sobre todo en instituciones de educación. Algunas cosas que me llamaron la atención y que reproduzco:<br /><br /><ul><li>" .... <span style="font-style: italic;">Migrar a Software Libre es más que la decisión de los directivos de una organización, es tener la posibilidad de aprender más y ser más limpio en las acciones ... </span>". Igor Támara</li><li>"<span style="font-style: italic;">Contar con un líder que posea los conocimientos adecuados y asesore el proceso</span>". Reinaldo Duque</li><li><span style="font-style: italic;">" ... ninguno conoce mejor los problemas de la empresa y su solución como ella misma ... "</span>. Fredy Rivera Bermúdez<br /></li></ul>Son conclusiones de enorme importancia, de personas que han estado involucradas en procesos de migración reales y exitosos. Hace algunos meses estuve dentro del equipo de trabajo para la migración de una empresa de comunicaciones; y aunque la meta principal no se logró (migración de las estaciones de escritorio) por lo menos hasta donde tengo datos, creo que se debió a un aspecto sumamente importante: falta de apoyo de las directivas y creo que en eso coincidimos muchos al resaltar el hecho que un proceso de migración debe estar apoyado de la cabeza mayor en la organización y de ahi para abajo por cada integrante de la misma. <br /><br />Para finalizar esta entrada, recomiendo la lectura del siguiente documento, orientado a los profesionales en IT:<br /><br /><a href="http://www.csi.map.es/csi/pdf/Directrices_IDA_OSS_ESv1_r.pdf">http://www.csi.map.es/csi/pdf/Directrices_IDA_OSS_ESv1_r.pdf</a><br /><br />y algo aún más importante: la migración a software libre, más que un cambio tecnológico, es una cambio de cultura.<br /><br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com2tag:blogger.com,1999:blog-32385302.post-39684077424901777352008-09-06T13:32:00.000-07:002008-09-06T14:43:46.123-07:00Welcome OpenSolaris<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhiR8S2tdSLXaq6Xlpuk0UACf5xG-WXoglRcn5UCYH-b5XrBs4O9G-3rLCR8KHq5SdnoFqDw3gfGD7oNsSo18S16Imygcy4wUYQUu6IqWh8R_H-NTQYXGvP8EbiuHb6m46MUPV_A/s1600-h/os_fan_button_blk_small.gif"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhiR8S2tdSLXaq6Xlpuk0UACf5xG-WXoglRcn5UCYH-b5XrBs4O9G-3rLCR8KHq5SdnoFqDw3gfGD7oNsSo18S16Imygcy4wUYQUu6IqWh8R_H-NTQYXGvP8EbiuHb6m46MUPV_A/s320/os_fan_button_blk_small.gif" alt="" id="BLOGGER_PHOTO_ID_5243023756297281266" border="0" /></a><br /><div style="text-align: justify;">Few months ago, i was using OpenSolaris in a virtual way (across VirtualBox in my Linux box) but the performace is very poor (i' ve got 512 MB in RAM, but i think to upgrade my system !). After some experiments wit Solaris 10 (the installer is more ligth than OpenSolaris) i' ve decided to install OpenSolaris 2008.05 (Indiana) directly in the hard disk. The summary of process:<br /><br /><li>The autodetection of video card and monitor failed, but with the xorgconfig command (i remember my times with Debian Potato !), i fixed it.<br /></li><li>The sound and network card works fine.<br /></li><li>The installer is very easy, although is some slow. (The installation process take about 2 hours.)</li><br />In the boot process, this bug make presence:<br /><br /><pre>kcf: [ID 415456 kern.warning] WARNING: No randomness provider enabled for<br />/dev/random. Use cryptoadm(1M) to enable a provider.</pre><br />I found some information about this bug in:<br /><br />http://defect.opensolaris.org/bz/show_bug.cgi?id=38<br /><br />Using the svcadm command, i get to enable the gdm service. In the same way, at the moment of power off the system, the call of shutdown command show other bug related with the RPC service, but in this URL, found the solution:<br /><br />http://bugs.opensolaris.org/view_bug.do;jsessionid=ba830143933ebf052d8caaab3d?bug_id=6531164<br /><br />TODO List:<br /><br /><ul><li>Testing the Maxima stable release. (5.16)</li><li>Using DTrace to test and trace some programs.<br /></li><li>Verify the compatibility with the ext2/3 file systems.<br /></li><li>Testing the Java performance.<br /></li></ul><br />My GRUB:<br /><br />Debian GNU/Linux 2.6.18<br />OpenSolaris 2008.05<br />FreeBSD 7.0 (must be repair ..:()<br /><br />Well, that's all folks !<br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com0tag:blogger.com,1999:blog-32385302.post-37849316702056923562008-08-11T22:20:00.000-07:002008-08-11T23:26:28.075-07:00Conexiones con PostgreSQL<div style="text-align: justify;">PostgreSQL, es un sistema gestor de base de datos muy robusto y de hecho una muy buena alternativa a sistemas como Oracle. De hecho, hoy al final del día me llamaron para revisar algunas fallas en la conexión a una base de datos que estaba ejecutándose en PostgreSQL (bajo RHEL) desde una aplicación cliente que se ejecutaba en windows. Pues bien, supuse que había algún error en los parámetros de configuración e hice todas las pruebas del caso, y aún el problema persistía. Revisé cuidadosamente los archivos de configuración que controlan las conexiones en PostgreSQL (pg_hba.conf y postgresql.conf) y todo estaba en su sitio, no entendía cuál era la naturaleza del error. En fin, revisé las reglas del firewall, y en efecto, el tráfico por el puerto 5432 no estaba habilitado: sencillo, modifique las reglas y reinicié el servicio, problema resuelto ...., pensé yo, pero nada de eso, lo mejor estaba por venir.<br /><br />Resulta que la aplicación cliente, estaba compuesta de dos elementos: un primero programa que se conectaba y creaba una especie de instancia de la conexión y otro que haciendo uso de esa instanacia se comunicaba con la base de datos; pues bien el primer programa no lograba conectarse, a pesar de otra aplicación (llamada pgexplorer, primera vez que la ví) si lograba establecer la conexión. Después de mucho probar y revisar, me dí cuenta que el problema radicaba en la versión de PostgreSQL para la que fué escrita dicha aplicación, dado que había un servidor windows en el cual estaba instalado PostgreSQL versión 8.0, al cual se conectaba sin problema alguno, mientras que en el RHEL estaba funcionando inicialmente PostgreSQL 8.1 y después usé la versión 8.3, sin éxito; claro está, que los logs fueron de mucha ayuda, previa configuración de las opciones para logging en el archivo postgresql.conf y usando a syslog. Después de instalar la versión 8.0.17 de PostgreSQL, la aplicación se conectó sin ningún problema y se logró generar el tan anhelado mensaje de:<br /><br />"Connection success !"<br /><br />No entiendo el porqué los problemas de conexión con las versiones posteriores a la 8.0.x, después investigaré, si hubo algún cambio significativo.<br /><br />Aunque, pareciera que ahí paro todo, aún faltaba un problema por resolver: existían incovenientes de codificación que impedian el correcto funcionamiento; cómo lo solucioné ? Sencillo, después de todo:<br /><br />Al momento de la creación de la base de datos, se debe especificar la codificación de la misma, con la opción -E:<br /><br /># createdb -U postgres -T template0 -E LATIN1 ....<br /><br />Posteriormente, al momento de cargar el script sql o de usar el cliente en línea de comandos, especificar la misma codificación, bien sea con:<br /><br /># set encoding = "LATIN1" o desde plsql:<br /><br />\encoding LATIN1<br /><br />y problema resuelto. Aunque me queda la duda, si SELinux, tenga relación con los problemas de conexión.<br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com1tag:blogger.com,1999:blog-32385302.post-40432934840121826332008-07-20T21:35:00.000-07:002008-07-20T22:29:12.669-07:00Tropical Programming<div style="text-align: justify;">Como dice <a href="http://www.catb.org/%7Eesr/">Eric Raymond</a> en <a href="http://www.youtube.com/watch?v=1RtWkywPJ5I&feature=related">Código Linux</a>: " <span style="font-style: italic;">... un hacker es una persona que practica la programación informática como una especie de pasión artística ..</span>" y aunque no me considero un <a href="http://es.wikipedia.org/wiki/Hacker">hacker</a>, cada día trato de buscar formas de mejorar mis técnicas a la hora de desarrollar software apelando en gran parte a la música. Hasta hace poco, al momento de sentarme a programar lo hacía acompañado de música <a href="http://es.wikipedia.org/wiki/M%C3%BAsica_rock">Rock</a> (antes escuchaba algo de música clásica y <a href="http://es.wikipedia.org/wiki/New_age">new age</a>) sobre todo al momento del desarrollo de aplicaciones web; de hecho en el último proyecto en el que estuve trabajando, escuchaba una emisora sugerida por mi amigo Carlos, en donde pasaban buenas tandas de hard rock. Sin embargo, de un tiempo para acá, y debido a mi gusto por la música tropical (salsa, merengue, charanga y similares) he optado por programar a ritmo de sones <a href="http://es.wikipedia.org/wiki/Salsa_%28g%C3%A9nero_musical%29">afro-cubanos</a>, que han hecho mucho más divertida la experiencia. No puedo decir que han incrementado mi productividad ni que me han hecho escribir más líneas de código por hora, pero sí he logrado disfrutar más la tarea de programar y sobre todo, escribir código más limpio. A esto lo he llamado Tropical Programming, y aunque el nombre sugiere alguna metodología de desarrollo, simplemente es una forma de darle un poco de diversión al momento de desarrollar software; aunque no niego que por ratos me da ganas de pararme e irme a bailar, pero me aguanto.<br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com1tag:blogger.com,1999:blog-32385302.post-85559472164302357752008-06-18T21:18:00.000-07:002008-12-11T01:16:28.570-08:00Framework o CMS ?<div style="text-align: justify;">El desarrollo de aplicaciones web (y muchas veces software standalone) conlleva frecuentemente a diseñar y escribir componentes de software que se usan regularmente. Muchas aplicaciones requieren de autenticación de usuarios, permisos, registro, diseño, etc., y es muy engorroso tener que escribir código para soportar cada una de estas funcionalidades en cada desarrollo realizado. Los frameworks (por ejemplo Symphony) reducen mucho el trabajo en este sentido, pero en muchas ocasiones no lo suficiente para hacer un desarrollo de manera sencilla y rápida.<br /><br />Hace poco, realicé una pequeña aplicación (aunque al final quedó incompleta (que lo diga Erwin y Pachito)) y dentro de los requerimientos del cliente figuraba el manejo de roles de usuario y permisos para el acceso a distintas partes del aplicativo. Desde luego se habían planteado muchas otras funcionalidades, pero menciono ésta, debido a que me permitió empezar a mirar hacia el lado de los <a href="http://es.wikipedia.org/wiki/CMS">CMS's</a> y terminar por inciinarme por uno de ellos, como mi plataforma de desarrollo.<br /><br />Tengo algo de experiencia en el desarrollo de aplicaciones con varios CMS, como <a href="http://www.esxoops.com/">Xoops</a> y PHPWebsite y por ello me incliné finalmente por escoger un CMS en vez de un Framework para iniciar el desarrollo de la aplicación. La principal razón (aunque reconozco que está muy ligada al caso de estudio) es que el CMS, me provee una infraestructura de autenticación, autorización y de permisos muy buena y sencilla de implementar (aunque eso depende del CMS), lo cual me ahorró bastante tiempo de diseño y desarrollo. Después de revisar varias opciones y dado que necesitaba que el CMS tuviera soporte para base de datos PostgreSQL, me inciiné finalmente por <a href="http://www.drupal.org/">Drupal</a>.<br /><br /><span style="font-weight: bold;">Por qué Drupal ?</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnIkWLYKOuiZG9g9bynxOv3XVrLUazVIhUABemz_ulInu2lCg_vqrEPI_CJ1qE6iz4ZlfIk1-QkSPVBE-KrwuILrWYvnpgfvV21kxFbklqiSUd13W_Gfs29-Ls2UsbejgtUALcZw/s1600-h/logo.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnIkWLYKOuiZG9g9bynxOv3XVrLUazVIhUABemz_ulInu2lCg_vqrEPI_CJ1qE6iz4ZlfIk1-QkSPVBE-KrwuILrWYvnpgfvV21kxFbklqiSUd13W_Gfs29-Ls2UsbejgtUALcZw/s320/logo.png" alt="" id="BLOGGER_PHOTO_ID_5213454204192840354" border="0" /></a><br />Las razones son sencillas:<br /><br /><ul><li>Una gran <a href="http://api.drupal.org/">API</a> y bien documentada</li><li>Infraestructura de autenticación y permisos sencilla de implementar.<br /></li><li>Desarrollo activo</li><li>Bastantes módulos disponibles y temas</li><li>Código claro</li><li>Capa de abstracción de bases de datos muy sencilla.<br /></li></ul>Entre otras razones. Mientras con el Framework, debía preocuparme por construir los componentes para manejo de permisos y sesiones de usuario, con Drupal, simplemente definó los niveles de acceso y listo, un par de clicks y ya estuvo. Mediante un método sencillo:<br /><br /><span style="font-family:courier new;"><span style="color: rgb(255, 153, 255);">function</span> <span style="color: rgb(51, 51, 255);">modulo_perm</span>() {</span><br /><br /><span style="font-family:courier new;"> <span style="color: rgb(255, 153, 255);">return</span> array('reglas de acceso');</span><br /><br /><span style="font-family:courier new;">}</span><br /><br />Y la creación de roles, fué aún más sencillo. A través del panel de administración de usuarios, su definición es muy sencilla. En resumen:<br /><br />Tiempo de implementación en CMS: 1 horas<br />Tiempor con el Framework: 5 Horas (aprox.)<br /><br />Desde luego, que mediante un framework se puede hacer reutilización de muchos componentes, pero por lo menos Drupal, la funcionalidad que ofrece el API es enorme.<br /><br />En conclusión, para próximos desarrollos pienso utilizar Drupal; de hecho ahora construyo un módulo para manejo de conferencias y sencillamente ha sido muy fácil. Como punto adicional, con un CMS, el manejo de presentación se controla mediante themes, fácilmente personalizables y que puede modificar hasta un desarrollador.<br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com0tag:blogger.com,1999:blog-32385302.post-72737013632298135712008-06-01T21:57:00.000-07:002008-06-01T22:56:12.756-07:00La primera vez<div style="text-align: justify;">Algunos nos quejamos por que la primera vez que hacemos algo, no siempre resulta exitososo del todo, salvo algunas excepciones. Muchos tuvimos cantidad de problemas instalando nuestro sistema operativo por primera vez o configurando un dispositivo .Recuerdo que cuando instalé<a href="http://www.debian.org/"> Debian</a>, aún cuando leí la guía de instalación como 20 veces, no me fué posible configurar correctamente el sistema X-Window; después como era de esperarse pude hacerlo sin inconvenientes. He oído de casi todos los usuarios de Linux que conozco, que la primera vez que compilan el kernel, nunca queda bien realizado el proceso. Siempre existe algún componente que se olvida activar o simplemente se ovbia algunos de los pasos para generar la imagen final. En fin puedo seguir mencionando muchas otras situaciones, en las cuales la primera vez, por lo regular siempre fallamos. Y aunque es frustrante, es algo natural, no sólo en cuestiones de índole informático, ni más falataba. Veamos típicas situaciones:<br /></div><div style="text-align: justify;"><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.fortunewatch.com/wp-content/uploads/2007/09/etf_mistakes.gif"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://www.fortunewatch.com/wp-content/uploads/2007/09/etf_mistakes.gif" alt="" border="0" /></a><br />A quién no se le ha quemado la carne o el arroz, o cualquier otra comida, la primera vez que intentó cocinar ? Creo que eso es algo que nos ha pasado a todos (sobre todo los hombres, sin ánimo de ofender ni ser sexista). O aún mejor, quién a tenido éxito con su primera novia o novio ? . Las primeras veces, siempre cometemos algún error o no sabemos cómo manejar ciertas situaciones.<br />Y es precisamente, esa primera vez la que nos proporciona experiencia y nos permite fortalecer muchos aspectos de nuestra vida. En particular, como usuario de Software Libre, la primera vez el choque es muy fuerte, pero después la cuestión se vuelve tan emocionante, que uno dice: <span style="font-style: italic; font-weight: bold;">Valió la pena el golpe !.</span> Puede que esta no sea la experiencia de algunos, pero por lo que sé, es lo que la gran mayoría manifiesta.<br /><br />Esto que escribo aquí no es algo nuevo, más sin embargo lo escribo, porque desde algún tiempo estaba inmerso en una rutina que no me permitía ir más allá. Sin embargo, ahora me enfrento a nuevas cosas, a nuevas experiencias, en las que no quiero fracasar, aunque pueda cometer errores, espero aprovecharlos mejor y por qué no reiniciar procesos que quedaron olvidados. La experiencia es la clave, escuché alguna vez; sin embargo creo que más que la experiencia, es saber aprovechar las oportunidades y los errores. Bien dice el dicho: <span style="font-style: italic;">"El inteligente aprende de sus errores, el sabio aprende de los errores de los demás". </span><br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com4tag:blogger.com,1999:blog-32385302.post-22926040588972934002008-05-23T16:15:00.000-07:002008-05-23T16:23:25.405-07:00Ubuntu Family<div style="text-align: justify;">Via <a href="http://www.linuxjournal.com/">LinuxJournal</a>, encontré este interesante y divertido video acerca de las diferencias entre los integrantes de la familia Ubuntu:<br /><center><a href="http://www.linuxjournal.com/video/buntu-family-theater"><br /><img src="http://www.linuxjournal.com/images/video/buntu.jpg" /></a><br /></center><br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com0tag:blogger.com,1999:blog-32385302.post-6902702201208993602008-05-15T21:29:00.000-07:002008-05-15T22:21:56.122-07:00Los computadores de Reyes<div style="text-align: justify;">El 15 de Mayo fué entregado por parte de la interpol un informe, acerca de la información que contenían los computadores de Raúl Reyes. Independientemente de los resultados que se emitieron, me generó curiosidad pensar si en vez de haber encontrado documentos en ms word(R), se hubiera encontrado documentos en OpenOffice y que en vez de que dichos computadores tuvieran windows(R), hubiesen tenido alguna versión de Linux. Quizá, esto hubiera servido como argumento en contra del Software Libre por parte de opositores, tal vez diciendo que éste sirve para labores terroristas y para ayudar a fuerzas insurgentes a comunicarse, qué se yo. Es sólo producto de mi imaginación (y la de mi hermana) que me llevaron a pensar un escenario de este estilo. </div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com2tag:blogger.com,1999:blog-32385302.post-51025180056573230492008-03-24T18:14:00.000-07:002008-03-25T03:04:47.638-07:00Famosos del Software Libre<div style="text-align: justify;">La siguiente entrada es motivada por un correo que llegó a la lista de correo de nmap-hackers el día de hoy, anunciando el release de la versión 4.60 de Nmap. Me llamó la atención, que en la página web del proyecto se creara una sección, en la cual <a href="http://nmap.org/movies.html">se muestra el uso de Nmap en varias películas</a>. Por ejemplo, quien no se acuerda de la escena en que <a href="http://en.wikipedia.org/wiki/Sshnuke">Trinity se aprovecha de un bug de SSH</a> y logra entrar en una computadora con priveligios de root ? Desde luego, que en dicha escena se hace uso de nmap, en forma previa. Otra películas en las que aparece el famoso Nmap es <a href="http://en.wikipedia.org/wiki/Bourne_ultimatum">Bourne Ultimatum</a>. En esta película, se hace un uso más intenso de nmap y su nueva interfaz <a href="http://nmap.org/zenmap/">ZenMap.</a> También aparece en escena el servidor de correo Postfix y el famoso protocolo SSH. <br /><br />Claro está, que al espectador promedio este tipo de apariciones no tengan importancia alguna, pero a mi me generan algo de emoción. De hecho recuerdo la película: <a href="http://en.wikipedia.org/wiki/The_Score_%28film%29">The Score</a>, en donde Edward Norton entra en un shell con Linux 2.0.8 (no recuerdo muy bien la versión) y ejecuta como una especie de ataque de diccionario. <br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com1tag:blogger.com,1999:blog-32385302.post-45734306659018081722008-03-20T23:33:00.000-07:002008-03-21T00:48:13.966-07:00La virtualización no es el camino, por ahora<div style="text-align: justify;">Llevo dos días tratando de poner a punto un sistema de virtualización sobre Debian, pero llego el momento de rendirme, debido a que hasta el momento en ninguno de los programas que he usado (o intentado usar), he podido virtualizar ningún sistema operativo de forma exitosa. Empezaré por describir la situación, haber si alguien puede darme luces:<br /><br />Hasta hace unos días usaba la versión 2.6.17.7 de Linux, sin ningún problema. Había estado usando qemu como mi sistema de virtualización, pero estaba un poco descepcionado respecto al desempeño del mismo, pues el consumo de recursos era bastante grande. De hecho las primeras pruebas (realizadas con <a href="http://www.minix3.org/">Minix</a>, Fedora y Windows XP) no fueron muy alentadoras. Y finalmente dejé de usarlo, pues bajo la versión de kernel mencionada arriba, no fué posible cargar el módulo kqemu y no pude probar las bondades de dicho acelerador, Intente después con VirtualBox, pero la instalación me arrojó varios errores y el módulo vboxdrv tampoco lo pude cargar, con dicha versión del kernel.<br /><br />Hace unos días, probé el VMWare server, pues lo había visto ejecutándose en la empresa en donde trabajo y me pareció que tenía un buen desempeño, en máquinas muy similares a la mía. Sin embargo, cuando lo instalé, el consumo de recursos fué excesivo, de hecho no pude trabajar en otras aplicaciones mientras estaba instalando Solaris en la máquina virtual. Todo esto me puso de mal humor y a pensar que posiblemente recompilando una versión más reciente del kernel podía utilizar <a href="http://fabrice.bellard.free.fr/qemu/kqemu-doc.html">kqemu</a> y <a href="http://www.virtualbox.org/">VirtualBox</a>. Decidí finalmente compilar la última versión estable (<a href="http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.24.3.bz2">2.6.24.3</a>), lo cual me permitió hacer algunos ajustes y realmente después de la compilación, algunos problemas que tenía se solucionaron. Una vez cargado el nuevo kernel, pude utilizar kqemu, pero el desempeño no fué notable, de hecho no observé ninguna diferencia notable entre usar qemu a secas y kqemu.<br /><br />Proseguí a instalar VirtualBox, lo cuál fué muy sencillo, pero hasta el momento no he logrado arrancar la máquina virtual, pues obtengo el siguiente error:<br /><br />==================================================<br /><br />Assertion failed: [mIPCSem >= 0] at '/home/vbox/vbox-1.5.6/src/VBox/Main/MachineImpl.cpp' (8058) in nsresult SessionMachine::init(Machine*).<br />Cannot create IPC semaphore, errno=38.<br />Please contact the product vendor!.<br /><br /><br />===================================================<br /><br />Y tras hacer una búsqueda exhaustiva en internet (más de 6 horas seguidas) lo único que encontré fué <a href="http://www.virtualbox.org/ticket/1348">el reporte del bug</a>, que aún no se ha solucionado. En la FAQ de VirtualBox, comentan que el programa no trabaja con kernels que tengan activado el <a href="http://kerneltrap.org/node/6750">tickless timer support</a> (CONFIG_NO_HZ en el .config), cosa que activé en mi kernel. Seguí las instrucciones de desactivación y cargue del módulo, pero tampoco, el error emergió de nuevo y la solución cada vez es más confusa. Por el momento, compraré otro disco duro e instalaré nativamente el sistema que necesite, mientras termino de compilar el VirtualBox, haber si de alguna forma lo hago funcionar.<br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com2tag:blogger.com,1999:blog-32385302.post-52986087664075043722008-03-11T11:28:00.000-07:002008-03-11T13:32:54.284-07:00Problemas de semántica<div style="text-align: justify;">Las últimas semanas han estado un poco agitadas, en lo que tiene que ver al clima político en Colombia. Sin embargo, observando con más detenimiento la situación, desde mi punto de vista, el problema de la violación de la soberania ecuatoriana por parte del ejercito colombiano y todas las situaciones derivadas de dicho incoveniente, se deben básicamente a problemas de semántica. Veamos la cuestión con más detalle:<br /><br />Uno de los detonantes para la crisis, fué la intervención del presidente Hugo Chávez, diciendo que Venezuela iba ser atacada por Colombia en cualquier momento y dando órdenes del envío de batallones a la frontera. [<a href="http://youtube.com/watch?v=tyP5BLsnNvg">Ver video</a>]. No encuentro lógica alguna a las declaraciones del presidente, pues quién en realidad debió instaurar enérgica protesta contra Colombia era el presidente de Ecuador (después lo hizo, vea pues). En medio de todos los hechos, se observa un gran problema de semántica, en donde el directamente afectado por la situación no toma la actitud del caso, sino que un tercero es quien se queja y además protesta a través de declaraciones fuera de contexto. Un típico problema de semántica y de mala interpretación de la comunicación.<br /><br />Bueno, pero eso sí hay que dejar claro un punto: qué podemos esperar de alguien que habla de que la <a href="http://youtube.com/watch?v=N5ojuHEsNs8">humanidad lleva 25 siglos ?<br /></a><br />Lo grave aquí no es el problema de significado; lo realmente grave es que casi se arma una guerra por semejante confusión.<br /><br />Dejando de lado la política, en la vida cotidiana, los problemas e incovenientes que se presentan a diario se deben en muchos casos a malas interpretaciones y confusiones. Sin ir más lejos, y haciendo alusión al título de este blog, cuando se emprende un proyecto de Software Libre, a menudo es complicado que el equipo de desarrollo se ponga de acuerdo respecto a cuestiones como los estándares de codificación o la manera en que deben nombrarse las clases o constantes. En ocasiones, se ven fragmentos de código como:<br /><br /><span style="font-style: italic;font-family:courier new;font-size:100%;" >constante1 = 2;<br />constante2 = 4;<br />calcular(constante1, constante2);</span><br /><br />En donde, los nombres de las variables y del método no dicen para nada cuál es su significado. Algo más claro sería:<br /><br /><br /><span style="font-style: italic;">pendiente = 2;</span><br /><span style="font-style: italic;">punto_corte_y = 4;</span><br /><span style="font-style: italic;">generar_ecuacion_recta(pendiente, punto_corte_y);</span><br /><br />Aqui una persona sepa matemáticas básicas puede deducir fácilmente que significa ese segmento de código. Así mismo existen muchos más ejemplos, no sólo en programación, también en música, en disposición de espacios, señalización e inclusive en cuestiones tan simples como las conversaciones que a diario sostenemos.<br /><br />Para finalizar una situación cómica respecto a esto del significado: (tomado de: <a href="http://nilxon.googlepages.com/14dejulio2">http://nilxon.googlepages.com/14dejulio2</a>)<br /><br /> <p><b style=""><span style=";font-family:";color:gray;" lang="ES">Una pareja de Minneapolis</span></b><span style=";font-family:";color:gray;" lang="ES"> decidieron ir a Florida para huir de un crudo invierno. Planearon quedarse en el mismo hotel donde pasaron su luna de miel.<span style=""> </span>Debido a que fue muy difícil coordinar su itinerario, el esposo viajó a Florida el jueves y su esposa llegaría al día siguiente.<span style=""> </span>El esposo se registró en el hotel. Había una computadora en su habitación, así que decidió enviar un e-mail a su esposa.<span style=""> </span>Sin embargo,<span style=""> </span>accidentalmente omitió una letra en la dirección de e-mail y sin darse cuenta de su error</span><span style=";font-family:";color:gray;" lang="ES"> envió el mensaje.</span><br /></p><div style="text-align: justify;"><span style=";font-family:";color:gray;" lang="ES">Mientras tanto, en algún lugar de Houston, una viuda acababa de llegar del </span><span style=";font-family:";color:gray;" lang="ES">funeral de su esposo.<span style=""> </span>El fue un reverendo por muchos años quien fue llamado</span><span style=";font-family:";color:gray;" lang="ES"> a la gloria después de un repentino ataque cardíaco.<span style=""> </span>La viuda decidió </span><span style=";font-family:";color:gray;" lang="ES">revisar su e-mail, esperando mensajes de sus familiares y amigos. </span><span style=";font-family:";color:gray;" lang="ES">Después de leer el primer mensaje se desmayó.<span style=""> </span>El hijo de la viuda corrió a </span><span style=";font-family:";color:gray;" lang="ES">la habitación, encontró a su madre en el piso y vio la pantalla de la </span><span style=";font-family:";color:gray;" lang="ES">computadora que decía:<o:p></o:p></span></div> <span style=";font-family:";color:gray;" lang="ES"><o:p></o:p></span><br /><p><i style=""><span style=";font-family:";color:gray;" lang="ES">Para</span></i><span style=";font-family:";color:gray;" lang="ES">: Mi amada esposa.<o:p></o:p></span></p> <p><i style=""><span style=";font-family:";color:gray;" lang="ES">Asunto</span></i><span style=";font-family:";color:gray;" lang="ES">: He llegado.<o:p></o:p></span></p> <p><i style=""><span style=";font-family:";color:gray;" lang="ES">Fecha</span></i><span style=";font-family:";color:gray;" lang="ES">: Julio 10, 2004<o:p></o:p></span></p> <p><span style=";font-family:";color:gray;" lang="ES"><o:p> </o:p><br /></span></p><div style="text-align: justify;"><span style=";font-family:";color:gray;" lang="ES">Sé que estás sorprendida de oír de mí.<span style=""> </span>Ahora hay computadoras aquí y te </span><span style=";font-family:";color:gray;" lang="PT-BR">permiten enviar e-mails a tus seres queridos. </span><span style=";font-family:";color:gray;" lang="ES">Acabo de llegar y ya me </span><span style=";font-family:";color:gray;" lang="ES">he registrado. Veo que todo está preparado para tu llegada mañana. Espero </span><span style=";font-family:";color:gray;" lang="ES">verte cuando llegues. Espero que tu viaje sea sin problemas tal como fue el </span><span style=";font-family:";color:gray;" lang="ES">mío.<br /><br /><o:p></o:p></span></div> <i style=""><span style=";font-family:";color:gray;" lang="ES">P.D. De verdad que está caliente acá abajo.</span></i><br /></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com1tag:blogger.com,1999:blog-32385302.post-55080207335901899882007-12-01T04:34:00.000-08:002008-12-11T01:16:28.798-08:00VI Semana Linux Universidad Distrital<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMoAzvTWflO1aW5S_FkRLO45ZPYSp_eiWH5i_ujc1vP9aq2OsfLtv9yvSiu4iqc9wMz_Sy82uUTxU9ijXcB-S9QGUWxiGp6U2VR4HdVLSIN4y9SarLW8Bu92yDalZRvB24JK6Rvw/s1600-r/sludvi-400.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHtqt5mmrFX6vS4olEsoQTyrPb3FvnO4Nyzn1r3VlQMKQPXI_0WYqKSGevhqEB-C0WHR7UQGljcvfk4mg8-w2Nn2CHpB0DUJcIU-6Ik1rzlP2DMX_SbY9II6-F4XoJi_c0RoJZ3Q/s320/sludvi-400.png" alt="" id="BLOGGER_PHOTO_ID_5138982139937236850" border="0" /></a><br /><div style="text-align: justify;">Del 3 al 7 de Diciembre, se realizará la VI Semana Linux Universidad Distrital, uno de los eventos con mayor tradición en la Comunidad de Software Libre Colombiana. Toda la información del evento la pueden encontrar en:<br /><br /><div style="text-align: center;"><a href="http://glud.udistrital.edu.co/slud6">http://glud.udistrital.edu.co/slud6</a><br /><br /><div style="text-align: justify;">Nos vemos en SLUD VI !<br /></div></div></div>jpromerobxhttp://www.blogger.com/profile/04743805303617133961noreply@blogger.com0