Archivo de la categoría: Desarrollo

FirePHP, otra herramienta de depuración de PHP

Llevo años usando Xdebug para hacer depuración de PHP, pero últimamente estoy ocupando algo más.

FirePHP está compuesto de 2 partes, una librería PHP (puede ser usada en versión orientada a objetos o en funciones). La otra parte es una extensión para Firefox (también hay otras extensiones de terceros para otros navegadores, como Google Chrome), que a su vez extiende la funcionalidad de la ya conocida extensión Firebug.

¿Para que sirve?

Firebug añade un panel donde se puede llevar control de varios tipos de error que son detectados por el navegador, sobre todo en tiempo de ejecución como lo es con javascript de las páginas web o también de las mismas extensiones de Firefox.

FirePHP añade algo más. Por el lado de la librería, Firebug es capaz de enviar información de depuración a través de las cabeceras HTTP y no en el contenido (como lo hace el reemplazo de la gestión de errores nativa de PHP que añade Xdebug). Esto tiene varias ventajas, por ejemplo:

  • Evita que al desplegarse errores sobre el HTML de un sitio, este se descuadre su diseño, o debido al diseño, no pueda verse bien el error en ciertos casos.
  • Evitar corrupción de datos cuando PHP genera salidas que no son de texto plano, por ejemplo al generar un PDF dinámicamente o imágenes (con php_gd2).
  • Al hacer peticiones por ajax, donde generalmente uno «no ve» lo que está llegando (con Firebug se puede ver), y por lo tanto tampoco se ve si la salida venía con errores entremedio.
  • En la misma linea de los 2 puntos anteriores, evita que se corrompa una salida en json o xml al hacer peticiones ajax que vengan con errores.

Por el lado del cliente, añade un filtro a Firebug para detectar estas cabeceras y desplegarlas en la Consola de Firebug.

Además, con un pequeño «hack», se pueden redirigir TODOS los errores estándar que salen por pantalla, a las cabeceras, simplemente con un script (en PHP).

Hermoso, ¿y como lo hago funcionar?

Simple.

Seguir leyendo FirePHP, otra herramienta de depuración de PHP

Mi primer repositorio PPAMy first PPA repository

Hace algunos días por alguna extraña alineación planetaria, tuve problemas usando kopete, por lo cual… debí recurrir a la otra opción más a mano, pero del lado oscuro: pidgin.

Pero gracias a ese incidente, me topé con un par de cosas interesantes. La primera es que terceros desarrollaron un plugin para pidgin, que permite usar el chat de Facebook dentro de él. El paquete está disponible a través de un repositorio de Google Code.

Ya había visto la noticia sobre un plugin similar que estaba cocinando Duncan Mac-Vicar para Kopete, pero no le vi mayor interés hasta ahora, que ya había probado el de pidgin.

Durante la semana pasada, baje y compilé las fuentes (y sus dependencias) para probar. Así pude testear el funcionamiento del plugin. Por desgracia aun está muy inmaduro, pero ello no lo hace menos interesante.

Una de las dependencias kopete-facebook es qjson, una librería que extiende Qt para añadirle un JSON Parser, necesario para procesar los datos recibidos/enviados por la red de facebook.

Lamentablemente, ni kopete-facebook ni qjson estan empaquetados en ubuntu jaunty (qjson está en 9.10 karmic koala, pero karmic aun está en estado alpha). Tanto Duncan[1] como Flavio[2], solo ofrecen los paquetes fuente y un paquete para opensuse.

Entonces, luego que logré compilar ambas librerías se me cruzó por la cabeza…«Cualquiera puede hacerse un PPA, ¿y si lo empaqueto para kubuntu y lo subo?» Bueno, a eso me dediqué este fin de semana.
Seguir leyendo Mi primer repositorio PPAMy first PPA repository

