Software libre en Windows

A muchos no nos gusta trabajar sobre MS Windows por muchos y diversos motivos. Uno de los que acostumbran a tener más peso es que no es un sistema que no nos dé la suficiente libertad. Otros motivos son la falta de versatilidad, su shell, que no es demasiado potente.. (aunque lo han intentado subsanar con la Powershell), o, directamente, el mismo motivo que aducen los windowseros para no pasar a sistemas libres, que no estamos acostumbrados a sus programas (o nos parecen una grandísima boñiga).

Pero siempre podemos encontrar algo de esperanza. Hay gente que desarrolla software libre muy útil y que funciona sobre Windows. No solo nos ayudarán a pasar el mal rato cuando no tengamos más remedio que usarlo, sino que nos podrá servir para habituar a aquellos que queramos convencer para que abandonen Windows (sí, a veces el proselitismo es necesario, sobretodo si se es el pringado de turno que tiene que ir arreglando ordenadores con Windows por todas partes).

Aquí dejo mi lista del software libre para Windows que encuentro más útil,

Internet

  • Mozilla Firefox : Un gran navegador, y, todo hay que decirlo, parece funcionar mejor sobre Windows que sobre GNU/Linux. Tengo que añadir que la versión 4 será mítica en cuanto vea la luz del día.
  • Mozilla Thunderbird : A su vez, en su versión 3.1, resulta ser también un gran cliente de correo, y la experiencia puede mejorar notablemente si se combina con el plugin Lightning , actualmente en su versión 1 beta 2.

Oficina

  • OpenOffice ( aunque prefiero la versión de Novell, Go-OO ) : Una gran suite ofimática, mejorable sin duda, pero que está a la altura de las necesidades diarias y maneja por defecto el formato estándar ODF. Además nos permite trabajar también con los formatos de la suite ofimática de Microsoft y exportar nuestros documentos a PDF.
  • Mozilla Sunbird : Un buen programa para gestionar tus calendarios y horarios, se integra perfectamente con Google Calendars y también con Mozilla Thunderbird mediante el plugin Lightning que he mencionado anteriormente.

Utilidades varias

  • InfraRecorder : Muy útil para crear y quemar imágenes de CDs, así como hacer copias directas, o bién CDs con los archivos que quieras.
  • PeaZip : Para comprimir y descomprimir ficheros, tiene una interfaz muy agradable y simple.
  • 7-Zip : Lo mismo que PeaZip, algo más versátil, pero su interfaz gráfica tiene una apariencia menos cuidada.
  • Ghostscript : No es nada que se vaya a usar en el día a día, pero sirve como pieza indispensable para integrarse con otras herramientas de la talla de Scribus. Es útil para tratar con Postscript y PDF.

P2P

Hay muchos más programas de los que pondré en esta sección, simplemente pongo mis preferidos.

  • eMule : Todo un clásico, nos permite acceder a multitud de películas, música, documentos varios, programas, etc. Todo a través de las redes ed2k y Kademlia, una con puntos centralizados y la otra totalmente descentralizada respectivamente. Nos permite aplicar ofuscación de protocolo.
  • Deluge : Mi cliente favorito para torrents, rápido, sencillo, y libre. Permite cifrar las conexiones y tiene un plugin semi-oficial que nos permite bloquear las ips de ciertas entidades que actúan a modo de "polis malos de internet".

Multimedia

Como antes, solo mencionaré los que me gustan.

  • Songbird : Un completo reproductor de música, con multitud de plugins. Podrás escuchar música, radios online, leer las letras de las canciones mientras las escuchas, sincronizar tus gadgets, cambiar su aspecto...
  • VLC : Uno de los mejores reproductores de vídeo del momento. Se distribuye de forma que no hace falta instalar códecs adicionales. La última versión es capaz de aprovechar aceleración por hardware en algunas tarjetas gráficas, con lo que el equipo podrá funcionar de forma fluida mientras visualizas películas.
  • Miro : Un programa para visualizar vídeo a través de Internet, particularmente no lo uso mucho porque paso mucho tiempo programando, pero es un buen programa para chafardear y encontrar cosas nuevas fácilmente.
  • LMMS : Pensado originalmente para Linux, ahora es multiplataforma. Es una especie de estudio para edición musical muy pero que muy chulo, supongo que habrá cosas más perfeccionadas en el aspecto técnico dentro del mundo del software cerrado, pero qué le vamos a hacer, a mi me gusta tal y como es.

