Archive for ‘Tutorial’

febrero 22, 2010

Crear un FileSystem dentro de otro FileSystem en GNU/Linux

por Josue Ortega

Cuando instalamos nuestra distribución de GNU/Linux por lo general creamos nuestras particiones y la Swap, pero que pasa si por alguna razón necesitamos mas Swap o como fue mi caso, necesitaba tener un Sistema de Archivos diferente al que uso, y eso no significa tener que formatear una partición entera  para conseguir el Sistema de Archivos requerido. A continuación detallare como se crea un Archivo Formateado con un sistema de archivos diferente al que estamos usando.

Primero que nada debemos crear el archivo que usaremos para nuestro nuevo Sistema de Archivos, este será un nuevo Archivo de 10Mb lleno de 0’s, para esto en la consola:

dd if=/dev/zero of=/home/noahfx/prueba bs=1M count=10

donde prueba es el nombre que le puse al archivo nuevo, en mi home, ustedes pueden crearlo donde mas les convenga.

Lo anterior tendrá una salida similar a la siguiente:

10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.267152 s, 39.3 MB/s

Con nuestro Archivo Creado ya podemos darle formato según sea el sistema que necesitamos.

SWAP

Para que nuestro archivo funcione como Swap:

# mkswap /home/noahfx/prueba

EXT2 y EXT3

# mkfs.ext2 /home/noahfx/prueba

Al hacer esto se nos preguntará lo siguiente:

mke2fs 1.41.3 (12-Oct-2008)
/home/noahfx/prueba no es un dispositivo especial de bloques.
¿Continuar de todas formas? (s,n)
Aceptamos continuar, y tendremos la siguiente salida:
Etiqueta del sistema de ficheros=
Tipo de SO: Linux
Tamaño del bloque=1024 (bitácora=0)
Tamaño del fragmento=1024 (bitácora=0)
2560 nodos-i, 10240 bloques
512 bloques (5.00%) reservados para el superusuario
Primer bloque de datos=1
Número máximo de bloques del sistema de ficheros=10485760
2 bloque de grupos
8192 bloques por grupo, 8192 fragmentos por grupo
1280 nodos-i por grupo
Respaldo del superbloque guardado en los bloques:   8193
Escribiendo las tablas de nodos-i: hecho
Escribiendo superbloques y la información contable del sistema de ficheros: hecho
Este sistema de ficheros se revisará automáticamente cada 22 montajes o
180 días, lo que suceda primero.  Utilice tune2fs -c o -i para cambiarlo.
De la misma manera para EXT3:
# mkfs.ext3 /home/noahfx/prueba

Ahora solo toca Montar nuestra nueva “particion”, para montar Swap:

# swapon /home/nohafx/prueba

Para montar los Ext usaremos

mke2fs 1.41.3 (12-Oct-2008)/home/noahfx/prueba no es un dispositivo especial de bloques.¿Continuar de todas formas? (s,n)Aceptamos continuar, y tendremos la siguiente salida:De la misma manera para EXT3:

# mkfs.ext3 /home/noahfx/prueba

para comprobar que nuestro archivo es un sistema de archivos valido:

$file /home/noahfx/prueba
/home/noahfx/prueba: Linux rev 1.0 ext2 filesystem data, UUID=5fd4795c-eb86-42c4-a63c-fe61b3958062

Para montar nuestra partición, si la formateamos como Ext2 o Ext3:

Primero debemos crear una carpeta donde será montada la partición, en mi caso la monté en /tmp:

# mkdir /tmp/prueba

Luego la montamos en esa carpeta auxiliandonos del comando loop, como si estuviéramos montando un ISO:

# mount -o loop /home/noahfx/prueba /tmp/prueba  
# mount |grep prueba
/dev/loop0 on /tmp/prueba type ext2 (rw)

Y con esto ya tenemos montada nuestra nueva partición dentro de otro sistema de archivos

Anuncios
enero 27, 2010

Debian Híbrido

por Josue Ortega

Desde ya hace un tiempo vengo usando Debian Lenny(la versión estable por el momento), lo unico que no me gusta es que los paquetes estables para esta versión no son los mas nuevos que digamos, buscando un poco en la web, encontré que se puede tener un sistema híbrido, esto quiere decir: tener paquetes de la versión estable y paquetes de testing y unstables. Y que con esto? bueno con esto ya puedo escojer entre paquetes estables(version angtigua) y paquetes más recientes. En fin es cuestion de gustos.

A continuación explicare como pasar nuestro sistema de estable a hibrido, bastante sencillo por cierto.

Lo primero que tenemos que hacer es abrir el archivo sources.list (dónde se encuentran las direcciones de los repositorios), bueno yo lo hago desde la TODOPODEROSA consola, y usando nano:

# nano /etc/apt/sources.list

A continuación los repositorios:

#Stable
deb http://ftp.debian.org/debian/ lenny main 
deb-src http://ftp.debian.org/debian/ lenny main 
# Testing
deb http://ftp.debian.org/debian/ testing main 
deb-src http://ftp.debian.org/debian/ testing main 
# Unstable
deb http://ftp.debian.org/debian unstable main 
deb-src http://ftp.debian.org/debian unstable main

Luego actualizamos:

#apt-get update

