¡Ha salido Tcl/Tk 8.5!

Tags: , ,

En anteriores entradas despotricaba contra Tcl/Tk, y una de mis “quejas” era que el aspecto de los “widgets” era horroroso, sobre todo en sistemas X-Window (Linux y otros UNIX).

Bien, parece que en esta nueva versión se ha añadido una extensión llamada Tile que permite el uso de “themes” en las aplicaciones Tcl/Tk. Los pantallazos que se muestran tienen buena pinta.

A lo mejor le doy una segunda oportunidad a Tcl/Tk como lenguaje para desarrollar programas “de ventanitas”. Veamos como queda uno de mis programillas (Pitch & Tunning Studio) con la nueva versión de Tcl/Tk.

Tcl/Tk 8.4 en MacOSX
Tk 8.4 en Mac OSX

Tcl/Tk 8.5 en MacOSX
Tk 8.5 en Mac OSX

Tcl/Tk 8.4 en Linux
Tk 8.4 en Linux

Tcl/Tk 8.5 en Linux
Tk 8.5 en Linux

Tcl/Tk 8.5 en Windows XP
Tk 8.5 en Windows XP

No he adjuntado un pantallazo de Tk 8.4 en Windows porque prácticamente no ha cambiado nada. La mejora en Linux es increíble: fuentes alisadas, los “radio buttons” redondos y muchos más detalles. También la versión para Mac ha mejorado bastante (observen el “spinbox” rotulado como “Note duration”).

Definitivamente, ya no puedo mantener que Tk es un “toolkit” feo ;-)

Por cierto, la distribución de Tcl/Tk más conocida, la de Active State, ya no incluye el paquete Snack por defecto (aunque se puede instalar).
¡Grrrr!

Comentarios (5)

Herramientas para desarrollo Web

Tags: , , , , , ,

Este “post” me sirve de repaso y recordatorio de mis herramientas más o menos habituales de desarrollo web. Mi trabajo habitual es con PHP en el servidor y los típicos HTML, CSS y JavaScript en el navegador. También suelo utilizar Python en el servidor para tareas programadas (cron) y otros desarrollos.

Todas estas herramientas son libres (o al menos, gratuitas) y multiplataforma: de hecho trabajo indistintamente en equipos con Windows, Mac OSX y Linux.

  • IDE
    Aunque sea un tanto pesado, Eclipse es una herramienta estupenda, por lo menos para mí. Los ‘plugins’ que más utilizo son:

    • SFTP Plug-in for Eclipse.
    • PDT (PHP Development Tools).
    • PyDev para desarrollar en Python.
    • Aptana es un IDE construido sobre Eclipse para desarrollo web.
  • Editores
    Para edición más o menos rápida, un editor genérico con resaltado de sintaxis y alguna otra monería siempre viene bien.

    El editor jEdit también es una opción estupenda, a medio camino entre un editor sencillo y los IDEs más pesados. Hay multitud de plugins muy útiles ((S)FTP, HTML, PHP, …)

  • Clientes (S)FTP
    Imprescindibles para subir archivos al servidor o editar “in situ”. No me gustan los clientes FTP tradicionales en los que editas en local y luego subes, para arreglos rápidos no es cómodo bajar, editar y subir.

    • Para Windows, WinSCP. Puede funcionar como cliente de (S)FTP tradicional o se puede configurar para editar en el mismo servidor.
    • Para Mac, la herramienta MacFusion permite montar como unidades locales servidores FTP o SFTP.
    • En Linux se puede utilizar el mismo administrador de archivos (Konqueror o Nautilus) para acceder a servidors FTP o SFTP.
  • Navegadores
    Aparte de tener instalados todos los navegadores posibles, conviene tener un navegador que permita depurar, inspeccionar código fácilmente, …
    El navegador Firefox tiene muchas extensiones útiles para desarrolladores web. Mis preferidas son:

    • Web Developer. Entre sus muchas funcionalidades destacan la posibilidad de controlar las cachés del navegador, las “cookies”, validar código “on-line”, regla para medir distancias en pantalla, …
    • Firebug. Permite inspeccionar el árbol DOM del documento activo, seleccionar elementos, editar estilos, depurar JavaScript, analizar el tiempo de carga de una página, … Imprescindible.
    • Professor X. Proporciona información sobre las cabeceras HTML.
  • Servidor web y BBDD
    Muchas veces es conveniente hacer los desarrollos en un servidor local antes de subirlo a los servidores “corporativos”. Aunque en algunos S.O. (Linux y/o Mac) viene ya habilitado el servidor web, no siempre nos sirve (por problemas con versiones de Apache/PHP, MySQL o lo que sea).
    Existen algunas distribuciones que empaquetan un servidor web (Apache), PHP y un servidor de BBDD (MySQL, generalmente). El proyecto Xampp proporciona distribuciones para distintos S.O. (Windows, Linux o Mac OSX) muy cómodas y sencillas de usar.
Comentarios (3)

Triple arranque en iMac

Tags: , ,

