Autobahn: una abstracción para bases de datos

Un proyecto que ya tenía en mente desde hace un buen tiempo, era hacer un nano-framework. CakePHP es muy bueno, pero a veces es simplemente demasiado para lo que paga el cliente. El punto es que nunca llegué a nada concreto y Armando se me adelanto espectacularmente con Microbus :D

Microbus es mucho mejor de lo que yo tenía en mente, así que prefiero meterle mano a este que reescribir la rueda -como si no fuera suficiente. El único detalle es que le faltaba un modelo de base de datos. Autobahn fue el resultado que por algunas razones, no pude liberar antes. Falta mucho todavía, pero así es como funciona:

require('lib/autobahn.php');
 
$library = Autobahn::getConnection('default');
 
//	Classic SQL
$authors = $library->query('SELECT Author.id, Author.firstname FROM authors Author');	
 
//	Find (like Select)
$book	  = $library->findBooksById(1);
$books	  = $library->findAllBooks();
$favorites = $library->findAllBooksById(1,2,3,4,5);
 
//	Insert
$newBook = array('id' => null, 'author_id' => 12, 'title' => 'Frameworks for PHP');
$library->insertBooks($newBook);
 
//	Update
$values = array('title' => 'Frameworks for PHP 5', 'description' => '...');
$conditions = array('id' => 10);
$library->updateBooks($values, $conditions);
 
//	Delete
$library->deleteBooksById(10,11,12);
 
//	Show stats of all queries :) ... only for CLI mode, for now.
$library->showLogs();

Lo que sigue es mejorar el generador de consultas, el cual está mal hecho y repartido entre el objeto que abstrae MySQL y el objeto abstracto administrador. Una parte del generador se hace en el objeto abstracto y eso está mal, según mi teoría. SQL debería ser un estándar universal -como el HTML/CSS, ja- pero en la práctica no lo es del todo, siempre hay mínimas diferencias y debo de cuidar este hecho.

Una vez hecho lo anterior, el siguiente paso es diseñar el modelo padre, del cual se van a instanciar los modelos creados para la aplicación. Aquí seré cuidadoso, porque podría cometer el error de crecer demasiado el código, cuando la idea es mantenerlo corto y simple. El objetivo a lograr sería que pudiera manejar la base de datos de la siguiente manera:

require('lib/autobahn.php');
require('model/book.php');
 
$book = new Book();
$book->author_id = 12;
$book->title = 'Frameworks for PHP';
$book->save();
 
$book->showLogs();

Entre algunas otras ideas por ahí que rondan mi cabeza, esto es más o menos el resultado final que me gustaría. Pero siempre con el propósito de hacerlo corto y simple, por eficiencia y portabilidad principalmente. Ojalá a alguien le sirva :)

El contenido está antes que el diseño

Contenido precede al diseño. Diseño en la ausencia de contenido no es diseño, es decoración.

Jeffrey Zeldman

Evidente para algunos de nosotros, ridículo para la gran mayoría de las personas e incluso diseñadores. La frase me recuerda aquella vez cuando el diseñador de Google renunció por que “le pedían justificar cada píxel que movía”, y más de un diseñador conocido se ofendió. Una pena.

Herramienta c99 para Newbies

“La seguridad de un sistema, es tan fuerte como la de su eslabón más débil.”

Esta herramienta fue la que nos colaron y con la que nos hicieron travesuras en año nuevo. La subo por que merece la pena instalarla en los servidores de cada uno y ver que tanto daño puede hacer o que tan inseguro es nuestro servidor.

La pueden descargar -junto con otras- de aquí: c99

La herramienta se llama ajnnk.php, que aparentemente es el seudónimo de quien nos la dejó, estaba encriptada pero igual subí una versión legible para que se pueda analizar, con fines educativos obviamente :P Básicamente, son una recopilación de comandos y pequeños algoritmos en PHP que te permiten explorar y atacar el sistema donde está instalado. Es una herramienta para newbies, pero algunos de los errores que cometimos fueron bastante ridículos. El consuelo es que así se aprende.

