Una semana en Mac

Hace 3 semanas encargué un MacBook Pro de 13″. Lo cierto es que por poco no lo hago, ya que no aceptaban mi tarjeta ¿? y tuve que hacerles una transferencia. Hace ya siete días que me llegó. Algunos me dijeron que “Es una semana de dolor”, como Álex, mientras que otros dijeron que “Es una tarde de dolor”, como Jaime. En mi caso creo que se ha tratado de una semana.

La curva de aprendizaje es más bien rápida, y se respira mucho aquello de que en Unix todo son ficheros :) Por ejemplo, los “accesos directos” a las aplicaciones son realmente directorios dentro del directorio /Applications. ¡Qué elegante! Sin embargo, ha habido muchas cositas a las que no me hacía en un primer momento.

Ratón

El touchpad es una verdadera pasada. No tiene botones, pues puedes pulsar en (casi) todo el Touchad, y por defecto está desactivado el clic sencillo tocándolo. Pero la verdadera pasada es lo grande que es, y la cantidad de cosas que se pueden hacer con él. Por ejemplo, un toque con dos dedos despliega el menú contextual (Como el clic derecho). Arrastrando dos dedos puedes moverte de arriba a abajo o de izquierda a derecha. Acercando o alejando los dedos puedes hacer zoom in o zoom out respectivamente. Hay acciones también para 3 y para 4 dedos. Realmente útil.

Teclado

Ésto es lo que más me está costando. En concreto:

  • La tecla Alt derecha no está inmediatamente después del espacio, sino que hay una tecla Cmd entre medias. A veces me pierdo.
  • No existen teclas de “Av Pag”, “Reg Pag”, “Inicio”, “Fin”, “Ins” o “Supr”. ¿Cómo lo hacemos entonces?
    • Av Pag – “fn + flecha_abajo”
    • Ret Pag – “fn + flecha_arriba”
    • Ins – Jamás la he usado, no sé cómo emularlo.
    • Supr – “fn + retroceso”
    • Inicio – “ctrl + a”
    • Fin – ¿?
  • Navegación por formularios y diálogos. Simplemente la tecla Tab no funciona. No accede a los botones, ni a los checkbox, ni a los radios… Afortundamente desde las preferencias del teclado se puede “corregir” este comportamiento.
  • Acceso a la barra de menú. En Linux si pulsas la tecla Alt, accedes al menú, y dispones de atajos con Alt + <letra subrayada> de cada item del menú. En OSX esta opción estaba “escondida”: Para acceder a la barra de menú con el teclado se debe pulsar ctrl+F2, y después movernos bien con las flechas, bien mediante autocompletado. Curioso.

Navegador de ficheros

