feed icon Ambos idiomas / Both languages
(es|en)

Separar telegramas con expresiones regulares
Hace un tiempo tuve que hacer algo como esto para analizar un "log" de lo que se escribía y recibía por un puerto serie. Me parece que es una forma rápida y cómoda (si se conocen expresiones regulares) de procesar este tipo de datos para un análisis posterior (detectar errores en la implementación por ejemplo).

Este script lo que hace es separar telegramas para poder visualizarlos en forma separada dejando una línea entre ellos. Los identifica por su encabezado "FD" y el código siguiente que en este caso define su tipo y que solo puede ser "AB" o "CD". Se entiende como "fuente" varios telegramas "encadenados", uno detrás de otro.
cat $NOMBREARCHIVO | sed -e 's/\(FD[AB-CD]\)/\n\n\1/g' > tel_sep.txt


En este caso solo se queda con los telegramas "AB":
cat $NOMBREARCHIVO | sed -e 's/\(FD[AB-CD]\)/\n\n\1/g' | grep '^FDAB.*'\
| sed -e 's/\(FDAB\)/\n\1/g' > tel_ab.txt


En este caso solo se queda con los telegramas "CD":
cat $NOMBREARCHIVO | sed -e 's/\(FD[AB-CD]\)/\n\n\1/g' | grep '^FDCD.*'\
| sed -e 's/\(FDCD\)/\n\1/g' > tel_cd.txt


Básicamente se usan las ideas de grupos "\( \)" y de reemplazos de sed, combinadas en algunos casos con grep para seleccionar solo algunas líneas.


[ add comment ]   |  [ 0 trackbacks ]   |  permalink
Reemplazando matlab con python
Hace bastante tiempo que bastantes personas con distintos perfiles me vienen hablando bien de python, de su facilidad de uso y potencia. También habia visto en internet que habia muchas bibliotecas "científicas" y para practicamente cualquier cosa, hecho que me agradaba.

Hace bastante tiempo también que queria encontrar una solución definitiva para poder usar libremente y sin limitaciones mis scripts en Matlab. Si, esta Octave, que es Software Libre y esta bastante bien y es bastante compatible, pero le faltan algunas cosas y pensar en integrarlo con aplicaciones gráficas (u otras cosas) más alla de algunos bindings, no parecia muy sencillo. Tampoco parece que existan al día de hoy muchas bibliotecas para cosas más avanzadas.

Siempre me gusto Matlab porque podía hacer cosas de una forma relativamente sencilla, pero también me encontraba con el problema de que después dependia de su intérprete (privativo) y su infraestructura para ejecutar ese código. Cuando supe de Octave (hace ya unos años) pensé que seria bueno mantener mis scripts compatibles con este último para poder garantizar su distribución y uso (por ejemplo) y es lo que hice hasta hoy (o ayer, je).

Hace unos días, Juan Vuletich me dijo: "¿Probaste Smalltalk? Tiene todas las ventajas de matlab, todas las de C, y algunas extras..." y bueno... a raíz de eso pensé si en python no podría hacer algo similar... y dado que estaba con ganas desde antes de ponerme a aprender, busqué y me di cuenta que la misma idea ya se le habia ocurrido a mucha gente (por suerte para mi :-)) ya que encontré muchisimo material y la "migración" total solo me costó un par de horas. Asi que Smalltalk quedará para la próxima (no lo descarto!)

Con las bibliotecas SciPy y Matplotlib se resuelve lo básico.

Se obtiene una sintaxis muy similar a Matlab, lo que facilita enormemente el "traspaso", y una vez en python podemos interfacear nuestro código con miles de bibliotecas (la comunidad python es realmente grande, muchisimo más grande que la de Octave al menos) y manteniendo, ante todo, la simplicidad y claridad.



También use algunas referencias que me fueron de gran utilidad, como esta tabla comparativa y esta descripción que hacen en el sitio de ScyPy.org: NumPy for Matlab Users.

De esta forma se puede trabajar mediante scripts y funciones. Para hacerlo de forma interactiva, ingresando comandos y viendo su resultado en el acto (la forma "standard" de Matlab) tenemos IPython, un excelente shell interactivo para python con soporte para Matplotlib y computación paralela.

Ahora, lo único que queda a favor de Matlab es la cantidad impresionante de toolkits que tiene para un montón de temas específicos (signal processing, redes neuronales, lógica difusa, etc) y Simulink, pero dada la cantidad de bibliotecas que hay en python y la facilidad que existe para integrar código (además que en este último caso el usuario tiene un control total sobre la aplicación, pudiendo hilar tan fino como quiera) no creo que no sea nada que no se pueda lograr con un poco de trabajo (sobre todo para los usuarios que también son programadores).

Si miran el siguiente código que puse a manera de ejemplo, se daran cuenta que perfectamente puede pasar como "código Matlab". En este caso en particular es practicamente igual. Básicamente lo que hace es comparar con gráficos (que además de mostrados son guardados en png) tres DFT con distinto N, mostrando que a pesar de que alcanza para recuperar la señal con N=L, rellenando la señal original con ceros y aumentando el N de la DFT se logra una mejor visualización del espectro.

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
from pylab import *
 
L = 10
x = ones( L )
 
