1. Couchbase, OSX, Docker

    Didn’t see this one coming so here it is for when I need it again, or hopefully it saves someone else some hair pulling.

    It seems Couchbase manages it’s own servers so when you connect to it it will tell you what IP to use to connect. This is bad if the server is on a private network such as when using Docker on OSX, as you’ll be able to open the connection but then your queries will timeout.

    Some DNS mangling should take care of this but the easiest solution for me:

    route add <DOCKER_NET> <DOCKER_HOST> 255.255.0.0

    For example, if the Couchbase IP is 172.17.0.45:

    route add 172.17.0.0 `boot2docker ip 2&>/dev/null` 255.255.0.0

    Now you can ping Couchbase from your machine.

    3 weeks ago  /  0 notes

  2. Speed reading with Spritz

    Spritz is apparently the new hotness. Personally I dislike whenever anyone claims to have invented something revolutionary, while in reality it’s only an enhancement at best (I’d be ecstatic to be proven wrong though).

    Even so, their implementation looks interesting, so I’ve been wanting to try it. I’ve been using Spreeder in the past, and also tried OpenSpritz.

    Since Spritz doesn’t have a consumer implementation, one has to resort to stealing :evil:

    Pretty easy actually, just save locally any web page on the Spritz website (full page, not just HTML), modify its contents with what you want to read, and voilà!

    That’s cumbersome, so I’ll try to whip up a bookmarklet this weekend. Only for my personal use though, one doesn’t want to unleash the lawyers’ wrath.

    You getting the message Spritz? Release something! ;-)

    6 months ago  /  0 notes

  3. Customizable Page Snooze

    There’s a great little Chrome extension called Page Snooze. It helps reach “Inbox Zero” for your Chrome tabs.

    Sometimes I end up with dozens of tabs and windows, and when I start cleaning things up, this extension is a life saver.

    Unfortunately the snooze times aren’t customizable. This finally became so much of a pain that I decided to entertain the idea of writing my own extension.

    I don’t have much experience writing Chrome extensions though, so I wanted to see if Page Snooze’s source code was available and readable, and lo and behold, it is.

    So instead of writing/enhancing the extension, I decided to just modify it by adding the times I need. At some point I might revisit the idea of writing my own, but for now this will suffice.

    Here are some instructions in case you want to pursue the same approach.

    First, edit the background.html file of the extension. The files are available at ~/.config/google-chrome/Default/Extensions/bmhnhpfchoeofnjoobbhgihdkhllnfbc if you’re on Linux, and Google can probably tell you where to find it on Windows or elsewhere.

    The context menu is created at the bottom of the file. Here’s what I added:

    chrome.contextMenus.create({
      title: ‘Snooze for 1 month’,
      onclick: function(info, tab) {
        snooze(tab, 30)
      }
    })

    chrome.contextMenus.create({
      title: ‘Snooze for 8 hours’,
      onclick: function(info, tab) {
        snooze(tab, 1/3)
      }
    })

    Easy peasy. Now just disable and re-enable the extension to have the new times available.

    Another feature that would be nice to have is to replace the localStorage with Google’s Sync storage, but that’s a bit more complex and just in the “nice” category so I’ll leave that for later.

    8 months ago  /  0 notes

  4. Digital diceware for lazy people

    image

    I love the idea of Diceware: throwing dice to generate a passphrase for each of your logins. Only it gets tiresome.

    I’ve used LastPass for years, but as I started to use a phone and tablet more and more, it became a huge pain to enter all those meaningless letters and symbols in tiny virtual keyboards, hence the appeal of passphrases.

    So, I made a script a couple years ago that “throws” the dice for me and sends the resulting passphrase to the clipboard.

    As an excercise in OSS contribution and gem creation, I’m relasing Ruby Dice. Hopefully it’s useful to someone else too.

    1 year ago  /  0 notes

  5. Twitter Bootstrap + Google Maps = WTF
Use

img { max-width: none }