El Finder… Bueno, no está mal. Pero se me hacen raras bastantes cosas, como por ejemplo que no se pueda navegar por el disco duro real (Te muestra sólo algunas carpetas amablemente renombradas al castellano), o como su manejo (Para acceder a una carpeta no funciona “Intro”. Debes usar Alt+Flecha_Abajo.

Echo de menos también una barra de direcciones multiprotocolo, así como soporte para SFTP por defecto. Por lo pronto he recurrido a macfuse. Evidentemente noslomismo… Lo suyo es desde el propio navegador de ficheros poder acceder por defecto a servidores SFTP almacenando la contraseña en el llavero.

En general, una pasada

Es una pasada de ordenador por muchas razones:

  1. Tienes shell Bash :D
  2. La instalación de aplicaciones se sencillísima.
  3. En términos generales creo que la curva de aprendizaje es más baja que en otros SO.
  4. Por supuesto, que es un UNIX.
  5. La pantalla se ve nítida desde casi cualquier ángulo.
  6. El touchpad es una pasada.
  7. Es tremendamente intuitivo. Haciendo “lo que te pide el cuerpo” llegas a las soluciones.
  8. Y por supuesto, va de tiro.

En defensa de los derechos fundamentales en Internet

Ante la inclusión en el Anteproyecto de Ley de Economía sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de internet manifestamos nuestra firme oposición al proyecto, y declaramos que:

  1. Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión.
  2. La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web.
  3. La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional.
  4. La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural. Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes.
  5. Los autores, como todos los trabajadores, tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo.
  6. Consideramos que las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir.
  7. Internet debe funcionar de forma libre y sin interferencias políticas auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre.
  8. Exigimos que el Gobierno garantice por ley la neutralidad de la Red, en España ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro.
  9. Proponemos una verdadera reforma del derecho de propiedad intelectual orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras.
  10. En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia.

Este manifiesto, elaborado de forma conjunta por varios autores, es de todos y de ninguno. Se ha publicado en multitud de sitios web. Si estás de acuerdo y quieres sumarte a él, difúndelo por Internet.

El test de Joel adaptado al desarrollo web

Leyendo blogs, me encuentro con este artículo que trata sobre una revisión del sencillo test de Joel Spolsky sobre la calidad del software. Esta nueva revisión, de la mano de Brandon Savage, propone 12 pasos adaptados al desarrollo web hoy día. Los pasos se responden con un sí o un no. Estos son los posibles resultados:

  • 12 síes. Perfecto.
  • 11 síes. Aceptable.
  • 10 o menos síes. Tienes un serio problema.

Ahora veamos las preguntas:

  1. ¿Usas algún sistema de control de versiones?
  2. ¿Puedes generar fichero para distribuir tu software en sólo un paso?
  3. ¿Usas integración continua?
  4. ¿Guardas un registro de bugs?
  5. ¿Corriges los bugs tras escribir nuevo código?
  6. ¿Cumples los hitos a tiempo?
  7. ¿Documentas las especificaciones?
  8. ¿Disfrutan tus programadores de un entorno de trabajo tranquilo?
  9. ¿Usas las mejores herramientas, y gastas dinero en aquéllas que son necesarias y caras?
  10. ¿Escribes test unitarios?
  11. ¿Tus nuevos candidatos demuestran sus conocimientos de programación con alguna prueba tangible durante la entrevista?
  12. ¿Tienes testers?

En mayor o menor medida, todas me parecen propuestas muy acertadas. No deja de ser una curiosidad más, pero posiblemente este “juego” sea una métrica de calidad de software equiparable a otros sistmas varios órdenes de magnitud más complejos.

Por cierto, yo obtengo un 6 sobre 11 (La pregunta número 11 no se aplica en mi caso).

Mejora progresiva

De un tiempo a ahora, cada vez leo con más frecuencia el término progressive enhancement, o en catellano, mejora progresiva. ¿Qué es exactamente? Como desarrolladores web, debemos lidiar con numerosos navegadores, cada uno con una serie de prestaciones y recursos. Como veremos a continuación, normalmente hay 4 formas de abordar esta situación:

  1. Impedir el acceso a determinados navegadores. Creedme, existen páginas a las que no se puede acceder con según qué navegadores. No me refiero a que se muestren defectuosas, es que directamente te muestran un mensaje de error. Tratad de acceder a una página de El Plural cambiando el user-agent de vuestro navegador y sabréis a qué me refiero. Ésta es una pésima solución.
  2. Quedarnos en el mínimo común denominador. Esto es, diseñar la página de modo que sólo contenga recursos disponibles por todos los navegadores. No es una solución muy escalable, puesto que se está limitando a las funcionalidades mínimas (Funcionalidades que, por otro lado, normalmente se corresponden con las de nuestro querido IE6). Visto con un enfoque más visual, esto significa que la manada debe ir a la velocidad del más lento. Por ejemplo, querémos posicionar un <div> de forma ‘fixed’. IE6 no lo permite, de modo que, o no lo hacemos, o dedicamos esfuerzos en buscar retorcidos hacks para lograrlo en este navegador. Mmmm no me gusta. ¿Qué más hay?
  3. Graceful degradation. Durante mucho tiempo ésta ha sido la tendencia reinante, y seguramente seguirá siéndolo. Consiste en partir del máximo de prestaciones de forma que, a medida que se usen navegadores menos avanzados, la página se mantenga usable con pequeños defectos. Un ejemplo perfecto es el uso de imágenes PNG con semitransparencias: Mientras que los usuarios de Firefox o Safari las verán sin problemas, los de IE6 se encontrarán con imágenes corruptas. En estos casos es frecuente dividir la página en dos niveles: El nivel 1 corresponde a una buena experiencia para el usuario, el nivel 2 con una versión degradada de la página. Encontramos un ejemplo en el servicio de correo de Google Gmail, con su versión avanzada (Por defecto) y una versión básica.
  4. Mejora progresiva. Y al fin llegamos a la mejora progresiva. ¿En qué consiste? Es exactamente igual que graceful degradation pero al revés. En lugar de partir de una versión avanzada, se parte de la versión mínima, de forma que, a medida que un navegador ofrece mejores recursos, la página también se ve mejorada. En este caso, se parte de un mínimo razonable, por ejemplo, que sea compatible con HTML 4. Podría, por ejemplo, usarse transparencias en GIF, y sin embargo, en aquéllos navegadores que sí lo soporten, semitransparencias en PNG.

Lógicamente las dos mejores soluciones son las dos últimas. ¿Cuál es mejor? Realmente depende del caso. Pero como método general yo prefiero la mejora progresiva, pues a diferencia de graceful degradation parte de una experiencia de usuario razonablemente buena. Además, con esto siempre ganaremos en accesibilidad.

Si bien cada día existen más navegadores con sus respectivas versiones, también es cierto que disponemos cada vez más de recursos que nos permiten abstraernos de ellos, como los numerosos frameworks javascript como jquery o mootools, además de brillantes soluciones como Google Chrome Frame.

Más información:

Rescatados artículos antiguos

Hoy me he decidido a rescatar numerosos artículos de otros blogs que tuve y que ya había perdido. ¡Suerte que existe archive.org! Es casi un año de artículos (Son pocos, sólo 22). Realmente tuve un parón de dos años, entre junio de 2006, y junio de 2008, fecha en que comencé a escribir de nuevo con este blog. Por si alguien quiere saber cuáles son, los enumero al final del post.

De paso, aprovecho también para rescatar otro artículo. Este no es mio, pero sí es sobre mí. Se escribió el 11 de julio de 2007:

Cinco horas con Zunzu

Zunzu tiene la tez cerúlea, demacrada de hombre estudioso y largas barbas. Meteorólogo en potencia habla del tiempo día si, día también. Es aficionado a los pimientos de piquillo en lata, y asco, lo que se dice asco, no se lo tiene a nada, estómago sin fondo le llaman.Noctámbulo de nacimiento argumenta haber divisado un meteorito en su más tierna infancia, la cuál se vio truncada por un ligero golpe en la cabeza cuando se disponía a deslizarse por un tobogán, a partir de este momento zunzu perdió parte de sus capacidades intelectuales y en la actualidad se auto compadece de sí mismo.

Viajó al extranjero en repetidas ocasiones, pero nunca decidió quedarse ya que lo que realmente le fascina a zunzu es el llamado “Valle del Tiétar”, al sur de la cordillera de Gredos.

Perteneciente al grupo de robótica de la que fue su universidad, ganó numerosos diplomas y ejerció de empleado en el McDonal´s compartiendo intimidad con algunas locas, hecho que marcó a zunzu en su pulcritud y aseo personal.

Personaje singular donde se haya visto, tierno, inocente, cándido, algo aniñado y juguetón, no deja indiferente a nadie por lo que cinco horas son pocas horas para conversar con este trepidante (como el trivial) pez globo, de mofletes sonrosados y nariz algo aguileña.

¡Gracias Zunza! :D

Lista de posts rescatados

FirePHP – Integra logs de PHP en Firefox

En todo desarrollo se hacen necesarias herramientas que permitan hacer un seguimiento del código. Hoy voy a mostrar cómo mostrar logs desde PHP directamente a una consola en Firefox. ¡Di adiós a los “echos” y a los “var_dump”!

En primer lugar, debemos tener instalada la extensión Firebug. Por si no lo conocéis, es uno de los plugins más instalados de Firefox y nos es útil para numerosas tareas:

  • Inspeccionar el árbol DOM y HTML.
  • Modificar CSS al vuelo.
  • Monitorizar actividades en la red (¿Qué hace que tarde tanto en cargar mi página?)
  • Depurar código JavaScript.
  • Consola JavaScript
  • Y mucho más (En serio).

Una vez instalado Firebug, toca instalar otra nueva extensión. Se trata de FirePHP. Para que funcione, es necesario tener en Firebug activadas las pestañas de Red y de Consola. De momento está siendo fácil, ¿verdad? Pues ya no nos queda nada :)