Respect you yourself should (Joomla Critique #1)Respetarte tu mismo debes, (Crítica a Joomla #1)

Mientras trabaja por volver a levantar un sitio que antiguamente usaba joomla 1.0, tuve un pequeña molestia en el panel de control del nuevo 1.5, debido a que me salía un mensaje de error.

Afortunadamente no era fatal, ya que igualmente podía modificar los parámetros del sitio sin mayor inconveniente. Pero es molesto ver que algo no está bien, menos en un sistema grande como lo es Joomla.

El error me indicaba que había un archivo XML que no se estaba «parseando» adecuadamente, pero no me decía cual archivo ni cual error tenía.

Entonces decidí bajar una copia de seguridad del sitio completo, y replicarlo en mi máquina local para averiguar el error. Recordé que en linux existen miles de aplicaciones por consola, lo suficientemente poderosas para parsear y validar los XML’s de mi sitio.

Ya tuve una experiencia grata con el comando find. Pero me faltaba el comando para validar un archivo xml. Buscando encontré que posiblemente el comando xmllint me podría servir. Aunque finalmente no me ayudó, revelé un pequeño detalle que no me esperaba.

xmllint tiene una opción para validar, pero para realizar ese trabajo, requiere que 1) el archivo XML defina un DTD o 2) se le pase por parámetro. Probando sin usar un DTD por parámetro: probé lo siguiente:

find . -name "*.xml" -exec xmllint --noout --valid "{}" \;

Lamentablemente, el resultado no fue lo que esperaba. TODOS los XML salvo uno, eran inválidos, debido a que NO TENÍAN definido el DTD. Gracias a ese archivo que sí lo tenía, descubrí que joomla TIENE en su sitio un archivo DTD para que los desarrolladores lo incluyan en sus XML de configuración. De esta forma, el desarrollador obliga a que sus archivos XML tengan la estructura que el sistema requiere.

Lo peor… ese único archivo válido, era de un plugin de terceros y no de los desarrolladores oficiales. Es decir, los desarrolladores oficiales de joomla NO RESPETAN sus propias reglas al escribir el código.

Finalmente, xmllint no era lo que estaba buscando, ya que solo debía comprobar cual era el o los archivos mal formados (etiquetas mal cerradas, mal anidadas, …). Como no sabía, consulte en una lista de correo (una de las que tengo en la lista de comunidades), donde me dieron la solución: xmlwf.

Simplemente cambié el comando anterior por el siguiente y asunto arreglado:

find . -name "*.xml" -exec xmlwf "{}" \;

Encontré los culpables (eran 2), los corregí y di por terminado el asunto.
Pero me quedé con el sabor amargo de la despreocupación que los desarrolladores de Joomla han tenido en un detalle tan simple. ¿Que confianza me dan para cuando aparezca una nueva actualización del sistema?While working to re-build a site formerly used joomla 1.0, I had a little trouble in the control panel of the new 1.5, because I was leaving an error message.

Fortunately it was not fatal, since it could also modify the site parameters without much inconvenience. But it is not comfortable to see that something is not right, except for a large system such as Joomla.

The error indicated that I had an XML file that was not being parsed properly, but it’s not saying which file or which was wrong.

Then I downloaded a backup of the site, and replicate it on my local machine to find out the error. I remembered that there are thousands of Linux applications for console enough powerful to parse and validate the XML’s from my site.

I had an enjoyable experience with the find command. But I was missing the command to validate an xml file. Searching the web, I found that possibly the command xmllint I could. But ultimately did not help, this reveals a small unexpected detail.

xmllint has an option to validate, but to do this work, requires that 1) the XML file using a defined DTD or 2) it passes a DTD as a parameter. Testing without using a DTD by parameter, I tried the following:

find. -name "*.xml" -exec xmllint --noout --valid "{}" \;

Unfortunately, the result was not what I expected. ALL XML files except one, were invalid because they didn’t have defined the DTD. Thanks to that file that it was, I found that joomla has on its site a DTD file so that developers include it in yours XML configuration files. In this way, the developer requires that your XML files have the structure that the system requires.

The worst… that single valid file, was a third-party plugin and not the official developers. That is, the official joomla developers do not respect their own rules when writing code.

Finally, xmllint was not what I was looking for, and only had to check the file was malformed (bad labels closed nested bad …). As I did not know, see on a mailing list (the one I have in the list of FOSS Communities), where I got the solution: xmlwf.

Just change the above command with the following matter and fixed:

find. -name "*.xml"-exec xmlwf "{}" \;

I found the causers (they were 2), which I fixed and gave the matter ended.
But I stayed with the bitter taste of the disregard that the Joomla developers as a mere detail. What gives me confidence for when a new system update?

When a comment changes the meaningCuando un comentario cambia el significado

Looking at foreign source code for the first time, is like an archaeologist finding a lost civilization.

Unless we have on a rosseta stone (or better still, we know the language lost), the unique form to decode it is «test and error».

