Alfonso Jiménez

Ene 03

No bra, no panties

Dic 29

Memoization en Ruby

Un ejemplo práctico muy usado cuando se intenta enseñar recursividad es una función que calcule la secuencia de Fibonacci. Una solución trivial en Ruby podría ser la siguiente:

def fib(n)
  n < 2 ? n : fib(n-1) + fib(n-2)
end

Las primeras iteraciones de la secuencia se computan con una profundidad reducida. Por ejemplo fib(6) = 8, fib(7) = 13 o fib(8) = 21. Ejecutando el anterior código en mi máquina, el problema de rendimiento aparece cuando la entrada alcanza valores superiores a 40. Cómo se puede observar, la complejidad del algoritmo es del orden φn. Por ejemplo, para calcular fib(50) es necesario realizar 20.365.011.073 sumas.

Matemáticamente hablando, una función bien definida siempre devuelve un único valor para una determinada entrada. Es decir, un simple mapeo de elementos. Volviendo a la función anterior, sabemos que fib(8) siempre devolverá 21 independientemente del número de veces que ejecutemos la llamada. Un ejemplo de función matemáticamente mal definida sería rand(n), donde podríamos obtener un resultado diferente en varias llamadas con el mismo valor de entrada.

Existe una técnica que permite acelerar el rendimiento de funciones bien definidas llamada memoization. Básicamente consiste en cachear y reutilizar cálculos ya efectuados, ya que sabemos que la función para un valor de entrada n siempre devolverá el mismo resultado. Refactorizando la función fib(n), obtendríamos lo siguiente:

@series = [0,1]
def fib(n)
@series[n] ||= fib(n-1) + fib(n-2) end

Esta nueva versión almacena los resultados de las llamadas anteriores en un array (@series), reduciendo drásticamente el número de cálculos. De este modo podemos calcular fib(50) = 12586269025 de forma inmediata.

Además, en Ruby existe un gema muy útil llamada <a href=”http://rubygems.org/gems/memoize”>memoize</a>, que permite acelerar funciones bien definidas de una manera sencilla. El primer trozo de código quedaría de la siguiente manera:

require 'rubygems'
require 'memoize'

include Memoize

def fib(n)
n < 2 ? n : fib(n-1) + fib(n-2) end

memoize(:fib)

Para futuras llamadas a fib(n), la gema se encargará de cachear los resultados y aumentará el rendimiento de la función.

Fuente | Wikipedia
Fuente | Ruby best practises

Dic 08

La importancia del foco y ser constante

A menudo comenzamos proyectos en nuestra vida, tanto personales como profesionales, tanto por placer, por vitalidad o por ánimo de lucro. A priori es sencillo empezar algo, pero menos fácil es mantenerlo y aún más complicado es acabarlo*.

Evitar procrastinación

La procrastinación es la mayor traba para el abandono de proyectos. El aplazamiento eterno, el dejar las cosas para mañana cuando las podemos hacer hoy. Falta de organización, distracciones, nacimiento de otras inquietudes o simplemente desilusión son los factores más comunes que nos lleva a ello. Por suerte o desgracia, nuestro tiempo es limitado y la frustración puede apoderarse de nosotros. En muchas ocasiones la principal razón es un mal planteamiento inicial.

Antes de comenzar algo, piensa si realmente quieres hacerlo

Y es que la raíz de la procrastinación surge antes de comenzar algo. Imagina la satisfacción de hacer ese proyecto que tienes en mente y formúlate una serie de preguntas a ti mismo. Aprendizaje, realización como persona, dinero, reconocimiento. ¿Qué te aportará? ¿Serás más feliz? ¿De verdad quieres hacerlo? ¿No hay otra cosa que prefieras hacer?

Leer más

Nov 28

Volver a escribir

Ya hacía tiempo que no escribía, al menos en público. A pesar de que este humilde blog lleva online desde 2004, apenas he escrito una decena de posts en los últimos 2 años. Se me hace raro responder a la pregunta de ¿tienes un blog?. No voy a entrar en la discusión de si los blogs están muertos o no, de si la blogosfera en realidad existió o de si esto ya no es lo que era. Si no he publicado casi nada últimamente habré tenido mis motivos.