# Figura 1: N = L = 10
N = L
X = fft( x, N )
figure(1)
subplot(311)
title('N = L = 10')
horiz = arange(0,L,1)
stem( horiz, x )
subplot(312)
horiz = arange(0,N,1)
stem( horiz, abs(X) )
subplot(313)
stem( horiz, angle(X) )
savefig( 'figura1.png' )
 
 
# Figura 2: N = 50
N = 50
X = fft( x, N )
figure(2)
subplot(311)
title('N = 50')
horiz = arange(0,L,1)
stem( horiz, x )
subplot(312)
horiz = arange(0,N,1)
stem( horiz, abs(X) )
subplot(313)
stem( horiz, angle(X) )
savefig( 'figura2.png' )
 
 
# Figura 3: N = 100
N = 100
X = fft( x, N )
figure(3)
subplot(311)
title('N = 100')
horiz = arange(0,L,1)
stem( horiz, x )
subplot(312)
horiz = arange(0,N,1)
stem( horiz, abs(X) )
subplot(313)
stem( horiz, angle(X) )
savefig( 'figura3.png' )
 
 
show()


Conclusión: aprendí algo de python que era algo que tenia pendiente y resolví el problema que tenia de poder tener aplicaciones "standalone"[1] de calculo numérico relativamente avanzado y con una sintaxis clara y sencilla. Cuando se requiera tiempo real o velocidad de procesamiento no quedará otra que seguir recurriendo a c/c++ (en este punto es bueno mencionar que python puede llamar directamente a funciones c/c++) o assembly.
Para los que ya manejen otro lenguaje de scripting (tipo Perl, Lua o PHP) y hagan cosas con Matlab recomiendo que al menos lo prueben ya que no es para nada complicado y los beneficios son muchos.

[1] Bueno, para ser exactos precisamos el intérprete de python, pero es Software Libre y multiplataforma :-)

Update 1: En mi otro blog dedicado exclusivamente al audio escribí "Funciones para trabajar con wav's vectorialmente en python" (es decir "a la manera" de matlab) como una de las primeras consecuencias de este post. Por otra parte, en el grupo Buena Señal surgió un thread bastante interesante sobre esto (link) con más datos y opiniones sobre lo planteado en este post. Además, Juan Vuletich también escribió en su blog sobre este tema, donde propone a Smalltalk como reemplazo y compara el ejemplo aqui dado con su respectiva solución en squeak (una implementación libre de Smalltalk): "A taste of Squeak for Signal Processing folks"

Update 2: Me crucé con este interesante blog destinado precisamente al tema de este post: "Python as a better Matlab" y me enteré de esto: "Sage: Un sistema de álgebra computacional basado en Python".


[ 2 comments ] ( 1063 views )   |  [ 1 trackbacks ]   |  permalink  |  related link
Convolución circular rápida (aplicación en reverbs)


[ add comment ]   |  [ 0 trackbacks ]   |  permalink  |  related link
Agregando nuevos service menus a Konqueror y KDE
Esto sirve para agregar opciones de ejecución o acciones a determinados archivos cuando usamos KDE.

Hay que crear un archivo con extensión ".desktop" y agregarlo en "~/.kde/share/apps/konqueror/servicemenus/" para que este solo disponible para nuestro usuario y en "/usr/share/apps/konqueror/servicemenus/" para que lo este para todos los usuarios del sistema.

Como ejemplo pongo lo que uso para reproducir videos en un screen alternativo (el tv-out), pero se puede hacer cualquier cosa que a uno se le ocurra:
[Desktop Entry]
Actions=Play in TV-OUT;
Encoding=UTF-8
ServiceTypes=video/mpeg,video/x-msvideo,video/x-ms-wmv,video/x-ms-asf,
video/flv,video/mp4
 
[Desktop Action Play in TV-OUT]
Icon=
Name=Play in TV-OUT
Exec=xterm -e ~/scripts/video/mplay_to_tvout.sh "%U"

En este caso en particular lo que hace es ejecutar un script pasandole el nombre del archivo (la cadena "%U" será reemplazada por el path y nombre de archivo sobre el que se hizo click) y dentro de ese script se ejecutan los comandos necesarios, como ser setear correctamente la variable de entorno DISPLAY, exportarla, pasar los parámetros que desee a mplayer, elegir la tarjeta de sonido adecuada, etc.

Esto aparecerá por ejemplo como opción de ejecución dentro de "Acciones" cuando se haga click con el botón derecho sobre un archivo con las extensiones definidas (en "ServiceTypes").

Ya que estoy pongo el script para reproducir algo en otro screen por si le sirve a alguien:
#!/bin/sh
#uso: mplay_to_tvout.sh movie
#uso: mplay_to_tvout.sh movie subtitle
 
ARCH=$1
SUBTITULO=$2
 
export DISPLAY=:0.1 #screen del tvout
#cierra kicker (barra de tareas) para que no moleste y "tape" la pantalla
dcop kicker-screen-1 kicker-screen-1 quit
 
if [ -f "$ARCH" ] # si existe y es un archivo regular
then
if [ $# -lt 2 ] # si se ingreso solo un parámentro(cant_param<2)
then
# modo fullscreen con driver de audio alsa
mplayer -fs -vo xv -ao alsa:mmap:device=ca0106 "$ARCH"
else
if [ -f "$SUBTITULO" ] #verifica si existe $2 (el subtítulo)
then
# modo fullscreen con driver de audio alsa + subtítulo
mplayer -fs -vo xv -ao alsa:mmap:device=ca0106 "$ARCH"
-sub "$SUBTITULO"
else
echo "no existe el subtítulo $SUBTITULO"
fi
 
fi
else
echo "no existe el archivo $ARCH"
fi


[ add comment ]   |  [ 0 trackbacks ]   |  permalink
Haciendo un backup de mis bases de datos
El script que uso (con una entrada en cron) es:






mysqldump -h localhost -p -u USERNAME DATABASENAME > ~/NOMBREBACKUP.sql



[ add comment ]   |  [ 0 trackbacks ]   |  permalink

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Next> Last>>