viernes, 26 de agosto de 2011

API del reproductor ActionScript 3.0 de YouTube : No se detiene o elimina el video con destroy() o stop()

Personalizar un reproductor en flash para youtube usando las apis que proporciona puede ser por momentos un dolor de cabeza, debido a que los videos que se estan visualizando son casi imposibles de eliminar o destruir del reproductor, lo que iindica sus apis al usar player.stopVideo():Void o player.destroy():Void el video en curso es detenida su carga y elimina todas sus referencias pero ninguna de estas funciones se ejecuta correctamente, el video sigue ejecutandose en segundo plano.
El swf descargado desde loader.load(new URLRequest("http://www.youtube.com/apiplayer?version=3")); que es el reproductor sin bordes, botones y otras caracteristicas aparte de cargar el video que se le indica tambien carga publicidad, videos recomendados lo cual genera referencias entre los objetos creados que luego no se pueden eliminar, creo que este es el principal motivo y es muy complicado la eliminacion del video.

domingo, 15 de mayo de 2011

La nube de Redhat se llama OpenShift

OpenShift es la nube de la empresa RedHat , tiene tres tipos de servicios destinados a diferentes necesidades de los usuarios o empresas:
OpenShift Express: Destinada a desarrolladores ademas que es gratuita y no es escalable , tiene las siguientes caracteristicas.
Supported software
 PHP 5.3.2
 Ruby 1.8.7
 Python 2.6.5
Express platform
 Red Hat Enterprise Linux 6
 SQLite 3.6.20
 Apache HTTP 2.2.15
 128 MB of storage space for application files
 256 MB of RAM
Express client tools requirements
 Git
 Ruby
 OpenSSH

La suscripcion a este servicio no tiene muchas complicaciones, solo que hay que tener en cuenta que las caracteristicas de este servicio son muy limitadas como muchos servicios gratuitos, no hay control de panel para administracion, no se puede agregar dominios solo redhat provee un subdominio (nombredelaaplicacion-nombredelsubdominio.rhcloud.com ) y no se permite que la aplicacion desarrollada se use para produccion.

OpenShift Flex: Destinada a desarrolladores, es gratuita y escalable tiene las siguientes caracteristicas.
Supported Software
 Apache Web Server 2.2.3
 Apache Tomcat 6.0.18
 JBoss Application Server 6.1.0
 Java – JDK 6.0
 PHP 5.2.10
 MySQL 5.1.52
 Memcached 1.4.5
 MongoDB 1.6.5
 Zend Framework 1.10.8
Supported Clouds
 Amazon EC2

Para acceder a este servicio se debe de tener una cuenta en amazon:

Request Access to Flex

We'll need a little information get to you access to the Developer Preview.

    First, we'll need your Amazon account number (e.g. 1234-1234-1234). Your account number will allow us to share the Flex Amazon Machine Images with your account.

OpenShift Power: Destinado para produccion con todas las caracteristicas para desarrollar y poner en funcionamiento aplicaciones en la nube, por el momento no hay forma de adquirir este servicio sin tener contacto directo con el soporte de Redhat.



viernes, 22 de abril de 2011

Problemas para crear el codigo html para los objetos flash ?

Si tiene algun problema al crear el codigo html para asi poder colocar su aplicacion flash en su web, SwfObject es la solucion, permite de una forma sencilla la generacion del codigo necesario para solucionar problemas tan comunes como el modo FullScreen que no funciona correctamente en internet explorer (ie6,ie7).
SwfObject es software libre y maneja estandares, ademas es compatible con la mayoria de navegadores web.
Documentacion en castellano

martes, 22 de marzo de 2011

Proyectos Opensource de Adobe

Talvez pocos son los que conocen de la existencia de una rama opensource en la empresa Adobe. Para sorpresa de algunos Adobe tambien apuesta por el software libre pero asu manera.
Algunos de estos proyectos libres personalmente los uso para el desarrollo de aplicaciones Flash, Air.
Uno de esos proyectos que mas uso es Alchemy que me permite convertir librerias escritas en ANSI C en codigo actionscript 3, ademas flex sdk que me permite desarrollar aplicaciones flash.
La web opensource de adobe
La lista completa de sus proyectos opensource
Publicare algunos ejemplos sobre alchemy en algun nuevo post ya que me parece el mas interesante de sus proyectos.

