5 jul 2012

Testeando mi clase.

Tengo una clase, que desde el principio me dió dolores de cabeza, así que intento testear todo lo que puedo, así logré que me quedara horrible, pero muuucho más lindo de lo que me venía quedando antes.

La cuestión es que mi clase interactúa con un tipo de archivo que yo no puedo crear con facilidad y eso me dificulta bastante el testeo, tengo que ver como darle información falsa. Pero sin cargar de boludeses el codigo original (ya que los test deben estar separados del código)

Ahora creo que tengo una idea más o menos buena de como puedo lograr esto... Creo un módulo (llamemole TestHelper) con un metodo que haga la chanchada que yo necesito. Luego, hago MiClase.include TestHelper y voila, testeo.

Ahora, hay una alternativa a esto, que es crear una clase para testear con las funciones que sean necesarias. Entonces para testear la clase MyClase creo una clase paralela que implementa todas las funciones... pero eso es más complicado y me parece que se refiere más a la cuestión de módulos complejos.

8 jun 2012

Tablas HTML

Al parecer, las tablas en HTML tienen algunas dificultades, estuvimos intentando hacer una tablae indicar por ejemplo, que ajuste la altura de las filas, para que entre todo el texto de la primer columna, si el de la tercera no entra, no importa y al parecer, eso es liza y llanamente imposible.
Pero además, en la busqueda saltaron muchas cosas de lo más interesantes:
  • Si una tabla es grande y uno le indica las medidas, la página se carga más rápido que si uno no le indica. (table-layout)
  • En muchos casos, para poder darle atributos css a los contenidos de una celda, hay que ponerlos adentro de un div.
  • Al parecer, con respecto a los estilos, hay dos clases de elementos, bloques (p div) e inlines (span) y cada uno sigue reglas diferentes, para cambiarlo hay que usar display.
  • La referencia supuestamente legal para todo esto está en W3 en un idioma bastante legible.
Bueno, nuestro problema quedó sin solución, pero anda bastante. Ya mejorará un poco. Por el momento se basa en meter el texto en un parrafo (p) con: 
  • text-overflow: ellipsis;
  • height: auto;
  • max-height: 2.5em;
  • overflow: hidden;


4 jun 2012

Rails - Deployment (reformulación)