Recent days, had an unusual fail in my application fingerprint reader. Sometimes saving the template of the fingerprint in the database, I wanted to save a second or third reading, but still kept the first. In addition, I identified only 1 fingerprint of all saved.

Reviewing the original example from development kit, I found the reason of the error and my confusion.

While I was developing C# code of fingerprint reader, I found a method interacting with the database, but declared in an illegal place. A few months ago, the first thing I did was to move that portion of code to another file that corresponds to my «Model» layer. The line that caused my confusion was as follows:

public int identify(ref int score, ref AxGrFingerXLib.AxGrFingerXCtrl grfingerx)
{
    GRConstants result;
    int id;
    SqlDataReader rs;
    TTemplate tptRef; // <= FAIL HERE

    // More code...
}

At the head of the method was a comment that said something like «compare the reader’s template against all the templates obtained from the database». Therefore, I assumed that «TTemplate tptRef» meant «Fingerprint of reference». I do not know what concept of «measure of reference» was the programmer’s example, but for me, a rule or a weight is a unit of reference. Ie «My template is compared with yours».

However, the programmer for example, «Footprint of reference» mean «each of the templates in the database». That is to say: «My template in each turn of the cycle is the same in the database and compared with your reading».

That simple change of meaning, ruined the code. Now, after long having made these changes, I got to understand how this method works only reading the source code, but I would have been forced to investigate more thoroughly «where the fingerprint reading was clogged».

I learned how important it is to look at all the interpretations that may have documents or comments. If we are the ones that document, then avoid a breakdown that could change the meaning.

Mirar código ajeno por primera vez, es como un arqueólogo encontrando una civilización perdida.

A menos que contemos con una piedra rosseta (o mejor aún, conozcamos el lenguaje perdido), la única forma de decodificarlo es «al tanteo».

Los últimos días, había experimentado una falla inusual en mi aplicación lectora de huellas. A veces guardando el «template» de la huella en la base de datos, quería guardar una segunda o tercera lectura, pero se seguía guardando el primero. Además, solo me identificaba 1 huella de todas las guardadas.

Volviendo al ejemplo que venía junto al kit de desarrollo, encontré el motivo, tanto del fallo como de mi confusión.

Mientras desarrollaba el código del lector de huellas en C#, encontré un método trabajaba con la base de datos, pero en un lugar donde no debía. Lo primero que hice hace meses, fue separar esa porción de código a otro archivo qu corresponde a mi capa de «Modelo». La linea de la discordia fue la siguiente:

public int identify(ref int score, ref AxGrFingerXLib.AxGrFingerXCtrl grfingerx)
{
    GRConstants result;
    int id;
    SqlDataReader rs;
    TTemplate tptRef; // <= EL FALLO ESTA ACA

    // Más código...
}

El encabezado del método tenía un comentario que decía algo así como "compara el template de la lectura con todos los templates obtenidos desde la base de datos". Por lo tanto, asumí que "TTemplate tptRef" significaba "Huella de referencia". No sé que concepto de "medida de referencia" tuvo el programador del ejemplo, pero para mí, una regla o un peso es una unidad de medida de referencia. Es decir "Mi template se compara con todos los tuyos".

Sin embargo, para el programador del ejemplo, "Huella de referencia" significaba "cada uno de los templates de la base de datos". Es decir, "Mi template en cada vuelta del ciclo, será el mismo de la base de datos y se comparará con tu lectura".

Ese simple cambio de significado, me echó a perder el código. Ahora después de mucho tiempo de haber hecho esos cambios, logré entender el funcionamiento de ese método solo leyendo el código, pero de no haber usado como "medida de referencia" el código del ejemplo sin modificar, me habría visto obligado a investigar a fondo "donde se quedaba pegado en la lectura de la huella".

La moraleja es entonces, fijarse en todas las interpretaciones que pueda tener la documentación o los comentarios. Si somos nosotros los que documentamos, debemos evitar que un detalle tan pequeño pueda cambiarle todo el sentido.

Juggling with 900MB SQL DatabaseMalabareando 900MB de Bases de datos SQL

And the weight, wan’t the joke.

Following the delayed «fingerprint reader for access control» project , I ran into a problem of those …

The present application of access control works with SQL Server 7 on Windows 2000, a bad living relic. The tool of handling of the data base (SQL Management) associated to that version, is a true mystery in functionalities. For some reason, «Generate SQL querys» from a data base, it only generates the models of the tables, but no record. Finally I could not recover this data, because generating a full backup or dumping to a flat text file, threw a pretty «unknown error».

