Programmer Quotes…Citas (frases) para Programadores…

Buscando algo sin relación alguna, llegue a encontrar esto:

http://factorkippel.com/citas-a-ciegas-para-programadores/

Si se sienten identificados, es mera coincidencia.Looking for something unrelated, I found this:

http://factorkippel.com/citas-a-ciegas-para-programadores/

If you feel it, is mere coincidence.

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?

But the future refuse to changePero el futuro se niega a cambiar

logo

14 años han pasado desde que se publicó el juego que me ha apasionado toda la vida, y a pesar de tener 2 reediciones, en PlayStation y recientemente en Nintendo DS, en ambas plataformas sigue siendo básicamente el mismo que fué en su plataforma madre: Super Nintendo.

Entremedio, un grupo de aficionados hizo lo que muchos de nosotros (los fanáticos) creímos que Squaresoft (SquareEnix) debió hacer: Reconstruir el juego en un entorno 3D, acorde a los nuevos tiempos. Lamentablemente, como si fuera una ironía, la historia hasta ahora a sido la misma que el perverso monstruo Lavos dice en el final del juego, cuando derrota a los protagonistas: “BUT THE FUTURE REFUSE TO CHANGE” (“Pero el futuro se niega a cambiar”).

SquareEnix argumentó problemas legales, de tal modo que el grupo tras Chrono Trigger Resurrection debió cancelar el proyecto. Una lástima, porque estaba quedando precioso:

logo

14 year ago, the game that has fascinated me throughout life, was released. And despite having 2 ports, for PlayStation and recently in Nintendo DS, on both platforms is essentially the same as it was in his mother platform: Super Nintendo.

In between, a group of fans did what many of us (fans) thought that Squaresoft (SquareEnix) had to do: rebuild the game in a 3D environment, in keeping with the times. Unfortunately, like an irony, the story so far has been the same as the evil monster Lavos said at the end of the game, when players beat: “BUT THE FUTURE REFUSED TO CHANGE”.

SquareEnix argued legal issues, for which the group had to cancel Chrono Trigger Resurrection project. A pity, because it was being precious:

Seguir leyendo But the future refuse to changePero el futuro se niega a cambiar

Virtualbox como herramienta de redes

Me enteré que alguien se dedicó a traducir toda la sección de redes, del manual de ayuda de Virtualbox.

Una máquina virtual maneja puertos, direcciones ip, túneles y cualquier cosa relacionada con redes, tal como un PC conectado a un switch (en modo NAT por supuesto, los otros modos de red tienen otras utilidades).

Por eso, es posible instalar servicios, hacer redirecciones y en general, hacer pruebas de red de todo tipo, incluso sniffing.

Especialmente útil para hacer pruebas sin afectar a otros equipos, o cuando no tenemos más de un PC y requerimos probar algo entre varios, o cuando no disponemos de una red o internet en la casa.

Para obtener el manual, véase la fuente.

Virtualbox as a sysadmin toolVirtualbox como herramienta para administradores

Besides the port fordwarding, VirtualBox has another very useful feature for system administrators: running a virtual machine WITHOUT graphical interface.

We suppose this situation: we have a virtualized server (it doesn’t matter if it’s linux, Windows, Solaris,…), must run every time you start the system and must also consume less resources as possible.

The solution seems simple. VirtualBox brings commands: vboxsdl and vboxheadless. Both allow to run a virtual machine without open virtual machines manager.

vboxsdl run the virtualized system in a window graphical interface, in fact is the same as running the system from the virtual machines manager, but if we call it directly, we avoid having to resort to this.

vboxsdl -startvm "VM_NAME"

vboxheadless run virtualised system, but without raising any graphical interface, making it possible to boot only with the console. This is especially useful for servers that dispenses with the Xserver.

vboxheadless -startvm "VM_NAME"

If we can not see the virtual machine, how would you control?

Here I have a couple of tips used in Windows XP as host, Windows 2000 Server as guest, but the same should be applied in a Linux and other systems.

Además de la redirección de puertos, hay otra característica de Virtualbox muy útil para administradores: correr una máquina virtual SIN interfaz gráfica.

Supongamos esta situación: Tenemos un servidor virtualizado (da lo mismo si es linux, windows, solaris, …), debemos ejecutarlo cada vez que parta el sistema y además debe consumir los menos recursos que sea posible.

La solución pareciera ser muy sencilla. Virtualbox trae los comandos: vboxsdl y vboxheadless. Ambos permiten correr una máquina virtual sin abrir el administrador de máquinas virtuales.

vboxsdl ejecuta el sistema virtualizado en una ventana de interfaz gráfica, de hecho es lo mismo que correr el sistema desde el administrador de máquinas virtuales, pero si lo llamamos directamente, nos evitamos tener que recurrir a este.

vboxsdl -startvm "NOMBRE_DE_LA_MAQUINA_VIRTUAL"

vboxheadless ejecuta el sistema virtualizado, pero sin levantar interfaz gráfica alguna, por lo cual es posible arrancar una máquina virtual solo con la consola. Esto es especialmente útil para servidores que prescinden del Xserver.

vboxheadless -startvm "NOMBRE_DE_LA_MAQUINA_VIRTUAL"

Ahora, hay un pequeño problema. Si no podemos ver la máquina virtual ¿cómo la controlamos?

Tengo acá un par de consejos que he aplicado en windows xp virtualizando windows 2000 server, pero debiera poder aplicarse lo mismo en un host con Linux u otros sistemas.
Seguir leyendo Virtualbox as a sysadmin toolVirtualbox como herramienta para administradores

VirtualBox! You save my dayVirtualBox! Me salvaste el día

My first deployment attempt with my fingerprint reader application was not very good.

First, I was informed late about the version that ran the server: SQL Server 7. Moreover, it is difficult to go any time to make room for any evidence, even worse to sit quiet coding. The first thing we tried long ago, was to make a backup of the entire database. Assuming Microsoft Management Studio would be enough to connect to the database and create new tables, has been the first thing I thought to do that day.

But as Murphy’s law is always, I found an uncomfortable message, saying Unable to connect to an earlier version of SQL Server lower to 2000 (ie, version 8). Because Management Studio is based on. NET, I doubted that my .NET application could connect. Later, I discovered that I was wrong, but at the time I had no alternative other than to evaluate more solutions.

El primer intento de implantación de la aplicación de lectura de huellas no fue muy bueno. Antes de continuar, conozco un documental (minuto 28) que tiene mucho que ver con este caso.

En primer lugar, me enteré a destiempo que el servidor corría la versión 7 de SQL Server. Además, es difícil ir cualquier momento al lugar para hacer cualquier prueba, menos para estar sentado tranquilo codeando. Lo primero que intentamos hace un tiempo, fue hacer una copia de seguridad de la base de datos completa. Suponiendo que Microsoft Management Studio sería suficiente para conectarme a la base y crear las tablas nuevas, fue lo primero que pensé hacer ese día.

Pero como la Ley de Murphy está presente siempre, me salió un incómodo mensaje diciéndome que No se puede conectar a una versión anterior de SQL Server menor 2000 (es decir, versión 8). Ya que Management Studio esta basado en .NET, dude que mi aplicación en .NET pudiera conectarse. Más tarde, descubrí que estaba equivocado, pero en el momento no tuve alternativa más que evaluar otras soluciones.

Seguir leyendo VirtualBox! You save my dayVirtualBox! Me salvaste el día

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

blog respaldo anti-amnesia