miércoles, 26 de diciembre de 2007

Navegadores en Linux

En la entrada anterior comparaba el gasto de recursos de los navegadores más típicos en MacOSX. Es el turno de los navegadores en Linux.

navegadores-linux.png

Esta vez sólo he abierto cinco pestañas en cada uno de ellos: Firefox, Opera y Konqueror. El Firefox aquí está "pelado", sin ninguna extensión y parece que es el más ligero.

procesos-linux.png

Navegadores en MacOSX

Me confieso usuario habitual de Firefox en el Mac, pero cada vez me parece más lento y pesado. La pena es que en Safari y Opera algunas webs no cargan del todo bien.

Firefox, Safari y Opera

Creo que está empezando a pasar con Firefox lo que pasaba (y sigue pasando) hace unos años con el Internet Explorer: se desarrollan webs para estos navegadores y al resto, que los zurzan ;-)

En cuanto al rendimiento, una sencilla prueba, cargando una decena de pestañas idénticas en los tres navegadores nos revela que el Firefox (sólo tiene las extensiones Web Developer y Firebug instaladas), como sospechaba, es el más "pesado" de los tres, pero tampoco mucho.

procesos.png

Por ahora seguiré con Firefox, creo.

lunes, 24 de diciembre de 2007

La batalla de los formatos (1ª parte)

Hoy: formatos de vídeo de alta definición

Nos vamos a salir un poco de la temática informática.
¿Recuerdan la "guerra" de los formatos de vídeo doméstico que se produjo en los años 80?
Para los más jóvenes: había dos sistemas de vídeo, VHS y Betamax. VHS ofrecía menos calidad pero más tiempo de grabación en cada cinta. Por otra parte, la empresa que inventó el VHS en seguida abrió la posibilidad de que otros fabricantes utilizasen el formato.

Casi 30 años después, parece que se repite la historia, incluso algunos actores repiten. Tenemos ahora mismo en el mercado dos formatos de vídeo de alta definición: Blu-ray y HD-DVD.
Aparentemente el Blu-ray ofrece un poco más de capacidad de almacenamiento y una mayor inmunidad frente a discos rayados o sucios. El formato HD-DVD guarda algunas similitudes con el DVD convencional y es más económico. Este último fue propuesto por la organización DVD Forum, el formato Blu-ray ha sido desarrollado fuera de esta organización.

Ambos formatos tratan de mejorar la protección anticopia mediante un sistema llamado AACS, aunque este sistema ya ha sido vulnerado. También se implementa un sistema que reduce la calidad de la señal de vídeo cuando se utiliza un cable analógico (esto es, un cable de vídeo normal).

Existen reproductores de mixtos de DVD y Blu-ray, de DVD y HD-DVD y otros (más caros) que reproducen cualquiera de ellos, tanto en versiones "de sobremesa" como para ordenadores. Algunas video-consolas incluyen lector de Blu-ray, otras reproducen HD-DVD.

¿Cuáles son las consecuencias para nosotros, los usuarios?

Realmente ambos formatos ofrecen una calidad muy buena, la diferenciación es más bien artificiosa. Los usuarios estamos soportando una guerra comercial entre dos grandes multinacionales con intereses contrapuestos (Sony, impulsora del Blu-ray, dedicada a la industria del entretenimiento y Microsoft, que apoya el HD-DVD, gigante del software, ... )

En mi opinión, lo que me parece es una tomadura de pelo y un intento de vender más: para poder apreciar bien la mejora de calidad que supone el vídeo de alta definición se necesita un buen equipo (TV de alta resolución, amplificadores y altavoces adecuados, un buen espacio -en un salón de 20 m2 el resultado es más bien atronador-, ...)
Por otra parte, las conexiones de banda ancha (= posibilidad de descargar películas) y las mejoras en los formatos de vídeo comprimido (DivX, ...) facilitan a los usuarios ver películas en alta calidad en un reproductor híbrido de los que ahora abundan y "tragan" con todos los formatos y soportes.

Cada vez hay más personas desencantadas con la industria del entretenimiento y sus prácticas. El arte (cine, música) se entremezcla con intereses comerciales y corporativos, los precios de los soportes siguen sin bajar y se restringen cada vez más los derechos de los consumidores (véase la implantación de los sistemas anticopia y de degradación de la señal).

Finalmente, una valoración muy personal y generalizadora: ahora que tenemos una mayor calidad técnica, la calidad artística es peor.

sábado, 22 de diciembre de 2007

¡Ha salido Tcl/Tk 8.5!

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!

viernes, 21 de diciembre de 2007

Cacheando, que es gerundio

El otro día nos llamó un lector del periódico para preguntarnos porqué le había desaparecido un comentario que había escrito en una noticia.

Le preguntamos qué noticia era y, tras localizarla, observamos que su comentario estaba visible.
Preguntamos entonces al lector qué navegador estaba usando (era Internet Explorer) y le sugerimos entonces la combinación "mágica" de teclas: Ctrl+F5

¡Ya veo el comentario! nos respondió el paciente lector, ¿por qué pasaba esto?, nos preguntó. Mi respuesta fue algo críptica: "el navegador le estaba mostrando la página no actualizada que tenía guardada en la caché".

Intentaré en esta entrada enmendarme y explicar un poco mejor qué es eso de la caché.
Podríamos definir caché como una técnica ampliamente utilizada en los ordenadores que consiste en guardar la información más utilizada en una localización más cercana (más accesible y rápida) al elemento que necesita esta información en vez de en su ubicación original.

No queda muy claro ¿verdad?

A ver si con un ejemplo se entiende mejor:
Volvamos al lector de las noticias y su programa navegador. Generalmente los navegadores van guardando una copia en el ordenador del usuario de las páginas y otros elementos (imágenes, archivos auxiliares, etc) que el usuario va visitando.
Con esto lo que se consigue es que cuando visitamos una página en la que ya hemos estado anteriormente el navegador nos muestra la copia que guardó en la anterior visita, en vez de recuperar los contenidos de la página de internet.
Obviamente, la página se carga en el navegador instantáneamente ya que está guardada en el mismo ordenador del usuario. La desventaja de esto es que si la página "verdadera" ha cambiado mientras, no nos enteramos.
La ubicación donde el navegador guarda estas páginas temporales es la llamada caché del navegador.

No sólo "cachean" (disculpen el barbarismo) los navegadores. Como decíamos, esta técnica se utiliza mucho, y a todos los niveles: desde los microprocesadores (CPU) hasta los programas que utilizamos los usuarios finales.

Esta misma página que Ud. está leyendo ha sido cacheada varias veces por distintos dispositivos y programas.
La mayoría de las páginas web hoy en día no son estáticas, sino dinámicas, esto es, se generan "al vuelo", cuando alguien (el lector) las solicita a un servidor web.

Este texto que estoy escribiendo, el título, la fecha y demás datos se guardan en una base de datos. Cuando alguien solicita esta página, el servidor web a su vez pide los datos a la base de datos (que puede estar en la misma máquina o en otra). Una vez obtenidos los datos necesarios, "compone" la página dinámicamente, poniendo el título en un sitio, el texto en otro, añadiendo el encabezado de la página y el pie. Una vez montada la página, la devuelve al cliente (la persona que desde su navegador solicitó la página).

En este sencillo proceso se cachea casi todo por razones de eficiencia. Si a la base de datos le va a llegar muchas veces la solicitud "dame el título, texto y fecha del artículo X", el programa que la gestiona guardará en memoria los resultados de esta consulta, para que la siguiente vez que se lo pidan pueda devolver estos datos con mayor rapidez.

El servidor web, una vez que tiene los datos, como decíamos, "monta" la página final y la guarda también, para que la siguiente vez que le sea solicitada no tenga que repetir la consulta a la base de datos ni el proceso de montaje.

Finalmente, el navegador de la persona que solicitó la página con toda probabilidad también cacheará la página, o algunos de sus elementos, para que en una posterior visita no tenga que solicitarla de nuevo al servidor web.

La duda que nos puede surgir es ¿cuánto tiempo permanecen los datos en las cachés? En algún momento tendrán que renovarse, si no, veríamos siempre todo igual.

