Etapas de un programador

30 10 2008

Vía: LEMMKE

Veamos..

1. Que rara se ve esa función! :S

2. Esa linea creo que esta mal!

3. Si!!, ahí hay un error!!

4. Ya la corregí, si va a funcionar y a la primera! :D

5. Que bien se mira mi programa :)

6. Pero.. Por qué no corre bien? :|

7. Yo no veo errores , ¿y si no lo encuentro?! :S

8. ¡Que *! , que son esos ceros?!!!

9. por qué carajo pasa eso #$!@? !!!!!

10. No puedo hacerlo :(

11. ¿Y cual cree que es el problema doctor?

Si, creo que se apega a la realidad.





Problemas con el blog

27 10 2008

Como algunos se han dado cuenta ya son varios días que el blog esta bastante inestable, entre el host y el domain quizás ha pasado el 45% del tiempo sino es que más offline o inaccesible.

Prueba de eso son los stats del akismet:

Ahí se nota claramente como han caido los comentarios de spam en estos días, de tener más de 200 diarios pasaron a unos 20 apenas, lo cual no me molestaría en absoluto porque no hay razón por la que quiera spam en mi blog pero en este caso significa que es porque ha estado caido tanto tiempo que ni los bots spammers han podido entrar :S .

Bueno, de esa imagen paso a otra:

Esa gráfica muestra el total de comentarios en mi blog en el ultimo mes, sobrepasan los 3000 pero como se aprecia casi todo es por culpa de los robots spammers :| .

Interesante que vengan tanto aquí, hubo un rato en que habían casi 76000 comentarios de spam, eso ya traia algunos problemas al blog así que los borre todos y fue cuando decidi activar el akismet.

Pero ya volviendo al tema, esperaría que los problemas de acceso y estabilidad mejoraran en estos días, pero de no ser asi, lo más seguro es que invierta algo de dinero en comprar un dominio y un host privado.. ya me estan cansando esta clase de problemas.

De todas maneras saludos a todos.





Soda Stereo – Persiana Americana

24 10 2008

[youtube]http://www.youtube.com/watch?v=EzsAV87AmY4[/youtube]

No hay mucho que decir, solo disfrutar de una de mis canciones favoritas.





[How to]Creando y aplicando parches individuales

13 10 2008

Ya era hora de escribir otro tutorial :) , y elegí escribir sobre los tan comunes parches que por x razón ocupamos a cada momento.

(En GNU/Linux)

Comencemos por el concepto:

Cita wikipedia:

En informática, un parche es una sección de código que se introduce a un programa. Dicho código puede tener varios objetivos; sustituir código erróneo, agregar funcionalidad al programa, aplicar una actualización, etc.

Ahora vamos a aclarar que el patching se pueden aplicar a 2 tipos de cosas:

  • Al código fuente del programa
  • Al archivo binario (ya compilado)

Por ahora vamos a concentrarnos en el primer tipo.

/*Parcheando un código fuente*/

Supongamos que entramos a una web de algún proyecto open source, el código fuente de la aplicación que se esta creando en el proyecto esta disponible desde allí, nos ponemos a revisar el código y vemos algo como esto:

#include <stdio.h>

main() {

int *pnt;
int i, a[3]={1,2,3};

for(i=0; i<3; i++) {
pnt = &a[i];
printf(“Puntero = %d\n”, pnt);
}

return 0;

}

(Obviamente no es un programa real ni parte de ningún otro, solo un ejemplo que escribí que va a servir para demostrar el uso de los parches)

Ohh, ahí hay un error en una linea, si se compila de esa forma el programa no va a funcionar como debe.

printf(“Puntero = %d\n”, pnt);

En esa parte, hay un error en el acceso del contenido del puntero, falta el *.

Un error mínimo que no va a dar ninguna clase de problemas en la compilación pero que haría que el programa fuera inútil, sabiendo esto ¿que podríamos hacer?.

Pues una opción seria aplicarle un parche que corrija el error.

¿Como hacerlo?

En GNU/Linux disponemos de dos herramientas que hacen el trabajo extremadamente fácil.

  • diff
  • patch

Lo primero seria guardar el código fuente, como es un ejemplo, que tenga de nombre programa1.c , ahí tendríamos el programa tal cual esta con el error incluido, ahora creo otro archivo con el mismo código pero cambiado la linea del error por esta:

printf(“Puntero = %d\n”, *pnt);

De hecho ese seria el único cambio (en este caso agregar el *), el código reparado lo guardamos como programa2.c

