sábado 31 de octubre de 2009
Planet CakePHP
A partir de esta semana, los articulos relacionados con CakePHP de este blog serán publicados en la sección en español de Planet CakePHP, junto con otros muchos blogs sobre el tema y en diferentes idiomas.
Schema migrations con Plugins de CakePHP
CakePHP trae incluidas algunas aplicaciones de consola con utilidades varias.
Una de ellas es la utilidad para generar y actualizar Esquemas. Esta utilidad está disponible vía la consola cake ( /PATH/cake/console/cake ).
Con el comando:
generamos un archivo de esquema de la base de datos para todos los modelos definidos en la aplicación. Aquí surge el primer problema, qué es que esta aplicación, en la versión estable 1.2.5 de CakePHP, no tiene en cuenta los modelos de los plugins de la aplicación, por lo cual estos modelos son ignorados. Hay un patch que agrega esta funcionalidad programado para la versión 1.3, pero todavía no existe una versión estable de este release.
La solución preliminar es usar la opción -f del comando, para forzar a crear un esquema para todas las tablas de la base de datos, sin importar si tienen un modelo definido o no:
Con esto solucionado, podemos realizar migraciones de esquemas editando el archivo generado y usando el comando:
Las migraciones de esquemas sirven para mantener versionadas y documentadas las modificaciones a la base de datos, para que, de esta forma, al trabajar en equipos, cuando un desarrollador realiza una modificación al esquema y lo actualiza modificando la estructura de la base de datos, puede distribuir su esquema modificado al resto del equipo para que ellos también actualicen su copia de la base de datos.
El segundo problema que nos enontramos al trabajar usando una arquitectura de plugins, es que la idea de desarrollar un plugin es tener una cierta funcionalidad que se pueda mantener independiente al resto de la aplicación y así agregarla o quitarla a la misma sin mayores inconvenientes. Entonces el mantener un archivo de esquema único para todos los plugins rompe con esta separación de componentes y nos fuerza a mantener actualizado el esquema mientras agregamos o quitamos plugins.
Para poder conservar la independencia de los plugins. he extendido el archivo de esquema básico para que se extienda automáticamente en función de la prescencia de plugins, agregando en los plugins archivos de esquema personalizados con el mismo formato de definición de tablas que los esquemas generados automáticamente.
El primer archivo es el archivo /PATH/app/config/sql/schema.php:
Como ven, es un Schema de CakePHP sin definiciones, con código agregado al final para que cargue todos los archivos de esquema de los plugins, asumiendo su ubicación en /PATH/app/plugin/pluginName/config/sql/schema.php
Este es un archivo schema.php de plugin de ejemplo:
Ahora, podemos definir un schema por cada plugin utilizando esta estructura, y editarlo cuando sea necesario realizar Schema Migrations. Así mismo, la migración de esquemas agregará o eliminará las tablas de la base de datos cuando se agreguen o eliminen, respectivamente, plugins a la aplicación. Todo esto lo realizaremos ejecutando el comando:
Donde Pages es el nombre del schema definido en el Pages plugin. Es necesario nombrar el plugin que estamos actualizando y usar el parámetro -f para que no tenga en cuenta los modelos definidos en la aplicación y los compare con toda la base de datos.
Luego solo queda automatizar la actualización de todos los esquemas a la vez, pero lo dejamos para la próxima...
Una de ellas es la utilidad para generar y actualizar Esquemas. Esta utilidad está disponible vía la consola cake ( /PATH/cake/console/cake ).
Con el comando:
$ cake schema generate
generamos un archivo de esquema de la base de datos para todos los modelos definidos en la aplicación. Aquí surge el primer problema, qué es que esta aplicación, en la versión estable 1.2.5 de CakePHP, no tiene en cuenta los modelos de los plugins de la aplicación, por lo cual estos modelos son ignorados. Hay un patch que agrega esta funcionalidad programado para la versión 1.3, pero todavía no existe una versión estable de este release.
La solución preliminar es usar la opción -f del comando, para forzar a crear un esquema para todas las tablas de la base de datos, sin importar si tienen un modelo definido o no:
$ cake schema generate -f
Con esto solucionado, podemos realizar migraciones de esquemas editando el archivo generado y usando el comando:
$ cake schema run update
Las migraciones de esquemas sirven para mantener versionadas y documentadas las modificaciones a la base de datos, para que, de esta forma, al trabajar en equipos, cuando un desarrollador realiza una modificación al esquema y lo actualiza modificando la estructura de la base de datos, puede distribuir su esquema modificado al resto del equipo para que ellos también actualicen su copia de la base de datos.
El segundo problema que nos enontramos al trabajar usando una arquitectura de plugins, es que la idea de desarrollar un plugin es tener una cierta funcionalidad que se pueda mantener independiente al resto de la aplicación y así agregarla o quitarla a la misma sin mayores inconvenientes. Entonces el mantener un archivo de esquema único para todos los plugins rompe con esta separación de componentes y nos fuerza a mantener actualizado el esquema mientras agregamos o quitamos plugins.
Para poder conservar la independencia de los plugins. he extendido el archivo de esquema básico para que se extienda automáticamente en función de la prescencia de plugins, agregando en los plugins archivos de esquema personalizados con el mismo formato de definición de tablas que los esquemas generados automáticamente.
El primer archivo es el archivo /PATH/app/config/sql/schema.php:
<?php
class AppSchema extends CakeSchema {
var $name = 'App';
function before($event = array()) {
return true;
}
function after($event = array()) {
}
}
/**
* Load plugin schemas...
*/
$path = dirname(dirname(dirname(__FILE__))) . "/plugins";
$dirHandle = opendir($path);
while ($file = readdir($dirHandle)) {
$schemaPath = $path . '/' . $file . '/config/sql/schema.php';
if( is_file($schemaPath) )
{
include_once($schemaPath);
}
}
closedir($dirHandle);
Como ven, es un Schema de CakePHP sin definiciones, con código agregado al final para que cargue todos los archivos de esquema de los plugins, asumiendo su ubicación en /PATH/app/plugin/pluginName/config/sql/schema.php
Este es un archivo schema.php de plugin de ejemplo:
<?php
class PagesSchema extends CakeSchema {
var $name = "Pages";
function before($event = array()) {
return true;
}
function after($event = array()) {
}
var $pages = array('type' => 'integer', 'null' => false, 'default' => NULL, 'key' => 'primary'),
'title' => array('type' => 'string', 'null' => false, 'default' => NULL, 'length' => 150),
'content' => array('type' => 'text', 'null' => false, 'default' => NULL),
'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1))
);
var $categories = array(
'id' => array('type' => 'integer', 'null' => false, 'default' => NULL, 'key' => 'primary'),
'title' => array('type' => 'string', 'null' => false, 'default' => NULL, 'length' => 150),
'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1))
);
}
Ahora, podemos definir un schema por cada plugin utilizando esta estructura, y editarlo cuando sea necesario realizar Schema Migrations. Así mismo, la migración de esquemas agregará o eliminará las tablas de la base de datos cuando se agreguen o eliminen, respectivamente, plugins a la aplicación. Todo esto lo realizaremos ejecutando el comando:
$ cake schema run update Pages -f
Donde Pages es el nombre del schema definido en el Pages plugin. Es necesario nombrar el plugin que estamos actualizando y usar el parámetro -f para que no tenga en cuenta los modelos definidos en la aplicación y los compare con toda la base de datos.
Luego solo queda automatizar la actualización de todos los esquemas a la vez, pero lo dejamos para la próxima...
domingo 20 de septiembre de 2009
Red argentina de Movistar 3G, APESTA!
Hace poco adquirí un modem Huawei 3G USB de Movistar Argentina. Habrán visto en los últimos posts que estuve jugando un poco para hacerlo funcionar.
Hoy el comentario no es sobre el modem en sí, sino sobre la red de Movistar y la falta de decencia de los mismos.
Resulta que el modem 3G me asigna una IP interna del tipo 10.x.x.x, hasta acá nada nuevo, muchos de los cablemodems también asignan al equipo una IP interna y conservan ellos la externa a modo de router. Lo que me entero hoy, es que mi IP pública está COMPARTIDA con otros usuarios. Es decir, estamos todos (no se cuantos ni cómo) en una red interna, compartiendo una única interfaz pública.
Lo que me conlleva al problema de hoy, al intentar descargar algo de RapidShare, me decía que mi IP ya estaba descargando del sitio y que no se podían realizar descargas simultáneas desde la misma IP. WTF?!
Ya me había pasado utilizando eMule, que siempre se me asignaba un ID bajo, debido a que estaba detrás de un firewall... y sí que lo estoy! estoy detras de un router! compartiendo la interfaz de red pública con vaya a saber uno cuántos usuarios más, los cuales voy a intentar contar proximamente haciendo uso de nmap.
En conclusión, la red 3G de Movistar me parece una VERGUENZA y digna de un país involucionado como el nuestro. Pero vamos, que no era tan dificil asignar interfaces diferentes a cada usuario, o al menos, especificar en algún lugar que la configuración era una mierda como esta.
En fin, pago el doble que una conexión cablemodem por una conexión que anda la mitad y que me deja dentro de una red privada que comparte una única interfaz pública y que, cómo no, tiene filtrados varios servicios.
APESTA!
Hoy el comentario no es sobre el modem en sí, sino sobre la red de Movistar y la falta de decencia de los mismos.
Resulta que el modem 3G me asigna una IP interna del tipo 10.x.x.x, hasta acá nada nuevo, muchos de los cablemodems también asignan al equipo una IP interna y conservan ellos la externa a modo de router. Lo que me entero hoy, es que mi IP pública está COMPARTIDA con otros usuarios. Es decir, estamos todos (no se cuantos ni cómo) en una red interna, compartiendo una única interfaz pública.
Lo que me conlleva al problema de hoy, al intentar descargar algo de RapidShare, me decía que mi IP ya estaba descargando del sitio y que no se podían realizar descargas simultáneas desde la misma IP. WTF?!
Ya me había pasado utilizando eMule, que siempre se me asignaba un ID bajo, debido a que estaba detrás de un firewall... y sí que lo estoy! estoy detras de un router! compartiendo la interfaz de red pública con vaya a saber uno cuántos usuarios más, los cuales voy a intentar contar proximamente haciendo uso de nmap.
En conclusión, la red 3G de Movistar me parece una VERGUENZA y digna de un país involucionado como el nuestro. Pero vamos, que no era tan dificil asignar interfaces diferentes a cada usuario, o al menos, especificar en algún lugar que la configuración era una mierda como esta.
En fin, pago el doble que una conexión cablemodem por una conexión que anda la mitad y que me deja dentro de una red privada que comparte una única interfaz pública y que, cómo no, tiene filtrados varios servicios.
APESTA!
jueves 13 de agosto de 2009
Modem USB 3G Huawei E176 en Ubuntu 9.04
Ayer me encontré con la grata sorpresa de que Ubuntu 9.04 reconoce automágicamente el modem 3G de Huawei modelo E76 USB stick. No así, la versión 8.04 que tenía instalada antes de empezar a hacer pruebas.
Tampoco OpenSolaris 2009.06 lo ha reconocido, asi que la instalación de OpenSolaris tendrá que esperar un tiempo más hasta saber como hacer funcionar este dispositivo.
Por lo pronto, si uds., como yo, estaban googleando buscando la compatibilidad de este modem con Ubuntu Linux, ya les confirmo que pueden instalar sin problemas, que apenas conecten el modem al puerto USB, se les abrirá el configurador de conexión a internet móvil del applet NetworkManager de Gnome para usarlo al instante.
Tampoco OpenSolaris 2009.06 lo ha reconocido, asi que la instalación de OpenSolaris tendrá que esperar un tiempo más hasta saber como hacer funcionar este dispositivo.
Por lo pronto, si uds., como yo, estaban googleando buscando la compatibilidad de este modem con Ubuntu Linux, ya les confirmo que pueden instalar sin problemas, que apenas conecten el modem al puerto USB, se les abrirá el configurador de conexión a internet móvil del applet NetworkManager de Gnome para usarlo al instante.
martes 11 de agosto de 2009
Nuevo motor de Google
Parece ser que ya hace un tiempo, Google tiene un equipo de desarrolladores trabajando en un nuevo motor de búsqueda para su principal producto, el buscador Google.
Ayer han anunciado que ya se pueden ir probando los resultados del trabajo de este equipo en la siguiente URL: http://www2.sandbox.google.com/
A simple vista no hay cambios, debido a que la interfaz sigue siendo la misma, sin embargo, cuando realicemos una búsqueda aquí, estaremos utilizando el nuevo motor de busqueda, lo cual supone un cambio en los resultados con respecto a una búsqueda realizada en http://www.google.com.
Ayer han anunciado que ya se pueden ir probando los resultados del trabajo de este equipo en la siguiente URL: http://www2.sandbox.google.com/
A simple vista no hay cambios, debido a que la interfaz sigue siendo la misma, sin embargo, cuando realicemos una búsqueda aquí, estaremos utilizando el nuevo motor de busqueda, lo cual supone un cambio en los resultados con respecto a una búsqueda realizada en http://www.google.com.
jueves 6 de agosto de 2009
Twitter DOS
Suscribirse a:
Entradas (Atom)