Archivos de la categoría ‘Uncategorized’

Buscar y reemplazar desde Ruby

Noviembre 8, 2009

Dado que la línea de comando es un chorizo de caracteres que no siempre es fácil recordar, pensé en hacer un script en ruby que hiciera lo mismo pero con una sintaxis de tipo:

srchreplace cadena_a_buscar cadena_nueva *.php

Básicamente lo que quería hacer era, por ejemplo, encontrar todos los archivos de php que hacen  referencia a “contabilidad.php” y cambiarlos por “contabilidad.py” .

Lo primero, para no reinventar la rueda fue buscar un script similar. Lo más parecido que encontré fue en la página “Erik on Rails“. Si bien no era exactamente lo mismo, tenía una clase que se podía aprovechar. Gracias Erik.

Lo segundo fue crear el script que haga uso de esa clase.

Acá va el script:

#!/usr/bin/env ruby
class File
def replace(pattern, string)
full_path = File.expand_path path
return if !File.file?(full_path)

reopen(full_path, 'r')
lines = readlines

changes = false
lines.each do |line|
changes = true if line.gsub!(pattern, string)
end

if changes
reopen(full_path, 'w')
lines.each do |line|
write(line)
end
close
end
end
end

if ARGV.count != 3
puts "Error: argumentos incorrectos"
puts "Uso: srchrep.rb cadena_buscar cadena_reemplazar archivos"
puts "Donde 'archivos' es una lista de archivos en formato *.* entre comillas "
else
# ver si existe archivo
# hacer una lista de archivos que tengan la cadena buscada
files = Dir.glob(ARGV[2])
numarch = files.count
# por cada archivo de la lista
for filename in files
arch = File.open(filename)
arch.replace(/#{ARGV[0]}/,ARGV[1])
end
end

El principal problema es que el shell convierte la línea de comandos expandiendo los comodines, por lo cual la sintaxis pasa a ser:

./srchreplace.rb cadena_buscar cadena_reemplazar "*.php"

No encontré manera más elegante de hacerlo. Pero me resulta práctico.

Buscar y reemplazar desde línea de comandos en linux

Septiembre 5, 2009

Si bien estoy muy contento con el editor para programadores Geany (es realmente una maravilla: liviano, completo, fiable, extensible), extraño la opción de Komodo Edit de buscar y reemplazar en todos archivos del proyecto. Para eso encontré en este blog, la siguiente solución en una sola línea de comando que traduzco:


find . -name "*.php" -print | xargs sed -i 's/foo/bar/g'

Donde:

find . name ".php" -print

Encuentra de forma recursiva todos los archivos con la extenión php y lospresenta en una lista de tipo:

./archivo.php
./otros/unomas.php
...

xargs
Este comando se usar para pasar un conjunto de argumentos a un comando (combina la salida de find y corre el comando para cada una.
sed -i 's/foo/bar/g' – SE es Stream Editor, una interesante herramienta que toma una entrada y aplica las tranformaciones explicitadas. Pueden encontrar información en este tutorial.

Reportes de fallos (bugs)

Mayo 18, 2009

Al reportar un bug existente en Pidgin en Ubuntu 9.04, vi un link a un artículo acerca de cómo reportar errores de forma eficiente. Dado que cada tanto recibo reportes de bugs de código hecho por mí, linkeo acá el artículo para que lo lean los usuarios de éstos programas. VER ARTICULO ACA.

Python en Apache 2 (para tarados)

Febrero 4, 2009

Solo para no buscar por Google como un tarado por enésima vez:

Para correr scripts hechos en Python y Ruby en Apache2 sin recurrir a mod_python (corriendo sobre Ubuntu o Debian-símiles).

Editar: /etc/apache2/sites-available/default

o el sitio que corresponda.

Agregar en ls sección <Directory /var/www > o donde correponda

AddHandler cgi-script .rb
AddHandler cgi-script .py

El resto es obvio:

  • reiniciar el servidor ( /etc/init.d/apache2 force-reload o restart)
  • que los scripts tengan permiso de ejecución
  • que tengan al inicio la línea de arranque (es mejor  #!/usr/bin/env python o ruby según corresponda)
  • eventulamente editar en la configuración del directorio el permiso para ejecutar cgis en la parte de Options agregando +ExecCGI )

La siguiente vez que lo busque como un tarado y lo encuentre en mi propio blog, prometo postearlo en los comentarios de forma recursiva hasta envejecer.

Pylint: chequear código escrito en Python

Enero 31, 2009

Dado que la calidad de mi código siempre dejó mucho que desear (ausencia de comentarios, estilo desprolijo, etc),Pylint me viene como anillo al dedo cuando hago algo en Python. El problema es que la configuración que trae por defecto no me gusta: hace que salten alertas sin motivo y me llena de reportes que no necesito. Básicamente cuando escribo quiero que me alerte sobre aquellas cosas que lo ameriten y que me muestre nada más el puntaje que le da a mi código. Me marco como meta un código con puntaje superior a 9 y libre de bugs.

Cambios en la configuración de Pylint

1. En el directorio $HOME (/home/usuario/) teclear:

pylint --generate-rcfile > .pylintrc

Con eso se genera un archivo de configuración que queda oculto (por el punto delante del nombre de archivo) en uno de los lugares donde pylint va a buscar por defecto un archivo de configuración.

2. Edito el archivo generado:

nano .pylintrc

3. Edito las siguientes líneas asignando los siguientes valores:

# Disable the message(s) with the given id(s).
disable-msg=C0103
# Include message's id in output
include-ids=yes
# Disable the report(s) with the given id(s).
disable-report= R0801, R0701, R0101, R0001, R0003
# Maximum number of characters on a single line.
max-line-length=100

Con eso obtengo un reporte limpio con un puntaje asignado al código.

Pueden encontrar más documentación sobre pylint en su directorio de documentación (en Ubuntu es /usr/share/doc/pylint) que si lo abren desde el navegador pueden encontrar unas útiles páginas con faq y características completas del programa.

Mantengo una pestaña del navegador apuntando al reporte generado para actualizarlo y leer la última versión.

El reporte lo genero tecleando:

pylint nombre_del_programa.py > reporte.txt

Si teclean:

pylint -f html nombre_del_programa.py > reporte.html

les queda en formato…  HTML  ;-)

Exploración de datos con Epi Info 6.04

Octubre 7, 2008

Siguiendo con la serie Epi Info, les paso un “pique” para explorar cómodamente los datos almacenados.

En primer lugar, ejecuto el archivo de comandos donde tengo definidas las variables con sus etiquetas correspondientes. En le caso de la investigación que estamos haciendo en el momento (sobre Intentos de AutoEliminación) se llama IAES.PGM.

Eso hace que queden definidas variables que después voy a usar para cruzar.

En segundo lugar, ejecuto el comando: ROUTE tablas.txt <ENTER>

Con eso lo que hago es que se guarde todo lo que voy a hacer a partir de ahora en el archivo llamado tablas.txt. Creo un acceso directo a ese archivo (que va a estar dentro del directorio de Epiinfo, generalmente C:\EPI6) en algún lugar que me quede cómodo (en Win: dentro de “Mis Documentos” o similar).

En tercer lugar, comienzo a jugar con las variables haciendo cruzamientos con el comando TABLES.

Para eso escribo TABLES <ESPACIO> y oprimo la tecla F3, con lo cual se me despliega una lista de variables. Uso preferentemente las que están al final ya que son las que tienen definidas etiquetas en lugar de códigos numéricos (para eso fue que ejecuté antes el IAES.PGM).

Entonces, en comandos queda:

run iaes.pgm
route tablas.txt
tables sexo metodo

Con eso se generan acumulativamente los resultados en tablas.txt, con lo cual puedo explorar lo que se me ocurra y mirar después tranquilo los resultados.

Eventualmente, aquellos cruzamientos que me interesan, los incluyo como una línea más dentro del programa (IAES.PGM).

Ejemplo de script (programa) para EpiInfo 6.04

Octubre 4, 2008

Cuando tengo que analizar datos en EpiInfo, me queda más cómodo hacer un pequeño script (programa) para que procese todo y genere un archivo de texto con el resultado, para poder verlo más tranquilo y no quedarme corto con la pantalla.

Actualmente uso EpiInfo 6.04 (versión para DOS) con Linux, mediante DosBox (uso Ubuntu, está en los repositorios). La instalación de Epi en Linux excede esta nota (puede ir en siguiente post). De todos modos, en Linux tienen (también en los repositorios de Ubuntu) el PSPP, clon del SPSS.

En Windows: crear con el Notepad (Block de notas) un archivo y guardarlo con un nombre apropiado (8 caracteres: límite de DOS) con extesión “.pgm” (por ejemplo: “analizar.pgm”).

El texto de un programa tipo está a continuación con comentarios (en Epi, el asterisco marca los comentarios). Uso IAES como nombre de archivo porque se trata de datos sobre Intentos de AutoEliminación).