Edición gráfica

  • The Gimp : Cómo no, el programa de retoque fotográfico más conocido del mundo del software libre, y el predecesor del proyecto Gnome. Ahora mismo la última versión estable es la 2.6 , tiene algunos defectos importantes, en parte causantes de su baja adopción entre artistas gráficos. El primero es su falta de soporte para los perfiles de color CMYK (aunque se espera que probablemente se le dé soporte en la próxima versión 2.8), el segundo es su interfaz, conformada por diversas ventanas independientes... y que nos puede llegar a marear. El segundo problema ya se ha solucionado en las versiones de desarrollo, aunque no hay todavía ninguna versión para Windows con ese cambio.
  • Blender : El programa que antes de ser libre fue usado en la película de Terminator 2 para crear el efecto de metal fundido del robot malo de la película. Actualmente la última versión estable es la 2.49 , pero ya está disponible la beta 2.53 , que incluye muchísimos cambios en la interfaz, y otros detalles internos que soy incapaz de describir por desconocimiento, aunque suenan espectaculares.
  • Inkscape : Un programa de dibujo vectorial, le queda mucho trecho por delante para ser perfecto pero es sin duda muy bueno en lo que hace.
  • Scribus : Un programa de maquetación, tal como Quark Express... solo que con menos fondos para ser desarrollado, así que no podemos esperar tanto, pero no todos necesitamos características demasiado avanzadas. Para trabajar perfectamente con él es bueno instalar Ghostscript previamente.

Desarrollo de software

  • Netbeans : Un muy buen IDE , permite trabajar con Java, C/C++, PHP... (y algunos lenguajes más que no recuerdo). Se integra perfectamente con Mercurial, SVN y CVS. Nos permite refactorizar de forma muy cómoda el código, detecta errores automáticamente en tiempo de desarrollo, se puede integrar bién con entornos de Unit testing...
  • Mercurial: Un sistema de control de versiones descentralizado, crear y mezclar ramas es pan comido con éste gran sistema. Es parecido a Git (que también tiene implementaciones en Windows, pero más fácil de manejar, aunque no es tan veloz ni versátil, es más que suficiente). Necesita tener instalado Python en el sistema.
  • Python : Uno de mis lenguajes interpretados preferidos, la sintaxis es muy bonita y se puede mezclar código al estilo funcional con código imperativo. Si se instala en Windows es preferible instalar dos versiones simultáneamente, la de la rama 3 (que debe ir por la 3.1 ..), y la de la rama 2.5 (que debe ir por la 2.7), por cuestiones de compatibilidad, pues con la rama 3 rompieron compatibilidad hacia atrás para poder mejorar algunos aspectos del lenguaje.
  • MonoDevelop: Otro de mis IDEs preferidos, desgraciadamente, igual que Netbeans, está escrito en un lenguaje no nativo. Aunque éste en C# al contrario que Netbeans, que está escrito en Java. Aunque es un poco extraño requiere funcionar sobre la plataforma .Net y no sobre Mono (en el caso de Windows).
  • Qt Developer: Sin duda uno de los mejores IDEs que he visto nunca, todo perfectamete integrado, resaltado de sintaxis, detección de errores, editor de GUIs, integración con 4 o 5 sistemas de control de versiones (entre ellos Git y Mercurial). ¿La pega? Está especialmente diseñado para C/C++, pero sobretodo para C++ con Qt. Aun así, tengo que decir que trabajar con Qt es una gozada.
  • Notepad++ : Un editor de texto sumamente versátil, con resaltado de sintaxis para muchísimos lenguajes, con plugins para actuar a modo de visor hexadecimal, permite trabajar con multitud de codificaciones, y alternar entre los diversos modos de salto de línea existentes (UNIX, Windows... y creo que hay otro, que no recuerdo).