ADVERTENCIA:
Puedes perder todos tus datos y cargarte tu precioso y flamante Mac si haces todo lo que sigue a continuación. Tú mism@. Estás advertid@.

Ingredientes:

  • Un Mac
  • BootCamp
  • rEFIT
  • RsyncX
  • Un disco duro externo
  • Un CD de instalación de Windows
  • Un CD de instalación de Linux (Ubuntu en mi caso)
  • Mucha paciencia …

Pantalla inicial

Vamos a suponer que partimos de la situación más habitual: un Mac con el sistema operativo instalado y el disco duro interno con una sóla partición [1].

Lo primero es hacer una copia de seguridad de todo el disco en un disco duro externo. Con la utilidad RsyncX se puede hacer esta copia y marcarla como “arrancable” para iniciar el Mac desde el dispositivo externo. En esta página se explica en detalle.

Una vez terminada la copia arrancable, apagamos el Mac y reiniciamos desde el disco externo (mantener pulsada la tecla Alt (⌥) y seleccionar el dispositivo externo)

El sistema arrancará normalmente (un poco más lento) y podremos acceder al disco duro interno y reformatearlo [2] con la herramienta “Utilidad de Discos”. Hay que dejarlo con tres particiones: una para Mac OSX, otra para Windows y otra para Linux (no necesariamente en ese orden). Si intentamos hacer más particiones, tendremos luego problemas, al tratar de “convertir” el esquema de particiones del formato “Mac - EFI” al formato “PC - Bios”. Eso quiere decir que nada de tener el Linux con /home en una partición, /var en otra y / en otra ;-)
Por supuesto, vamos sin swap [3]

La partición para Mac la formatearemos con el sistema “Mac OS Plus (con registro)”, la partición para Windows como “Sistema de archivos MS-DOS” y la partición Linux en cualquier formato, ya luego la pasaremos al sistema de ficheros Linux.

Una vez preparado el disco interno, restauramos (utilizando la herramienta RsyncX) la partición Mac OS desde la copia de seguridad en el disco externo (desde la que ahora mismo estamos ejecutando el sistema operativo).

Reiniciamos desde el disco duro interno, que ahora tendrá tres particiones (cuatro si contamos la partición oculta).

Instalamos BootCamp y rEFIF. BootCamp lo utilizaremos para tener el disco de controladores para Windows, pero no tocaremos el disco duro: ya lo tenemos preparado.

Reiniciamos con el disco de Windoze dentro. Arrancamos desde el CD e instalamos Windows.

Reiniciamos con el disco de Linux dentro. Arrancamos desde el CD e instalamos Linux.

rEFIT debería mostrarnos las tres entradas posibles, si no es así, deberemos entrar en el icono pequeñito “Partition Tool” y cuando nos pregunte si queremos sincronizar la tabla GPT con la tabla MBR decirle que “sí”.

[1] Mentira cochina: siempre hay una pequeña partición y oculta al principio del disco. Ocupa unos 200 Mb.
[2] PROCEDIMIENTO DESTRUCTIVO: NOS CARGAREMOS EL DISCO DURO INTERNO.
[3] Podemos hacer que Linux use un fichero como swap en vez de una partición.

Comentarios

Patrones de diseño para torpes - 2ª parte

Tags: , , , ,

Seguimos la serie de artículos sobre patrones de diseño. Vamos a ver otro de los patrones más típicos.

El patrón “Observer”

Usted es el/la encargado/a de la hemeroteca de un laboratorio. Periódicamente se reciben revistas sobre diferentes temas y con una periodicidad variable: unas son semanales, otras quincenales y otras mensuales.

Una de sus funciones es hacer llegar las revistas a diferentes personas de diferentes departamentos. Por ejemplo, la revista “Genómica de las hormigas” debe llegar al laboratorio de genética, la revista “Cristalografía de minerales venusianos” va al departamento de cristalografía, etc.

Imagínese ahora que cada persona de cada departamento estuviese cada dos por tres llamándole para preguntarle si ha llegado su revista, o, peor aún, entrara en su despacho y revolviese su mesa y el archivo buscando su preciada revista.

Obviamente, las personas no trabajamos así, en este ejemplo, lo más lógico, cómodo y organizado es que Ud. mantenga una lista de las personas o departamentos y notifique a estos la llegada de las revistas. Cada departamento decide entonces qué hacer con la revista (fotocopiarla, escanearla, …, incluso leerla)

Cuando desarrollamos programas hay distintos módulos o unidades funcionales que deben interaccionar entre ellos, pero esta interacción no siempre es tan limpia o aséptica como sería deseable. En ocasiones un módulo, clase, función (o lo que sea) llega a “meterse en el despacho” de otra unidad funcional.

