sábado, febrero 28, 2009

CSS orientado a Objetos

Una muy buena presentación que vi en Ajaxian.
En YUI muchos de los conceptos que se ven en estra presentación se aplican.
Es bueno tener estos conceptos presentes a la hora de crear CSS.


jueves, febrero 26, 2009

Una materia menos y LaTeX

Ayer rendí la anteúltima materia de mi carrera y aprobé :) La materia me gusta muy poco (algebra lineal) pero, saqué algo positivo: La profe que nos dió clase de consulta estaba interesada en aprender LaTeX (y yo también), así que aprendimos LaTeX. Algo sabía al respecto, que era un lenguaje para hacer PDFs hermosos, que tenía un buen soporte para fórmulas matemáticas y también podía producir presentaciones muy buenas con prosper o beamer (que conocí gracias a Santiago).
En #latex de irc.freenode.net me recomendaron texclipse, un plugin para mi IDE acutal, Eclipse. Pero muchos editores de latex dando vueltas (vi, emacs, lyx, kile, etc.)
LaTeX es un leguaje de marcas, en realidad, un conjunto de macros para un lenguaje de bajo nivel, llamado TeX.
Así como distros de linux, existen varias vairadades de LaTeX. Tetex es una no mantenida, MikTex una rama para windows, MacTex para Mac, y en GNU tenemos LiveTex, que es multiplataforma.
Estoy tratando de hacer correr LiveTex sobre la máquina virtual donde tengo instalado winblows, pero ya van 1.2GB!

Pero refelxionando un poco, la funcionalidad que da TeXclipse es básicamente esto:
while inotifywait -r -e modify mi_archivo.tex; do
    pdflatex mi_archivo.tex mi_archivo.pdf
done




jueves, febrero 19, 2009

Desarmando una MacBook Pro

En ifixit.com desarman una MacBook Pró, con un buen detalle de imágenes. Un detalle que no conocía, es que la batería no se puede reemplazar facilmente como en una laptop PC.


lunes, febrero 09, 2009

A shell to rule them all


Bash es una herramienta muy poderosa y el autocompletado que incluye en Ubuntu (creo desde 7.04) lo hace aún más fácil de aprender. Sin embargo, cuando comencé el proceso "pimp my bash", empecé a notar que la performance comienza a disminuir, algo que se vuelve notorio al arranque.
Muchas aplicaciones degradan su rendimiento con el toqueteo, es algo casi natural, pero muchas veces imperceptible o tolerable... pero en una herramienta tan fundamental para un usuario Linux, no va. Esperar 0.5 a 1 segundo por un shell en un procesador Core 2 Duo no va. Por lo menos para mi no.
Así que decidí dar un paseo por los otros shells. Probé ksh, csh y no no me convencieron. Tan solo ver que un golpe de tabulador desplaza ocho espacios a la derecha me dio mucha tristesa, aunque la velocidad de spawneo (perdonen el spanglish) era muy buena. Pocas horas más tarde, tcsh mejoró el panorama (si mal no recuerdo viene de BSD).
Finalmente di con zsh, que pregonaba un poderoso sistema de compleción (o se dice completado?).
Tras instalarlo, la compleción no estaba disponible pero entre la doc de gentoo y la wiki de arch, logré configurarlo. Velocidad de spawn muy buena, configuración bastante etendible, compatible con sh y hasta ahora con todos los scripts de bash que he probado... y con un autocompletado para sacarse el sombrero:
En vez de ir alternando entre las posibles opciones, las lista en las lineas inferiores al prompt, de manera de tener un pantallazo general de las opciones, pero no conforme con esto, muchos comandos tienen ayuda detallada:


Una sintaxis de for simplificada, no neceista do accion1; accion2; done:
for x in *; echo $x en vez de for x in *; do echo $x; done
Editor de historial mejorado cuando tipeamos comandos multilinea, corrige comandos cuando le pifeamos al orden de los caracteres, las instancias de zsh pueden colaborar un historial global y buscar en cada terminal (cosa que no pasaba en bash y realmente nunca comprendí muy bien cual era su filosofía con respecto a varias sesiones y un solo history) entre otras features que pueden leer en su FAQ.
Lo que les puedo recomendar es que lo prueben ustedes mismos.

