13 dic 2008

fórmulas en gráficos con xfig (y de ahi a documentos Latex)

Es posible insertar fórmulas Latex en gráficos creados con Xfig, y que posteriormente podremos usar en documentos Latex (o por ejemplo con Lyx).

Para hacerlo, tendremos que escribir un bloque de texto en xfig, habilitar el flag "Special", usar una fuente Latex, y escribir la fórmula con syntaxis Latex encerrada entre caracteres $. Por ejemplo:

señal $Y_{i}(t)$

Cuando tenemos nuestro gráfico, lo exportamos con xfig a Combined PS/Latex(both formats), lo que nos creará dos archivos archivo_fig.pstex_t y archivo_fig.pstex.
Creamos ahora un archivo figura.tex con el código:


\documentclass{article}
\usepackage{epsfig}
\usepackage{color} (puede que no sea necesario)
\setlength{\textwidth}{100cm}
\setlength{\textheight}{100cm}
\begin{document}
\pagestyle{empty}
\input{figura.pstex_t}
\end{document}
Lo guardamos y ejecutamos:
latex figura.tex
Obtenemos un archivo figura.dvi, que convertiremos a EPS (Encapsulated Postcript) con
la orden:
dvips -E figura.dvi -o figura.eps
Una vez que tenemos el archivo .eps, lo incluimos como imagen en nuestro documento Latex(o Lyx).

12 dic 2008

Creacion de parches con diff

Si tenemos un proyecto contenido en un directorio, con sus subdirectorios y archivos asociados, es útil crear parches cuando hacemos modificaciones.
1 ejemplo claro es cuando modificamos las fuentes del kernel de Linux para adaptarlo a alguna plataforma especial.

El modo de proceder es simple, una vez que se sabe claro.
Supongamos que tenemos el directorio linux-2.6.26-modificado y el directorio original de la misma versión linux-2.6.26, y queremos crear un parche para no tener que almacenar para siempre todos los archivos del kernel, por si los volvemos a necesitar. Crearemos el parche con la siguiente orden, desde el directorio que contiene a ambos directorios:

diff -Naur linux-2.6.26 linux-2.6.26-modificado > nombre_parche.patch

De esta forma creamos el parche nombre_parche.patch que contiene todos los cambios del directorio modificado respecto del original.

Cuando necesitemos de nuevo nuestro kernel modificado, descargamos la version del mismo original, copiamos el parche en su directorio, y ejecutamos la siguiente orden desde dentro de dicho directorio:

patch -p1

Y ya tendriamos el kernel con las modificaciones que realizamos en su día.

1 dic 2008

Argumentos en la linea de órdenes para programas en C

Existen unas funciones muy útiles para "filtrar" los argumentos en la linea de ordenes pasados a un programa en C al estilo Unix, esto es:

nombre_programa -o archivo.txt -d 40....

Cuando tenemos el código de nuestro programa, los argumentos son pasados a la funcion main() en dos variables llamadas argc(entero) y argv(array de punteros a cadenas de caracteres, es decir **), siendo argv[0], el primer argumento pasado, argv[1] el segundo, y asi sucesivamente hasta alcanzar argc argumentos.


Tenemos las funciones getopt y getopt_long que nos permiten "parsear" o analizar sintácticamente los argumentos que le pasemos. A estas funciones se les pasa directamente argc y argv, además de una cadena en la que se indican los caracteres de opción a contemplar y si llevan o no un parámetro asociado a continuación. Las funciones devuelven el carácter opción leído o -1 en caso de haber alcanzado el final.
Con esto podemos extraer las opciones que nos han pasado como argumentos independientemente del orden, ya que llamaremos a la función en cuestión (getop o getopt_long)hasta alcanzar el final, indicando en cada ejecución todas las opciones.
1 ejemplo:

int main(int argc,char **argv)
{
int c;
while((c=getopt(argc,argv,"p:n:b:t:d:m:")) != -1){
switch (c) {
case 'p':
//Código asociado a la ipción -p.
break;
case 'n':
//Código asociado a la ipción -n.
break;
case 'b':
//Código asociado a la ipción -b.
.
.
.
default:
printf("Uso: app_spi_slave [-p X][-n X][-b X][-t X][-d X]");
return 1;
}
}
return 0;
}


Como podemos ver, el tercer argumento de getopt es una cadena con los caracteres asociados a cada opción, seguida del carácter ":" que indica que después de dicha opción viene un argumento. Si no hay argumento asociado, basta con no poner el carácter ":".
Para usar el valor pasado a la opción, tenemos la variable optarg, que contiene el argumento de la opción que está siendo analizada. Ésta variable es una cadena de caracteres, por lo que habrá que convertirla al formato que necesite (si es un numero podremos usar al función atoi()).
Como podemos ver en el ejemplo, la función itera una vez en la lista de argumentos, quedándose preparada para acceder a la siguiente cuando la volvamos a ejecutar.

Hemos utilizado la función getopt, pero ¿que hay de getopt_long?
Pues esta segunda función nos permite hacer lo mismo, salvo que tiene dos argumentos mas, uno de ellos es un array de estructuras de tipo struct opts (definida en getopt.h) en las que se asocia un nombre largo a cada opción para poder hacer algo como lo siguiente:

nombre_programa --polarity 1 --outpu nombre_arcivo.txt ....

Para mas información se recomienda acudir a las paginas man para getopt ejecutando:
man 3 getopt