1. Nuestra nueva aplicación va muy bien. El cliente nos compartió sus conocimientos e ideas y el desarrollo fue progresando semana tras semana. Con las reuniones de los jueves las personas involucradas se fueron coordinando para conseguir lo que hoy es la médula espinal de la organización.

    Desarrollamos toda la solución utilizando ruby 1.9.3rails 3.0 y postgresql como la base de datos encargada de preservar la información. Desplegamos en heroku las instancias de desarrollo, prueba y producción. Una instancia mínima de servidor web en la nube soporta una cantidad importante de usuarios concurrentes.

    Nuestro bebé está creciendo y quiere caminar...

    Pero no todo es color de rosas. 

    En algún momento de la construcción, alguna tarea supera la barrera de 30 segundos impuesta por el alabado Heroku, apareciendo un mensaje lapidario de 'TimeOut'. Otro inconveniente asociado a estas tareas largas es la sobrecarga de trabajo que le damos al servidor web que hasta acá es nuestro único y fiel trabajador.

    Entonces cuando tenemos que hacer estadísticas, reportes mensuales, funciones de chat en vivo, procesar imágenes o enviar mensajes de correo electrónico, el procesamiento asincrónico se vuelve importante para nuestra aplicación.

    Que hacer?... una idea es delegar alguno de estos trabajos a otro proceso asincrónico, un 'worker' en la jerga de nuestro server.

    Claro que esto no es fácil, tendremos que tener muchas cosas en cuenta... o no.
    No tantas como se puede suponer, cuando uno viene de otras tecnologías. Gracias a los chicos de 'Collective Idea' tenemos una gema muy simple de implementar llamada Delayed_job. Existen otras como sidekik, resque u ost (gracias @lguardiola) que llevan a la implementación de una solución similar, cada una con sus ventajas. El premio a la pureza y la simpleza se la doy a ost otra obra de arte minimalista de @soveran Michel Martens creador entre otras cosa del micro framework cuba.
    Delayed_job tiene algunas implementaciones particulares como delayed_job_active_record también de la gente de 'Collective Idea' que nos facilitan el modo en que encolamos las instrucciones a procesar. Utilizando la base de datos que tengamos configurada en nuestra aplicación.
    El bueno de Ryan Bates nos presenta la gema en este railscast y no se olviden del código fuente del ejemplo.

    Para completar el círculo virtuoso y bajar el costo operativo al mínimo. Otra gema espectacular, esta vez recomendación de mi amigo @maxidr, es workless del genial lostboy.

    Con workless tenemos que tener un solo cuidado. Si esta usando meta_search de @eniemiller el metodo search en nuestros controller darán error contra el search interno que tiene workless por usar rush. Solución reemplaze .search por .metasearch.
    
    
    
    

    Ver comentarios

  2. Continuando con la idea planteada en el post ¿Hay alguien allí? ¿Alguien escucha? Quiero feedback!
    
    Los invito a participar del curso sobre Ruby que 
    estaremos dando con Maximiliano Dello Russo 
    en el querido MUG.
    
    
    
    
    
    Vamos a aprender juntos. Desde la nada misma hasta tener, no solo un lenguaje 
    mas en nuestra lista, sino todo un conjunto de conocimientos y herramientas.
    
    
    
    
    
    
    
    
    
    
    Título del curso: Lenguaje de Programación Ruby
    
    
    
    Aquí un poco de contexto sobre el temario y su desarrollo, 
    nuestra idea es ir completando tanto el contenido del
    temario, como el repositorio en GitHub.
    
    Recorreremos juntos en teoría y práctica los puntos mas interesantes del lenguaje. Viendo 
    ejemplos simples, utilizando nuestras propias maquinas para 'hacer y aprender haciendo'.
    
    
    Tendremos posibilidad de incluir algunos invitados de la comunidad para que puedan 
    conocerlos en persona. Los confirmaremos en los próximos días o serán sorpresa.
    
    Agradezco muy profundamente al MUG y en especial a los que apostaron por este 
    proyecto. Todo un desafio para nosotros.
    
    
    
    
    
    
    
    

    Ver comentarios

  3. Las personas poseen diferentes formas de adquirir conocimientos, de fijarlos, cada una de ellas debe 
    encontrar su mejora manera. Unos leen, otros escuchan, subrayan, resaltan o escriben. 
    
    Comentaba hace un tiempo, que el tomarse la tarea de exponer conocimiento a otros, me produce un 
    efecto de fijación que ningún otro mecanismo logra. 
    
    Esto puedo llevarlo a la práctica exponiendo un tema a una o varias personas, escribiendo un post o 
    debatiendo con un colega, mate de por medio.
    
    Si tomamos en cuenta el tiempo que se invierte, este es un método poco eficiente. Por eso creo 
    que uno debe aprovecharlo al máximo. Cuando este proceso se va concretando se nos presenta 
    un faltante que debemos tener muy presente. La necesidad de feedback
    Esa comunicación es necesaria para saber 'el otro lado del mostrador' ¿Fuimos claros? ¿Nos 
    expresamos correctamente? ¿Logramos transmitir la idea central que nos propusimos? ¿Dimos 
    muchos rodeos? Y así una interminable lista de cuestiones que sino se nos brindan, estaremos 
    inundados de suposiciones y estas pueden ser muy malas consejeras.
     
    Si uno quiere ser una mejor versión de si mismo, debe aprender a escuchar a los otros, entendiendo lo 
    que quieren decirnos.
    
    
    
    
    Una vez que logramos incorporar el habito de escuchar tenemos que ir por mas. 
    ¿Como crees que puedo mejor este o aquel aspecto? Un ejemplo, ahondar en los puntos que nos 
    fueron comentados, aumenta nuestra experiencia.
    
    Y si vamos un poco mas allá?!?!?! 
    
    Busquemos respuestas antes de comenzar con nuestra presentación, charla, conversación o exposición.
    ¿A que me refiero con esto? A buscar información importante antes de lanzarme a la actividad. Una 
    especie de pre-configuración que me permita mejorar la experiencia de las personas que participen.
    
    Un pequeño ejemplo que considero ilustra este punto. Hace unos días en un curso, el ponente nos 
    explicaba que en ciertas comunidades el representar imagenes humanas sin rostro era una forma de
    mostrar individuos sin alma. Por lo tanto sin este dato, que para algunas personas puede resultar 
    'sutil', nuestros interlocutores pudieron distraer su atención del verdadero mensaje que queríamos 
    transmitirles. Un error de contexto, que habríamos podido subsanar facilmente.
    
    Creo que un nuevo camino se abre para mejorar. Escuchen, pregunten, hagan su mejor 
    esfuerzo, sean objetivos e inteligentes, traten de ser precisos con las palabras y no tomen supuestos.
    
    
    
    Eso si, no se olviden de darme feedback! Gracias.

    Ver comentarios



  4. Hoy trataré un tema recurrente en los equipos de desarrollo. El liderazgo.

    Tengo la suerte de trabajar con un grupo de excelentes personas desde hace muchos años. Algunos hace mas de 10 que comparten el día a día. En realidad este post deberían escribirlo ellos y volcar sus vivencias.

    Con el correr de estos años fuimos pasando por varios proyectos con una importante variedad de circunstancias, algunos simples internamente y otros no tanto. Las visiones que se utilizaban eran muy distintas a las que se promueven hoy.

    Nosotros eramos apenas un equipo de dos, realizando, sin saberlo, pair programming, incluyendo al cliente en el desarrollo, realizando iteraciones de una semana y permitiendo el cambio según se modificaba el entorno del sistema en cuestión. ¿Eramos visionarios? No. Queríamos lo mejor para nuestros clientes y por eso aprendimos a escuchar, a entender sus necesidades, a ponernos en sus zapatos.

    Luego si, incorporamos formalmente el concepto AGIL y su entorno. Aplicamos algunas metodologías como SCRUM y mejoramos.

    Ahora vemos otros desafíos...

    Si nos basamos en la experiencia acumulada de estos años... el liderazgo servicial se presenta como la mejor evolución de nosotros mismos.

    Tenemos clientes internos. Son aquellos que potencian y resuelven las necesidades de nuestros clientes comerciales. Entender esto simplificará la toma de decisiones. 

    Entonces bajo esta visión, mejorar el funcionamiento del equipo, es la opción para el éxito.

    Creemos que para lograr eso, se deben generar las mejores condiciones que el grupo necesite en el momento en que se encuentre. Detectar y brindar esas condiciones hoy, es el desafío.

    • Aplicando las mejores practicas para el desarrollo.
    • Utilizando la experiencia adquirida.
    • Siendo permeables al cambio, siempre que la mejora se pueda medir.
    • Testeando.
    • Aprendiendo y enseñando ( la mejor forma de aprender )
    • Fortaleciendo nuestras aptitudes/mejores características.


    Las acciones pueden ser reuniones semanales, tener el café preparado, contar con facilidades para solucionar sus inconvenientes personales, estar atentos para ayudar, generar el espacio para proponer cambios que busquen la mejora.

    Invierta tiempo en explicar el contexto en el que se mueven, como grupo.

    Plantee sintomas que presenta el cliente externo para que se analicen en grupo.

    Entrenar ... Practicar ... Aprender


    El desafío es enorme. La adaptación es progresiva. Debe ser incorporado a la química interna del grupo. No existen recetas milagrosas. El entorno es complejo y por eso mismo debe surgir la mejor solución desde el interior del equipo.

    Cuando logremos que todos vean que el bienestar del grupo es mas que la sumatoria del bien de cada uno, seremos mejores.

    Para los descreídos les dejo un ejercicio. Piensen en ese jefe 'TODO PODEROSO' que no participa, que impone recetas para que todo mejore y exige resultados según sus sueños.


    Ver comentarios









  5. Poseidon Online
    Paso otro año sin darme cuenta.


    La actividad luego de la RubyConfAr 2012 fue abrumadora.
    La conferencia este año fue excelente. La organización fue un rotundo éxito. Los oradores me gustaron mucho por la variedad y sus diferentes visiones del ecosistema ruby. 
    Entre la catarata de elogios que se me ocurren, tengo una salvedad, el lugar (complejo La Plaza) ayudo a la convocatoria pero no facilito las relaciones humanas. 

    Se esta aproximando la RubyConfUy 2013. Tengo ganas de estar allí. Veremos como...

    Estamos trabajando en proyectos realmente muy interesantes. Rodeados de gente con muchas ganas de construir y construir bien.


    Lanzamos PoseidonOnLine un sistema de gestión en la web. No es algo nuevo, ni revolucionario. Lo pensamos simple, minimalista, balanceamos entre funcionalidad y facilidad de uso. Todo un desafío para nosotros. Queremos ver a donde nos lleva.
    Los invito a probar el modelo y darnos su opinión.



    Para este último proyecto no estamos apoyando en Lean StartUp, una idea innovadora en nuestras cabezas. Aunque en desarrollo y manejo de proyectos utilizamos metodologías ágiles, para un nuevo negocio no lo utilizábamos.

    Nuevos proyectos en el horizonte.

    Estamos aumentando el uso de test e integración continua. Sobre esto tengo muchísimo para contar en el próximo post.



    Ver comentarios


  6. Se acerca rápidamente un nuevo episodio de la exitosa conferencia RubyConf Argentina ... En su versión 2012. 

    El viernes 19 y el sábado 20 de octubre en el complejo Paseo La Plaza será el tan esperado reencuentro.


    El año pasado, una gran concurrencia y los excelentes speakers crearon el clima ideal para el desarrollo de la primera RubyConf por estas latitudes. 

    Pueden ver una pequeña reseña en: que me dejo la RubyConf Argentina

    El intercambio generado entre los speakers y los desarrolladores es una de las cosas que no se puede perder de este nuevo capitulo.

    Perfecta organización, intercambio entre pares, espacio para charlar distendidamente, son parte de los condimentos de esta conferencia.

    Prepárese para mostrar, explicar y compartir código. No olvide su notebook!

    Si se perdió la del año pasado, ahora tiene su oportunidad.

    Concejo: No se lo pierda!

    Ver comentarios



  7. Active Admin de Greg Bell y VersaPay, esta pensado para la administración de los datos de nuestra aplicación aproximandose a la idea de ser un agregado.
    En nuestro proyecto se vera reflejado en la carpeta app/admin con un archivo .rb por cada modelo a administrar y a través de este, AA en forma dinámica construirá los controladores y las vistas necesarias.

    Autenticación, paginado en los index, filtros, scopes, una estética medida, menues, una simple API para descargas de la información. Nada que no podamos construir nosotros en nuestros proyectos, pero con una sola gema, tenemos todo en uno. Incorpora KaminariMeta_SearchMeta-where y Devise

    Esto facilita algunas cosas, cuando modificamos nuestros modelos las vistas reflejan en forma automática los cambios. Claro que cuando queremos personalizar nuestro desarrollo esta ventaja se pierde.
    Para agregar autorizaciones con cancan recomiendo (activeadmin-cancan) una gema que facilita los ajustes iniciales.

    Este RailsCast #284 es un excelente inicio (algo desactualizado), no me extrañaría que con la liberación de alguna nueva revision o version, Ryan Bates publique un nuevo episodio.

    Guía rapida en AsciiCasts #284 para arrancar, sino quiere escuchar la voz de Ryan.

    Esta disponible un ejemplo oficial, funcional y con buenas ideas implementadas.



    Existen ejemplos publicados en GitHub
    
    
    
    
    
    
    
    

    Vea también RailsAdmin de Erik Michaels-Ober que nos brinda una solución similar. 
    Una buena comparación entre ambas interfases. Gracias a Bozhidar Batsov 

    Ver comentarios

  8. Tenemos que hacer Backups!


    La frase se presenta cuando nuestro desarrollo pasa a esa nueva instancia que se llama producción.

    Una de las primeras cosas que tenemos que resolver es la de resguardar los datos. Las razones pueden ser muchas, poder duplicar facilmente el ambiente de producción, generar una instancia nueva localmente o tener la opción de volver a un punto anterior con los datos correctos, entre otras.

    Entonces buscando un poco en Internet... encontramos e implementamos esta receta.

    Ingredientes



    Estoy suponiendo que utiliza Heroku como plataforma para sus despliegues. Hace un tiempo en Rails en la nube se llama Heroku he hablado sobre esta plataforma/servicio.

    Para encarar la solución de hoy tendremos que habilitar en Heroku los siguientes Addons
    • PGBackup servicio de backup interno en Heroku, agregaremos su modo Plus, que nos permite retener hasta siete archivos.
    • Scheduler standard de Heroku (para esto debes tener una cuenta verificada en heroku, pues si la haces trabajar mucho quieren cobrar :-) ) 
    Utilizaremos pgbackups-archive de Kenny Johnston y una cuenta en AWS de Amazon (se pueden dar de alta instancias gratuitas por un año)

    Paso a paso

    Esta gema nos facilita la tarea de ejecutar un backup y dejar el archivo resultante en S3, el servicio de Amazon para almacenamiento de datos.

    En nuestro Gemfile incluimos
    gem "pgbackups-archive"

    Luego ejecutamos
    bundle install

    Para activar/instalar los servicios de heroku desde la linea de comandos utilizaremos
    heroku addons:add pgbackups:plus
    heroku addons:add scheduler:standard

    o por la página de nuestro proyecto en heroku, ingresamos a 'resources' e instalamos desde 'Manage Add-ons' los dos servicios.



    
    
    debemos agregar variables de entorno
    heroku config:add PGBACKUPS_AWS_ACCESS_KEY_ID="XXX"
    heroku config:add PGBACKUPS_AWS_SECRET_ACCESS_KEY="YYY"
    
    
    estos datos los pueden consultar en su cuenta de S3 en aws
    justo al desplegar el perfil del usuario en 'security credencial'
    heroku config:add PGBACKUPS_BUCKET="myapp-backups"
    heroku config:add PGBACKUPS_REGION="us-west-2"
    
    
    Luego abrimos la agenda 
    heroku addons:open scheduler
    
    
    Ingresamos como tarea rake pgbackups:archive , con la periodicidad que creamos conveniente para nuestra aplicación y el horario mas conveniente.
    Y esto es todo.
    
    
    Nota: en S3 resulta muy prudente configurar en las propiedades del Bucket en la solapa LifeCycle el tiempo de permanencia de nuestros objetos.
    
    
    
    
    
    

    Ver comentarios

  9. Solo quería tener la nueva versión de rails corriendo en mi Mac para probar y luego contarles... pero lo que parece fácil no siempre lo es.

    Instalé ruby 1.9.3 con el rvm, y comenzaron los errores. Busqué un poco en la web y PragmaticStudio me dio una ayuda. La solución era solo agregar un parámetro. 

    $ rvm install 1.9.3 --with-gcc=clang 

    Este parámetro le indica cual es el compilador que queremos utilizar. El xcode 4.2 del OSx en Lion toma otro compilador por defecto.
    Luego nos pasamos a la instancia recién generada.

    $ rvm use 1.9.3

    El gem install rails realiza el resto del trabajo.

    $ gem install rails

    entonces creamos nuestro primer proyecto.

    $ rails new prueba320

    Se crea toda la estructura para el proyecto con nombre prueba320 pero cuando quiere realizar el bundle install automático con la generación, me da error... Noooooooooooooooooo!
























    A buscar un poco en Internet y con la ayuda de @lguardiola, salió andando... como?

    Aquí la receta
    El problema se presenta con esta combinación
    Mac + Lion + xCode 4.2 + Ruby 1.9.3 + Rails 3.2
    Existe una incompatibilidad entre openssl que viene en Lion y Ruby 1.9.3

    Primero desinstalamos con rvm el ruby 1.9.3
    $ rvm remove 1.9.3

    luego instalamos el pkg que queremos
    rvm pkg install openssl

    luego instalamos con los parámetros para compilador y openssl a utilizar
    $ rvm install 1.9.3 --with-gcc=clang --with-openssl-dir=$rvm_path/usr



    cuando esto termina, nos movemos a la instancia con ruby 1.9.3 e instalamos rails 3.2.0
    $ rvm use 1.9.3
    $ gem install rails

    y si todo fue como lo esperamos
    $ rails new prueba320

    Es un éxito total. Ya podemos comenzar con nuestro primer ejemplo.

    Guía rapida para instalar ruby 1.9.3 sin utilizar Xcode o GCC (en ingles)



    Ver comentarios

  10. Una nueva version de rails para comenzar el año.
    Que corta vida tuvo la version 3.1...

    La primera intención era sacar la nueva version para diciembre del 2011, pero esperamos un poquito mas y salió.

    Esta sería la última version que soporte Ruby 1.8.7, tome nota. Ya es hora de actualizarse a la version de Ruby 1.9.3 es veloz y estable.

    Una nueva revision de Agile Web Development with Rails esta lista y publicada. Contiene todas las mejoras incluidas en esta nueva version.

    Es muy interesante la mejora en modo de desarrollo cuando se produce un cambio en la recarga del modelo. Según David se inspiraron en Active Reload de Robert Pankowecki

    El otro cambio que mejoró mucho la perfomance son las mejoras introducidas en Routes, al incorporar el motor journey .

    Hace poco descubrí Arel ( aquí algo sobre esto para saciar su curiosidad por Ernie Miller o aquí por asciicast ) , ahora en esta nueva version expandieron esto con un metodo para que nos muestre que esta haciendo y como, algo mas interesante que el to_sql

    TaggedLogging y Active Record Store son mejoras muy interesantes.

    Comenzando a probar

    Tengo instalado RVM y en una de las instancias con Ruby 1.9.3 actualice rails con
    $ gem update rails
    $ rails new prueba320

    ... mas en el próximo post!

    Una rapida revision de las mejoras en la página de webrails (en ingles) escritas por David Heinemeier Hansson
    Se actualizo completamente la página 'Ruby on Rails Tutorial' uno de los tutoriales que mas me gustan. Creo ya haberlo escrito un par de veces...


    Y en el horizonte vemos emerger la version 4.0, rapido que se viene el día...

    Ahh la gema del mes para Backup de Michael van Rooijen, pueden ver un simple ejemplo y comentarios aquí.

    Ver comentarios

Cargando