La respuesta es compleja, y depende mucho de la tipología del sitio web, del número de visitas y muchos más factores. Por ejemplo, este blog actualiza su caché cada 5 minutos aproximadamente. Otras páginas web, en las que la información varía más en el tiempo (por ejemplo, la página web del diario Público) se actualizan con mayor frecuencia. A menudo se busca un compromiso entre la conveniencia de cachear páginas (se sirven con mayor rapidez) y la necesidad de que éstas estén actualizadas.

jueves, 20 de diciembre de 2007

Al cabo de un año, el perro se parece al amo

¿Recuerdan el refrán? A los informáticos nos pasa lo mismo. De tanto trabajar con ordenadores, acabamos pensando como tales.
Los ordenadores son sólo máquinas, para hacer su trabajo necesitan unas instrucciones precisas, no entienden ambigüedades ni sutilezas. Las personas que nos dedicamos a la informática, en numerosas ocasiones, también.

Con su permiso, voy a contarles una batallita.
Hace unos años estaba encargado del mantenimiento de un programa de contabilidad y gestión de almacén. Según se iba acercando la implantación del euro, hubo que hacer modificaciones en el programa para que mostrase todos los importes en pesetas y euros.

Tras una breve reunión con los usuarios, se decidió añadir un campo adicional en los formularios y una columna más en los listados con el importe convertido en euros. Era un trabajo sencillo, y al cabo de una semana el cliente ya tenía la modificación hecha.

Al cerrar el mes, recibí una llamada del cliente, me contaba que los totales en euros que daba el programa y los que recibía de los proveedores no coincidían, eran errores pequeños, del orden de céntimos de euro, uno o dos euros a lo sumo, pero estaban ahí.

Lo primero que pensé fue que el factor de conversión (1 € = 166,386 pta) lo había puesto mal, revisé donde aparecía y estaba bien. Lo siguiente fue revisar el proceso de conversión a euros: multiplicaba el importe en pesetas por el factor de conversión y el resultado lo redondeaba a dos decimales. Todo parecía correcto.

Al final, hablando con personas que trabajaban en contabilidad me enteré que para pasar a euros el redondeo no es el mismo que el redondeo "matemático": pasando de pesetas a euros se redondea siempre "hacia arriba". De los diversos criterios "matemáticos" para redondear, uno de los más utilizados es el "redondeo al par más próximo".





























PesetasEuros
Redondeo “monetario”Redondeo “matemático”
10,10510,1110,10
10,11510,1210,12
10,12510,1310,12
10,13510,1410,14

Pues bien, mi programa utilizaba una función que redondeaba "matemáticamente". Se cambió la función para que redondease "hacia arriba" y todo arreglado en unos minutos.

¿Por qué surgió este problema? Fue un doble error, del cliente y mío. Del cliente por presuponer que yo sabía cómo se redondea "monetariamente", y mío por no preguntarlo (pienso que la forma de redondear "matemática" es más precisa y promedia los errores de redondeo mejor que el método "monetario": tengo la mente un tanto cuadriculada, y así trabajo).

Conclusión: los informáticos, en muchas ocasiones, pensamos diferente que nuestros usuarios.

La próxima vez que llame al informático de su oficina no le diga "no puedo imprimir".
Dígale
"al tratar de imprimir en la impresora X, me salta un cuadro de error que dice 'La junta de la trócola se ha descogorciado. Aceptar/Cancelar'".
Verá cómo su informático tarda menos en arreglar el problema y lo hace con una sonrisa en el rostro.

Si está encargando al programador un listado de clientes no le diga "quiero un listado de los clientes". Mejor será "quiero un listado de clientes, ordenados por su CIF ascendentemente, con 50 líneas como máximo por pantalla y la posibilidad de reordenar el listado por apellidos, fecha de alta en el sistema o número de teléfono".

No tema agobiar a un informático nunca con un exceso de información (relevante, eso sí). Nos gusta y lo agradecemos.

miércoles, 19 de diciembre de 2007

Un canon mal pensado

Estos días se vuelve a hablar mucho del canon que se aplica a los soportes y dispositivos que pueden reproducir archivos multimedia.

Entiendo la necesidad de compensar a los autores de alguna forma por la copia privada de sus obras. Creo que la mayor parte de los consumidores está de acuerdo con esto. La copia privada es legal y está reconocida por una directiva de la Unión Europea, así como esta compensación.

Lo que no es de recibo es que esta compensación repercuta indiscriminadamente sobre los consumidores. ¿Por qué voy a pagar 12 € más por un disco duro externo que sólo utilizo para hacer copias de seguridad de mis archivos? ¿Por qué tengo que pagar un sobreprecio en los DVDs que compro para copiar mis fotos? Al final vamos a tener que hacer las copias de seguridad en unidades de cinta, que no estan "canonizadas".

No estamos hablando de piratería, ése es otro tema. Estamos hablando de una tasa que se aplica sistemáticamente, se efectúe o no la copia privada.

Se escuchan argumentos muy pueriles a favor del canon: que si está implantado en toda Europa, que si es la única forma de compensar a los autores, etc. No valen estas justificaciones. Si algo está mal pensado, está mal pensado se haga donde se haga.

Hay que buscar otro mecanismo.
Señores políticos, entidades de gestión: piensen, que es su trabajo. Encuentren otra forma de compensar a los autores sin gravar injustamente a todos los consumidores.

martes, 18 de diciembre de 2007

Las tripas de un ordenador

"Tengo que ampliar la RAM", "el disco duro esta lleno", "esta CPU es muy potente", ...

Nuestro lenguaje cotidiano está lleno de tecnicismos y referencias a dispositivos informáticos. ¿Sabemos realmente su significado y cuál es su función?

Hagamos un poco de historia.

Las primeras computadoras electrónicas se empezaron a diseñar y construir en los años 30-40 del siglo XX. Eran artilugios de un tamaño monstruoso que funcionaban a base de válvulas de vacío, condensadores, resistencias y otros componentes electrónicos de uso común.
Sin embargo, pese a su aparente primitivismo, muchas de estas primeras computadoras ya tenían un estructura similar a la que encontramos en los ordenadores actuales: una parte se ocupaba de realizar los cálculos y operaciones lógicas, otro componente estaba especializado en almacenar instrucciones y resultados de los cálculos y, finalmente, otro conjunto de dispositivos se encargaba de recibir datos de entrada y presentar o emitir los datos procesados.

Como decíamos, hoy los ordenadores tienen una estructura muy similar.
Examinemos los más importantes, simplificando bastante y siguiendo un criterio no muy académico.

1. CPU
Son las siglas de "Central Processing Unit" (Unidad Central de Proceso).
Básicamente desempeña varias funciones diferenciadas, asignadas cada una de ellas a un subsistema dentro de la misma CPU.

  • Mantener un mecanismo de sincronización o temporización para todas las operaciones que realiza. El dispositivo más habitual es un generador de pulsos periódicos, comúnmente llamado "reloj".

  • Controlar o gestionar el funcionamiento general de todas las operaciones y procesos que se llevan a cabo.

  • Leer e interpretar las instrucciones que están almacenadas en la memoria.

  • Hacer los cálculos y operaciones lógicas necesarias.

  • Guardar resultados intermedios e instrucciones temporalmente. Estos se almacenan en unas memorias internas de la CPU llamada registros.


Coloquialmente llamamos "CPU" a la caja del ordenador (en modelos de sobremesa), pero esta denominación no es correcta: en la caja realmente se encuentran la CPU, la memoria, los discos duros, la fuente de alimentación y más componentes.
La velocidad de funcionamiento de una CPU se suele medir como la frecuencia del reloj interno (hertzios o múltiplos, del orden de GHz en las CPUs actuales)

2. Memoria principal
También llamada RAM (Random Access Memory, memoria de acceso aleatorio), en referencia a su funcionamiento.
En la memoria principal se almacenan datos e instrucciones. Para entendernos: en la memoria en un momento dado está cargado tanto el programa que estamos ejecutando (por ejemplo, el procesador de textos) como los datos que maneja el programa (el texto que estamos escribiendo).
La memoria principal suele ser volátil, esto es, si se apaga el ordenador, su contenido se pierde. Por esta razón se necesita algún dispositivo de almacenamiento permanente, para guardar los programas que necesitamos para trabajar y los datos con los que trabajamos.
Actualmente la memoria principal en ordenadores personales suele ser de cientos de Mb a algunos Gb [*]