Not who did it, but today I received a DVD with 900MB of tables and records of those bases. The file was a backup respaldo.bkp.

The first thing I did was try to play with him :p :

Y lo chistoso no fue el peso.

Continuando con el retrasado proyecto del lector de huellas para el control de acceso, me topé con un problema de aquellos…

La aplicación actual de control de acceso funciona con SQL Server 7 sobre Windows 2000, una reliquia mal viviente. La herramienta de manejo de la base de datos (SQL Management) asociada a esa versión, es un verdadero misterio en funcionalidades. Por alguna razón, «Generar consultas SQL» a una base de datos, solo genera los modelos de las tablas, pero ni rastro de los registros. Finalmente no logré sacar esos datos, porque desde generar una copia de seguridad hasta volcar todo a un archivo de texto plano, generaba un lindo «error desconocido».

No se quien lo logró, pero hoy recibí un DVD con los 900MB de tablas y registros de esas bases. El archivo era un copia de seguridad respaldo.bkp.

Lo primero que hice, fue tratar de jugar con él :p .

Seguir leyendo Juggling with 900MB SQL DatabaseMalabareando 900MB de Bases de datos SQL

Migration FAIL! (and a wordpress critique #1)Problemas de migración (y crítica a wordpress #1)

I have not yet fully completed the migration of this blog, but while I have had every experience …

Among the most serious, the worst was having deleted the previous blog at WordPress.com

I do that to avoid the content duplication. Unfortunately, forget the little detail about my URL, which was used as an Openid address. I was 3 feeds pointing to twitter accounts through twitterfeed. But now I can’t log on twitterfeed, it only uses openid. As I was using the WordPress.com account as openid and now I can’t use it, can’t go to administer the accounts in twitterfeed. EPIC OWNED :retard: .

At least, the only solution I have is to change the password to the twitter accounts

Gonium has new blogGonium tiene nuevo blog

Since I have the space, I will use it.

One place, to explain things

While I do not have a blog module functional for Gonium, I have no further use the enemy (WordPress). Which is not bad at all, but just the opposite.

gonium_blog_120x60

While I do not have a blog module functional Gonium, I have no further use to the enemy (WordPress). Which is not bad at all, but just the opposite.

An important detail: the blog, the project on Google Code, the messages on Twitter, the svn commits and autogenerada API documentation, all will remain mainly in English.

The reason for this is simple: universality. Unfortunately, although I do not like the idea, English is the most universal. Not because of Chilean origin, I would like just a few friends try it. I hope that everyone has the possibility to use it. Who tells me that someone is already looking at the code? And if someone spoke in Italian? Or French? Or German? Or Chinese?

Moreover, the experience in the GDT, I noticed the users (mostly Spanish-speaking), the displeasure of using classes / objects and methods named in Spanish. I do not understand these odd habits, but they are frequent and widespread. In fact, Eduardo Silva, in his speech at the Monkey HTTP Daemon at Linux Meeting, mentioned the same problem with its Spanish-speaking users, so he decided to simply leave the mailing list, blog, documentation, etc. in English. This time, take the same idea and I will see what happens.

For now, I do not expect an explosion of users, while functional version lacking, but I hope ideas, comments and general feedback. I have been asking things like «Are you recruiting people?» This is a relief for those minutes that I question the «What the hell am I doing something that only I care.» If anything, I am recruiting people :B . Zend Framework Developers? Welcome! Any contribution will be equally well received, either from a PHPers, jQueryst, CSSers, Translator, Web Designer or Artist are fully welcome.

Ya que tengo espacio, hay que aprovecharlo.

Un lugar donde explicar las cosas

Mientras no tengo un módulo de para blogear funcional en Gonium, no me queda otra que usar al enemigo (WordPress). Lo cual no es del todo malo, sino justamente lo contrario.

gonium_blog_120x60

La idea de tener un blog exclusivamente para el desarrollo de Gonium, me permitirá poder dejar en claro cuales son las ideas que se están implementando o se desarrollaran a futuro, allá en su propio lugar. Hay mucho por hacer, por lo tanto, mantener una bitácora de desarrollo (más que un precario Roadmap), espero me sirva mucho más.

Un detalle importante: el blog, el proyecto en Google en Code, los mensajes en Twitter, los commits de svn e incluso la documentación autogenerada del API, se mantendrán todos en idioma inglés principalmente.

La razón de esto es muy sencilla: universalidad. Aunque no me gusta la idea, lamentablemente en comunicaciones, el inglés es lo más universal. No por ser de origen chileno quisiera que solo algún amigo mío de acá lo ocupe. Espero que a todo a quien le sirva tenga la posibilidad de ocuparlo. ¿Quien me dice que alguien por ahí no estará ya husmeando el código? ¿Y si este alguien hablara en italiano? ¿O francés? ¿o alemán? ¿o chino?

Además, habiendo tenido experiencia en el proyecto GDT, noté como muchos usuarios, aun cuando en su mayoría se trataba de hispano-parlantes, simplemente no les gustó la idea de usar objetos y métodos nombrados en español. No entiendo estas mañas, pero se que son frecuentes y extendidas. De hecho, Eduardo Silva, en su charla de Monkey HTTP Daemon en el Encuentro Linux, mencionó haber tenido ese problema con los hispano-parlantes, así que decidió simplemente dejar todo, lista de correo, blog, documentación, etc, en inglés. Esta vez, adoptaré la misma idea y veré que sucede.

Por el momento, no espero una explosión de usuarios, ni mucho menos mientras la versión funcional brilla por su ausencia, pero sí espero ideas, comentarios y en general feedback. Ya me han estado preguntando cosas como «¿estás reclutando gente?», lo cual es un alivio para esos minutos en que me cuestiono el «¿para que diablos estoy haciendo algo que solo me importa a mí?». Por si acaso, sí estoy reclutando gente :B . ¿Desarrolladores en Zend Framework? Bienvenidos! Cualquier tipo de aporte será igualmente bien recibido, ya sea de parte de un PHPero, jQuerysta, CSSero, Traductor, Diseñador o Artísta son plenamente bienvenidos.

Seguir leyendo Gonium has new blogGonium tiene nuevo blog

How to store data in a Secure Cookie (and a PHP FAIL)Como guardar datos en una Cookie Segura (y un PHP FAIL)

Los últimos días los he dedicado al estudio de uno de esos viejos problemas que nunca había podido resolver. Consiste en el almacenamiento «seguro» de datos que viajan en un canal inseguro y se almacenan en un medio inseguro. Puntualmente, hablo de COOKIES. Cuando hablamos de protocolo HTTP(S), las cookies son el único «repositorio de datos» o almacenamiento persistente en el lado del cliente (navegador) con el que podemos trabajar. En las cookies, podemos guardar las preferencias de un usuario (por ejemplo, el idioma que escoja, la última página que vió, etc…). Y el problema puntual con cookies: guardar la identidad del usuario para «recordar» su sesión. El peligro esta en el como se guarda esta identidad. Lo bueno es que ya encontré un método que me convenció, y realmente es bastante «simple» como algoritmo. Lo que no fue simple fue la implementación. La verdad es que no se como pretendía completar el primer punto de mi roadmap (Lista de control de acceso o ACL) sin tener primero un método decente de autenticación. Al menos ya di con una respuesta.

Seguir leyendo How to store data in a Secure Cookie (and a PHP FAIL)Como guardar datos en una Cookie Segura (y un PHP FAIL)

Gonium, nuevo demo y nuevos componentes

Gracias a la wena onda de Tecnoman, que se auspicio con hosting y me dejo hincharle las pelotas para que instalara PDO en un servidor en producción, tengo el demo de Gonium en un hosting nuevo. Ahora intentaré de algún modo recompensar aquello, posteando más seguido en tecnosquad.org.

Aprovechando eso, subí una copia más reciente.

Hace unos días agregué al trunk del repositorio, una copia propia del proyecto zend-framework-datagrid, con la diferencia de que mi copia permite traducirlo con Zend_Translate y los comentarios están corregidos. También corregí unos warnings menores. Además le cambié el prefijo a las clases de «Core_» (originalmente en zf-datagrid) a «Rox_», para darle concordancia a mi estructura de directorios. Podría decir entonces que es un pequeño fork :B

También agregué todo jQuery UI al directorio público. Una ejemplo de esto es la pequeña demostración con el efecto acordeón que le agregué al widget de Login.

Y por último, agregué un directorio con XML’s en formato docbook, para poder usarlos en conjunto con la documentación creada con phpDocumentor.

Espero tener una documentación un poco más completa más adelante.