domingo, 16 de diciembre de 2012

Expresiones Regulares | Reconocer matriculas de coches


Esta Expresión Regular es para reconocer las matriculas de los coches. Como hoy en día hay tanto matriculas antiguas como nuevas (formato europeo), tenemos que hacer una expresión que acepte los dos formatos, respectivamente MU1111AB y E1111ABC. Y no están permitidos los guiones separadores ni espacios en blanco.

Formato antiguo
([A-Z]{1,2}) : Así se cogen letras mayúsculas de la A a la Z, como mínimo puede ser una letra, como máximo pueden ser dos letras.

(\d{4}) : Para coger cuatro dígitos, tienen que ser cuatro, ni uno mas ni uno menos.

([A-Z]{0,2}) : Coger de cero a dos letras mayúsculas, es decir el mínimo es cero y el máximo es dos.

Formato Europeo
(E) : Con E indicamos que forzosamente tiene que haber una y solo una E.

(\d{4}) : Igual que antes, para coger cuatro dígitos.

([A-Z]{3}) : Para coger tres letras mayúsculas, ni una mas ni una menos.


Luego tenemos dos expresiones regulares, una para el formato antiguo y otra para el formato Europeo. Ambas son de la siguiente forma.

Formato antiguo: ([A-Z]{1,2})(\d{4})([A-Z]{0,2})

Formato Europeo: (E)(\d{4})([A-Z]{3})

Para terminar, haciendo una concatenación de ambas podemos aceptar los dos formatos sin problemas.

Una concatenación se hace así: R1|R2

Luego el resultado de la concatenación de las dos expresiones regulares es el siguiente:

(([A-Z]{1,2})(\d{4})([A-Z]{0,2}))|((E)(\d{4})([A-Z]{3})

Expresiones Regulares | Reconocer DNI


Vamos crear una expresión regular para leer números de DNI y de NIE (extranjeros).
El formato para el DNI es de la forma a la que estamos acostumbrados:
11223344-A. Y el formato para el NIE es de la forma X-1223344-A, donde el primer carácter pueden ser las detrás X, Y o Z.
El guión separador es opcional.

Formato para extranjeros:
[X-Z]{1} : Así acepta solo una letra mayúscula de la X a la Z.

[-]? : Así se permite introducir un guión opcional.

\d{7} : Así se cogen siete dígitos cualesquiera.

[-]? : Guión opcional.

[A-Z]{1} : Así se coge la ultima letra, solo puede ser una.

Formato para españoles:
\d{8} : Coger 8 dígitos.

[-]? : Igual que antes.

[A-Z]{1} : Como antes, coge la ultima letra mayúscula.

Luego la expresión regular para aceptar NIE extranjeros es la siguiente:

([X-Z]{1})([-]?)(\d{7})([-]?)([A-Z]{1})

Y la expresión regular para aceptar DNI españoles es esta:

(\d{8})([-]?)([A-Z]{1})

Para terminar lo ideal es tener una expresión regular que permita coger tanto DNI de españoles como de extranjeros, luego hay que concatenar ambas expresiones para formar una expresión mas potente. El resultado es este:

(([X-Z]{1})([-]?)(\d{7})([-]?)([A-Z]{1}))|((\d{8})([-]?)([A-Z]{1}))

viernes, 14 de diciembre de 2012

Programa sencillo que calcula el area de un circulo


/*He aquí un programa en C elemental que lee el radio de un circulo,
calcula el área y escribe el resultado calculado.*/

#include<stdio.h>
#include<conio.h>

#define  PI   3.14159

int main()
{
            float radio, area;
            float procesar(float radio);

            printf("Radio = ? ");
            scanf("%f", &radio);

            if(radio < 0)
                        area = 0;
            else
                        area = procesar(radio);


            printf("Area = %f", area);

            printf("\n\nPulse tecla para terminar.");
            getch();

            return 0;         // terminacion exitosa

}//terminacion de main


//definicion de la funcion

float procesar(float r)
{
            float a;
            a = PI * r * r;
            return a;
}

martes, 4 de diciembre de 2012

Expresiones Regulares | Reconocer nombres


Vamos a crear una expresión regular para reconocer nombres y apellidos, tanto compuestos como no compuestos con el siguiente formato:

Apellido1 Apellido2, Nombre. 

Donde Apellido2 puede ser simple o compuesto y tener los prefijos 'de', 'de la' o la forma Apellido2-Apellido3.

Y el nombre puede ser simple o compuesto de la forma Nombre1 Nombre2.

Introducción:
\p{L}+ : Para aceptar palabras con letras mayúsculas y minúsculas.
[ ] : Aceptar espacios en blanco
R? : Operador de opcionalidad, puede darse R o no.
[,] : Aceptar una coma.
de : Aceptar la cadena de.
la : Aceptar la cadena la.
1. E.R. para aceptar los dos apellidos donde el segundo apellido es opcional.

(\p{L}+)(([ ])(\p{L}+))?

Está formada por dos expresiones donde la primera coge el primer apellido, la segunda coge el segundo apellido y el espacio de separación entre los dos apellidos.
Si también queremos coger apellidos compuestos como Quijote de la Mancha, O separados por guion: Fernandez-Cortazar, entonces tenemos que añadir al final de la expresión anterior esta otra.

((([-])(\p{L}+))|((\p{L}+ )(de)(( la)?)( \p{L}+)))?

2. E.R. para aceptar nombres no compuestos.

([,])([ ])(\p{L}+)

Nótese que [,] y [ ] hacen que el nombre quede separado de los apellidos de la siguiente forma: Fernández-Cortázar, Paco
Para finalizar la E.R. para aceptar nombres compuestos donde el segundo nombre es opcional es de la forma:

(([ ])(\p{L}+))?                   

La expresión anterior hay que juntarla con esta expresión para reconocer nombres compuestos y no compuestos.
Resumiendo, la expresión resultante de juntar por orden cada una de estas expresiones es la siguiente:

Apellidos simples

(\p{L}+)(([ ])(\p{L}+))?

Apellidos compuestos

((([-])(\p{L}+))|((\p{L}+ )(de)(( la)?)( \p{L}+)))?

Nombres compuestos

([,])([ ])(\p{L}+)(([ ])(\p{L}+))?

sábado, 1 de diciembre de 2012

Historia de C y C++


C++ evolucionó de C, el cual, a su vez, evolucionó de dos lenguajes de programación anteriores, BCPL y B. En 1967, Martin Richards desarrolló BCPL como un lenguaje para escribir software para sistemas operativos y compiladores. Ken Thompson modeló muchas de las características de C en su lenguaje B, luego del desarrollo de su contraparte BCPL y, en 1970, utilizó B para crear las primeras versiones del sistema operativo UNIX en los laboratorios Bell, sobre una computadora DEC PDP-7. Tanto BCPL como B eran lenguajes “sin tipo” (cada uno ocupaba una “palabra” en memoria y, por ejemplo, el trabajo de procesar un elemento como un número completo o un número real era responsabilidad del programador).
            El lenguaje C  evolucionó a partir de B; dicha evolución estuvo a cargo de Dennis Ritchie en los laboratorios Bell y, en 1972, se implementó en una computadora DEC  PDP-11. C utiliza muchos conceptos importantes de BCPL y B cuando agrega tipos de datos y otras características. Inicialmente, C  se hizo muy popular como lenguaje de desarrollo para sistema operativo UNIX. En la actualidad, la mayoría de los sistemas operativos están escritos en C  y/o C++, y  C  se encuentra disponible para la mayoría de las computadoras, y es independiente del hardware. Con un diseño cuidadoso, es posible escribir programas en C que sean portables para la mayoría de las computadoras.
            Para fines de la década de los setenta, C  evolucionó en lo que ahora se conoce como “C tradicional”, “C  clásico”, o “C  de Kernighan y Ritchie”.  La publicación que en 1978 Prentice Hall hiciera del libro de Kernighan y Ritchie, El lenguaje de programación C,  atrajo mucho la atención de la gente a dicho lenguaje.
            La amplia utililzación de C para distintos tipos de computadoras (en ocasiones llamadas plataformas de hardware) ocasionó, desafortunadamente, muchas variantes. Éstas eran similares, pero a menudo incompatibles, lo que se volvió un problema serio para los desarrolladores que necesitaban escribir programas que se pudieran ejecutar en distintas plataformas. Entonces, se hizo evidente la necesidad de una versión estándar de C. En 1983, se creó el comité técnico X3J11 bajo la supervisión del American National Standards Committee on Computers and Information  Processing (X3), para “proporcionar una definición del lenguaje clara e independiente de la computadora”. En 1989, el estándar fue aprobado. ANSI cooperó con la International Organization for Standardization (ISO) para estandarizar C  a nivel mundial; el documento conjunto del estándar se publicó en 1990 y se le conoce como ANSI/ISO 9899:1990. Las copias de este documento pueden solicitarse a la ANSI. La segunda edición del libro de Kernighan y Ritchie, publicada en 1988, menciona esta versión denominada ANSI C, una versión del lenguaje que actualmente se utiliza a nivel mundial.
            A principios de la década de los ochenta, Bjarne Stroustrup desarrolló una extensión de C en los laboratorios Bell: C++. C++ proporciona un conjunto de características que “pulen” al lenguaje C; pero lo más importante, proporciona la capacidad de una programación orientada a objetos.
            Una revolución se está gestando en la comunidad del software. Escribir software rápida, correcta y económicamente es aún una meta escurridiza, en una época en la que la demanda de nuevo y más poderoso software se encuentra a la alza. Los objetos son, esencialmente, componentes reutilizables de software que modelan elementos reales. Los desarrolladores de software están descubriendo que utilizar una metodología de diseño e implementación modular y orientada a objetos puede hacer más productivos a los grupos de desarrollo de software, que mediante las populares técnicas de programación anteriores, tales como la programación estructurada. Los programas orientados a objetos son más fáciles de comprender, corregir y modificar.
            Se han creado muchos otros lenguajes orientados a objetos, incluyedo Smalltalk; desarrollado por Xerox en su Centro de Investigaciones de Palo Alto (PARC). Smalltalk es un lenguaje orientado a objetos puro (literalmente todo es un objeto). C++ es un lenguaje híbrido (en él es posible programar tanto en estilo C, como en estilo orientado a objetos, o en ambos).

miércoles, 28 de noviembre de 2012

Expresiones Regulares | ¿Como lee mi navegador una direccion email o numero de teléfono?

Cuando tecleamos en nuestro navegador web una direccion email, un numero de teléfono, un numero de cuenta,o cualquier otro dato, nos podemos preguntar, ¿como lo hace? ¿que hay mas abajo de lo que estoy viendo?
Pues la respuesta es muy interesante, si tecleamos un numero de telefono se está usando una expresion regular para reconocerlo.

Por ejemplo si tecleo el telefono 999666333, ¿que expresion regular se ha encargado de reconocerlo?
Pues esta: \d{9}.
Es muy sencilla, \d es una expresion regular que acepta un solo digito y con {9} permitimos que sean nueve digitos.
¿Que pasa si tecleo el tecleo el telefono de otra forma, por ejemplo 666 333 o 66 63 33?
Pues la expresion regular \d{9} ya no nos vale porque es demasiado restrictiva y tenemos que modificarla para que acepte una u otra forma de teclear el numero de telefono.

Vamos a ir a primero a modificar la expresion regular para aceptar el formato sin prefijo 666 333:
Queda de la forma: (\d{3} )(\d{3}).
Aqui (\d{3} ) es la E.R. que reconoce el primer campo, 666 (terminado en espacio en blanco).
Y (\d{3}) es la que reconoce el segundo campo, 333.
Es decir hemos formado una expresion regular juntando dos expresiones regulaes y la unica diferencia entre una y otra es que la de la izquierda acepta un espacio en blanco y la segunda no.

Ahora le llega el turno al formato 66 63 33:
Pues la expresion regular tiene que aceptar tres campos de dos numeros y ademas los dos primeros campos tienen espacio en blanco.
Hmm, bueno ¿si tengo tres campos de dos numeros entonces tengo que juntar tres expresiones regulares que acepten solo dos numeros?
Tic tac... ¡Correcto!
Pues la expresion regular es esta: (\d{2} ){2}(\d{2}).

La cosa se pone interesante cuando nos preguntamos: ¿pero todo el mundo no memoriza  los numeros de telefono de la misma forma asi que si yo introduzco en el navegador mi numero de telefono puede que no me lo reconozca solo por el formato en el que yo lo suelo escribir?
No hay problema, usamos un O logico (simbolo |).
Asi que la expresion resultante es: ((\d{3} )(\d{3})|(\d{2} ){2}(\d{2}))
Vale, es mas grande pero solo son las dos E.R. anteriores juntadas y se le añaden parentesis de prioridad al igual que en la multiplicacion, si como en la E.S.O.

Vamos a ser excepticos, hoy en dia hay que teclear siempre el prefijo, pues ¡vamos a por el!
Si hemos estado atentos y teniendo en cuenta que un prefijo es un numero de tres cifras entonces la expresion regular para el prefijo es esta: (\d{3} ).

Y por fin ya podemos aceptar numeros con prefijo y tecleando de una forma o de otra con:
 (\d{3} )((\d{3} )(\d{3})|(\d{2} ){2}(\d{2}))

Como podemos ver las expresiones regulares es lo que los ordenadores usan para almacenar datos como numeros telefonicos, nombres y apellidos, direcciones de correo, numeros de cuenta, etc..
Antes de terminar se deja como curiosidad la expresion regular necesaria para reconocer direcciones de correo, se complica algo mas: \w[\w.%+-]*@(\w[\w-]*\.)+[a-zA-Z]{2,6}.
Ala, ahora a ver que significa cada cosa...

Podeis ampliar mas informacion pinchando aqui:
http://www.regular-expressions.info/characters.html

Y aqui para poner a prueba las expresiones regulares que se os ocurran:
http://www.regexplanet.com/advanced/java/index.html

Linux | Montar y formatear un disco



Montaje 
Para evitar borrar por accidente algún dato de nuestro disco vamos simular el montaje y formateo con un dispositivo loop.
El usuario Turing va a montar a través de un dispositivo loop un sistema de ficheros ext4 creado en un fichero de nombre /home/Turing/discoduro.img.

El punto de montaje sera /home/Turing/puntomontaje
Fácil, muy fácil. Como root y añadimos esta linea al fichero /etc/fstab:


/home/Turing/discoduro.img /home/Turing/puntomontaje ext4 defaults, loop, user 0 0

  
Y ya tenemos discoduro.img montado en /home/Turing/puntomontaje. Podemos verificar que se ha montado con:

ls /home/Turing/puntomontaje 

Si discoduro.img esta dentro de la ruta /home/Turing/puntomontaje es que este esta montado.
 
Formateo
Como usuario Turing vamos a darle al fichero /home/Turing/discoduro.img un tamaño menor de 100MB y lo vamos a formatear con Ext4.


Estando en /home/Turing ejecutar:


dd if =/dev/zero of=discoduro.img bs=1M count=100 


Donde bs es un bloque de 1M y count indica que queremos 100 bloques, luego el tamaño del disco es de 100M.
Y finalmente le damos formato con:


mke2fs -t ext4 discoduro.img 


Y si todo ha ido bien ya tenemos discoduro.img montado y con el formato Ext4.

Salimos de root. Podemos comprobar el montaje con las siguientes instrucciones como usuario normal:

mkdir puntomontaje 
mount /home/Turing/puntomontaje

touch puntomontaje/ficherovacio

mkdir puntomontaje/directorio
umount /home/Turing/puntomontaje 

Simplemente creamos un directorio para nuestro sistema de ficheros, lo montamos y creamos dentro de este un fichero y un directorio, como no surge ningún problema finalmente desmontamos el sistema de ficheros con la instrucción umount.