3. Memoria auxiliar o secundaria.
Son los dispositivos en los que la información se guarda de forma más o menos permanente (discos duros, CDs, DVDs, memorias externas -USB y similares-, etc)
Son más lentos que la memoria principal y por esta razón cuando arrancamos un programa (el navegador, por ejemplo), primero se lee del disco duro y se transfiere el programa a la memoria principal. La CPU entonces accede a la memoria principal y "lee" las instrucciones que debe llevar a cabo.
La capacidad de almacenamiento en los discos duros actuales está comprendida entre decenas y centenas de Gb.

A veces el conjunto de instrucciones de un programa es demasiado grande y no cabe en la memoria. En este caso, sólo se carga parte del programa en la memoria principal. Cuando se necesitan más instrucciones, se leen del disco duro. Este último acceso es menos rápido, por lo que, si este acceso al disco duro es muy frecuente, tendremos la sensación subjetiva de que "el ordenador va lento".

4. Dispositivos de entrada y salida
Monitores, teclados, ratones, escáneres, impresoras, ... Todos son dispositivos que permiten introducir y/o recuperar información en el ordenador e interactuar con las personas que los utilizan.

Podemos generalizar y decir que las unidades funcionales de un ordenador mantienen una jerarquía, y que, cuanto más "abajo" en esta jerarquía, mayor lentitud de funcionamiento.

El componente más rápido es la CPU, seguido de la memoria principal, la memoria auxiliar y los dispositivos de entrada-salida. El "componente" más lento somos nosotras, las personas.

(*) En próximas entradas hablaremos de hertzios, megas, gigas y demás unidades.

Para saber más

miércoles, 5 de diciembre de 2007

Herramientas para desarrollo Web

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.

lunes, 3 de diciembre de 2007

Triple arranque en iMac

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.

miércoles, 28 de noviembre de 2007

Patrones de diseño para torpes - 2ª parte

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'.
~ $

viernes, 16 de noviembre de 2007

Virtualización en Mac OSX (2)

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

domingo, 4 de noviembre de 2007

Colores