Administración web

  • FileZilla : ¿Quieres conectarte a un servidor FTP, SFTP o FTPS? Aquí tienes la solución.
  • WinSCP : Otra solución parecida a FileZilla, aunque añade el protocolo SCP.

Software científico

  • wxMaxima / Maxima : Un sistema de cálculo simbólico bastante completo, wxMaxima nos proporciona una interfaz gráfica para Maxima. Podremos trabajar con matrices, resolver ecuaciones diferenciales (o sistemas de ecuaciones diferenciales), cómo no, también lineales, cuadráticas, cúbicas y cuárticas, graficar resultados (en 2 o tres dimensiones), encontrar vectores y valores propios de aplicaciones lineales o matrices, calcular límites, integrar, diferenciar, etc.
  • Texmaker : En realidad no se trata de software científico, sino de creación de documentos con el lenguaje LaTeX (basado en TeX) , pero dado que es utilizado sobretodo por científicos y técnicos he decidido ponerlo aquí. Tiene una interfaz muy cuidada y bastante bien pensada, nos permite crear documentos desde diversas plantillas predefinidas, cuenta con multitud de símbolos accesibles por si no nos acordamos de sus respectivos códigos, nos permite previsualizar el documento, y obviamente generar el PDF correspondiente... Creo que es la mejor opción para trabajar con LaTeX sobre Windows.
  • Marble : Un programa para poder visualizar el globo terráqueo, no es científico propiamente dicho, pero sirve para obtener información sobre el mundo en el que vivimos... así que ¿por qué no ponerlo aquí? Actualmente la última versión disponible para Windows es la 0.8 , mientra que la última desarrollada es la 0.10, que ha incorporado muchísimas mejoras en las dos actualizaciones sucesivas desde la versión 0.8. Pero supongo que es normal que de vez en cuando haya desincronizaciones en las releases cuando estamos tratando con programas multiplataforma, y más cuando los recursos son escasos.

Bueno, aquí he puesto unos pocos, tampoco demasiados, de los programas libres existentes para Windows. Hay muy buenos recopilatorios, como cdlibre.org , aunque encuentro a faltar allí valoraciones sobre la calidad del software (ya sea en cuanto a calidad técnica, usabilidad o estética). Y sobre todo, esto debería considerarse como un paso intermedio si se quiere libertad de verdad, algo útil para habituar a los usuarios, para que no sufran con la transición.

Creando un framework con PHP ( II ) : Introspección

A la hora de usar frameworks los programadores esperan cierta magia, que las cosas funcionen sin tener que preocuparse por ciertos detalles nimios, y eso en gran parte se consigue gracias a los métodos de introspección (o reflexión, aunque prefiero el primer término), que en este caso nos son brindados por PHP.

Se podría decir que en PHP hay dos caminos para usar la introspección, el uso de ciertas funciones que aparecieron a partir de la versión 4 de PHP (siguiendo el paradigma de la programación estructurada) , o bien el uso de ciertas clases (y sus respectivos objetos, obviamente) que hicieron su aparición estelar con PHP 5.

Por diversos motivos, en el framework que estoy desarrollando he escogido el segundo camino (en realidad un mix, pero predomina la segunda opción), pero aquí comentaré los dos.

Introspección al estilo de PHP 4

