Espacio de tecnologia, software libre y sus derivados. Una horda de monos entrenados escriben de vez en cuando por aqui algunas noticias, opiniones e incluso alguna que otra cosa fuera del tema. Maqueros, favor de abstenerse que no somos lo suficientemente guapos.

Piano daemon

Archive for August, 2009

Un menu al estilo XP hecho con JQuery

Les mando este menu al estilo XP, de mi para ustedes con amor jojojo
MenusitoXP

Aqui la liga para descargarlo ..es un archivo rar… solo cambiale la extension de DOC a RAR

Espada laser Guerra de las galaxias

Degradados en Gimp

Degradados en Gimp from hackworth on Vimeo.

Quitar ojos rojos de la fotografias con GIMP

Jamas me habia metido con esto del retoque de imagene, lo poco que he aprendido de gimp, me ha dejado sorprendido.

Gimp 2.4 Filtro:quitar ojos rojos from hackworth on Vimeo.

Pasos efectuados para la instalacion de GNU C Compiler en AIX 5.3

Paquetes que fueron requeridos para la instalacion del GCC con Threads support
NOTA: Los paquetes solo pudieron ser instalados siguiendo este orden:
rpm -Uvh libgcc-4.2.4-1.aix5.3.ppc.rpm
rpm -Uvh openssl-0.9.8k-1.aix5.1.ppc.rpm
rpm -Uvh mhash-0.9.2-1.aix5.1.ppc.rpm
rpm -Uvh libstdc++-4.2.4-1.aix5.3.ppc.rpm
rpm -Uvh zlib-1.2.3-5.aix5.1.ppc.rpm
rpm -Uvh lzo-2.03-1.aix5.1.ppc.rpm
rpm -Uvh patch-2.5.9-1.aix5.1.ppc.rpm
rpm -Uvh netcat-1.10-2.aix5.1.ppc.rpm
rpm -Uvh unzip-6.0-1.aix5.1.ppc.rpm
rpm -Uvh gmp-4.3.1-1.aix5.1.ppc.rpm
rpm -Uvh gettext-0.10.40-1.aix5.1.ppc.rpm
rpm -Uvh info-4.6-1.aix5.1.ppc.rpm
rpm -Uvh gcc-4.2.4-1.aix5.3.ppc.rpm
rpm -Uvh expat-2.0.1-2.aix5.1.ppc.rpm
rpm -Uvh gdb-6.8-1.aix5.1.ppc.rpm
rpm -Uvh nano-2.0.7-1.aix5.1.ppc.rpm
rpm -Uvh readline-5.2-2.aix5.1.ppc.rpm
rpm -Uvh flex-2.5.35-1.aix5.1.ppc.rpm
rpm -Uvh gcc-cpp-4.2.4-1.aix5.3.ppc.rpm
rpm -Uvh lzlib-0.5-1.aix5.1.ppc.rpm
rpm -Uvh libstdc++-devel-4.2.4-1.aix5.3.ppc.rpm
rpm -Uvh gcc-c++-4.2.4-1.aix5.3.ppc.rpm
rpm -Uvh emacs-21.3-1.aix5.1.ppc.rpm
rpm -Uvh rpm -Uvh bzip2-1.0.5-1.aix5.1.ppc.rpm
rpm -Uvh zip-3.0-1.aix5.1.ppc.rpm
rpm -Uvh gzip-1.3.12-1.aix5.1.ppc.rpm
rpm -Uvh ncurses-5.6-1.aix5.1.ppc.rpm
rpm -Uvh patchutils-0.3.0-1.aix5.1.ppc.rpm
rpm -Uvh emacs-nox-21.3-1.aix5.1.ppc.rpm
rpm -Uvh pcre-7.9-1.aix5.1.ppc.rpm

Tube la necesidad de ampliar el espacio del punto de montaje /opt, ya que
todos los paquetes rpms, que se instalaron caen dentro de esta ruta
chfs -a size=+131072 /opt

Reglas magicas para el manejo de apuntadores en C

Se pueden tener apuntadores a cualquier tipo de variable.

Para entender perfectamente este desmadre de los apuntadores… aprendete estas reglas magicas:

1.- Un apuntador es una variable que contiene la dirección en memoria de otra variable.

main()
{
    int x = 1;
    int *ap;  //Apuntador que permite
                //ser usado con variables enteras

    ap = &x;  //Se le asigna la direccion
                  //de memoria que alverga el valor 1

    printf("Direccion de el apuntador ap:%x",ap);
}

La consola termina imprimiendonos esto:
Imprime la direccion de el apuntador ap:bf9ed410

2.- Un apuntador puede ser desreferenciado, para accesar a el valor que contiene (a esto se le llama acceso indirecto) esto se logra agregando el * al identificador del apuntador:

main()
{
    int x = 1;
    int *ap;  //Apuntador que permite
                //ser usado con variables enteras

    ap = &x;  //La direccion de memoria de x
                  //se asigna a la direccion de
                 // memoria que alberga el apunt
                 // ador ap

    printf("Valor de el apuntador ap:%d",*ap);
}

La consola termina imprimiendonos esto:
Valor de el apuntador ap :1

3.- C no es muy estricto en la asignación de valores de diferente tipo (entero a apuntador - apuntador a entero). Así que es perfectamente legal (aunque el compilador genera un aviso de cuidado).

main()
{
    int x;
    int y;
    int *ap;

    y = 3;
    ap = y; //Ahora se apunta
	    // a la localidad de
            // memoria 3

    x = ap; //Aqui x recibe el valor
            //3

    printf("Localidad de memoria:%d",x);
}

La consola termina imprimiendonos esto:
Localidad de memoria x :3