colores.pngEn el colegio nos enseñaban que los colores primarios eran amarillo, rojo y azul, que mezclando azul y amarillo salía color verde ...
Luego empezamos a trabajar con pantallas y nos encontramos con que los colores "primarios" son los del sistema RGB (rojo, verde y azul) y que rojo y verde da amarillo.
Cualquiera que sepa algo de diseño sabe que son dos sistemas de color diferentes, el aditivo y el sustractivo, y que los colores primarios de cada sistema no son los mismos, aunque coloquialmente se les llame igual.
Pero claro, a un pobre programador como yo, al que si le sacas de lo suyo está totalmente perdido, estas cosas se le escapan ;-)
El problema es que el "rojo" del sistema RGB (#FF0000) en realidad es "rojo anaranjado", el "azul" RGB (#0000FF) es "azul violáceo".
En esta figura se ve la "equivalencia" entre los dos sistemas. Las mezclas funcionan entre dos colores alternos. Por ejemplo, rojo + verde = amarillo, verde + azul = cian, ...

Para saber más, este "post" en malaciencia.info

viernes, 2 de noviembre de 2007

Tira nº 57: corte y confección




Ahora en serio: en mi blog estoy haciendo una serie "divulgativa" sobre patrones de diseño.
El primero que trato de explicar es el patron "factory".

martes, 30 de octubre de 2007

Patrones de diseño para torpes - 1ª parte

Hoy hablamos de los famosos patrones de diseño o design patterns. Hay montones de libros y artículos sobre el tema, empezando por el famoso libro "Desing Patterns", de Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides.

El caso es que no me acabo de enterar muy bien (a ratos soy un poco lerdo) y me pierdo un poco, así que he decidido explicarme a mí mismo algunos patrones de diseño típicos.



Una de las cosas que no me gustan es que las explicaciones y ejemplos que se proponen en muchos libros o artículos están relacionadas con objetos "sofware". ¿No es acaso la programación orientada a objetos una ayuda para representar o modelizar sistemas u objetos "reales"?

Pues voy a tratar de explicar los patrones de diseño con ejemplos cotidianos, no "software", a ver qué tal me sale.

El patrón "Factory"


Este patrón de diseño es muy útil cuando tenemos que crear (=instanciar) distintos objetos que tienen algo en común (=comparten una interfaz). Ya me he liado con tecnicismos.

Imaginemos que vamos con nuestra cámara de fotos y el coche teledirijido de nuestr@ hij@ a una tienda de electricidad para comprar pilas. El enfoque "sencillo" (=aplicando un patrón de diseño) es decirle al vendedor: "quiero pilas para estos cacharros". El enfoque complicado (=instanciar cada objeto por separado) es decirl: "quiero pilas AAA (de 1,5 V) para la cámara, una pila de petaca de 9V para el mando y pilas AA para el cochecito".

Analicemos el objeto demandado en cuestión: las pilas. ¿Qué caracteriza a una pila? Su voltaje, su tamaño y poco más. Es decir, las pilas tienen una interfaz común, pero son diferentes unas de otras. Si tuviésemos que modelizarlas usando clases tendríamos la clase PilaAAA, PilaPetaca, PilaAA y alguna más.
mi_pilaAAA = new PilaAAA()
mi_pilaPetaca = new PilaPetaca()
mi_pilaAA = new PilaAA()

Cada uno de estos objetos instanciados deberíamos asociarlo a su receptor:
camara_fotos.setPila(mi_pilaAAA)
mando_distancia.setPila(mi_pilaPetaca)
cochecito.setPila(mi_pilaAA)

¿No sería más cómodo tener algo (=el dependiente) que se encargase de darnos las pilas con sólo decirle para qué las queremos?
dependiente = new Dependiente()
camara_fotos.setPila(dependiente.damePilas(this))
mando_distancia.setPila(dependiente.damePilas(this))
cochecito.setPila(dependiente.damePilas(this))

Parece un gran avance, ¿no? Cada objeto cliente (la cámara, el mando a distancia y el cochecito) se despreocupan de saber qué características tienen las pilas que usan. Simplemente le piden pilas al dependiente y listo.
Es tarea del dependiente saber qué tipo de pilas tiene que devolver, y la forma de hacerlo (=implementación) es transparente para el cliente. Hoy puede que el dependiente mire un catálogo, mañana puede que consulte una base de datos y pasado mañana a lo mejor solicita un fichero XML de aparatos y pilas, pero esto no es algo que deba saber el objeto cliente.

Bien, pues simplificando bastante, el patrón "Factory" es esto mismo. Un objeto especializado se encarga de instanciar objetos para clientes, y estos utilizan los métodos que proporciona la interfaz del objeto recibido, pero sin saber nada de las interioridades del objeto, ni siquiera qué tipo de objeto es (=a partir de qué clase está instanciado).

Veamos un ejemplo un poco más "software". Imaginemos que tenemos una clase sencilla en una aplicación de blogs que se dedica a "pintar" en pantalla el título, autor y fecha de publicación de algunos envíos.
Estos envíos pueden estar guardados en una base de datos o provenir de un RSS, por ejemplo.

A la clase cliente (la que "pinta" en pantalla") le da igual el origen de los datos, sólo quiere los datos. Voy a poner un poco de código --utilizaré Python, que me gusta bastante ;-) y me parece muy claro.
class EnviosRSS:
def __init__(self, url_rss):
# Hacemos algo para traer los datos de la url
self.post = lo_que_sea
def dameAutor(self):
return self.post.autor
def dameTitulo(self):
return self.post.titulo
def dameFecha(self):
return self.post.fecha

class EnviosBBDD:
def __init__(self):
# Hacemos algo para traer los datos de la base de datos
self.post = lo_que_sea
def dameAutor(self):
return self.post.autor
def dameTitulo(self):
return self.post.titulo
def dameFecha(self):
return self.post.fecha

class EnviosFactory:
def dameEnvios(self, url=''):
if url == '':
return EnviosBBDD()
else:
return EnviosRSS(url)

# código cliente
factory = EnviosFactory()
envios1 = factory.dameEnvios()
envios2 = factory.dameEnvios('http://davidasorey.net/index.php/feed/rss')
# pintamos los envios
print envios1.dameTitulo()
print envios1.dameAutor()
print envios1.dameFecha()
print envios2.dameTitulo()
print envios2.dameAutor()
print envios2.dameFecha()

Unas notas sobre la terminología "pythonera": los métodos se definen con def, las clases se instancian llamando al nombre de la clase, sin new. El constructor (algo parecido, realmente) es el método __init__. Por últimos, los métodos al definirse siempre deben llevar el self por delante. Realmente Python no es un lenguaje orientado a objetos puro, pero ni falta que le hace ;-)

Para finalizar, muy importante: esto no es una lección magistral. Es mi visión personal del patrón "Factory", que puede ser errónea e incompleta. Se admiten (se ruegan) sugerencias y comentarios.

miércoles, 24 de octubre de 2007

Comparativa de “Frameworks” para PHP

Volvemos con la palabreja de moda: framework. Tras el enorme éxito de Ruby On Rails y otros framework como Trails, Django o TurboGears, el mundillo PHP se ha puesto las pilas y han surgido algunos proyectos similares.

¿Por qué utilizar PHP como lenguaje base para un framework en vez de otros lenguajes con una orientación a objetos más definida o clara como Ruby, Python o Java? [1]

La razón principal, en muchos casos, es la amplia extensión de PHP en los servidores. Prácticamente todos los proveedores suministran planes de hosting con PHP y MySQL. Si no se dispone de un servidor dedicado o especializado, no es habitual poder contar con Ruby, Java o Python para hacer desarrollos.

En mi opinión, los frameworks para PHP con más aceptación son el Zend Framework, CakePHP y Symfony. Mi impresión es que Zend Framework es, sobre todo, una colección de clases, paquetes y herramientas, mientras que CakePHP y Symfony son más del estilo RoR.

Entre CakePHP y Symfony se puede decir que el primero es más sencillo y que el segundo ofrece más características. Sinceramente, la mejor forma de evaluarlos es dedicando unas horas a cada uno, pero no siempre tenemos tiempo para esto. Afortunadamente, he encontrado dos comparativas (en inglés) muy ilustrativas:

[1] PHP 5 ha mejorado mucho en lo que a programación orientada a objetos se refiere. Ya tenemos control de acceso en los métodos, gestión de excepciones, ...

jueves, 18 de octubre de 2007

Virtualización en Mac OSX

Existen numerosas soluciones de virtualización para el Mac OSX, algunas propietarias y otras libres (Parallels, VMware Fusion, Bochs, Qemu, ...)

Actualmente estoy utilizando Qemu. Según la documentación, puede emular a un procesador x86 con una frecuencia de 500 MHz. Más que suficiente para hacer pruebas sin tener que reinicar el equipo con otro OS.

Existe un "front-end" para Mac OSX y Qemu llamado Q. Tiene algunas características muy agradables, como una interfaz bastante amigable, la posibilidad de descargarse imágenes de máquinas virtuales preinstaladas, redimensionamiento de la pantalla automático, un cambio de host a anfitrión rápido, ...

En la siguiente captura se ve un Ubuntu corriendo en modo texto, iniciamos la sesión gráfica (startx), pasamos a pantalla completa y luego cambiamos de anfitrión a host varias veces. El efecto de cubo rotando está bastante conseguido.
[youtube p1b4SMkb-zM nolink]

miércoles, 17 de octubre de 2007

Microsiervos …

Me gusta(ba) mucho leer Microsiervos, pero, cada vez más, me recuerdan a los publireportajes que aparecen a veces en los periódicos simulando ser una noticia ...

viernes, 12 de octubre de 2007

La pesadilla de los “encoding” (2ª parte)

Decíamos en la anterior entrada que cuando un fichero puede codificarse con UTF-8. Existen dos variantes del formato UTF-8: con BOM y sin BOM. BOM son dos bytes (FE FF) al principio de un fichero que, simplificando mucho, indican el orden de los bytes.
Guárdese un fichero codificado en UTF-8 con el BOM y tendrá problemas con la mayoría de sus scripts en PHP o ficheros XML, ya que el fichero realmente no comenzará como "<?php" o "<?xml".

Imaginen ahora el siguiente entorno de trabajo: un servidor web más o menos moderno que sirve los documentos por defecto con la codificación UTF-8, un desarrollador con una estación de trabajo Windows o Linux y un diseñador con la estación de trabajo Mac. Si el desarrollador y el diseñador no vigilan el "encoding" con el que guardan sus ficheros habrá problemas con seguridad. Muchas herramientas de desarrollo y/o diseño Web guardan por defecto los ficheros codificados con ISO-8859-1, otras lo guardan en UTF-8 con BOM.

Por supuesto, existen soluciones, a nivel servidor (ficheros .htaccess con la directiva AddDefaultCharset) y a nivel estación de trabajo utilizando herramientas competentes que puedan lidiar con las diferentes codificaciones.

Esta es la típica página que se ve mal porque el servidor sirve en ISO-8859-1 y el fichero está codificado como UTF-8:
Captura de un navegador mostrando caracteres UTF-8 como Latin-1

Se puede ver cómo los caracteres acentuados (ocupan 2 bytes en Unicode) son interpretados como 2 caracteres sencillos.

En el blog de Juque hay más ejemplos y se amplía más la información.

La conclusión final que obtengo es la siguiente: si no se puede garantizar una uniformidad en las plataformas de trabajo (que todo el mundo trabaje con el mismo "encoding"), lo más seguro es utilizar las entidades HTML de toda la vida (á en vez de á, ñ en vez de ñ, ...)

miércoles, 3 de octubre de 2007

La pesadilla de los “encoding”

Estamos en el año 2007. Internet forma parte de las vidas de muchas personas. Pues, por increíble que parezca, algun@s todavía tenemos que lidiar con problemas cuyo origen se remonta a varias décadas atrás.

Antecedentes: en los años 60 se aprobó un código estándard para la codificación de caracteres alfanuméricos. Era una buena idea, puesto que hasta el momento, cada fabricante usaba más o menos el código que le daba la gana. Con este código, ASCII, se consiguió una cierta estandarización.

La idea era utilizar 7 bits (lo que nos da 2^7 = 128 códigos diferentes) para representar los caracteres y símbolos del lenguaje escrito. Por ejemplo, el 65 (0100 0001 en binario) representaba la letra A (en mayúscula), el 32 (0010 0000 en binario) representaba el espacio en blanco, etc.

Magnífica ocurrencia, si tu idioma es inglés. En seguida l@s europe@s nos dimos cuenta de que este sistema no era muy válido: muchos caracteres no tenían representación: eñes, cedillas (ç), vocales con diversos acentos (á, à, â, ä, ...)

La solución que se encontró fue rápida: ya que un byte tiene 8 bits y el ASCII sólo utiliza 7 (el octavo bit se destinó para control de errores), se decidió utilizar ese octavo bit para ampliar el rango de caracteres disponibles (2^8 = 256). Surgía la codificación ISO-8859.

También parecía una buena idea, pero no resultó ser tan idónea: algunos idiomas necesitaban una ñ, por ejemplo, pero otros necesitaban una ç. Algunos idiomas europeos sólo necesitaban un tipo de acentos, pero otros utilizaban más. El resultado de estas necesidades diferentes fue que no se llegó a una única codificación utilizando 8 bits. La codificación ISO-8859-1 (también llamada Latin-1) sirve para casi todos los idiomas de Europa Occidental, la ISO-8859-15 es una revisión de ésta que incluye el símbolo del euro (€). La codificación ISO-8859-16 (Latin-2) se adapta a idiomas de Europa Oriental.

Por otra parte, otros fabricantes decidieron hacer lo que les pareció con el 8º bit no utilizado. Añadieron nuevos símbolos o caracteres extraños al ASCII estándar. Surgen así diversos "codepages" parcialmente compatibles entre ellos (CP437, Windows-1252, ...) y con ISO-8859

Estas codificaciones extendidas supusieron una mejora, pero no fueron el remedio definitivo. Además de mantenerse ciertas incompatibilidades, no servían para codificar algunos idiomas no alfabéticos (idiomas fonéticos o ideográficos).

La siguiente idea fue Unicode: utilizar 2 byte completos (o más) para representar los caracteres o símbolos. Con 2 bytes (2^16) ya tenemos 65.536 posibilidades o símbolos diferentes. Unicode consigue representar y asignar un código único a prácticamente cualquier símbolo escrito en cualquier idioma humano. Además, mantiene la compatibilidad con ASCII y Latin-1: los 128 primeros caracteres de Unicode se corresponden con la codificación ASCII, y los 128 siguientes (hasta 256) se corresponden con Latin-1.

El problema de Unicode es la transmisión de los datos: es absurdo reservar siempre dos bytes para un carácter cuando la mayor parte de los caracteres Unicode que se pueden transmitir en un momento dado "caben" en un byte. Las diferentes formas de transmitir e interpretar los caracteres Unicode son los famosos UTF, siendo los más utilizados UTF-8 y UTF-16.

Seguiremos con el tema.

martes, 11 de septiembre de 2007

MacOS X

Bueno, pues me he comprado un iMac (bastante bien de precio, era el modelo de "exposición" y me lo dejaron más barato). Por ahora estoy usando bastante el S.O. que trae (MacOS X 10.4 "Tiger") y la verdad es que es una maravilla para un usuario final. Sencillo, agradable a la vista, aspecto unificado, aplicaciones muy fáciles de instalar, bastantes utilidades incorporadas ...

No conocía el MacOS X y ahora veo de dónde vienen muchas ideas y novedades que veo en el escritorio Linux. El panel de preferencias del sistema de KDE es "calcado" al del Mac, las virguerías gráficas de Beryl/Compiz son muy parecidas al "Expose" del Mac, los gDesklets de Gnome son similares al "Dashboard" del Mac, ... Qué lástima que sea un sistema cerrado.

Echo en falta:

  • Poder toquetear un poco más fácilmente las tripas del sistema (aunque con la Terminal se puede hacer lo que se quiera)

  • Ratón con más de un botón (he acabado comprando un ratón de PC de toda la vida)
    Actualización: leer los comentarios

  • apt-get (a ver si investigo un poco más Fink y Darwin Ports)


Por lo demás, una compra satisfactoria y un descubrimiento muy agradable.

Actualización: ya tengo apt-get en mi Mac, gracias al proyecto Fink.
Ejemplo de uso: sudo apt-get install wget ¡Genial!

jueves, 16 de agosto de 2007

Tira nº 56: fin de las vacaciones



En mi caso no llego a tanto, pero sí que han sido 800 Mb en fotos. Lo de las cámaras digitales es de locos. Al final sacas fotos hasta de las señales de tráfico.

martes, 24 de julio de 2007

Gambas tutorial

Gambas is an IDE ("Integrated Development Environment") oriented towards RAD ("Rapid Applications Development"), like the popular propietary programs Microsoft Visual Basic or Borland Delphi.You may read the tutorial here: Gambas Tutorial.

Partida interminable

Una partida interminable de Xgalaga ;-)

