Varias cosas

Cambié el teclado (por un Logitech KB-120) pero he aquí que estoy usando de nuevo el anterior (MS Comfort Curve 3000), simplemente no me acostumbro al layout en español (uso latam) ya que para usar caracteres como las llaves hay que pulsar alt gr, más allá de que esto también se soluciona cambiando el keymap a latam ( lo cual hice) me surgió otra gran desventaja. Al no tener este teclado el descanso de la palma largo como el del Comfort Curve, me salió un callo + ampolla en la muñeca muy incomodo al rozar la muñeca con la mesa al escribir. He aquí que aproveche para limpiar el viejo teclado y lo estoy usando de nuevo.

Por otra parte ya hace un tiempo que no estoy utilizando Fluxbox ( y se ve en mis capturas de pantalla anteriores) sino i3, i3 es un tiling window manager, los cuales no solían gustarme hasta que probé este; por algun motivo i3 es extremadamente intuitivo y está muy bien documentado, y hasta ahora no he tenido problemas. Es muy rápido y además permite organizar las ventanas de una forma muy dinámica lo cual es genial.

Por otra parte, se viene en futuro otro post de criptografía, esta vez con un ejemplo en Go de como implementar Cipher Block Chained y Counter mode con cifrado AES. En cuanto organice el código lo compartiré.

Y por último pero no menos importante está el nuevo lanzamiento del sitio web de mi compañía EosWeb


Scratching an itch

I'm starting to love Ruby, mainly because it allows me to do what I like most about programming. Scratching personal itch it's a great thing, specially when it allows you to tackle boring repetitive  tasks. Ruby allows to do it fast, really quickly wrapping up a script that solves your problem, and then move on.

I just did that when facing the problem on having to create some sprites for a new website, I just didn't want to open GIMP and star fiddling around with layers, pixel, screen rulers and that kind of thing. So I just came up with an easy script that allowed me to create a png sprite based on a list of images, and also generates the CSS code to paste in my stylesheet (just because we can).

Since I thought somebody might find it useful, I packaged it as a gem and now is available in RubyGems, just:

gem install spritey

and run it with:

spritey -i foo.png,bar.png,baz.png -o name

and voila! I should note that I did the optparse part and the actual gem packaging really fast so expect (and please report) issues .

you can see and contribute code on the project repo


Aprender con rueditas

Mientras estaba aprendiendo a utilizar codeception para incorporar acceptance test al desarrollo de una aplicación web en PHP que utiliza bastante Javascript, me puse a pensar ¿Por qué me costaba tanto antes incorporar cosas nuevas a mi trabajo. Varios motivos se me vienen a la mente, pero hay algo que me di cuenta que fue diferente a otras veces?

A medida que uno se va haciendo más experimentado en el uso de una tecnología y un flujo de trabajo, espera mucho de si mismo al intentar incorporar algo nuevo. Es como si intentaramos de repente aprender un nuevo idioma dejando de hablar completamente el que veníamos usando antes, y en el cual, quizás si bien no nos sirve para lo que queremos comunicar somos relativamente eficientes. Hay gente que es más partidaria de dar el todo por el todo, dejar todo de lado y empezar de cero, pero muchas veces haciendo esto estamos desperdiciando muchísmo nuestra actual experiencia y además estamos sumando dos dificultades más:

- Aprender la nueva herramienta

- Aprender prácticas nuevas a la vez que aprendemos el nuevo lenguaje/herramienta

Me viene a la mente que cuando era chico me daba algo de verguenza ver como muchos andaban en bicicleta y mi bicicleta aún tenía rueditas. Esa impaciencia de recién estar aprendiendo pero sentir que vas atrasado y limitado. Sin dudas seguramente esto no le pasa a todo el mundo, pero creo que a veces no tenerse paciencia es mortalmente desmotivador cuando se aprende algo nuevo.