domingo, 20 de marzo de 2011

Silenciar el pitido que emite la computadora

Aveces es molestoso escuchar el pitido que emite el parlante de la computadora cuando se esta en un terminal y se esta usando el tabulador o se cometio algun error al digitar.
Con este par de comandos(para modo consola y entorno grafico) se silencia el pitido:

setterm -blength 0
xset -b

sábado, 19 de marzo de 2011

Variables de entorno para instalaciones personalizadas

Si esta copilando e instalando nuevas librerias y programas pero no quiere que estas sobreescriban versiones existentes en su sistema operativo Unix. Puede crear una nueva estructura de directorios para instalarlas ahi por ejemplo:
mkdir $HOME/cualquierpath
mkdir $HOME/cualquierpath/bin
mkdir $HOME/cualquierpath/sbin
mkdir $HOME/cualquierpath/lib
mkdir $HOME/cualquierpath/etc
mkdir $HOME/cualquierpath/share
mkdir $HOME/cualquierpath/include

Ahora puede copilar su libreria indicandole donde tiene que instalarlo, para ello es necesario que tenga generado el archivo configure y pasarle la variable siguiente:
./configure --prefix=$HOME/cualquierpath
make ; make install
Para la ejecucion del nuevo programa instalado es necesario modificar la variable de entorno PATH y LD_LIBRARY_PATH
PATH=$HOME/cualquierpath/bin:$PATH
LD_LIBRARY_PATH=$HOME/cualquierpath/lib miprograma

viernes, 18 de marzo de 2011

Drupal 7 y mongodb

Drupal 7 no trae por defecto integracion con la base de datos no relacional mongodb, en el proceso de instalacion solo son mostrados mysql, postgres entre otras, pero en ningun momento de la instalacion aparece mongodb.
La unica forma de poder usar mongodb en drupal 7 es atravez del modulo mongodb pero solo permite la sustitucion de algunas tablas/registros de las bases de datos relacionales como "_watchdog" como lo indica su documentacion:

  • D7: mongodb_cache: Store cache items in mongodb.
  • D7: mongodb_field_storage: Store the fields in mongodb.
  • D7: mongodb_session: Store sessions in mongodb.
  • D6/D7: mongodb_watchdog: Store the watchdog messages in mongodb. Note this needs a core patchapplied or it will create a separate collection for every 404 message. It breaks some unimportant functionality, read the issue on why it was rolled back.
  • D6/D7: mongodb: support library for the other modules
  • D7: mongodb_block: Store block information in mongodb. Very close to the core block API.
  • D7: mongodb_queue: DrupalQueueInterface implementation using mongodb.
No se puede sustituir completamente mysql por ejemplo con mongodb y ademas es un problema tener en funcionamiento al mismo tiempo 2 bases de datos ya que perjudica el rendimiento en el servidor.


Fastcgi en apache

Para poder ejecutar programas o scripts en el servidor apache mediante el modulo fastcgi debe tener en cuenta algunas recomendacion.
Dependiendo de la version del servidor apache que este usando , es necesario activar el modulo mod_fcgid.so y configurar los virtual host en la configuracion de apache para poder ejecutar fastcgi.
En este caso solo se programara en C el ejemplo, tambien se puede usar otros lenguajes de programacion por ejemplo java, perl, tcl, etc.
Existen varios ejemplos que se pueden encontrar por internet pero la gran mayoria no funcionan, es necesario tener instalado la libreria fcgi lo puede obtener atravez de la herramienta que le proporciona su distribucion de linux o puede obtener el codigo fuente en este link http://mirror.star4u.org/ubuntu/pool/universe/libf/libfcgi/libfcgi_2.4.0.orig.tar.gz , en el codigo fuente existe ejemplos que solo hay que copilarlo y hacerlo funcionar.
Por ejemplo echo.c
/*****************************/

