jueves, 26 de marzo de 2009

Comandos : Pipe Viewer ... ¿Qué está pasando por esta tubería?

A medida que voy conociendo más acerca de los sistemas Unix me van llamando la atención diferentes comandos. Hoy comienzo a examinar el comando pv, pero en lo sucesivo trataré de abordar otros que son de obligatoria referencia para cualquier persona que se proponga dominar y aprovechar al máximo las posibiliades que ofrece la consola del sistema operativo GNU/Linux. Y en todo el proceso iremos viendo ejemplos prácticos, varias veces con videos demostrativos incluídos.

Por su parte, el nombre del comando pv se deriva del acrónimo del término Pipe Viewer. Esta es la herramienta que permite monitorear el progreso del flujo de datos a través de una tubería o pipe. Por tanto, podemos insertarlo entre dos procesos para obtener una indicación visual sobre la velocidad de la transferencia de datos, el tiempo que tarda la misma y el estimado para que concluya. ¿Cómo se usa? Siga leyendo ... Y no lo dude ... simelo pide abordaré la utilización del comando que Ud me sugiera. Si tiene dudas o cualquier sugerencia ... espero sus comentarios. Si está interesado en saber más acerca de este tema, le invito a suscribirse a esta serie ... y si desea estar más informado, también puede suscribirse usando RSS a todas las entradas de este blog ... y más recientemente también puede recibir todos los artículos por correo nuevo.

¿Cómo se usa pv?

El comando ha sido escrito por Andrew Wood, un sysadmin de Unix experimentado. En su sitio oficial podemos conocer algunos detalles de interés. Pero más allá de esta descripción, pasemos a ver algunos ejemplos de su uso, comenzando por lo más simple hasta llegar a los más sofisticados y, por tanto, complejos.

Supongamos que tenemos un fichero (por ejemplo trac.log) que contiene unos cuántos gigabytes. Para aprovechar el espacio de su servidor se decide comprimirlo y archivarlo en un momento dado. Normalmente esto se haría más o menos así ...

$ gzip -c myfile.bin > myfile.bin.gz

Pero como el fichero es inmenso (varios gigabytes), no se tiene referencia acerca de los tiempos que va tomando esta actividad. ¿Terminaremos pronto? ¿Habrá que esperar otros 30 minutos? Utilizando pv se pueden conocer estos detalles. La manera más simple de hacerlo es así ...

$ pv myfile.bin |gzip > myfile.bin.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

En este caso pv actúa como cat, pero además añade una barra de progreso. En este momento en particular podemos ver cómo gzip ha procesado 611MB de datos en 11 segundos. Esto representa el 15% del total a procesar y se estima que el proceso concluya después de otros 59 segundos. En general se pueden intercalar múltiples instancias de pv. Un ejemplo práctico podría ilustrar el uso de pv para tener una idea, en tiempo real, de la tasa apróximada de compresión. Para esto se podría considerar el monitoreo de la lectura y la escritura realizada por el comndo gzip.

$ pv -cN source myfile.bin | gzip | pv -cN gzip > myfile.bin.gz
source:  760MB 0:00:15 [37.4MB/s] [=>     ] 19% ETA 0:01:02
gzip: 34.5MB 0:00:15 [1.74MB/s] [  <=>  ]

En este último caso se ha especificado el parámetro -N para identifica la tubería con un nombre. El parámetro -c asegura que la salida del primer comando pv no interfiera al segundo proceso pv mientras contabiliza los datos de salida. A los efectos de este ejemplo, el fichero trac.log se lee a una velocidad de 37.4MB/s pero gzip va entregando datos solamente a 1.74MB/s. Por tanto la tasa de compresión viene siendo de apróximadamente 37.4/1.74 = 21x! Preste también atención a que pv no muestra cuántos datos quedan por procesar y no estima la duación del proceso, debido a que no tiene la menor idea acerca del tamaño del fichero comprimido. El primer comando sí posee esta información puesto lee directamente desde el fichero.

Otro ejemplo similar sería empaquetar un directorio en un archivo tarball:

$ tar -czf - . | pv > ../myfile.bin.gz
117MB 0:00:55 [2.7MB/s] [>         ]

En este caso pv solo muestra la tasa de transferencia a la salida del comando tar -czf. Realmente esto se podría haber hecho de otra manera más efectiva. Por ejemplo, de esta manera no se sabe cuánto falta por procesar. Para ello se necesita suministrar explícitamente la cantidad de bytes que ocupan el directorio y los ficheros que este contiene. Esto se hace así ...

$ tar -cf - . | pv -s $(du -sb . | awk '{print $1}') | gzip > ../myfile.bin.gz
253MB 0:00:05 [46.7MB/s] [>     ]  1% ETA 0:04:49

Lo que sucede en este caso es que le decimos a tar que cree -c un archivo cnon todos los ficheros en el directorio actual . (recursivamente) y que envíe los resultados hacia la salida estándar -f -. Luego le especificamos a pv el tamaño -s de todos los ficheros en el directorio. Para esto nos auxiliamos del comando intermedio du -sb . | awk ’{print $1}’, y así se logra que dicho número de bytes sea suministrado en el parámetro-s. Luego se procede como ya habíamos visto antes. De esta forma pv es capaz de determinar cuánto falta y muestra que la ejecución tardará apróximadamente unos 4 minutos y 49 segundos hasta terminar.