El truco: iniciar Xgalaga en linea de comandos pasándole un -level muy, muy alto.

[youtube NkGBAUPCEc8 nolink]

lunes, 23 de julio de 2007

Pitch & Tunning Studio

Pitch & Tunning Studio es un pequeño programa que sirve para evaluar las diferencias que hay entre los distintos sistemas de afinación de la música occidental (pitagórico, temperado y natural, entre otros).



Está desarrollado con el lenguaje Tcl/Tk y la librería Snack [1]

Por cierto, creo que es el último programa que escribo con este lenguaje.

No llega a 400 líneas de código y he acabado mareado con la sintaxis extraña de Tcl. En mi opinión y para mi gusto, sirve para programas cortos y scripts sencillos, pero no me veo a mí mismo escribiendo (y manteniendo) algo que tenga más de 1000 líneas de código con Tcl.

Además, el aspecto de los "widgets" es horroroso ;-)
A ver si encuentro algo parecido a Snack pero que no esté "atado" a un "toolkit" determinado. Y si lo puedo usar con Python, mejor que mejor.

Nota 1: realmente es impresionante lo que se puede llegar a hacer con Snack. En la distribución estándar vienen bastantes ejemplos (en Windows, en el directorio c:tcldemosSnack y en Linux, bajo /usr/share/doc/libsnack2/examples). Mis preferidos son generator2.tcl y formant.tcl, un generador o sintetizador de ondas estéreo y un sintetizador de formantes:


Como decía más arriba: ¡qué pena que Snack esté tan ligado a Tk!

Tira nº 55: censura



Penti está haciendo un poco el ridículo, pero no es el único.

miércoles, 11 de julio de 2007

WinMMA

Como comentaba en otras entradas, utilizo bastante el programa MMA. Al ser un programa en línea de comandos y con un fuerte "sabor UNIX" los usuarios de Windows pueden encontrarlo un poco árido y difícil de utilizar.

El proyecto WinMMA pretende ayudar a los usuarios de Windows que quieren utilizar MMA. Actualmente consta de un instalador que incluye MMA, documentación, un editor de texto (SciTE) preconfigurado y un editor "visual" (LeMMA) y otros archivos de soporte (intérprete de Python, librerías, etc).

miércoles, 4 de julio de 2007

Tira nº 53: el anuncio de un regreso



Hola de nuevo.
Esto es un nuevo intento de continuar con "La tira de Penti y Atlo".
Intentaré que al menos sea quincenal, pero no prometo nada ;-)

domingo, 1 de julio de 2007

Depurar PHP con Eclipse

Curioseando un rato ya encontré la forma de depurar PHP con Eclipse. Eso de saber por dónde va el código a base de sentencias echo y var_dump no es muy serio.

La empresa Zend proporciona un "plugin" basado en PDT que incorpora un producto llamado "Zend Debugger". En el momento de escribir ésto la versión "estable" de PDT es la 0.7, si bien existe una versión 1.0 que sólo funciona con Eclipse 3.3. El plugin que proporciona Zend se basa en PDT 1.0, pero funciona con Eclipse 3.2.

La instalación es muy fácil, en la página de Zend se describe. Sobre una instalación de Eclipse sólo hay que irse al "Update Manager", poner la URL de Zend (http://downloads.zend.com/pdt) y listo.

Al grano. Veamos cómo se depura.

Tenemos un script muy sencillo (hola.php):

<?
$uno = "Hola, ";
$dos = "mundo";
echo $uno . $dos . "!";
?>

Veamos cómo se depura. Creamos un "PHP Project" y un archivo "PHP file".

Haciendo doble click en el margen del editor de código se añade un punto de interrupción.

Añadir punto de interrupción

Con el botón derecho, damos al menú "Debug as PHP Script". Se nos cambia a la perspectiva de PHP Debug y empieza la fiesta: podemos examinar y modificar el contenido de variables, poner más puntos de interrupción, saltar funciones, lo típico en un depurador.

Ejecución interrumpida a voluntad Ejecución interrumpida a voluntad

Lo que todavía no he conseguido es depurar las peticiones enviadas por el navegador ("Debug as PHP Web Page"). Estamos en ello ;-)

sábado, 23 de junio de 2007

¿Punto de inflexión?

Es la primera vez que un desarrollo chapuza llega a los medios de información generalistas y al gran público. Por supuesto, estoy hablando de la página web del Congreso de los Diputados.
Lo que comenzó siendo una crítica de algunos desarrolladores a una web realmente mal hecha ha terminado siendo un tema de conversación y de preocupación para el ciudadano de a pie.
Lo triste es que no es la primera vez que ocurre, sobre todo en desarrollos para la administración, donde el control del producto final no suele ser tan estricto como en corporaciones privadas.

Todos/as los que vivimos de esto sabemos cómo se trabaja en las grandes consultoras y empresas de desarrollo de software (hay excepciones, por lo visto: no todo va a ser malo)

Proyectos mal planificados y peor gestionados. Venta de "humo". Buzzwords. Incompetentes dirigiendo equipos y proyectos [1]. Intereses creados --"partners". Becarios "vendidos" a los clientes como expertos. Subcontratación. ¿Seguimos?