inside your Google Maps to fix.

    Twitter Bootstrap + Google Maps = WTF

    Use

    img { max-width: none }

    inside your Google Maps to fix.

    1 year ago  /  0 notes

  6. ¿Bloqueo del programador?

    Leyendo un post sobre el “bloqueo del programador” (http://joeybeninghove.com/2010/10/15/5-ways-to-battle-coders-block/) me puse a pensar en como me ha afectado esto en el pasado.

    Hay un excelente libro de Steven Pressfield, The War of Art, que habla sobre este fenómeno en los escritores y en general en cualquier profesión.

    Para mi siempre se ha tratado de flojera, decidia, y otros malos hábitos. Hay veces que es necesario trabajar en código horrible, aburrido, o utilitario, y a veces eso no es tan emocionante.

    Y si, a veces también sucede que me levanto con cero ganas de abrir todo mi entorno de desarrollo, empezar a abrir archivos, etc. (bueno, ya no es tan tedioso gracias a tmux y vim!).

    Yo prefiero atacar el problema directamente en lugar de “distraerme” haciendo otras cosas en lo que el “bloqueo” desaparece. Estas son dos soluciones que me han funcionado bien:

    La primera es simplemente obligarme a sentarme y empezar a escribir código. Casi siempre termino inmerso totalmente en el código (“in the zone”) después de una o dos horas de batallar, y al final me siento como después de una buena sesión de ejercicio :)

    Cuando eso no funciona y sigo batallando y maldiciendo el código o el programa que tenga enfrente, me fijo intervalos de trabajo, “descanso/premio”. Por ejemplo, trabajo 48 minutos sin distracción alguna, y luego me “premio” con 12 minutos de surfeo, lectura, o alguna otra cosa que se me antoje. Sigo así durante 3, 4 intervalos o hasta que termine. Esto al final también resulta muy gratificante.

    En ambos casos, a veces un poco de música energizante puede ayudar (desde Tiësto hasta Vivaldi).

    Pero sobre todo, el tener una visión clara de lo que busco (y lo que se requiere para conseguirlo) es lo que más me impulsa día tras día.

    ¿A ti qué te funciona?

    3 years ago  /  0 notes

  7. Los atajos del emprendedor

    Durante todos estos años he aprendido muchas cosas (tanto técnicas como de negocios), pero también he adquirido ciertas mañas.

    Por ejemplo, la cultura Rails dicta que hay que escribir pruebas antes del código de la aplicación (TDD). Si, voy a blasfemar, no me linchen.

    En el equipo de eduPortal, existe una persona en soporte, otra en desarrollo, otra en diseño, otra en sistemas, y otra en… bueno, el caso es que todos se llaman Iván.

    Entonces, todo este tiempo me he valido de atajos para lograr mis objetivos, y uno de ellos es dejar (casi) de lado el TDD.

    Hasta ahora he podido salirme con la mía porque soy el único desarrollador, y tengo en mi mente un mapa de toda la aplicación, así que cuando ha habido algún bug, lo he podido corregir relativamente rápido.

    Se que es una deuda técnica, y tarde o temprano voy a tener que pagarla. Es una desventaja que estoy dispuesto a aceptar. Además, siempre que toco código pasado trato de refactorizar poco a poco.

    Creo que los atajos son muy necesarios, en especial en el desarrollo de software. Todo el tiempo se desarrollan mejores formas de realizar alguna tarea, pero jamás liberaría nada si siempre persiguiera esas mejoras.

    Aún así, todos los días sueño con tener un equipo de desarrollo que haga pair-programming y en el que el TDD sea la religión. De hecho gracias a esto se me ocurrió un proyecto que podría ayudarme (y a otros) a conseguir este objetivo, pero ya se los platico en otro post.

    Hablando de otro tipo de atajos, para sobrevivir la cantidad de tráfico que recibe eduPortal he tenido que desarrollar algunas herramientas que automatizan parte de la aplicación.

    Por ejemplo, antes recibía infinidad de solicitudes para corregir información en el directorio. Al principio hacia las correcciones manualmente, desde la consola de Rails, poco después agregue una interface administrativa para facilitar el proceso.

    Finalmente tuve que automatizarlo todo para no volverme loco. Ahora funciona como un wiki: si una escuela recibe cierta cantidad de correcciones, los datos que concuerdan en varias de ellas son aceptados automáticamente.

    Lo mismo paso con los comentarios que reciben las escuelas. Muchísimas quejas por abusos. Ahora esto es moderado automáticamente.

    Lo único que me falta automatizar es el soporte técnico, lo cuál nunca voy a poder lograr al 100%, pero si hay varias cosas que podría hacer para aligerar la carga.

    Al principio, todo este trabajo en automatizar procesos era un poco tedioso, porque sentía que no estaba trabajando directamente en la aplicación. Parece obvio que es algo importante ya que forma parte de la experiencia del usuario, pero tarde un poco en darme cuenta.

    Hace muchos años, la búsqueda de la perfección me impidió iniciar o terminar varios proyectos. Siempre tardaba horas pensando y planeando la mejor forma de atacar un problema, la mejor solución, la mejor tecnología.

    Ahora que estoy en el otro extremo, te invito a jugar de este lado. Igual y no tengo la experiencia del éxito para decir que lo que estoy haciendo ahora es mejor, pero por lo menos he liberado mucho más código que en tiempos pasados.

    3 years ago  /  0 notes

  8. No usar diagonal en bloque redirect

    No se si sea una combinación de mi configuración lo que provoca esto, pero al usar redirect con un bloque (en routes.rb) hay que tener cuidado de no incluir una diagonal al principio:

    match ‘/:user’ => redirect { |params| “u/#{params[:user]}” }

    Si usara una diagonal antes de la “u” (“/u/…”), provocaria una redirección a “http://u/usuario”.

    Esto me pasa con Rails 3.0.7, Passenger, y nginx.

    3 years ago  /  2 notes

  9. Viviendo un paso atras

    Últimamente he reflexionado mucho sobre los primeros años de mi aventura en el desarrollo de software.

    A veces me parece que siempre he ido un paso atrás. No se si yo sea demasiado obtuso o esto sea parte de la vida. Jeje, yo creo lo primero, pero me tengo que dar salida.

    Ya llevo más de 16 años con esto, y siempre ha sido algo muy motivante para mi. Sin embargo, creo que esta “motivación” ha sido parte de mi problema, porque siempre me he sentido cómodo con lo que hago.

    Si no me gustara y lo tuviera que hacer por obligación, tal vez me movería más rápido, con el afán de acabar con el sufrimiento. Claro, no digo que preferiría eso. Aprecio y agradezco mucho el poder hacer algo que me apasiona, porque se que la mayoría no tiene esta bendición.

    Ese mismo agradecimiento a veces se convierte en arrepentimiento. He desperdiciado muchos años de mi vida persiguiendo cosas inútiles y sin trascendencia.

    Esto esta empezando a sonar como un lloriqueo, pero no es así, solo trato de transmitir la experiencia que he vivido.

    La mayor parte de mi vida he caminado un paso atrás. Un paso atrás del reto presente, un paso atrás de la lección del día, un paso atrás en mi carrera. Dicen que los retos que se nos obsequian son ni más ni menos los que necesitamos para crecer, y no hay nada que se nos presente que no seamos capaces de vencer.

    La experiencia me dice que eso es acertado. Antes me lamentaba y deseaba poder transmitir a mi pasado lo aprendido. ¡Que fácil sería la vida!

    Lo que no me daba cuenta era que en el presente estaba viviendo los retos que en el futuro me obligarían a repetir la misma historia. Es tan simple como esta pregunta, ¿cómo quiero ver este día dentro de un año?

    Quisiera que alguien me hubiera enseñado esto. Y tal vez así fue, pero yo tenía los ojos y oídos cerrados :)

    Ahora que tengo una vida de “adulto”, se que en todos estos años pude haber hecho mucho más. Caray, solo en pensar cuanto tiempo libre tenía… ¡y como a veces hasta me aburría! ¿Aburrimiento? ¿Qué es eso? ¡Solo los burros se aburren! diría mi papá.

    Si estas en la escuela, o te encuentras en la situación que yo estaba, ¡por el amor de todo lo que es sagrado en tu vida, aprovecha el tiempo! Créeme, se te va a acabar.

    A mi edad todo esto parece un poco obvio y hasta vergonzoso, pero vale la pena si por lo menos le sirve a una persona.

    Y los que viven un paso adelante, o por lo menos al día, ¿cómo le hacen? A mi a veces me sigue costando trabajo, y da miedo pensar que hay algo de lo que no me estoy dando cuenta :)

    Onward and forward!

    3 years ago  /  0 notes