Durante los últimos años se puede decir que estuve aprendiendo a programar "con rueditas" de nuevo, ya que en vez de tirarme encima nuevos problemas en otros lenguajes, intenté incorporar primero tecnologías a lo que me era familiar. Por un lado Laravel, que me resulto un avance sobre plataformas más antiguas como CodeIgniter y CakePHP. Y que me ayudó a entender muchos otros conceptos de otros frameworks en otros lenguajes que han avanzado bastante más rápido que nuestro viejo PHP. Eventualmente me movi sobre RoR, empecé a ver otros frameworks similares, y ahí me picó el bichito de la curiosidad y comencé a jugar con Go.

No obstante el grueso de mis proyectos siguen siendo PHP, pero el conocer otras nuevas tecnologías me hizo ver formas de incorporarlas en mi desarrollo en PHP, aprenderlas en una plataforma que me es familiar, y luego moverme hacia las plataformas que me interesa ir y en las que no estoy tan experimentado(Ruby y Go).

Puede que parezca una pavada, pero es una pavada que funciona bastante, así que seguiré aprendiendo con rueditas, y las iré sacando a medida me familiarice con los conceptos.

Ah y feliz día del trabajo! a mi me toca trabajar igual :)


Ruby and Crypto

Hace poco comencé un curso de criptografía en Coursera.org, la verdad ha sido todo un desafío encontrar el tiempo para ver los videos y hacer las tareas. Pero no obstante si bien estoy terminando cansadísimo he logrado más o menos entender e incorporar algunos conocimientos. Ayer por la noche terminé una de las tareas de programación que consistía en implementar un algoritmo para descifrar códigos de un One Time Pad mal utilizado . Decidí implementarlo en Ruby que es uno de los lenguajes que estoy aprendiendo.

One Time Pad

El One Time Pad es un método de criptografía que asegura perfect secrecy (secreto perfecto) entendiéndose por esto que si alguien tiene el texto cifrado no puede llegar al texto original. El One Time Pad es relativamente simple y se basa en generar una llave del mismo largo que el mensaje original y luego realizar una operación XOR entre el el texto original y la llave generada. El one time pad es rara vez implementado de manera pura en soluciones, ya que el componente teórico faltante es un verdadero generador de números aleatorios ( por lo cual recurrimos a los números pseudoaleatorios) en la vida real, por esto y por que generar llaves del mismo tamaño que el contenido original es en muchos casos poco práctico.


Errores en la implementación

Un error fatal en la implementación del One Time Pad es el uso de la misma llave generada para más de un mensaje, dado que siendo T el texto original y K la llave T XOR K da como resultado CT (mensaje cifrado), suponiendo que tenemos T1 y T2 cifrado con la misma llave por las propiedades de la operación XOR damos que:

T1 XOR K = CT1
T2 XOR K = CT2

CT1 XOR CT2 = T1 XOR T2

Esto no nos da de por si el mensaje original pero si el XOR de los mensajes originales, a partir de allí utilizaremos un método denominado cribbing que consiste en realizar una operación XOR con una frase que presupongamos se encuentra en el mensaje. ¿Que frase? es recomendable utilizar las más frecuentes en el idioma original del lenguaje, es así como si es inglés podremos probar utilizando "the" o "with" que son palabras frecuentemente encontradas en el idioma, si presuponemos que el mensaje se trata de un reporte del clima por ejemplo utilizaremos palabras relacionadas a esto.

Entonces utilizando esta palabra  denominada CRIB tenemos que al hacer ( CT1 XOR CT2 ) XOR CRIB (en cualquiera de las posiciones de CT1 XOR CT2) si la palabra existe en el segmento del mensaje original, se revelara el fragmento de carateres originales de uno de los mensajes.


Para realizar esto cree un pequeño programita que pueden ver en mi página de github. Estoy casi seguro que este programa contiene algunos errores, pero ya los depuraré y de momento me sirvió para descubrir el mensaje original.

Para realizar el programa aprendi bastante sobre arrays, y sobre la operación pack/unpack de Ruby que permite convertir cadenas ASCII a distintos formatos (binario, hex, etc), la operación zip, el operador XOR ^ y varias otras cosas, entre ellas que no se debe utilizar nunca más de una vez la misma llave de OTP.


Aplicaciones de escritorio con Ruby + Gtk