Otro caso muy útil es la combinación de pv con nc (de la cual se hablará un poco próximamente ;) para copiar grandes cantidades de datos a través de una red local. Para ilustrar este caso supongamos que tenemos dos computadoras A y B. Se desea copiar un directorio desde A hacia B lo más rápido posible. El modo más eficiencia resulta ser sin dudas el uso combinado de tar y nc ... y pv estará ahí para monitorearlo todo ... :)

# en la computadora A, con IP 172.18.1.100
$ tar -cf - /path/to/dir | pv | nc -l -p 6666 -q 5

# en la computadora B
$ nc 172.18.1.100 6666 | pv | tar -xf -

Y esto es todo. Todos los ficheros en el directorio situado en la computadora de orígen A serán copiados hacia el destinatario B, y Ud será testigo de cuán rápido resulta toda la operación. Si desea ver la barra de progreso, se puede recurrir al truco mostrado más arriba pv -s $( ). Ahora, esto solo será efectivo en el caso de la computadora de orígen A.

Y ya para concluir se puede tener una idea de la rapidez con que la PC lee del dispositivo especial /dev/zero:

$ pv /dev/zero > /dev/null
59.7GB 0:00:08 [ 7.5GB/s] [        <=>             ]

Y esto es todo, al menos por ahora, porque no faltará una respuesta en caso de alguna duda. Ud podrá además revelar otros usos interesantes del comando pv ... espero sus comentarios.

¿Cómo se instala pv?

Los usuarios de Debian o sistemas afines (e.g. Ubuntu) lo hacen así:

$ sudo apt-get install pv