* Leer el archivo donde están guardados los datos
read iaes.rec
* Borrar el archivo de SALIDA DE DATOS si es que existe alguno
erase iaes.txt
* Indicarle al sistema que escriba los resultados en un archivo de texto llamado IAES.TXT
route iaes.txt
* Setea variables internas acerca de qué datos estadísticos mostrar
set statistics=on
set percents = on
* La variable DIAGNOSTIC indica quién realizó el diagnóstico del IAE, la voy a recodificar para convertir los códigos numéricos en valores más legibles.
* Definir una variable (DIAG) en modo TEXTO, con 10 caracteres (son 10 guiones bajos)
define diag __________
* Recodificar la variable original (DIAGNOSTIC) que tenía valores numéricos en la variable nueva (DIAG)
* codificando el 1 como Médico, 2 como Residente, 3 como Otro y (IMPORTANTE) declarando 9 como valor MISSING (equivalente a SIN DATOS). Fundamental para el procesamiento adecuado de los datos (ver el PUNTO luego del signo de IGUAL al final).
recode diagnostic to diag 1=Medico, 2=Residente, 3=Otro, 9=.
* Calcular las frecuencias de los valores de la variable DIAG
freq diag
* Aplico el mismo esquema para el resto de las variables que me interesan
* ==================================
define entrev __
recode entrevista to entrev 1=Si, 2=No, 9=.
freq entrev
* Con las edades, se requiere de una aproximación distinta.
* Creo una variable llamada RANGO_EDAD para convertir las edades a rangos
define rango_edad ___________________
* Recodifico EDAD en RANGO_EDAD, agrupando de 10 en 10
recode edad to rango_edad by 10
* Calculo las frecuencias de rangos de edad
freq rango_edad
* Los barrios no están codificados y son un campo alfanumérico, por lo que no necesito recodificación
freq barrio
close *
* CIERRA TODOS LOS ARCHIVOS
close iaes.txt