Oídos sordos, dedos lastimados y bugs de Wordpress

Wordpress 2.9 tiene esta pequeña lista de bugs. Entre los que se encuentran, un fallo crítico en el componente Cron para los posts a futuro y del que me habían avisado los chicos de IndieWeblogs. Pues nada que, debido a los recientes eventos la paranoia nos volvió por un momento, pero por suerte esta ves fue lo cotidiano.

El video es para festejarme que despues de muchísimo sin tocar, pude sacar al fin esa linda canción de mi banda favorita estos días The Fall of Troy, llamada Caught up. Dice mi hermano que es de las pocas bandas -relativamente- nuevas que, manteniendo su estilo, puede hacer blues. Estoy de acuerdo, aparte de Dragonforce no conozco otra banda que toque en esa hermosa escala -y sin hacerlo a 10,000 notas por segundo.

¡Feliz año nuevo 2010!

Así es como pasé año nuevo. Feliz año musulmanes extremistas de Arabia Saudí. Resulta que la suma de muchas cosas (falta de mantenimiento en el servidor, permisos 777 por todos lados y así), logró que un par de mocosos hijos de Alá pudieran inyectar html en algunos archivos de nuestros blogs vía cPanel y Wordpress. Note usted que en el momento de la foto, Arturo me mandaba sus deseos de año nuevo vía la consola :D

Aparentemente no tuvieron mayor acceso salvo la inyección del texto a determinados archivos, las bases de datos están a salvo y la mayoría de los errores de seguridad ya están cerrados, pero aún sigo con la paranoia por los errores que quizás no he detectado. Nos atacaron por un bug de cPanel y después por el plugin de Facebook Connect y Wordpress, pero creo que ya dejé todo un poco más seguro.

¡Feliz año nuevo!

Que puedo decir. Fue un año muy difícil para WEM, Otháner ya dijo algunas cosas al respecto. Las montañas rusas emocionales y financieras del 2009 parecían interminables, pero aquí estamos, motivados y listos para el 2010 :D

Afortunadamente en WEM siempre he contado con los #wemmers, con Otháner sobre todo para tomar decisiones y para visitar clientes. Soy un terrible vendedor, siempre llego temblando, aunque de la nada aparece el coraje que necesito para encararlo, creo.

Muchos no tienen idea que para mantener una empresa, saber programar o saber diseñar no es suficiente. La estrategia, las decisiones, la administración los recursos, conseguir contactos, intercambios comerciales, búsqueda y atención de clientes, etc. Es un trabajo sumamente estresante. Toda empresa tiene gastos que debe cubrir y la mayoría de las veces estos nos absorben de tal manera que incluso olvidamos quienes somos como empresa, olvidamos la cultura de trabajo que elegimos y caemos en el error de prostituirse por dinero. Así que, mientras yo caía en la depresión, Otháner me animaba, Maru me hacía reir y Slider coloreaba mi vida -y sueños- trolleando xD, que puedo decir… emprender así es divertido.

Kosto incluso me cuidó cuando quedé dormido con las manos aún en el teclado mientras programaba en la Campus Party. Arturo, que no me asesina por llamarle en navidad y año nuevo para darle mantenimiento al servidor. También se que cuento con Jalil para cualquier cosa y con Staf621 para cualquier duda sobre programación.

Y espero poder responderles igual :)

Así es como se termina un año difícil. Empieza el 2010 y la verdad es que le tengo miedo. Mi vida escolar es bastante mediocre y es algo que he querido corregir desde… bueno, no importa. Lo importante es que estoy decidido a enfrentar este año escolar, el cual tiene toda la pinta de ser tan hijo de puta como fue el 2009 para WEM. Sin embargo aquí estoy, temblando de miedo, pero listo para lo que sea y esperando que el coraje “aparezca” como suele hacerlo.

Trabajaré por un buen 2010. No soy fan de la esperanza ni las creencias, así que no me queda otra más que trabajar por que mis deseos se cumplan. Espero que todos ustedes trabajen por los suyos. Feliz año nuevo a todos, si a todos, incluyendo a los musulmanes.