Los primeros métodos que deberíamos conocer son los que nos permiten saber qué clases hay declaradas, o si una determinada clase está cargada ya en el contexto en el que nos encontramos, tenemos estos métodos:

  • get_declared_classes () : retorna una lista que contiene los nombres de todas las clases declaradas.
  • class_exists ($nombre_clase): retorna verdadero o falso en función de si la clase pasada como parametro ha sido declarada o no. Como parámetro podemos pasar una cadena, o la propia clase si ya la conocemos. Ejemplo:
    1
    2
    3
    4
    
    class Prueba {
    }
    class_exists ('Prueba'); // Retorna verdadero
    class_exists (Prueba);   // También retorna verdadero

Una vez sabemos qué clases hay declaradas, también podríamos querer cómo son éstas por dentro, tenemos los siguientes métodos (creo que esta lista no es exhaustiva):

  • get_class_methods ($nombre_clase) : Nos devuelve una lista con los nombres de todos los métodos de la clase
  • get_class_vars ($nombre_clase) : Nos devuelve una lista asociativa con los nombres de las propiedades como claves, y los respectivos valores de las propiedades como elementos de la lista.
  • property_exists ($nombre_clase, $nombre_propiedad) : Nos indica si la clase tiene la propiedad que buscamos
  • get_parent_class ($nombre_clase) : Nos devuelve el nombre de la clase padre (si no hay clase padre, entonces devuelve una cadena vacía). También podemos usar objetos en este caso, no solo clases.
  • is_subclass_of ($nombre_clase, $nombre_clase_padre) : Nos indica si la clase hereda de la clase padre, también podemos usar objetos en este caso, no solo clases.

Podemos hacer prácticamente lo mismo, pero con objetos:

  • get_object_vars ($objeto) : Se parece mucho a get_class_vars , pero se diferencia en que los valores de las propiedades de los objetos pueden variar en tiempo de ejecución, y además se pueden añadir propiedades también en tiempo de ejecución.
  • method_exists ($objeto, $nombre_metodo) : Nos indica si el objeto tiene o no un método concreto

Y aquí nos quedamos, más o menos eso es todo. Antes había ciertas funciones que completaban la parrilla y eran bastante útiles, que servían, básicamente, para hacer uso de callbacks o ejecutar métodos de forma "dinámica", pero fueron marcadas como obsoletas a partir de la versión 4.1 de PHP, por lo que no las comentaré.  El hecho de que "falten" ciertas funciones nos podría obligar a agudizar el ingenio.. o a abusar de funciones como eval , pero por suerte, en PHP 5 se introdujo una nueva forma de trabajar.

Introspección al estilo PHP 5 (clase Reflection)

En PHP 5 se introdujeron diversas mejoras, entre otras el tratamiento de errores se ha orientado más hacia el manejo de excepciones con bloques try-catch , y se han creado más clases que permiten trabajar de una forma mucho más orientada al paradigma de Orientación a Objetos, aumentando en cierta medida la cohesión del código resultante.

Una de las clases que fueron introducidas en esta versión fue la clase Reflection (y algunas otras que derivan de ésta). Todas ellas, cuando se produce algún error, lo que hacen es lanzar una excepción, simplificando la gestión y evitando que tengamos que interpretar el significado de los valores de retorno. Estas son las clases de las que hablaremos (un poco por encima):

Para hacer introspección o reflexión lo que debemos es construir un objeto a partir de una de estas clases, usando como parámetro en el constructor aquello que queramos "ver por dentro". Por ejemplo:

1
$metainformacion_clase = new ReflectionClass ("nombre_de_la_clase");

a partir de aquí contamos con un montón de métodos (muchos más que los que había disponibles en PHP 4) que nos servirán para conocer todo cuanto queramos sobre la susodicha clase. Podéis ver los métodos disponibles en los enlaces que he hecho para cada una de ellas. Es interesante comentar que, algunos métodos devuelven objetos que a su vez también sirven para aplicar introspección, como getMethod ($name) o getProperty ($name) , que devuelven sendos ReflectionMethod i ReflectionProperty.

Uno de los métodos más interesantes de ReflectionMethod es el método invoke ($object, $params) , al cual le podemos pasar un objeto para el que queremos que se ejecute el método reflejado con los parámetros indicados. Esto sería "equivalente" a hacer la llamada (atentos, el ==== no es código, lo uso para indicar una cierta equivalencia):