En Fedora or distribuciones basadas en Fedora (e.g. CentOS sería algo así:

$ sudo yum install pv

Estando en Slackware, se hace necesario visitar el sitio de pv, descargar el archivo pv-version.tar.gz y luego compilar los fuentes:

$ tar -zxf pv-version.tar.gz
$ cd pv-version
$ ./configure && sudo make install

Los usuarios de Mac harían algo semejante a:

$ sudo port install pv

... mientras que los de OpenSolaris:

$ pfexec pkg install pv

Si utilizamos Cygwin en Windows:

$ ./configure
$ export DESTDIR=/cygdrive/c/cygwin
$ make
$ make install

... y siempre tenemos la opción de leer el manual de pv.

Espero que les haya gustado este artículo; y, como siempre, espero sus comentarios llenos de sugerencias y de propuestas para abordar otros comandos en el futuro. Simelo pide no faltará un espacio para abordar las dudas que hace tanto tiempo le inquietan. Vea los comandos de su preferencia en acción, en vivo y en directo, aquí ... en el blog de Simelo.

miércoles, 11 de marzo de 2009

Clic y al Sur No 3 : Clientes ligeros

En vísperas del comienzo de la XIV Feria y Convención Internacional Informática 2009 la revista Clic y al Sur nos sorprendió con la publicación de su tercer número. La misma se confecciona por un grupo de entusiastas del Software Libre que han decidido voluntariamente emplear un poco de su muy apretado tiempo y escasos recursos para revelarnos de una forma amena y desenfada los más intrincados laberintos del maravilloso mundo del sistema operativo GNU/Linux, y otras tecnologías y estándares abiertos. Y para dar el ejemplo, los editores utilizan Ubuntu Linux, Scribus y GIMP para confeccionarla. Esta vez el plato fuerte son los clientes ligeros, pero tenemos de todo noticias, reflexiones, presentación de sitios web, programación en Python, temas de seguridad, juegos ... en fin, si quiere conocer más le invito a que siga leyendo hasta el final.

Desde la Catedral al Bazar

Después de algún tiempo tomo nuevamente en mis manos uno de los artículos que más han influido en el mundo del software libre, La catedral y el Bazar de Eric S. Raymond. Hoy con un poco más de experiencia, veo claras muchas de las ideas que propulsan el desarrollo del software libre y tomo nuevamente notas, para si algún día vacilo en mis ideales sobre el software libre.

por Michel Pérez Saavedra

Clientes ligeros, opción viable y realidad objetiva.

Esta es la tecnología que nos permite resucitar viejos hardwares casi muertos. Son casi incontables las veces en que nos hemos visto en la necesidad de tirar a un lado PCs antiguas por que no tienen casi capacidad; esas antiguas combatientes de todos lo días que hoy pueden renacer con nuevo look incluido y casi con las mismas prestaciones de un PC moderno.

por Michel Pérez Saavedra

ZOOM on: LLegamos al portal de Cubarte

Hay muchos lugares que nos hacen aumentar nuestro acerbo cultural y si es verdad lo que dicen de que "la cultura no tiene momento fijo", creo que sí tiene un lugar.

por Michel Pérez Saavedra

Microconsultas

La solución tiende a ser mas gratificante si es compartida. Esta vez la madeja se complicó un poco y tuvimos que acudir a la lista para muchas de las dudas, y cuando contamos el problema, la solución vino de los amigos al otro lado de la lista.

por Michel Pérez Saavedra

El lenguaje Python

En el número anterior tan solo hicimos una breve descripción del lenguaje, hoy se hace el resto. Python, un lenguaje de alta versatilidad capaz de todo y con algunas armas muy potentes para enfrentar a los grandes clásicos de la programación moderna.

por Olemis Lang

Protegiendo: Una solución antivirus

Muchos de los que proponen Linux usan la poca cantidad de virus para el sistema como un arma de promoción, pero, sí hay virus y también antivirus.

por Michel Pérez Saavedra

Divertimento: Romperse la cabeza, esa es la cuestión

Los juegos dinámicos siempre han estado en la preferencia pero que tal con uno simple que de simple no tiene ni el nombre.

por Michel Pérez Saavedra

Avanza el Clásico de Baseball ... entre records y sorpresas

http://web.worldbaseballclassic.com/images/2009/03/11/dQo3jSVI.jpg

Comenzó el Segundo Clásico de Baseball y por todo lo alto. Estamos ante un evento lleno de emociones y ... ¡sorpresas! . Pues sí, se han reunido 16 equipos que han logrado congregar a gran parte de las estrellas de las ligas más importantes de baseball para disputar un título. Y en esta carrera no faltan los escollos, los aciertos y desaciertos. Mis impresiones las tendrá a continuación ...

Los equipos

Ya comenzó el evento. Por la cantidad de figuras y su desempeño en las primeras jornadas resaltan Japón, Cuba, USA, Puerto Rico, República Dominicana, Venezuela y México. El equipo de Japón se mostró muy sólido después de su tímida victoria sobre China por 4-0. El triunfo sobre el fuerte equipo de Korea (campión de los más recientes Juegos Olímpicos ...) por 14-2, y su desempeño en el terreno aclararon toda duda. Japón es una maquinaria, y viene por revalidar su título. Para esto cuenta con varias credenciales: una excelente ofensiva, la defensa hermética más el juego rápido y disciplinado (... con esa mentalidad de no darse por vencido mientras no se decrete el out y de que no se pierde hasta que hayan 27 ...) característico de los equipos asiáticos, súmele a eso un pitcheo de primera, y lo que implica el título ya obtenido ... y quizás ya comprenda lo que les vengo diciendo.

Por su parte Cuba, sub-campeón de la pasada edición comenzó ante el débil Sudáfrica, pero con una presentación de lujo. A pesar de que el contrario no era un buen medidor, el equipo logró lo que será difícil de sobrepasar en un evento de semejante calidad. En primer lugar Norge Luis Vera, con 62 lanzamientos en 6 entradas sobrepasó la barrera de los cuatro innings, demostrando así su calidad. Mirando desde el punto de vista colectivo, el equipo implantó record para el evento, al disparar 6 jonrones en un juego, sobrepasando así la marca anterior de 4, establecida en la primera edición por República Dominicana ante Venezuela. Y esto de los records parece estar de moda para varios de los equipos del clásico : record de hits, record de ponches, y de jonrones ... Bueno, retomendo la idea de Cuba, la debilidad del equipo, en mi opinión, es el pitcheo; y sobre todo el de segunda línea.

Más allá de estos elencos se encuentran otros que son fuertes aspirantes al título ... y figuras no le faltan. USA a logrado reunir a peloteros ilustrísimos de su excelente liga, y esto es muy importante. Pero el rigor del torneo ya se lo vienen sintiendo. Canadá le ha hecho una resistencia increíble. Ambos equipos se conocen y son de un muy buen nivel. Su bateo de fuerza fue muy contundente, pero realmente esperaba más de su pitcheo. También hay que recordar que varias de estas figuras repiten su actuación, pero sinceramente este año los veo en general, con muchas más posibilidades de acercarse al título.

Puerto Rico, República Dominicana y Venezuela son tres elencos con características similares y, en especial, plagados de estrellas. ¿Cuál es la diferencia entre ellos? Pues el primero, además se ve muy bien acoplado en la ofensiva y defensiva y con un pitcheo revitalizado y muy eficiente. Mientras, República Dominicana es, sin dudas, el equipo más impresionante del torneo, incluso sin haber reunido a figuras como Alex Rodríguez y otros pocos. Pero esto parece ser también su principal enemigo. Los roces y la búsqueda del protagonismo desembocan en una realidad: no se ven acoplados, y llegan a realizar jugadas que no son las más apropiadas. Al margen de esto, el pitcheo se ve excelente. Pero hay que tener en cuenta que sus principales hombres a la ofensiva no se han visto del todo bien. Por último, la deuda de Venezuela parece ser su ofensiva. Ante un rival como Italia, se esperaba un poco más.

Sorpresas

http://web.worldbaseballclassic.com/images/2009/03/11/MGNlfYBQ.jpg Pero nadie puede confiarse, ya Holanda sorprendió a República Dominicana al aguantar una ventaja obtenida en el primer inning (... ayudados un poco también por el polémico intento de robo de la tercera base de Willy Taveras ...). Y la sorpresa ya no fue tan sorpresiva cuando ocurrió otra vez, y así Dominicana le decía adiós al clásico (... y así yo le decía adiós a mis pronósticos también ... ya verán ;). En el grupo de Asia también hubo sorpresas. China, un país donde el baseball se encuentra en su etapa embrionaria, le propinó un duro golpe a Taipei de China y los desplazó de la tercera posición a nivel continental. Para ello contaron con la intervención de Raymond Chang, un jugador formado en las ligas menores estadounidenses; y la guía certera de su mentor norteaméricano.

http://web.worldbaseballclassic.com/images/2009/03/08/j2ZKDtZ3.jpg Y el grupo B también tuvo lo suyo, México se llevó un sustazo. Su pitcheo tambaleó. Su abridor estelar Oliver Pérez no pudo aguantar a la ofensiva australiana. Luego, a la altura de la sexta entrada, los australianos tomaron un impulso que les garantizó la victoria. ¡Y qué clase de victoria! Marcador de knock-out, record de hits para el clásico. ¡Menuda sorpresa!

Y si queríamos más ... Italia elimina a Canadá ... =8O

Mis pronósticos ;)

