El concepto de una clase por tabla


Como cualquiera que me conoce se debe imaginar, esta nota por ser de “programación”, va a ser en PHP 🙂

Por cierto, ya no he publicado nada en mi otro blog porque estoy en proceso de meterle lo que no he podido en mucho tiempo, pero en unas semanas espero darle la actualizacion a la ultima version de desarrollo (que solo yo tengo :P) y a partir de entonces probablemente deje otra vez este blog ahi nada mas para algunas notas de vez en cuando.

Siguiendo con la nota, un “paradigma” de la POO es el hecho de que el manejo de una base de datos debe ser OO tambien, y por tanto la mejor manera de asegurar que sigamos las ordenes de los que saben debemos usar una clase para cada tabla.

Con mi poco conocimiento en POO, y de UML, pero con mi amplio ego, y ganas de aprender mas, pongo aqui un par de ideas de como hacer la interfase a la BD de manera orientada a objetos, o sea usando clases, con algunas de sus bondades.

Para ahorra tiempo usamos una clase para interaccionar con la base de datos usando ADODB, y una clase simple (FetchAll) de la que ya hable, con un poco de modificaciones nos puede ayudar a hacer el trabajo mas sencillo, y enfocarnos solo en la parte de modificacion de registros. De hecho PEAR tiene DB, aunque menos pulido que ADODB, tiene funciones como la de $rs->getAll(), que es escencialmente lo que estoy parchando con la clase fetchAll.

Ahora centrémonos en la parte de insertar/modificar/borrar registros, hay 2 opciones, o usamos “foreign keys” (llaves externas) en la base de datos para facilitarnos la vida, o creamos los métodos correspondientes en php para el borrado de los renglones encadenados. La primera opción tiene la ventaja de que nos evita programar los sucesos correctos, y la segunda opcion tiene la ventaja de que es menos probable perder grandes cantidades de información accidentalmente, es decision de cada quien que le conviene mas :), aqui haré de cuenta que hay llaves externas que hacen lo correcto, y que mi programación va a ser tan confiable como para no cometer burradas facilmente del lado de código, y si la interafase entre el teclado y la silla comete los errores pues es su problema.

Ok, entonces lo que necesitamos es una clase que se encarge de modificar genéricamente un renglón en la base de datos



Tip anti banners/spyware/trackers etc


Aqui va un tip que muchos conocen, pero muchos mas desconocen

En la actualidad, los usuarios de internet, tenemos que ver una cantidad de publicidad, y muchas veces no solo es el hecho de que este ahi, aunque desarrollemos la tan odiada (por los publicistas) capapacidad de ignorar inconcientemente los anuncios, muchas de las veces el problema no solo es que este ahi la publicidad, sino que ademas usa memoria de nuestra PC, y la hace mas lenta, asi como algo de procesador, en el caso de los anuncion en flash (swf) es particularmente importante este problema, asi como algunos anuncion con exceso de javascript. Aun más, muchos sitios intentan detectar nuestras actividades mediante el uso de anuncios de forma masiva, como el caso de doubleclick.com, que practicamente tiene anuncios en todos lados, y nos ponen cookies de tal manera que pueden detectar bastante acertadamente que habitos tenemos, y por tanto atacarnos mas certeramente con sus anuncios, asi como vender la informacion recabada.

Bueno, pues hay maneras bastante sencillas de evitar mucho de esto, una primera medida es no aceptar cookies de cualquier sitio, solo de aquellos para los que realmente lo necesitamos, pero una aun mas chida, es el uso de el archivo hosts en windows o linux o BSD, o lo que sea, supongo que todos los sistemas operativos importantes lo soportan 🙂 (todos los unixes tambien por supuesto ! ellos lo inventaron), que nos permita no visitar estos sitios, ahorrandonos ancho de banda, rastreo indeseado, y distracciones . El sitio MVPS nos ofrece un archivo host que no solo es enorme, ademas bloquea casi cualquier cosa que tenga intenciones sospechozas, por ahi mismo nos chutamos a analytics de google, que incluso yo tengo instalado en este blog, y que incluso yo bloqueo por medio de mi archivo hosts y de la extension No-Script :), pero que esta ahi para trackear a todos aquellos que no saben o no quieren deternerlo, afortunadamente analytics no es tan mal intencionado como otros, pero por lo menos hace un trackeo sumamente profundo de nuestros navegadores/PC y supongo que no todos desean ser investigados de esa manera y sin advertencia 🙂

