logotipo

img_google
Mediterrania
Informática, inteligencia artificial, web, diseño, programación...
Tira ECOL
Sindicación
Directorios de Bitácoras
Contador de visitas

Site Counter
 
Parón por exámenes
Este blog va a estar unos días parado debido a los exámenes y otros compromisos académicos. Además, me estoy planteando alojarlo en un servidor de pago con dominio propio, así que quizá os sorprenda dentro de unas semanas.

Hasta entonces, un saludo.

PD: sigo teninendo cuentas de Gmail, por si a alguien le interesan...
 
La guerra del ancho de banda
Leo en Trasteando que Telefónica ha confirmado, por fin, que van a doblar la velocidad del ADSL manteniendo el precio.

Pero no es la única empresa que se ha puesto las pilas:


Conclusión, salimos todos ganando :-)
 
Compartiendo mi spam (II)
Tras el anterior post sobre el spam he seguido investigando un poco sobre el SpamAssassin y cómo compartir las bases de datos bayesianas de otras personas para mejorar más aún el filtrado.

Mirando entrre la lista de opciones de sa-learn hay dos que nos sirven para esto: una es la exportar la base de datos, y otra es la de indicar un PATH del que leer la base de datos importada.

Para exportar la base de datos basta con teclear:
sa-learn --dump all > fichero

El tamaño de fichero puede ser bastante grande por lo que recomiendo comprimirlo, pues al ser texto se reducirá mucho (a mí me ha pasado de 15M a 2,3M):
comprimir: bzip2 -z -9 fichero
descomprimir: bunzip2 fichero.bz2

Con esto tendremos en el archivo fichero.bz2 nuestra base de datos.

Si lo que queremos es importar una base de datos bastará con teclear:
sa-learn --dbpath path_al_fichero

Por último indicaros que aquí dejo colgada mi base de datos bayesiana comprimida con el bzip2. Si os la vais a decargar tened en cuenta que son 2,3M y que eso es mi portátil y no lo tengo siempre enchufado. Si tenéis mucho interés os la puedo enviar por e-mail.
 
Introducción a make (parte II)
En este segundo artículo de la serie pretendo explicar el uso de varibles. En verdad no tiene mucho sentido utilizar make como se vió en el artículo anterior, pues el tamaño del Makefile es excesivo lo que lleva a que sea poco práctico.

Esto mejorará con el uso de las variables, que veremos hoy, y con el uso de sufijos, que veremos en el último artículo.

Las variables de un fichero Makefile tienen la siguiente forma: ${nombre}$ o $(nombre). Una variable se puede usar para indicar cualquier cosa de un fichero Makefile excepto el nombre de una regla. Por ejemplo, la usaremos para indicar el compilador, los flags de compilación, las librerías, los ficheros fuente, etcétera.

Veamos un ejemplo de uso de flags:
CC = g++
LIB = -lm -lGL -lglu
BIN = main

all: result

result: main.cpp main.h
  ${CC} -o ${BIN} main.cpp ${LIB}

Como se puede observar, las variables hacen que el Makefile sea mucho más generalizable y reutilizable.

Veamos cómo modificar el fichero del otro día, introduciendole variables:
CC = g++
OPTS = -Wno-deprecated -O3
CLIBS = -lm
OPENGL = -lglut -lGL -lGLU
OBJS = Algebra.o FuenteLuminosa.o Camara.o Escena.o RGB.o Render.o Primitiva.o

RESULT = raytracer


all: $(RESULT)

Algebra.o: Algebra.cpp Algebra.h
   ${CC} -c Algebra.cpp $

Camara.o: Camara.cpp Camara.h
   ${CC} -c Camara.cpp

FuenteLuminosa.o: FuenteLuminosa.cpp FuenteLuminosa.h
   ${CC} -c FuenteLuminosa.cpp

RGB.o: RGB.cpp RGB.h
   ${CC} -c RGB.cpp

Primitiva.o: Primitiva.cpp Primitiva.h
   ${CC} -c Primitiva.cpp

Render.o: Render.cpp Render.h
   ${CC} -c Render.cpp

Escena.o: Escena.cpp Escena.h
   ${CC} -c Escena.cpp

raytracer: ${RESULT}.cpp ${OBJS}
   ${CC} -o ${RESULT} ${OBJS} ${RESULT}.cpp ${CLIBS} ${OPENGL} ${OPTS}

Cualquier duda o consulta que os surja no dudéis en preguntármela.

El próximo día veremos cómo hacer un Makefile mucho más generalizable aprovechando una de las características avanzadas del make.
 
Muy divertido
 
Compartiendo mi spam
Para aquellos que sufrais problemas de spam os recomiendo Spamassassin. Decir antes que nada que sólo está para GNU/Linux y OSX.

No pretendo explicar el funcionamiento, ni la instalación, ni nada por el estilo. Para ello os doy esta serie de links:


Yo en concreto, en casa tengo SpamAssassin con procmail y me va de perlas.

Lo que quería comentar en este post es que es posible entrenar al propio SpamAssassin con conjuntos de e-mails que ya sepamos que son spam y con conjuntos de e-mails que no queremos que sean clasificados como spam. Esto se conoce como aprendizaje con muestras positivas (spam) y negativas (no-spam). Para ello hay que tener los e-mails guardados, en formato mbox por ejemplo.

Por ejemplo, si nuestro buzón mbox se llama spam entonces para aprender muestras positivas teclearemos:
sa-learn --spam --mbox spam

Si queremos que tome como muestras negativas nuestro buzón de entrada (inbox) lo haremos así:
sa-learn --ham --mbox inbox


Realizar esto de vez en cuando ayuda a reducir la tasa de falsos positivos. De hecho a mí es raro el día que se me cuela algún e-mail spamoso.
 