http://web.worldbaseballclassic.com/images/2009/03/07/QM67b9gO.jpg Después de haber hablado un poco acerca de esta fascinante competencia, mis pronósticos vienen siendo los siguientes:

  1. Japón
  2. Cuba o USA
  3. USA, Puerto Rico (... inicialmente fue República Dominicana ... pero claro, ya saben ... :S )

Pero bueno ... el terreno siempre será el que diga la última palabra, y los pronósticos son para eso, para que no se cumplan. Realmente simelo preguntan les diría que es un acontecimiento tremendo tener la oportunidad de presenciar baseball de tan alto nivel, y que, al margen de los resultados, con el espectáculo ya ganamos todos.

miércoles, 4 de marzo de 2009

Filmes que van más allá ... Brainstorm + Los Dioses Rotos

Hagamos un alto en el camino de la informática y la tecnología para mirar hacia el mundo del audiovisual. En un intervalo de días he tenido la oportunidad de disfrutar la proyección de dos películas cubanas realmente diferentes. Dos ejemplos que se apartan en mayor o menor medida de la corriente principal de discursos cinematográficos que se venían proponiendo en los últimos años, frecuentemente apoyados en algunos clichés y fórmulas preconcebidas para, al final, aportar muy poco o nada al espectador. Y en este caso hablo de Los Dioses Rotos y Brainstorm. ¿Será que resurge la intención por parte de los cineastas de la isla de introducir en la fórmula el ingrediente que faltaba ... lograr el entretenimiento sin dejar de transmitir un mensaje que motive la reflexión? No me atrevería a decir ni que sí, ni que no ... pero por lo menos en estas dos propuestas he encontrado suficientes elementos como para compartirlos con Ustedes. Mis impresiones ... las tendrá Usted a continuación ...

Los Dioses Rotos

Los Dioses Rotos es una cinta dirigida por Ernesto Daranas Serrano y producida por Manolo Angueira. Cuenta con un elenco excelente, entre los que resaltan Silvia Águila, Carlos Ever Fonseca, Héctor Noas, Annia Bú Maure, Manuel Oña, Isabel Santos, y otros. Sin pretender revelarles la trama, este largometraje se situa, fundamentalmente, en el contexto de la marginalidad. Este fenómeno se presenta tanto desde el punto de vista de los que la sufren en carne propia, como de aquellos que, estando fuera, tratan de desentrañar los complicados hilos de las relaciones humanas. La frontera entre ambos mundos ... ahí ya tenemos el primer acertijo. Profundizando un poco más, se muestra el lado más oscuro de la prostitución. La trama (... que puede ser considerada como de ficción ...) se sustenta en la analogía con el caso del famoso y controvertido Alberto Yarini como cliché, al fin y al cabo, para atraer al gran público. Su protagonismo en la llamada Guerra de las Portañuelas, el haber destronado el monopolio establecido en La Habana por los chulos franceses, y su trágico final, sirven todos de introducción para contextualizar una historia contemporánea, pero con fuertes lazos con el pasado. ¿Cuáles son los lazos que unen a ambos momentos históricos? ... saltando la barrera de los símbolos, ahí encontramos el segundo enigma.

Ahora sí, más allá de los aciertos y desaciertos que puedan existir en todo esto, incluyendo los pies forzados, la puesta en escena es inobjetablemente efectiva. Todo aquel que la vea experimentará unos minutos trepidantes. El ritmo excelente, el trabajo de cámara y fotografía, la acción y la combinación efectiva de diferentes recursos expresivos y géneros audiovisuales; logran que nosotros, los cinéfilos, quedemos como pegados a nuestros asientos y con la atención 100% dedicada a disfrutar de cada escena, una tras otra. Las pausas no eran como aquellos cuadros que consumían tiempo de proyección para dejarnos en el vacío más absoluto. En este caso, tomaban un valor apreciable al trasladarnos a la realidad y resaltar la fidelidad de los personajes, fruto de un diseño de personajes a destacar. Y todos estos atributos son los que añoraba ver desde hace mucho tiempo ya en la filmografía proveniente de la isla. Y para ponerle la tapa al pomo, entre todos nos regalan un final de lujo.

Para ponernos a pensar ... Brainstorm