Ahi el tip, todos los que tengan intencion de ahorrar ancho de banda y no permitir que se les investigue hechen mano del archivito, y sigan navegando tranquilamente.



La(s) pregunta(s) del dia


Hace semanas que vengo pensando en escribir esto, pero no habia tenido la paciencia y el tiempo para tratar de escribir algo hilado y que parezca lógico (sigo sin tenerlo, como veran)

El tema es este: No me explico por qué hay un grado de ceguera social tan grande en nuestro país.

Bueno, una idea inicial puede justificar fácilmente este problema con un vistaso rápido al mundo entero, nuestro pais no esta entre los peores realmente, y aun si vemos a los paises mas desarrollados podemos observar un desprecio por el bienestar de la clase mas baja, y por ejemplo en paises europeos en los que la conciencia social esta mucho mas desarrollada, vemos deficiencias graves en cuanto a la moral, concrétamente en el uso de drogas fuertes (y algunas no tan fuertes como el alcohol y marihuana) asi como medicamentos de prescripción.

Ok, entonces no estamos tan mal comparados con el promedio ! que bien !

Entonces sigamos con el tema local, qué es lo que hace que una persona tenga interés en votar por el pri, el pan, o prd, incluso por los otros chiquitos, por qué razón una persona X deja de ver la realidad y empieza a creer que le conviene tal o cual candidato, o simplemente por qué cree que ese candidato va a hacer una diferencia ?

Por mas que querramos cerrar los ojos, por lo menos los 3 candidatos mas populares han tenido lios que no pueden ocultar su alto grado de corrupción personal, incluso sin irnos hasta los delitos graves como el narcotráfico o asesinatos, etc.

No conformes con todo eso, entre ellos se “defienden” no atacandose esos delitos evidentes. Y aun asi, con todo eso, hay millones de mexicanos que van a ir a votar por ellos !

Pero la razón, cual podrá ser ?

Es que realmente el grueso de los humanos somos crédulos, o no tenemos memoria ? o de plano tenemos tanto miedo a las represalias ? Alguien a visto que corran de su trabajo al otro 50% que voto por el candidato perdedor ??

O es que una gran mayoria de esos votadores va a salir beneficiado con la corrupcio de su “gallo”? no lo creo, casi nunca ganan con mas de 35% de los votos, asi que olvidado, menos de la mitad saldria beneficiado.

Entonces, que demonios esta mal con nuestra gente ?? por qué nuestra naturaleza no nos deja progresar ? sera cuestión de control natural ? como ya somo demasiados la naturaleza nos puso una trampa de la que no podemos escapar ? o peor aun ! no solo esta la trampa, sino que va a progresar con el tiempo hasta que nos destruyamos ?

Por qué los crédulos son la regla y no la excepcion !, por queeeee ?



Trabajo para especialista


Google: La noticia del dia



La noticia de hoy, picasa en linux, pueden ver un snapshot de picasa explorando mi disco para encontrar imagenes.

Es la primera vez que uso el producto, y hasta donde voy funciona perfecto, lo malo es que no tengo casi fotos, asi que no hay mucho mas que decir por el momento, tendre que traerme las carpeta de fotos de mi casa para ver que mas cosas se pueden hacer con picasa

Por el momento parece que google ha decidido no permitir el acceso al paquete desde fuera de USA, pero aqui esta el paquete desde otro servidor de google 🙂

Veremos que mas tiene google para la comunidad linuxera en los proximos dias, probablemente saquen finalmente un framework de javascript que no dependa de Java 🙂

Buen dia



Luego de un rato, la noticia es vim7


Pues hace un buen rato que no escribo nada, y este post es para decir que todo va bien y estoy estrenando vim7, se ve bien, tuve que darme una vuelva profunda por la documentacion, de plano elimine toda mi configuracion anterior y empeze de nuevo.

Ahora tengo un bonito .vimrc de 34 lineas que corrige sintaxis (cree el diccionario en español a partir del archivo de myspell-es), autocompleta, da tips de argumentos para las funciones, colorea de acuerdo al tipo de archivo, indenta correctamente, auto cierra y resalta parentesis de todos tipos y comillas, y no se que otras cosas que ni siquiera he descubierto.

En realidad esta casi tan bueno como en la version 6 con todas mis modificaciones y adiciones de plugins, pero ahora no tengo ningun plugin, y el .vimrc es bastante sencillo (y entendible), solo me falta poner el un plugin que cambia automaticamente la fecha de modificacion de los archivos al guardarlos 🙂

Con gusto refrendo mi caracter de no-programador que usa vim, y me inco ante los programadores que usan el SO emacs 🙂

