Too Cool for Internet Explorer

I hate PHP 0

Hora y Fecha: Noviembre 29, 2007 @ 11:45 pm Autor: Moisés Maciá
Categorías:
228 views

Un poquito de rant gracioso en formato twittero.



Señor, que navegadores… 3

Hora y Fecha: Noviembre 23, 2007 @ 12:39 am Autor: Moisés Maciá
Categorías:
188 views

- Te voy a borrar!.
- No puedes, estoy integrado en el sistema operativo.

Enjuto Mojamuto for president!



“Time Machine” para cualquier UNIX 4

Hora y Fecha: Noviembre 15, 2007 @ 12:13 am Autor: Moisés Maciá
Categorías:
297 views

El Time Machine del nuevo Leopard mola, y no lo digo por el interfaz 3D/peliculero (que también mola), sino por la comodidad de tener copias de seguridad de forma automática sin esfuerzo.

Yo quería tener algo similar en Linux pero sin tener que pelarme el culo instalando un servidor de backups por todo lo alto como Amanda o Bacula, así que buscando buscando he encontrado el Time Machine de los pobres, con idéntica funcionalidad pero sin los efectos especiales y que sirve para cualquier SO de la familia de los UNIX.



Cómo usar autoload en varios componentes simultáneamente 1

Hora y Fecha: Noviembre 14, 2007 @ 2:36 am Autor: Moisés Maciá
Categorías:
266 views

Autoload es uno de los llamados métodos mágicos de PHP que se dispara “mágicamente” cuando, al instanciar una clase, el interprete no es capaz de localizarla porque no se ha hecho el include/require del archivo correspondiente. Con autoload podemos sobrecargar esta funcionalidad y especificarle a PHP donde debe buscar sin tener que indicar explicita mente todos los archivos de clases de nuestro proyecto mediante include/require.

El problema viene cuando nuestro proyecto utiliza su propio autoload y un componente de un tercero utiliza otro autoload completamente diferente: sólo puede haber un punto para interceptar la llamada “autoload” e inevitablemente colisionan.

Afortunadamente la SPL proporciona un mecanismo para apilar métodos autoload, tantos como sean necesarios, y evitar las colisiones. Veamos un ejemplo:

  1. class Component1
  2. {
  3.     public function __construct( $foo )
  4.     {
  5.         echo $foo;
  6.     }
  7. }
  8.  
  9. function __autoload ( $class_name )
  10. {
  11.     if ( !exist_class($class_name) )
  12.     {
  13.         $f = dirname(__FILE__) . ‘/component1/lib/’ . $class_name . ‘.php’;
  14.         if ( file_exists($f) )
  15.         {
  16.             require ($f);
  17.         }
  18.         else
  19.         {
  20.             throw new Exception(‘Unnable to find class ‘ . $class_name . ‘!’, 0);
  21.         }
  22.     }
  23. }
  1. class Component2
  2. {
  3.     public function __construct( $bar )
  4.     {
  5.         echo $bar;
  6.     }
  7. }
  8.  
  9. function __autoload ( $class_name )
  10. {
  11.     if ( !exist_class($class_name) )
  12.     {
  13.         $f = dirname(__FILE__) . ‘/component2/lib/’ . $class_name . ‘.php’;
  14.         if ( file_exists($f) )
  15.         {
  16.             require ($f);
  17.         }
  18.         else
  19.         {
  20.             throw new Exception(‘Unnable to find class ‘ . $class_name . ‘!’, 0);
  21.         }
  22.     }
  23. }

Las clases Component1 y Component2 tienen dos funciones __autoload() diferentes.

  1. include ‘./Component1.php’;
  2. include ‘./Component2.php’;
  3.  
  4. $c1 = new Component1_Lib(); // error!!

Los dos callbacks autoload colisionan.

Utizando SPL podemos detectar si ya hay un callback autoload definido para sobreescribirlo, o apilar el nuestro. Además la función autoload puede meterse como metodo de una clase y mejorar un poco el aspecto del codigo:

  1.  
  2. class Component1
  3. {
  4.     public function __construct( $foo )
  5.     {
  6.         echo $foo;
  7.     }
  8.    
  9.     public function autoload( $class_name )
  10.     {
  11.         if ( !exist_class($class_name) )
  12.         {
  13.             $f = dirname(__FILE__) . ‘/component1/lib/’ . $class_name . ‘.php’;
  14.             if ( file_exists($f) )
  15.             {
  16.                 require ($f);
  17.             }
  18.             else
  19.             {
  20.                 throw new Exception(‘Unnable to find class ‘ . $class_name . ‘!’, 0);
  21.             }
  22.         }
  23.     }
  24. }
  25.  
  26.  
  27. $callbacks = spl_autoload_functions();
  28. // no autoload callbacks in stack
  29. if ( $callbacks === false )
  30. {
  31.     spl_autoload_register( array(‘Component1′, ‘autoload’) );
  32. }
  33. else
  34. {
  35.     // unregister existing callbacks
  36.     foreach ( $callbacks as $callback )
  37.     {
  38.         spl_autoload_unregister($callback);
  39.     }
  40.  
  41.     // register custom callback
  42.     spl_autoload_register( array(‘Component1′, ‘autoload’) );
  43.  
  44.     // re-register old ones
  45.     foreach ( $callbacks as $callback )
  46.     {
  47.         spl_autoload_register($callback);
  48.     }
  49. }
  50.  