Brainstorm es la más reciente entrega que Sex Machine Producciones nos ofrece sobre las peripecias del personaje criollo Nicanor O'Donnel, interpretado por Luis Alberto García. En este caso le acompañan los actores Jorge Perugorría, Nestor Jímenez, Adria Santana, Alberto Pujol y Eduardo del Llano. Todos estos talentosos artistas se disfrazan para poner el dedo en la llaga en lo que a prensa escrita se refiere. Cada personaje no es más que un caso típico de la realidad de la isla, que porta su propia máscara, se escuda en sus propios miedos y se basa en su propia manera de ver el mundo, para participar en la redacción del próximo número de un periódico. Solo que en este caso las circunstancias no podrían ser más extremas ...

Así las cosas, Brainstorm nos acerca a un colectivo bien reducido que solo necesitó de un espacio bien limitado para ofrecernos humor del bueno ... directamente a nuestras neuronas. ¿Y cuál es el resultado de los aportes de todos estos personajes? ¿Hacia dónde nos lleva la trama? Aquí la genialidad y la polémica dejan su sello ...

martes, 3 de marzo de 2009

Clic y al Sur: Conociendo a Ubuntu Linux

Seguimos con las buenas noticias ... se publica el segundo número de la revista Clic y al Sur. La misma se confecciona por un grupo de entusiastas del Software Libre. Ellos han decidido voluntariamente emplear un poco de su muy apretado tiempo y sus bien limitados recursos para continuar descubriendo un mundo más justo, ordenado y hermoso ... el mundo de GNU/Linux. Consejos para seleccionar distribuciones, una introducción al lenguaje Python, cómo protegernos mejor con FireStarter ... ¡ah! y muy buen humor, también. Todo esto, y más, lo tendrá en esta nueva edición de la revista. A continuación los detalles.

¿Que distro usar de tantas que abundan?

En este mundo podemos decir que la variedad puede llegar a ser confusa pero esta impresión inicial puede convertirse en un pequeñísimo precio a pagar por la calidad. Fedora, CentOS, Knoppix, Gentoo, Debian, Slackware y Ubuntu son solo una pequeña parte de las muchas distro que abundan, pero, Ubuntu Linux ha sido seleccionado como la más usada en el mundo, hoy le diremos básicamente porqué y esperemos que muy pronto se una al mundo de los privilegiados usuarios de GNU/Linux.

por Michel Pérez Saavedra

Mais Samba ... Compartir recursos, esa es la cuestión

Samba es la solucion que propone eliminar las diferecias entre los usuarios de sistemas Unix con los que usan sistema Windows. El problema no es quién merece que, sino que los usuarios necesitan compartir información, ellos son los dueños de la información y compartirla con los otros en su red sin que nadie se interponga. Samba propone la eliminación de estos problemas e incluso ha logrado sobrevivir a algunas contingencias y diferencias sobre propiedad

por: Michel Pérez Saavedra

Destripando el guayabito

No deben caber dudas de que la informática recibio un impulso gigantesco desde el surgimiento de las interfaces gráficas y el ratón. Las primeras facilitan el entendimiento de las muchas nuevas aplicaciones pero el segundo quizas sea uno de los inventos esos que cambian el mundo; pero la simplicidad -al menos aparente- es algo que no parece justificar su impresionante impacto en la informática.

por Michel Pérez Saavedra

Microconsultas

Soluciones rápidas a problemas comunes en pocas palabras. La idea principal es crear una seccion donde responder o proponer alguna solución a un problema que se presente.

1. ¿Como compartir mi conexión de internet con mi amigo? 2. Tengo conexion a internet y deseo usar los repositorios de softwares de Cuba, pero no logro que mi sistema se sincronice a los repos. Uso Ubuntu Linux 8.04.

por Michel Pérez Saavedra

Firestarter

Peligro e internet son practicamente lo mismo. En un mundo ideal la navegacion en internet no pasaría de ser mas que una diversión. En este es muy peligroso. Es mejor precaver, y firestarter es una herramienta fácil y más que eficiente.

por Michel Pérez Saavedra

Divertimento

Jugar no es penalizado. Muchos dicen que jugar es malo. No, lo es si el juego es malo. Glest es un buen juego, por eso jugar no es malo.

por Michel Pérez Saavedra

¿Que programen los programadores?

Python no la serpiente sino el lenguaje, un sueño de mañana aquí y ahora. Es este uno de esos lenguajes que te permiten iniciarte, consolidarte y retirarte como programador sin la necesidad de aprender mucho para satisfacer las necesidades del software que estás haciendo, y le sumamos que el intérprete esta portado a varias plataformas.

por Michel Pérez Saavedra

La parte cómica

No cojas lucha con la vida, de todas maneras no saldrás vivo de ella ... XD

Click y al Sur : Amanecer feliz ...

Ninguna otra noticia creo que ha sido tan alentadora hasta ahora como el hecho de la publicación del primer número de la revista Clic y al Sur. La misma se confecciona por un grupo de entusiastas del Software Libre. Ellos han decidido voluntariamente emplear un poco de su muy apretado tiempo para revelarnos de una forma amena y desenfada los más intrincados laberintos del maravilloso mundo del sistema operativo GNU/Linux, así como profundizar en las características de otras tecnologías y estándares abiertos. Este comentario no es más que el primero de una serie que esperemos sea bien pero bien larga, para ir presentando los sucesivos números de esta revista. Si quiere conocer más acerca de sus secciones, de las suscripciones y demás detalles, pues le invito a que siga leyendo hasta el final.

¿Qué es Clic y al Sur?