Guardan el archivo PGM dentro del directorio de EpiInfo.
Guardan el archivo de datos (REC) también dentro del directorio EpiInfo.
Luego ejecutan EPIINFO (abren una ventana de comando, teclean “C:\EPI6 <ENTER>”)
Van al menú PROGRAMA -> ANALISIS

En la ventana de análisis teclean:

run iaes.pgm <ENTER>

(sustituyan IAES.PGM por el nombre que le hayan puesto a su archivo).
Si está todo OK, se ejectuan todas las órdenes (las ven pasar en pantalla). Si no está todo OK, aparece una ventana de error y se detiene todo. Continúan con <ESCAPE>.
Para ver el resultado, abren con el block de notas el archivo IAES.TXT (o el nombre que le hayan puesto), que está dentro del directorio de EpiInfo.
Cada vez que ejecuten el programa, ese archivo se crea de nuevo, por lo cual no tiene sentido modificarlo a mano. Simplemente es para tener el resultado visible y poder cortar y pegar en otro lado.

EpiInfo y Línea de comando en XP

Octubre 3, 2008

Ya hace rato que no uso más Windows, pero el resto de mis colegas sí. Estamos procesando información usando Epi-Info y nos queda más cómodo usar la versión 6.04 (bajarla aqui), que funciona bajo DOS.
Entonces, para quienes usen XP:
Copiar EpiInfo 6 en un directorio bajo el disco C que se llame EPI6.
Si tienen los archivos de instalación, los copian a un directorio cualquiera (por ejemplo c:/epiinst) y desde ahí ejecutan el programa de instalación.
Para acceder a una ventana de comandos (shell) en XP:

Inicio –> Ejecutar –> cmd
o bien pulsando la tecla “Windows + R”

luego:

cd c:\epi6
epi6

Una vez dentro de EpiInfo, en Programa -> Analisis acceden a la ventana de análisis de datos, una vez ahí, pueden usar los siguientes comandos:

read archivo.rec
# lee un archivo con registro de casos
freq var
# tabla de frecuencias (absolutas y %) de la variable var
tables var1 var2
# cruza las variables var1 contra var2 en una tabla

Una mejor alternativa es escribir un pequeño programa que realice estas cosas de modo automático y redireccione la salida a un archivo de texto para después procesarlo más tranquilo.
En el siguiente post va un ejemplo con comentario.

Respaldo de mysql desde línea de comando

Octubre 3, 2008

Problema: Dos por tres tengo que respaldar una base de datos mysql en un servidor remoto, comprimir el archivo y copiarlo a mi computadora. Cada vez que lo voy a hacer, busco en internet el comando de respaldo porque nunca me lo acuerdo. Lo posteo aquí para encontrarlo rápido la siguiente vez que lo necesite. La alternativa es tomar algo para la memoria.

Solución 1:

mysqldump -h localhost -u username -p database_name > backup_db.sql
gzip backup_db.sql
scp backup_db.sql.gz usuario@direccion.del.servidor:/directorio/directorio

Solución 2 (en proceso): hacer un script que realice todo esto de manera automática y ponerlo como comando de ejecución programada en cron. Va en siguiente post.

Lighttpd y error “Forbidden”

Junio 22, 2008

CONTEXTO: Estoy con ganaas de migrar el sistema de la empresa que está armado sobre un robusto Apache + Php + Mysql a algo más ajustado al tipo de sistema del que se trata: bajo numero de accesos, necesidad de respaldos rápidos y minimizar opciones esotéricas de configuración.
Se me ocurrió que la combinación más sencilla sería Lighttpd + Ruby + SQlite3.

PROBLEMA: Cuando quise configurar Lighttpd, me enloqueció con errores de tipo “403… Forbidden”. No podía entender porqué era el error si tenía todos los permisos ajustados para que todo el mundo pudiera leer.

SOLUCION: se me fueron los problemas cuando modifiqué el archivo de configuración ( /etc/lighttpd/lighttpd.conf ). Comenté las líneas server.username y server.groupname de modo que quedó la opción por defecto (“don’t care”):

## change uid to (default: don’t care)
#server.username = “www-data”

## change uid to (default: don’t care)
#server.groupname = “www-data”