sábado, febrero 07, 2009

Editor compatible con TextMate

Hace un mes comencé a crear un editor de texto (no una IDE) con PyQt4.
¿Por qué?
  • Me di cuenta que la parte jugosa de TextMate es Open Source, es decir, todo el conjunto de bundles que provee (sintaxis, snippets, comandos, templates, etc.) están en un repositorio SVN bajo licencia GPL.
  • Kate es genial, pero no es fácil de extender. Sobre todo cuando tu cerebro se olvida de los vericuetos de C++.
  • El concepto de proyecto de TextMate es muy bueno.
  • TextMate adolece de una consola integrada.
  • Falta un textmate para linux, más allá de los numerosos posts en varios blogs sobre pimp my gedit.
Los bundles de TextMate están hechos mayoritariamente en Ruby, aunque los hay en Perl, php y Python.
Todos estos bundles están guradados en un dialecto de XML llamado Property List (plist) y se ve más o menos así:

<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>content</key>
        <string>|yesno:"${1:arg}"</string>
        <key>keyEquivalent</key>
        <string>@|</string>
        <key>name</key>
        <string>yesno</string>
        <key>scope</key>
        <string>text.html.django</string>
        <key>uuid</key>
        <string>20F0FE5C-BF8C-4258-8F93-3D6F62447068</string>
</dict>
</plist
Que parecido a una serialización de un diccionario en XML, no? Ya hay módulos para decodificar plist.


La API entre el editor y estos scripts es muy similar a un CGI, lo cual me pareció genial. Para quien le interese, lo mejor es ver los screencasts en la pagina del creador de TextMate. Son varias vueltas de tuerca sobre la tradicional llamada a comandos desde un editor (como a Make, o correr un script sobre bash, etc.).

Comencé utilizando el componente QSciScinitilla, pero la creación de sintaxis se hace en un dialecto que desconozco.
Así que decidí usar el editor de texto nativo de PyQt4, con su subrayador de sintaxis.

Lamentablemente por otros proyectos he tenido que dejar el desarollo temporalmente, pero acá van unos screen-shots, de una alfa muy alfa:








Regex

Hace unos días le explicaba a un amigo sobre regex. En los días posteriores me puse a pensar que las expresiones regulares fueron algo que no comprendí o utilizé cabalmente hasta que llegué a Python, además de poder meter comentarios.
Creo que los grupos nombrados, que proximamente estarán en la implementación de referencia (PRCE) fueron la kiler feature.
Hoy estaba limpiando unos TODOs de una aplicación que integra SqlAlchemy, PyQt y Twisted (todavía no es una WIP pero va tomando forma) y encontré la siguiente linea:

(?P<type>\w*)://
(?P<user>[\w]+):
(?P<pass>[\w\d]+)@
(?P<host>[\w]*):
(?P<port>[\w]+)\/
(?P<db>[\w]+)
Que básicamente paresea cosas TIPO_DB://USER:PASS@HOST/BASE
Que se convirtió en esta, mejorada:

(?P<type>\w{2,15})://    # Tipo de la base de datos

(?:

   (?:

       (?P<user>[\w\d]{1,50})

       (?::(?P<pass>[\w\d]{1,50}))?

       @

   )?

   (?P<host>[\w]*)

   (?::(?P<port>[\d]{3,5}))?

)?\/   # Puso user:pass@host

(?P<db>[\w]+) # Nombre de la base, siempre es obligatorio

(?:\?(?P<params>[\w]*(?:\=[\w\d]+)))? # Parametros extra





Si bien todavía le falta un poco, creo que quedó modificable e incluso se puede modificar más.
Intenté codificar lo mismo en ruby y php, pero no es trivial lograr la misma funcionalidad.
Que bueno es haber encontrado Python, lo único que lamento es no haberlo descubrido antes :)


Nota: Todo fue debugueado con Kodos, que es otra killer app, que en algún momento pienso pasar a PyQt4, ya que su layuot no es muy widescreen friendly.