Hace poco en las reuniones mensuales de RubyLit, surgió el tema de la inexistencia de aplicaciones como Delphi o C++ Builder para hacer aplicaciones gráficas en GNU/Linux puntualmente con Ruby o Python. La realidad es que cuando uno se introduce al mundo del SL ve que las cosas están pensadas de una manera bastante distinta. Las suites integradas a veces resultan hasta antipáticas, y muchas de las aplicaciones estan pensadas no para ser utilizadas con un solo lenguaje, sino para varios. Sacrificando quizás las comodidades circunstanciales ( doble click en un widget para editar el código del evento ) por ventajas más interesantes como la utilización de una API similar y bindings para docenas de lenguajes ( como es el caso de GTK+).

A veces la ambición parece extrema, pero el caso es que eventualmente siempre resulta ventajosa.

Investigando un poco, me puse a ver si realmente era mucho más trabajoso hacer una aplicación GUI con Ruby en Linux y resulta que no solo no lo es, sino que el resultado es muy bueno y la capacidad de poder editar la interfaz como se nos venga la gana ( o aún más, permitir al usuario editarla como se le venga la gana sin modificar código) es genial.

A continuación un breve ejemplo de crear una aplicación con glade (es un cliente del api rest de redmine en que estoy trabajando):

necesitaremos la gema gtk3 y Glade

Primero creamos un nuevo archivo con glade y definimos los handlers que determinaran que hacer cada vez que el widget emite una señal, es importante guardar el archivo como .ui ya que así podremos utilizar directamente Gtk::Builder para leerlo, de otro modo necesitaríamos utilizar la librería glade

 Luego en nuestro programa:

#!/usr/bin/env ruby

require 'gtk3'

 

class MinerApp

  def initialize

    @ui = Gtk::Builder.new  

    @ui.add_from_file "ui/blueminer.ui"

    @ui.connect_signals {|handler| method(handler)}

 

    @main_window = @ui.get_object "mainwindow"

    @main_window.signal_connect "destroy" do

      Gtk.main_quit

    end

 

    @main_window.show_all 

  end

 

  def about_menuitem_activate_cb  

    dialog = @ui.get_object "aboutdialog1" 

     dialog.run #ejecutamos el dialogo

    dialog.hide

  end

end

Aquí lo que hacen algunas lineas:

    @ui = Gtk::Builder.new  

    @ui.add_from_file "ui/blueminer.ui"

instanciamos el objeto UI, y cargamos el archivo .ui este nos permite obtener instancias de nuestro widget ya definido.

    @ui.connect_signals {|handler| method(handler)}

esta es una linea interesante, aquí le pasamos un bloque que asigna a cada handler el método o función correspondiente, en este caso le estamos diciendo que llame un método de la clase actual que se llame igual que el handler, nótese que esto puede no ser lo ideal, ya que hace todos los metodos de la clase activables a través del nombre del handler. Pero resulta conveniente para este caso.

   @main_window = @ui.get_object "mainwindow"

   @main_window.show_all

Acá obtenemos el objeto por el identificador (ID) que le pusimos en el archivo glade, por defecto este es "window1". Luego llamamos el método show_all que muestra la ventana y redibuja todos sus contenidos.

 

 

  def about_menuitem_activate_cb  

    dialog = @ui.get_object "aboutdialog1" 

     dialog.run #ejecutamos el dialogo

     dialog.hide

  end

 

Si vemos la imagen, veremos que tengo definido un handler "about_menuitem_activate_cb" para el item de menu "Acerca de" y la señal "activate", este es el método que responde a dicho evento. Los dialogos Gtk se suelen ejecutar con el método run, que devuelve una respuesta de tipo Gtk::ResponseType al cerrar el dialogo, en este caso no queremos evaluar la respuesta ya que es solo un dialogo de información.

 

Finalmente instanciamos nuestra aplicación e inicializamos el loop Gtk

 

Gtk.init

miner = MinerApp.new

Gtk.main

 

El resto es simplemente continuar definiendo handlers para las señales en glade 

 Les dejo además estos tutoriales muy completos para Ruby y otros lenguajes

 

Pronto voy a subir esta app en mi repo github

 

Edit: Cuando usamos Gtk::Builder deberemos ocultar los dialogos luego de su ejecución en vez de destruirlos con destroy(), ya que a diferencia de al crearlos con Gtk::Dialog.new estamos destruyendo una referencia y al intentar abrir el diálogo nuevamente el programa lanzará una excepción.