Ahora viene la magia, diff es un programa que compara 2 archivos y muestra las diferencias de este, en este caso eso es justo lo que necesitamos.

La sintaxis:

diff programa1.c programa2.c > parche.patch

Analizando la linea notamos que compara los dos programas y las diferencias las escribe en un nuevo archivo (parche).

Ya tenemos el parche, ahora solo falta aplicarlo, esto lo vamos a hacer con otra aplicación de los sistema unix que se llama patch.

Lo que hace este es que toma las diferencias de 2 programas (el parche) y esta diferencia la aplica al archivo original.

La sintaxis:

patch -p1 -i parche.patch programa1.c

Analizando, el -p1 se puede omitir en este caso, se ocupa más que todo cuando hay parches en directorios diferentes y sirve para omitir los slash y la ruta superior, el -i viene de input y lee el archivo parche.patch

Si todo salio bien el sistema arroja este mensaje:

patching file programa1.c

Y si no hay errores el programa ya debería estar parchado :)

Ahora podemos enviarle el parche a los lideres del proyecto para que lo reparen :) .

/*Parchando un archivo binario*/

Ahora vamos al segundo caso, que pasa si el código fuente del proyecto ya fue compilado (aun con el error) y también ya fue distribuido.

Primero seria sustituir el archivo de la descarga de la web por el correcto, pero.. ¿y los usuarios? , cuando son programas muy grandes no se les puede decir que desinstalen todo y vuelvan a bajar el programa y después volver a instalarlo, en este caso es mejor aplicarle un parche que solucione el error.

Tomando como ejemplo el mismo programa, el mal acceso al contenido del puntero hace que muestre datos completamente diferentes a lo que debería:


:|

¿Como generar el parche?, pues relativamente es bastante fácil, y vamos a usar las mismas herramientas que cuando parchamos el código fuente.

Como anteriormente teníamos el código fuente original (con el error) programa1.c y el código reparado programa2.c, vamos a compilar los 2 código para generar 2 binarios.

gcc programa1.c -o programa1

gcc programa2.c -o programa2

Ahora vamos a compararlos de esta manera y a generar el nuevo parche:

diff -a –binary programa1 programa2 > patch

Revisando el comando, diff es la aplicación, el -a indica que va a tratar los archivos como texto y va a comparar linea por linea, el –binary que va a ser una comparación binaria y el parche va a ser de la misma forma, programa1 y programa2 son los archivos ya compilados y el > parche indica que la comparación va a generar un parche de nombre parche (xD) .

Con eso ya tenemos todo listo, ¿como lo aplicamos?.

Pues bastante parecido al ejemplo anterior y siempre usando patch.

La sintaxis del comando en este caso resulta bastante simple:

patch –binary programa1 parche

patch es la aplicación encargada de parchar, –binary que va a ser un trabajo binario, programa1 es el fichero al cual le vamos a aplicar el parche y parche es el nombre con el que guardamos el patch (todo debe estar en el mismo directorio).

Si tenemos éxito en estos 2 pasos tendríamos que tener algo parecido a esto y con buenos resultados :D :

Ya sirve!!

En caso de que quisiéramos facilitarle aun más el trabajo al usuario y evitar que se ponga a ejecutar comandos podríamos hacer todo automáticamente con un pequeño script en bash:

#!/bin/bash

cd /ruta donde se encuentra el binario/

wget www.webdelproyecto/parche

patch –binary programa1 parche

y con eso solo tendría que ejecutar el scrpt.

P.e: ./parcheprograma.sh

Como se dieron cuenta es un tutorial sencillo, sin muchas complicaciones pero que se puede ampliar mucho más dependiendo la cantidad de ficheros que queramos parchar el modo de hacerlo entre otras cosas, pero esto sirve como algo introductorio, hay muchos más parámetros de estas 2 herramientas que pueden conocer leyendo los manuales de estos :

man diff

man patch

:D

Y con esto termina todo, un saludo a los que leen.

Referencias:

Parche (computación)

/* By Lyoko

www.lyoko.sv.tc xD */





Sobre el SNES, NES y el mundo -1

7 10 2008

Bueno, una entrada dedicada a unos grandes clásicos :)

Hace cuanto tiempo el SNES estaba en su apogeo aquí en el país?, unos 11 años?

Si algo recuerdo bastante bien es que en esos tiempos mis tíos vivían bastante cerca de mi casa, así que varios tardes de la semana la pasábamos con ellos, a mi me gustaba bastante porque me dejaban jugar con su Super Nintendo :) , si, cuanta diversión me traia un juego que ahora es mítico y que se llamaba Donkey Kong Country.

