-
Digital diceware for lazy people

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.
-

Twitter Bootstrap + Google Maps = WTF
Use
img { max-width: none }inside your Google Maps to fix.
-
¿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?
-
Exclusively cache Rails GET requests on nginx →
-
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.
-
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.
-
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!
-
El principio del fin
Después de años desarrollo intermitente, hace varios meses decidí dedicarme al 100% a eduPortal.
Cómo uno de mis cinco lectores menciona en Convore, una de las lecciones que aprendí es que a nadie le importa comunicarse civilizadamente con las escuelas.
El objetivo original de eduPortal era ofrecer herramientas para padres y alumnos. Las buenas escuelas serían resaltadas, y las malas, enterradas.
Quería ayudar a descubrir las malas escuelas, con mal servicio, malos maestros, y en general escuelas cuyos dueños solo abrieron para forrarse. Desgraciadamente la cultura “online” en México aún no permite que algo así tenga éxito (o yo no ofrecí la solución adecuada).
En la versión actual, quise ofrecer algo parecido a GetSatisfaction y UserVoice, por lo que cambie el simple sistema de comentarios y calificaciones por un foro para preguntas, quejas, e ideas. En esta versión es muy sencillo, y la idea era pulirlo sobre la marcha.
En esta tercera iteración, decidí dar un giro de 180°, y enfocarme en el servicio para las escuelas. No voy a descuidar la experiencia para el visitante, pero el objetivo es hacer sentir a las escuelas que estan recibiendo lo mejor en tecnología y servicio.
Con las redes sociales de hoy y la enorme cantidad de herramientas que hay a su alrededor, creo que muchos negocios, y en este caso las escuelas, no tienen el tiempo, el deseo, o los recursos para mantener una presencia en línea.
Esto esta evidenciado por los sitios de la mayoría de las escuelas. La norma es que sean difíciles de navegar y que contengan poca información (y para colmo desactualizada).
Hay varios factores que influyen a esto. Creo que el más común es que para ahorrar costos, un “conocido” de la escuela les hace un horrible sitio, porque según “sabe” HTML/CSS (o que Dios lo perdone, Flash).
Después de esto, las escuelas no están dispuestas a pagar una alta cuota para mantener su sitio actualizado. Afortunadas las que por lo menos cuentan con un sitio basado en WordPress.
Ahora que esta de moda Facebook, muchas escuelas mejor optan por crear su página ahí, pero esto no les permite aprovechar la amplia gama de oportunidades que tendrían con un sitio propio (lo cual también se que tiene sus desventajas).
Así que como dije, el nuevo objetivo de eduPortal es ofrecer una herramienta para que las escuelas puedan mantener fácilmente una presencia online, siempre con las mejores tecnologías y a un precio que sea un “no-brainer”.
Imaginen una fusión de Squarespace/Weebly/etc. y herramientas como GetSatisfaction, HootSuite, Eventbrite, etc., pero todo especializado a las necesidades de una escuela mexicana.
Una persona me comentaba que le parecía buena idea, pero que mejor debería expandirlo a todo el mundo y para cualquier negocio/persona. Suena tentador, digo, los clientes potenciales se multiplicarían en gran medida, pero ¿competir directamente con Squarespace et al.? Tal vez en otra ocasión :)
Aún con mi “limitante” local, se que lo que busco es ambicioso, pero me emociona mucho y soy muy apasionado con mi profesión, así que mínimo voy a disfrutar el camino. También se que para lograr mi visión, necesitare un buen equipo de desarrolladores y diseñadores; los cuales espero encontrar más adelante en este camino.
Seguiré escribiendo sobre lecciones pasadas y sobre las nuevas, pero si alguien tiene alguna pregunta o quiere saber más sobre algo, con gusto responderé según me sea posible.
PD: “El principio del fin” porque es la tercera, y es la vencida. De aquí o vamos para arriba o buscamos otro camino. Y porque “el principo del fin” suena más dramático que “La tercer iteración” :P
-
Ruby: rake db:migrate VERSION=createusers
Este es un post técnico, espero no les moleste a los que estan leyendo mi crónica de eduPortal (ya viene el siguiente post).
Desde que Rails dejo de usar versiones simples para las migraciones, ha sido un suplicio para mi cada que tengo que especificar una versión para ejecutar rake db:migrate, así que finalmente decidí hacer algo al respecto.
En este Gist propongo una solución sencilla. En lugar de tener que especificar una versión con números, ahora puedo hacer esto:
rake db:migrate VERSION=crus
Y básicamente se ejecutara la migración que cumpla con el patrón “*c*r*u*s*”. Si hay más de una, se muestra un menú para seleccionar la apropiada.
Probablemente debería asegurarme que se esta ejecutando alguna variante de “db:migrate” para evitar problemas en otras tasks, pero de momento me funciona bien.
Ojalá le sirva a alguien más.
-
Como quem… erm, invertir, $100,000 en un mes
Cuatro años después del inicio de eduPortal, y seguía con la espina del fracaso.
Durante esos cuatro años le metía mano aquí y allá, pero no lo tomaba muy en serio. Solo tenía el “deseo” de que algún día pegara… ni siquiera sabía como ni tenía un plan.
En ese entonces eduPortal estaba escrito en un espagueti de PHP. Cada vez me era más difícil corregir problemas, y ni pensar en agregar funciones. Así que comencé a refactorizar el código.
Mi motivación se renovó cuando de pronto llego un cheque de AdSense por $300 USD. Fue un salto tremendo de los $60 que estaba recibiendo. Luego fueron $400, luego $500… Y no se porque pensé que seguiría subiendo sin cesar (porque cuando llega César, lo arruina todo; jeje, ignoren mi desvarío).
Estos ingresos también tienen una historia interesante y su respectiva lección, pero por ahora regresemos al desarrollo de eduPortal.
No llevaba ni un mes con esto cuando vi el famoso vídeo de Ruby on Rails en el que David H. creaba un simple blog en un santiamén. Solo un Apple fanboy con un iPad el día de lanzamiento entiende como me sentí en ese momento :)
Inmediatamente me puse a aprenderlo. En este punto ya tenía varios años de experiencia con diversos lenguajes de programación, y no se me hacia muy difícil aprender uno nuevo, pero Ruby fue un buen desafío.
Empece a adentrarme más en Ruby cuando me di cuenta que no podría hacer nada sustancioso con Rails si no dominaba primero el lenguaje.
Al principio fue desesperante. ¿Qué diablos era un “bloque”? ¿Cómo un LEGO o qué? Ese concepto nada más no me entraba.
En fin, pasaron semanas y meses hasta que finalmente empece a sentirme cómodo con el lenguaje, pero aún no me sentía capaz de reescribir todo el código de eduPortal.
De pronto me encuentro con $100,000 para invertir y ¿qué creen que hice? ¿Guardarlos para pagar el sueldo de un buen diseñador unos meses? No. ¿Tal vez pagar a otro programador que me ayudara a avanzar más rápido? No hubiera sido tan mala idea, pero no, tampoco. ¿Irme de viaje? Quisiera…
En mi desesperación, decidí pagar a una agencia de USA para que me hiciera la versión más básica de eduPortal en Ruby on Rails, usando el mismo diseño que tenía. Y ¡puff! desaparecio el dinero.
Todavía me da coraje cuando me acuerdo. Es como si ganas $30 por hora y le pagas a alguien $75 la hora para que haga tu trabajo… (!)
Lo ideal era simplemente guardar el dinero, teniéndolo disponible para lo más necesario según se fuera dando el caso, mientras ideaba el mejor destino para el.
A veces creia que lo tenía que haber aprovechado contratando a un diseñador, para que juntos pudieramos crear algo mucho mejor.
Creo que para eso hubiera necesitado mucho más dinero, o por lo menos una fuente constante de ingresos del proyecto (¿y lo de AdSense? ya merito).
Claro, han de estar pensando que podría haberme juntado con alguien para crecer, pero en ese entonces era muy aprensivo con mis ideas y mi trabajo. No quería que nadie me robara la idea, tan única que creía yo que era.
Además era algo perfeccionista (y todavía no se me quita), así que la idea de dejar a otros tocar a mi bebé era algo atroz (¿que ironía no?).
Durante este tiempo, con los $100mil que de pronto tenía y los ingresos crecientes de AdSense me sentía en la cima; “¡gano dinero día y noche sin mover un dedo!”, me decía a mi mismo.
¡Que imbécil! Si pudiera hablar con mi yo pasado, me pondría en mi lugar, antes de que lo hiciera la realidad.
A eso le agregamos dos buenísimas amistades que hice, VISA y MasterCard; bueno tres, con “Consumismo”. Así que los $100mil se esfumaron sin dejar mucho de valor, y las ganancias de AdSense comenzaron a desplomarse, pero mis tres cuates estaban para “apoyarme”.
(Malditas tarjetas son del diablo. No me canso de repetírselo al que me quiera escuchar.)
En fin, segundo round, endeudado, aplastado, y sin idea de lo que estaba haciendo… Aún así seguí adelante, a veces macheteandole por semanas sin parar, pero a veces sin tocar el proyecto durante meses.
Poco a poco el sitio actual fue tomando forma. Cada vez había más y más visitas, hasta que hace como dos años rompió 1 millón de visitas al mes.
Hice una prueba de monetización, ofreciendo características especiales a las escuelas que pagaran una cantidad muy baja por año. Solo una que otra escuela despistada se suscribio, pero en mi defensa, no hice un muy buen trabajo promocionando este servicio.
Además me sentía algo sucio tomando su dinero, lo cuál me lleva a hablar un poco sobre la cultura que quería crear en el portal.
Durante todo este tiempo, las escuelas constantemente se quejaban del abuso que recibían por parte de los visitantes, que además de poder dejar comentarios y calificaciones sobre las escuelas, podían hacerlo de forma anónima.
Al principio no pensaba hacer nada al respecto, ya que creia que las mejores escuelas debían ser capaces de lidiar con el abuso, y que además este abuso se vería disminuido por los comentarios positivos.
Me importaba un carajo lo que pensarán o dijeran las malas escuelas, total, si reciben tantos comentarios negativos deben merecerlos, ¿no?
Esto no funciono así. La diferencia de este proyecto con otros en los que se puede opinar sobre un establecimiento (como Yelp), es que un papá o alumno muchas veces no puede dejar un comentario con su experiencia negativa y simplemente no regresar a la escuela. Aunque sea un comentario constructivo, a veces hay represalias y abuso por parte de la escuela… por eso la opción de dejar comentarios anónimos.
¿Y de que lado debe ponerse eduPortal? Ahora ven porque me sentía sucio tomando dinero de las escuelas, buenas o malas.
Con esto llegamos al final de la segunda iteración, la cual ha sufrido pocas modificaciones importantes en los últimos años. ¿Van identificando un patrón?
La razón por la que he seguido tanto tiempo con esto es porque de verdad creo que además de ser un negocio rentable, puede ser un servicio muy útil tanto para escuelas como para el resto de la comunidad educativa.
Y claro, son muy terco.
PD: Ya llevo varios meses en la tercer iteración, y en los siguientes posts voy a relatar su desarrollo. Pienso ser muy abierto con todo, para que todos aprendamos juntos de mis errores :)