Zootropo

Diario del mundo geek.

miércoles, junio 30, 2004

Informática y Zen

Para seguir la trayectoria:
mira al maestro,
sigue al maestro,
camina junto con el maestro,
mira a través del maestro,
conviértete en el maestro.

Cómo convertirse en hacker, de Eric S. Raymond.

Harry Potter and the Half Blood Prince

Leo en La Zona Oscura que ya se conoce el título del próximo libro de Harry Potter, que hará el número seis de la serie. Según cuentan en Wizard News y confirmó la propia J.K. Rowling el título del libro será 'Harry Potter and the Half Blood Prince'. El título del nuevo libro estaba oculta en la web oficial de la escritora y se han anunciado que esconderán mas información sobre el libro en la web para los fans a medida que se vaya acercando la fecha de publicación

La verdad es que cuando comenzó el fenómeno Harry Potter creía que no era mas que otra moda de los niños tipo Pokemon pero la verdad es que es una serie de libros para todas las edades y por lo que he comprobado resulta que lo leen mas adultos que niños

Una imagen del 'descubrimiento'

Royale, el tema de MCE 2005, en tu Windows XP

Algo curioso que probar. La gente de WinBeta ha ripeado el nuevo estilo visual del Windows XP MCE (Media Centre Edition) 2005 y nos lo ofrecen para descargar y poder probarlo en Windows XP y Windows 2003 . Al estar firmado por Microsoft no es necesario parchear uxtheme.dll ni hacer ninguna cosa rara, simplemente doble click sobre el estilo visual y listo.

El nuevo estilo tiene cierto aire a lo crystal bastante sospechoso pero es bonito.

martes, junio 29, 2004

Firefox 0.9.1/Thunderbid 0.7.1

Al fin tenemos aquí la versión 0.9.1 de Firefox, acompañada de una actualización de Thunderbird a la 0.7.1. Estas releases solucionan algunos de los bugs de las versiones anteriores (especialmente en el tema del gestor de extensiones) e incorporan la nueva versión del tema Winstripe. La nueva versión de ambos productos puede ser descargada desde la web del proyecto Mozilla. (Firefox/Thunderbird)

Los errores corregidos son los siguientes:

  • Bug 248071: Firefox se cuelga tras instalar cualquier extensión o tema.
  • Bug 246687: Firefox no termina de instalar las extensiones al instalar en Magpie y Testcase en el mismo perfil.
  • Bug 246014: Errores XUL al instalar la extensión Tab Browser Extensions
  • Bug 245335: Excepciones al intentar utilizar ciertos temas teoricamente compatibles con la 0.9
  • Bug 247322: No se muestra un error al intentar instalar una extensión compatible con 0.9+ en una versión 0.9

lunes, junio 28, 2004

Conexión segura con Gmail

No me había dado cuenta hasta ahora pero Gmail te permite conectarte de forma segura a la interfaz web. Para los despistados como yo que aún no lo sabían: Conexión segura.

domingo, junio 27, 2004

Gmail Notifier

He encontrado una herramienta bastante interesante leyendo Redemption in a Blog. Se trata de una extensión para Firefox que sirve como notificador de correo entrante para Gmail, Gmail Notifier.

La extensión tiene problemas con la versión 0.9, al menos a mi al cerrar el navegador no me recuerda el login. Además no es que sea muy vistosa esteticamente. Con la versión 0.9.1 RC parece que si funciona bien :).

vimrc

Aquí os dejo mi vimrc, el archivo de configuración del editor de textos open source Vim (Vi Improved). Si usais Vim echadle un vistazo; lo mismo veis alguna opción interesante.

sábado, junio 26, 2004

De chorizos, ladrones y mangantes.

Hay gente que tiene mucha cara. Hay gente que roba a los demás. Y hay gente que me copia un tutorial con dos cojones, sin cambiar si quiera las capturas que incluyen un 'Zootropo' y se atreve a decir que son sus creadores.

Hablamos estos colegas y de este artículo publicado aquí en Abril. Leedlos y juguemos al juego de las 7 diferencias. A ver quien consigue encontrarlas porque yo desde luego no soy capaz. Vamos simplemente a copiar el primer párrafo de cada artículo. Este es el inicio del mio:

Brturbo es un servidor brasileño que se ha hecho muy popular ultimamente entre la gente que se dedica a subir warez o gente que simplemente lo utiliza para subir sus archivos. La desventaja de este servidor es que tiene una politica de acceso muy restrictiva de modo que no permite descargas a nadie que no tenga una ip brasileña o de algun pais sudamericano. Si no puedes descargar desde brturbo los pasos a seguir son:

y este el de esta gentuza:

Brturbo es un servidor brasileño que se ha hecho muy popular últimamente entre la gente que se dedica a subir warez o gente que simplemente lo utiliza para subir sus archivos. La desventaja de este servidor es que tiene una política de acceso muy restrictiva de modo que no permite descargas a nadie que no tenga una ip brasileña o de algún país sudamericano. Si no puedes descargar desde brturbo los pasos a seguir son:

Regalo cuenta de Gmail al que consiga encontrar una solo diferencia aparte de los acentos. Podeis seguir leyendo el artículo porque es todo igual... Lo mismo os suenan también las imágenes de haberlas visto en otro sitio. Si, os suenan de mi blog, y hay que tener mucha cara para copiar también no solo el texto, si no como ya he dicho una imágen en la que se utiliza como ejemplo zootropo.brturbo.com como un sitio de brturbo. Hombre por dios, que una cosa es plagiar y otra un copy paste tan descarado. Al menos se han dignado a copiar las imágenes a su servidor, porque si me robaran también ancho de banda habría tenido cojones la cosa.

En fin, que estoy muy cabreado ¬¬ ya he mandado un mail a esta gente a ver que pasa y si al menos se dignan a poner aquí y allá una coma de diferencia respecto a mi artículo.

Un cliente de Subversion gráfico: TortoiseSVN

TortoiseSVN puede descargarse desde su página web. La instalación no tiene ninguna complicación y una vez se termine la instalación se añadirán una serie de entradas en el menú contextual del explorador de Windows.

