• Programación

    Take A Photo – Fotos instantáneas desde tu web

    En la última semana estuve trabajando en agregar nuevas funcionalidades a un sitio de un cliente y entre los pedidos estaba una especie de Fotoblog para los usuarios (y bue, hay que pagar las cuentas a fin de mes :P). La cosa salió rápido, usando Paperclip que guarda las imágenes que se suben, se muestra en orden, etc, nada del otro mundo. Pero hablando con el cliente surgió la idea de hacer que el usuario se pueda tomar una foto directamente desde la web usando su webcam, así que después de decir «si, se debe poder hacer» mentalmente me salió un «doh!, que dije!«. Lo último que se dijo en…

  • Programación

    Refactoring de «Fat Methods» – Episodio 5

    Pasar programadores PHP a Ruby no siempre es una tarea trivial, mayormente porque lo primero que tratan de hacer es escribir código en lugar de pensar que es lo que quieren hacer :). No es que me queje, a todos nos pasa que resolvemos el problema como primero sale (más aún cuando las fechas de entrega son apretadas :). El otro día queriendo modificar un código me encuentro con este before_filter en un controller : def setprofile @viewer = false if (!params['id'] && !params['profile_id']) @profile = @passport else if params['profile_id'] pid = params['profile_id'] else pid = params['id'] end @profile = Passport.find_by_id(pid) if (!@profile) redirect_to(:controller => 'my3dg', :action => 'show') and…

  • General,  GNU+Linux,  Programación

    Do it right! – Manejo de dependencias

    En estos días he tenido varias discusiones sobre algunas prácticas muy acostumbradas en varios proyectos, que a mi parecer están muy lejos de lo útil. Es por eso que decidí escribir un par de artículos denominados «Do it right!» (hazlo bien!, si mi inglés no es tan malo como pienso :D). En esta primer entrega voy a tratar el tema de manejo de dependencias. Escenario Muchas veces uno se encuentra con un software que necesita y le es útil. Vamos a suponer de entrada que no tiene paquete para su distribución y/o sistema operativo favorito. En al leer el README vemos que depende de muchas cosas : alguna biblioteca de…

  • Programación

    State Machine

    Varios días atrás tuve que hacer un juego simple, un memotest para ser exacto, para correr en unos «kioskos» para un cliente. Ya que tenía pendiente aprender a usar RubyGame, lo hicimos con este framework para ver que onda, ya que hasta ahora veníamos usando pyGame. El juego salió super rápido, sin mayores problemas, pero la lógica de juego no me gustaba porque teníamos que andar trackeando el estado actual a mano, muchos ifs y comprobaciones que hacían del loop de juego un choclo de código. Es por eso que me puse a ver un poco como aprovechar el tener bloques de código para encapsular la lógica del juego un…

  • Programación

    MovieClip Factory en Flash

    Para un videojuego que nos pidió un cliente tuve que solucionar un problema que me costó bastante y es por eso que lo comparto. Si bien no me gusta mucho escribir por acá sobre software privativo, en este caso encontré tan poca información que me pareció bueno compartirlo. El juego en cuestión es un scroller horizontal, en donde van entrando chimeneas (mas bien techos con sus chimeneas) y Papá Noel tiene que hacer el delivery de regalos :). El problema apareció cuando empecé a agregar más y más techos al escenario. La forma en que inicialmente lo manejaba era con un gran MovieClip que tenía adentro los techos en sus…

  • Programación

    Cómo perder un bit

    Un proyecto que hicimos a principio de año es un soft que maneja una PC para una rockola con su respectiva interfaz de hardware («la caja» de ahora en más) para interactuar con la botonera. En estos días el cliente nos pidió que agregaramos alguna validación para que la caja y el programa se aseguren que son «originales» (no es algo que me agrade agregar, pero el software es del cliente). En fin, la cosa es que estuve todo el viernes y todo el lunes sin poderlo hacer andar. La caja me respondía perfecto salvo en un caso: cuando me llegaba 0x3F pinchaba. Lo peor es que era un valor…

  • Programación

    Refactoring de «Fat Methods» – Episodio 4

    En la última entrega habíamos logrado separar las notificaciones del controlador. Una de las cosas que todavía me seguían molestando eran los métodos donde obtengo las direcciones de email, como por ejemplo : @notifications = @match.players.select {|p| p.user.notify_new_match_comment? }.collect {|p| p.user.email} Lo que busca esto es obtener los emails de los usuarios para notificar ante un evento dado (un nuevo partido creado, un nuevo comentario, una petición de amistad, etc). Me molesta principalmente porque se ven horribles mis controllers :). La respuesta que motiva este episodio llegó por casualidad. Intentando solucionar un bug que tenía en uno de los plugins que uso (has_many_friends, que es feo pero cómodo para un…

  • Programación

    Parseando HTML desde Ruby

    Con todo este lío de la crisis mundial, corridas bancarias y demás en la oficina los días tranquilos jugamos a «Adiviná cuánto va a salir el dolay hoy». Como es muy molesto entrar a «Dolar hoy dot com» donde miramos el valor oficial del juego, me puse a armar un script para robarme el valor actual y así ir tirando el dato minuto a minuto. Siempre es una molestia tener que parsear HTML, sobre todo cuando es tan feo como el del sitio en cuestión, que no solo no tiene un solo class de CSS ni id, sino que usa el tag FONT, dios. Por suerte Hpricot está para ayudarnos…

  • Programación

    Delegando atributos de ActiveRecord

    El otro día tratando de mejorar un modelo de una aplicación me topé con el problema de tener muchos atributos virtuales para poder acceder a atributos de un objeto relacionado y no caer en lo siguiente : class Player < ActiveRecord::Base belongs_to :user def name user.name end def email user.email end # ... y varios más end Esto no lo puedo evitar mucho ya que Player es una clase intermedia en una relación de N-M entre los usuarios y los partidos, y además contiene información necesaria para la lógica del modelo. Tampoco era muy feliz tener por todos lados Message Chains: @player.user.name @player.user.email # etc .... Una de las recomendaciones…

  • Programación

    Refactoring de «Fat Methods» – Episodio 3

    En el Episodio 1 trabajé el método Matches#create y había dejado una parte a la que Des preguntó por qué la ignoraba. En ese momento no quería extender mucho más el post por lo que en esta oportunidad vamos a completar el refactoring pendiente. El código que habíamos logrado en ese momento es el siguiente: def create @match = current_user.matches.create!(params[:match]) @notifications = @match.owner.friends.select {|f| f.notify_new_matches? }.collect(&email) Emailer.deliver_match_created(@match, @notifications) if @notifications.any? flash[:success] = "El partido fue creado." redirect_to matches_path rescue render :action => 'new' end Lo que nos quedaba terminar era cómo mejorar el envío de las notificaciones para aquellos amigos que tenían activa dicha opción. Como primer paso vamos a…