Cuidado porque la función autoload no es demasiado liviana y un uso abusivo puede provocar una bajada de rendimiento en el programa, pero de momento y hasta la versión 5.3, sin espacios de nombres en PHP no podemos hacer gran cosa :(



Automatizando la creación de paquetes Phar con Phing 1

Hora y Fecha: @ 12:39 am Autor: Moisés Maciá
Categorías:
232 views

Os dejo un task para Phing que programé para crear automáticamente paquetes Phar en PHP. Como no hay demasiada documentación sobre cómo extender Phing y crear nuevas tareas, os puede servir de guía para implementar las vuestras porque la verdad es que yo programé esta casi a ciegas.

La tarea: PHPArchiveTask

Y aquí el ejemplo de uso del XML del build.xml correspondiente:

<project name=“builder” default=“package”>
	<!– custom tasks –>
	<taskdef name=“phar” classname=“phing.task.PHPArchiveTask” />
	
	<!– custom properties –>
	<property name=“phar.version” value=“1″ />
	<property name=“dist.dir” value=“./dist” />
	<property name=“src.dir” value=“./src” />
	
	
	<target name=“package”>
		<echo msg=“Building package …” />
		<phar
			version=“${phar.version}” 
			bootstrap=“lib/phar-bootstrap.php” 
			gzip=“true” 
			output=“{dist.dir}/packages/myFirstPharPackage${phar.version}.phar” 
			stub=“{src.dir}/phar-stub.php”>
	
			<fileset dir=“{src.dir}”>
				<include name=“classes/**/*.php” />
			</fileset>
		</phar>
	</target>

</project>

Deberéis colocar la tarea en la ruta phing/task/PHPArchiveTask.php a partir del lugar donde esté el build.xml, tal y como indica el espacio de nombres (de esos espacios de nombres de mentira que hay en PHP…). El resto de opciones creo que están bastante claras.



Menos iPhone y más Android 2

Hora y Fecha: Noviembre 13, 2007 @ 12:07 am Autor: Moisés Maciá
Categorías:
269 views
Google Android

Hoy ha salido a la luz Android, un SDK para programar dispositivos móviles (smartphones, pdas, etc.) de la mano de Google. Al final no ha sido un teléfono móvil como se rumoreaba desde hace tiempo sino algo mucho mejor.

Está construido enteramente alrededor de Java, lo cual me parece lógico ya que es la plataforma más madura en este sector, pero no utiliza la JVM de Sun para ejecutarse (aunque si para desarrollo); utiliza otra optimizada para dispositivos realmente escasos en recursos llamada Dalvik a la que Google ha pegado un serio tijeretazo.

En general lo poco que he visto me gusta: tiene un API bastante extensa que cubre cosas como los acelerómetros (se llaman así?) estilo Wii, cámaras de vídeo, sonido, vídeo 2D y 3D con OpenGL ES, Bluetooth, WiFi, 3G, etc. Los GUI se diseñan a partir de ficheros XML, SQLite como backend de datos y un kernel de Linux para gobernarlos a todos y atarlos a la GPL donde reina el señor GNU :)

La plataforma de desarrollo elegida ha sido Eclipse aunque dejan bien claro que no es una condición exclusiva. Proporcionan unos scripts para generar el esqueleto del proyecto sin necesidad de tener que comprar 2GB de RAM más para ejecutar Eclipse, los scripts pueden generar un proyecto para intelliJ por ejemplo.

Se puede descargar todo el framework y ejemplos para Linux, Windows y OS X. Además han habilitado una competición de programación con 10 milloncejos de dólares a repartir entre los mejores proyectos presentados.

Esta es la oferta de Google: libertad y transparencia.

Mientras, Apple tiene su iPhone que es bastante bonito pero del que no se puede aprovechar gran cosa en términos de desarrollo, Symbian que cada vez tiene menos relevancia (en parte porque ellos mismos se lo han buscado) y Microsoft con su Windows Mobile que todos los que tengáis un iPaq sabréis lo fantástico y tremendamente compatible que es.

Ahora falta que salgan dispositivos con Android de serie y hacks que permitan exorcizar el Windows Mobile de las iPaq …




Bad Behavior has blocked 322 access attempts in the last 7 days.