Si abrimos el explorador y hacemos click sobre el menú Archivo vemos una entrada de menú checkout y otra TortoiseSVN. Si pulsamos sobre checkout Tortoise comprobará los archivos del repositorio, para lo cual tenemos que pasarle la URL del repositorio (si estamos en nuestro PC, http://127.0.0.1/repos si seguisteis los pasos de la entrada anterior de la bitácora) y el directorio en que guardaremos en local los archivos que bajemos del repositorio. Al darle a aceptar se creará el directorio donde guardar la copia del repositorio si este no existía y se descargarán los archivos del repositorio a este. En nuestro caso dado que no tenemos ningún archivo en el repositorio aún, simplemente creará un directorio vacio. Una vez que hemos hecho esto podremos añadir, borrar o modificar los archivos en local y mandarlos luego al repositorio.

Si os habeis fijado ha aparecido una marca con fondo verde sobre el directorio donde tenemos el repositorio local. Esto significa que el directorio está actualizado respecto del repositorio remoto. En el momento en que editemos algún archivo en local aparecerá una exclamación sobre fondo rojo en el archivo editado y los directorios que lo contienen, para avisarnos de que tenemos que actualizar el repositorio remoto con nuestra copia (commit).

Vamos a añadir nuestro primer archivo al repositorio remoto. Para ello creamos un archivo en el directorio local, por ejemplo un HolaMundo.java

class HolaMundo{

public static void main (String arg[]){
System.out.println("Hola Mundo");
}
}

si hacemos click con el botón derecho sobre el archivo recien creado dentro de la entrada de menú para TortoiseSVN tenemos una opción Add. Hacemos click sobre ella, lo que hace que aparezca una cruz en azul, indicando que se ha añadido el archivo al repositorio pero tenemos que enviarlo usando commit. Si hacemos click con el botón derecho ahora veremos que tenemos una opción commit (actualizar el repositorio remoto con nuestra copia) y otra update (actualizar la copia local con la version del repositorio remoto). Hacemos click sobre commit, con lo que nos pedirá nombre de usuario y contraseña si indicamos a Apache que era necesario para escribir en el repositorio. Una vez introducida la contraseña podemos abrir el repositorio remoto (http://127.0.0.1/repos) y comprobarmos que aparece un nuevo archivo HolaMundo.java y que ha cambiado el número de revisión de 0 a 1.

Ahora si hacemos algún cambio en el archivo HolaMundo local (nunca se debe editar directamente el repositorio remoto porque podría corromperse la información) y añadimos otra línea por ejemplo

class HolaMundo{

public static void main (String arg[]){
System.out.println("Hola Mundo");
System.out.println("Adios");
}
}

vemos que aparece una exclamación en fondo rojo sobre el archivo editado como ya habíamos comentado. Si queremos actualizar la copia remota con la nueva vesión de HolaMundo usamos commit.

También podría ser que quisieramos actualizar la copia de HolaMundo con posibles cambios que hubiera hecho otro programador, para lo cual utilizaríamos update.

Sin embargo hay ocasiones en que el proceso para commit y update no es tan sencillo. Puede ocurrir que otro programador halla editado alguna línea que nosotros también hemos editado, en ese caso hay un conflicto el cual subversion no puede resolver y tiene que ser el propio usuario el que realice los cambios necesarios antes de usar commit. Si intentamos actualizar el repositorio remoto y la copia del repositorio tiene algún conflicto con la nuestra nos mostrará un mensaje de error

‘Commit failed (details follow)
Your file HolaMundo.java is probably out of date.
The version resource does not correspond to the resource within the transaction….’

y aparecerá una señal de alerta sobre el icono del archivo en cuestión. Una vez que terminaramos de editar el archivo usaríamos Resolve, y esta vez si, se actualizaría el repositorio remoto.

Además de crear o editar archivos o directorios también podemos por ejemplo eliminarlos, renombrarlos, moverlos,... para más información podeis leer la Guía de Introducción a TortoiseSVN o su FAQ, ambos en inglés.

¿Qué es un CVS? Instalación de Subversion

CVS es el sistema de control de versiones concurrentes mas utilizado en el mundo del software libre, sin embargo es bastante arcaico (nació en 1985) y tiene bastantes carencias, como son la falta de versionado de directorios, de renombrado o de copias; su uso poco eficiente de la red o el que no almacene archivos binarios completos, solo los cambios entre versiones.

Subversion es un CVS de código abierto, bajo una licencia del tipo Apache/BSD, que nació como alternativa a CVS y que intenta solucionar estos problemas y carencias. Tenemos multitud de alternativas a CVS aparte de Subversion, por ejemplo GNU Arch del que he oido muchas alabanzas y ninguna crítica.

Pero lo primero es lo primero. ¿A qué se refiere el control de versiones? Estamos hablando de controlar los cambios que realizan los programadores sobre el código fuente (o cualquier otro tipo de usuario sobre un documento cualquier que tenga varias versiones) de forma que no se produzcan inconsistencias por trabajar mas de una persona con el mismo documento y se pueda volver hacia atras en las versiones de forma cómoda o se pueda comprobar los cambios o los errores corregidos en cada versión.

Vamos a ver ahora su instalación en sistemas Windows. Lo primero que tenemos que hacer es descargar Subversion desde su página web, donde podemos encontrar una versión comprimida o una versión que incorpora un instalador para facilitar mas aún las cosas.

Una vez instalado deberíamos poder ejecutar subversión de forma local escribiendo svn en la consola. Esto bastaría si no fueramos a utilizar subversion en red, en el caso de que si vayamos a hacerlo necesitamos instalar además un servidor web como Apache.

Para comenzar a trabajar con Subversion tenemos que crear un repositorio primero. Un repositorio es donde se va a guardar todas las versiones de nuestro proyecto. Supongamos que queremos crear el repositorio en C:\Documentos\Proyectos\, primero nos moveríamos a ese directorio en la línea de comandos y luego usaríamos la herramienta svnadmin para crear el repositorio:

svnadmin create repositorio

Esto crearía un directorio C:\Documentos\Proyectos\Repositorio para actuar como mi repositorio.

Para activar la posibilidad de usar Subversion en red vía Apache necesitamos copiar el módulo mod_dav_svn.so de la carpeta httpd en el directorio donde se instaló subversión a la carpeta de módulos (modules) de Apache tras lo cual editamos nuestro httpd.conf para informar a Apache de la existencia del nuevo módulo. Buscamos la línea

#LoadModule dav_module modules/mod_dav.so

la descomentamos (quitamos el #) y añadimos también

LoadModule dav_svn_module modules/mod_dav_svn.so

Copiamos también las dll de la carpeta bin de Apache y de Subversion al directorio modules para que puedan ser accedidas por los módulos y añadimos al final del httpd.conf lo siguiente

<Location /repos>

DAV svn
SVNPath c:/documentos/proyectos/repositorio
AuthType Basic
AuthName "Repositorio Subversion"
AuthUserFile c:/programas/Apache2/usuarios.txt
# Cualquiera puede leer, para otras operaciones
# hay que estar autentificado.
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
</Location>

con esto creamos un repositorio ficticio repos y le indicamos la ruta a él (notad que las barras no son invertidas en las rutas, además si hay espacios en las rutas tenemos que incluir la ruta entre comillas). Además pedimos que los usuarios se autentifiquen para poder realizar cualquier operación que no sea la lectura, comparando el nombre de usuario y contraseña introducidas con la información sobre los usuarios del fichero c:\programas\Apache2\usuarios.txt (nota: dado que no estamos utilizando una conexión segura se podrían capturar las contraseñas usando un sniffer).

El archivo usuarios.txt no existe por defecto, es simplemente un archivo que crearemos nosotros utilizando la herramienta de Apache htpasswd que se encuentra en el directorio bin de la carpeta de Apache y que nos sirve para crear una clave de tipo MD5.

htpasswd -mc c:\programas\Apache2\usuarios.txt Zootropo
htpasswd -m c:\programas\Apache2\usuarios.txt Otro

Le indicamos donde queremos guardar el fichero de contraseñas (en el caso de que la ruta tenga espacios la escribimos entre comillas) y que nombre de usuario queremos, tras lo cual nos pedirá la contraseña a utilizar para ese usuario. Fijaos en que para el primer usuario que creemos (Zootropo) hay que añadir también el flag c para que cree el fichero.

Si reiniciamos el servidor ahora deberíamos poder acceder al repositorio vía web. Abrimos el navegador de internet y en la barra de localización escribimos http://127.0.0.1/repos/. Si nos sale un mensaje de página no encontrada algo ha fallado.

Ahora que el servidor CVS ya está listo necesitamos un cliente CVS para trabajar con él. Subversion incluye herramientas de línea de comandos para este fin, pero es mas cómodo utilizar una interfaz gráfica como la de TortoiseSVN

Invitaciones de Gmail (y 3)

Esta vez la gente de Google ha sido menos generosa, solo tengo una invitación para dar entre los pocos que quedarán que no tengan ya una cuenta de Gmail. Como solo hay una, mejor que darsela al primer comentario haré mañana un sorteo entre los comentarios. Y si solo hay un comentario al terminar el día se sortea solo entre esa persona y el mismo y ya esta :P.

viernes, junio 25, 2004

Internet Explorer: Apocalypse Now

Como no podía ser de otra forma aquí tenemos el fallo de seguridad de Microsoft del día, pero esta vez la cosa pasa de ser seria, como nos tiene acostumbrados Microsoft, a ser una especie de devacle informática de principio de siglo (puede que no tan serio pero queda bien decirlo).

El ataque se aprovecha primero de fallos en ISS, el servidor de páginas web de Microsoft, por lo que cualquier sitio de la red que utilice este servidor para servir sus páginas puede estar infectado. Segundo, se aprovecha de fallos en Internet Explorer para hacer que el código que han instalado en las páginas web se ejecute en los PCs de los usuarios. Naturalmente, Firefox, Mozilla, Opera y demás navegadores alternativos no tienen porque preocuparse porque aunque la página que visiten este infectada, la vulnerabilidad en el navegador para poder ejecutar el código malicioso sin intervención del usuario no se da.

Según la BBC bastantes sitios populares de internet están ya infectados y la cuenta sigue subiendo de manera alarmante. Cada uno de estos sitios puede incluir código malicioso con la capacidad de tomar el control de la máquina del usuario simplemente por haber entrado en esa página.

¿Conclusión? Antes podías infectarte si entrabas en páginas de dudosa legalidad, ahora puedes infectarte con algún virus, troyano u otra mala hierba simplemente visitando la página web de tu banco o una web de noticias de tu comunidad.

¿Solución? Utilizar otro navegador, o dado que visitar cualquier página tiene peligro si lo haces con IE, simplemente dejar de navegar.

Reemplazando el Bloc de Notas

El bloc de notas es un buen programa si solo lo utilizas para lo que fue pensado, editar algún texto corto muy de cuando en cuando y sin ningún tipo de formateo especial. En el momento en que tus necesidades sobrepasan esto el bloc de notas deja de ser de utilidad. Microsoft debería haber mejorado el bloc de notas en Windows XP (esperemos que lo haga con Longhorn) porque no ha habido ningún cambio significativo en todos los años que lleva con nosotros. Sería interesante tener un editor de textos mejor que el bloc de notas o el wordpad en Windows, con coloreado de sintaxis, pestañas y una barra de herramientas con botones.

Una de las opciones para sustituir al bloc de notas es Notepad2, muy parecido a Ultraedit pero gratuito, de código abierto bajo la licencia GPL y del cual hay una versión en castellano (traducida por mi; un día sin ganas de estudiar dan para mucho). El autor, Florian Balmer, actualiza Notepad2 cada muy poco tiempo, de forma que tenemos un editor de texto que realmente esta a la última.

Si os decidís a sustituit el bloc de notas totalmente por este estupendo programa debeis sustituir el ejecutable del bloc de notas (notepad.exe) que se encuentra en las carpetas windows, windows\system32 y windows\system32\dllcache (oculta) por el de Notepad2; pulsad cancelar cuando XP nos pregunte si queremos restaurar los los archivos originales.

Firefox 0.9.1 en breve

Ben Goodger, el desarrollador jefe de Firefox, ha anunciado en los foros de MozillaZine una versión 0.9.1 de Firefox para dentro de poco tiempo. Esta versión servirá para corregir algunos fallos, la mayoría del administardor de extensiones e incluirá además cambios en el tema Winstripe.

Esta es la versión que debería haber sido la 0.9 final. La versión que liberaron no pasaba de release candidate, tal vez por intentar cumplir el plazo que se autoimpuso Ben.

Si os gustan los riesgos podeis usar alguna nightly build en el que se incluye un nuevo administrador de marcadores y notificación de los sitios que usan SSL, características que no se incluirán en la 0.9.1.

jueves, junio 24, 2004

De camellos, serpientes y joyas: Perl vs. Python vs. Ruby

Perl es el lenguaje de script mas popular en estos momentos y también es el mas rápido, pero su sintaxis es horrorosa y también falla en la orientación a objetos. Las alternativas son Python y Ruby, con una sintaxis mucho mas sencilla y cómoda que Perl, hasta el punto que mucha gente aconseja Python como lenguaje para introducirse en el mundo de la programación. Python es bastante mas conocido que Ruby, lo cual implica mas herramientas, librerías y documentación pero Ruby es el mas completo en cuanto a orientación a objetos se refiere y es mas flexible que Python. En Ruby todo son objetos, incluso los tipos básicos a diferencia de lenguajes como Java.

En resumen Python es el primo de Perl para los maniáticos de la claridad en el código, es el mas parecido al inglés hablado de los tres. Ruby es el primo de Perl para fanáticos de la orientación a objetos, parecido a Smalltalk.

Es hora de abandonar Internet Explorer

Scott Granneman de Security Focus, una de las páginas mas prestigiosas en lo que ha seguridad se refiere, ha escrito un artículo bastante interesante sobre la necesidad de abandonar Internet Explorer para el usuario de a pie. Según este artículo la cuenta de bugs de Internet Explorer 6 es ya de 153 desde Abril del 2001 con algunos realmente serios. En el artículo se cita por ejemplo una vulnerabilidad de Agosto del año pasado por la cual un atacante podría ejecutar código arbitrario sin la intervención del usuario, simplemente entrando en una página web. Basta entrar en una página web y ya tienes una bonita colección de virus, troyanos, spyware y dios sabe que mas.

Solo durante lo que llevamos de mes se han detectado seis vulnerabilidades en Internet Explorer, una de ellas que permitía al atacante ignorar las zonas de seguridad de Internet Explorer y ejecutar código en la máquina de la víctima con los ajustes de seguridad de zona local. La conclusión de Security Focus es que "IE es un producto lleno de fallos, inseguro, y peligroso de usar, además de la fuente de la mayoría de los problemas a los que se tienen que enfrentar los responsables de seguridad..."

Como alternativa se cita a Mozilla Firefox, que además de librarnos de los problemas de seguridad de Internet Explorer añade multitud de funcionalidades que hará la navegación mucho mas cómoda, como la navegación por pestañas o el bloqueo de popups.

Comentarios con HaloScan

Ya tenía el trackback implementado por HaloScan pero en el caso de los comentarios había decidido darle una oportunidad a los integrados en Blogger. Dado que para identificarte necesitas registrarte en Blogger y que no ofrece sindicación de los comentarios me he decidido a pasar los comentarios también a HaloScan.

miércoles, junio 23, 2004

Vamos vamos que estamos que lo tiramos: Invitaciones de Gmail

De nuevo toca regalar cuentas de Gmail a los necesitados. Tengo 3 invitaciones de sobra asi que si aún no tienes cuenta de Gmail dejame un comentario con nombre, apellidos y correo electrónico (el nombre y apellidos no tiene por que ser los verdaderos, el correo si y procurad que no sea de Hotmail o de Yahoo) y es vuestra.

Usando DCOP desde la línea de comandos

Pensaba escribir una pequeña introducción a DCOP, el protocolo de comunicaciones de escritorio de KDE, pero encontré un artículo que estaba bastante bien en 'The Linux Gazette' llamado 'Using DCOP from de Command Line', así que lo traduje para la versión en castellano, 'La Gaceta de Linux'.

Si os interesa el tema podeis echar un vistazo al artículo, Usando DCOP desde la línea de comandos.

lunes, junio 21, 2004

¿Quieres una invitación de Gmail?

Hoy voy a equilibrar mi karma. Tenía un -1 a karma por aceptar una cuenta de Gmail y ahora se convertirá en un karma +2 por regalar tres cuentas de Gmail. Si alguien quiere una que deje un comentario con nombre, apellidos (da igual que sean falsos, claro :P) y la cuenta de correo a la que mandarle la invitación y es suya :) Btw, si es una cuenta de hotmail o yahoo y luego no llega, ya que dicen que 'misteriosamente' están desapareciendo las invitaciones mandadas a esos servicios de correo, entonces no es culpa mía.

Mas herramientas para los Gmaileros

Navegando por la red he encontrado un par de herramientas mas que puede interesar a la gente que utiliza Gmail, a añadir a la lista que comence con los programas comentados en 'Importa tus correos a Gmail' y 'Gmail y palomitas'.

  • GetMail For Hotmail: Gracias a este programa puedes mudarte definitivamente a Gmail sin tener que vovler a mirar tu cuenta de Hotmail porque esta herramienta redireccionará el correo de Hotmail a tu nueva cuenta de Gmail. Así no tienes problemas con los amigos despistados que no se han enterado de que has pasado de Hotmail a Gmail.

  • G-mailto: Nos permite asociar el protocolo mailto con Gmail de forma que si hacemos click sobre un enlace de correo electrónico en lugar de abrir Outlook, Thunderbird, o el programa de correo que tuvieramos asociado abrirá una ventana del navegador con la página de nuevo correo de Gmail. Ideal para los que han decidido pasar de los clientes de correo tradicionales a la interfaz web de gmail

Yet Another Firefox FAQ

Bienvenidos a la versión muy preliminar de este FAQ. Muy preliminar por que lo he escrito en diez minutos en los que estaba aburrido. Problablemente cuando vuelva a aburrirme añadiré bastantes cosas, mejoraré las preguntas ya contestadas, incluiré alguna imagen y ordenaré y agruparé las preguntas por categorías. Pero todo esto cuando me aburra.

¿Qué es Firefox?

Firefox es un navegador gratuito y de código abierto disponible para Windows, Linux y MacOS X entre otros basado en XUL. Firefox es un navegador moderno y rápido que respeta los estándares web y que añade multitud de nuevas funcionalidades a la hora de navegar.

¿Por qué debería usarlo?

Las principales razones para un usuario final son:

  • bloqueo de pop ups
  • navegación por pestañas
  • control de la privacidad
  • mayor seguridad

Para una lista completa de las características de Firefox podemos consultar 'Why You Should Switch to Firefox' de Ben Gooder, desarrollador jefe del proyecto.

¿Como puedo cambiar Firefox a mi idioma?

Existe un listado creado por el Mozilla Localization Project en el que se recogen todas las traducciones disponibles. En concreto la gente del proyecto nave es quien se ocupa de las traduciones es-ES (castellano de España) y Marcelo Poli de la versión argentina (es-AR). La versión 0.9 aún no está disponible en castellano.

Una página web no se muestra correctamente en Firefox pero si en otro navegador

Firefox respeta los estándares del W3C, sin embargo otros navegadores introducen etiquetas html o métodos que no siguen los estándares. Este es el caso del navegador de Microsoft, Internet Explorer. En un 99% de los casos en que una página web no se ve bien con Firefox es culpa del diseñador de la página.

¿Que son las extensiones?

Las extensiones son añadidos al navegador que proporcionan nuevas funcionalidades. Una lista de extensiones compatibles con la versión 0.9 de Firefox puede encontrarse en la página de update de Mozilla.

¿Como puedo desinstalar una extensión?

Tienes instrucciones en esta entrada de la bitácora.

¿Como puedo integrar mi gestor de descarga con Firefox?

Normalmente basta con mover alguna dll al directorio de plugins de Firefox, a veces ni eso. Las instrucciones concretas para tu gestor de descarga las puedes encontrar aquí. También puedes utilizar la extensión Download With.

¿Donde puedo encontrar mas información sobre Firefox?

Me has convencido. ¿De donde lo puedo descargar?

La versión 0.9 se puede descargar desde la web de Mozilla.

Como puedo bloquear la publicidad con Firefox?

Con la extensión Adblock. Basta con indicarle los elementos que no quieres que sean mostrados o que no quieres que sean descargados (si no descargas publicidad logicamente mejora la velocidad) directamente a través del navegador o mediante condiciones.

Los archivos pdf tardan mucho en cargar, ¿puedo hacer algo?

Esto es dependiente del Adobe Reader, mucho mas lento en su última versión ya que carga por defecto todos los plugins de la aplicación aún cuando no los vayamos a usar. Este truco resulta muy útil para mejorar el tiempo de inicio de Adobe Reader. La otra opción es indicarle a Firefox que no intente abrir los pdf por defecto en Herramientas->Preferencias->Descarga->Plugins y desactivando el plugin correspondiente.

¿Qué es el perfil de Firefox? ¿Donde se encuentra?

La carpeta de perfil almacena todas las opciones de personalización de tu Firefox. Tus favoritos, las extensiones que tengas instaladas o las cookies son cosas que se guardan en esta carpeta. Por defecto esta situada en %AppData%\Mozilla\Firefox\Profiles en Windows. El directorio tiene un nombre aleatorio por cuestiones de seguridad.

¿Como configuro Firefox a mi gusto?

Tenemos varias opciones pasando desde la mas sencilla que es entrar en Herramientas->Preferencias. Pero si queremos cambiar totalmente Firefox y adaptarlo totalmente a nuestros gustos tenemos about:config y el fichero user.js.

about:config es una página que muestra las distintas opciones 'ocultas' de Firefox user.js es un archivo que se encuentra dentro de la carpeta de perfil y que almacena estas opciones. Para verdaderos hackers al ser de código abierto es posible también cambiar el código de la aplicación.

¿Cual es la diferencia entre user.js y prefs.js?

prefs.js se genera automaticamente cada vez que cerramos el navegador dependiendo de los cambios que hallamos realizado en las preferencias de Firefox o en about:config.

user.js nos permite cambiar las opciones especificadas en prefs.js de manera mas comoda que about:config. En lugar de tener que cambiar las opciones que nos interesa cada vez que instalamos el navegador las podemos almacenar en un fichero user.js.

No me gusta el aspecto de Firefox, ¿Puedo hacer algo?

El aspecto de Firefox se puede cambiar mediante temas. La página de update de Mozilla almacena algunos temas compatibles con la versión 0.9.

¿Como puedo actualizar mi navegador desde una versión anterior?

Antes de pasar a la versión 0.9 podemos hacer una copia de seguridad de nuestro perfil para no perder nuestros favoritos, las contraseñas guardadas y cualquier otro tipo de información. Podemos usar para ello MozBackup o copiar a mano los siguientes archivos:

  • bookmarks.html, nuestros favoritos
  • user.js y prefs.js, almacenan varias preferencias.
  • cookies.txt y cookperm.txt o hostperm.1, las cookies
  • signons.txt y key3.db, las contraseñas.

Una vez hecha la copia de seguridad de nuestro perfil se recomienda desinstalar las versiones anteriores antes de instalar la nueva versión.

¿Como puedo importar mis favoritos desde Internet Explorer?

Normalmente Firefox debería importar automáticamente los favoritos de Internet Explorer. Para hacerlo manualmente primero exportamos nuestros favoritos de IE usando Archivo -> Importar y exportar e importamos estos a Firefox llendo a Bookmarks -> Manage Bookmarks, File -> Import.

¿Como puedo ordenar mis favoritos?

Usando la extensión Sort Bookmarks.

¿Como puedo instalar Java?

Puedes encontrar instrucciones para tu sistema operativo en mozdev.

¿Como puedo instalar Flash?

Puedes encontrar instrucciones para tu sistema operativo en mozdev. Para Windows tenemos que descargar el Flash Player y Shockwave Player. Cerramos el navegador y comenzamos la instalación. En el proceso de instalación deberían autodetectar nuestro navegador.

Después de instalar una extensión el navegador ha dejado de funcionar

Verifica que la extensión que instalaste sea compatible con la versión 0.9 de Firefox. Borra la carpeta de perfil para eliminar todas las extensiones que se instalaron en el perfil (haciendo una copia de seguridad antes) y si continúa sin funcionar borra la carpeta de perfil y la de la aplicación y reinstala Firefox.

¿Cómo puedo instalar una extensión/tema desde el disco duro?

Si has descargado el archivo xpi correspondiente al disco duro puedes instalarlo simplemente arrastrándolo a la ventana del navegador.

Como hacer que los iconos tarden menos en aparecer en XP :/

El estúpido estúpido estúpido estúpido estúpido Windows XP busca automáticamente carpetas o impresoras en red cada vez que abrimos Mi PC lo que puede causar que tarde un poco más en mostrar los iconos. Puede que alguna vez os ocurra que muestre el icono de archivo por defecto y luego lo cambie al icono correcto.

Para cambiar este comportamiento nos vamos a Mi PC, herramientas -> Opciones de carpeta, seleccionamos la pestaña ver y desmarcamos 'Buscar automáticamente carpetas e impresoras de red'.

Estúpido XP

Crash Test Dummy

Aunque esta página solo utiliza XHTML y CSS válidos, cuelga al Internet Explorer.

Get Firefox

Construye tu propia extensión para Firefox con Zootropo

Este post es simplemente una recopilación de los enlaces al mini curso sobre XUL que he estado escribiendo los últimos días. El resultado final del curso como ya sabrán los que lo hayan seguido es la creación de una pequeña extensión que muestra la hora del sistema cuando se pulsa sobre la entrada de menú correspondiente a nuestra extensión. Las entradas del curso son las siguientes:

  1. Pequeña introducción a XUL, que explica simplemente que es XUL.
  2. Nuestro primer programa en XUL en el que creamos una especie de 'Hola Mundo'. Vemos por primera vez la estructura de un programa XUL y nuestro primer widget en XUL, el botón.
  3. Otro programa XUL, donde vemos los atributos de los botones
  4. Comunicándonos con el usuario en el que aprendemos como crear widgets label, textboxes y algo sobre el layout manager de XUL.
  5. Otros widgets de XUL donde completamos nuestro recorrido por los widgets básicos de XUL
  6. Creación de Menús
  7. RDF, pequeña introducción a este formato derivado de XML y estandarizado por el W3C.
  8. El registro chrome aprendemos que es el registro chrome, XPCOM y XPConnect y como instalar nuestras aplicaciones en chrome.
  9. Modularidad en XUL sobre como separar la interfaz de usuario definida con XUL, el estilo de la aplicación definido con css y el funcionamiento en código javascript.
  10. Nuestra primera extensión
  11. XPI, sobre el formato de instalación automático de extensiones de Mozilla.

There is only XUL (XI, Fin)

Ahora que ya hemos terminado nuestra pequeña extensión para Firefox vamos a ver como podemos crear un xpi para que se instale automáticamente. La extensión xpi viene de XPInstall donde XP se refiere a Cross (X) Platform o multiplataforma, es decir, que puede ser ejecutado en distintas plataformas (Windows, Linux, Mac OS,...).

Un xpi es un simple archivo zip con extensión renombrada que contiene un fichero de instalación y los ficheros que componen la extensión. En el caso de las versiones anteriores a la 0.9 se utilizaba install.js como script instalador, ahora en cambio se utiliza un fichero rdf, install.rdf, pero podemos incluir ambos si queremos que la extensión se pueda instalar en la versión 0.9 y también en las anteriores.

Un archivo install.rdf tendría un aspecto parecido a este:

<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>{eb78c871-3d9d-433f-b49b-12468119be89}</em:id>
<em:name>Mostrar Hora</em:name>
<em:version>0.1</em:version>
<em:description>Muestra la hora del sistema en un alert al hacer click sobre la entrada de menu correspondiente.</em:description>
<em:creator>Zootropo</em:creator>
<em:homepageURL>http://zootropo.blogspot.com </em:homepageURL>

<em:file>
<Description about="urn:mozilla:extension:file:hora.jar">
<em:package>/content/hora/</em:package>
</Description>
</em:file>
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>0.9</em:minVersion>
<em:maxVersion>0.9</em:maxVersion>
</Description>
</em:targetApplication>

</Description>
</RDF>

Tenemos primero una serie de predicados de información sobre nuestra aplicación que son los siguientes:

  • em:id que se refiere a un id único que podemos generar con esta utilidad de Microsoft y no al identificador de la extensión
  • em:name, el nombre de la extensión
  • em:version, la versión de nuestra extensión.
  • em:description, una descripción de la utilidad de nuestra aplicación.
  • em:creator, nombre del creador de la aplicación.
  • em:homepageURL, página web de la extensión.
  • em:optionsURL, ventana que se mostrará al hacer click sobre las preferencias.
  • em:aboutURL, ventana que se mostrará como About de la aplicación.
  • em:iconURL, icono para identificar la extensión.
  • em:updateURL, URL opcional para la autoactualización.

Tenemos después un predicado em:file que agrupa información sobre los ficheros de nuestra aplicación, donde se encuentra content, skin y locale dentro del archivo .jar, y otro predicado em:targetApplication sobre el programa para el que está destinado nuestra extensión. em:id se refiere al id del navegador, en este caso Firefox y minVersion y maxVersion se refieren respectivamente a la versión mínima y máxima de la aplicación.

Si no quereis complicaros podeis utilizar para crear los xpi un script creado por Ted Mielczarek que podeis encontrar en su página web. También podeis consultar la traducción del documento de Ben Gooder sobre install.rdf.

Ahora que tenemos todos los archivos necesarios lo primero que tenemos que hacer es crear un archivo jar que incluya los archivos de nuestra extensión. Comprimimos en un mismo archivo zip las carpetas content, locale y skin de nuestra aplicación (o content solo si no hemos definido las otras dos). Cambiamos la extensión del archivo resultante a .jar de forma que nos quede un archivo hora.jar en este ejemplo y ya tenemos el archivo jar que empaqueta nuestra aplicación, nos queda empaquetar el .jar y el archivo de instalación en un xpi. Para eso creamos una carpeta chrome a la que movemos hora.jar y comprimimos en un .zip la carpeta chrome y el install.rdf (e install.js en el caso de que lo tengamos) y renombramos la extensión del archivo a .xpi.

El archivo xpi resultante para que comprobeis como se instala automáticamente como cualquier otra extensión de firefox es este.

¿Nuevo Internet Explorer? El Día de la Bestia

Según varios weblogs en la red Microsoft podría estar reconstruyendo el grupo de trabajo de Internet Explorer. ¿Estamos ante la vuelta de la guerra de los navegadores? Esto que debería ser buenas noticias por favorecer la competitividad puede que no lo sean tanto si los movimientos de Microsoft se encaminan de nuevo a contaminar los estándares y aprovecharse del monopolio en los sistemas operativos.

Mi pronóstico si esto es verdad es que nos espera un mal navegador basado en XAML para empezar de paso la guerra XAML-XUL; con muchos errores y muy mal soporte de estándares, con bugs de seguridad y en el renderizado de las páginas. ¿Mejoras? Seguramente usarán skins, pestañas y bloqueador de popups. ¿Conclusión? A Microsoft le saldría mas barato comprar MyIE y acabaría con algo parecido.

En fin, esperemos que con la versión 1.0 de Firefox se consiga al menos un 50%-50% entre Firefox e Internet Explorer.

domingo, junio 20, 2004

There is only XUL (X)

Ahora que hemos visto un poco por encima como funciona XUL vamos a ponernos un poco mas serios y vamos a crear una pequeña extensión para nuestro navegador. Por ahora algo sencillo como añadir una nueva entrada de menú al menú de herramientas de Firefox, que nos muestre un alert con la hora del sistema cada vez que se haga click sobre él. El proceso para Mozilla sería un proceso bastante parecido. Para ello tenemos que ver que son los overlays, cuya traducción al castellano sería algo asi como superposiciones.

Lo primero vamos a recordar que toda la interfaz de Mozilla y Firefox esta hecha con XUL, por lo tanto será razonable suponer que en algún lugar tiene que haber un fichero xul que lo define. Y acertariais al hacer esta suposición. La interfaz del navegador esta definida en un archivo llamado browser.xul en el subdirectorio chrome dentro de la carpeta en la que esta instalado nuestro navegador, pero si entrais en esa carpeta para echar un vistazo al código no lo encontrareis. browser.xul esta empaquetado dentro de uno de esos archivos .jar que veis.

Un archivo jar es simplemente un archivo .zip con la extensión renombrada. Podemos descomprimirlo con winzip u otro programa de compresión de archivos. Si descomprimimos browser.jar tendremos una carpeta browser que alberga una carpeta content en la que tenemos a su vez las carpetas browser y browser-region. Dentro de la primera se encuentra además del browser.xul al que nos referíamos otros archivos .xul, archivos js con código javascript y archivos css, hojas de estilo.

Si abrimos el archivo browser.xul tendremos una ventana del navegador de Firefox pero con la peculiaridad de que no veremos las barras de herramientas, los botones u otros widgets de las extensiones que tengamos instaladas. Esto es así por que cuando abrimos una ventana del navegador estamos abriendo browser.xul, pero también otros archivos .xul que se superponen. Sería algo así como coger varios dibujos en papel cebolla y ponerlos uno encima de otro, algo así como las capas de Photoshop. Esto es lo que vamos a ver ahora, el overlay.

Lo primero que tenemos que hacer es crear una carpeta para nuestra aplicación, por ejemplo 'hora' completando una estructura de directorios hora/content/hora. Dentro del directorio mas profundo de esta jerarquía creamos un archivo hora.xul con el siguiente código:

<?xml version="1.0"?>

<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/ there.is.only.xul" xmlns:nc="http://home.netscape.com/NC-rdf#">

<popup id="menu_ToolsPopup">

<menuitem
oncommand="fecha=new Date(); hora=fecha.getHours(); minuto=fecha.getMinutes(); segundo=fecha.getSeconds(); alert(hora + ' : ' + minuto + ' : ' + segundo);" label="Mostrar Hora;"/>

</popup>

</overlay>

Lo que estamos haciendo aquí es crear un documento XUL que solo contiene una entrada de menú dentro de un popup que queremos superponer sobre el navegador. La única diferencia con los ejemplos que hemos visto hasta ahora es que en lugar de definir una ventana definimos un overlay pero aparte del nombre no hay mucha diferencia. Simplemente indicamos a Mozilla que este no es un documento xul completo, si no que vamos a combinarlo con otro/s documentos xul.

Ahora veamos como funcionaría el overlay con un caso sencillo antes de pasar a mayores. Supongamos un archivo XUL que importa el overlay que acabamos de definir; para ello usaría algo parecido a este código:

<?xul-overlay href="chrome://hora/content/hora.xul"?>

Lo que ocurriría entonces es que para cada elemento con un id definido en el archivo de overlay se buscaría el mismo elemento con el mismo id en el documento sobre el que queremos superponer. Antes de nada tendríamos que haber abierto el fichero browser.xul para ver donde se definen las entradas de menú del menú herramientas y cual es el ID de conjunto que las contiene. Ese trabajo ya esta hecho; como se puede ver en el código tenemos un elemento popup con id menu_ToolsPopup, aquí es donde está la clave.

En el caso de que no se encuentre una instancia de ese elemento con ese ID entonces este elemento no se tiene en cuenta al hacer el overlay. Si por el contrario si se encuentra, entonces el elemento y todo lo que se defina dentro de este en el overlay pasará a superponerse al documento raíz, lo cual quiere decir que el elemento del documento raíz adquirirá todos los atributos que se definan en el overlay además de todos sus subelementos.

En este ejemplo el documento raíz es el que se encargaba de añadir el overlay usando la etiqueta xul-overlay, sin embargo esto no nos es de utilidad en nuestro caso ya que no queremos tener que cambiar el código de browser.xul. La solución es hacer que sea el overlay el que diga a que documento se tiene que superponer. Esto podemos hacerlo añadiendo la información de los overlay a nuestro contents.rdf

<?xml version="1.0"?>

<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:chrome="http://www.mozilla.org/rdf/chrome#">

<RDF:Seq about="urn:mozilla:package:root">
<RDF:li resource="urn:mozilla:package:hora"/>
</RDF:Seq>

<RDF:Description about="urn:mozilla:package:hora"
chrome:displayName="Mostrar Hora 0.1"
chrome:author="Zootropo"
chrome:authorURL="http://zootropo.blogspot.com"
chrome:name="hora"
chrome:extension="true"
chrome:description="Añade una opción al menú de herramientas para mostrar la hora actual.">
</RDF:Description>

<RDF:Seq about="urn:mozilla:overlays">
<RDF:li resource="chrome://browser/content/browser.xul"/>
</RDF:Seq>

<RDF:Seq about="chrome://browser/content/browser.xul">
<RDF:li>chrome://hora/content/hora.xul</RDF:li>
</RDF:Seq>

</RDF:RDF>

Vemos que tenemos un par de listas nuevas, una referida a urn:mozilla:overlays en el que los elementos de la secuencia son los documentos sobre los que se va a hacer el overlay (en este caso el browser.xul para superponer a nuestro navegador) y otra secuencia con el archivo xul sobre el que hacemos el overlay como sujeto y como entradas de la secuencia los archivos xul a superponer.

Borramos overlay.rdf como en el post anterior, añadimos una entrada nueva a installed-chrome.txt para el content de nuestra aplicación (no tendremos locale porque la única función javascript que utilizamos esta embebida en el archivo xul ni skin ya que no utilizamos ningún css) y reiniciamos nuestro navegador, tras lo cual tendremos una nueva entrada al final del menú de herramientas que nos permitirá ver la hora del sistema.

There is only XUL (IX)

A la hora de organizar los ficheros de nuestra aplicación se sigue un estándar de facto en el que tenemos tres subdirectorios dentro de la carpeta de nuestra aplicación: content, local y skin.

El directorio content incluye un subdirectorio con el nombre de nuestra aplicación que a su vez contiene todos los archivos xul de la aplicación, además de los archivos js con el código javascript de la aplicación y un fichero contents.rdf que nos dice entre otras cosas cual es el archivo .xul principal.

En el directorio locale se incluyen una serie de subdirectorios con el código del idioma correspondiente, por ejemplo es-ES para castellano o en-US para inglés de estados unidos. Dentro de cada uno de estos directorios tenemos un subdirectorio con el nombre de la aplicación que incluye a su vez los ficheros dtd que sirven para separar la aplicación de los mensajes de esta para facilitar el proceso de traducción y un fichero contents.rdf.

Por último el directorio skin contiene otro subdirectorio de nombre classic que incluye un directorio con el nombre de nuestra aplicación con los ficheros css que se utilizan para modificar el aspecto de la aplicación y un archivo contents.rdf.

Hasta ahora el código javascript que hemos utilizado estaba incrustado dentro de los ficheros xul, en el siguiente ejemplo veremos como importar el código de un fichero js separado del código xul. Como simple comentario, el código css que hemos utilizado hasta ahora estaba almacenado en archivos css aparte como dicta la norma para conseguir modularidad; sin embargo, al igual que el código javascript, el código css puede almacenarse en un fichero aparte o incrustado dentro del propio archivo xul.

<?xml version="1.0"?>
<!DOCTYPE window SYSTEM "chrome://caffeine/locale/caffeine.dtd">

<?xml-stylesheet href="chrome://caffeine/skin/caffeine.css" type="text/css"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/ there.is.only.xul"
xmlns:nc="http://home.netscape.com/NC-rdf#">

<script type="application/x-javascript"
src="chrome://caffeine/content/caffeine.js"/>

<button onclick="funcion();" label="&nombreBoton;" accesskey="&teclaAcceso"/>

</window>

La línea de script es la que se encarga de importar el código javascript desde el fichero javascript especificado de forma que podemos usar la función funcion() al hacer click en el botón aunque no la hallamos definido en este fichero. Podemos ver también la forma en que se importan los ficheros dtd con los mensajes de la aplicación en la segunda línea del código fuente. Hasta ahora no habíamos utilizado ficheros dtd, sino que incluíamos el texto de la aplicación imbuida dentro de esta; ahora con estos ficheros llevamos la modularidad de xul hasta el extremo, separando del código xul el funcionamiento, la apariencia y los mensajes.

El uso de los mensajes que se definen en los DTDs podemos verlo en el label y la accesskey del botón, un símbolo ampersand, el nombre que le dimos al mensaje en el dtd y punto y coma. El fichero DTD para este programa sería:

<!ENTITY nombreBoton "Mi Boton">
<!ENTITY teclaAcceso "M">

Para cada mensaje como vemos tenemos un !ENTITY, la segunda entrada de !ENTITY es el nombre del mensaje que se utilizará para referirse a él en el código XUL como ya vimos y el tercero el valor. En este DTD nombreBoton es "Mi Boton" pero podríamos tener otro DTD para el inglés en cuyo caso sería "My Button", etc, de forma que la traducción de la aplicación es mas sencilla al separar el código y los mensajes.

Por último como ya dijimos cada uno de los directorios de la aplicación incluye un fichero contents.rdf para poder registrar ese directorio en el registro chrome. Veamos el caso del contents.rdf de los locales:

<?xml version="1.0"?>
<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:chrome="http://www.mozilla.org/rdf/chrome#">

<!-- Lista de todos los locales que incluimos, en este caso solo es-ES -->
<RDF:Seq about="urn:mozilla:locale:root">
<RDF:li resource="urn:mozilla:locale:es-ES"/>
</RDF:Seq>

<!-- Informacion sobre cada uno de los locales -->
<RDF:Description about="urn:mozilla:locale:es-ES"
chrome:displayName="Castellano (ES)"
chrome:name="es-ES">
<chrome:packages>
<RDF:Seq about="urn:mozilla:locale:es-ES:packages">
<RDF:li resource="urn:mozilla:locale:es-ES:caffeine"/>
</RDF:Seq>
</chrome:packages>
</RDF:Description>

</RDF:RDF>
Y el contents.rdf de los skins:
<?xml version="1.0"?>

<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:chrome="http://www.mozilla.org/rdf/chrome#">

<RDF:Seq about="urn:mozilla:skin:root">
<RDF:li resource="urn:mozilla:skin:classic/1.0" />
</RDF:Seq>

<RDF:Description about="urn:mozilla:skin:classic/1.0">
<chrome:packages>
<RDF:Seq about="urn:mozilla:skin:classic/1.0:packages">

</RDF:Seq>
</chrome:packages>
</RDF:Description>

</RDF:RDF>

Estos dos contents.rdf no necesitan comentarios. Son muy parecidos al contents.rdf del directorio contents. Tan solo queda registrar en el registro chrome contents, locals y skins. Si recordamos en el anterior post sobre XUL al registrar el contents añadíamos a installed-chrome.txt una línea similar a esta:

content,install,url,resource:/chrome/caffeine/content/caffeine/

Si echamos un vistazo a las demás entradas en installed-chrome veremos que algunas comienzan con skin, otras con locale y otras con contents. Esto es lo único que tenemos que cambiar a la hora de registrar skins y locales, lo demás es similar, por lo tanto para nuestra aplicación de ejemplo tendríamos que añadir las líneas:

skin,install,url,resource:/chrome/caffeine/content/caffeine/
locale,install,url,resource:/chrome/caffeine/locale/es-ES/
content,install,url,resource:/chrome/caffeine/skin/classic/caffeine/

There is only XUL (VIII)

Hasta ahora dividiamos un programa XUL en la interfaz en si, creada con XUL; el aspecto de los widgets, definido con CSS y la funcionalidad, programada en Javascript. Sin embargo Javascript no nos permite cosas como acceder al disco duro, de modo que si tuvieramos que limitar la funcionalidad de los programas basados en XUL a lo que podemos hacer con Javascript, estos no tendrían demasiada utilidad.

La solución a este problema nos viene dada en forma de una libreria escrita en código dependiente de la plataforma llamada XPCOM y una capa intermedia entre javascript y esta librería llamada XPConnect, que traduce los objetos XPCOM en objetos Javascript que puedan ser manipulados en nuestro programa.

El problema de esto es que la seguridad de Mozilla dejaría mucho que desear si cualquier script pudiera hacer cosas como borrar los archivos del disco duro. Aquí es donde vemos la utilidad de chrome.

Como ya se comentó la url chrome:// se refiere al directorio chrome dentro del directorio de instalación de Mozilla/Firefox. Solo los scripts que se encuentren en este directorio tienen permiso para utilizar XPConnect, lo cual implica que para usar los objetos de XPCOM necesitamos instalar nuestra aplicación en chrome. Sin embargo no basta simplemente con mover nuestros ficheros a ese directorio, si no que tenemos que añadir una serie de entradas a installed-chrome.txt para que nuestra aplicación sea añadida al 'registro chrome' de forma que Mozilla pueda resolver las urls chrome:// al directorio en que esta instalada nuestra aplicación.

Lo primero que tenemos que hacer es crear un archivo de tipo rdf llamado contents.rdf que proporcionará información a Mozilla sobre el nombre de la aplicación, el autor, la versión...

<?xml version="1.0"?>

<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:chrome="http://www.mozilla.org/rdf/chrome#">

<RDF:Seq about="urn:mozilla:package:root">
<RDF:li resource="urn:mozilla:package:caffeine"/>
</RDF:Seq>

<RDF:Description about="urn:mozilla:package:caffeine"
chrome:displayName="The Caffeine XPerience"
chrome:author="Zootropo"
chrome:name="caffeine"
chrome:extension="true"/>

</RDF:RDF>

En este ejemplo displayName es el nombre completo para la aplicación; author el autor de la aplicación, name el identificador de la aplicación (como se referirá Mozilla a él, tiene que ser igual que el valor después de urn:mozilla:package:) y extension indica si la aplicación es una extensión, de forma que se mostrará en la lista de extensiones de Mozilla en el caso de que sea true (cierto).

Una vez creado nuestro fichero contents.rdf lo copiamos a la carpeta de nuestra aplicación. Editemos ahora el fichero installed-chrome.txt que se encuentra dentro del directorio chrome, teniendo en cuenta cerrar antes el navegador, para registrar nuestra aplicación de forma que Mozilla sepa donde encontrarla. Al final del fichero añadimos por ejemplo para el caso de que el directorio de la aplicación sea caffeine/content/caffeine/ dentro del directorio chrome:

content,install,url,resource:/chrome/caffeine/content/caffeine/

Solo queda borrar el fichero chrome.rdf que contiene la información sobre las extensiones registradas en chrome para que vuelva a crearse cuando ejecutemos Mozilla/Firefox y tenga en cuenta nuestra aplicación. La información de cada una de las aplicaciones la recolectará basándose en installed-chrome.txt para encontrarla y en el contents.rdf que creamos para procesar el contenido de nuestra aplicación.

Ahora deberíamos ser capaces de poder ejecutar cualquier archivo xul de nuestra aplicación (y por añadidura referirnos a cualquier archivo de nuestra aplicación) usando una url chrome de la forma:

chrome://id-aplicacion/content/archivo.xul

Por ejemplo para abrir el archivo foo.xul de la aplicación con id caffeine podríamos simplemente escribir chrome://caffeine/content/foo.xul

There is only XUL (VII)

Vamos a hacer un inciso para hablar sobre RDF. RDF es un estándar de la W3C cuyo nombre deriva de las siglas de 'Resource Description Framework' y que es un subconjunto de XML, al igual que XUL, que nos sirve para expresar hechos (cosas que son ciertas, la información en forma de predicados que tenemos sobre el mundo real). Sería algo parecido a los predicados de Prolog. Por ejemplo, un predicado del tipo 'A Linus le gustan los pingüinos' en RDF podría expresarse como

<Description about="Linus">

<le-gustan>pingüinos</le-gustan>
</Description>

La etiqueta Description sirve para representar uno o mas hechos, con un atributo about para indicar sobre quien es ese hecho, es decir, el sujeto del hecho. Description puede contener una o varias etiquetas hijas siendo cada una de ellas un predicado.

<Description about="Linus">

<le-gustan>pingüinos</le-gustan>
<informatico>true</informatico>
<linuxero>true</true>
<nacionalidad>finlandesa</finlandesa>
</Description>

En este ejemplo definimos una serie de predicados sobre Linus, con una etiqueta definida por nosotros mismos para desribir ese predicado y con el valor entre las etiquetas.

Ahora, ¿como expresariamos el hecho de que a Linus le gustan además de los pingüinos los sombreros o los camaleones?. Podríamos usar varios predicados le-gustan pero RDF nos proporciona un método mejor. En RDF se definen tres etiquetas que sirven como contenedoras: <Bag>, que define un conjunto de items; <Seq>, que define un conjunto de items ordenados y <Alt>, que define un conjunto de elementos que son alternativos, es decir, que se consideran equivalentes. Los elementos de un contenedor se encierra entre <li> y </li> (li de list, lista, al igual que la etiqueta de HTML). Veamos un ejemplo:

<Description about="Linus">

<Bag ID="Gustos">
<li>pingüinos</li>
<li>sombreros</li>
<li>camaleones</li>
</Bag>
<informatico>true</informatico>
<linuxero>true</true>
<nacionalidad>finlandesa</finlandesa>
</Description>

Ahora tenemos una lista de los gustos de Linus usando un Bag que sería equivalente a un predicado con varios valores. Para identificar el predicado que define este Bag usamos el atributo ID. Seq y Alt serían similares, tan solo cambia su significado.

Para finalizar esta pequeña introducción a RDF vamos a ver un ejemplo completo para explicar un par de cosas que quedan en el tintero.

<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:BEBIDAS="http://www.caffeine.com/rdf#">

<RDF:Bag about="http://www.caffeine.com/tipos-de-bebida">
<RDF:li>
<RDF:Description about="http://www.caffeine.com/infusiones/te">
<BEBIDAS:nombre>Te</BEBIDAS:name>
<BEBIDAS:precio>1,12</BEBIDAS:precio>
</RDF:Description>
</RDF:li>
<RDF:li>
<RDF:Description about="http://www.caffeine.com/infusiones/tila">
<BEBIDAS:nombre>Tila</BEBIDAS:name>
<BEBIDAS:precio>0,9</BEBIDAS:precio>
</RDF:Description>
</RDF:li>
<RDF:li>
<RDF:Description about="http://www.caffeine.com/cafes/solo">
<BEBIDAS:nombre>Cafe solo</BEBIDAS:name>
<BEBIDAS:precio>1,2</BEBIDAS:precio>
</RDF:Description>
</RDF:li>
</RDF:Bag>
</RDF:RDF>

Lo primero que tenemos que comentar es la línea con la que comienza el RDF. Esta es similar al window de XUL en el que definimos que espacio de nombres vamos a utilizar. Usaremos RDF que esta definida en tal URL y BEBIDAS que esta definido en tal otra. Relacionado con esto, el RDF: que aparece antes de las palabras clave de RDF o el BEBIDAS: que aparece antes de los nombres de los predicados indica el espacio de nombres que estamos utilizando, es decir, RDF:li por ejemplo significa que nos estamos refiriendo a la etiqueta li que está definida dentro de RDF.

Mis Extensiones Favoritas

Estas son las extensiones que tengo instaladas en Firefox 0.9, sin ningún orden en particular:

  • Bookmark Backup: Guarda una copia de nuestros marcadores (o cualquier otro fichero) cada vez que cerramos Firefox.
  • Bookmarks Syncronizer: Sube nuestros marcadores a un sitio web cada vez que cerramos Firefox. Útil si utilizas varios PCs.
  • Find Statusbar: Añade una barra de estado al diálogo de búsqueda de forma que no nos salte ese molesto prompt cuando no se encuentren mas resultados, si no que nos lo dirá en la barra de estado.
  • Download statusbar: En lugar de abrir la ventana del gestor de descargas cada vez que añadimos un archivo a descargar este aparece en la barra de estado y desde allí podemos ver el progreso del fichero. De esta forma solo tenemos una ventana y podemos ver a que velocidad descarga o cuanto le queda para terminar desde la misma ventana del navegador.
  • Download Sort: Nos permite definir para las extensiones de archivo que queramos una carpeta por defecto donde guardarla.
  • Download with: Permite mandar las descargas a programas externos.
  • Foobar Controls: Para controlar el reproductor Foobar desde nuestro navegador.
  • Get file size: Añade un campo con el tamaño del archivo en las propiedades.
  • Image Toolbar: Similar a la barra de imágen de Internet Explorer. Cuando nos situamos sobre una imágen aparecerá esta barra con opciones para guardar la imagen, copiarla al portapapeles o abrir la carpeta de imágenes.
  • Open Book: Hace que en el diálogo para añadir un marcador la lista de carpetas este expandida por defecto.
  • Session Saver: Permite guardar las pestañas en que estamos navegando, bien cuando se lo indiquemos explicitamente o cuando se cierre el navegador.
  • Show Failed URL: Cuando las páginas de error XUL están activadas (se muestra una página de error en lugar de un prompt) hace que en la barra de dirección aparezca la URL en lugar de un mensaje de error.
  • Pop up allow: Permite que se acepten pop ups cuando se tiene pulsado Bloquear Mayúsculas.
  • Pop up count: Muestra el número de popups bloqueados hasta el momento.
  • Tab X: Añade un botón de cerrar a cada pestaña.
  • Tab Browser Preferences: Entre otras cosas nos permite hacer que los enlaces se abran en pestañas nuevas en lugar de ventanas nuevas.
  • Tab Scroller: Gracias a esta extensión podemos movernos entre las pestañas con la rueda del ratón.
  • Translate Page: Añade una opción para traducir la página al menú de herramientas.
  • Text Zoom: Permite sobrescribir el valor de zoom por defecto para el texto, es decir, podemos hacer que el texto se vea mas grande o mas pequeño por defecto en lugar de tener que utilizar Control y + o Control y -.
  • Undo Close Tab: Nos permite abrir la última pestaña que cerramos.
  • Googlebar: Similar a la barra de google para Internet Explorer. Permite búsquedas en google sin tener que entrar en su página web, desde la barra de herramientas.
  • Web Developer: Añade una barra de menú con herramientas para el desarrollo web.
  • Bloglines Toolkit: Integra el notificador de Bloglines dentro de Firefox. Añade un botón en la barra de estado que nos informa de cuando tenemos nuevas entradas por leer entre nuestros feeds.

There is only XUL (VI)

Antes de empezar con cosas mas serias vamos a ver como se implementan los menús en XUL.

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/ there.is.only.xul">
<menubar>
<menu label="Archivo">
<menupopup>
<menuitem label="Nuevo"/>
<menuseparator/>
<menuitem label="Abrir"/>
<menuitem label="Salvar"/>
<menuitem label="Cerrar"/>
</menupopup>
</menu>
<menu label="Editar">
<menupopup>
<menuitem label="Deshacer"/>
<menuseparator/>
<menuitem label="Copiar"/>
<menuitem label="Cortar"/>
<menuitem label="Pegar"/>
</menupopup>
</menu>
<menu label="Ver">
<menupopup>
<menuitem label="Regla"/>
<menu label="Fuente">
<menupopup>
<menuitem label="Arial"/>
<menuitem label="Verdana"/>
</menupopup>
</menu>
<menu label="Color">
<menupopup>
<radiogroup>
<radio label="Rojo"/>
<radio label="Azul"/>
<radio label="Negro"/>
<radio label="Verde"/>
</radiogroup>
</menupopup>
</menu>
<menuitem label="Pantalla Completa"/>
</menupopup>
</menu>
</menubar>
</window>

menubar define la barra de menús. Dentro de menubar tenemos un conjunto de etiquetas menu que son las que definen las entradas de menú en si. Si al pulsar sobre el menú se va a desplegar una lista de submenús, entonces utilizamos menupopup y menuitem para cada uno de los submenús. En el caso de que no hubieramos agrupado los submenús (menuitems) en un menupopup se habrían mezclado todas las entradas en una sola, que no es lo que queremos. Además tenemos otro elemento que es menuseparator, que introduce una línea para dividir el menú en partes. Notar también que los submenús también pueden ser menús con varias entradas como vemos en el caso de fuente en que definimos un nuevo menú y no un menuitem. Como último comentario decir que en lugar de menuitems o menús, como entradas dentro de los menús también podríamos tener otros elementos como checkboxes o radiobuttons como vemos en el caso del menú color.

There is only XUL (V)

Esta vez vamos a terminar de ver los widgets básicos de XUL, junto con los botones, las cajas de texto o las etiquetas que ya vimos anteriormente. El código del programa ejemplo es el siguiente:

<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/ there.is.only.xul">

<tabbox orient="vertical">
<tabs orient="horizontal">
<tab label="Radiobuttons"/>
<tab label="Checkboxes"/>
<tab label="Listbox"/>
<tab label="Imagenes"/>
</tabs>

<tabpanels>
<radiogroup orient="vertical">
<radio label="Cafe solo"/>
<radio label="Cafe con leche"/>
<radio label="Descafeinado"/>
</radiogroup>
<box>
<checkbox label="Donuts"/>
<checkbox label="Croisants"/>
<checkbox label="Caracolas"/>
</box>
<image src="file://C:\widgets\mozilla.png"/>
</tabpanels>
</tabbox>

</window>

Las pestañas se declaran mediante la etiqueta tabbox. orient nos dice si la orientación, en este caso de las pestañas, será horizontal o vertical. Cada una de las pestañas esta compuesta por dos componentes diferenciados, las pestañas en si, que vienen definidas por una serie de etiquetas tab dentro de un elemento tabs y el contenido de las pestañas que se define dentro de tabpanels. Dentro de tabpanels habrá tantos elementos como pestañas definamos en tabs (esto no es necesariamente cierto pero vamos a simplificar) y se seguirá una correspondecia por orden de declaración a la hora de asignar el contenido que corresponde a cada pestaña. En este caso, por ejemplo, en la pestaña 1 tenemos un elemento radiogroup compuesto por varios elementos radio, en la pestaña 2 tenemos una serie de checkboxes que agrupamos en un box para que sea un solo elemento y en la tercera pestaña tenemos una imagen.

Veamos ahora los otros widgets. En primer lugar, en la primera pestaña tenemos radiobuttons, que representan opciones excluyentes. Un grupo de radiobuttons se define con radiogroup y cada uno de los radiobuttons con radio, como podemos ver. Los checkboxes son opciones no excluyentes que se definen con la etiqueta checkbox. Por último las imágenes se definen con la etiqueta image que tiene como atributo la ruta a la imagen (src de source, fuente).

sábado, junio 19, 2004

Tab Browser Extensions: RIP

Con la versión 0.9 de Firefox he tenido que prescindir de mis queridas Tab Browser Extensions porque eran las culpables de algún problema con javascript. Al usar bloglines por ejemplo tenía que copiar el enlace javascript en la barra de localización para abrir los feeds ya que si hacía click sobre ellos no pasaba nada. Y es que siempre ha habido bastante gente con problemas de incompatibilidad por culpa de TBE, pero nunca había sido mi caso.

Ahora gracias a Mozillazine tengo todas las funcionalidades que me gustaban de las TBE sin ningún problema de compatibilidad. La he sustituido por las siguientes extensiones:

  • Tab X: Añade un botón de cerrar a cada pestaña.
  • Undo Close Tab: Nos permite abrir la última pestaña que cerramos.
  • Tab Browser Preferences: Entre otras cosas nos permite hacer que los enlaces se abran en pestañas nuevas en lugar de ventanas nuevas.
  • Tab Scroller: Gracias a esta extensión podemos movernos entre las pestañas con la rueda del ratón.
  • Session Saver: Permite guardar las pestañas en que estamos navegando, bien cuando se lo indiquemos explicitamente o cuando se cierre el navegador.

The Elder Scrolls: Arena

Ahora que no tengo mas examenes hasta el día 1 de Julio me puedo relajar un poco mas. Y he decidido relajarme volviendo a jugar a un juego clásico que perdí hace tiempo entre pilas de disquetes y CDs: el hermano pequeño de Morrowind, 'The Elder Scrolls: Arena', aprovechando que se puede descargar de manera gratuita desde su página web desde hace meses con motivo del décimo aniversario de la serie.

Arena es un clásico de los juegos de rol para PC, hay pocos juegos que puedan competir con él en calidad, en historia, en la libertad y en el nivel de implicación del jugador. Si no conocias Arena tardas en descargarlo (abstenerse fanáticos de Quake III y otras lindezas visuales).

Mozilla Optimizer 1.6.3

Para gente vaga en general y los que no les guste jugar con user.js o about:config acaba de salir la nueva versión de Mozilla Optimizer, la versión 1.6.3 que añade soporte para la versión 0.9 de Firefox y Mozilla 1.7

Mozilla Optimizer es un programa para mejorar el rendimiento y velocidad de los navegadores basados en el motor Gecko (Mozilla, Phoenix, Firebird y Firefox, Netscape 6 y 7,...) cambiando los valores por defecto de prefs.js a otros mas convenientes.

Para no quedarme ciego con Firefox en Linux...

... tuve que añadir esto a mi user.js

//No me muestres letras de tamaño menor que este
user_pref("font.min-size.variable.", 16);
user_pref("font.min-size.variable.x-western", 16);
user_pref("font.min-size.fixed.x-western", 16);

//Activar el antialiasing (fuentes suavizadas)
user_pref("font.FreeType2.enable", true);
user_pref("font.FreeType2.autohinted", true);
user_pref("font.allow_double_byte_special_chars", false);
user_pref("font.scale.aa_bitmap.always", true);

//Limitamos el tamaño de letra para el que se usará el antialiasing. Por debajo de cierto tamaño no se ve bien
user_pref("font.antialias.min", 10);
user_pref("font.embedded_bitmaps.max", 1000000);
user_pref("font.scale.tt_bitmap.dark_text.min", 64);
user_pref("font.scale.tt_bitmap.dark_text.gain", "0.8");

Importa tus correos a Gmail

Leo en Redemption in a blog sobre la existencia de una utilidad creada por Mark Lyon para transferir nuestro correo electrónico en formato mbox a Gmail. mbox es el formato utilizado por Mozilla Mail y Thunderbird, así que si utilizais otro cliente de correo y quereis utilizar la aplicación tendreis que convertirlo a formato mbox primero.

Mtools

El tener que montar y desmontar la disquetera cuando tenemos prisa en Linux es un poco engorroso. Para esto y otras muchas cosas nos puede ser de utilidad las mtools, una colección de comandos que emulan algunas herramientas de MS-DOS. Algunas de las herramientas mas útiles que incluye este paquete son:

  • mcd: cambiar de directorio.
  • mcopy: copiar archivos.
  • mdel: borrar archivos.
  • mdir: lista el contenido de un directorio.
  • mmd: crear directorios.
  • mrd: borrar directorios.
  • mren: cambiar el nombre de un archivo.

Una cosideración a tener en cuenta al usar mtools es que a la unidad de disquete se le hace referencia mediante a: igual que en MS-DOS

Hotmail se une a la guerra

Según Betanews los directivos de Microsoft planean plantarle cara a Gmail aumentando el espacio disponible en sus cuentas de correo apartir de Julio.

No lo han comentado pero puede que no sea la única cosa que cambie. ¿Tal vez la interfaz o nuevas funcionalidades? Desde luego si contraatacan simplemente aumentando el espacio de almacenamiento es que no se han enterado de nada.

viernes, junio 18, 2004

There is only XUL (IV)

En este tercer ejemplo sobre XUL vamos a construir una versión mas elegante del Hola Mundo que nos permita introducir el texto que queremos que salga en el alert. El código del programa es el siguiente:

<?xml version="1.0"?>
<window id="ventana-principal" title="Caffeine" xmlns="http://www.mozilla.org/keymaster/gatekeeper/ there.is.only.xul">
<vbox>
<hbox><label value="Texto a mostrar"/><textbox id="miTexto" maxlength="10"/></hbox>
<button label="Mostrar" onclick="var texto=document.getElementById('miTexto');alert(texto.value);"/>
</vbox>
</window>

Ejecutad el programa y lo primero que vereis es que la ventana no ocupa todo el espacio del escritorio aún cuando no hemos especificado un ancho y un alto. Esto es así por el layout manager de XUL que se encarga de calcular la posición y el tamaño de los elementos de la interfaz de forma que no halla problemas cuando el usuario cambie el tamaño de las ventanas, por ejemplo. El layout manager de XUL se basa en dos etiquetas principalmente que son <vbox> y <hbox>. Con vbox lo que hacemos es indicar al gestor que posicione los elementos que van a estar dentro de <vbox></vbox> uno debajo de otro; con hbox, que es equivalente al <box> que hemos usado en ejemplos anteriores, le indicamos que los coloque de izquierda a derecha. Combinando estas dos etiquetas, espaciadores y los elementos flexibles podemos crear layouts complejas.

Si echamos un vistazo al código además de un vbox y un hbox de los que ya hemos hablado vemos dos cosas nuevas, el widget label y el widget textbox. Un label o etiqueta sirve para mostrar un texto en pantalla (un texto corto, para textos largos usariamos description) y el textbox o caja de texto para dar la posibilidad de escribir al usuario. El atributo value de label indica el texto que se mostrará. En el caso del textbox le damos un nombre con id, miTexto, ya que lo necesitaremos en el código javascript para obtener el texto que escribió el usuario en él. Además usamos el atributo maxlenght para indicarle que el máximo número de caractéres que pueden introducirse es 10.

Como último apunte un vistazo al onclick del botón ya que aquí es donde ocurre toda la magia. Como ya vimos en el ejemplo del 'Hola Mundo', onclick define una acción que se ejecutará cuando se haga click sobre ese elemento; en este caso cuando se presione el botón mostrar se ejecutará el código javascript que le pasamos. No es el objeto de estas entradas el explicar javascript pero basta con saber que se declara una variable llamada texto que apunta al elemento de la interfaz cuyo nombre es 'miTexto' y después se crea una ventana alert con el texto que contenga este.

There is only XUL (III)

Vamos a ver algún nuevo concepto sobre XUL. El programa que veremos esta vez es un poco mas complejo que el que vimos en la anterior entrega. Para empezar creamos una carpeta para el programa, por ejemplo c:\caffeine\ con una imagen de tipo gif con nombre aceptar y creamos nuestro fichero caffeine.xul dentro de ese directorio con el siguiente texto:

<?xml version="1.0"?>
<window id="ventana-principal" title="Ventana" width="400" height="200" screenX="20" screenY="20" xmlns="http://www.mozilla.org/keymaster/gatekeeper/ there.is.only.xul">
<box>
<button id="boton1" class="dialog" label="Aceptar" image="file://c:\caffeine\aceptar.gif" accesskey="a"/>
<button image="file://c:\caffeine\aceptar.gif" disabled="true" accesskey="c"/>
<button/>
</box>
</window>

Como veis tenemos la primera línea que indica que el documento es un documento XML. Al crear la nueva ventana en la siguiente línea vemos algún atributo que no conociamos aún: width que indica el ancho de la ventana en pixels, height que hace lo propio con el alto y screenX y screenY que nos da la posición inicial de la ventana en pixels.

Dentro de la ventana como vemos se defininen tres botones. En el primer botón que declaramos, boton1, tenemos un atributo class que indica la clase de botón que es boton1 (nos sirve para definir estilos distintos en la hoja de estilo, si no sabes css no te interesa); un atributo image, para mostrar una imagen en el botón y el atributo acceskey que asocia un acelerador con el botón.

El segundo botón que creamos tiene la peculiaridad de que no tiene texto (no tiene un atributo label), sino que simplemente tiene una imagen. Además esta deshabilitado con el atributo disabled y tiene como tecla de acceso directo 'c'. Por último el tercer botón ilustra el que se puede crear objetos que no tengan atributos. En este caso dado que no definimos un texto a mostrar y tampoco una imagen el botón estará vacio.

Si hacemos doble click sobre el archivo caffeine.xul veremos algo parecido a esto:

Como último apunte, fijaros en que he comentado que tenemos que abrir el archivo haciendo doble click sobre el en lugar de hacerlo desde Archivo->Abrir. Esto es así por que si lo hicieramos de la segunda forma tendríamos una ventana dentro de la ventana de nuestro navegador, con lo cual no se vería el efecto de cambiar el tamaño de la ventana o cambiar el título. Además como apunte, si utilizais Mozilla Firefox y al hacer doble click sobre el archivo .xul os dice algo parecido a 'c is not a registered protocol' teneis que cambiar la asociacion para los archivos xul de firefox.exe -chrome "%1" que será seguramente lo que tengais a firefox.exe -chrome "file://%1".

jueves, junio 17, 2004

Bloglines Toolkit 1.2

Una nota rápida, en la web de Chad Everett podeis encontrar la nueva versión de esta extensión, una de mis extensiones favoritas para Firefox que aún no estaba actualizada para ser usada con la versión 0.9 de Firefox. Bloglines Toolkit integra el notificador de Bloglines dentro de nuestro navegador.

There is no data. There is only XUL (II)

Para que veais por encima la estructura de un programa en XUL vamos a escribir un programa de tipo 'Hola Mundo', aunque como todos los programadores que se creen originales y rebeldes en lugar de un 'Hola Mundo' nuestro programa mostrará alguna frase geek; por ejemplo 'I know kung foo'.

Usando un editor de texto cualquiera (¿que tal vim?) escribimos lo siguiente, teniendo cuidado con las mayúsculas y las minúsculas, ya que XML es case sensitive, y lo guardamos como foobar.xul por ejemplo:

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<!--Esto es una ventana-->
<window id="ventana-principal" title="The Kung Foo Style" mlns="http://www.mozilla.org/keymaster/gatekeeper/ there.is.only.xul">
<box>
<button label="Matrix has you" onclick="alert('I Know Kung Foo');" />
</box>
</window>

Si abrimos Mozilla o Firefox, nos vamos a Archivo->Abrir y seleccionamos nuestro fichero foobar.xul veremos algo similar a esto



Ahora que ya habeis visto la sencillez de XUL vamos a ir línea por línea para ver que es cada cosa. Con la primera línea, <?xml version="1.0"?> lo que hacemos es declarar este archivo como un archivo xml. Un documento XUL siempre tiene que empezar con esta línea, no tiene mas importancia.

La segunda línea <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> nos permite indicar que hoja de estilo queremos utilizar para definir el aspecto de la aplicación. Estamos hablando de documentos css como los que se utilizan para definir el estilo de una página web, si; mientras XUL define que widgets vamos a utilizar en nuestra aplicación se usa css para definir el aspecto que tendrán estos. En este ejemplo en concreto estamos importando global.css referenciado por chrome://global/skin/ (chrome:// es un tipo especial de URL, podríamos haber utilizado una hoja de estilos creada por nosotros si quisieramos tal como si fuera un documento HTML).

En la tercera línea tenemos un comentario. Los comentarios siempre tienen que estar entre <!-- y --> como define XML y es ignorado al interpretar el documento XUL.

Debajo, en la cuarta línea, estamos creando una ventana nueva con <window>, cuyos atributos son id para darle un nombre y poder referenciarla mas tarde, title que indica el texto a mostrar en la barra de título y xmlns que indica el espacio de nombres a utilizar. Un espacio de nombres indica los elementos que se reconocen como válidos a la hora de interpretar el fichero; en este caso en concreto solo se reconocerán los elementos definidos en XUL, eso es lo que hace la URL http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul (notar el there is only xul).

En la sexta línea tenemos una etiqueta box, por box model, el modelo de gestión del layout (como se colocan los objetos dentro de la ventana) que utiliza XUL. Probad a eliminar el <box> y </box>, vereis que la interfaz se descoloca.

Dentro del box utilizamos la etiqueta button para crear un botón que tendrá como texto a mostrar 'Matrix has you', definido por el atributo label. Ese onclick le sonará a la gente que utilice javascript; lo que hace es que al pulsar sobre nuestro botón (onclick) muestre un alert con el texto que le pasamos como argumento. Como habreis imaginado esto completa el cuadro de las aplicaciones XUL (por ahora): XUL define los widgets de la aplicación, con css definimos el aspecto de estos y con javascript su funcionamiento.

Por último cerramos la etiqueta window con </window>, tal como se hace con las etiquetas de HTML (XHTML es un subconjunto de XML, como lo es XUL, de ahí las semejanzas).

There is no data. There is only XUL

Mi nuevo pasatiempo en los últimos días, aparte del estudio intensivo y cualquier excusa que me permita alejarme del estudio intensivo, ha sido aprender un poco sobre XUL, un lenguaje basado en XML para el desarrollo de interfaces de usuario multiplataforma del que se dice será la pesadilla de .NET de Microsoft.

Su nombre deriva de las siglas de XML-based User-interface Language y fue creado por la gente del proyecto Mozilla apoyándose en su motor de renderizado, Gecko, que se encarga tanto del visualizado de webs como de la construcción de la interfaz de usuario.

Si quereis saber más sobre XUL, podeis encontrar una lista de sus principales ventajas en el documento 'The Joy of XUL' y algún tutorial en sitios como XUL-Planet.

Gmail y palomitas

Después de la patética muestra de humor geek del título de la entrada (palomitas=POPcorns, no pienso explicar mas :P) vamos a lo que vamos. Si ya eres el orgulloso poseedor de una cuenta de Gmail puede que te hallas preguntado que hacer para poder leer el correo desde tu cliente de correo favorito sin tener que usar el interfaz web.

La interfaz web de Gmail es genial y tiene algunas ideas realmente interesantes como las etiquetas en lugar de carpetas de correo o el agrupar los mensajes que pertenecen a la misma discusión pero es mas cómodo usar un cliente de correo, la verdad.

En teoría Google añadirá POP3 a Gmail dentro de un tiempo pero mientras tenemos varias opciones aunque no estoy seguro de que no violen los términos del contrato:

"You also agree that you will not use any robot, spider, other automated device, or manual process to monitor or copy any content from the Service."

La primera opción es GTray, creado por Elias Torres, un notificador de correo entrante que se sitúa en bandeja de sistema. La segunda opción, algo mas elaborada ya que nos permite leer y escribir correo desde cualquier cliente que soporte POP3 y SMTP y también actúa como notificador, es PGtGM o Pop Goes the Gmail.

Para Hotmail y Yahoo existen programas similares: Hotmail Popper y YPOPs! respectivamente.

Actualización: Parece ser que PGtGM tiene problemas si se inicia mientras esta corriendo otra aplicación que use los puertos 25 (SMTP) y 110 (POP3) como Hotmail Popper. Basta con cambiar los puertos por defecto a por ejemplo 26 y 111 de forma que ambos programas no se entorpezcan.

Beatallica: The Beatles Meet Metallica

Navegando sin rumbo por la red (mientras debiera estar estudiando) he encontrado además de un blog que tiene buena pinta una pareja de fanáticos musicales que se dedica a versionar canciones de los Beatles como si de Metallica se tratara bajo el curioso nombre de Beatallica.

Hasta el momento ya han sacado dos EPs, A Garage Dayz Nite y Beatallica, que pueden ser descargados desde su web vía bit torrent o descarga directa.

La verdad es que es muy buen material, muy recomendable para fans de los Beatles o Metallica. Solo basta decir que los propios miembros de Metallica han dado muy buenas críticas del proyecto :)

martes, junio 15, 2004

La insoportable levedad de los temas de Firefox

Hace unas horas desde que Mozilla Update esta funcionando y ya se han descargado 56.147 temas nuevos desde esa página, sin añadir todas las descargas que se habrán hecho desde las páginas respectivas de cada tema.

Podríamos sacar como conclusión, quizás precipitadamente, es solo una opinión, que a la gente no le gusta el nuevo tema de Firefox, Winstripe. Y parece evidente que es así después del revuelo que se montó en los foros de Mozillazine respecto al asunto, tachando a Ben Gooder poco menos que de fascista por no tomar en cuenta la opinión de los usuarios.

Desde luego me parece vergonzoso el que cualquier personajillo se dedique a insultar a este señor que ha creado junto con todo el equipo de Firefox un navegador cojonudo. Eso si, yo también pienso que el nuevo tema le da cierto regustillo a programa shareware a Firefox (al menos en comparación con preciosidades como Crystal o Nautical), en el sentido de que estos programas no suelen tener un diseño muy logrado.

El simple hecho de que no les guste el diseño tirará para atrás a más de un usuario potencial a la hora de probar Firefox. Por eso lo más adecuado, al menos a mi entender, habría sido simplemente fijarse en los gustos estéticos del usuario final, porque Ben Gooder puede ser un genio en ideas sobre software o un gran programador (y de hecho remitiéndonos a las pruebas, lo es, y muy bueno), pero un programa se tiene que diseñar pensando en el usuario. Es una de las reglas básicas.

Ahora que esta operativa Mozilla Update podrían echar un ojo a los números y comprobar que la gente huye despavorida del nuevo tema y que los temas preferidos por la mayoría son Noia (KDE Power :) ) con 16114 descargas, Charamel con 12149 y... ¡sorpresa sorpresa! el antiguo tema por defecto, Qute, con 9290 descargas.

Es evidente que estas estadísticas no son las mas fiables del mundo, sobre todo porque no sabemos el número de personas que habrían elegido Winstripe en comparación con estas alternativas. Pero como valoración subjetiva la verdad es que pienso que muy pocos habrían elegido Winstripe como tema para Firefox de entre los temas disponibles en Mozilla Update.

Soy un alegre 'propietario' de una cuenta de Gmail

Es costumbre desde hace un tiempo (más concretamente desde que a google se le ocurrió la idea de dejar probar orkut y gmail solo por invitación) el encontrar entradas en los blogs de alegría y castañuelas por formar parte al fin del grupo de los gmaileros.

Bien, pues al fin me toca a mi, y ya era hora porque me sentía un poco marginado. El alma caritativa que me ha pasado la invitación ha sido Ferdy, de La Hora de la Libertad. ¡Thx Ferdy! ahora ya soy una persona totalmente realizada :P

Btw, si un día de estos me aburro ya escribiré una review.