Bueno, después de pensarlo un poco, me parece que la cosa se simplifica un poco.
  1. Configuración del sistema. (Debiera ser manejada con puppet o similar).
    Para todas estas acciones se requiere acceso de root.
    1. Crear usuario para la aplicación.
    2. Instalar dependencias, librerías, etc.
    3. Instalar aplicaciones (ruby, mysql, sudo, apache/nginx, passenger.
    
    # adduser
    # aptitude install build-essential openssl libreadline6 libreadline6-dev curl \
      git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3    \
      libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool     \
      bison subversion
    # aptitude install libmysqlclient-dev
    
  2. Configuración a nivel de usuario (Se automatiza con capistrano).
    NO se requiere acceso de root.
    1. Instalación de rvm, ruby, bundle. (cap deploy:setup)
    2. Clonación del repositorio.
    3. Actualizaciones.
    Se necesita leer con suerte: capistrano, rvm, bundle y load deploy/assets .
  3. Configuración de la aplicación:
    Requiere SUDO. (o sería mejor con sudo)
    1. Compresión de los logs (logrotate).
    2. Cron jobs. (whenever)
    3. Aviso de errores. (ni idea) aunque quizás es god.
    4. Configuración del virtual host. (Apache/nginx).
    5. Configuración del usuario en MySQL. (Encargarse de el archivo database.yml. Aunque las modifiqué un poco para parecerse más a esto)
Otra página de utilidad, podría ser debian-admin.

Otra opción, radicalmente distinta, es utilizar los paquetes de debian para hacer la instalación debianizada.

1 jun 2012

Rails - Deployment

Bueno, aprendizajes más, aprendizajes menos ahora estoy en la cuestión del deployment (poner una aplicación en producción) otra ves, denuevo es complicado, así que esta vez voy a intentar aprender un poco, y para aprender hay que escribir.

  1. Parece que a la aplicación hay que aislarla (creandole un usuario propio):


    # adduser

  2. rvm: para que ande una aplicación de rails, tiene que estar instalado ruby, así que hay que instalarlo junto con sus requerimientos:


    # aptitude install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion

    # curl -L get.rvm.io | bash -s stable

    # adduser usuario rvm

  3. Como usamos mysql y ruby hay que instalar tambien:


    # aptitude install libmysqlclient-dev


  4. Ahora falta clonar el repositorio y configurar la aplicación. (Esta parte se debería automatizar con capistrano y otras herramientas como esa.)


    $ git clone <...>
    $ gem install bundle
    $ cd aplicacion/
    $ bundle install
    $ rake db:setup RAILS_ENV=production  
     
  5. Automatizando con capistrano, esto se complica un poco, y se simplifica otro poco. Por un lado hay que seguir algunas instrucciones. Luego, hay que hacerle algunas modificaciones para encargarse de el archivo database.yml. Aunque las modifiqué un poco para parecerse más a esto. Además hay que tener bien configurada la conexión ssh con el server (en ~/.ssh/config).
  6. Después viene la parte de instalar passenger que al final no es tán dificil (pero seguro que se complica un poco). Me parece que habría que crear mejor dos archivos (/etc/apache2/mods-available/passenger.[conf|load]) y además uno para cada aplicacion (/etc/apache2/sites-available/passenger) y utilizar las herramientas de Debian a2enmod y a2ensite como se debe. Obvio que esto habría que automatizarlo (usando puppet).
  7. Ahi estoy ahora, pero faltan algunas cosas, a saber:
    1. configurar passanger.
    2. Manejar los errores y los logs. (logwatch y logrotate ?)
    3. Automatizar la instalación de las aplicaciones y la creación del usuario.
    4. Encontrar un metodo simple para actualizar la aplicación.
    5. Utilizar la opcion "bundle install --deployment"
    6. Programar un backup de la base de datos.

Ahora estoy así, necesitando una mano con esto... ¿cuál será el canal para pedir ayuda?

11 may 2012

Git en windows

Hoy estuve otra vez puteando con git en windows, así que vamos con las cosas como son:
Primero baja e instala msysgit.

En la instalación hay que tener en cuenta un par de detalles: pero vería el punto de line endigs.

En la mayoría de los casos, lo más feliz es: false. La cuestión es cuales son los programas que editan texto, si uno puede elegir, entonces da para usar false. Si nadie usa linux, entonces false sigue siendo una buena idea. En caso de que estas dos condiciones no se dan, hay que usar true :(.

Para la clave ssh, hay que crearla desde la consola como dice el manual y crear desde la consola el archivo .profile y agregarle este script.

Después de eso solo falta modificar un poco algunos archivos como .bashrc para hacernos la vida más facil.

Eso es todo, git andando en windows bastante bien :) 

 

9 abr 2012

hashing y las aclaraciones

Hashing es una forma de ponerle un número a algo que originalmente no es un número. Así que estuve buscando un poco para ver si lo podía usar en el sistema de expedientes, así me encuentro con que una falla de documentación (que espero denunciar más antes que temprano).

Parece que la alternativa es usar Digest (qué es eso?) ya veremos. Aunque al parecer hay variados medios de hashing.

La cuestión es que quería inventarme el id de los expedientes y tengo la esperanza de poder hacer valores únicos... (son 25_000) nada más...
Bueno, la cuestión es que tengo que meter el id en el pequeño espacio entre -2_147_483_648 y 2_147_483_647 ( 2³² )

Por ahora parece que voy a usar CRC32 (de la librería zlib) y voy a ver que onda... pero lo que debería hacer es usar una gema a partir de murmurhash3.

La onda sería copiar nashby/cityhash pero con los contenidos del otro y está este a medio hacer.

Será cuestión de probar!

22 mar 2012

testeando c

Ahora estoy por aprender C (no C++ ni C#), algo bien dificil de buscar en internet (buscá C en google y seguro que salen cosas útiles)...

Para testear C, hay un "algo" que se llama Check y otros sistemas para test unitarios. (test de a partes).

El problema vino cuando quise testear el producto terminado, algo que interactúe con un programita de consola, lea el standard output y escriba en el standard input, de a turnos y chequé que los resultados son los esperados.

Asi me encontré que no hay en ruby una forma feliz de interactuar con un programa taaan simple.

Lo único que encontré es:
- Kernel.exec es muuy molesto.
- Había una gema que hacía eso, pero... el último commit es de 2008. Utilizaba algo llamado termios de linux (que no está muy bien documentado tampoco).
- Un tipo escribió una guia muy linda sobre ejecución de archivos en ruby, pero no le puso indice. (Parte 1, parte 2, parte 3)
- Ahí encontré que la posta son dos librerías olvidadas de la stdlib de ruby. PTY y Open3.
- Una posibilidad que no llegué a leer es expect.

Esto, lo quiero para poder testear estos "programas".


26 feb 2012

Un linux para viejos

Bueno, llega un momento en que uno quiere a la fuerza aplicar linux, y dice algo como, le instalo linux a mi abuela, que le va a resultar más fácil que windows y además le va a andar en el cacharro que tiene.

Pruevo varias distros:
  • greenie linux una versión eslovaca tiene una versión con openbox, pero yo no entiendo nada.
  • ubuntu tiene supuestamente una versión liviana, pero no es fácil.
  • fedora tiene su versión con xfce que es la que estoy probando ahora.
  • además pruevo otros, crouchbang (inglés), nimbleX (por error).
Todas tienen en común ser bien distintas de windows, tienen iconos chiquitos o tienen cosas sin traducir.
 Ahora estoy probando fedora 16 con xfce, que cosas le arreglo para que sea fácil?
  • Iconos en el escritorio. (firefox)
  • Saco lo de los distintos escritorios.
  • Panel inferior. (saco el inferior y muevo el superior)
  • Agrando la letra.
  • Marcadores en Firefox (y cambio "Most Visited" por "Más visitados")
  • Saco el icono de Sistema de Archivos del Escritorio.
  • Activo el horario por Red.
  • Actualizo el sistema.

Ahí queda un linux bastante estable que tiene firefox.
Tiene algunos puntos flojos, a saber:
  1. El lector de mail no va y no se como poner gmail por default. (quizás con esto?)
  2. No se autologea.
  3. El menú de aplicaciones tiene demasiadas opciones, me gustaría sacar algunas, pero no se dónde configurarlo.
  4. La tipografía es horrible.
  5. Carpeta personal aparece con puntos suspensivos.
  6. Las actualizaciones tardan una bocha.
Veremos que sucede, deseenmé suerte (ya a mi abuela).

14 feb 2012

Sobre git (procedimiento rudimentario)

La idea de los commits es poder separar lo que funciona de lo que no (aislar los problemas) si está todo en un gran commit no sirve de nada (excepto para poner todo o sacar todo) por lo que es importante que haya muchos commits, y que en cada uno haya un cambio.

Así que acá presento un procedimiento rudimentario para lograrlo de forma simple y clara.

La onda es que cuando te agarra la voragine programadora hagas el siguiente procedimiento, que aunque rudimentario puede funcionar.

0. hay que empezar desde *master* y tiene que estar todo *limpio*, si hay cambios de algun tipo hay que borrarlos `git co .` o guardarlos para después `git stash`

1. Creas una rama donde trabajar


        $ git checkout -b nombre_de_la_nueva_rama`

2. Haces un cambio cualquiera o dos como mucho, si corres un generador ya está, si modificas 2 archivos y lo que pusiste _anda_ ya está. La cuestión es lograr que eso que acabas de escribir ande. si agregas un botón y el botón se ve, fue, ya está, es hora de comitear.

3. Comitea lo que acabas de cambiar (ahí te pide un comentario, descriví lo que hiciste)

        $ git add . && git commit

4. Repetí 2-3 tantas veces como sea posible.

5. hacé un push (si la rama no existe primero creala)

        $ git promote
        $ git push

De esta forma quedan un monton de commits horribles, pero cada uno tiene una cosa que anda por si sola, así que uno puede, al encontrar un error, ver que commit lo creo y revertirlo `git revert` o corregirlo, pero entiende para qué está cada linea de código.