lunes, 18 de octubre de 2010

A.p.p.s. (Awk, Perl, Python, Shell)

Esto es la actividad de semana 5: 3 programas lenguaje script.

Awk

Awk es un lenguaje de programación diseñado o especializado en el procesado de archivos de texto o flujos de caracteres. Cada línea del archivo es considerado un registro dividido en campos y a su vez cada campo esta separado por un patrón, por ejemplo un caracter de espacio, una coma o mezclas extrañas.

Debido a su efectividad al tratar con cadenas de texto, se pueden manejar fácilmente pequeñas bases de dato, generar reportes y preparar documentos para otro proceso.

La palabra awk proviene del nombre de sus diseñadores Alfred V. Aho, Peter J. Weinberger y Brian W. Kernighan. La versión original fue escrita en 1977 y en 1985 fue actualizada.

La función básica es buscar por patrones en cada registro y realizar una acción:

/patrón/ {acción}

Existen varios intérpretes para awk, los más conocidos son mawk (que viene preinstalado en algunas versiones de ubuntu) y gawk, para instalar cualquiera de ellos, desde la terminal se escribe:

sudo apt-get install gawk
sudo apt-get install mawk

Hay distintas maneras de ejecutar el programa, si el código es pequeño se puede escribir desde la misma terminal encerrado entre comillas simples y seguido del archivo a procesar:

:~$ awk '/1/ {print $2}' archivoDatos

Cada campo en un registro es referido con un caracter $ seguido del número que lo representa.

Si el código es grande, se crearía un archivo que contiene el código y se usaría:

:~$ awk -f programa archivoDatos archivoDatos2

...y en un archivo como el siguiente:

123 nombre
24444.24 nom2
111   nom3
567 nom4
37   nom5
7177    nom6

...nos mostraría:

nombre
nom3
nom6

Lo que hace es buscar el patrón 1 y si lo encuentra imprime el campo número 2 del registro donde lo identificó.

Ahora imaginemos que necesitamos conseguir la temperatura promedio semanal de cada una de las ciudades en el mundo con la restricción de que las ciudades tengan mas de 1 millón de habitantes.

Tomando una lista de ciudades: Lista.
Y obteniendo temperaturas ficticias aleatorias entre 10 y 30 grados celsius: Temperaturas.

Primero comprobamos que ambos archivos contengan la misma cantidad de líneas:

:~$ wc -l city
336 city
:~$ wc -l temp
336 temp

Ahora juntamos ambos archivos para trabajar fácil en awk:

:~$ cat city temp > lista

Y hacemos un programa como este. Obtenemos este resultado.

Guías de awk:
Perl

Este programa calcula el número stirling del segundo tipo:

El número Stirling del segundo tipo S(n, m) es la cantidad de maneras en que se puede partir un conjunto de n cosas en m subconjuntos no vacíos.

Guías de Perl:



Python

Intento de creador de laberinto simple.

Lo que trataba de hacer: El laberinto se iba a construir a partir de las paredes destruidas entre cada celda o casilla de la matriz, solo se recorrerían todas las celdas de la matriz con un BFS destruyendo algunas paredes al azar y regresando a la celda anterior si la actual ya tiene alguna pared tirada o destruida que no sea la anterior que destruimos.

Guías de Python:



Shell

A veces no se puede extraer el texto de un pdf con herramientas como pdftotext (poppler-utils) o pdfminer. Una opción es convertir el pdf a imágenes y extraer el texto con un OCR (optical character recognition) como tesseract, se muestra el ejemplo aquí [1]. La desventaja es que el texto puede contener errores dependiendo de la resolución y otras cosas, hay que revisarlo.

Nota [1]: Para que funcione tienes que instalar tesseract y el idioma que vas a identificar ej.: sudo apt-get install tesseract-ocr-spa.

Guías Shell:

domingo, 29 de agosto de 2010

Lenguaje de programación - Ruby

Ruby es un lenguaje de programación interpretado, funcional, orientado a objetos, diseñado para la simplicidad de sintaxis e inspirado en python y perl.

Es muy importante que visiten la pagina oficial para consultar guias, manuales, documentación, también explican como instalar en diferentes sistemas, etc...