Por cierto, vim corre sobre emacs ?



Una lección de grandeza


Hoy me lleve 2 sorpresas con gmail.

La primera fue ver que el fabuloso sistema de vista previa de attacments hace que puedas embeber una forma (formulario es incorrecto en mi opinion) dentro de un mensaje sin problemas ! chidisimo no ?

Que tal si se nos ocurre ademas de todo meterle un poco de javascript, sacar una alerta (o cualquier otra cosa que se nos ocurra), pues resulta que acueductamente tienen un sistema de filtros que embebe una funcion como esta :

onsubmit="return window.confirm('You are submitting information to an external page.\\nAre you sure?');"

directamente a la forma (<form … >). Y como es de esperarse, si tratas de sobreescribir esa funcion pues simplemente la elimina y usa la suya ! obviamente no funciona con links tampoco (onclick, onmouseover…).

JA! por ahi no es trivial meter XSS 🙂 chale !, y ademas degrada elegantemente, la forma si se puede mandar !



Web 2.1


Este es uno de esos casos en los que dices: “Porque no se me ocurrio a mi primero!”

No, no se trata de la idea de el transporte asincrono de javascript y xml ! no !!

Se trata de una técnica para evitar el uso de los molestos tags <blink>, que ni son estandar, ni son bonitas como usar AJAX!! para hacer parpadear un texto!!

Si no eres geek, y no sabes de html y javascript esto no te va a causar ninguna gracia, pero a mi me saco carcajadas un rato.

Me pregunto si se vera muy ridiculo que porte el codigo usando dojo !



Como llamar la atencion al máximo


Como tengo que relajarme antes de empezar la semana, aqui va mi primera nota de ésta !

Si quieres llamar la atención la mejor manera es ser candidato de cualquier partido político a la presidencia, no cabe duda que causan polémica, y se habla de ellos en todos lados.

Pero si de verdad quieres llamar la atención !!! neto, en serio, o sea mejor no se puede !! pues ya valiste, porque el peje nos ganó ese lugar, y esta dificil que nazcamos encarnados en él !! prrrr

Es que de verdad no doy crédito, desde personas como mi amigo Kwame, hasta todos los grandes medios, no dejan de hablar de él, la mayoria últimamente esta obsesionada por demostrar que el peje es pendejo (digo, casi una vez a la semana cierto investigador que además fue una vez mi asesor en el ccf de la unam manda un mensaje en contra del peje) y casi cualquier bloggero mete una nota por ahi como yo !

Y ahora para mi asombro, hasta en la lista de [email protected] cierto persojane nos invita amablemente a votar por el peje porque el si va a apoyar el SL !! jojojojo, habrase visto.

Bueno, afortunadamente yo no tengo que votar por nadie para que se me permita usar el SL, digo, se necesita solo un poco de cabeza y argumentos para convencer a cualquier jefe de que eres mas productivo usando SL y con eso tienes !

En fin, lástima que el peje ya nació, porque estoy seguro que mas de uno quisiera estar en sus zapatos actualmente.

Gracias México por darnos lo que nos merecemos !!



De porque soy mal programador, y porque me gusta asi


Yo nunca recibi una educacion formal para programar, como muchos empeze con basic, y macros en hojas electrónicas por alla de finales de los 80’s, luego tuve una crisis de computo porque deje de usarlas durante los primero 4 años de estudiar QB, luego en la tesis volvi a usarlas, no mucho, pero fue cuando de plano ya sabia que eso de manejar tubitos en el laboratorio NO ME GUSTABA! y que queria estudiar quimica teorica, asi que me avente 8 años de doctorado haciendo simulaciones de Monte Carlo y Química Cuántica, y para mi fortuna, o astutamente se me ocurrio meterme mucho mas a la administración de unix, luego de linux, luego a programar web solo por hobbie, y resulto que al final soy pasante de dr, estoy tratando de terminar de escribir la tesis, y ya tengo mas de 1 año trabajando de programador y administrador de servidores.

Bueno, mucho por el royo historico, lo que realmente quiero exponer aqui es mi idea de como hacer una interfase sencilla y pequeña para obtener renglones de una base de datos de manera sencilla, y probablemente un poco limitada porque esta hecha para el blog que tengo en garaged.homeip.net, y como usa smarty es bastante particular. Cabe hacer notar que uso ADODB como intefase a la base de datos, asi que mucho del trabajo sucio ya esta escrito fuera de mi codigo 🙂