Ya está bien de tomaduras de pelo. A ver si a partir de ahora los clientes, los usuarios, la administración y la opinión pública en general se van concienciando de que las cosas se pueden hacer bien, pero si hay voluntad de hacerlas bien. Lamentablemente, hoy por hoy, lo que impera en el mercado no es la calidad del producto sino los beneficios y la supuesta rapidez en el desarrollo.

Nunca se han tenido tantas metodologías, herramientas y técnicas disponibles para el desarrollo de software (OOP, UML, Patrones de Diseño, bla, bla, bla, ...) De nada sirven si lo que al final tenemos es una porquería de producto.

Si una empresa privada quiere malgastar su dinero contratando desarrollos con consultoras con renombre pero cutres en el fondo, peor para esa empresa. Pero un desarrollo para la administración lo pagamos todos/as. No puede consentirse que estas chapuzas salgan a la calle.

Es obligatorio por ley que las páginas web de la administración sean accesibles. No vale con colocar el iconito de WAI, como hacen en muchas webs. Es ilegal hacer eso.

[1] Acabo de leer un artículo sobre esto en Fogonazos (mis felicitaciones a su autor). Lo clava.

viernes, 11 de mayo de 2007

(Re)Descubriendo Tcl/Tk

En esto tiempos aciagos para los/as programadores/as, en los que cada dos días sale un lenguaje o herramienta nuevos, en los que para montar una sencilla web hay que lidiar con los omnipresentes patrones de diseño, montones de capas de abstracción y demás, se agradece la simplicidad y sencillez de los viejos tiempos.
Tcl significa "Tool Command Language" y Tk "ToolKit". Es un lenguaje de "script", con una sintaxis muy similar a la de cualquier "shell" (como Bash).

Hacía mucho que no hacía nada con Tcl/Tk, y el otro día recordé que existe todavía la estupenda librería Snack. Es una librería de tratamiento y generación de sonido en tiempo real.

Así que, provisto del tutorial de Snack y la documentación de Tcl/Tk pertinente, me hice un pequeño afinador (cutre: sólo da notas de referencia, no "lee" las notas del instrumento):

Captura pantalla

(Captura de pantalla en Windows)

En 65 líneas de código simple tenemos casi un programa completo:

Código (renombrar a tuner.tcl)

Lo que más atención me llama es que a cada "widget" se le puede asociar una variable (global) de tal forma que, al cambiar la variable, se actualiza el elemento convenientemente. Por ejemplo, el "message" y el "spinbox" tienen asociados dos variables, newfreq y octave, respectivamente.

Desde el procedimiento beep modificamos newfreq y el texto de la etiqueta cambia.
Ocultamiento de información y encapsulamiento: ninguno. ¿Acaso es necesario siempre? ;-)

Recursos

  • Todavía hay en la red un tutorial en castellano (de lo poquito que he podido encontrar) de la Universidad de Oviedo. Data de 1998 (!) y está bastante bien. Lo bueno del mundillo Tcl/Tk es que las cosas no se quedan obsoletas tan pronto.

  • Visual Tcl es un IDE para Tcl/Tk. Permite desarrollar las aplicaciones Tcl/Tk de forma "visual": pinchando y dibujando los "widgets". Funciona perfectamente y su última actualización fue en 2006.

lunes, 7 de mayo de 2007

Software musical en Linux

Soy músico aficionado (y creo que lo seguiré siendo toda mi vida). Tocaba la guitarra, me pasé al saxofón (tenor), luego al bajo eléctrico y, finalmente, al contrabajo. También intento tocar un poco la armónica, la flauta dulce y el ukelele.

Hay dos programas que utilizo a menudo para mis “tareas musicales”, Lilypond y Musical MIDI Accompaniment (MMA).

Lilypond es un programa de edición de partituras. Su utilización es muy diferente a otros programas con la misma finalidad. Las notas y otros símbolos musicales se escriben en un archivo de texto plano, y después se procesa con Lilypond este archivo. El resultado es un archivo PDF (también puede generar Postscript y ficheros MIDI) con una calidad muy buena. Muchos ejemplos musicales en estas páginas han sido elaborados con Lilypond.

Musical MIDI Accompaniment es un programa que sirve para generar ficheros MIDI con acompañamiento musical. Es una alternativa al programa comercial “Band in a Box”, de la compañia PG Music.

No existe mucha documentación en castellano sobre los programas Lilypond y Musical MIDI Accompaniment (MMA). Por ello me decidí a escribir sendos tutoriales de Lilypond y MMA. En las siguientes direcciones pueden consultarse:

jueves, 3 de mayo de 2007

Desarrollo de temas para Wordpress

Estoy empezando a cacharrear con Wordpress, su API y la posibilidad de desarrollar temas personalizados.

Ya sé que Wordpress no es la herramienta más adecuada para utilizar como gestor de contenidos (CMS), pero es que me encanta su sencillez y facilidad de uso.

El mayor problema que me estaba encontrando era el siguiente: cuando se tienen varias categorías anidadas, al seguir el enlace de la categoría "madre", ésta mostraba todas las entradas de sus categorías "hijas", aunque ella misma no tuviese entradas. Esto está bien para un "blog", pero no era lo que yo necesitaba.

Lo que quiero es lo siguiente: al "pinchar" en el título de la categoría "madre" mostrar la descripción de la categoría o algo similar si no tiene entradas, pero no mostrar las entradas de sus "hijas".

Cacharreando un poco, ya he encontrado la manera de hacerlo. Ej. del fichero archive.php:

Estamos "dentro" del código y del

La función single_cat_title('', false) nos devuelve la categoría actual (por ejemplo, el nombre de la categoría "madre"), la función get_the_category() nos devuelve todas las categorías a las que pertenece una entrada, así que sólo hay que comparar si son la misma o no.

Nuestro archive.php queda así, más o menos:

<?php$categoria = get_the_category();
if (single_cat_title('', false) == $categoria[0]->cat_name) {
?>


martes, 24 de abril de 2007

Debian services control panel

Debian Services Control Panel es un pequeño programa que sirve para gestionar los servicios en una máquina que ejecute Debian (o alguna distribución derivada).

Está programado con GAMBAS.

martes, 17 de abril de 2007

Esquinas redondeadas

A todos nos encantan las esquinas redondeadas en los diseños Web. Generalmente se hace con CSS e imágenes para componer las esquinas.

Vean el título de este artículo: la esquina superior derecha es en realidad una imagen especificada en la CSS.

Hasta donde conocía, la única forma de hacerlo era así, pero el otro día encontré un sitio donde explican cómo hacer esquinas redondeadas sólo con CSS. El truco es anidar varias etiquetas y darles diferentes márgenes y solapamientos.

Ésa es la versión básica. Para hacer más flexible el truco, se han programado una librería en JavaScript y una hoja CSS que simplifican en gran medida el uso de este "truco".

La página donde vi todo esto es ésta: Nifty Corners, de Alessandro Fulciniti.

Ejemplos:

El HTML es válido, por cierto. Tremendo lo que se puede hacer con CSS ...

viernes, 13 de abril de 2007

Bases de datos con PHP y Perl

Revisando copias de seguridad me encontré con este artículo. Fue publicado en la revista DLinux de noviembre de 2000. Está totalmente obsoleto, pero puede tener algún interés arqueológico ;-)

He mantenido las erratas y la maquetación (por llamarlo de alguna manera) original.

Artículo: Accediendo a MySQL y Postgresql con PHP y Perl

Gambas tutorial

Gambas es una herramienta de desarrollo visual de aplicaciones muy similar a los conocidos programas comerciales Microsoft Visual Basic o Borland Delphi.El tutorial está en la siguiente página: Gambas Tutorial.

Tutorial de Django

Aviso: este tutorial se hizo en el año 2007, se mantiene esta entrada por interés "arqueológico".



Django es un "framework" para el desarrollo de aplicaciones Web basado en el lenguaje de programación Python y que sigue el patrón de diseño MVC.

En este tutorial desarrollamos una aplicación un poco más "avanzada" que la típica que se muestran en los tutoriales.


Debian services control panel