Pongamos un ejemplo más “software”. En el libro “Desing Patterns” que mencionábamos en el anterior artículo proponen dos ejemplos muy ilustrativos:

  • Una hoja de cálculo puede tener varias vistas (formas de presentar los datos) activas en un momento dado: un gráfico de barras, una rejilla de datos, un gráfico por sectores, …
    Si los datos cambian, todas las vistas deben actualizarse. La forma más cómoda es tener un objeto “Datos” que informa a todos los objetos “Presentación” de los cambios que se producen. Estos objetos “Presentación” ya se ocuparán ellos de actualizarse.
    Lo bueno de este patrón es que los objetos “Presentación” no deben “meterse en el despacho” del objeto “Datos” para consultar si estos datos han cambiado o no.
  • El otro ejemplo que se propone es un reloj. Tenemos un objeto “Temporizador” que cada segundo notifica a todos los objetos que le observan (un “RelojDigital”, un “RelojAnalógico”, …) de que algo ha cambiado.

Distinguimos entonces el objeto observado y los objetos observadores. El objeto observado debe mantener una relación de los objetos que le observan y una forma de notificarles. Por su parte, los objetos observadores, sean del tipo que sean, deben implementar alguna funcionalidad para actualizarse en función del nuevo estado del objeto observado.

En el artículo “Five common PHP design patterns” nos proponen algunos ejemplos en PHP muy interesantes. Vamos a adaptar un poco el ejemplo correspondiente al patrón observer y “traducirlo”.

<?php

interface IntfzObservador {
   function hayCambios($observado, $datos);
}

class NotificadorUsuarios implements IntfzObservador {
    public function hayCambios($sender, $args) {
        // Código para notificar: mensaje en consola,
        // registro en un fichero 'log', etc.
        echo("Se ha añadido '$args' a la lista de usuarios.n");
    }
}

class GrabadorBBDDUsuarios implements IntfzObservador {
   public function hayCambios($sender, $args) {
       // Código para grabar en BBDD.
       echo("Se ha grabado el usuario '$args' en la base de datos.n");
   }
}

class AltaSistemaUsuarios implements IntfzObservador {
   public function hayCambios($sender, $args) {
       // Código para crear la cuenta de usuario.
       echo("Se ha creado una cuenta para el usuario '$args'.n");
   }
}

class ListaUsuarios {
    private $observadores = array();
    public function anadirUsuario($nombre)  {
       foreach($this->observadores as $obs)
           $obs->hayCambios($this, $nombre);
    }
    public function anadirObservador($observador)  {
	    $this->observadores[]= $observador;
   }
}

/** Código de pruebas **/
$nu = new NotificadorUsuarios();
$gbu = new GrabadorBBDDUsuarios();
$asu = new AltaSistemaUsuarios();
$lu = new ListaUsuarios();
$lu->anadirObservador($nu);
$lu->anadirObservador($gbu);
$lu->anadirObservador($asu);
$lu->anadirUsuario("Juana");
$lu->anadirUsuario("Pedro");

?>

Las clases observadoras, independientemente de su naturaleza, deben tener un método común para ser notificadas por el observado. Esto puede garantizarse definiendo una interfaz (IntfzObservador en el ejemplo) y forzando a que estas clases observadoras implementen la interfaz.

El código es autoexplicativo. Tenemos dos observadores que “reaccionan” de diferente forma a los cambios en el observado. Uno de ellos de dedica a notificar los usuarios nuevos, otro los graba en una base de datos, otro los da de alta en el sistema, …

Cada vez que se añade el objeto ListaUsuarios añade un usuario, notifica a sus observadores y éstos hacen sus tareas, sin interferir con este objeto observado.

Veamos la salida de este programa:

~ $ php test.php
Se ha añadido ‘Juana’ a la lista de usuarios.
Se ha grabado el usuario ‘Juana’ en la base de datos.
Se ha creado una cuenta para el usuario ‘Juana’.
Se ha añadido ‘Pedro’ a la lista de usuarios.
Se ha grabado el usuario ‘Pedro’ en la base de datos.
Se ha creado una cuenta para el usuario ‘Pedro’.
~ $

Comentarios

Virtualización en Mac OSX (2)

Tags: , , ,

En otra entrada escribía sobre Qemu y el “front-end” para Mac OSX, “Q”. He seguido buscando otras soluciones y he encontrado otro programa de virtualización: Virtual Box.

Me recuerda mucho a VMWare Workstation y me parece más completo que el tándem Q-Qemu. Tiene un asistente de instalación y configuración de nuevas máquinas virtuales, permite usar puertos serie y USB, audio y varias interfaces de red, …

También provee de un conjunto de drivers para el sistema virtualizado (Windows o Linux) que mejoran las prestaciones de la máquina virtual (resolución de la pantalla adaptable, directorios compartidos con la máquina anfitriona, …)

Resumiendo: me ha gustado mucho esta herramienta. Las máquinas virtualizadas parece que van más rápido que con Qemu.

Pantallazo 1: Mac OSX como anfitrión, ejecutando dos máquinas virtuales (Windows XP y Ubuntu Linux). Las tres máquinas están mostrando un “Hola, mundo” escrito en Python.

Mac OSX como anfitrión, Windows XP y Ubuntu virtualizados

Pantallazo 2: Windows XP como anfitrión, máquina virtual: Debian Etch

Windows XP como anfitrión, máquina virtual: Debian Etch

Comentarios

<- artículos más recientes      artículos anteriores ->

888 comentarios de spam
bloqueados por
Akismet