¡Salúd! :D

Buscar y reemplazar texto en muchos archivos

Hay muchas formas de hacerlo y seguramente muchos IDEs ya lo hacen. Creo que Textmate, Notepad++ y Textedit son los únicos editores de código ligeros que lo hacen. Terrible que uno sea solo para OS X y los otros dos para Windows. La gente asume que todos los linuxeros usamos la consola y las expresiones regulares para todo.

Bueno, quizás lo primero si. Pero usar expresiones regulares siempre ha sido un dolor de cabeza para mi (no se como pasé Compiladores I). En busca de una solución express, tiré código a lo idiota y he aquí la idiotez llamada replace.php que me ha sacado de apuro:

<?php
	$data = file_get_contents($_SERVER['argv'][1]);
 
	$find =		'<td class="pie"><a href="#">Políticas de privacidad</a> <a href="#">Vigencia del catalogo</a> <a href="#">Mapa del sitio</a></td>';
	$replace =	'<td class="pie"><a href="/pagina/politicas-privacidad">Políticas de privacidad</a> <a href="/pagina/terminos-condiciones">Terminos y condiciones</a></td>';
 
	$new_data = str_replace($find,$replace,$data);
 
	if($data != $new_data)
	{
		echo $_SERVER['argv'][1]." <-- Modificado\n";
		file_put_contents($_SERVER['argv'][1],$new_data);
	}
?>

Se ejecuta desde consola para más practicidad, si, lo he dicho :D

find ./ -name *.ctp -exec php replace.php {} \;

El comando find buscará en el directorio ./ todos los archivos que terminen con la extensión .ctp y ejecutará mi script mandandole como argumento la ruta del archivo encontrado. El proceso es recursivo, por lo que si encuentra un archivo en varios subdirectorios la ejecución manualmente se traduciría en algo como php replace.php ./views/pages/politicas.ctp

La ventaja de usarlo en consola es que podemos personalizar la elección de los archivos a modificar con una sencilla expresión regular, que se podría hacer más poderosa para un filtro más avanzado de archivos, pero igual yo he sido feliz concatenando la instrucción dos veces en una misma linea, así:

$ find ./ -name *.ctp -exec php replace.php {} \; && find ./ -name *.html -exec php replace.php {} \;
./views/layouts/default.ctp <-- Modificado
./webroot/formulario.html <-- Modificado
./webroot/viajes.html <-- Modificado
./webroot/hacemos.html <-- Modificado
./webroot/contacto.html <-- Modificado
./webroot/static.catalogo.html <-- Modificado
./webroot/estamos.html <-- Modificado
./webroot/quienes.html <-- Modificado
./webroot/nuevos.html <-- Modificado
./webroot/beneficios.html <-- Modificado
./webroot/gracias.html <-- Modificado
./webroot/principal.html <-- Modificado
./webroot/unete.html <-- Modificado
./webroot/negocio.html <-- Modificado
$

Algo bruto, pero funciona incluso con mucho texto por buscar y mucho por reemplazar. La he usado tanto que decidí dedicarle este pequeño apunte, quizás a alguien más le puede servir.

Fondos múltiples animados con CSS y Mootools

Visitando el sitio de Code and Theory quedé algo asombrado de lo que habían hecho con el encabezado. Una animación muy sutil, pero da un aire muy elegante al sitio. Así que me puse a tirar un poco de código para probar el rendimiento de una animación de ese tamaño -verán, yo la quería de fondo completo :D

He aquí el resultado: demo.

Evidentemente le hace falta detector de imagenes cargadas antes de cada animación. Lo resolví temporalmente con un hack pero solo probado en Firefox, en Opera hay que esperar la ronda de 18 segundos para que las imagenes queden en caché y la animación sea fluida.

Estoy en proceso de rediseñar algunos sitios y este es un efecto que quiero introducir más adelante, así que era necesario jugar un poco por ahora. El código completo aquí.