This program is a small and simple tool that manages the available "services" in a Debian.

Read more: Debian Services Control Panel

jueves, 12 de abril de 2007

Linux en un Acer Aspire 1352 XC

Más memoria


He ampliado a 1 Gb de RAM, y sigue con Ubuntu funcionando de maravilla.

Ubuntu


Tengo un portátil Acer Aspire 1352 XC desde hace tres años. En su día escribí un artículo sobre la instalación de Linux en este ordenador.
He ido cambiando de distro a lo largo de estos años, la última que utilizaba era Debian Sarge pero a principios de junio de 2006 salió la versión de Ubuntu 6.06 y he decidido probarla, concretamente la versión con el escritorio Kde, Kubuntu.
Llevo unas pocas horas con Kubuntu instalada y estoy muy contento con ella. Todo funcionó a la primera, no he tenido que tocar nada. Ha detectado la tarjeta de vídeo y ha instalado el driver adecuado actualizado (via), para hacer funcionar el módem sólo he tenido que instalar el paquete sl-modem-daemon. La hibernación funciona, sin ningún problema al reiniciar, ...
Y, por primera vez desde que utilizo Linux en este portátil, ¡tengo aceleración 3D!.

Enhorabuena a toda la gente de (K)Ubuntu. Han hecho un trabajo estupendo.

No puedo resistirme a la tentación y adjuntar algunas capturas de pantalla:

¡Aceleración 3D!
Salida del comando glxinfo:

glxinfo

El controlador para el winmodem "smartlink softmodem", hay que instalarlo (apt-get install sl-modem-daemon):

smartlink softmodem

Panel de control de KDE, mostrando la hibernación y la regulación de la CPU activadas por defecto:

Kcontrol

A punto de hibernar:

Hibernar

Artículo original


