Rake tasks para log/ tmp/ y cache/

Wednesday, 18 July , 2007

Acá les dejo algunas tareas de rake que suelo agregar cuando comienzo un proyecto nuevo, son para
sacar las cosas que no tienen que estar bajo control de versión y para crear los archivos de log (cuando lo necesitemos):

lib/tasks/log.rake


namespace :log do

  desc "Crear los directorios y archivos de log"
  task :create do

    system 'mkdir -p log'
    system '> log/development.log'
    system '> log/production.log'
    system '> log/server.log'
    system '> log/test.log'

  end

  desc "Cambia el grupo del directorio los archivos de log a www-data y pone
  permisos de lectura/escritura para el grupo"
  task :set_permissions_for_apache do

    system 'chgrp -R www-data log'
    system 'chmod -R g+rw log/'

  end

  desc "Saca los archivos de log del svn"
  task :remove_svn do

    system 'svn remove log/*'
    system "svn commit -m 'Estas cosas no van en el svn'"
    system "svn propset svn:ignore '*.log' 'log/'"
    system 'svn update log/'
    system "svn commit -m 'Ingnorar los archivos en log/'"
  end

end

lib/tasks/tmp.rake


namespace :tmp do

  desc "Cambia el grupo del directorio los archivos de log a www-data y pone
        permisos de lectura/escritura para el grupo"
  task :set_permissions_for_apache do

    system 'chgrp -R www-data tmp'
    system 'chmod -R g+rw tmp'

  end

  desc "Saca los archivos de tmp del svn"
  task :remove_svn do

    system 'svn remove tmp/cache/*'
    system 'svn remove tmp/sessions/*'
    system 'svn remove tmp/sockets/*'

    system "svn commit -m 'Los archivos temporales no van en el svn'"

    system 'svn propset svn:ignore "*" tmp/'
    system 'svn propset svn:ignore "*" tmp/cache/'
    system 'svn propset svn:ignore "*" tmp/sessions/'
    system 'svn propset svn:ignore "*" tmp/sockets/'

    system 'svn update tmp/'
    system "svn commit -m 'Ingnorar los archivos en tmp/'"
  end
end

lib/tasks/db.rake


namespace :db do

  desc "Saca el archivo database.yml del svn"
  task :rm_conf_file_svn do
    system 'svn move  config/database.yml config/database-ejemplo.yml'
    system "svn commit -m 'El archivo database.yml no va en el svn'"
    system "svn propset svn:ignore 'database.yml' 'config/'"
    system 'svn update config/'
    system "svn commit -m 'Ingnorar el archivo config/database.yml'"
    system 'cp  config/database-ejemplo.yml  config/database.yml'
  end

  desc "Genera el archivo database.yml"
  task :gen_conf_file do
    system 'cp  config/database-ejemplo.yml config/database.yml'
  end
end

He publicado una biblioteca que genera imágenes para representar piezas dentarias en odontogramas, entre otras cosas las biblioteca permite crear .png .jpg, etc de piezas dentarias en blanco o con sus caras pintadas de un color (similar a la ficha de odontograma en papel). El proyecto en rubyforge es http://rubyforge.org/projects/imagetooth/, También está disponible como gema de ruby:

gem install imagetooth

La biblioteca tiene un script ejecutable que permite crear las imágenes de la sigueinte manera:

 ruby imagetooth.rb  --image wwwww.png --folder ./

Esto genera una imágen de un diente en blanco en el directorio actual dónde el wwwww.png representa lo siguiente:

[arriba][derecha][abajo][izquiera][centro].png

el orden de los caracateres representa la cara del diente a pintar y el caracter el color

  • w - White
  • g - Green
  • b - Blue
  • n - Black
  • r - Red

algunos ejemplos:

generar un diente con la de arriba pintada de rojo

 ruby imagetooth.rb  --image rwwww.png --folder ./

generar un diente con la cara de arriba pintada de rojo y la cara del centro de verde:

 ruby imagetooth.rb  --image rwwwg.png --folder ./

generar un diente con la cara de arriba pintada de rojo, la cara del centro de verde y la de la izquiera de negro:

 ruby imagetooth.rb  --image rwwng.png --folder ./

además brinda la posibilidad de generar todas las combinaciones posibles(muy útil para tener las imágenes pregeneradas para un desarrollo web por ej.):

 ruby imagetooth.rb --all  --folder images/

Esto da como resultado 3125 imágenes (con 5 colores y 5 caras de dientes) divididas en directorios de acuerdo al

primer caracter del nombre de la imágen:

images/w/
images/b/
images/g/
images/n/
images/r/

La siguiente imagen fue generada utilizando imagetooth:
Odontograma de ejemplo
Para que el que tenga que desarrollar una aplicación que gestione odontogramas esta biblioteca le puede servir de base, y probablemente no tenga que partir desde cero como fue mi caso.

 http://imagetooth.rubyforge.org/

Actualmente estoy trabajando en un módulo de una aplicación web cuyo objetivo es presentar reportes de accesos a un predio, la aplicación está desarrollada en php y postgresql, los reportes están basados en vistas, dónde tengo una “vista base” llamada “stats_ingresos”, y las demás vistas hacen uso de “stats_ingresos”. Todo muy lindo, pero actualmente este sistema es muy lento, las consultas a estas vistas demoran más 2 minutos lo cual es inaceptable para una aplicación web, entonces decidí pasar esta vista base a tabla, con lo cual el costo de la consulta se reduce a 0. Obviamente esta solución tiene una desvetaja, tengo que actualizar la tabla “stats_ingresos” perdiódicamente, la actualización se va a realizar una vez por día y se actualizarán todos los accesos del mes (ya sé que esto se puede mejorar).
Para ir al grano, he decidido implentar este script de update con ruby + active_record y como metodología bdd usando rspec.
Esta es la tabla que va a reemplazar a la “vista base”:

CREATE TABLE stats_ingresos (
  id SERIAL NOT NULL,
  nombre VARCHAR(25),
  apellido VARCHAR(25),
  dni VARCHAR(12),
  id_institucion INTEGER,
  institucion VARCHAR(50),
  dia SMALLINT,
  mes SMALLINT,
  anio SMALLINT,
  ts timestamp,
  PRIMARY KEY  (id)
);

Read the rest of this entry »

Fuentes pequeñas en el menu de Firefox

Wednesday, 07 March , 2007

Luego de varios cuelgues repentinos en mi firefox 2.0, decidí instalar la nueva versión Iceweasel/2.0.0.1, entonces luego de la instalación, las fuentes del menú se ven demasiado chicas, googleando un poco leí­ hay que crear el siguiente archivo:

~/.mozilla/firefox/yourprofile/chrome/userChrome.css

editarlo y poner lo siguiente:

font-size: 12pt !important;
font-family: Tahoma !important;

input, textarea, select, button,
input[type="button"], input[type="reset"], input[type="submit"] {
font-size: 8pt !important;
font-family: Verdana !important;

}

y listo ahora las fuentes del menú se ven más grandes.

7 Paradigmas a romper para ser ágiles

Thursday, 01 February , 2007

Navegando un poco encontré este artículo que explica los 7 paradigmas que una empresa tiene que romper para ser ágil.

Navegando un poco encontré este libro para aprender a programar http://www.pragmaticprogrammer.com/titles/fr_ltp, está basado en ruby y es una versión mejorada del site http://pine.fm/LearnToProgram

Behavior driven development

Wednesday, 03 January , 2007

Dado que he visto en algunos blog el tema este de “BDD”, voy a ver de qué se trata esto del desarrollo guiado por comportamiento.

Behavior driven development (BDD) Es una técnica de programación que cuestiona el comportamiento de una aplicación antes y durante el proceso de desarrollo. Mediante preguntas tales como “Qué debería hacer esta aplicación?” o “Qué debería hacer esta parte?” los desarrolladores pueden identififcar brechas en la comprensión del problema del dominio y hablar con sus pares o expertos del dominio para econtrar las respuestas.

Mediante el enfoque en el comportamiento de las aplicaciones, los desarrolladores intentan crear un lenguaje común entre todos: gestión, usuarios, desarrolladores, jefe de proyecto y expertos de dominio.

El propósito es cuestionar cada parte de la aplicación y la aplicación entera. Estas cuestiones no tratan meramente características técnicas o requerimientos sino con características relacionadas con el tiempo y costo. Es factible para nuestra organización construir una aplicación de este ámbito? es una pregunta que se puede responder escribiendo tests de comportamiento. Exponiendo las complejidades de antemano, desarrolladores y jefes de proyecto pueden realizar mejores estimaciones de cómo ajustar la organización para manejar la creación de una aplicación. Read the rest of this entry »

Entrevista a Richard Stallman

Thursday, 28 December , 2006

Habla Stallman en un canal de televisión catalana, sobre todo lo que es la FSF y GNU. Read the rest of this entry »

OptionParser Ruby

Thursday, 28 December , 2006

OptionParser es una forma flexible y extensible para parsear argumentos de línea de comandos.

* Una opción puede tener múltiples nombres cortos (precedidos por un guión simple) y múltiples nombres largos (precedidos por doble guión). Así una opción que muestra la ayuda está disponible como -h, -?, –help y –about. Los usuarios pueden abreviar los nombres de opciones largas por un prefijo corto no ambiguo.

* Una opción puede ser especificada como sin argumentos, con argumento opcional, o requerido. Los argumentos pueden a validarse contra patrones o listas de valores.

* Los argumentos pueden retornarse como objetos de cualquier tipo (no sólo como Strings).

* Los argumentos pueden tener una o más líneas de texto descriptivo, para generar la infromación de uso.

Las opciones se especifican usando los métodos on y def. Estos métodos toman un número variable de argumentos que en conjunto construyen una definición de cada opción. Los argumentos aceptados por estos métodos están el al tabla 1.

require ‘optparse’
require ‘date’
# Add Dates as a new option type
OptionParser.accept(Date, /(d+)-(d+)-(d+)/) do |d, mon, day, year|
Date.new(year.to_i, mon.to_i, day.to_i)
end
opts = OptionParser.new
opts.on(”-x”) {|val| puts “-x seen” }
opts.on(”-s”, “–size VAL”, Integer) {|val| puts “-s #{val}” }
opts.on(”-a”, “–at DATE”, Date) {|val| puts “-a #{val}” }
my_argv = [ "--size", "1234", "-x", "-a", "12-25-2003", "fred", "wilma" ]
rest = opts.parse(*my_argv)
puts “Remainder = #{rest.join(’, ‘)}”
puts opts.to_s

produces:
-s 1234
-x seen
-a 2003-12-25
Remainder = fred, wilma
Usage: myprog [options]
-x
-s, –size VAL
-a, –at DATE Read the rest of this entry »