Clic y al Sur nació en Batabanó, una ciudad al sur de la provincia de La Habana. Allí su coordinador Michel Pérez Saavedra ha concretado ese sueño que tenía hace ya tiempo de dar a luz una revista de divulgación que atrajera la atención de las multitudes hacia el mundo del pingüino. La idea principal de la revista es que se comparta, que pase de mano en mano para que la gente sepa que existe y que se interese por conseguirla. Desde el punto de vista personal, su diseño me cautivó casi instantáneamente. Si se le suma que el esfuerzo de estos muchachos me recuerda las madrugadas interminables que le dedico a mis desarrollos de software libre ... no me quedó otra alternativa que solidarizarme con esta idea.

¿Cómo obtener la revista?

La manera de obtenerla es fácil y puede pedirla sin miedo. También es posible proponer un artículo suyo para publicación o un tema que Ud quiera que se aborde en la revista. Para esto, envíe un correo a la dirección opsbat@infomed.sld.cu especificando uno de los siguientes textos en el asunto del mensaje:

  • revista si quiere que se le envíe el último número de la revista
  • suscripción si quiere que se le envíen nuevas versiones
  • delete para eliminar la subscripción
  • artículo en caso de enviar un artículo
  • sugerir para hacer llegar cualquier otra sugerencia, incluso nuevos temas ;)

Pero tambien, si lo desea, puede estar al tanto de los nuevos volúmenes de esta revista aquí ... en este blog. A petición de su autor, las sucesivas ediciones de Clic y al Sur serán publicadas en este blog. El primer número lo puede descargar aquí.

¿Qué nos trae el primer número?

El primer volúmen de Clic y al Sur comienza presentando una breve reseña acerca de la génesis del Software Libre. Evidentemente no pueden faltar referencias a Richard Matthew Stallman y al ecosistema alrededor del proyecto GNU, todo esto incluyendo referencias a varias de las distintas distribuciones existentes ;). Después le sigue un número de noticias bien interesantes. ¿Quiere saber qué tiene que ver Microsoft con la Apache Software Foundation? ¿Acaso Ud busca actualizarse acerca del uso de Ubuntu, Red Hat o Fedora? Quizás se sorprendería al encontrar todos estos datos ... ¡y mucho más! .

Pero si piensa que esto es todo ... pues se ha equivocado. A continuación se aborda en la sección Deshuezadero el tema de los dispositivos reproductores de música. Y por si no bastara hay una nota acerca de una alternativa para obtener una distribucion de GNU/Linux hecha a la medida.

Y bueno ... claro, claro ... siempre hay su poco de humor ... :)

Así que ya Ud ve ... existe un colectivo decidido a salir adelante en este generoso empeño de divulgar el Software Libre... y bueno, como siempre, simelo pide no faltará un tiempo para escribir una nota para tratar ese tema que a Ud tanto le inquieta ... y quién sabe, quizás el resultado también se encuentre como una contribución de este blog al arsenal de ideas libres que quedarán plasmadas en las páginas de Clic y al Sur ... ¡Viva Linux!

lunes, 2 de marzo de 2009

No me gustan los templates de Django ...

Había una vez un programador solitario que comentó que no le gustaban los templates de Django. ¡Semejante herejía! ¿Cómo se le iba a ocurrir decir eso del framework que el propio Guido van Rossum ha sugerido para ser desplegado en Google App Engine? Como todos se quedaron impávidos, y como ese programador soy yo ... aquí les van los detalles. ¿Cuáles son mis argumentos? ¿Cuál es el mejor sistema de templates para Python? ¿Realmente alguno sobresale? Todo esto y muchas cosas más las tendrá acá ... continúe leyendo hasta el final ... y si se motiva, ¡puede dejar también su comentario! ;) ... pero primero es lo primero. Todo comenzó con un tablero de ajedrez ...

Antecedentes

Cuando intenté aprender cómo utilizar Django me dije: comenzaré por hacer algo bien sencillo, pero no muy tradicional, para ir familiarizándome con los templates. Fue entonces cuando comenzó mi Odisea: se me ocurrió mostrar un tablero de ajedrez utilizando tablas HTML. En este momento tenía el antecedente de JSP después de terminar un curso de J2EE ofrecido por profesores del NIIT. Ya había logrado comprender su estilo hasta el punto de darme cuenta de que podía ser dañino si se mezclaban los detalles de la interfaz con otra lógica más propia de la aplicación. Además esto no mejora mucho tampoco utilizando JavaBeans. Pero realmente en ese tiempo (ahora realmente no sé ;) me gustaba mucho la idea de dejar abierto un bloque (e.g. un for) en el template, intercalar el código HTML que se iba a ir repitiendo y cerrar el ciclo más adelante. Antes de conocer incluso a Django, cuando comencé a explorar el desarrollo de aplicaciones web con Python esperé que toda la naturalidad del lenguaje redundaría en templates dignos de admiración. Por tanto comencé por echarle una ojeada a mod_python. Me sorprendí al ver sus similitudes con JSP, y por tanto era consciente también de sus limitaciones. Pero bueno, al grano, supongamos que se tiene el ancho de las celdas (celldim), dos listas que contienen los identificadores de columnas (cols) y filas (rows) y una variable que indica si el jugador lleva las piezas blancas o negras (home_player). Después de todo esto mi famoso tablero de ajedrez sería tan sencillo como:
<%
celldim = 20
rows = "abcdefgh"
cols = range(1,9)
home_player = True
%>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<style type="text/css">
.white_sq{
background-color: white;
}
.black_sq{
background-color: black;
}
</style>
</head>
<body>
<table>
<tr height="<%= celldim %>">
<td width="<%= celldim %>"></td>
<%
for ci, c in enumerate(home_player and cols or reversed(cols)):
%>
<td width="<%= celldim %>">
<small><%= c %></small>
</td>
<%
%>
</tr>
<%
for ri, r in enumerate(home_player and reversed(rows) or rows):
# Rows in board ...
%>
<tr height="<%= celldim %>">
<td width="<%= celldim %>">
<small><%= r %></small>
</td>
<%
for ci, c in enumerate(home_player and cols or reversed(cols)):
# Cols in board ...
%>
<td class="<%= (ci + ri) % 2 == 0 and 'white_sq' or 'black_sq' %> "
width="<%= celldim %>"></td>
<%