Updates



  • Updated on Juanary 2006:
    Back to Debian. Now I'm using Sarge, with a custom kernel 2.6.12. I'm tired with heavy desktops and I use Icewm + Rox-filer now.

  • Updated on March 2005:
    Now I'm using Kanotix 2005-02 (includes KDE 3.4, kernel 2.6.11). You must pass the option xmodule=vesa to the kernel for a proper X window setup. All the devices and features are available: winmodem, pcmcia, USB devices, hibernation ...
    Good job, Kano!

  • Updated on December 2004:
    I've abandoned SuSE Linux!. Now I'm using Kanotix "Bug Hunter 8", (don't use superior versions of Kanotix with this laptop, they doesn't run properly) which is perfect for this laptop. It includes:

    • Linux kernel 2.6.8.1 with swsuspend enabled: you could hibernate successfully. As root, type
      echo 4 > /proc/acpi/sleep

    • Smartlink softmodem driver but I don't use it: I have a PCMCIA modem now, which is better than a softmodem.

    • A functional pcmcia implementation: the computer doesn't hangs now using pcmcia.

    • Synaptics touchpad driver: you can use all the features supported by the device. Add the following lines to your /etc/XF86Config-4 file:
      Section "InputDevice"
      Identifier "Touchpad"
      Driver "synaptics"
      Option "Protocol" "auto-dev"
      Option "LeftEdge" "1700"
      Option "RightEdge" "5300"
      Option "TopEdge" "1700"
      Option "BottomEdge" "4200"
      Option "FingerLow" "25"
      Option "FingerHigh" "30"
      Option "MaxTapTime" "180"
      Option "MaxTapMove" "220"
      Option "VertScrollDelta" "100"
      Option "MinSpeed" "0.06"
      Option "MaxSpeed" "0.12"
      Option "AccelFActor" "0.0010"
      Option "Device" "/dev/psaux"
      Option "SendCoreEvents" "true"
      EndSection




  • Updated on September 2004:
    I can suspend to disk (hibernate) now!. In this months I've been testing several Linux distributions with the kernel 2.6.x.
    I you are using a distro with kernel 2.6.7 or higher, probably you could hibernate successfully. As root, type
    echo 4 > /proc/acpi/sleep
    Warning: you must pass to the kernel the following paramenter (in lilo.conf or menu.lst)
    resume=/dev/my_swap_partition
    (Tested on Knoppix 2.6)

  • Updated on May 2004:
    My pendrive is not recognized. Solution: the kernel needs the parameter pci=noacpi in the boot. I've write this parameter in /etc/lilo.conf, in the section apend.

  • Updated on March 2004:
    Problems with hangs, pcmcia service and winmodem resolved (read the complete document). In few words: if you are using pcmcia, the computer hangs :-(


Introducción


Recientemente he comprado este portátil, la intención principal era utilizarlo con el Windows XP que traía de serie, ya que me interesaba probar las aplicaciones que desarrollo también en esta plataforma y el equipo de sobremesa que utilizo sólo tiene instalado Linux.No me gusta utilizar software ilegal, y no estaba dispuesto a cargar algún Windows pirateado en mi equipo de sobremesa. Por otra parte, comprar un Windows sólo para hacer pruebas tampoco me parecía muy cabal.

Por último, necesitaba un portátil, pero que fuese asequible, así que con este Acer Aspire 1352 XC tenía las dos cosas que necesitaba: un portátil y un Windows "legal". Gracias al proyecto GNU Win, podría seguir utilizando las herramientas que uso habitualmente en mi ordenador de sobremesa con Linux.

A los dos o tres días de utilizar el Windows XP, echaba de menos a mi Linux, así que me dispuse a instalar Linux en el portátil, conservando el Windows preinstalado.

Aviso legal


Este documento es un simple reportaje basado en mi experiencia personal con esta máquina.

No soy empleado ni tengo nada que ver con ninguna de las empresas que mencione a lo largo de este artículo.

Todas las marcas comerciales que aparecen son propiedad de sus respectivas empresas o titulares. No me voy a molestar en poner un © o un TM detrás de cada nombre comercial porque es muy tedioso. Si ud. es propietario/a de alguna de estas marcas y desea que aparezca, puede ponerse en contacto conmigo en la dirección de correo forodejazz (arroba) yahoo (punto) es y gustosamente incluiré cualquier información que estime oportuna.

NO ME RESPONSABILIZO DE NINGÚN DAÑO, PÉRDIDA DE DATOS O CUALQUIER OTRA CIRCUNSTANCIA QUE LE PUEDA PASAR A SU MÁQUINA AL SEGUIR LOS CONSEJOS QUE EXPONGO.

Descripción de la máquina.


Front view Vista frontal.

Back view Panel trasero.

El Aspire 1352 XC es un portátil de gama baja, con un precio muy ajustado y competitivo (800 € en Madrid, España). Las principales características técnicas son las siguientes:

  • Procesador AMD XP Mobile 2200

  • Memoria RAM: 256 Mb

  • Disco duro: 20 Gb

  • Monitor: 14 pulgadas

  • Tarjeta gráfica con memoria compartida (le "roba" 64 Mb a la memoria RAM).

  • Tarjeta de red 100/10

  • Modem 56K.

  • Batería Ni-MH. (No dura mucho).

  • Unidad CDRW-DVD

  • Windows XP Home Edition preinstalado

  • Conexiones: Puerto ieee1394, entrada de micrófono, salida de audio, puerto paralelo, puerto VGA, puerto S-Video, 4 puertos USB.


Pasos previos


Lo primero que hice comprar más memoria RAM. No es muy cara, en España, un módulo de 256 Mb cuesta unos 70 €. Con esta ampliación, el portátil va mucho mejor, ya que hay que tener en cuenta que la tarjeta de vídeo utiliza una parte de la memoria RAM.

El siguiente paso fue arrancarlo con el Windows XP. Desde Windows, recuperé la información que me interesaba sobre los distintos componentes. Por ejemplo, el módem aparece como un "Agere AC97 Modem". Tomamos nota.

A continuación arranqué el ordenador con una distribución "LIVE - CD", probé con una Knoppix 3.2

En el arranque casi todo fue bien, la tarjeta de vídeo fue detectada y configurada con el "driver" VESA. La tarjeta de sonido dio algún problema.

Siguiente prueba con SuSE Linux Live CD 9.0. Resultado: perfecto. Todos los componentes fueron detectados y configurados correctamente (excepto el módem, por supuesto, que es un "winmodem").

La tabla de particiones que trae de fábrica es la siguiente:

  1. Partición primaria (hda1 - Unidad "C:") de unos 10 Gb con el sistema operativo y algunas utilidades preinstaladas.

  2. Partición extendida (hda2) que contiene una unidad lógica (hda5 - Unidad "D:") de unos 10 Gb, con archivos temporales y datos inútiles.
    Es seguro borrar/formatear la partición, el Windows XP no necesita nada de los datos que contiene para funcionar.

  3. Una partición primaria (hda3) pequeñita (unos 8 Mb), oculta, con ficheros de sistema. Esta le he conservado.


Todas están formateadas como FAT32.

Decidí conservar las particiones hda1 y hda3, hacer más pequeña la hda5 y dejarla para Windows, y, finalmente, crear una partición para swap (hda6) de 128 Mb y el resto del espacio libre, (hda7), unos 8 Gb, reservarla para instalar el sistema Linux.

Instalación


Antes de instalar un Linux, hay que pensar qué distribución poner. En mi caso personal me interesa que traiga mucho software, actualizado y que sea fácil de instalar. Prácticamente todas las distribuciones que hay hoy en día cumplen estos requisitos.

Llevo ya bastante tiempo utilizando Linux y he trabajado con bastantes distribuciones, pero había una que me atraía mucho y que casi no había probado, SuSE.

SuSE tiene cosas muy buenas: una es que se distribuye en DVD (es muy cómodo no tener que cambiar de CD cada dos por tres) y otra es que el soporte a ALSA (Advanced Linux Sound Architecture) es muy bueno, no en vano SuSE financia el proyecto ALSA. Como músico aficcionado que soy, me interesaba que la parte relativa al sonido fuese bien.

Como ya había probado el portátil con la SuSE LiveCD, compré la versión completa de SuSE Linux (unos 90 € en Madrid, España).

Arrancando


Uno de los primeros problemas con los que topé fue que el portátil arrancaba correctamente desde el DVD y se cargaba bien el programa de instalación, pero en el apartado de "Selección de paquetes", sale un error que nos informa que el medio no está disponible.

Tras una consulta en las páginas de soporte de SuSE, se encuentra la solución: al utilizar unidades CDRW/DVD, como es el caso, hay que especificar que el dispositivo hdc funciona con emulación ide-scsi
Procedimiento: en la pantalla inicial, seleccionamos "Installation" y en las opciones para el kernel (entrada de texto en la parte inferior de la pantalla) escribimos hdc=ide-scsi

Como el teclado todavía no está en castellano, hay que acordarse que el símbolo = se saca con nuestro ¿, y el - se saca con el ?

Una vez hecho esto, nos saldrá un cuadro de error diciendo que no se encuentra el CD, pasando a instalación manual. Vamos a la opción de cargar módulos del kernel, seleccionamos módulos SCSI y buscamos el ide-scsi
Estando ya cargado este módulo, volvemos al menú y le decimos "Instalar", seleccionando como origen "CD-ROM".

La instalación prosigue normalmente, instalándose los paquetes que hayamos seleccionado y configurando a continuación el sistema.

Por defecto en SuSE se utiliza ReiserFS como sistema de archivos predeterminado. Lo cambié a ext2 para poder leer mi partición Linux desde Windows con la utilidad Explore2fs

Problemas con X-Window


Llegados al punto en que se configura la tarjeta gráfica, el programa de instalción trató de configurar la tarjeta gráfica y me desapareció la pantalla, quedándose con una resolución extraña en la que no se veía nada. Tuve que reiniciar la máquina y la instalación quedó incompleta :-(

Al volver a instalar todo de nuevo, al llegar al mismo punto, es importante decirle al programa de instalación que NO configure la tarjeta gráfica, quedándose con la configuración por defecto. Con esto es suficiente y el entorno gráfico funciona correctamente.

Configuración del módem


Como comentábamos anteriormente, el módem que incorpora este portátil es un winmodem, esto es, un módem que sólo funciona con un programa especial para Windows. Muchos de estos módem ya están soportados por Linux, y éste, afortundadmente, es uno de ellos.

La distribución SuSE incluye un paquete llamado smartlink-softmodem, que es adecuado para nuestro portátil. Ejecutamos el "script" /usr/sbin/smartlink-softmodem-config, y se nos crea un nuevo dispositivo (/dev/ttySL0) que debemos enlazar con /dev/modem):
# ln -s /dev/ttySL0 /dev/modem

Una vez hecho ésto, podemos utilizar el modem con el programa que nos apetezca (Kinternet funciona bien, o wvdial).

La unidad CDRW/DVD


Hay que asegurarse que ésta se reconoce como dispositivo ide-scsi. Debido a problemas de patentes y a que la política de las empresas que "fabrican" distribuciones de Linux es no incluir paquetes que puedan violar patentes, NO podremos ver películas en el DVD. La versión de Xine que incluye SuSE muestra un aviso y un enlace a las páginas de SuSE en las que se explica ésto.

La lectora de DVD funciona sin problemas con DVD de datos. Como grabadora de CD es reconocida sin problemas por los programas de grabación (KB3 ó CDBakeowen).

Ajustes adicionales


No siempre queda todo bien a la primera. He tenido que hacer algún retoque para que todo vaya bien.

Módulos al inicio


Como comentaba anteriormente, para que la grabadora/DVD funcione correctamente hay que decirle al kernel que es ide-scsi. En el fichero de configuración de LILO, /etc/lilo.conf, hay que poner en la sección append lo siguiente: hdc=ide-scsi. El programa de instalación de SuSE ya lo hace por nosotros.

Sin embargo, por alguna razón, el módulo ide-scsi no se cargaba al inicio, tampoco el módulo usb-storage, necesario para utilizar mi cámara de fotos digital y el "pendrive" USB, ni el slamrmo, necesario para que funcione el winmodem.

Así que he tenido que forzar que se cargen estos módulos. En el archivo /etc/sysconfig/kernel hay una línea en la que se especifican los módulos que se van a cargar al inicio. He dejado la línea así:
MODULES_LOADED_ON_BOOT="ide-scsi usb-storage slamrmo"

Ratón USB externo


Por otra parte, tengo un ratón con rueda USB que también utilizo a la vez que el "touchpad". Para hacer ésto, hay que modificar el fichero /etc/X11/XF86Config y añadir un dispositivo más:
Section "InputDevice"         Identifier      "USB Mouse"

Driver "mouse"

Option "SendCoreEvents" "true"

Option "Device" "/dev/input/mice"

Option "Protocol" "ImPS/2"

Option "Emulate3Buttons" "true"

Option "ZAxisMapping" "4 5"

EndSection

Y en la sección "ServerLayout", añadir una línea, quedando así:
InputDevice "Mouse1" "CorePointer"

InputDevice "Keyboard1" "CoreKeyboard"

InputDevice "USB Mouse" "SendCoreEvents

Cuelgues del sistema


Al principio, recién instalado Linux, el PC se me quedaba "colgado", sin responder a ninguna tecla.

Probablemente esté equivocado, pero mis sospechas recayeron en el servicio pcmcia.

Con el "Editor de niveles de ejecución" del program "YaST", lo deshabilité, no volviéndose a producir cuelgue alguno.

Conclusiones y asuntos pendientes


Running SuSE Linux Foto frontal Funcionando con SuSE Linux.

Compré el portátil sin pensar mucho en la posibilidad de usarlo con Linux, y me ha sorprendido gratamente ver que un portátil de consumo, con componentes económicos y claramente diseñado para Windows funciona tan bien con Linux. No he probado con otras distribuciones, pero estoy seguro que debe funcionar también muy bien con cualquier otra distro.

Me queda pendiente comprobar todo lo relativo a administración de energía (suspender o hibernar el equipo, etc). En el nuevo kernel 2.6 estas funcionalidades están muy mejoradas. Será cuestión de probarlo algún día.

Tampoco he tratado de configurar las teclas de "acceso rápido" que hay en la parte superior del teclado, ya que no las utilizo nunca. Lo que sí se seguro es que se pueden utilizar (ver reseña sobre un Acer Aspire 1300 en www.linux-on-laptops.org).