Introducción a make (parte I)
Make es una herramienta de GNU ampliamente utilizada a la hora de compilar proyectos en los que haya involucrados varios ficheros de código fuente y en los que unos dependan de otros. Es muy utilizada en el mundo UNIX/Linux.

Make se encarga de ayudarnos en la compilación, permitiendo compilar el proyecto entero, recompilando sólo aquello que haya sido modificado, y reduciendo la compilación a la simple ejecución de la orden make.

Os quiero presentar en 3 artículos cómo aprovecharse de las facilidades de make para compilar pequeños proyectos. Me basaré en el Makefile que estoy utlizando para el raytracer.

Para utlizar make debemos escribir un fichero makefile, en donde indicaremos tanto los ficheros a compilar, como el compilador, etcétera. Si el nombre del fichero makefile es Makefile o makefile bastará con ejecutar make a secas para que él sólo se encargue de buscar el fichero makefile en el directorio actual. Si por lo que sea no vamos a utlizar ninguno de esos dos nombres habrá que invocar a make con el argumento -f:
make -f nombre_del_fichero

Bien, veamos ahora la sintaxis de un fichero Makefile. Para ello supondremos que el fichero principal del proyecto (donde se encuentra el main) es raytracer.cpp. Junto con este, se encuentran las clases: Primitiva.cpp, FuenteLuminosa.cpp, RGB.cpp, Escena.cpp, Render.cpp y Algebra.cpp, todos con sus correspondientes .h. El binario final se llamará raytracer y para generarlo necesitaremos llamar al compilador más o menos así:
g++ -o raytracer Algebra.o FuenteLuminosa.o Camara.o Escena.o RGB.o Render.o Primitiva.o raytracer.cpp -lm -lGL -lGLU -lglut -Wno-deprecated -O3 -lfl

Esta orden la podemos incluir en el Makefile como sigue:
all: raytracer

raytracer: raytracer.cpp Algebra.o FuenteLuminosa.o Camara.o Escena.o RGB.o Render.o Primitiva.o
   g++ -o raytracer Algebra.o FuenteLuminosa.o Camara.o Escena.o RGB.o Render.o Primitiva.o raytracer.cpp -lm -lGL -lGLU -lglut -Wno-deprecated -O3 -lfl

Make, cuando lee un fichero Makefile busca la etiqueta all a la que siguen una serie de objetivos, los cuales busca y ejecuta. En este caso el único objetivo que hay es la regla raytracer la cuál ejecutará si alguno de los ficheros indicados después de los dos puntos ha sido modificado desde el último make realizado. Con ello se consigue compilar sólo cuando haga falta, es decir, cuando algo haya cambiado.

Como veis, para generar el binario dependemos de haber generado antes todos los ficheros objeto de las clases. Lo que haremos será crear una regla para cada clase que llame al compilador. Veamos el Makefile directamente:
all: raytracer

Algebra.o: Algebra.cpp Algebra.h
   g++ -c Algebra.cpp

Camara.o: Camara.cpp Camara.h
   g++ -c Camara.cpp

FuenteLuminosa.o: FuenteLuminosa.cpp FuenteLuminosa.h
   g++ -c FuenteLuminosa.cpp

RGB.o: RGB.cpp RGB.h
   g++ -c RGB.cpp

Primitiva.o: Primitiva.cpp Primitiva.h
   g++ -c Primitiva.cpp

Render.o: Render.cpp Render.h
   g++ -c Render.cpp

Escena.o: Escena.cpp Escena.h
   g++ -c Escena.cpp

raytracer: raytracer.cpp Algebra.o FuenteLuminosa.o Camara.o Escena.o RGB.o Render.o Primitiva.o
   g++ -o raytracer Algebra.o FuenteLuminosa.o Camara.o Escena.o RGB.o Render.o Primitiva.o raytracer.cpp -lm -lGL -lGLU -lglut -Wno-deprecated -O3 -lfl

Ahora el funcionamiento será el siguiente: al hacer make por primera vez de la regla all se pasará a la regla raytracer. La regla raytracer comprobará las dependencias: primero mirará si raytracer.cpp se ha modificado desde el último make. Imaginemos que no. Ahora pasará a la regla Algebra.o y comprobará las fechas de las dos dependecias de ésta (Algebra.cpp y Algebra.h). Si han sido modificados ejecutará el código asociado, es decir, generará de nuevo el fichero objeto. Así sucesivamente hasta el final de las dependencias de raytracer que llevará a ejecutar la orden de compilación final.

Espero que os sirva para comenzar a desenvolverse un poco con make. En el siguiente artículo veremos cómo utilizar variables para generalizar más los ficheros y hacerlos menos pesados.

Si tenéis cualquier duda no dudéis en consultarmela.


 
Tutti frutti
 
Regalo dos invitaciones para Gmail
Las dos primeras personas que me digan 5 cosas que les gustan del blog y 5 cosas que cambiarían se llevan sendas cuentas de Gmail.
 
Volviendo a las andadas
Por fin me han arreglado el blog. Espero seguir con la marcha normal de publicación de posts durante estos días. Aunque voy a tener menos tiempo de lo normal: las fechas de exámenes se acercan.

<autobombo>Por si nunca lo he comentado estudio Ingeniería Informática en la Politécnica de Valencia. Teóricamente terminaré la carrera este septiembre, con un examen que tengo el día 7 y con la lectura del Proyecto Final de Carrera, allá por el 20.</autobombo>

Estos días he estado ocupando desarrollando un pequeño raytracer para las prácticas de la asignatura que me falta. Os enseño como me va quedando y quizá me anime y comente algunos aspectos en una serie de artículos.