%>
<td width="<%= celldim %>">
<small><%= r %></small>
</td>
</tr>
<%
%>
<tr height="<%= celldim %>">
<td width="<%= celldim %>"></td>
<%
for ci, c in enumerate(home_player and cols or reversed(cols)):
%>
<td width="<%= celldim %>">
<small><%= c %></small>
</td>
<%
%>
</tr>
</table>
</body>
</html>

Con Django ... ¡¡¡me duele la cabeza!!!

De pronto traté de reproducir la misma idea utilizando los templates de [www.djangoproject.com/ Django]. Atraído por los comentarios que me adelantaban sus virtudes (entre ellas su separación bien establecida entre la capa de presentación y la lógica de la aplicación, sumándole a esto su enfoque para persistencia) de datos, no me resultó nada raro pensar que este ejemplo tan sencillo iba a ser algo muy fácil de hacer ... sin embargo, como pueden ver, el resultado (hasta ahora ;) es realmente decepcionante.
<html>
<head>
<style type="text/css">
.white_sq{
background-color: white;
}
.black_sq{
background-color: black;
}
</style>
</head>
<body>
<table>
<tr>
<td width="{{celldim}}"></td>
{% for c in cols %}
<td width="{{celldim}}">
<small>
  {% if home_player %}
    {{c}}
  {% else %}
    {{cols|slice:forloop.revcounter.__str__|slice:"-1::-1"|first}}
  {% endif %}
</small>
</td>
{% endfor %}
<td width="{{celldim}}"></td>
</tr>
{% for r in rows reversed %}
<tr height="{{celldim}}">
<td width="{{celldim}}">
<small>
{% if home_player %}
  {{r}}
{% else %}
  {{rows|slice:"-1::-1"|slice:forloop.revcounter.__str__|slice:"-1::-1"|first}}
{% endif %}
</small>
</td>
{% for c in cols %}
<td class={% if forloop.counter|add:forloop.parentloop.counter|divisibleby:"2" %}
          "white_sq"
        {% else %}
          "black_sq"
        {% endif %}
  width="{{celldim}}"></td>
{% endfor %}
<td width="{{celldim}}">
<small>
{% if home_player %}
  {{r}}
{% else %}
  {{rows|slice:"-1::-1"|slice:forloop.revcounter.__str__|slice:"-1::-1"|first}}
{% endif %}
</small>
</td>
</tr>
{% endfor %}
<tr>
<td width="{{celldim}}"></td>
{% for c in cols %}
<td width="{{celldim}}">
<small>
  {% if home_player %}
    {{c}}
  {% else %}
    {{cols|slice:forloop.revcounter.__str__|slice:"-1::-1"|first}}
  {% endif %}
</small>
</td>
{% endfor %}
<td width="{{celldim}}"></td>
</tr>
</table>
</body>
</html>
El código es altamente ilegible, no tiene nada de naturalidad, su ejecución es ineficiente debido a que hay que procesar varios filtros (y evidentemente eso tarda más que una evaluación directa contra un espacio de nombres global ;). Además, para lograr hacerlo hay que pasar por un proceso de aprendizaje nada despreciable. ¡Qué desastre! Mi impresión es que los templates de [www.djangoproject.com/ Django] se han tornado tan restrictivos para separar los detalles de la interfaz de lo demás, que han convertido en un infierno hacer rápida y naturalmente tareas extremadamente sencillas que no tienen nada que ver con la lógica de la aplicación.

Por suerte llegó Genshi ... y mandó a parar

Más tarde entré en contacto con Genshi durante mi aventurero desarrollo de plugins para Trac. En este caso se alcanza un mejor equilibrio entre la programación de la interfaz y su separación ¡Qué alegría! Para empezar mi tablero de ajedrez quedaría apróximadamente así ...
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:py="http://genshi.edgewall.org/">
<head>
<style type="text/css">
.white_sq{
background-color: white;
}
.black_sq{
background-color: black;
}
</style>
</head>
<body>

<py:def function="label_row()">
<tr height="$celldim">
<td width="$celldim"></td>
<td py:for="ci, c in enumerate(home_player and cols or reversed(cols))"
  width="$celldim">