Para instalar en linux es mediante el comando en la terminal:
sudo apt-get install ruby


En windows es fácil mediante un instalador automático: http://rubyinstaller.org
La distribución oficial viene con irb (interactive ruby shell), un interprete interactivo de linea de comandos.

Hola mundo en ruby:
puts "Hello World"

Para ejecutarlo tendríamos que tenerlo en un documento que diga algo.rb y ejecutarlo con el comando ruby (si ya esta el interprete agregado en el PATH):
ruby algo.rb

Algunas cosas a considerar (características):
  • Declaración de variables innecesaria.
  • Todo es un objeto (clases, métodos, etc).
  • Operaciones poderosas sobre cadenas.
  • No es necesario agregar punto y coma (;) para terminar cada expresión.
Parte 1 - Comentarios, numeros, operadores, iteraciones, métodos:


Cualquier linea que comience con #, se convierte en un comentario.

Divisiones de numeros enteros las devuelve en enteros; para que regrese un flotante se le agrega un .0 al final de cualquier numero ya sea el numerador o el divisor.

Los operadores son casi los mismos que en C o Java:



:Alcance (scope)
[]Índices
**Exponentes
+ - ! ~Unarios: pos/neg, no,…
* / %Multiplicación, División,…
+ -Suma, Resta,…
« »Desplazadores binarios,…
&'y' binario
|, ^'or' y 'xor' binarios
> >= < <=Comparadores
== === <=> != =~ !~Igualadad, inegualdad,…
&&'y' booleano
||'o' booleano
.. …Operadores de rango
= (+=, -=,...)Asignadores
?:Decisión ternaria
not'no' booleano
and, or'y', 'o' booleano

Existe la interpolación de cadenas, que significa que al agregarse un #{variable} dentro de la cadena, intercambia eso por la variable dentro de ello.

Si se multiplica una cadena por algun numero, se regresa esa cadena tal numero de veces (consecutivas).

Se pueden unir cadenas de manera simple con el operador +.

Variables globales se manejan con un simbolo $ incial: $variable.

Los metodos se crean entre las palabras def y end, ejemplo:


def algo(parametro1, param2)
   ...
end


Se pueden crear rangos de numeros al escribir (x..y) o (x...y), y convertirlos a arreglos con el método .to_a

La iteración de arreglos es algo distinta a los comunes C y Java, se utiliza un método llamado .each, tambien existen metodos bastante utiles para los arreglos como el .sort y .length los cuales dan el mismo arreglo ordenado y la longitud del mismo, respectivamente.


Se pueden insertar arreglos dentro de arreglos: arreglo1 = [47.47, 'hola', [true, false]]


Hay una forma contraria a if que se llama unless, como funciona?
A menos de que se cumpla la condicion, las instrucciones del bloque se ejecutaran.


Los métodos que terminan en ! son llamados bang porque en lugar de regresar otro objeto, trabajan sobre el mismo objeto modificándolo de manera peligrosa.



Hay muchos mas métodos, y palabras clave, tal vez sea mejor leerlos aquí.

Ahora aquí hay un ejemplo que resume algunas de las cosas que comente.

Otro para calcular el factorial

Guias para aprender ruby:

martes, 24 de agosto de 2010

Presentación 1 - Optimización en compilación

Ve parte de la categorización de los métodos para optimizar, como solo me tocó una parte a exponer, no está completo, agregaré los enlaces para que se vea el tema mas completo.

El trabajo lo realice con:
  1. Jorge Martínez
  2. Ramón Esteban

Descargar presentación

Si bloquean la página...
http://tinyurl.com/2cln2wt

lunes, 16 de agosto de 2010

Qué es un lenguaje de programación ?


Aquí está mi diagrama de lo que son para mi los  lenguajes de programación.

(Click en la imagen para ver extendido) 






Evaluación:

Cosas que considero hice mal:

La representación del diagrama (debería de utilizar LaTex o algo similar)
La administración de mi tiempo.

Qué creo que hice bien: 

La descripción extendida de las definiciones dentro del diagrama.
La inserción de código como ejemplo de paradigmas.