/*
* echo.c --
*
* Produce a page containing all FastCGI inputs
*
*
* Copyright (c) 1996 Open Market, Inc.
*
* See the file "LICENSE.TERMS" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
*/
#ifndef lint
static const char rcsid[] = "$Id: echo.c,v 1.5 1999/07/28 00:29:37 roberts Exp $";
#endif /* not lint */

#include "fcgi_config.h"

#include

#ifdef HAVE_UNISTD_H
#include
#endif
extern char **environ;
#include "fcgi_stdio.h"


static void PrintEnv(char *label, char **envp)
{
printf("%s:
\n
\n", label);
for ( ; *envp != NULL; envp++) {
printf("%s\n", *envp);
}
printf("

\n");

}

int main ()
{
char **initialEnv = environ;
int count = 0;

while (FCGI_Accept() >= 0) {
char *contentLength = getenv("CONTENT_LENGTH");
int len;

printf("Content-type: text/html\r\n"
"\r\n"
"FastCGI echo"
"

FastCGI echo

\n"
"Request number %d, Process ID: %d

\n", ++count, getpid());


if (contentLength != NULL) {
len = strtol(contentLength, NULL, 10);
}
else {
len = 0;
}

if (len <= 0) {
printf("No data from standard input.

\n");

}
else {
int i, ch;

printf("Standard input:
\n
\n");
for (i = 0; i <>
if ((ch = getchar()) <>
printf("Error: Not enough bytes received on standard input

\n");

break;
}
putchar(ch);
}
printf("\n

\n");

}

PrintEnv("Request environment", environ);
PrintEnv("Initial environment", initialEnv);
} /* while */

return 0;
}
/*****************************/


Para copilarlo:
gcc -o echo.fcgi echo.c -lfcgi
Tenga en cuenta la extension del archivo (.fcgi) generado debe ser la que se configuro en el apache para poder ejecutar fastcgi.
Lo puede ejecutar en una consola el binario obtenido le mostrara una salida formateada en html, pero la forma correcta es atravez de un navegador web, ejecute http://midominio.com/echo.fcgi

Si tiene alguna duda, consulte la documentacion de fastcgi http://www.fastcgi.com/drupal/node/6



jueves, 17 de marzo de 2011

Shapado: Preguntas y respuestas un mar de bugs

Tenia que instalar en un VPS un sistema web de preguntas y respuestas, busque varios soluciones libres disponibles despues de testear varias opte por shapado hecho en ruby.
No se programar en ruby creo que este a sido un problema al tratar de hacer funcionar shapado, pero al final funciono pero no en la forma como queria.
Cuando se quiere programar en php al instalarlo en el servidor sus dependencias considero que son pocas, pero con ruby la cosa cambia radicalmente , desarrollar una aplicacion web si es que no se tiene experiencia puede ser un dolor de cabeza.
Recuerdo que tenia que instalar una gran cantidad de dependencias de ruby on rails lo cual a generado que ocupe mas espacio en disco y en un VPS puede traer problemas ya que hay limitacion de disco.
La integracion con el servidor apache es algo confuso no hay mucha documentacion, hay que instalar varios programas para que una aplicacion hecha en ruby funcione correctamente integrada con el servidor.
Lo interesante de Shapado es que usa una base de datos no relacional que es mongodb, bueno lo interesante acaba en la base de datos, ya que si se quiere que funcione shapado en el menor tiempo posible hay que ser un experto en este tema, su documentacion tambien es algo limitada, para hacerlo funcionar este tiene su propio servidor integrado y ademas tiene modos de funcionamiento segun recuerdo "desarrollo", "produccion" y otro mas .
Creia que en el modo de "produccion" era el que obviamente se tenia que usar para ponerlo en linea pero resulta que no es asi es parecido al mode de "desarrollo". En modo "produccion" genera logs innecesarios y ademas las respuestas del servidor son demasiados lentas.
Para ser usado realmente en "produccion" se debe de integrar con el apache y en este condiciones su funcionamiento trae menos problemas.
Shapado tiene varios bugs que ya estan documentados hace un buen tiempo pero no lo han corregido en sus ultimas versiones, como por ejemplo:
El manejo de tags , se debe de revisar los logs para darse cuenta que la sugerencia de tags no funciona y hay que parchar el codigo.
Cuando agregue los tags a su pregunta poner al final la coma correspondiente, si solo es un tag y no hay coma esta no sera procesada correctamente.
Su buscador no pagina bien , muestra los mismos resultados en cualquier pagina (1,2,3,4..).
Bajo ciertas condiciones shapado no concluye la peticion que esta solicitando el usuario y provoca un error 500 en el apache.
Si tiene la fortuna que su primera pregunta se ha colocada correctamente en la base de datos eso indica que se ahorro otro problema , shapado una vez instalado y funcionando no procesa correctamente la primera pregunta que se le agregue, aveces es necesario colocar preguntas y respuestas en modo "desarrollo" para que en modo "produccion" funcione correctamente.
De todos los bugs que he enumerado considero que el mas grave es cuando el servidor web envia un error al usuario indicando que hay problemas en la web.
En un VPS la memoria y espacio en disco son limitados(de acuerdo al plan que tenga) shapado consume en memoria entre 150 y 200 megas sin incluir el consumo de los demas procesos generados.

Wt C++ Web toolkit: Creando aplicaciones web con C++

Cuando se desarrolla aplicaciones web aveces no se toma en cuenta el rendimiento de la aplicacion , recien se considera este punto cuando nuestra web comienza a tener muchas visitas y se genera varios problemas en el servidor, peor aun si es un hosting compartido.
Decidi investigar como mejorar las aplicaciones web, para optimizar su uso de memoria y uso de la cpu y encontre este framework WT hecho completamente en C++.
Despues de leer su manual, compile y por fin logre tener un "Hola Mundo" que hice funcionar en el servidor web apache en Linux , el resultado fue algo fustrante , el famoso "Hola Mundo" hecho en WT ocupaba en promedio 64Kbytes , la respuesta del servidor web era algo lenta y lo mas problematico es que la aplicacion provocaba fallos en memoria "segment fault" y el proceso generado quedaba en estado "Zombi" lo cual le era imposible al apache eliminarlo y quedaba el proceso ocupando recursos del servidor.
Una pequeña aplicacion hecha en WT podia ocupar mas de 1mega y ademas sus dependencias como el boost consumian mas recursos y la poca estabilidad de estas aplicaciones podian provocar inestabilidad al servidor.
Solo realize pocas pruebas pero el resultado final no era lo que esperaba, no recomendaria WT para el desarrollo de aplicaciones web.

jueves, 29 de julio de 2010

Colores en printf

Se puede imprimir en la pantalla en colores al usar la funcion printf (....) como se muestra en este ejemplo:

/*********color_printf.c*************/
#include < stdio.h >
int main ()
{
printf ("\033[30m Salida en color: Negro\n");
printf ("\033[31m Salida en color: Rojo\n");
printf ("\033[32m Salida en color: Verde\n");
printf ("\033[33m Salida en color: Amarillo\n");
printf ("\033[34m Salida en color: Azul\n");
return 0;
}
/************************************/
Compilacion:
gcc -Wall -o color_printf color_printf.c
Salida en pantalla:

Salida en color: Negro
Salida en color: Rojo
Salida en color: Verde
Salida en color: Amarillo
Salida en color: Azul

domingo, 25 de julio de 2010

The UNIX® System

Si quiere conocer mas acerca de los sistemas operativos UNIX , puede visitar el sitio http://www.unix.org donde encontrara mucha informacion de sus especificaciones e historia

Matar Procesos

Un ejemplo en C de como matar procesos usando para ello la llamada al sistema int system(const char *string); que permite la ejecucion de una orden del interprete de comandos (shell).
Para mas informacion sobre esta funcion en su manual " man system " o si quiere este manual en castellano " man -L es system ".

/********matar_proceso.c********/
#include < stdio.h >
#include < string.h >
#include < stdlib.h >

int main(int argc, char **argv)
{
char *tmpStr;
int i,len,lenB;
char *Kill="kill -9 ";
char *killtotal=NULL;

for (i = 0; i < argc; i++)
{
tmpStr = argv[i];
if ( (strcmp(tmpStr,"-h")==0)||(strcmp(tmpStr,"--help")==0) ||\
(strcmp(tmpStr,"--usage")==0)||(strcmp(tmpStr,"-help")==0) || argc==1)
{
printf("\n");
printf("Usar: matar_proceso --pid IDPROCESO \n");
printf(" --help\n");
printf(" --version Version\n");
printf(" --pid\n");
printf("\n");
exit(0);
}

if((strcmp(tmpStr,"--pid")==0))
{
len=strlen(argv[i+1]);
lenB=strlen(Kill);
killtotal=(char*)malloc(len+lenB);
memset(killtotal,'\0',(len+lenB));
strcpy(killtotal,Kill);
strcat(killtotal,argv[i+1]);
}
if((strcmp(tmpStr,"--version")==0))
{
printf("0.1\n");
exit(0);
}
}
if(killtotal!=NULL)
{
printf("Matando el proceso --> %s\n",killtotal);
system(killtotal);
free(killtotal);
}
return 1;
}


/********************/
Compilacion:
gcc -Wall -O2 -o matar_proceso matar_proceso.c

jueves, 22 de julio de 2010

Manejo de colores y fuentes en Xlib

El manejo de colores y de fuentes en Xlib puede ser algo confuso o complejo para algunos que recien comienzan a programar unsando las librerias base del Xserver las Xlib.
En este ejemplo se muestra como crear una ventana y luego en ella colocar texto con un tamaño y color determinado.

/**********x11_1.c*************/

#include < X11/Xlib.h >
#include < X11/Xutil.h >
#include < stdio.h >
#include < string.h >

/*
Retorna el color mas proximo del mapa de colores
*/
unsigned long Buscar_color_nombre( Display *display, char *Nombre )
{
XColor color, temp;
XAllocNamedColor( display,DefaultColormap(display,DefaultScreen(display)),Nombre, &color, &temp );
return color.pixel;
}


int main()
{
Display *display;
Window window;
GC gc;
Font fuente;
char *Texto1 = "Test: Fuentes en Xlib";
char *Texto2 = "Color Rojo";
char *Texto3 = "Color Verde";

display = XOpenDisplay( NULL );
window = XCreateSimpleWindow( display,DefaultRootWindow( display ),100, 100, 300, 200, 1, 0, 1 );
XMapWindow( display, window );

gc = XCreateGC( display, window, 0, NULL );
fuente = XLoadFont( display, "9x15" );
XSetForeground(display, gc, Buscar_color_nombre(display, "white"));
XSetFont( display, gc, fuente );
XDrawString( display, window, gc, 10, 50, Texto1, strlen(Texto1) );
XSetForeground(display, gc, Buscar_color_nombre(display, "red"));
XDrawString( display, window, gc, 10, 80, Texto2, strlen(Texto2) );
XSetForeground(display, gc, Buscar_color_nombre(display, "green"));
XDrawString( display, window, gc, 10, 110, Texto3, strlen(Texto3) );

XFlush( display );
getchar();
}


/******************************/
Compilacion:
gcc -o x11_1 x11_1.c -lX11

miércoles, 21 de julio de 2010

Señales en C

Un pequeño programa que implementa el manejo de señales en c en base a estructuras y punteros.

/**********signal_c.c**************/
#include

struct Punteros_a_Funciones{
void (*leer)();
};
typedef struct Punteros_a_Funciones puntero_a_func;
typedef void* data;
#define VOID_POINTER (void*)
#define SIGNAL_FUC(f) ((SignalFunc)f)
typedef void (*SignalFunc) (void);

void signal_1()
{
printf("signal_1\n");
}

void signal_2()
{
printf("signal_2\n");
}
puntero_a_func Pasando_punteros(SignalFunc funci)
{
puntero_a_func puntero = { SIGNAL_FUC(funci)};
return puntero;
}
int main()
{
puntero_a_func Voides;
SignalFunc funci;

funci=signal_1;
Voides = Pasando_punteros(funci);
Voides.leer();

funci=signal_2;
Voides = Pasando_punteros(funci);
Voides.leer();
return 0;
}

/**********************************/
Compilacion:
gcc -o signal_c signal_c.c

domingo, 18 de julio de 2010

Modificar la posicion en pantalla de una aplicacion X en ejecucion

Se puede modificar algunos parametros de una aplicacion X en ejecucion para ello solo es necesario conocer la ID de esa aplicacion. El programa xwininfo nos puede ayudar para este proposito (lease su manual --> man xwininfo) su modo de uso es el siguiente.
Al ejecutar en consola el xwininfo este cambiara el cursor a una forma de cruz lo que nos indica que debemos seleccionar la aplicacion X que queremos saber sus propiedades, solo haga crick en la ventana de la aplicacion y xwininfo mostrara una salida como la siguiente:
------------------------
xwininfo: Please select the window about which you
would like information by clicking the
mouse in that window.

xwininfo: Window id: 0x1a0000d "xterm"

Absolute upper-left X: 5
Absolute upper-left Y: 25
Relative upper-left X: 0
Relative upper-left Y: 0
Width: 501
Height: 316
Depth: 16
Visual Class: TrueColor
Border width: 0
Class: InputOutput
Colormap: 0x20 (installed)
Bit Gravity State: NorthWestGravity
Window Gravity State: NorthWestGravity
Backing Store State: NotUseful
Save Under State: no
Map State: IsViewable
Override Redirect State: no
Corners: +5+25 -774+25 -774-683 +5-683
-geometry 80x24+1+1

-----------------------
Lo que interesa es la ID de la aplicacion que se encuentra en la siguiente linea
xwininfo: Window id: 0x1a0000d "xterm"
La iD sera ==> 0x1a0000d
Pero para el uso dela aplicacion C que permitira cambiarle sus propiedades es necesario usar un valor decimal ya que lo que muestra por defecto la aplicacion xwininfo es en hexadecimal. Para ello solo hay que agregarle el siguiente parametro:
xwininfo -int
Y mostrara el siguiente resultado
xwininfo: Window id: 27262989 "xterm"
Ya tenemos la informacion necesaria que es la ID de la aplicacion X , lo siguiente es desarrollar el programa en C que por el momento solo permitira cambiar la posicion en pantalla de la ventana ya luego en los siguientes post se le agregara nuevas funcionalidades.

/*---------xcambiargeo.c-----------*/
#include < stdio.h >
#include < stdlib.h >
#include < X11/Xlib.h >
#include < X11/Xutil.h >

int main(int argc,char *argv[])
{
Display *display;
int XwinID,Xwin_nuevaX,Xwin_nuevaY;

if(argc != 4){
fprintf(stderr,"Usar:%s nueva_posicion_x nueva_posicion_y XwinID\n",argv[0]);
return 0;
}

Xwin_nuevaX=atoi(argv[1]);
Xwin_nuevaY=atoi(argv[2]);
XwinID=atoi(argv[3]);

printf("nueva_posicion_x=%d nueva_posicion_y=%d Xaplicacion=%d \n",Xwin_nuevaX,Xwin_nuevaY,XwinID);

display = XOpenDisplay( NULL );
if(display==NULL)
{
printf("Error al abrir display\n");
return 0;
}
XMoveWindow( display,XwinID,Xwin_nuevaX,Xwin_nuevaY);
XCloseDisplay(display);
return 1;
}

/*---------------------------------*/
Compilando:
gcc -o xcambiargeo xcambiargeo.c -lX11
Uso:
./xcambiargeo nueva_posicion_x nueva_posicion_y XwinID
./xcambiargeo 200 300 27262989
Donde:
nueva_posicion_x => Es la posicion x en la pantalla
nueva_posicion_y => Es la posicion y en la pantalla
XwinID => La ID de la aplicacion X o la ventana
Al ejecutar el programa xcambiargeo , se observara que la aplicacion X cambiara de un lugar a otro en la pantalla.

Comparacion de dos archivos

Cuando se quiere comparar dos archivos del mismo tamaño y el resultado de la comparacion grabarlo en algun archivo se puede implementar algun programa en C para realizar esta funcion.
El programa que se muestra acontinuacion permite comparar 2 archivos y la diferencia es decir toda aquella informacion que no esta presente en alguno de estos 2 archivos se graba en otro.
Su modo de uso es el siguiente:
./comparar_archivos archivo_uno_a_comparar archivo_dos_a_comparar archivo_diferencia

"archivo_diferencia" es donde se grabara todos los bits diferentes entre ambos archivos.

/*-----------comparar_archivos.c----------------*/

#include < stdio.h >
#include < stdlib.h >
#include < fcntl.h >
#include < unistd.h >
#include < sys/types.h >
#include < sys/stat.h >
#include < errno.h >


int main(int argc, char *argv[])
{
int fd,fdB,fdC,x,y;
char *fila_uno, *fila_dos,*fila_nueva;
struct stat sbuf;
int z;
char c[1];
char cc[1];

if (argc != 4) {
fprintf(stderr, "usar: programa fila_uno fila_dos fichero_a_crear\n");
exit(1);
}
fila_uno=argv[1];
fila_dos=argv[2];
fila_nueva=argv[3];

if ((fd = open(fila_uno,O_RDONLY )) == -1) {
perror("open fila_uno");
exit(1);
}

if ((fdB = open(fila_dos,O_RDONLY)) == -1) {
perror("open fila_dos");
exit(1);
}

if ((fdC = open(fila_nueva, O_RDWR | O_CREAT)) == -1) {
perror("open fila_nueva");
exit(1);
}

if (stat(fila_uno, &sbuf) == -1) {
perror("stat");
exit(1);
}

for(x=0;x<(sbuf.st_size);x++)
{
z=lseek(fd,x,SEEK_SET);
y=lseek(fdB,x,SEEK_SET);
read(fd,c,1);
read(fdB,cc,1);
if( *c!=*cc)
{
write(fdC,c,1);
}
}
return 0;
}


/*----------------------------------------------*/

Compilar:
gcc -o comparar_archivos comparar_archivos.c

sábado, 17 de julio de 2010

Depurar binarios con strace y ltrace

Como siempre cuando se programa es necesario tener diferente herramientas para depuracion como strace y ltrace.
strace permite interceptar y grabar las llamadas al sistema. Mas informacion consulte al manual "man strace"

ltrace permite interceptar y grabar las llamadas a las librerias dinamicas. Mas informacion consulte al manual "man ltrace"

Uso de strace:
strace -i -o binariofile.strace binariofile
Donde:
binariofile.strace: puede ser cualquier archivo donde se grabara la informacion que proporciona strace.
binariofile: Es cualquier binario que se quiere depurar
Salida que se muestra contiene:
[ffffe410] execve("./mc", ["./mc"], [/* 65 vars */]) = 0
[b7f8544b] brk(0) = 0x812a000
[b7f85db1] access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
[b7f85c74] open("/etc/ld.so.cache", O_RDONLY) = 3
[b7f85c3e] fstat64(3, {st_mode=S_IFREG|0644, st_size=102714, ...}) = 0
[b7f86273] mmap2(NULL, 102714, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7f57000
[b7f85cad] close(3) = 0
[b7f85c74] open("/opt/gnome/lib/libgmodule-2.0.so.0", O_RDONLY) = 3
[b7f85cf4] read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`\r\0\0004\0\0\0"..., 512) = 512
[b7f85c3e] fstat64(3, {st_mode=S_IFREG|0755, st_size=13928, ...}) = 0
[b7f86273] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f56000
[b7f86273] mmap2(NULL, 16664, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7f51000
[b7f85ef9] fadvise64(3, 0, 16664, POSIX_FADV_WILLNEED) = 0
[b7f86273] mmap2(0xb7f54000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2) = 0xb7f54000
[b7f85cad] close(3) = 0
[b7f85c74] open("/lib/libdl.so.2", O_RDONLY) = 3
[b7f85cf4] read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240\n\0\0004\0\0\0"..., 512) = 512
[b7f85c3e] fstat64(3, {st_mode=S_IFREG|0755, st_size=10288, ...}) = 0
[b7f86273] mmap2(NULL, 12412, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7f4d000
[b7f85ef9] fadvise64(3, 0, 12412, POSIX_FADV_WILLNEED) = 0
[b7f86273] mmap2(0xb7f4f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1) = 0xb7f4f000
[b7f85cad] close(3) = 0
...........................
.....................

Uso de ltrace:
ltrace -i -o binariofile.ltrace binariofile
Donde:
binariofile.ltrace: puede ser cualquier archivo donde se grabara la informacion que proporciona strace.
binariofile: Es cualquier binario que se quiere depurar
Salida que se muestra contiene:
[0x805cc21] __libc_start_main(0x8082670, 1, 0xbfe522f4, 0x80ee4f0, 0x80ee4e0
[0x808269e] getenv("LANG") = "POSIX"
[0x80826ac] strlen("POSIX") = 5
[0x8082969] strcasecmp("POSIX", "UTF-8") = -5
[0x80826c9] setlocale(6, "") = "LC_CTYPE=en_US.UTF-8;LC_NUMERIC="...
[0x80826dd] bindtextdomain("mc", "/usr/share/locale") = "/usr/share/locale"
[0x80826e9] textdomain("mc") = "mc"
[0x809b354] getenv("TMPDIR") = NULL
[0x809b369] getuid() = 0
[0x809b371] getpwuid(0, 0xbfe520dc, 0xbfe520ac, 130953, 55) = 0xb7d269b8
[0x809b39f] g_snprintf(0x81185a0, 64, 0x80f6906, 0x80f6901, 0x812b080) = 12
[0x809afe1] strlen("/tmp/mc-root") = 12
[0x809b032] strlen("/tmp/mc-root") = 12
[0x809b3c3] __lxstat64(3, "/tmp/mc-root", 0xbfe520b8) = 0
[0x809b5a0] getuid() = 0
[0x809b550] setenv("MC_TMPDIR", "/tmp/mc-root", 1) = 0
[0x80826fa] getenv("SHELL") = "/bin/bash"
..............
.............

Mostrar simbolos de un binario

Para conocer que simbolos esta usando un binario puede hacer uso de la aplicacion nm que es parte del paquete binutils.
Para mas informacion consulte su manual --> man nm
Uso:
nm binariofile
Muestra una salida como se indica a continuacion:

0807a370 t add2hotlist
0807b0f0 T add2hotlist_cmd
08085f60 t add2panelize
080d98b0 t add_a_service
080e19f0 T add_char_string
080e1910 t add_dos_char
08097ca0 T add_hook
080798c0 t add_name_to_list
0807dc30 T add_select_channel
0806a4c0 T add_widget
0807a920 t add_widgets_i18n
081262e0 b addr_buf.9806
0805d530 t advanced_chown_callback
08126e90 B alarm_colors
080f8e60 r all_filters
08129a48 B allones_ip
08118d44 B altered_hex_mode
08118d48 B altered_magic_flag
08118d4c B altered_nroff_flag
08113750 B alternate_plus_minus
081117b8 b and_mask
080f679f r app_text
08125424 B append_log
0807d130 T application_keypad_mode
.........
.........

Mostrar informacion de binarios ELF

Si necesita conocer informacion de algun binario ELF , puede usar la aplicacion readelf.
Para mas informacion lea su manual --> man readelf
Uso:
readelf -a binariofile
Muestra una salida como esta:


ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x805cc00
Start of program headers: 52 (bytes into file)
Start of section headers: 824720 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 10
Size of section headers: 40 (bytes)
Number of section headers: 31
Section header string table index: 28

Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 08048174 000174 000013 00 A 0 0 1
[ 2] .note.ABI-tag NOTE 08048188 000188 000020 00 A 0 0 4
[ 3] .note.SuSE NOTE 080481a8 0001a8 000018 00 A 0 0 4
...................
....................