9 sept 2007

/* Analizador lexico primitivo (basico)
Palabras reservadas: begin, end, do, while, if
Tipo de elementos/tokens: palabras reservadas, numeros enteros, identificadores, operadores aritmeticos(+,-), comentarios
Fecha: Agosto 2007

Coded by Yuan G. Ho
*/

#include <stdio.h>
#include <ctype.h>
#include <string.h>

void uso_programa();
int identif_token(char token[128], int);

int main(int argc, char **argv)
{
FILE *archivo;
char caracter;
char token[128];
int posicion=0;
int flag_com = 0; //bandera para comentarios

if(argc != 2) uso_programa();

archivo = fopen(argv[1], "r");

while ((caracter = fgetc(archivo)) != EOF)
{
if(caracter == '"' || flag_com == 1)
{
token[posicion++] = caracter;
if(flag_com == 0)
flag_com = 1;
else
if(flag_com == 1 && caracter == '"')
{
flag_com = 0;
token[posicion] = '0';
printf("%s ", token);
printf("ttttComentarion");
posicion = 0;
}

}
else
if(caracter != ' ' && caracter != 'n' && caracter != ';' && flag_com == 0)
{
token[posicion++] = caracter;
}
else {
if(posicion>0)
{
token[posicion] = '0';
printf("%s ", token);
switch(identif_token(token, posicion))
{
case 0: printf("ttttpalabra reservadan");
break;
case 1: printf("ttttIdentificadorn");
break;
case 2: printf("ttttOperador aritmeticon");
break;
case 3: printf("ttttNumeron");
break;
default: printf("ttttErrorn");
}
posicion = 0;
}
}
}

return 0;
}

void uso_programa()
{
puts("Uso: analizador archivo_fuente");
puts("Se debe ejecutar el programa pasando como parametro el nombre del archivo fuente que contiene el codigo a ser analizado");
}

int identif_token(char token[128], int longitud)
{

// -9 representa error
int trans_estado[8][7] = { {0,1,5,3,4,6,-1},
{-9, 1, 2, -9, -9, -9, -1},
{-9, 1, 2, -9, -9, -9, -1},
{-9, -9, 5, -9, -9, -9, -9},
{-9, -9, 5, -9, -9, -9, -9},
{-9, -9, 5, -9, -9, -9, -1},
{6, 6, 6, 6, 6, 7, -9},
{-9, -9, -9, -9, -9, -9, -1}
};

int estado = 0;
int ciclo;


for(ciclo = 0; ciclo < longitud; ciclo++)
{
if(estado == -9)
return -9;

if(isdigit(token[ciclo]))
estado = trans_estado[estado][2];
else if(isalpha(token[ciclo]))
estado = trans_estado[estado][1];
else if(isspace(token[ciclo]))
estado = trans_estado[estado][0];
else if(token[ciclo] == '+')
estado = trans_estado[estado][3];
else if(token[ciclo] == '-')
estado = trans_estado[estado][4];
else if(token[ciclo] == '"')
estado = trans_estado[estado][5];
else
estado = -9;
}

if(estado == 1)
if((strcmp(token, "begin") == 0) || (strcmp(token, "end") == 0) || (strcmp(token, "if") == 0) || (strcmp(token, "do") == 0) || (strcmp(token, "while") == 0))
return 0;
else
return 1;

if(estado == 5)
return 3;

if(estado == 3)
return 2;

if(estado == 4)
return 2;

if(estado == 2)
return 1;

if(estado == -9)
return -9;
}

Analizador Lexico - Lexer

Este es un analizador lexico sencillo que programe. Publicare la tabla de transicion de estados y el codigo del lexer, que es bastante primitivo.

Los pasos que segui para crear este lexer fueron:
  1. Definir mi lenguaje (palabras reservadas, comentarios, etc)
  2. Crear el automata finito (grafo)
  3. Crear las reglas
  4. Crear la tabla de transicion de estados
  5. Programar
Mi lenguaje lo defini de la siguiente manera:
  • Palabras reservadas: begin, end, do, if, while
  • Comentarios: cualquier cadena entre comillas dobles ("comentario")
  • Numeros: numeros enteros (2, -2, +5, etc)
  • Operadores aritmeticos: +, -
  • Identificadores: cualquier cadena que este compuesto por letras solas o letras y numeros, debe empezar con letra
Las reglas del automata se podran visualizar en la tabla de transicion de estados.

La tabla de transicion de estados a continuacion:


Y por ultimo, el codigo estara en el siguiente post, lo subire a google docs y luego lo publicare. No salio muy bien formateado =(

Cualquier sugerencia, correcion, comentario, lo que sea, enviarme un correo o escribirlo como comentario =D

1 sept 2007

Proteger tu linux desktop o workstation con iptables

Este es un mini-tutorial para proteger tu maquina de ataques. Utilizare iptables para ello, el kernel debe tener netfilter, ya sea como modulo, o formando parte del kernel, y tambien el modulo state de netfilter, para poder monitorear conexiones.

Son solo 2 reglas que deberas crear para tu firewall:
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT


La primera cambia la politica de tu firewall, de ACCEPT a DROP. Netfilter tiene 3 cadenas o chains: INPUT, OUTPUT, FORWARD. INPUT filtra los paquetes entrantes, OUTPUT filtra los paquetes salientes, y FORWARD filtra los paquetes a los que le haces forward, duh!. En este caso, la politica de nuestro firewall es desechar cualquier paquete si no cumple con ninguna de las reglas.

La segunda regla le dice a nuestro firewall que acepte cualquier paquete que tenga un estado de Establecido. Esto se basa en el modulo state, que nos permite monitorear las conexiones, saber si un paquete pertenecen a alguna conexion en especifico. Esta segunda regla nos permite aceptar paquetes de cualquier conexion que iniciemos nosotros. Si la conexion lo inicia un host externo, el firewall desechara los paquetes.

Esto solo funcionara bien si no prestas ningun servicio en tu maquina, ejemplo: servidor correo, ftp, ssh, web, etc. Ya que nadie podra conectarse a los servicios, a menos que agregues un par de reglas a tu cadena INPUT.

Si por ejemplo quieres que alguien pueda accesar a tu servidor web, solo tienes que agregar otra regla:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Por lo general los servidores web ofrecen servicios por el puerto 80 o 8080, tendras que hacer lo mismo para otros servicios.

Si deseas aprender mas de iptables o netfilter, mejor buscate un manual, tutorial o libro =P. Recuerda, la regla 2 es un ejemplo de Stateful firewall, un firewall basado en estados de conexion.

27 ago 2007

Instalar y configurar Eclipse para programar con C++ y OpenGL en windows XP


Archivos/Programas Requeridos:

Nota: Si no se presenta el screenshot de alguna parte del proceso de instalacion o configuracion, es porque las opciones se dejan por defecto o son muy obvios

Paso 1: Instalar MinGW


Siguiente

Siguiente

Seleccionar "g++" y "MinGW Make"

Siguiente

Paso 2: Instalar las librerias, el DLL y los archivos de cabezera (Todo esto se encuentra en el mismo zip)

Colocar glut32.dll en C:\windows\system32

Colocar las librerias en C:\MinGW\lib

Colocar todos los .h en C:\MinGW\Include\GL

Paso 3: Instalar Eclipse CDT

Descomprimir y colocar en C:\Archivos de Programas

Paso 4: Configurar Eclipse

Ejecutar Eclipse

Cerrar el tour

Crear un proyecto nuevo,
File-> New-> C++ Project

Seleccionar el proyecto en el Explorador de Proyectos, luego Project-> Properties


Agregar glut32, glu32 y opengl32 (ver imagen)

Agregar codigo al proyecto

Nombrar el archivo

Escribir el Codigo y Guardarlo

Compilar

Ejecutar =D

Eso es todo lo que hay que hacer, incluyendo la prueba. Si hay algo que corregir, algo que falte, sugerencias, comentarios, enviar correo a yuangh at gmail dot com

19 ago 2007

Truco con el emerge (portage)

Si tu conexion es lenta y tu pc es algo vieja, seguramente te molesta instalar paquetes que tienen muchas dependencias y demoran en compilar. Bueno, hay un pequeño truco que utilizo para disminuir el tiempo total que toma todo el proceso.

Todo lo que debes hacer es ejecutar dos (2) emerge simultaneamente, correcto, asi mismo como leistes, 2 emerge. Te preguntaras por que? bueno, si prestas atencion cuando haces instalaciones con emerge te habras dado cuenta de lo siguiente: si haces emerge de cualquier paquete, por ejemplo amsn, este tiene varias dependencias, tcl, tk, etc, por lo que primero descargas una de las dependencias, compila, instala y luego descarga la siguiente, y asi sucesivamente hasta que instalas el paquete que deseas.

Mientras esta compilando, no le estas dando provecho a tu conexion; si un paquete demora 30 minutos en compilar, durante esos 30 minutos tu conexion no se aprovecha ( suponiendo que no estas descargando nada mas o navegando o algo por el estilo).

Entonces lo que debes hacer es primero ejecutar "emerge paquete --fetchonly" en una consola, y luego abres otra y ejecutas "emerge paquete". De este modo resultara mucho mas rapido. O tambien puedes hacerlo todo en la misma consola, primero "emerge paquete --fetchonly --quiet &" y luego "emerge paquete"

PD: Otra forma de hacerlo es agregando una linea en /etc/make.conf
FEATURES="parallel-fetch"

11 ago 2007

Programacion - OpenGL en Ubuntu

Este tutorial pretende ser una guia rapida para configurar el entorno de programacion necesario para poder escribir, compilar, y ejecutar programas C con OpenGL en Ubuntu.

En este caso, se va a instalar las librerias necesarias para trabajar con GLUT (OpenGL Utility Toolkit), que es un manejador de ventanas, de entradas, etc; GLUT es independiente de plataformas, por lo que si queremos que el programa sea portable, utilizamos GLUT en vez de APIs de Windows o de X11.

Tambien GLU (OpenGL Utility Library) que provee funciones para controlar la posicion de la camara, funciones mas avanzadas para curvas, poligonos, etc que no estan en el OpenGL basico.

Podemos listar los elementos necesarios como:
- librerias y headers de GL
- librerias y headers de GLU
- librerias y headers de GLUT

Para instalar esas librerias y headers ejecutamos lo siguiente:

aptitude install glut-doc glutg3-dev libglut3 libglut3-dev


Con eso bastara. Ya tendremos disponible las librerias y headers necesarios para programar con OpenGL.

Para utilizar las funciones GL, GLUT y GLU solo tenemos que hacer include del glut.h en nuestro codigo C:


#include


Notese que debe ser GL en mayuscula, ya que el archivo esta localizado en /usr/include/GL/, si utilizas
te mandara error.

Cuando compilas con el gcc deberas agregar unos parametros, para especificar las librerias adicionales:

gcc -o programa_compilado programa_codigo.c -lglut -lGLU -lGL


Eso es todo, ya estamos listos para hacer programas que hagan uso de OpenGL. No tenemos necesidad de instalar Visual C++ =D.

Codigo fuente de servidor HTTP

Lo prometido es deuda, el codigo fuente del servidor web (gallo) que programe lo voy a colocar en este blog, espero que le sirva a alguien, por eso lo publico

http://docs.google.com/Doc?id=ddn4rb88_169dh5p

No lo habia publicado porque estaba esperando a que se acabara el semestre, y luego que se acabo, se me olvido. Ya saben, queria evitar plagios y problemas con la profesora.

5 may 2007

Proyecto de programacion: Servidor Web - Parte 1

Programar un servidor web no es una tarea sencilla, requiere de conocimiento en temas variados como: lenguaje C, sockets, conceptos de servidor/cliente, protocolos (HTTP/1.1), lectura de archivos, etc.

Intentare explicar lo que he aprendido:

Se puede decir que el socket es como un punto final de comunicación. Se puede comparar con los teléfonos, un teléfono se utiliza para realizar la llamada, y es necesario otro para contestar; podemos concluir entonces que un socket se comunica con otro socket.

El socket es una abstracción, el programador no se tiene que preocupar por como funciona un dispositivo de una marca especifica, o el modelo, etc; de eso se debe encargar el sistema operativo.

Un servidor es una aplicación que ofrece servicios, y un cliente es una aplicación que solicita y utiliza los servicios que presta el servidor. Para poder entenderse, utilizan los protocolos, que podemos comparar con los idiomas, tiene normas, simbolos, palabras, etc; para que dos personas se puedan comunicar, deben hablar el mismo idioma.

El protocolo HTTP/1.1 es un estándar de Internet, se utiliza principalmente en la comunicación Web. Permite que un Servidor Web y un Navegador de internet se comuniquen de la manera adecuada.

GET es parte del protocolo HTTP/1.1, este le indica al Servidor Web que documento es el que desea obtener. ejemplo "GET /index.html"

La información en Web por lo general estan en HTML, y esos se almacenan en archivos, guardados en un disco. Cuando el Servidor Web recibe la petición del cliente Navegador de Internet (Firefox), este examina la solicitud; dentro de la solicitud esta el nombre del documento (archivo) que el cliente desea obtener. El Servidor Web busca ese archivo en el disco, si lo encuentra, se lo envía al cliente, si no, envía un mensaje indicando que no existe el documento.

En la imagen de arriba, se puede apreciar la solicitud que realiza el Navegador al servidor web.

Bueno, por ahora eso es lo que tengo. Mas adelante subiré código del servidor Web.