Volviendo a nouveau

Me decidí a volver a utilizar los drivers nouveau en vez de los privativo de NVidia que venía utilizando en mi PC, si bien tendre perdida de performance en 3D ( que rara vez uso) los drivers funcionan bastante bien para 2D.

De paso elimine algunas cositas non-free de las que podía prescindir. Es una lástima que hay tantas otras tecnologías que uno tiene que utilizar que lo atan a lo no libre. En mi caso en general son las que más problemas me dan ( audio en Skype por ejemplo).

 


Muggle Go

Leyendo varios articulos online vi que mucha gente utiliza Go sin demasiada magia/frameworks y me propuse a aprender a organizar un entorno de trabajo MVC en Go para mis proyectos (notese que no esta ni cerca de un framework propiamente dicho). Básicamente lo que tengo hasta ahora es un objeto App que direcciona las requests a los distintos controladores. Lo que si esto implicó aprender bastante, utilizar el paquete reflect. Ahora estoy entreteniendo mucho la idea de implementar un ORM ligero similar a ActiveRecord en Golang.

Se puede ver un poco del código en github (ignorar la parte de modelos ya que no es más que una prueba).

Puedo ver de este modo por que mucha gente recomienda no utilizar frameworks en Go, es muy fácil aprender a organizarse.

En fin... hay que seguir aprendiendo...


Iniciando/Parando un programa

Durante el finde configuré mi fluxbox con compton (un compositor para X11) para darle un poco de eyecandy y como resultado para mayor comodidad escribí un simple script para iniciar y detenerlo con una combinación de teclas ( esto muy inspirado en KDE ).

#!/bin/bash

COMPOSITOR_PID="$(pidof compton)"
if [ $COMPOSITOR_PID ]; then
    kill -9 $COMPOSITOR_PID
else
    compton --config ~/.compton.conf -b &
fi

Y luego añadirlo a .fluxbox/keys como

Control Shift F12: Exec composite-toggle.sh

 

Nada del otro mundo pero rara vez escribo cosas en bash


Actualización de blog

Me tome unos minutos para mejorar un poco el código de este blog, principalmente separar los controladores de la funcionalidad del admin en un paquete aparte y en distintos controladores (ya que antes era un caos). De paso añadí un contador de comentarios.

Lo lindo de ir actualizando el blog de esta manera es que siempre puedo aprender un poquito más de Go en el proceso.

Pueden ver el código aquí.

 

 


Refactorizando, Ratchet.

Ratchet


Ayer terminé de refactorizar el código de un cliente, básicamente una aplicación que actualmente utilizaba polling via AJAX. La cosa se estaba poniendo poco elegante y complicada así que decidí buscar otra solución.
Me encontre con WebSockets, una interesante solución no tan nueva pero que me vino como anillo al dedo. Utilicé la implementación de Ratchet ( si la url es Socketo.Me... es genial por algun motivo)  para PHP y cree un service provider para Laravel.

Escribiría un tuto de Ratchet pero la realidad es que esta muy bien documentado y me resulto muy fácil de implementar. Tengo ganas de ver como desarrollar alguna otra cosa con websockets, en especial con Ruby y/o Golang. Espero hacerme un tiempo para eso.

Tenía bastante código para refactorizar como para garantizar un inicio de semana movidito así que ayer a la madrugada termine de desarrollar la aplicación en cuestión.

Aquí una bonita respuesta de StackOverflow que muestra las alternativas a utilizar websockets, ventajas y diferencias.


Silicon Valley


Estoy mirando esta serie recomendada por un amigo y la verdad es que me parece bastante buena, refleja muchos problemas que surjen de tener una compañía de software y de desarrollo en general, obviamente con las exageraciones y extravagancias propias de un Sitcom.


Coursera


Me inscribí a aun curso de criptografía dictado por un profesor de la universidad de Stanford en Coursera, tengo bastantes expectativas con eso. Comienza el 20 de Abril.


Blog


Tengo que agregarle tags a esta cosa e implementar image upload como en el blog viejo pero...