Simplemente para un niño de 7 años pasar casi toda la tarde jugando eso era lo mejor que podía existir, ¿pero por qué hablo de esto aquí?.

Porque hasta hace poco me di cuenta que existe un emulador del SNES Para Linux de nombre ZSNES xD, en la web oficial del proyecto esta la descarga de las fuente para compilarlo uno mismo.

Cosa que me dispuse a hacer pero que me dio error porque tenia que compilarlo usando una versión del gcc menor a la que yo tengo instalada, entonces pase un buen rato buscando una solución para eso y no tener que hacer el downgrade.. Después de varias búsquedas con google, probar algunos parches (Creo que la próxima entrada del blog va a ser sobre este tema) y otras cosas, me di cuenta que el ZNES estaba en los repositorios :D jaja, hasta ya estaba pensando que después de compilarlo lo iba a empaquetar en un .deb y después lo iba a subir a Internet para ponerlo a disposición de cualquiera :S .

Entonces.. ya no era necesario compilarlo sino que solo instalarlo con el aptitude:

aptitude install zsnes

Claro que ahora con el emulador instalado, necesitaba buscar algunos juegos y como es obvio el primero que fui a buscar fue el favorito de mi niñes, después de pasar por unos cuantos lugares encontré el ROM listo para ser descargado, luego de un rato ya estaba jugando otra vez con Donkey Kong:

Pero al parecer el ZSNES da problemas con el sonido pero que se puede solucionar instalando esto:

libsdl1.2debian-oss

Y cargando el emulador con estos parámetros:

zsnes -ad sdl

Pero retrocediendo un par de años, mi diversión no era el SNES si no que el histórico NES :

Já , quien no se va a acordar de eso, el icono de este era el recontra conocido juego de Super Mario Bros, y ahora viene el porque del titulo del blog.. Me entere que en aquel juego existe un error de programación, quizá no error pero si un nivel que probablemente era con el que los desarrolladores testeaban el juego y que olvidaron eliminarlo o no lo quisieron hacer.

El famoso mundo -1 o el minus world, un nivel donde solo se puede llegar atravesando una pared y después entrar por una tubería y automáticamente llegas al mundo negativo, donde por más que llegues al final este te regresa al principio quedando en un bucle infinito donde al pasar los segundos se muere por la falta de tiempo.

Se puede leer bastante de eso en este post de Taringa!.

Al saber esto por supuesto que quería probarlo yo mismo, por lo que me puse a buscar un emulador de NES para Linux y encontré el iNES, este si no esta los repositorios por lo que hay que bajarse los binarios desde la web y correrlo con la terminal de esta manera:

./ines32 nombredelrom.nes

Para ver la ayuda del programa se hace asi:

./ines32 -help

Ya con el emulador y con el Rom de Mario también listo me puse a intentar llegar al minus world sin éxito alguno xD

Pero en el pack donde venia el Rom del Super Mario no venia solo, también venia el Super Mario 2 y 3.

Este ultimo mi favorito de esta consola, y también el juego que más me pudo enviciar en aquellos tiempos, que a pesar de no ser un juego con gráficas sorprendentes como los de ahora, de tener un control rectangular con solo 8 botones que hacia que dolieran los dedos al pasar el tiempo, tenia ese toque que podía hacer que todo niño se sintiera feliz con estar jugándolo.

Cuando me puse a jugarlo y escuche todos los sonidos y la música del juego por un momento sentí como si hubiera retrocedido el tiempo por unos segundos y otra vez tuviera 6 ó 7 años y estuviera una tarde en mi casa pasando uno de aquellos momentos de calidad :) -

Grandes clasicos, parte de la historia y que siempre valen la pena recordarlos.





LOL !

4 10 2008

Yo se que este blog no es de política, pero no saben como me reí (xDDD) con esta foto:





Esquema de colores en Vim

1 10 2008

En la entrada anterior puse una captura de mi vim, pero que no coloreaba las funciones (en ese momento no sabia por qué había dejado de hacerlo xD).

Resulta que anteriormente ya había reinstalado vim pero no fue solo una reinstalación sino que también le pase el parámetro –purge (borre toda la configuración y la deje como estaba por default), y para que vim coloree como debe de ser hay que descomentar un par de lineas de este archivo:

/etc/vim/vimrc

Descomentar la linea:

syntax on

Y también:

set background=dark

Guardar y con eso ya debería mostrarse como debe:


:)