<small>$c</small>
</td>
<td width="$celldim"></td>
</tr>
</py:def>
<py:def function="label_cell(r)">
<td width="$celldim">
<small>$r</small>
</td>
</py:def>

<table>
${label_row()}
<tr py:for="ri, r in enumerate(home_player and reversed(rows) or rows)"
height="$celldim">
${label_cell(r)}
<td py:for="ci, c in enumerate(home_player and cols or reversed(cols))"
class="${(ci + ri) % 2 == 0 and 'white_sq' or 'black_sq'} "
width="$celldim"></td>
${label_cell(r)}
</tr>
${label_row()}
</table>
</body>
</html>
... y además fíjese en la reutilización que permite el elemento py:def para crear estructuras semejantes a funciones (digamos def) que se expresan solamente en términos de elementos XML / HTML. Además Genshi está preparado para hacer streamming, lo que contribuye a la eficiencia para expandir los templates, y para filtrarlos (e.g. para lograr con relativa fácilidad, la preparación de sitios web completos en diferentes idiomas).

Pero cuidado con Cheetah …

Después de haber escuchado a Alex Martelli en su presentación de Python durante Google I/O 2008 me interesé por saber un poco más de Cheetah. Aunque mi corta experiencia no me permitiría hacer un análisis más profundo ahora (... quizás luego ;), sí les puedo asegurar que mi tablero sería especificado con un template como el siguiente:
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<style type="text/css">
.white_sq{
background-color: white;
}
.black_sq{
background-color: black;
}
</style>
</head>
#def label_row()
<tr height="$celldim">
<td width="$celldim"></td>
#for $ci, $c in enumerate($home_player and $cols or reversed($cols))
<td width="$celldim">
<small>$c</small>
</td>
#end for
<td width="$celldim"></td>
</tr>
#end def
#def label_cell($r)
<td width="$celldim">
<small>$r</small>
</td>
#end def
<body>
<table>
$label_row()
#for $ri, $r in enumerate($home_player and reversed($rows) or $rows)
<tr height="$celldim">
$label_cell($r)
#for $ci, $c in enumerate($home_player and $cols or reversed($cols))
<td class="${(ci + ri) % 2 == 0 and 'white_sq' or 'black_sq'} "
width="$celldim"></td>
#end for
$label_cell($r)
</tr>
#end for
$label_row()
</table>
</body>
</html>
... es decir, se repite la reutilización de código con la directiva #def para crear estructuras semejantes a funciones, parecido al caso de Genshi. Además Cheetah compila los templates a código Python, lo que le aporta potencialidades increíbles al framework (... de las que quizás podremos hablar más adelante ...). Solo les adelanto lo siguiente, Cheetah ha sido utilizado para generar HTML, SGML, XML, SQL, Postscript, e-mail y LaTeX. En la práctica es capaz de hacerlo con cualquier otro formato de texto y, en otras aplicaciones menos ortodoxas, se ha generado código para lenguajes como Python, Java y PHP. Además Cheetah permite utilizar otras sintaxis, lo que implica que se pueda, por ejemplo, intercalar código PSP en templates de Cheetah.

Conclusiones

Sinceramente quisiera pensar que no comprendo los templates de [www.djangoproject.com/ Django] tan bien como para obtener lo que realmente quiero de una forma más natural y sencilla. Pero luego he descubierto que parece ser que no soy el único. Les dejo con los principios de diseño detrás de Cheetah, saquen Ustedes sus propias conclusiones :
  • Python para la lógica de la aplicación, y Cheetah para la capa de presentación. Cheetah está diseñado para complementar a Python, no para remplazarlo.
  • La sintaxis debe ser fácil de aprender por personas que no programen.
  • La reutilización de código debe estar disponible de forma sencilla, al proveer una interfaz orientada a objetos que facilite el acceso a los datos en el template ya sea desde Python o desde otros templates de Cheetah.
  • Los objetos, funciones, y otras estructuras de datos presentes en Python deben ser accesibles en los templates de Cheetah.
  • Cheetah debe proveer directivas de control de flujo y manipulación de errores. La lógica que pertenece a la capa de presentación no debe ser relegada a la capa de la aplicación, simplemente porque es compleja.
  • El contenido, el diseño gráfico y el código de la aplicación deben ser separados, y a la vez integrados, de manera fácil.
  • En particular debe resultar intuitivo:
    • para los programadores, poder crear componentes reutilizables y funciones accesibles y comprensibles por los diseñadores.
    • para los diseñadores, el poder marcar los espacios dónde se ubicarán los diferentes contenidos y componentes dinámicos en los templates.
    • para los diseñadores también, el poder escribir código simple para poder expresar aspectos que en el diseño resultan ser repetitivos o que cambian con facilidad.
    • para los diseñadores también, el poder reutilizar y extender plantillas existentes y minimizar así la duplicación del esfuerzo y las líneas de código.
    • y, claro, para los autores de los contenidos, utilizar las plantillas creadas por los diseñadores.
Sin embargo ... al margen de todo este debate, para aplicaciones más serias mantengo mi posición de liberarme lo más posible de la tiranía de los frameworks. Si Ud tiene otra opinión no hay nada para mí más valioso que conocer sus comentarios ... y, simelo pide, seguiremos explorando este hermoso universo de la programación web en Python.