Ahora que tenemos el cliente listo, sólo nos queda activarlo en el servidor. Al ser un sistema muy popular, la mayoría de los frameworks traen integradas de serie las bibliotecas necesarias, pero también se pueden usar las bibliotecas nativas si nuestro proyecto no utiliza ningún framework.

En este mini howto voy a mostrar cómo hacerlo funcionar con Zend Framework (Ver casos de uso con la biblioteca genérica).

FirePHP en Zend Framework

Lo primero es inicializar el sistema de logs en el fichero bootstrap:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

   ...

   protected function _initLogging()
   {
      $this->bootstrap('frontController');
      $logger = new Zend_Log();

      $writer = 'production' == $this->getEnvironment() ?
         new Zend_Log_Writer_Stream(APPLICATION_PATH .
            '/../data/logs/app.log') :
         new Zend_Log_Writer_Firebug();

      $logger->addWriter($writer);

      if ('production' == $this->getEnvironment()) {
         $filter = new Zend_Log_Filter_Priority( Zend_Log::CRIT);
         $logger->addFilter($filter);
      }

      $this->_logger = $logger;
      Zend_Registry::set('log', $logger);
   }
   ...
}

Veamos paso a paso lo que hemos hecho:

  1. Nos aseguramos de que el frontController está inicializado.
  2. Creamos una nueva instancia de la clase Zend_Log.
  3. Por seguridad, si estamos en un entorno de producción, el registro de logs se volcará en el fichero data/logs/app.log. En caso contrario, se mostrará mediante Firebug. Existen muchas más clases que heredan de Zend_Log_Writer_Abstract, como por ejemplo para mandar por correo electrónico, o almacenar en base de datos.
  4. De nuevo, si estamos en un entorno de producción filtramos las alertas a aquéllas que sean, por lo menos, críticas. Existen hasta 7 niveles de prioridad.
  5. Establecemos el atributo $this->_logger.
  6. Guardamos una referencia de $logger en el registro, de modo que éste esté accesible para toda la aplicación.

