tag:blogger.com,1999:blog-158363852024-03-13T16:40:29.372-04:00jgomo3Opiniones, notas y destellos de creatividad.skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.comBlogger78125tag:blogger.com,1999:blog-15836385.post-42837669154757340012015-07-01T00:33:00.000-04:302015-07-01T00:33:10.022-04:30Recordatorio para escribir acerca de bcache y de las variables de entorno en entornos de desarrollo<h3>
Inicio</h3>
<h3>
<span style="font-size: small; font-weight: normal;">Esta es una tormenta de ideas de dos asuntos que me tienen atormentado.</span><br /><br />bcache</h3>
No he atendido bien una <a href="http://jgomo3.blogspot.com/2014/02/extrana-y-grata-sorpresa-con-la-vit.html"><span id="goog_1569835783"></span>entrada en mi blog<span id="goog_1569835784"></span></a> que escribí hace un par de años acerca de la laptop que adquirí en aquel entonces. El asunto es que merecía una continuación explicando cómo terminé instalando mi máquina y cómo aproveché la configuración híbrida de dos unidades de almacenamiento masivo con diferentes tecnologías: discos magnéticos y estado sólido.<br />
<br />
Lo que hice fue configurar <a href="http://bcache.evilpiepirate.org/">bcache</a> en Ubuntu 14.04 (por eso el título de esta sección). Así, logré utilizar la unidad de estado sólido de 32 GB como <a href="https://es.wikipedia.org/wiki/Cach%C3%A9_(inform%C3%A1tica)">"cache"</a> del disco duro de 1TB, logrando virtualmente una unidad de un 1TB con la velocidad de lectura y escritura de una unidad de estado sólido ¿Cómo lo hice? Es un paso a paso que merece una entrada completa explicándolo.<br />
<br />
Ahora, tengo el problema de que el disco duro de 1TB se está dañando, y tal vez deba instalar el sistema nuevamente sólo con la unidad de esta sólido de 32GB. Me hubiese gustado más bien reinstalar el sistema con la unidad híbrida para repasar los pasos que tuve que dar para lograrlo y así facilitar la escritura del artículo.<br />
<br />
Lo bueno de esta situación es que puedo establecer un momento en el futuro para escribir el paso a paso: el día que me compre el nuevo disco duro de 1TB.<br />
<br />
<h3>
Variables de entorno en el proceso de desarrollo de software</h3>
<br />
Otro aspecto del que quiero escribir. Pero sobre todo, dominar. Por eso dejo este recordatorio.<br />
<br />
Creo que la primera vez que trabajé con archivos de configuración fue con los archivos de configuración del MS-DOS. Recuerdo el "autoexec.bat" y el "config.sys". Después reencontré los archivos de configuración cuando descubrí Linux.<br />
<br />
Pero en la disciplina del desarrollo de software, no fue hasta que trabajé con Django que ate los cabos. Los archivos de configuración son parte de la interfaz de usuario, destinada a un usuario especial: el que instala, configura y administra el software que le has entregado para que sea utilizado en definitiva por el usuario final. Y como parte de la interfaz de usuario, no es un asunto que deba tratarse a la ligera: hay que pensar en ello. Haría una reseña al libro de <a href="http://www.catb.org/esr/writings/taoup/">"El Arte de programar Unix"</a>, pero no sabría exactamente que parte señalar. Sólo recuerdo que algunas ideas acerca de diseñar bien estos asuntos de la interfaz de usuario, incluso cuando se trate de tomar la decisión de qué letra elegir para una opción de un programa de consola, vienen de ese libro.<br />
<br />
Luego Rails me propuso el asunto de los entornos (desarrollo, pruebas y producción). También maven con sus "perfiles".<br />
<br />
Curiosamente fue después, en un curso de programación de <a href="http://www.earthwormcentral.org/">earthworm</a> (un software especial para sismología), que atestigüé la extraña pero antigua costumbre de mantener un archivo con variables de entorno, que durante el proceso de desarrollo se cargan con el comando "source".<br />
<br />
Inmediatamente recordé el libro <a href="https://en.wikipedia.org/wiki/The_Unix_Programming_Environment">"The Unix Programming Environment"</a> que sugiere que Unix es un entorno de programación: entonces, las variables de entorno son sólo una de las herramientas con las que cuenta el programador.<br />
<br />
Y ahora el "merge" (config/environments): http://12factor.net/config .<br /><br />De esto es lo que quiero escribir. Pero quiero dominar la técnica, cosa que no hago todavía porque no la practico día a día.<br />
<br />
Curiosamente, el uso de una herramienta para trabajar con "APIs" REST me ha dado la oportunidad de experimentar la técnica de una manera muy cómoda. Hablo de <a href="https://www.getpostman.com/">Postman</a>, que te perminte definir un conjunto de "variables de entorno" y agruparlas como un "entorno", para luego poder utilizarlas en las pruebas que hagas con él (que para eso es el Postman al final de cuentas, para hacer pruebas).<br />
<br />
Algo que me gustó muchísimo es el hecho de que todas las cosas que guardes en Postman, quedan guardadas en "la nube" si se lo permites, y ya no dependes de la máquina en donde estés trabajando para recuperar tus valiosas variables de entorno... ¿No existe algo así para la consola?¿Un sistema para administrar las variables de entorno de manera centralizada de forma simple como en Postman?.<br />
<br />
Alguno de los <a href="http://yeoman.io/learning/resources.html">videos de Yeoman</a> da un tip genial acerca de los perfiles en los terminales. La idea es definir un perfil por cada proyecto de desarrollo de software en que se esté trabajando, y este perfil definirá todas las variables de entorno que se necesiten.<br />
<br />
<h3>
Fin</h3>
Termino con el principio: esta es una tormenta de ideas de dos asuntos que me tienen atormentado. Son cosas que quiero culminar, pero no lo haré ahora. El motivo de esta entrada es no perder las ideas que tengo que están relacionadas con esos asuntos.skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com0tag:blogger.com,1999:blog-15836385.post-22829249721390874192015-06-12T08:42:00.000-04:302015-06-12T08:43:36.568-04:30Recursos relacionados con el diseño de API's REST<ul>
<li><a href="https://apiblueprint.org/">apiblueprint</a>: Extensión de <i>Markdown</i> para documentar <i>API</i>s.</li>
<li><a href="http://raml.org/">raml</a>: Lenguaje parecido a <i>YAML</i> para escribir especificaciones de <i>API</i>s.</li>
<li><a href="https://wadl.java.net/">wadl</a>: Lenguaje basado en <i>XML</i> para escribir especificaciones de <i>API</i>s. El <i>WSDL</i> del mundo <i>REST</i>.</li>
<li><a href="http://swagger.io/">swagger</a>: Ecosistema de herramientas para generar <i>API</i>s <i>REST</i>.</li>
<li><a href="https://www.getpostman.com/">postman</a>: herramienta gráfica para interactuar con <i>HTTP</i>, pensada para trabajar con <i>API</i>s <i>REST</i>.</li>
<li><a href="http://httpie.org/">httpie</a>: <i>curl</i> para humanos. Herramienta de texto para interactuar con <i>HTTP</i>, pensada para trabajar con <i>API</i>s <i>REST</i>.</li>
<li><a href="http://www.soapui.org/">soapui</a>: herramienta gráfica para interactuar con servicios web (incluidos recursos <i>REST</i>).</li>
</ul>
skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com0tag:blogger.com,1999:blog-15836385.post-38228587064841970732014-07-03T15:47:00.000-04:302014-07-04T08:40:01.281-04:30PostgreSQL y trabajo en equipoQuiero que las tablas que crea un usuario puedan ser manipuladas por un
grupo de usuarios. Pensé que todo sería tan sencillo como definir un
grupo de usuarios y registrar a los usuarios en él, pero nada más lejos
de la verdad.<br />
<br />
<h3>
PostgreSQL 9.2</h3>
<br />
Primero pensé
que <b>GRANT <privileges> ON ALL TABLES ON SCHEMA <schema> TO
<ROLE></b> haría la magia si <b><ROLE></b> es el grupo.<br />
<br />
En
cierta manera sí lo hace, pero sólo modifica las tablas existentes. Para
las tablas que se crearán a futuro, habría que repetir estos pasos
nuevamente.<br />
<br />
Una solución permanente es definir los privilegios
por defecto de la base de datos. Esto se logra con: <b>ALTER DEFAULT
PRIVILEGES GRANT <privileges> ON TABLES TO <ROLE></b>. Si <b>
<ROLE></b> es el grupo, funciona. Pero, hay un detalle: sólo tiene
efecto para el usuario que ejecuta el comando. Es decir, sólo las tablas
que él crea obtendrán cederán los privilegios al grupo.<br />
<br />
<b>ALTER DEFAULT PRIVILEGES</b> permite definir un rol al que pertenezca quien ejecute el comando, para que se modifiquen las tablas que ese rol cree con los privilegios por defecto. Para definir ese rol se indica después de <b>ALTER DEFAULT PRIVILEGES</b> la frase <b>FOR ROLE <ROLE></b>.<br />
<br />
Así que la solución podría haber sido:<br />
<br />
<b>ALTER DEFAULT PRIVILEGES FOR ROLE <ROLE> GRANT <privileges> ON TABLES TO <ROLE>;</b><br />
<br />
Haciendo que <b>ROLE</b> sea el grupo. De esta manera, cuando un miembro del grupo cree una tabla, concederá los privilegios definidos.<br />
<br />
Pero no. No funciona, ya lo probé. Lamentablemente habrá que repetir el <b>ALTER DEFAULT PRIVILEGES</b> por cada rol del grupo; y estar pendiente de ejecutar este comando cada vez que se registre un nuevo usuario al grupo y revocar los privilegios por defecto cuando el usuario deje de pertenecer al grupo.skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com0tag:blogger.com,1999:blog-15836385.post-61833522827532137982014-07-03T12:17:00.000-04:302014-07-03T13:11:25.484-04:30De cómo utilicé udev para fijar unos parámetros en una cámara web "Creative vf0070"Al conectar la cámara web en la computadora, las imágenes que se reproducían en la pantalla se veían muy mal[1]: con mucho brillo y no se podían entender bien.<br />
<span style="font-size: x-small;">[1] Utilicé el programa <a href="https://wiki.gnome.org/Apps/Cheese">Cheese</a> para poder observar las imágenes. </span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/--DIQlz5tq_4/U7R95uBLwTI/AAAAAAAAB9g/erI_dLAqah4/s1600/Screenshot+from+2014-07-02+16:58:11-croped.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/--DIQlz5tq_4/U7R95uBLwTI/AAAAAAAAB9g/erI_dLAqah4/s1600/Screenshot+from+2014-07-02+16:58:11-croped.png" height="242" width="320" /></a></div>
<br />
El programa Cheese tiene unos controles que permiten modificar distintos valores de las imágenes con los que se puede intentar corregir los defectos. Estos controles se alcanzan en las preferencias de la aplicación, en una sección llamada "Imagen". Sin embargo, en mi caso no pude corregir las imágenes con estos controles.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-PmSLttjeQ1g/U7R-ZYtUndI/AAAAAAAAB9o/MaBHNDQsRhQ/s1600/Screenshot+from+2014-07-02+16:59:55-croped.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-PmSLttjeQ1g/U7R-ZYtUndI/AAAAAAAAB9o/MaBHNDQsRhQ/s1600/Screenshot+from+2014-07-02+16:59:55-croped.png" height="221" width="400" /></a></div>
<br />
La razón es que estos controles realizan un proceso posterior a la captura de las imágenes y los defectos que tenían las que estaba viendo se debían, supongo, a problemas que sucedían al momento de capturar las imágenes. Es decir, estos controles permiten "editar" las imágenes ya capturadas, como si de una herramienta de edición de imágenes se tratase (como <a href="http://www.gimp.org/">Gimp</a> o PhotoShop). Sin embargo, debía corregir la captura misma de las imágenes para poder apreciar bien las mismas.<br />
<br />
Para realizar las correcciones de captura mencionadas, utilicé un programa llamado Video4Linux Control Panel. Para instalarlo, ejecuté el siguiente comando:<br />
<br />
<div style="text-align: left;">
<span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;"><span style="background-color: #666666;"><span style="color: lime;">$ sudo apt install v4l2ucp</span></span></span></span></div>
<br />
Este programa es unas simple herramienta que te presenta en una interfaz gráfica unos controles que te permiten modificar los parámetros de captura de imágenes de la cámara web.<br />
<br />
En mi caso corregí las imágenes modificando el valor de exposición (Exposure) y ganancia (Gain), que son parámetros establecidos en la cámara misma, y también modifiqué el parámetro Gamma y el balance de blancos (White valance), que según indica la aplicación, son parámetros a nivel del software (ver la captura de pantalla). Estas modificaciones las hacía mientras veía los efectos en las imágenes reproducidas por Cheese.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-tuAM4rT-z5s/U7SD9XqGrQI/AAAAAAAAB94/ncupkkTwTiU/s1600/Screenshot+from+2014-07-02+17:00:54-croped.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-tuAM4rT-z5s/U7SD9XqGrQI/AAAAAAAAB94/ncupkkTwTiU/s1600/Screenshot+from+2014-07-02+17:00:54-croped.png" height="197" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-UK__xeLNNs8/U7SD9tqSvRI/AAAAAAAAB98/SdldKIgIHPg/s1600/Screenshot+from+2014-07-02+17:01:48-croped.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-UK__xeLNNs8/U7SD9tqSvRI/AAAAAAAAB98/SdldKIgIHPg/s1600/Screenshot+from+2014-07-02+17:01:48-croped.png" height="198" width="400" /></a></div>
El asunto parecía resuelto hasta que desconecté y conecté de nuevo la cámara. Obtuve el siguiente resultado:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-G04QKNqoh0I/U7SEqbhSmUI/AAAAAAAAB-I/VhGWsUw-gpI/s1600/Screenshot+from+2014-07-02+17:06:01-croped.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-G04QKNqoh0I/U7SEqbhSmUI/AAAAAAAAB-I/VhGWsUw-gpI/s1600/Screenshot+from+2014-07-02+17:06:01-croped.png" height="197" width="400" /></a></div>
<br />
Si comparan los parámetros de las últimas dos capturas de pantalla, pueden observar que los valores etiquetados como "software" permanecieron iguales, pero que la exposición (Exposure) y la ganancia (Gain) cambiaron. Aún más, al observar la última y antepenúltima captura de pantalla, pueden ver que los valores de exposición y ganancia son iguales.<br />
<br />
Este fenómeno se repetía una y otra vez cada vez que apagaba la computadora o cambiaba la cámara de una computadora a otra (en cuyo caso, todos los valores se perdían y se establecían a los que observan en la antepenúltima captura de pantalla).<br />
<br />
¿Por qué pasa esto?. No lo se. Pero sospecho que los valores que no dicen "software" son valores almacenados directamente en la cámara web, y esta tal vez no esté diseñada con una memoria persistente.<br />
<br />
En todo caso, mi interés era que los valores que se establecieran una vez fueran permanentes.<br />
<br />
<h3>
udev al rescate</h3>
Al programa Video4Linux Control Panel lo acompaña una pequeña herramienta llamada v4l2ctrl. Este programa permite guardar en un archivo los valores de los parámetros establecidos de la cámara para poder restablecerlos en un momento futuro.<br />
<br />
Así, para guardar esos valores, se ejecuta el siguiente comando:<br />
<br />
<div style="text-align: left;">
<span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;"><span style="background-color: #666666;"><span style="color: lime;">$ v4l2ctrl -s valores</span></span></span></span></div>
<br />
De esta manera, los valores que está utilizando en el momento de ejecutar el comando, son guardados en el archivo "valores".<br />
<br />
Entonces, cuando se desee en otro momento establecer esos valores a la cámara, basta con utilizar el mismo comando de la siguiente forma:<br />
<br />
<div style="text-align: left;">
<span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;"><span style="background-color: #666666;"><span style="color: lime;">$ v4l2ctrl -l valores</span></span></span></span></div>
<br />
La diferencia es la opción -l (del inglés "load" o "cargar")en vez de la opción -s (del inglés "save" o "guardar").<br />
<br />
Claro, estar "cargando" la configuración que queremos fijar de manera permanente, cada vez que iniciemos la computadora o cada vez que conectemos la cámara es una situación indeseable.<br />
<br />
Lo que hice para lograr el efecto de "persistencia" en la configuración fue configurar la computadora para que cada vez que se detecte que la cámara web se conectó, se ejecute el comando "v4l2ctrl" para que "cargue" un archivo que coloqué en un lugar fijo.<br />
<br />
Esto se logra con "<a href="http://es.wikipedia.org/wiki/Udev">udev</a>". Específicamente, con una regla que diga exactamente lo que expliqué: en lo que se detecte la conexión de la cámara web, ejecutar el comando.<br />
<br />
Las reglas udev se escriben en un archivo que termine en .rules, que debe estar ubicado en la carpeta /etc/udev/rules.d . Un artículo que utilicé para guiarme en la escritura de las reglas udev fue <a href="http://www.reactivated.net/writing_udev_rules.html">Writing udev rules</a> por Daniel Drake (dsd). En mi caso, escribí un archivo llamado local.rules con el siguiente contenido:<br />
<br />
<div style="text-align: left;">
<span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="background-color: #666666;"><span style="color: lime;">SYMLINK=="/dev/v4l/by-id/usb-SQ_Tech_CO.__LTD._USB_2.0_PC_camera-video-index0", RUN+="/usr/bin/v4l2ctrl -l /opt/webcam_creative_values"</span></span></span></span></div>
<pre> </pre>
Y luego de reiniciar la máquina[1], cada vez que se detecte la cámara web, automáticamente se cargará la configuración contenida en el archivo /opt/webcam_creative_values .<span style="background-color: #666666; font-size: x-small;"><span style="color: lime;"><span style="background-color: white;"><span style="color: black;"><span style="font-family: Georgia,"Times New Roman",serif;"> </span></span></span></span></span><br />
<span style="background-color: #666666; font-size: x-small;"><span style="color: lime;"><span style="background-color: white;"><span style="color: black;"><span style="font-family: Georgia,"Times New Roman",serif;">[1] Intenté no reiniciarla, reiniciando sólo el servicio udev, pero no me funcionó.</span></span></span></span></span><br />
<br />
Este archivo webcam_creative_values, se crea previamente con el comando v4l2ctrl y la opción de "guardar", luego de estar conforme con los valores establecidos.<br />
<br />
El contenido de mi archivo local.rules representa una regla udev, que está conformada en este caso por una clave de coincidencia ("match key" en inglés) y una asignación.<br />
<br />
La clave de coincidencia es:<br />
<br />
<span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;"><span style="background-color: #666666;"><span style="color: lime;">SYMLINK=="/dev/v4l/by-id/usb-SQ_Tech_CO.__LTD._USB_2.0_PC_camera-video-index0"</span></span></span></span><br />
<br />
<span style="background-color: #666666;"><span style="color: lime;"><span style="background-color: white;"><span style="color: black;">Que significa: si el dispositivo tiene el enlace simbólico "/dev/v4l/by-id/usb-Bison_HD_Webcam-video-index0" entonces se ejecutará la siguiente asignación.</span></span></span></span><br />
<br />
<span style="background-color: #666666;"><span style="color: lime;"><span style="background-color: white;"><span style="color: black;">La asignación es:</span></span></span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="background-color: #666666;"><span style="color: lime;">RUN+="/usr/bin/v4l2ctrl -l /opt/webcam_creative_values"</span></span></span></span><br />
<br />
<span style="background-color: #666666;"><span style="color: lime;"><span style="background-color: white;"><span style="color: black;">Que significa: a la lista de comandos a ejecutar, añade el siguiente comando: "/usr/bin/v4l2ctrl -l /opt/webcam_creative_values", que es el que carga los valores deseados en la cámara.</span></span></span></span><br />
<h3>
¿Cómo supe la ruta dentro de /dev/ de la cámara?</h3>
Un poco de cultura general de Linux es suficiente para saber que todos los dispositivos de la computadora están en algún lugar dentro del directorio /dev. Ahí se encuentran subdirectorios para los discos, el ratón, teclado, etc. Incluso, tiene un directorio dedicado a los dispositivos de entrada de video, como la cámara web. Este directorio es /dev/video0. Si hubieran más dispositivos de entrada de video, el cero (0) se cambiaría por un uno (1) para el siguiente dispositivo, un dos (2) para el que le sigue, y así. Ejemplo: /dev/video1, /dev/video2.<br />
<br />
udev provee nombres persistentes para los dispositivos, para que no haya duda a la hora de escribir las reglas. Por ejemplo, /dev/video0 es la primera cámara web que conectamos y /dev/video1 es la segunda. Pero si se quiere escribir una regla para una cámara específica (tal marca, tal modelo, etc.), como en mi caso, se puede sacar provecho a los nombres persistentes que genera udev. Ellos están en algún subdirectorio llamado by-id. Para conseguir el nombre persistente de la cámara /dev/video0, por ejemplo, se ejecuta el siguiente comando:<br />
<br />
<span style="background-color: #666666;"><span style="color: lime;"><span style="font-family: Georgia,"Times New Roman",serif;">$ udevadm info -q symlink -n /dev/video0</span></span></span><br />
<br />
Este comando muestra todos los otros nombres que tiene asignada la cámara en este instante:<br />
<br />
<span style="background-color: #666666;"><span style="color: lime;"><span style="font-family: Georgia,"Times New Roman",serif;">v4l/by-id/usb-SQ_Tech_CO.__LTD._USB_2.0_PC_camera-video-index0</span></span></span><br />
<span style="background-color: #666666;"><span style="color: lime;"><span style="font-family: Georgia,"Times New Roman",serif;">v4l/by-path/pci-0000:00:1d.7-usb-0:8:1.0-video-index0</span></span></span><br />
<br />
Se utilizaría entonces el que tiene by-id en la regla udev.<br />
<h3>
Pendiente</h3>
Esta solución no está del todo completa. Cada vez que modifique los parámetros de la cámara debo guardarlos con el programa v4l2ctrl en el el directorio /opt/webcam_creative_values, porque así lo establece la regla que yo mismo escribí.<br />
<br />
Me gustaría que fuera automático. Como pasa con los otros parámetros de tipo "software": que yo no hago nada, esos valores se mantienen.<br />
<br />
Creo que pudiera investigar dos cosas:<br />
<ol>
<li>¿Dónde se almacenan los valores de esos parámetros? para ver como forzar la persistencia en ese lugar de los parámetros ganancia y exposición.</li>
<li>¿Cómo disparar un comando sólo cuando se desconecta un dispositivo?. Tal vez sea posible guardar los valores que están establecidos para la cámara después que se desconecte, sobrescribiendo el archivo en /opt, y logrando que la próxima vez que se conecte la cámara se restauren esos valores.</li>
</ol>
skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com0tag:blogger.com,1999:blog-15836385.post-69571231287145394502014-02-01T00:36:00.000-04:302014-02-01T00:36:06.444-04:30Extraña y grata sorpresa con la VIT P3400-2El pasado miércoles pude comprar una portátil VIT P3400-2. Sus <a href="http://www.vit.gob.ve/index.php?page=shop.product_details&flypage=flypage.tpl&product_id=35&category_id=2&option=com_virtuemart&Itemid=105#&panel1-1">especificaciones técnica</a>s son muy buenas: procesador Intel Core i7, 8GB de memoria RAM, 1TB de disco duro.<br />
<br />
Usándola me percato de un par de "dispositivos" adicionales, como si tuviera dos "pen drives" conectados. Uno se llama Datos y otro SSD (con el último me emocioné del solo leerlo).<br />
<br />
Para ver qué pasaba, analizo las particiones con "gparted". Primero, entiendo que Datos es simplemente una partición con sistema de archivos NTFS, tal vez para preparar la máquina a una eventual instalación de Windows y así no pierda el usuario todo su trabajo. Pero ¿dónde está la partición SSD?.<br />
<br />
¡Sorpresa!¡No hay! es un dispositivo de almacenamiento a parte, es decir ¡Otro "disco" duro! (disco entrecomillas). Analizo mejor la situación con la "Utilidad de disco" y confirmo que hay dos dispositivos de almacenamiento. Y, como puede apreciarse en la imagen a continuación, el disco adicional es un disco de estado sólido de 32Gb; grata sorpresa:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-44eaFHIp6pY/Uux3Y7Q7-6I/AAAAAAAABwg/J5RiWMian20/s1600/Pantallazo-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-44eaFHIp6pY/Uux3Y7Q7-6I/AAAAAAAABwg/J5RiWMian20/s1600/Pantallazo-3.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-34zc4aVaN3g/Uux1_jhYA-I/AAAAAAAABwY/VLWvt8TWKGo/s1600/Pantallazo-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
Un "disco de estado sólido" es en realidad un dispositivo de almacenamiento muy parecido a los "pen drive" debido a que no tiene ningún "disco" ni piezas mecánicas que hagan girar a los mismos ni controlar los brazos lectores. La diferencia con los "pen drive" es que tienen un tiempo de vida mayor y por lo general mayor capacidad de almacenamiento.<br />
<br />
La primera vez que supe de esta tecnología fue cuando se anunció el Mac Book Air. Una de las varias maneras en las que los diseñadores de Mac lograron reducir el peso de esa portátil fue sustituyendo los discos tradicionales con discos de estado sólido. Con este cambio, no sólo ganaron "ligereza", si no que la velocidad de arranque y de uso en general se incrementó muchísimo.<br />
<br />
Hoy día es muy común que las portátiles utilicen discos de estado sólido por las ventajas descritas, a pesar de sacrificar capacidad de almacenamiento. Hay quienes dicen que 32GB es suficiente, que el resto puede almacenarse en un disco duro externo. También existen versiones híbridas que combinan discos duros de alta capacidad de almacenamiento tradicionales con discos de estado sólido, delegando en el disco de estado sólido el rol de almacenamiento caché.<br />
<br />
Con la misma "utilidad de disco" le hice unas pruebas de velocidad sencillas a los dos discos, sólo por despejar las dudas:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-GRIOlXAddbo/Uux9X8PrzbI/AAAAAAAABw4/U187xbHBM3w/s1600/Pantallazo.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Prueba de velocidad sobre el diso de estado sólido Velocidad promedio de 213,8 MB/s" border="0" src="http://3.bp.blogspot.com/-GRIOlXAddbo/Uux9X8PrzbI/AAAAAAAABw4/U187xbHBM3w/s1600/Pantallazo.png" height="374" title="Prueba de velocidad sobre el diso de estado sólido" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Prueba sobre el disco de estado sólido Velocidad promedio de 213,8 MB/s</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-YlHqSeYhibE/Uux9aEf816I/AAAAAAAABxA/A-Pdg2q5Z2s/s1600/Pantallazo-1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Prueba de lectura sobre el disco normal de 1TB. Velocidad promedio de 91,3 MB/s" border="0" src="http://2.bp.blogspot.com/-YlHqSeYhibE/Uux9aEf816I/AAAAAAAABxA/A-Pdg2q5Z2s/s1600/Pantallazo-1.png" height="372" title="Prueba de lectura sobre el disco normal de 1TB" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Prueba sobre el disco normal de 1TB. Velocidad promedio de 91,3 MB/s</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-AN9o4c26-l0/Uux8KHO5b4I/AAAAAAAABww/GTcSBIU3ShI/s1600/Pantallazo-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
Pues si, es otro dispositivo, y es tan rápido como me lo esperaba. Que interesante ver cómo se mantiene el rendimiento casi constante del disco de estado sólido mientras que el disco normal no puede mantener su rendimiento: debe ser por las propiedades físicas del mismo (discos, brazos mecánicos) y el algoritmo de la prueba.<br />
<br />
Algo que me llama muchísimo la atención es ¿Por qué no está en las especificaciones técnicas de la VIT?. De haberlo sabido hubiera elegido más rápido ese modelo.<br />
<br />
Ahora, me gustaría realmente sacarle provecho a este disco. Creo que debería instalar el Sistema Operativo ahí, o por el contrario, buscar qué recursos necesitan una alta tasa de velocidad de lectura ¿Qué recomendaciones pueden darme?.skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com0tag:blogger.com,1999:blog-15836385.post-41882520972387400682013-10-01T12:00:00.003-04:302014-07-03T13:12:15.078-04:30Tres PPA/Repositorios que he registrado en los últimos días<h2>
ubuntugis-unstable</h2>
Luego de tanto alboroto en la web por el anuncio de <b>QGIS 2.0</b>, decidí probar esta nueva versión de dicha aplicación.<br />
<br />
Siempre había utilizado el <b>PPA</b> estable de <b>ubuntugis</b>. Este <b>PPA</b> es muy interesante ya que compila un conjunto de software muy rico dedicado específicamente a los Sistema de Información Geográfica (<b>SIG</b>), haciendo de <b>Ubuntu</b> una plataforma más que completa para el trabajo de las personas relacionadas con este campo (Geógrafos, geoestadístas, geo*, etc.). Esta compilación la mantiene <a href="https://launchpad.net/~ubuntugis">el equipo ubuntugis en Launchpad</a>.<br />
<br />
Sin embargo, para la fecha, la versión estable del <b>PPA</b> en cuestión no incluye <b>QGIS 2.0</b>. Es por esta razón que registré la versión inestable del <b>PPA</b> de ubuntugis:<br />
<br />
<pre>$ sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable
$ sudo apt-get update
$ sudo apt-get install qgis
</pre>
<h2>
octave-stable</h2>
En un taller de <b>Matlab</b>, que yo estaba realizando <b>Octave</b>, me di cuenta de algunas funcionalidades que no estaban en <b>Octave</b>. Pero <b>Google</b> me decía lo contrario: esas funciones sí están en <b>Octave</b>. El problema es que la versión de <b>Octave</b> que viene en los repositorios oficiales de <b>Ubuntu</b> no es la más actualizada. La solución: instalar el <b>PPA</b> de <a href="https://launchpad.net/~octave">el equipo de Octave en Launchpad</a>.<br />
<br />
<pre>$ sudo add-apt-repository ppa:octave/stable
$ sudo apt-get update
$ sudo apt-get install octave</pre>
<h2>
R</h2>
En el caso de <b>R</b>, no pude conseguir un <b>PPA</b> adecuado en <i>Lauchpad</i>. Siguiendo <a href="http://camoruco.ing.uc.edu.ve/cran/bin/linux/ubuntu/">las instrucciones del proyecto R para instalar R en Ubuntu</a> (el enlace apunta al espejo que está en Venezuela, en la <b>Universidad de Carabobo</b>), añadí el repositorio, registré las llaves de autenticación necesarias, e instalé R. De esta manera, obtuve una versión de <b>R</b> bien actualizada.<br />
<br />
<pre>$ sudo add-apt-repository "deb http://camoruco.ing.uc.edu.ve/cran/bin/linux/ubuntu precise/"
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9
$ sudo apt-get update
$ sudo apt-get install r-base r-recommended littler ess</pre>
<br />
<b>littler</b> permite ejecutar <i>scripts</i> de <b>R</b> de forma más tradicional (a la <b>Unix</b>).<br />
<b>ess</b> es un <i>modo</i> de <b>Emacs</b> para trabajar con <b>R</b>.<br />
<h2>
Reflexión</h2>
Analizando en retrospectiva las acciones descritas, me doy cuenta que lo primero que intento hacer cuando quiero tener una versión actualizada de un software en específico, es conseguir un <b>PPA</b> confiable.<br />
<br />
Los criterios de confianza que aplico son: el <b>PPA</b> de un equipo de trabajo relacionado directamente con el empaquetado en los repositorios de <b>Ubuntu</b>; el <b>PPA</b> del equipo de desarrollo del software; el <b>PPA</b> de alguien reconocido.<br />
Si estos criterios no se cumplen, entonces prefiero descargar el software de los recursos que disponga el mismo equipo de desarrollo de dicho software.skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com0tag:blogger.com,1999:blog-15836385.post-53672226551148090792013-07-31T08:28:00.001-04:302014-07-03T13:14:33.774-04:30PyPy 3<div>
Buenas noticias[1]. Han liberado PyPy3 2.1 beta 1. Es la primera versión de PyPy que es compatible con Python 3.</div>
PyPy es un intérprete de Python que se basa en un compilador JIT (Just In Time [2]) que tiene un desempeño muy competitivo, tanto, que está "postulado" para sustituir el intérprete CPython[3].<br />
<div>
<br />
[1] <a href="http://morepypy.blogspot.fr/2013/07/pypy3-21-beta-1.html" target="_blank">http://morepypy.blogspot.fr/<wbr></wbr>2013/07/pypy3-21-beta-1.html</a><br />
[2] <a href="http://es.wikipedia.org/wiki/Compilaci%C3%B3n_en_tiempo_de_ejecuci%C3%B3n" target="_blank">http://es.wikipedia.org/wiki/<wbr></wbr>Compilaci%C3%B3n_en_tiempo_de_<wbr></wbr>ejecuci%C3%B3n</a></div>
[3] CPython es el intérprete de Python que mantiene la Python Software Foundation, y el más utilizado. Es una implementación de Python escrita en lenguaje C (de ahí su nombre). Se considera la "implementación de referencia".skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com0tag:blogger.com,1999:blog-15836385.post-63549855674198735772012-09-02T22:34:00.000-04:302014-07-03T13:16:29.934-04:30Detalles sobre una instalación nueva de Ubuntu 12.04 en mi oficina<div class="document" id="detalles-sobre-una-instalacion-nueva-de-ubuntu-12-04-en-mi-oficina">
<i>La gran pesadilla hasta ahora ha sido el proxy y el firewall de mi
lugar de trabajo.</i><br />
Desde las versiones 11.X de <i>Ubuntu</i> empecé a utilizar el entorno Unity
de <i>Ubuntu</i>. Al principio no me gustó mucho pero empecé a entender las
razones de su diseño: por ejemplo, el principio de que los píxeles
valen <a class="footnote-reference" href="http://www.blogger.com/blogger.g?blogID=15836385#id2" id="id1">[1]</a>. Luego de darle una oportunidad y en la medida en que iba
actualizando mi sistema hasta llegar al 12.04, creo que ya Unity tiene
bastante madurez y puedo decir que me gusta el entorno. Ahora, en ese
proceso he venido acarreando las aplicaciones que tenía instalada
desde el 11.X y se que hubo muchos cambios en cuanto a las
aplicaciones instaladas por omisión en un entorno <i>Ubuntu</i>. Así que
por la curiosidad de entender qué es lo que la gente de <i>Ubuntu</i> define
como su escritorio (si es que podemos seguir usando esa metáfora o ya
es hora de pensar en una nueva) o mejor dicho, su sistema, quise hacer
una instalación desde cero y darle una oportunidad a las aplicaciones
que ellos sugieren y experimentar bien cómo se integran al resto del
sistema (y cómo lo hacen, es algo que también me llama la atención);
excepción: Emacs, ya instalado.<br />
Sin embargo, hacer esto en una organización que tiene un <i>firewall</i> y
un <i>proxy</i> clásicos, no es tan divertido. Así que quise dejar aquí
algunas notas de las cosas que tuve que tomar en cuenta antes y
después de la instalación desde cero en mi oficina.<br />
<table class="docutils footnote" frame="void" id="id2" rules="none">
<colgroup><col class="label"></col><col></col></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="http://www.blogger.com/blogger.g?blogID=15836385#id1">[1]</a></td><td>Tal vez hago referencia a otro libro acerca de diseño, pero
solo con ir a la Guía del escritorio de Ubuntu se puede uno
enterara de que el diseño del nuevo Ubuntu busca minimizar las
distracciones, aumentar el espacio de trabajo y ayudar al
usuario a realizar sus tareas.</td></tr>
</tbody>
</table>
<div class="section" id="respaldo">
<h4>
Respaldo</h4>
Por supuesto, este es el primer paso. Respaldar los datos importantes:
documentos, imágenes, música, etc. Basta con copiarlos en un medio de
almacenamiento externo como un CD/DVD o un disco duro externo.<br />
Sin embargo, con respecto a los correos electrónicos y los contactos
tuve que hacer algunos pasos adicionales.<br />
Primero, he estado usando <i>Evolution</i> hasta ahora. Por ahora bastaría
con el respaldo clásico, y se supone que importar esos correos desde
<i>Thunderbird</i> es directo porque teóricamente usan el mismo formato de
correo: <a class="reference external" href="http://es.wikipedia.org/wiki/Mbox">Mbox</a>. Sin embargo, hay una consideración en mi caso:
había usado <i>Evolution</i> desde hace tiempo que me enteré que tenía los
correos en un formato de correo viejo: <a class="reference external" href="http://es.wikipedia.org/wiki/Maildir">Maildir</a> que es
mejor exportarlos a <i>Mbox</i> antes de hacer el respaldo, para que no
tenga que instalar <i>Evolution</i> al final para poder transformar los
correos a <i>Mbox</i> (tal vez no fuera necesario, pero era un riesgo que
no tenía que pasar). Para esto, usé un <i>script</i> que recomendaron en <a class="reference external" href="http://askubuntu.com/a/132674/10580">una
respuesta en AskUbuntu</a> . Al final, el respaldo es un archivo en
formato <i>Mbox</i> que debe guardarse en el medio de respaldo elegido.<br />
Con respecto a los contactos desde <i>Evolution</i>, simplemente clic
derecho a la libreta que se quiera respaldar y se exporta (normalmente
a formato <i>Vcard</i>)<br />
Luego del respaldo, viene la instalación. No escribiré al respecto,
solo que instalé de la forma más directa: <i>"siguiente siguiente
siguiente"</i>.</div>
<div class="section" id="la-red-el-caso-del-proxy">
<h4>
La Red (el caso del Proxy)</h4>
<i>Si tienes una computadora portátil, sufrirás las consecuencias de
hacer todo lo que aquí se indica, porque cada vez que se cambie de
lugar de acceso a Internet, habrá que volver a configurar el proxy.</i><br />
Después de instalar el sistema lo primero que se haría es actualizar
el sistema, pero esto no es tan trivial en mi oficina. Primero se debe
configurar la red.<br />
Si fuera el caso de una computadora nueva en la organización, habría
que decirle al departamento de <i>IT</i> cuál es la dirección <i>MAC</i> de la
máquina. Pero ya que estoy usando la misma máquina de siempre, no hace
falta.<br />
Luego, conectarse no debería ser muy difícil en <i>Ubuntu</i>: se conecta
el cable y listo, o si se quiere usar la red inalámbrica, basta con
colocar la contraseña cuando se pida.<br />
La parte fastidiosa del cuento es el <i>proxy</i>.<br />
<div class="section" id="le-proxy">
<h5>
Le Proxy</h5>
El malo de la película. No tienen idea cuánto lo odio, cuántas horas
me ha hecho perder... ¡TE ODIO PROXY!. (Proxy suena a nombre de
mujer, tenía que ser, que mujer tan enrollada).<br />
El problema es que aparentemente soy la primera persona en la
organización que no usa la Internet solo con <i>Firefox</i>, sino que a
veces necesito <i>wget</i> y/o <i>curl</i>, bajar cosas con <i>Emacs</i> (paquetes de
<i>Emacs</i>), <i>Gwibber</i> para el <i>Twitter</i>, todo el tema de <i>APT</i> para
mantener mi sistema actualizado (y como no existe un repositorio en la
organización...) o a veces conexiones no <i>web</i>: <i>IRC</i> y <i>FTP</i> por
ejemplo (esta última parte no entiendo qué tiene que ver con el proxy,
pero es así, aparentemente; si alguien puede explicarme por qué puede
un <i>proxy</i> como <i>squid</i> fastidiar al <i>IRC</i>, se lo agradezco).<br />
Bueno, empezamos con lo básico. La configuración del <i>proxy</i> en <i>Ubuntu</i>
se hace en la configuración de red: <b>SUPER</b> seguido de 'red' y
<b>ENTER</b>, o en el menú de configuración que se encuentra en el menú
de arriba a la derecha.<br />
Ahí hay una configuración por cada interfaz de red que tenga la
máquina y por último está la configuración del <i>proxy</i>. Se puede
determinar que no hay <i>proxy</i>; o configurar un <i>proxy</i> manualmente, en
cuyo caso habría que colocar el <b>nombre</b> o la <b>IP</b> del <i>proxy</i> y
el <b>puerto</b>; o, como en mi caso, la configuración automática, en
donde se coloca la <b>url</b> de <a class="reference external" href="http://en.wikipedia.org/wiki/Proxy_auto-config">un archivo de configuración
automático</a>.<br />
En un mundo ideal, esto debería bastar: todas las aplicaciones que
eventualmente hagan uso de la web deberían verificar esta
configuración para saber cómo usar el <i>proxy</i>. Pero en este aspecto,
<i>Ubuntu</i> no es para nada ideal. Aquí una opinión: ¿Cómo es que con la
configuración de red de <i>Gnome</i> basta para que todas las otras
aplicaciones se puedan conectar a la red pero no puedan saber cuál es
el <i>proxy</i>. El problema es peor y más triste aún: hay aplicaciones
gráficas (de <i>Gnome</i>) que no usan esta configuración del <i>proxy</i>, por
ejemplo <i>Gwibber</i> y <i>Empathy</i> (de hecho, hasta ahora no he podido
resolver esto, así que me conecto al <i>IRC</i> por el <i>webirc</i> de
<i>Freenode</i>).<br />
Para que aplicaciones como <i>wget</i> y <i>curl</i> funcionen con el <i>proxy</i>,
deben estar definidas las variables de entorno <i>http_proxy</i> y
<i>https_proxy</i>.<br />
Las variables de entorno <i>http_proxy</i> y <i>https_proxy</i> deben tener la
<i>url</i> de conexión al <i>proxy</i> de la organización. Para que queden
permanentemente establecidas esas variables, se coloca lo siguiente en
el archivo <i>.bashrc</i> (ajustar a cada caso):<br />
<pre class="literal-block">http_proxy="http://proxy.leorg.org:1080/"
https_proxy="https://proxy.leorg.org:1080/"
export http_proxy https_proxy
</pre>
Todavía falta algo para poder hacer un <i>apt-get update</i>. Resulta que
al hacer <i>sudo apt-get update</i> las variables de entorno se pierden,
así que para mantenerlas hay que invocar <i>sudo</i> con la opción
<i>-E</i>. Pero si queremos usar las interfaces gráficas de <i>APT</i>, como el
<i>Gestor de actualización</i> o el <i>Centro de software de Ubuntu</i> hay un
problema: ellos no los invocamos normalmente desde la <i>consola</i>, así
que no tenemos tiempo de pasarles las variables de entorno a través
del <i>sudo</i>.<br />
La solución, seguir las recomendaciones de <a class="reference external" href="https://help.ubuntu.com/community/AptGet/Howto#Setting_up_apt-get_to_use_a_http-proxy">este artículo</a>, editar
el archivo <i>apt.conf</i>:<br />
<pre class="literal-block">Acquire::http::Proxy "http://proxy.leorg.org:1080";
Acquire::https::Proxy "http://proxy.leorg.org:1080";
</pre>
Pero hay un detalle que todavía causa problemas con las interfaces
gráficas de <i>APT</i> y el <i>proxy</i>. A veces, un paquete invoca algún
<i>script</i> durante el proceso de instalación, y este puede a su vez
intentar conectarse a la web con programas como <i>wget</i>. Bueno, como es
gráfico y obtuvo las credenciales por otro medio diferente de <i>sudo</i>
(por lo cual no le pudimos decir con la opción <i>-E</i> que conserve las
variables de entorno) entonces, ese <i>wget</i> no va a saber cómo
conectarse al <i>proxy</i>. La solución, es fijar las variables de entorno
del <i>proxy</i> al <i>sudo</i>. Para ello se usa el programa <i>visudo</i> y se
agrega lo siguiente:<br />
<pre class="literal-block">Defaults env_keep = "http_proxy https_proxy ftp_proxy"
</pre>
Con todo esto, ya tenemos bien dominado a todo lo que es <i>APT</i>, y varias
aplicaciones que no toman la configuración de <i>Gnome</i>, pero todavía me
quedan pendientes:<br />
<ol class="arabic simple">
<li>Emacs y ELPA</li>
<li>Empathy</li>
<li>Gwibber</li>
</ol>
IRC no web es lo que más extraño.</div>
</div>
<div class="section" id="restauracion">
<h4>
Restauración</h4>
Para la restauración del respaldo, solo con respecto al correo y los
contactos fue algo diferente a trivial (de resto, una simple copia).<br />
Instalé el complemento de <i>Thunderbird</i> llamado <i>ImportExportTools</i>,
luego hay que darle clic derecho a la <b>bandeja de entrada</b>, menú
<b>Importar/Exportar</b>, opción <b>Importar mbox</b> y elegir <b>Importar
uno o más archivos con sus subcarpetas</b>. En ese momento, una ventana
de diálogo te permite elegir el archivo <i>mbox</i> a importar, que será el
que se respaldó antes de instalar <i>Ubuntu</i>.<br />
Los contactos se importan desde la vista de <b>Libreta de
direcciones</b>, en el menú <b>Herramientas</b>, opción <b>Importar</b>.</div>
<div class="section" id="algunos-paquetes-que-instale-luego">
<h4>
Algunos paquetes que instalé luego</h4>
<div class="section" id="emacs">
<h5>
Emacs</h5>
La versión de <i>Emacs</i> que proveen los repositorios oficiales de
<i>Ubuntu</i> es la 23. Pues la versión 24 trae una gran cantidad de
<a class="reference external" href="http://www.gnu.org/software/emacs/#Releases">mejoras</a> que no quería perderme, entre los que más me interesan está
el nuevo sistema de gestión de paquetes ya oficialmente soportado por
<i>Emacs</i>.<br />
Para poder instalarlo <i>a la Ubuntu</i> registré <a class="reference external" href="https://launchpad.net/%7Ecassou/+archive/emacs">un PPA</a> (<i>Personal
Package Archive</i>) que mantiene unos paquetes de <i>Emacs</i> bien
actualizados. Lo conseguí gracias a este <a class="reference external" href="http://www.mikeyboldt.com/2011/11/30/install-emacs-24-in-ubuntu/">artículo</a>.<br />
Los pasos que seguí:<br />
<pre class="literal-block">$ sudo apt-get update
$ sudo add-apt-repository ppa:cassou/emacs
$ sudo apt-get update
$ sudo apt-get install emacs24 emacs24-el
</pre>
Con esto ya tenemos el Emacs24 instalado. Irónicamente, el sistema de
gestión de paquetes, la principal razón de instalar esta versión de
<i>Emacs</i>, no funciona al 100% porque el <i>proxy</i> no le permite
conectarse a los repositorios. Se puede configurar el <i>proxy</i> en
Emacs, pero no he podido hacer que funcione todavía.<br />
Otra cosa que tengo pendiente es instalar el soporte completo al
idioma español en <i>Emacs</i> y el diccionario de <i>Aspell</i>.</div>
<div class="section" id="retoque-a-libreoffice">
<h5>
Retoque a LibreOffice</h5>
De <a class="reference external" href="http://www.webupd8.org/2012/04/things-to-tweak-after-installing-ubuntu.html">un excelente artículo</a> acerca de cosas que retocar en <i>Ubuntu</i>
después de instalarlo, rescaté, entre otras cosas, la habilitación del
menú global para LibreOffice.<br />
Lamentablemente en esta nueva versión de <i>Ubuntu</i> LibreOffice no hace
uso del menú global, que es la nueva forma de interactuar con las
aplicaciones en <i>Ubuntu</i>, exactamente igual que en <i>MacOS</i>. Se trata
de que el menú de todas las aplicaciones se funde con la barra
superior del sistema que ya contiene otras cosas como el espacio para
las notificaciones, ahorrando bastantes píxeles verticales (que
aparentemente son más importantes que los horizontales, ya que el
lanzador no desaparece de manera automática como hacía antes).<br />
Para hacer que LibreOffice respete el menú global, basta con instalar
el paquete <i>lo-menubar</i>:<br />
<pre class="literal-block">$ sudo apt-get install lo-menubar
</pre>
</div>
<div class="section" id="restricted-extras">
<h5>
Restricted Extras</h5>
Sin entrar en polémicas, por los mp3 y otros formatos de video:<br />
<pre class="literal-block">sudo apt-get install ubuntu-restricted-extras
</pre>
Cabe acotar que este paquete invoca a un <i>script</i> que intenta bajar
archivos de la <i>Web</i>. Si el <i>proxy</i> no está configurado en <i>sudoers</i>
(y en todos lados por si a caso) entonces fallará.</div>
<div class="section" id="y-para-escribir-en-el-blog">
<h5>
Y para escribir en el blog</h5>
<ul class="simple">
<li>python-docutils</li>
<li>rst2pdf</li>
<li>mercurial</li>
</ul>
Solo faltaría configurar <i>mercurial</i> con por lo menos los datos
personales del usuario:<br />
<pre class="literal-block">$ cat > ~/.hgrc
[ui]
username = Jesús Gómez <jgomo3@gmail.com>
Ctrl-D
</pre>
</div>
</div>
<div class="section" id="siempre-me-toca-hacer-lo-siguiente-en-el-terminal-de-gnome">
<h4>
Siempre me toca hacer lo siguiente en el Terminal de Gnome</h4>
Estoy muy acostumbrado a las combinaciones de teclas de <i>Emacs</i> en el
terminal, pero la tecla <b>ALT</b> y <b>F10</b> disparan otros eventos
propios del entorno gráfico (seleccionan el menú de la aplicación, en
este caso el terminal de <i>Gnome</i>).<br />
Para evitar que esto pase y funcionen como en <i>Emacs</i>, se modifican
las configuraciones pertinentes en la opción <b>Combinaciones de
teclas...</b> en el menú <b>Editar</b>. Ahí, se desactivan las teclas de
acceso al menú y <b>F10</b>.</div>
<div class="section" id="decepciones">
<h4>
Decepciones</h4>
<ul class="simple">
<li>¡¡¡PROXY!!! No entiendo cómo no hay una solución única a este rollo.</li>
<li>Tenía la esperanza de que una actualización limpia desapareciera ese
bug de Firefox tan maldito: arrastra una imagen y <b>TODO</b> el
sistema se congela por un minuto aproximadamente.</li>
</ul>
</div>
</div>
skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com1tag:blogger.com,1999:blog-15836385.post-65399665336809717812012-02-09T20:15:00.001-04:302012-02-09T20:16:37.013-04:30Mejorar como programadores - El Comienzo<div class="document" id="mejorar-como-programadores-el-comienzo">
<div class="section" id="la-idea">
<h1>
La Idea</h1>
Inspirados en el artículo <a class="reference external" href="http://blog.rubybestpractices.com/posts/gregory/062-practicing-programming-group.html">Kicking ass together: How to improve coding
skills as a group</a>, Luis y yo escribimos este artículo como un
preámbulo a una etapa de trabajo en la que pretendemos implementar
algunas de las ideas ahí planteadas.<br />
El martes 10 de enero concertamos una reunión personal en el café de
la nueva plaza de Los Palos Grandes. Muy buen lugar para el
esparcimiento y reunirse. Tres copias impresas del artículo que se
procesaron exageradamente con <a class="reference external" href="http://lab.arc90.com/experiments/readability/es/">Readability</a> (digo exageradamente porque
pare ser sincero, no era necesario) sirvieron de guía durante la
reunión, en la cuál principalmente hablamos de dicho artículo y de
cómo llevar a cabo esas ideas aplicándolas en nuestro contexto.<br />
El artículo es de gran interés para nosotros porque llevamos tiempo
realizando reuniones que seguían más o menos esas ideas; pero al
verlas condensadas en un solo texto, integradas, y ejecutadas
inteligentemente, reconocimos su gran valor.<br />
Otro artículo que nos motivó bastante fue <a class="reference external" href="http://matt.might.net/articles/programmers-resolutions/">12 resolutions for
programmers</a> que apunta básicamente a las mismas motivaciones del
primer artículo: <b>Ser mejor persona para ser mejor programador</b>
(sustituye programador con lo que quieras y sirve igual). Queremos
mejorar nuestras habilidades, de eso no hay duda, y sabemos que en
<b>Buen</b> equipo lo haremos de mejor manera: más rápido, más amplio,
más seguro (más probable).<br />
<a class="reference external" href="http://www.workatjelly.com/">La gente de Jelly hizo algo similar</a>. El enfoque que le dieron es el
de "vamos a llevar el ambiente de oficina a otra parte".<br />
Al finalizar el año, haremos un análisis de lo logrado con este
<i>meta-proyecto</i>.</div>
<div class="section" id="el-grupo">
<h1>
El Grupo</h1>
Todas las ideas planteadas en los artículos mencionados (a excepción
del de las doce resoluciones), o en las reuniones que hemos tenido,
giran alrededor del concepto de un <b>grupo</b>. Sería entonces el medio
más importante para lograr el objetivo de mejorar personalmente. Así
que uno de los primeros objetivos a corto plazo sería la consolidación
del mismo.<br />
Siguiendo las recomendaciones de los textos, y la experiencia propia,
planteamos al grupo como un ente orgánico, en el sentido de que su
evolución sea lo más natural posible, es decir, no forzaremos su
crecimiento, las iniciativas deben venir de las bases y los objetivos
y actividades serían planteadas en función de la madurez del grupo, es
decir, ya tendremos tiempo para un <b>BigDeepShitCON</b>, pero por ahora,
proyectos concretos y tangibles en corto plazo son nuestros objetivos.<br />
Como ejemplo de estos proyectos:<br />
<dl class="docutils">
<dt><b>Hack 7 Languagess in 7 weeks</b></dt>
<dd>El libro <a class="reference external" href="http://pragprog.com/book/btlang/seven-languages-in-seven-weeks">Seven Languagess in Seven Weeks</a> pretende explicarle a
entendidos en la programación, siete lenguajes representativos de
los más diferentes paradigmas de programación. Entonces, como
actividad de grupo nos hemos planteado leer este libro y comentarlo
entre nosotros, hacer los ejercicios y comparar las soluciones y/o
simplemente apoyarnos mutuamente en el seguimiento del mismo.</dd>
<dt><b>Track le blogs</b></dt>
<dd>Una de las resoluciones asumidas fue la de mantener
un blog. Entonces, en el grupo nos apoyaremos leyendo los blogs de
los compañeros y generando feedback.</dd>
<dt><b>Maratonear</b></dt>
<dd>Para mantener a punta nuestras habilidades esenciales de la
programación, haremos ejercicios concertados de programación
clásicos de los maratones. Como ejemplo, los problemas de <a class="reference external" href="http://spoj.pl/">spoj</a>,
luego de solucionarlos, compararemos las soluciones, y también
discutiremos ideas durante el desarrollo de las soluciones.</dd>
<dt><b>Desarrollo de aplicaciones</b></dt>
<dd>Siempre surgen ideas de aplicaciones útiles durante las
reuniones. Podemos ejercitar el trabajo en un buen equipo de
desarrollo de software implementando estas ideas en el marco del
<i>meta-proyecto</i>.</dd>
</dl>
Para materializar los resultados esperados, el trabajo se realizaría
en sesiones <b>presenciales</b> y <b>no presenciales</b>.<br />
<div class="section" id="sesiones-de-trabajo-presenciales">
<h2>
Sesiones de trabajo presenciales</h2>
Con el objetivo claro de <b>mejorar</b> y tomando el artículo como guía,
nos propusimos realizar un conjunto de sesiones periódicas de trabajo.
Éstas consistirán en una hora de <b>trabajo</b> y una hora de
<b>socialización</b>. Entendemos que, para mejorar, ambas actividades
son igual de importantes.<br />
Las sesiones de trabajo deben incorporar actividades que mejoren las
habilidades de cada uno de los participantes. Algunas de las
actividades que identificamos que cumplen con este requisito son
solucionar problemas de programación, hacer <i>code reviews</i>, etc.<br />
En estas sesiones de trabajo, también se podrán realizar charlas de
interés para los participantes del grupo.<br />
Las sesiones de trabajo y socialización están abiertas a cualquiera
que quiera asistir a ellas, y la única condición es <i>participar</i> y
<i>aportar</i> desde el primer momento. Cualquier comentario dentro de
contexto se considera participación.</div>
<div class="section" id="sesiones-de-trabajo-en-linea">
<h2>
Sesiones de trabajo en linea</h2>
Siguiendo el ejemplo de numerosos proyectos de Software Libre, resulta
sencillo ejecutar de manera remota casi la totalidad de las
actividades que nos hemos planteado. Nos referimos a las herramientas
clásicas de las que se valen estos proyectos para coordinar el trabajo
de tantos participantes localizados en lugares remotos del globo, a
saber: Sistemas de Control de Versiones Descentralizados,
documentación en línea, IRC, wikis, blogs, etc.</div>
</div>
<div class="section" id="el-comienzo">
<h1>
El Comienzo</h1>
Puede interpretarse como una nueva disciplina. Tal vez como un simple
programa de ejercicios rutinarios. Tal vez un hobby. En cualquier
caso, se trata de algo positivo.<br />
Pero lo que sí es cierto, es que lo que hemos escrito, es los planes
de su primera etapa (sea lo que sea).</div>
</div>skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com1tag:blogger.com,1999:blog-15836385.post-30073120539211291872011-11-23T15:24:00.001-04:302011-11-24T12:32:31.406-04:30Ciclo redactar publicar con Blogger<div class="document" id="ciclo-redactar-publicar-con-blogger">
Tengo la intención de escribir varios artículos en este blog:<br />
<ul class="simple">
<li><i>Despliegue</i> en <b>Django</b></li>
<li>Mi presentación de <b>Git</b></li>
<li>La conferencia <i>Mejorando la web</i></li>
<li>Cita al ensayo sobre SOPA creado por @danielmaxx</li>
<li>Algunas cosas viejas que escribí por ahí</li>
</ul>
Pero habiendo colaborado en algunas revisiones de <a class="reference external" href="http://blog-es.python.org/">El blog en español
de Python Insider</a> quise poner en práctica el mismo <i>workflow</i> que
ellos aplican. Y es lo que estoy haciendo justamente ahora mientras
escribo este artículo acerca del mismo <i>workflow</i> (y lo que haré de
ahora en adelante).<br />
<div class="section" id="le-workflow">
<h4>
Le <i>workflow</i></h4>
El mencionado <i>workflow</i> está explicado en el <a class="reference external" href="https://bitbucket.org/PSF/blog/wiki/Blogging">wiki del proyecto de
los blogs de Python</a>. Pero básicamente se basa en utilizar un
repositorio bajo <i>control de versiones</i> donde un convenio en el uso de
los directorios permite distribuir el trabajo.<br />
La parte interesante del <i>workflow</i> es que el trabajo de redacción no
se hace en la interfaz que para ello disponga el sitio que almacena y
publica los artículos (en nuestro caso, la interfaz web de
<b>Blogger</b>), sino que se redacta en un archivo dedicado al artículo,
y ese archivo se mantiene en control de versiones. Luego, cuando se
esté conforme con el resultado, se publica utilizando un <i>script</i> que
sube el archivo como si fuera el artículo (también pudiera usarse el
<i>copiar y pegar</i> con la interfaz web).<br />
En particular, el <i>proyecto de los blogs de Python</i> utiliza <a class="reference external" href="http://mercurial.selenic.com/">mercurial</a>
como sistema de control de versiones, <a class="reference external" href="http://bitbucket.org/">bitbucket</a> es donde almacenan su
repositorio, <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> es el lenguaje de marcas que utilizan
para estructurar y formatear los artículos y un <a class="reference external" href="https://bitbucket.org/PSF/blog/src/61b782e6582b/bin">script en Python</a> <a class="footnote-reference" href="http://www.blogger.com/blogger.g?blogID=15836385#id3" id="id1">[1]</a>
muy específico para subir el archivo al blog.<br />
Una de las más grandes ventajas de trabajar de esta manera es el
soporte en la coordinación del trabajo de varias personas sobre el
mismo producto que se obtiene al usar el sistema de control de
versiones y un repositorio compartido.<br />
Pero cuando se usa para un blog como el mío que solo tiene un autor,
todavía hay ventajas.<br />
Primero, el control de versiones. Pero esta vez, en vez de referirme
al poder de coordinación, me refiero a la ventaja de contar con
versiones que reflejen la evolución de lo que escribo y poder echar
para atrás los cambios que quiera.<br />
Segundo, escribir en tu <i>lenguaje de marcas</i> preferido ... punto.<br />
Tercero, escribir en tu editor de texto preferido ... punto.</div>
<div class="section" id="ejemplo">
<h4>
Ejemplo</h4>
Como ejemplo de cómo trabajar con este <i>workflow</i> voy a explicar cómo
he escrito esta entrada y cómo lo publiqué.<br />
<div class="section" id="le-script">
<h5>
Le <i>script</i></h5>
El <a class="reference external" href="https://bitbucket.org/PSF/blog/src/61b782e6582b/bin">script en Python</a> se llama <tt class="docutils literal">rst2blogger.py</tt>. Se usa la siguiente
manera:<br />
<pre class="literal-block">$ rst2blogger.py <blog> <.rst>
</pre>
Lo que hace es convertir el archivo <tt class="docutils literal">.rst</tt> en un contenido en
formato <b>html</b> y trata de subir ese contenido en el blog
<tt class="docutils literal">blog</tt>. Para ello te pide que te autentifiques con los servicios de
<i>Google</i>.<br />
Como este es un script que rápidamente se hizo para este workflow de
los blogs de <b>Python</b>, entonces hay que modificarlo un poco para que
sirva con el de uno.<br />
Lo primero que hace el <i>script</i> después de todos los <i>imports</i> es
definir un diccionario llamado <tt class="docutils literal">BLOG_IDS</tt>, asocia una etiqueta al
identificador único del blog. Entonces, simplemente se añade el blog
de uno en ese diccionario. Por ejemplo, el identificador único de mi
blog es <tt class="docutils literal">15836385</tt> <a class="footnote-reference" href="http://www.blogger.com/blogger.g?blogID=15836385#id4" id="id2">[2]</a>, entonces asocie el identificador <tt class="docutils literal">jgomo3</tt> con
él. Queda algo así:<br />
<pre class="literal-block"># local
import rst2post
BLOG_IDS = {
'jgomo3':'15836385', # jgomo3's blog
'clienttest':'4574580403850978202',
</pre>
Hay que aclarar dos cosas acerca del <i>script</i>:<br />
<ul class="simple">
<li>Él pica el contenido en dos partes: el título, y el resto. Entonces,
el título con el que sube el artículo va a ser el que le coloques
como título principal en el <tt class="docutils literal">.rst</tt>.</li>
<li>La primera vez sube el artículo como un borrador nuevo. Las
siguietes veces que publique el mismo blog, simplemente actualiza el
blog. Para publicar, se hace desde la interfaz administrativa de
<b>Blogger</b>.</li>
</ul>
Como alternativa a este script, pudiera lograrse algo parecido con una
combinación entre <tt class="docutils literal">rst2html</tt> y <a class="reference external" href="http://code.google.com/p/googlecl/">googlecl</a>.</div>
<div class="section" id="le-repo">
<h5>
Le repo</h5>
Creé <a class="reference external" href="https://bitbucket.org/jgomo3/jgomo3-blog">un repositorio en bitbucket</a> para mantener el blog (de ahora en
adelante).<br />
Luego, lo cloné en mi máquina para trabajar:<br />
<pre class="literal-block">$ hg clone https://bitbucket.org/jgomo3/jgomo3-blog
</pre>
Siguiendo el convenio de los blog de <b>Python</b>, definí dos
directorios:<br />
<ul class="simple">
<li><b>InProgress</b>: que contiene los artículos "en progreso", es decir,
los borradores.</li>
<li><b>Published</b>: que contiene los artículo ya publicados en el blog.</li>
</ul>
<pre class="literal-block">$ install -d InProgress Published
</pre>
Entonces, el trabajo es evidente. Cuando se quiere empezar un nuevo
artículo, simplemente se crea un archivo en la carpeta
<tt class="docutils literal">InProgress</tt>. Luego, un <tt class="docutils literal">hg add</tt> para hacerle seguimiento con
<a class="reference external" href="http://mercurial.selenic.com/">mercurial</a>. <tt class="docutils literal">hg commit</tt> por cada cambio relevante que queremos
recordar con <a class="reference external" href="http://mercurial.selenic.com/">mercurial</a> y cuando queramos salvaguardar el trabajo en
<a class="reference external" href="http://bitbucket.org/">bitbucket</a>, un <tt class="docutils literal">hg push</tt> (así además puedes mostrar el trabajo a
terceros para que le echen un ojo y si quieren pueden colaborar).<br />
<pre class="literal-block">$ cd InProgress
$ hg add ciclo-redactar-publicar-blogger.rst
... Ciclo largo de trabajo
.
. ... Ciclo corto de trabajo
. . $ [tu editor favorito o emacs] ciclo-redactar-publicar-blogger.rst
. . $ rst2html ciclo-redactar-publicar-blogger.rst > test.html
. . # Ver el archivo test.html en un navegador
. ...
.
... $ hg commit
$ hg push
</pre>
</div>
<div class="section" id="le-blog">
<h5>
Le blog</h5>
Una vez esté terminado el artículo y se quiera publicar en el blog, se
ejecuta el script:<br />
<pre class="literal-block">$ rst2blogger.py jgomo3 ciclo-redactar-publicar-blogger.rst
</pre>
Esto creará un borrador en <b>Blogger</b>. Entonces se navega a
<b>Blogger</b>, se aprecia cómo se ve el borrador, se le asigna la fecha
de publicación al artículo y se publica.<br />
Por último, se mueve el artículo de la carpeta <b>InProgress</b> a la
carpeta <b>Published</b> y se actualiza el repositorio en <a class="reference external" href="http://bitbucket.org/">bitbucket</a>:<br />
<pre class="literal-block">$ hg mv ciclo-redactar-publicar-blogger.rst ../Published
$ hg commit
$ hg push
</pre>
</div>
<div class="section" id="le-fin">
<h5>
Le <i>FIN</i></h5>
Como ya comenté, de ahora en adelante usaré esta técnica para escribir
en el blog.<br />
Por último, por si no lo notaron, mi editor favorito es <a class="reference external" href="http://www.gnu.org/software/emacs/">Emacs</a>, y dejo
a su disposición un par de artículos que explican esta misma idea pero
desde el punto de vista de un par de emacseros y usuarios del
<a class="reference external" href="http://orgmode.org/">org-mode</a>.<br />
<ul class="simple">
<li><a class="reference external" href="http://emacs-fu.blogspot.com/2009/05/writing-and-blogging-with-org-mode.html">emacs-fu way</a></li>
<li><a class="reference external" href="http://blog.ideabulbs.com/2011/10/howto-publishing-to-blogger-from-emacs.html">Andrei's way</a></li>
</ul>
<table class="docutils footnote" frame="void" id="id3" rules="none">
<colgroup><col class="label"></col><col></col></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="http://www.blogger.com/blogger.g?blogID=15836385#id1">[1]</a></td><td>Deben estar todos los archivos <cite>.py</cite> en el mismo lugar.</td></tr>
</tbody>
</table>
<table class="docutils footnote" frame="void" id="id4" rules="none">
<colgroup><col class="label"></col><col></col></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="http://www.blogger.com/blogger.g?blogID=15836385#id2">[2]</a></td><td>Para saber cuál es el identificador único de tu blog en
<b>Blogger</b> simplemente observa la barra de direcciones
de tu navegador mientras lo editas.</td></tr>
</tbody>
</table>
</div>
</div>
</div>skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com1tag:blogger.com,1999:blog-15836385.post-89719325989632760942011-02-17T07:54:00.000-04:302011-02-17T07:54:44.016-04:30Huxley<blockquote><span class="Apple-style-span" style="color: #444444; font-family: Georgia, serif; font-size: 16px; font-style: italic; line-height: 21px;">La historia muestra que la mente humana, alimentada por constantes accesos de conocimiento, crece periódicamente demasiado para soportar los recubrimientos teóricos, y explota en pedazos para aparecer con una nueva vestimenta, de la misma manera que la larva en crecimiento, cada cierto tiempo, se deshace de una piel demasiado estrecha y se viste con otra, que de nuevo será temporal. Ciertamente, el estado de imago del Hombre parece estar terriblemente distante, pero cada muda es un paso ganado, de los que habrá muchos. [] … una nueva ecdisis parece inminente.</span></blockquote>Thomas H. Huxley.<br />
<br />
<b>Fuente:</b><br />
<br />
<ul><li><a href="http://amazings.es/2011/02/16/ecdisis-inminente/">Ecdisis inminente - Amazings.es</a></li>
</ul><div><br />
</div><b></b><br />
<b></b>skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com0tag:blogger.com,1999:blog-15836385.post-59093576261450629182010-09-20T13:17:00.005-04:302011-02-17T08:17:12.964-04:30Recuerdos de Pandora<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="http://recuerdosdepandora.com/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="89" src="http://2.bp.blogspot.com/-aN-oFO8SdYU/TV0XwQRTJgI/AAAAAAAABM4/E5XFaB3Yceg/s640/recuerdosdepandora.jpg" width="640" /></a></div><br />
Un excelente blog con artículos de científicos y de interés general.<br />
Este blog lo leo a diario, encuentro la totalidad de sus artículos muy interesantes y de un buen nivel y siempre cuenta con las respectivas fuentes para el que quiera profundizar más en el tema.<br />
Al leer cualquiera de sus artículos, se apreciará la dedicación que se da a cada uno de ellos.<br />
Bueno, simplemente quiero dedicar esta entrada a recomendar que lo lean, suscribanse y si les gusta de verdad, <a href="http://bitacoras.com/premios10/votar/recuerdosdepandora.com">voten por él</a>skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com0tag:blogger.com,1999:blog-15836385.post-84581036057435070782010-07-27T00:25:00.001-04:302010-07-27T11:08:22.768-04:30Python ¿qué tiene 3 que no tenga 2?Esta inquietud ha rondado por la cabeza de muchos desde que salió Python 3.0. En la lista de <a href="http://groups.google.com/group/python-caracas">python-caracas</a> Nhomar hace una <a href="http://groups.google.com/group/python-caracas/browse_thread/thread/6e8d20ec397d3b97">pregunta simlar</a> que se reduce a "Técnicamente, cuáles son las ventajas que traerá el python 3.X???". Más allá de los detalles menores como el hecho de que <strong>print</strong> ya no es una sentencia del lenguaje sino una función integrada, la inquietud real es saber ¿qué tiene Python 3 que no tenga Python 2?.<br />
<br />
Luego de leer al respecto en varias fuentes, la respuesta que daré puede ser rara para algunos: <strong>nada</strong>. De echo, tiene menos. Quieren probarlo, solo les diré que es más fácil hacer que un código en Python 3 corra en Python 2 que lo contrario: puede verse a Python 3 como un subconjunto de Python 2.<br />
<br />
No quiero escribir sobre <a href="http://docs.python.org/release/3.0.1/whatsnew/3.0.html">lo nuevo de Python 3</a> (ya que pueden encontrar mucho material al respecto) sino de lo que he entendido fue la inspiración de Python 3.<br />
<br />
Python 3 fue diseñado para honrar el principio "debe haber una-- y preferiblemente una --manera obvia de hacerlo" del Zen de Python[1].<br />
<br />
Python 3 ha sido un intento por pulir aún más este lenguaje de pequeños detalles que sus creadores sentían incómodos y existían solo para mantener la compatibilidad hacia atrás del lenguaje. La solución fue eliminar esta compatibilidad. Parafraseando a Guido: "Es una oportunidad que él mismo se está dando para corregir esas decisiones de diseño equivocadas que tomó al principio del desarrollo de Python que no podría corregir sin romper el código de todos"[2].<br />
<br />
Los <a href="http://docs.python.org/release/3.0.1/whatsnew/3.0.html#library-changes">cambios en la biblioteca</a> dan testimonio de que se trata de una cuestión de honrar el sentido común en el diseño del lenguaje, pero sobre todo el Zen de Python referido. Por ejemplo:<br />
<ul><li>Renombrar los módulos para que todos los nombres cumplan con <a href="http://www.python.org/dev/peps/pep-0008/">la guía de estilo de Python</a> (una sola forma de nombrar los módulos).</li>
<li> Eliminar la costumbre de tener dos nombres de módulos (uno de ellos con una <strong>c</strong> prefijada) si había una versión rápida implementada en C (un solo nombre de módulo).</li>
<li>Agrupar los módulos parecidos en un paquete común, por ejemplo, md5 y shasum ahora forman parte de hashlib (un solo punto de acceso para algoritmos similares).</li>
</ul>La forma en que se trabaja con el texto es una evidente y clara forma de honrar el Zen. Ahora las cadenas son cadenas son cadenas y eso es todo (sí, énfasis redundando). Y si necesitas una manera de interactuar con los bytes que representan las cadena, tienes el tipo <strong>bytes</strong> y métodos para codificar una cadena en una secuencia tipo <strong>bytes</strong>. Todo está más claro ahora y bien separado.<br />
<br />
Sin embargo, Python 3 trajo nuevos elementos al lenguaje, como la sentencia <strong>with</strong>, y la comprensión de conjuntos y diccionarios. Pero estos elementos han sido portados a Python 2 para hacer la transición a Python 3 más fácil.<br />
<br />
[1] http://en.wikipedia.org/wiki/Python_3000#Version_3.0<br />
[2] http://www.youtube.com/watch?v=s-fKcZ5pKLE#t=2m20s<br />
<br />
Más enlaces sobre el tema:<br />
http://www.b-list.org/weblog/2008/dec/05/python-3000/<br />
http://diveintopython3.org/<br />
http://www.ibm.com/developerworks/linux/library/l-python3-1/skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com2tag:blogger.com,1999:blog-15836385.post-44835346602523265252010-07-21T17:31:00.001-04:302013-03-08T09:24:05.557-04:30Calendario de python-caracasActualización: Esta información ya no es relevante. El grupo python-caracas ya no existe, se fusionó con Python Venezuela.<br />
<br />
<strike>Para mantener más organizado al grupo creé un simple calendario de Google dedicado a python-caracas. Pueden verlo si bajan un poco la página podrán ver el calendario en la columna derecha.</strike>skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com0tag:blogger.com,1999:blog-15836385.post-24046904854328759552010-04-16T13:56:00.000-04:302010-04-16T13:56:42.091-04:30Dudamel: residente de MIT<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/_5SYqqzob2Kg/S8iowhaYjDI/AAAAAAAABJ8/Ux5CluGStS8/s1600/Pantallazo-MIT+-+Mozilla+Firefox.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="374" src="http://1.bp.blogspot.com/_5SYqqzob2Kg/S8iowhaYjDI/AAAAAAAABJ8/Ux5CluGStS8/s640/Pantallazo-MIT+-+Mozilla+Firefox.png" width="640" /></a></div>Si acceden hoy (o hubieran accedido hoy) al <a href="http://www.mit.edu/">site del MIT</a>, apreciarían o hubieran apreciado en primer plano al maestro Dudamel.<br />
<br />
Resulta que el maestro fue condecorado con el prestigioso premio <a href="http://arts.mit.edu/mcdermott/">McDermott</a>. Este premio (además de un valor en efectivo de $75.000) le otorga el título de residente del MIT, con lo cual tendrá acceso a los departamentos, laboratorios y centros de investigación.<br />
<br />
Dudamel mismo afrimó estar "... muy emocionado de visitar el MIT y ver su maravilloso programa musical y el Media Labs de primera mano ..."(<a href="http://web.mit.edu/newsoffice/2009/ofnote-dudamel.html">más</a>)skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com0tag:blogger.com,1999:blog-15836385.post-21651161531169005592010-04-15T11:13:00.000-04:302016-01-05T16:05:23.202-04:30jgomo3 en todos lados<h3>
Actualización</h3>
Lo que escribí en esta entrada del blog en el 2010, ya no es pertinente.<br />
<br />
Principalmente, <a href="http://blog.friendfeed.com/2015/04/friendfeed-was-shut-down-on-april-9-2015.html">Friendfeed se detuvo el 2015</a>.<br />
<br />
Por otro lado, Mark Pilgrim, el autor de <i>"Inmersión en Python"</i>, <a href="https://en.wikipedia.org/wiki/Mark_Pilgrim#.22Disappearance.22_from_the_Internet">decidió en 2011 eliminar el rastro de sus actividades de la Internet</a>, lo que implicó la eliminación de las páginas de sus libros. Nunca supe cuáles fueron bien sus razones, pero siempre he respetado su decisión y sigo agradecido por su aporte y deseándole una buena y larga vida.<br />
<br />
Con respecto a los libros, afortunadamente habían archivos de sus páginas y el contenido sigue siendo público (gracias a <a href="http://gnu%20free%20documentation%20license/">las licencias con las que fueron publicados</a>). Los libros mencionados pueden conseguirse actualmente en los siguientes enlaces:<br />
<br />
<ul>
<li><a href="http://www.diveintopython.net/">Dive into Python</a></li>
<li><a href="http://www.diveintopython3.net/">Dive into Python 3</a></li>
<li><a href="http://diveintohtml5.info/">Dive into HTML 5</a></li>
</ul>
<br />
<h3>
Texto original</h3>
En <a href="http://diveintomark.org/">el site de mark</a> (el de <a href="http://diveintopython.org/">diveintopython</a>(<a href="http://diveintopython3.org/">3</a>) y <a href="http://diveintohtml5.org/">diveintohtml5</a>) hay un <a href="http://firehose.diveintomark.org/">enlace al final de la página denominado firehose</a> (con un tooltip que dice: my comments here and elsewhere).<br />
<br />
El día que lo vi, siempre me parecio una excelente idea. Yo quiero hacer lo mismo. La solución fácil: <a href="http://friendfeed.com/">friendfeed</a>.<br />
<br />
Creé una cuenta en <a href="http://friendfeed.com/">friendfeed</a> y suscribí casi todos los periquitos de microbloging, bloging y demás cosas suscribibles en esa cuenta, y ahora, si alguien quiere ver mis comentarios solo debe consultar un solo lugar: <a href="http://friendfeed.com/jgomo3">mi cuenta de frienfeed</a>.skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com0tag:blogger.com,1999:blog-15836385.post-76032510798860903682010-03-30T15:17:00.000-04:302010-03-30T15:17:14.387-04:30El proyecto un millón de tuxes Este proyecto busca saber a cuantas personas les gusta Linux. Si te gusta Linux y quieres hacer que te cuenten en el proyecto, simplemente llena el <a href="http://1-million-tux.linux-befehle.org/indexes.php">formulario</a>.<br />
Este proyecto es parecido al viejo <a href="http://counter.li.org/">Linux counter</a>, sin embargo los del proyecto dicen que son más bien una dedicación a todos los usuarios del mundo que quieren y han contribuído con Linux y el código abierto.skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com0tag:blogger.com,1999:blog-15836385.post-72666176978250260622010-03-23T10:22:00.000-04:302010-03-23T10:22:29.297-04:30Discapacidad culturalEn un <a href="http://joenco.wordpress.com/2010/03/21/el-desconocimiento-si-es-una-limitante/">artículo</a> escrito por joenco coloqué un comentario para hacer énfasis en la ignorancia que poseo sobre el tema de las personas con discapacidad.<br />
<br />
Lo expreso aquí nuevamente:<br />
<blockquote>Me da pena admitir que me bastó leer “Yo soy una persona con discapacidad visual (tengo ceguera total)” para sorprenderme, ya que no concebía cómo es posible que usted escribiera esto. Claro que al seguir leyendo, entendí la gran ignorancia o “desconocimiento” que tengo respecto al tema de la discapacidad visual.<br />
Pues ahora le agradezco a usted haber iluminado mi concepción sobre este tema y no solo a mi sino a muchos.<br />
Aparte de esto, veo como algo muy positivo el nivel de conciencia que tiene y la promoción que da al sobre el software libre ya que entiende que gracias a él usted se convierte poco a poco en hacedor de tecnología.<br />
Saludos estimado. Muchas gracias.</blockquote> Me tocó tanto este artículo, que lo replico nuevamente. He aquí el artículo de Joenco titulado <b>El desconocimiento SI es una limitante!.</b><br />
<blockquote><div class="snap_preview">Empezaré este artículo diciendo: “La mayor limitante que tiene la Accesibilidad en el Software Libre es que las personas con discapacidad visual no se interesan en aprender a usar estas herramientas y se conforman con lo que otros dicen”, debo acotar que no son todos, hay usuarios que realmente lo usan y saben la accesibilidad que esta ofrece.<br />
Este comentario se debe a que, en el programa Aló Presidente del día 21 de Marzo del 2010, realizado desde la Biblioteca Nacional en Caracas, el presidente de la república lideró la inauguración de 24 infocentros a nivel nacional, en este programa dos funcionarios de la Fundación Infocentros afirmaron que la herramienta Orca tiene limitantes y que le faltaba mucho para poder ser utilizado por personas con discapacidad visual, lo que es totalmente FALSO.<br />
<strong>Hablando desde la experiencia</strong><br />
Explicando porque es totalmente falso lo que ahí se dijo: Yo soy una persona con discapacidad visual (tengo ceguera total) y tengo más de dos (2) años usando Software Libre, uso la distribución Debian para ser preciso, con herramientas accesibles como el lector de pantalla libre llamado Orca, puedo decir, en base a esa experiencia, que el Software Libre se puede utilizar sin ningún problema, ya que ofrece accesibilidad en:<br />
1. Aplicaciones ofimáticas (editor de texto y hoja de cálculo).<br />
2. Escaneo de documentos (Gscan2pdf).<br />
3. Calculadora.<br />
4. Editor de textos (Gedit).<br />
5. Navegadores web (aquí tengo para escoger).<br />
6. Cliente de Mensajería instantánea (Pidgin).<br />
7. Cliente de correo (Evolution).<br />
8. Reproductores de música y películas (aquí tengo para escoger).<br />
9. Terminal o consola.<br />
Estas son algunas de las herramientas que se pueden usar con el entorno gráfico Gnome. Es importantísimo que les mencione lo que me ha permitido lograr el uso de estas herramientas:<br />
<strong>Ámbito educativo:</strong> actualmente estoy estudiando Ingeniería de Sistemas en la Universidad de los Andes, el Software Libre ha sido de mucha ayuda, ya que me ofrece mas accesibilidad que la que ofrece Windows a la hora de programar, permitiéndome cumplir con todo lo que se me exige en la carrera.<br />
<strong>Ámbito laboral: </strong> trabajo en el Distrito Socialista Tecnológico de PDVSA, ubicado en Mérida, participo en el desarrollo de software y se me exige como a cualquier otro trabajador, lo que me permite sentirme útil y dar lo mejor de mi en cada asignación. Desarrollo con Software Libre, aprendo cada día de los mejores desarrolladores/programadores del mundo, porque disponen del código fuente y yo puedo aprender sobre estos desarrollos de forma autodidacta, logrando con esto una mayor independencia; a todas estas, he dejado de ser un simple usuario de tecnología y poco a poco me voy convirtiendo en un hacedor de tecnología, no se imaginan la tremenda motivación que tengo y es lo que quisiera que alcanzaran el resto de mis compañeros y compañeras con discapacidad del país.<br />
<strong>Ámbito personal: </strong>como cualquier persona, estoy en contacto con mis amistades, envío correo, busco información, entre otras actividades y hago todo esto con las herramientas de accesibilidad en Software Libre.<br />
Gracias al apoyo desinteresado de un grupo de personas (<a href="http://www.mundoaccesible.org.ve/">Mundo Accesible</a>, liderado por <a href="http://nagui1008.blogspot.com/">Nagui</a> aunque ella lo niegue y PDVSA en Mérida, que instaló un centro con herramientas accesibles en la Biblioteca Simón Bolívar, en esta misma ciudad, además de promover talleres de formación), se han promocionado en todo el país las ventajas que nos proporciona utilizar GNU/Linux, que tienen que ver con apropiación del conocimiento, soberanía tecnológica y eso sin hablar de los gastos que se ahorrarían por la compra de herramientas privativas.<br />
Quiero recalcar que no solo me siento incluido en lo educativo, laboral y social; sino que me da la sensación de que puedo intervenir en lo que se desarrolla y no ser solo un usuario del sistema.<br />
Es lamentable y triste saber que las personas con discapacidad visual que tienen un mal concepto del Software Libre y que no son usuarios permanentes del mismo, no hablan por la experiencia que tienen al usarlo, sino al contrario, se dejan llevar por comentarios, artículos y de la poca práctica que han tenido con el sistema operativo GNU/Linux.<br />
Esperando que con este artículo, las personas cuando quieran dar un comentario de algo, tengan la experiencia suficiente y la práctica necesaria para que su opinión sea válida y verdadera, para evitar así caer en la tentación de decir algo incorrecto. Me pongo a la orden para demostrar con hechos todo lo que acabo de mencionarles.<br />
Saludos y me despido con esta frase:<br />
<em>“Nuestra crítica consiste en reprochar a los demás el no tener las cualidades que nosotros creemos tener.”</em> Jules Renard<br />
</div></blockquote>skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com0tag:blogger.com,1999:blog-15836385.post-21899105018721067252010-03-08T20:27:00.002-04:302010-03-08T20:31:05.538-04:30Feminísmo y machismo<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/_5SYqqzob2Kg/S5WdOnhVSeI/AAAAAAAABI4/cbqeS6jlqvw/s1600-h/72903481.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://3.bp.blogspot.com/_5SYqqzob2Kg/S5WdOnhVSeI/AAAAAAAABI4/cbqeS6jlqvw/s640/72903481.jpg" width="633" /></a></div>Hoy día de la mujer, la facultad de Ingeniería de la universidad de Antioquia dedicó un mensaje a las mujeres en su día que ha indignado a más de una:<br />
<br />
<blockquote>De nada te servirá ser una profesional exitosa, una ejecutiva triunfadora y una mujer destacada, si no logras ser mejor señora de tu casa, mejor compañera de tu marido ¡y mejor madre de tus hijos!</blockquote> Apenas lo leí, me causó incluso risa pués me decía a mi mismo: ¿cómo no lo leyeron antes de publicarlo?<br />
Entonces por alguna razón se me ocurrió cambiar el sexo a los sujetos en el mensaje:<br />
<blockquote>De nada te servirá ser un profesional exitoso, un ejecutivo triunfador y un hombre destacado, si no logras ser mejor señor de tu casa, mejor compañero de tu esposa ¡y mejor padre de tus hijos!</blockquote> Y resultó no ser tan malo el mensaje, de hecho, se podría considerar como un buen consejo. Esto por supuesto me hizo reflexionar varias cosas y ahora no puedo dejar de pensar en eso... Cualquiera diría que el hecho de dirigirlo solo a las mujeres y no a ambos sexos es el problema, pero dirigirlo solo a los hombres no resulta malo.<br />
Entonces ¿por qué sucede esto?skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com2tag:blogger.com,1999:blog-15836385.post-15184742085033498852009-12-06T12:15:00.001-04:302009-12-06T15:42:46.023-04:30¿Microsoft en la Academia?Este viernes le cedieron a Microsoft al menos cuatro horas (oficialmente, ya que se agarraron muchas más) el auditorio Tobías Laser de la facultad de ciencias de la UCV, simplemente para promocionar el lanzamiento de su producto comercial Windows 7.<br />
<br />
De esto pudiera hablar un buen rato, pero solo quiero compartir esta anécdota.<br />
<br />
Conversando con una compañera de la Universidad las razones por las cuales me avergonzaba el evento y no pensaba aceptar el "regalo" de la licencia de Windows 7, ella me alegó que el computista serio debería conocer tanto del mundo Windows como del mundo Unix.<br />
<br />
En principio acepté el argumento, debido a que acepto el mismo argumento análogo con los lenguajes de programación: mientrás más lenguajes con filosofías distintas se conozcan, mejor programador se será, pero pronto me llegó una revelación: No me interesa el Windows 7 de la misma manera que no me interesa aprender COBOL.<br />
<br />
No voy a perder mi tiempo.skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com3tag:blogger.com,1999:blog-15836385.post-13019987690859968892009-11-08T21:17:00.001-04:302009-11-08T21:17:38.528-04:30Video explicativo sobre las wikis<div xmlns='http://www.w3.org/1999/xhtml'><p>Por fin conseguí el video sobre las wikis que vi en el ubuntazo de este año en Caracas. Gracias al grupo zeitgeist Caracas.</p>con referencia a: <a href='http://www.youtube.com/watch?v=knw8r3VvJRk'>YouTube - Explicacion Sobre las Wikis (Doblada Al Español)</a> (<a href='http://www.google.com/sidewiki/entry/jgomo3/id/IT-khp6Ipcqsl0APIWymivgalgY'>ver en Google Sidewiki</a>)</div>skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com1tag:blogger.com,1999:blog-15836385.post-62971750770983497362009-10-28T18:21:00.000-04:302009-10-28T18:21:18.619-04:30[Seminario] Plan de trabajo<ol><li><b>Revisión de los métodos:</b> Revisión de los métodos. Revisión del artículo y el T.E.G. Análisis de los resultados secuenciales (o mejor dicho, estudio). Propuesta de los resultados paralelos a obtener.<br />
<b>Producto:</b> Redactar una monografía que corresponda al capítulo 1 del seminario, relativo al marco teórico, planteamiento del problema y objetivo general del T.E.G.<br />
<b>Duración:</b> 3 semanas (11/11/2009)</li>
<li><b>Enfoques para paralelizar:</b> Investigación sobre enfoques para paralelización de métodos numéricos. Particionamiento de datos. Paralelización por procesos. Herramientas para programación paralela <b>disponibles</b>. Máquinas paralelas o clusteres <b>accesibles</b>.<br />
<b>Producto:</b> Monografía correspondiente al capítulo 2 del seminario.<br />
<b>Duración:</b> (9/12/2009)<br />
</li>
<li><b>Diseño de la paralelización:</b> Definición conceptual de la paralelización de los métodos en la herramienta y máquina seleccionada.<br />
<b>Producto:</b> capítulo 3 del seminario o propuesta de T.E.G.<br />
<b>Duración:</b> 13/01/2010</li>
<li><b>Entrega de documento de Seminario y presentación.</b> Revisión e integración de los diferentes capítulos. Entrega del documento correspondiente al seminario. Preparación de la exposición.<br />
<b>Duración:</b> 2 semanas (27/01/2010)<br />
</li>
</ol>skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com1tag:blogger.com,1999:blog-15836385.post-38262061848243321342009-10-28T18:03:00.000-04:302009-10-28T18:03:53.381-04:30Tema del Seminario: Paralelización del método de Cimmino acelerado.Al método cláscio de Cimmino se han propuesto dos mejoras, combinándolo con otros dos métodos:<br />
<ul><li>Gradiente Conjugado - CG_Cimmin, y</li>
<li>Barzilai-Borwein - BB Cimminos</li>
</ul>Las ventajas de los métodos acelerados, en un ambiente monoprocesador, fueron demostradas y ya publicadas. Una de las ventajas argumentadas para estos dos métodos radica en la factibilidad o potencial paralelismo en la iteración más externa. Esto lo haría tomar ventaja de una implementación en máquinas paralelas o Cluster.<br />
<br />
En este seminario se estudiará a profundidad el método original de Cimmino y las dos mejoras propuestas por el profesor Luis Manuel Hernandez, a fin de determinar las condiciones y herramientas requeridas para su paralelización como T.E.G de licenciatura en computación.skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com0tag:blogger.com,1999:blog-15836385.post-88794288453045089252009-10-21T15:20:00.002-04:302009-10-24T22:15:36.555-04:30¿Qué es un ateo? - ejemplificado<div class="separator" style="clear: both; text-align: center;"><a href="http://commons.wikimedia.org/w/thumb.php?f=FSM%20Logo.svg&width=200px" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="http://commons.wikimedia.org/w/thumb.php?f=FSM%20Logo.svg&width=200px" /></a><br />
</div>Resulta que sí existe un único Dios, y este se les aparece a dos individuos: a un creyente de ese Dios y a un ateo. Dios les dice:<br />
- Hijos mios, los he elegido como mis apóstoles para que difundan la verdad: Yo no existo. Vayan con mi bendición a profesar la única verdad.<br />
El creyente feliz de ser el elegido asume rápidamente su responsabilidad y difunde la nueva Fe.<br />
El ateo no le cree a Dios.skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com0tag:blogger.com,1999:blog-15836385.post-10910966857757141742009-10-01T20:56:00.004-04:302009-10-02T10:52:24.268-04:30Laboratorio de Fotografía<div xmlns="http://www.w3.org/1999/xhtml">Justo reconocimiento en mi blog a este aleccionador laboratorio que se imparte en la facultad de ciencias de la UCV.<br />
<br />
Una de las más nutritivas experiencias académicas que he vivido, ofrezco como explicación a tan alto nivel en el curso resultante, el tema... supongo que no habría otro resultado esperado de una actividad educativa relacionada con la fotografía.<br />
<br />
Para ser justo ahora con el grupo docente frente al lector (ya que sé que ellos entienden mi intención en el párrafo anterior) solo el amor y la GRAN dedicación que todos ellos invirtieron en el laboratorio haría posible "tan alto nivel".<br />
<br />
Resalto el nivel técnico de todas las clases: Teoría y práctica de fotografía abarcando temas de teoría del color, luz, óptica, fotografía estenopeica, enfoque, fotografía digital, edición digital de imágenes, etc.<br />
<br />
También se entenderá el lado artístico de la fotografía, y el esfuerzo del artista en capturar algo más que la imagen... el momento, el movimiento, los sentimientos, el color, el mensaje, la intención, lo incoherente... lo incoherente ;-)<br />
<br />
Pero sobre todas las cosas que obtuve, lo más importante fue el ejemplo: el ejemplo de alta calidad humana y <strike>profecional</strike> profesional de todo el equipo docente del laboratorio (incluyendo por supuesto a las maravillosas "preparatrices") que me servirá de inspiración para mi futuro desempeño <strike>profecional</strike> profesional.<br />
in reference to: <a href="http://fotodocencia.blogspot.com/?spref=tw">Laboratorio de Fotografía Ciencias - UCV</a> (<a href="http://www.google.com/sidewiki/entry/jgomo3/id/_VntWAJHg22Sh2EHcVe4tGAO63Q">view on Google Sidewiki</a>)<br />
</div>skribihttp://www.blogger.com/profile/15865909805101185858noreply@blogger.com4