Lo siguiente es crear el archivo preferences

# nano /etc/apt/preferences

Donde agregamos las siguientes directivas para hacer pinning:

Package: *
Pin:release a=stable
Pin-Priority:700
Package: *
Pin:release a=testing
Pin-Priority:600
Package: *
Pin:release a=unstable
Pin-Priority:500

El pinning puede ser redirigido a un archivo, un origen, la versión de un paquete, un componente, etc…

Con “o=” se especifica el origen; es decir, la distribución del paquete, con “a=” la rama (sarge, sid, stable, etc…).

Los números de prioridad tienen además un significado añadido, que a continuación se comenta. Llamando P a dicho número, tenemos:

  • P»1000: se fuerzan versiones de paquetes, aunque estas sean inferiores.
  • 990«P«=1000: siempre que la versión instalada no sea más reciente, el paquete es instalado, aunque no provenga de la rama principal.
  • 500«P«=990: siempre que el paquete instalado sea más antiguo y que no exista una versión en la rama principal, se instalará la versión.
  • 0«P«=100: la versión solo se instala si no hay ninguna versión del paquete instalado.
  • P«0: no se instala la versión.

Actualizamos de nuevo:

# apt-get update

Como tercer paso creamos el archivo apt.conf

#nano /etc/apt/apt.conf

Y escribimos lo siguiente:

APT::Default-Release "stable";
APT::Cache-Limit 15000000;
Apt::Get::Purge;
APT::Clean-Installed;
APT::Get::Fix-Broken;
APT::Get::Fix-Missing;
APT::Get::Show-Upgraded "true";

Listo, con esto tenemos nuestro sistema híbrido listo para instalar nuevos paquetes.

Instalacion de Paquetes

Para instalar paquetes en la nueva configuración de nuestro sistema, podemos ver los candidatos de paquetes:

# apt-cache policy [nombre del paquete]

El comando anterior nos devolvera los candidatos para el paquete que especifiamos, la rama donde se encuentra el paquete, y el numero de pin dependiendo si es para: stable, unstable, testing.

Luego que conseguimos la informacion que necesitamos solo basta con escribir

#apt-get -t [unstable/stable/testing] install [nombre del paquete]

por ejemplo si queremos instalar kaffeine desde testing sería:

#apt-get -t testing install kaffeine

Y con esto ya tienen para divertirse 🙂

enero 17, 2010

Tutorial JLEX y JAVA CUP

por Josue Ortega

Debido a que en la web no se encuentran ejemplos concretos del uso de JLEX y JAVA CUP,  he decidido escribir un tutorial para el  generador de analizadores léxicos  JAVA JLEX y el generador de analizadores sintácticos JAVA CUP, he creado una nueva pagina en este blog dedicada a un tutorial y al estudio de estas herramientas, el enlace es: https://openfecks.wordpress.com/jlex-y-cup/

septiembre 28, 2009

Turorial: Parser Descendente Recursivo

por Josue Ortega

Bueno para los que se preguntan como hacer un parser a partir de una gramática que hemos diseñado, aquí le enseñare brevemente como hacer un parser descendente recursivo

Tenemos que tomar en cuenta lo siguiente:

1. Nuestra gramática no debe ser recursiva a la izquierda.Por ejemplo la producción

E::=Er

es recursiva  la izquierda, para este tipo de gramáticas nuestro parser no sería funcional, asi que hay que quitarle la recursividad a la izquierda

2.Debemos construir los conjuntos: First, Follow, para cada producción de nuestra gramatica.

Estructura del parser:

LookAhead: Esta variable(global), inicialmente es el token de mas a la izquierda de la entrada.

Por cada NO TERMINAL de la gramática debe existir un procedimiento del parser.Para hacer mas fácil su programación, el nombre del procedimiento tendrá el nombre del no terminal.

Cada una de las opciones del no terminal formaran el cuerpo del procedimiento.

Procedimiento Match: Con este procedimiento sabremos si es el TERMINAL correcto, lo detallare a continuación

void Match(token simbolo){
if(lookahead==simbolo)
lookahead=siguienteSimbolo;/* para obtener el siguiente simbolo se puede hacer un procedimiento para pedir el siguiente toke que recibimos del analizador lexico*/
else
ERROR
}

Bueno, ahora a programar, escribiré un parser para la siguiente gramática:

terminales: x,y,z;

E:=xP | H     /*  E produce x segido de la producción P ó la producción H       */

P:=Tz

H:=y

T:=yx;

****************************************************************

var token lookahead;//variable del tipo del token que ustedes utilicen

void main {

//Iniciar Scanner si s necesario

lookahead=nexToken() // funcion que devuelve el token siguiente

E();
}
void E(){
if(lookahead==x)
Match(x);
P();
else
H();
}
void P(){
T();
Match(z);
}
void T(){
Match(y);
Match(x);
}
void H(){
Match(z);
}

Y así de sencillo es un parser descendente Recursivo 🙂

Si se dan cuenta el parser recorre el árbol de arriba hacia abajo de allí viene descendente,

Y Recursivo se debe a que el parser puede llamarse a si mismo directa o indirectamente por medio de sus funciones 🙂

Espero que les sirva de algo,

Dudas, comentarios o sugerencias, no duden en escribir

saludos