1
$metainformacion_metodo->invoke($object, $params); ====  $object->metodo_reflejado($params);

Con ésto no es que se pueda zanjar el asunto de la introspección o reflexión, pero hay poco más interesante por decir, casi todo lo demás es simplemente conocer los nombres de las funciones y aplicarlas, así pues, deberíamos pensar en cómo toda esta parafernalia nos puede resultar útil para crear un framework con PHP. Lo veremos en el siguiente artículo, que este ya es suficientemente largo.

Creando un framework con PHP ( I )

Tengo una serie de artículos sobre optimización web a medio terminar, pero creí conveniente parar y tratar un poco la creación de frameworks para introducir posteriormente en la serie de artículos sobre optimización algo sobre cache.

Por eso mismo he estado desarrollando un mini framework en php (con la intención de hacerlo más ligero que, por ejemplo, cakephp) , y voy a ir contando mis experiencias sobre el asunto.

Introducción

El framework que por ahora mejor conozco es cakephp y ha influenciado bastante en mis decisiones a la hora de escoger un diseño u otro (tanto a la hora de escoger qué quería que tuviera, como a la hora de decidir qué me parece poco importante).

Sobretodo voy a listar qué es lo que no quiero para el framework que estoy haciendo (pues por querer, quiero demasiadas cosas y es una tontería escribirlas cuando ni tan siquiera sé si llegaré a implementarlas):

  • La excesiva "magia" que acababa implicando convenciones demasiado fuertes en cuanto a la nomenclatura, y una penalización en cuanto a rendimiento.
  • El acoplamiento excesivo entre modelos, controladores y vistas.
  • Que funcione sobre cualquier versión de PHP : utilizaré las características más novedosas que encuentre y no me preocuparé por la compatibilidad.
  • La forma en que está estructurado CakePHP provoca que no se puedan aprovechar correctamente las características del modelo de orientación a objetos.
  • Quiero evitar el abuso que se hace de los helpers, a veces me asusto cuando leo ciertos mensajes en la lista de correo de CakePHP española pidiendo ayuda sobre como crear simples enlaces o_o .

Pondré algunos detalles que sí quiero implementar, pero pocos:

  • Un mejor modelo de seguridad.
  • Un mejor modelo de control de errores.
  • Facilitar el unit testing.

Pasando a la acción

Todos los que hemos usado algún tipo de framework sabemos ya que éstos nos pueden llegar a facilitar mucho la vida a la hora de programar, pero lo que no todos saben es cuanta complejidad hay detrás de esas maravillas que nos simplifican el trabajo.

Empezemos por la parte "facil", la creación de rutas bonitas para las subsecciones de nuestra página. Esta parte solo funcionará sobre Apache o servidores que utilicen ficheros de configuración compatibles, y que tengan el módulo mod_rewrite activado. Escribimos las siguientes líneas en el fichero .htaccess :

1
2
3
4
5
6
<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

Lo que hacen estas líneas es redireccionar cualquier petición de la forma http://www.tuweb.com/seccion/subseccion/blabla a una petición de la forma http://www.tuweb.com/index.php?url=seccion/subseccion/blabla . Esto nos servirá para poder crear código que nos lleve a una sección u otra dependiendo del valor de la variable url, encapsulando en diferentes archivos el código necesario para gestionar cada sección.

Si queremos realizar una redirección similar en el servidor Cherokee debemos hacerlo desde el panel de administración (desgraciadamente Cherokee, aun siendo mucho más ligero que Apache y con un modo de configuración sorprendentemente fácil, no permite gestionar tan fácilmente las configuraciones en hostings compartidos).

En el siguiente artículo trataré el asunto de la introspección (o reflexión). Para los curiosos, podéis descargar e ir mirando el código del framework que estoy escribiendo en http://gitorious.org/pajarillo/ .