No acuso directamente a la falta de motivación, ni a la escasez de temas de los que hablar (siempre hay algo interesante que contar), ni siquiera al limitado tiempo libre que dispongo. Tal vez culpo a la evolución de la manera de comunicarse digitalmente, que como en otros ámbitos, es inevitable. Siempre he aplaudido la progresión y nunca he temido a los cambios. Por esa razón, nunca digo que los blogs hayan muerto, sino que los medios digitales han evolucionado y las personas con ellos. Años atrás si encontraba algo interesante que contar, lo analizaba en mi blog personal, la gente comentaba y enlazaba mis contenidos, se creaba una conversación. Hoy en día cuando encuentro algo interesante comparto el enlace con mis seguidores en Twitter, éstos vuelven a compartirlo con sus propios seguidores y así sucesivamente. Se ha perdido espíritu crítico, opinión y profundidad sobre los temas a tratar, pero se ha ganado difusión e inmediatez en la propagación de contenidos. Ahora el flujo de información que una persona puede consumir en un día es mucho mayor que en años atrás. Los usuarios cada vez generan menos contenidos, pero consumen más, dejando a los medios profesionales ese rol de productores.

Leer más

Oct 30

fcron and non interactive apt-get install

This is a very short post, but it might be useful for someone with the same problem. I was trying to install fcron on a remote machine via an automated script, but apt-get install couldn’t finish because a dialog using whiptail came up. It wasn’t the common prompt asking yes or no, which can be ignored by the -y option.

Fortunately, there’s a smart workaround to get rid of these prompts:

DEBIAN_FRONTEND=noninteractive apt-get install -q -y fcron

Basically we set the type of user interface used for the installer to noninteractive mode before installing the package. You can always reset DEBIAN_FRONTEND to its default value.

Sep 07

Mourinho y la teoría del torneo

Lo importante no es ganar sino participar, es el consuelo para perdedores por excelencia. 27 de Abril de 2010, Camp Nou. El Inter de Milán contra todo pronóstico elimina al FC Barcelona en las semifinales de la Champions League. José Mourinho, técnico del Inter por aquel entonces y émulo de Nereo Rocco, empleó un sistema táctico muy defensivo que noqueó todas las opciones de remontada de los azulgranas. Dicho sistema, popularmente conocido como catenaccio y que prolifera en las formaciones de muchos equipos italianos, fue duramente criticado por los aficionados del Barça tras la eliminatoria. Recibió todo tipo de calificaciones: destructivo, feo, injusto, inmoral, atentatorio de los derechos más sagrados de la humanidad … pero lo que nadie insinuó es que la estrategia desplegada por el once del jacarandoso Mourinho era ilegal. A pesar de ser la antítesis del juego del Barça, no podemos discutir la validez ni la legimitidad de la victoria del Inter. Y es que esa noche hicieron lo que tenían que hacer, eliminar al equipo rival. Para eso es lo que les pagan.

Leer más

Jul 30

5 tips for working from home

I have been working in my pyjamas since more than two years ago. I mean by this that I have been working remotely from home. Now you may be thinking, I could never do that, and yeah, you are right, this kind of job is not made for everyone. It’s got its advantages, but it’s got its disadvantages as well like everything else in the world. If you don’t organize yourself thoroughly, you will never be able to put up with it for a long time. I must to admit that I sometimes miss working in an office with my colleagues, but in the other hand I’m absolutely aware of the great advantages that my current job offers me. I think the right thing to do is try to find a good balance among work and free time. Here you have some tips to help you find that balance.

Leer más

Mayo 30

[video]

Feb 14

La cultura de la propina en los Estados Unidos

Una propina consiste en el pago voluntario como recompensa por un buen trato recibido. Generalmente estos pagos van dirigidos a empleados del sector servicios (camareros, taxistas, …). En Europa es bastante común dejar una parte del cambio como propina cuando la atención por parte del servidor ha sido excepcional y por lo consiguiente el cliente se siente muy satisfecho por ello. En mi caso suelo dejar algo de propina cuando en un restaurante me sirven extraordinariamente bien, es decir, en muy pocas ocasiones. Y con esto no quiero decir que me traten mal ni mucho menos. En muchos restaurantes se incluye en la factura un cargo extra por el servicio (normalmente viene descrito en concepto de cubierto), el cual por ley el cliente está en pleno derecho a no pagar en caso de que el servicio no haya sido lo suficientemente bueno.

Leer más