4.- No se puede usar un apuntador, si no esta este previamente inicializado
Por lo que:

main()
{
    int *ap;
    *ap = 100;
}

puede generar un error en tiempo de ejecución o presentar un comportamiento errático.

El uso correcto será:

main()
{
    int *ap;
    int x;

    ap = &x;
    *ap = 100;
}

5.- En los apuntadores a estructuras: Se usa la notación p->member

main()
{
     typedef struct {
	char member_1;
	int  member_2;
     } s_type;

     s_type x={'U',2}, *p = &x;

     p->member_1 = 'R'; // Equivale a (*p).member_1 = 'R';

     //Observece como sacamos el contenido de uno de
    // los elementos de la estructura de forma indirecta
     printf("Caracter encontrado:%c",(*p).member_1);
}

Imprime en consola
Caracter encontrado:R
Con estas reglas basica ahora podras comprender la fabulosa Aritmetica de punteros

Selectores personalizados en JQuery ZOTE

selectores_personalizados_jquery.pdf

Seleccion de elementos en JQuery

Explicacion rapida y sin dolor.

// todos los elementos de tipo `e`
$('e');

// elementos de tipo `e` que son descendientes
// de elementos de tipo `f`
$('f e');

// elementos de tipo `e` que son hijos
// de elementos de tipo `f`
$('f > e');

// elementos con clase `cwt`
$('.cwt');

// elementos con identificador `contacts`
$('#contacts');

// elementos de tipo `e` que contienen
// un atributo `foo`
$('e[@foo]');

// elementos de tipo `e` que contienen
// un atributo `foo` con valor `bar`
$('e[@foo="bar"]');

// y por supuesto... multiples combinaciones
$('h2 a, h1 + *, #error-holder.error, #sidebar h3');

How to build a UNIX daemon

Me pidieron un programita hecho en C residente en memoria. Un demonio pues!…
Aqui les dejo el codigo base del daemon unix tradicional.

El daemon lo hice para un IBM AIX 5.3 sobre arquitectura power pc.
Y poco despues lo compile en linux, y no hubo nada de problema.. codigo 2000% porciento guapo y portable.

/**********************************
 * UNIX Daemon Server Programming *
 * Written by Edwin Plauchu       *
 * mailto:pianodaemon@gmail.com   *
 **********************************/

#include stdio.h
#include stdlib.h
#include fcntl.h
#include signal.h
#include unistd.h
#include string.h

#define RUNNING_DIR	"/tmp"
#define LOCK_FILE	"cacherd.lock"
#define LOG_FILE	"cacherd.log"

void log_message(filename,message)
char *filename;
char *message;
{
FILE *logfile;
	logfile=fopen(filename,"a");
	if(!logfile) return;
	fprintf(logfile,"%sn",message);
	fclose(logfile);
}

void signal_handler(sig)
int sig;
{
	switch(sig) {
	case SIGHUP:
		log_message(LOG_FILE,"Senal de hangup cachada");
		break;
	case SIGTERM:
		log_message(LOG_FILE,"Senal de Terminacion cachada");
		exit(0);
		break;
	}
}

void daemonize(){
	int i,lfp;
	char str[10];

	// Primero obtenemos el indentificador de Proceso
	if( getppid() == 1 ) return; 

	// Ahora generamos un proceso hijo y obtenemos su PID
	// mediante la variable i
	i=fork();

	// Comprobamos que el proceso hijo este lanzado de manera correcta
	// Verificando los posibles ERRORES de lanzamiento
	// En caso de existir un error de lanzamiento en el proceso hijo
	// procedemos a la finalizacion del proceso padre
	if (i<0) { exit(1); } // fork error, el proceso hijo no pudo ser creado
	if (i>0) { exit(0); } /* Padre existe */

	// Proceso hijo (Demonio) continua
	setsid(); // Crea una sesión y define el ID de grupo del proceso

	/* Cerrar todos los descriptores de archivo
	OJO: Esto evita que el hijo use los mismos decriptores de fichero que el padre*/
	for (i=getdtablesize();i>=0;–i) close(i); 

	i=open(”/dev/null”,O_RDWR); dup(i); dup(i); /* handle standart I/O */

	umask(027); /* Establece los permisos que le seran dados  a los nuevos archivos a crear */

	chdir(RUNNING_DIR); /* Cambia el directorio de ejecucion */

	/* Abre el archivo de bloqueo en modo lectura/escritura, pero
	si el archivo no existiece, lo crea con el permiso 640 */
	lfp=open(LOCK_FILE,O_RDWR|O_CREAT,0640);

	if (lfp<0) { exit(1); } /* No puede ser abierto */
	if (lockf(lfp,F_TLOCK,0)<0) exit(0); /* No puede ser bloqueado el fichero para este proceso*/

	/* Primera instancia continua */
	sprintf(str,"%dn",getpid());

	// Escribimos el PID al fichero de bloqueo
	write(lfp,str,strlen(str)); 

	signal(SIGCHLD,SIG_IGN); /* Ignora hijo */
	signal(SIGTSTP,SIG_IGN); /* Ignora Senales tty */
	signal(SIGTTOU,SIG_IGN);
	signal(SIGTTIN,SIG_IGN);
	signal(SIGHUP,signal_handler); /* Cacha Senal hangup (kill -1 PID)*/
	signal(SIGTERM,signal_handler); /* Cacha Senal de Terminacion (kill -15 PID)*/
}

int main(){ daemonize(); while(1)  sleep(1);  }

Eso es bailar de altura y no chingaderas


Breakdance Kid - Funny bloopers are a click away

« Entradas anteriores