Bueno ahora está ya todo listo. Nuestro servidor sabe cómo adjuntar estos logs, y nuestro cliente sabe cómo interpretarlos. ¿Qué nos queda? Pues un hola mundo :) Por ejemplo, modifiquemos el método _initLogging() para añadir una nueva línea al final del mismo:

$this->_logger->info('Bootstrap ' . __METHOD__);

Ahora sí que sí. Ya está todo listo. Accedamos a la página, abramos Firebug con las pestañas de consola y de red activadas, y con FirePHP también activado y veamos la magia:

Captura del resultado en Firebug

Captura del resultado en Firebug

Una maravilla que nos permitirá hacer un seguimiento de qué ocurre en cada petición a nuestra página web.

¿Pero cómo funciona todo esto? Fácil: Toda esta información se adjunta en forma de cabeceras HTTP, de modo que nunca interferirán en el cuerpo de la petición. Puedes usarlo por tanto en llamadas AJAX, ficheros binarios como imágenes, etc.

¡Pero espera, que aún hay más!

Profiling de bases de datos

Zend Framework te permite hacer profiling de la base de datos. Por si no sabes qué es esto, es un análisis del comportamiento de una aplicación cuyo objetivo normalmente es optimizar la ejecución. En este caso, podremos conocer cuáles son todas las consultas a base de datos que se han ejecutado, y cuánto tiempo han llevado. ¿Y cómo lo hacemos? Crearemos un nuevo método en el fichero bootstrap:

protected function _initDbProfiler()
{
   if ('production' !== $this->getEnvironment()) {
      $this->bootstrap('db');
      $profiler = new Zend_Db_Profiler_Firebug('All DB Queries');
      $profiler->setEnabled(true);
      $this->getPluginResource('db')
         ->getDbAdapter()
         ->setProfiler($profiler);
      }
 }

En este caso, si la instancia de la aplicación no está en producción, realizaremos lo siguiente:

  1. Iniciamos la base de datos.
  2. Creamos una instancia del profiler especializado de Firebug pasándole como parámetro su etiqueta.
  3. Activamos el objeto profiler.
  4. Y finalmente, activamos el profiling en la base de datos por defecto.

Ahora ya puedes inspeccionar las consultas que hace tu aplicación, minimizar las llamadas, y solucionar cuellos de botella :)