Esto ya lo habia hecho antes, en ratos los ratos de ocio las últimas semanas que trabaje en TMZ, pero la verdad no recuerdo exactamente como lo hice, y es mejor asi :), pero es muy similar a lo que hago ahora.

Sin diseño, se me ocurrio lo siguiente:
Una simple clase que maneja un “record set”, y tiene 2 metodos, uno para sacar 1 renglon, y otro para sacar todos los renglones de un solo golpe. El segundo metodo depende del primero. En realidad esto esta basado en lo que se hace en base pero en base es mucho mas complicado, y hay ciertas partes que no me gustan de como esta escrita la interfase a la BD. El defecto es que mi primera idea no estaba muy bien sentada, de hecho me dio hueva hacer un diagrama UML, asi que me lo avente nomas de coco (la vez anterior tampoco me sirvio de mucho lo del UML, no logro sacarle suficiente provecho a la planeacion ! jaja, los patrones los encuentro en la implementacion). Aqui esta el codigo:
<?php
class FetchUtil {
    var 
$row;
    var 
$DB_type;
    function 
FetchUtil (&$id){
        
$this->row $id;
    }
    function 
FetchRow(){
        if (!
$this->row->EOF){
            
$temp $this->row->fields;
            
$this->row->MoveNext();
            return 
$temp;
        } else {
            return 
false;
        }
    }
    function 
FetchAll(){
        
$rs $this->FetchRow();
        while (
$rs){
            
$rows[] = $this->FetchRow();
            
$rs $this->FetchRow();
        }
        return 
$rows
    }
}
function 
FetchAll($query){
    global 
$db;
    
$sql $db->execute($query) or die ($db->errormsg);
    
$rs = new FetchUtil($sql);
    
$rows $rs->FetchAll();
    return 
$rows;
}
function 
FetchOne($query){
    global 
$db;
    
$sql $db->execute($query) or die ($db->errormsg);
    
$rs = new FetchUtil($sql);
    
$rows $rs->FetchRow();
    return 
$rows;
}

Como se puede ver esta implementación no es particularmente buena, porque la condenada clase no hace casi nada por si sola, solo hay 2 métodos mas o menos útiles. No conforme estoy usando 2 funciones para parchar mi falta de pericia al programar !

Que necesito hacer ? acercarme más a tener realmente una sola clase que sirva como interfase a la base de datos, y que contenga un método como el FetchAll que realmente devuelva los renglones con simplemente pasarle la cadena del “query” correspondiente. No quiero tener que usar ninguna función extra para “ayudarle” a la clase.

El resultado de mis siguientes 5 minutos (la nota me tomo como 1 hora!) de analisis me llevaron a esto:

<?php
class FetchUtil {
    
/* This class is everything a smarty using php project needs
     */
    
var $row;
    var 
$DB_type;
    var 
$DB
    function 
FetchUtil($dsn){
        
$this->DB NewADOConnection($dsn);
        if ( !
$this->DB ) die(“Coneccion fallida – $dsn”);
        
$this->DB->SetFetchMode(ADODB_FETCH_ASSOC);
    }
    function 
Execute($query){
        
$this->row  $this->DB->Execute($query) or die ($this->DB->errormsg());
    }
    function 
FetchAll($query){
        
/* It returns 1 dimension bigger arrays for 1 row, but 
         * helps lowering the methods in this class
         */
        
$rs = Array();
        
$this->Execute($query);
        while(!
$this->row->EOF){
            
$temp[] = $this->row->fields;
            
$this->row->MoveNext();
        } 
        return 
$temp
    }
}

De esta manera simplemente mandando una cadena al constructor de esta manera:


$dsn = "$data_base://$user:$passwd@$host/$db_name";
$db = new FetchUtil($dsn);


creo un objeto que es capaz por si mismo de ejecutar un query, devolverme los renglones, y darme información relevante en caso de cualquier error sin tener que duplicar codigo para ninguna de esas tareas, y usando una sola clase ! sin funciones auxiliares ! y en poco mas de 20 lineas !

Si ya se, lección numero 1 de programacion orientada a objetos, degraciadamente yo no fuí a esa clase, no estaba en mi plan de estudios 🙂

Que gano con esto ?, pues uso ADODB por si alguna vez la portabilidad es importante, uno nunca sabe !, utilizo una sola clase que hace practicamente todo el trabajo con ADODB por detras: conexión, manejo de errores, ejecusion de queries, regreso de renglones como arreglo asociativo

Es o no bonito reutilizar codigo ?? gracias por leer, espero que no te hayas saltado gran parte de lo que estaba arriba solo para leer este párrafo.