Noticias Weblogs Foros Wiki Código

Meta-Info

¿Que es?

Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.

rss subscripción

Sponsors

Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
planetacodigo

planetacodigo

Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.

Idea: Juanjo Navarro

Diseño: Albin

Buayacorp

Probando nuevo servidor

Octubre 31st, 2011 - [Enlace local]

Por problemas de rendimiento y la falta de detalles de nuestro antiguo proveedor, acabamos de mudar nuestro defunto blog a un nuevo servidor vps. Por el momento las cosas parecen ir bien.

» Leer más, comentarios, etc...

xailer.info (esp)

Intellisense (auto completado de código) en Xailer

Octubre 31st, 2011 - [Enlace local]

Estimados usuarios de Xailer,

Como bien podéis imaginar por el título de esta publicación, la próxima versión de Xailer (2.5) incluirá soporte de ‘Intellisense’ o completado de código al igual que hacen otras herramientas de desarrollo de más renombre.

Xailer será posiblemente el primer entorno de desarrollo basado en [x]Harbour que aporte ‘Intellisense’ o completado de código, y no sólo de funciones, sino también de clases y miembros de las mismas con cualquier nivel de herencia, tanto a nivel de la RTL de Xailer como de los propios proyectos o subproyectos que tenga el usuario abiertos.

Entendemos que hoy por hoy es una funcionalidad casi imprescindible en cualquier entorno de desarrollo que quiera realmente ser profesional y de hecho ha sido una de las grandes peticiones que nos han hecho desarrolladores provenientes de otros entornos como Visual FoxPro o Visual Basic, entre otros.

El trabajo no ha sido fácil, ya que como seguro sabréis [x]Harbour, como Clipper, no es un lenguaje estrictamente tipado por lo que todo el trabajo se ha tenido que hacer analizando el código fuente en profundidad y todo ello, con la mayor rapidez posible para que el funcionamiento del editor de código no se resintiese en absoluto del trabajo adicional a realizar.

Debido precisamente a que [x]Harbour no es un lenguaje estrictamente tipado, para que el Intellisense funcione correctamente es necesario ayudarle a veces indicándole el tipo de las variables que estamos utilizando o cuando creemos clases indicando el tipo de cada uno de sus miembros.

Como se puede observar en la imagen, al definir la variable oVar hemos indicado que su tipo es TForm2. De está forma el IDE es capaz de saber que dicha clase tiene una propiedad de nombre oLabel1 que es del tipo TLabel y por lo tanto nos muestra todos los miembros de dicha clase, indicándonos si son propiedades, métodos o eventos. La cláusula AS puede ser utilizada en la declaración de variables, parámetros de funciones y declaración de miembros de clases.

Para realizar el completado código tan sólo hay que pulsar bien la tecla ‘:’ indicando la inclusión de un nuevo objeto, la tecla ‘(‘ para comenzar el paso de parámetros o simplemente la tecla Intro.

El soporte de ‘Calltips’ que hasta ahora veníamos ofreciendo únicamente en funciones de [x]Harbour y Xailer, se amplía con los métodos y eventos de toda la jerarquía de clases de Xailer e incluso con las funciones y clases de usuario que hayan sido creadas en el propio proyecto o subproyectos. Si desea que los ‘calltips’ sobre sus propias funciones o métodos indiquen el tipo de dato que retornan puede utilizar la siguiente construcción que como podrá observar se utiliza constantemente en los fuentes de Xailer: // -->

FUNCTION AtoC( aData ) // –> cString

Actualmente, la versión preliminar de Xailer 2.5 está siendo fuertemente probado por un grupo de usuarios seleccionado, pero esperamos que esté listo en breve.

Un cordial saludo

El equipo de Xailer

» Leer más, comentarios, etc...

Picando Código

Publicada la agenda de RubyConf Uruguay 2011

Octubre 31st, 2011 - [Enlace local]

RubyConf Uruguay 2011

RubyConf Uruguay 2011

¡Faltan solo dos semanas para la RubyConf Uruguay 2011!  ¿Ya se registraron? Sino, pueden hacerlo en este enlace. El registro incluye almuerzos, café, la posibilidad de asistir a una de las conferencias más increíbles jamás concebidas en nuestro país y una camiseta gratis (si algo aprendí de Pinky y Cerebro, es que a todo el mundo le gustan las camisetas gratis).

Vayamos entonces a la información de la agenda. Como esperaba, las charlas de esta edición son demasiado interesantes para perdérselas. Hay temas excesivamente magníficos, una agenda extraordinaria, incluyendo una introducción a Ruby on Rails para aquellos que no tienen idea con qué se come esto.

Recuerden que habrá traducción simultánea de Inglés a Español y viceversa para que nadie se pierda de nada.

Viernes 11 de noviembre

Si leyeron hasta acá, estarán tan ansiosos como yo por que llegue el 11 de noviembre :D

RubyConf Uruguay 2011

RubyConf Uruguay 2011

Sábado 12 de noviembre

Sin más que agregar… ¡Nos vemos ahí!

» Leer más, comentarios, etc...

Javier Pérez

Cómo promocionar un blog: SEM

Octubre 31st, 2011 - [Enlace local]

Cómo promocionar un blog

ÍNDICE

0. Introducción
1. SEO
2. SEM
3. Social Media
4. Emailing
5. Usabilidad
6. Analítica Web
7. Afiliación

SEM

SEM es el acrónimo de Search Engine Marketing (marketing en motores de búsqueda). El SEM es los anuncios que ves en el buscador de Google, de Bing, de Yahoo!, de Facebook, e incluso de Twitter (tweets promocionados). Lo malo es que cuesta dinero, y lo bueno que tú pones el límite que te quieres gastar al día y/o al mes, a partir de 1 €. Si vas a hacer SEM, cosa que no te recomiendo, o que al menos uses como último recurso, mis consejos son AdWords y/o Facebook.

Para poner un anuncio en Google has de ir a Google AdWords y darte de alta. Luego deberás crear una campaña seleccionando las palabras clave por las que quieres pujar y los datos de tu anuncio, e indicar cuánto estás dispuesto a pagar por cada keyword y cuánto estás dispuesto a gastarte. El sistema funciona de la siguiente manera:

Hacer lo propio en Facebook es bastante más sencillo y mucho más segmentable (por sexo, edad, gustos, zona de residencia, etc.).

En este sentido lo único que te puedo recomendar es que trates de segmentar al máximo posible, es decir, anunciar por las palabras clave que más se acerquen al tipo de lector que podría estar interesado en tu blog, o en el caso de Facebook, mucho más fácil, filtrar por edad, gustos, y todo lo que puedas. De este modo te ahorrarás mucho dinero y conseguirás más conversiones (clics que se convierten en usuarios).

Trata además de llevar a esos usuarios a suscribirse a tu feed RSS para fidelizarlo. Puedes poner un formulario a través de la herramienta Feedburner (de Google) o crear algo más profesional con la ayuda de MailChimp (el que puedes ver al final de este artículo). De este modo la inversión en captar a un lector habrá valido la pena.

Explicar en más detalle estas dos plataformas se escapan al ámbito de este artículo. En cualquier caso, el único dato objetivo que se puede usar en el SEM es el ROI (retorno de la inversión), que se calcula mediante métricas en analítica web (que veremos próximamente). A menos que ganes dinero con tu blog, no hay retorno de inversión que valga, aunque podrías considerar como ROI a una cantidad determinada de usuarios suscritos. De esta forma podrías marcarte un objetivo tangible, es decir, cuánto dinero estás dispuesto a invertir por cada nuevo usuario suscrito.

Si necesitas ayuda profesional con tu proyecto puedes contar conmigo.

Te espero la próxima semana con el artículo sobre Social Media.

» Leer más, comentarios, etc...

Koalite's blog

Estrategias dinámicas en C#

Octubre 31st, 2011 - [Enlace local]

Cuando estuvimos viendo varias alternativas para aplicar OCP en aplicaciones desarrolladas con C# dejé un tema pendiente:

hay una alternativa que explicaré próximamente que, a mi parecer, permite alcanzar un punto de equilibrio para no acabar con muchas clases que sólo se usan una vez (como puede ocurrir con template method o estrategia) y a la vez mantener una estructura clara de código sin tener que pasar varios Action/Func cuya responsabilidad pueda resultar confusa.

Al utilizar los patrones template method o statregy, explicaba que puede producirse una situación poco deseable: si queremos modificar el comportamiento de un proceso, aunque sea en un sólo punto concreto de la aplicación, tenemos que definir una nueva clase entera. En el caso de template method sería una clase derivada de la clase base con el algoritmo, en el caso de strategy una nueva implementación del interface con la estrategia.

Por el contrario, si usábamos la técnica de inyectar funciones y teníamos que pasar varias funciones o acciones, podíamos acabar con métodos cuya signatura resultaba confusa y quedaba poco claro que representaba cada funcion o acción que estábamos pasando.

La alternativa que, a día de hoy, más me gusta para resolver ambos problemas, es aplicar una mezcla de dos conceptos: parameter object y una pizca de fluent interface.

Para enterderlo mejor, vamos a ver un ejemplo. Supongamos que tenemos que implementar un sistema en el que se van almacenando eventos en una base de datos y, periódicamente, es necesario revisar los eventos para decidir qué hacer con ellos. Podremos tener distintos procesos, cada uno de ellos especializado en el tratamiento de distintos eventos, pero todos ellos tendrán un algoritmo común, similar a este:

iniciar transacción en la base de datos
por cada evento que hay almacenado en la tabla
    si es un evento interesante para este proceso
        procesar el evento
        marcar el evento como procesado en la base de datos
finalizar transacción

Las partes dependientes de cada proceso son las que están marcadas en negrita en el pseudocódigo de arriba, es decir:

Lo que vamos a hacer es implementar ese algoritmo basándonos en el patrón estrategia, pero adaptándolo para poder definir estrategias dinámicamente, sin necesidad de crear nuevas clases.

¡Quiero ver el código!

Vamos a ver paso a paso el código. Primero definimos una clase, Event, para representar los eventos y otra clase, EventSystem, encargada de gestionar la revisión de eventos pendientes:

public class Event
{
    public Guid Guid { get; set; }
    public string Source { get; set; }
    public string Message { get; set; }
    public DateTime Timestamp { get; set; }
}

public class EventSystem
{
    public void ReviewPendingEvents(ReviewStrategy strategy)
    {
        var connectionString = ConfigurationManager.ConnectionStrings
                                   .Cast().First();

        using (var connection = new SqlConnection(connectionString))
        {
            connection.Open();

            using (var tx = connection.BeginTransaction())
            using (var command = new SqlCommand("select Top 100 * from [Events] where [Processed] = 0 order by [Timestamp] asc", connection, tx))
            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    var @event = GetEventFromReader(reader);

                    if (strategy.IsInterestedIn(@event))
                    {
                        strategy.Handle(@event);

                        MarkAsProcessed(@event, connection, tx);
                    }
                }
            }
        }
    }

    private void MarkAsProcessed(Event @event, SqlConnection connection, SqlTransaction transaction)
    {
        using (var command = new SqlCommand("update [Events] set [Processed] = 1 where Guid = @guid", connection, transaction))
        {
            command.Parameters.AddWithValue("@guid", @event.Guid);
            command.ExecuteNonQuery();
        }
    }

    private Event GetEventFromReader(IDataRecord reader)
    {
        return new Event
        {
            Guid = new Guid(Convert.ToString(reader["Guid"])),
            Source = Convert.ToString(reader["Source"]),
            Message = Convert.ToString(reader["Message"]),
            Timestamp = Convert.ToDateTime(reader["Timestamp"])
        };
    }
}

Inciso: el código de arriba es para un ejemplo. Si fuera código real, sería mejor implementar Event como un objeto inmutable y usar Massive o Dapper para realizar el acceso a la base de datos.

Como veis, EventSystem está asumiendo toda la responsabilidad de orquestar el proceso, accediendo a la base de datos, gestionando la transacción y leyendo de la tabla. Seguramente todavía hace demasiadas cosas y sería posible extraer la funcionalidad de lectura de datos a otra clase, pero tampoco quiero complicar mucho el ejemplo. El hecho es que la parte variable del proceso, lo que antes marcábamos en negrita en el pseudocódigo de arriba, queda delegado a un objeto ReviewStrategy.

La clase ReviewStrategy implementa el patrón estrategia de una forma un poco peculiar. Su aspecto es el siguiente:

public class ReviewStrategy
{
    public Func IsInterestedIn { get; private set; }
    public Action Handle { get; private set; }

    private ReviewStrategy()
    {
        IsInterestedIn = msg => false;
        Handle = msg => { };
    }

    public static ReviewStrategy InterestedIn(Func interestedIn)
    {
        return new ReviewStrategy {IsInterestedIn = interestedIn};
    }

    public ReviewStrategy HandleUsing(Action handler)
    {
        Handle = handler;
        return this;
    }
}

Acabamos de definir una clase que, en realidad, no contiene ningún tipo de lógica. Toda la lógica que debería contener esta clase, los métodos bool IsInterestedIn(Event @event) y void Handle(Event @event), en realidad se delegan a un Func y a un Action que se pueden configurar desde el exterior.

Esta clase no es más que el resultado de aplicar una refactorización de tipo parameter object a la inyección de funciones que haciamos en el post anterior. Con esto evitamos tener que pasar muchas expresiones lambda como parámetro, quedando así el código más claro.

Los otros dos métodos que aparecen en la clase ReviewStrategy, InterestedIn y HandleUsing, no son más que una ayuda para construir objetos ReviewStrategy usando un pequeño fluent interface que nos ayude a identificar más claramente qué hace cada expresión lambda, evitando así otro de los problemas que tenía la inyección de Func/Action, que era la dificultad para saber qué representaba cada expresión lamba.

Al usar esta clase, nuestro código tendrá un aspecto similar a éste:

public class Program
{
    public static void Main()
    {
        var system = new EventSystem();

        // Revisamos los eventos generados por SQL Server y se los
        // dejamos a los DBAs para que se entretengan
        system.ReviewPendingEvents(ReviewStrategy
            .InterestedIn(@event => @event.Source == "SQL_SERVER")
            .HandleUsing(@event => SendToDBAs(@event)));

        // Solucionamos de una vez por todas todos los problemas con las
        // actualizaciones de Java
        system.ReviewPendingEvents(ReviewStrategy
            .InterestedIn(@event => @event.Message.Contains("Actualización de Java Disponible"))
            .HandleUsing(@event => UninstallJVM()));
    }

    private static void SendToDBAs(Event @event)
    {
        // TODO: ...
    }

    private static void UninstallJVM()
    {
        // TODO: ...
    }
}

Resumiendo…

Aprovechando las características funcionales de C#, con este método se pueden definir estrategias dinámicamente, de forma sencilla y sin necesidad de crear clases nuevas. Además no cierra la puerta a emplear estrategias tradicionales.

Si tenemos una configuración de estrategia que se repite en muchas clases, se puede encapsular en su propia clase derivada de estrategia o tener una factoría en alguna parte para crearla.

» Leer más, comentarios, etc...

Picando Código

Trine 2 disponible pre compra en Steam

Octubre 29th, 2011 - [Enlace local]

Trine 2

Trine 2

Siguiendo con los posts de videojuegos (es el fin de semana…), les comento sobre Trine 2. Ya recomendé Trine cuando hablé de Frozenbyte, el estudio encargado de su desarrollo:

Se trata de un juego de plataforma con mucha acción ambientado en un mundo de fantasía. Es bastante innovador, ya que no acude al recurso de simplemente realizar saltos difíciles o en el momento correcto. El juego está basado en física interactiva, y tenemos 3 personajes con distintas características y habilidades: un mago, una ladrona y un caballero. Con cada uno podemos usar tácticas diferentes para superar distintos obstáculos y atacar a nuestros enemigos.

Pues bien, los desarrolladores vienen trabajando en lo que será la secuela de este exitoso juego. Ya pueden pre ordenarlo por U$S 14.99 en Steam. Para esta segunda edición, se aumenta la atención al motor de la física del juego, teniendo que interactuar con fuego, agua, gravedad y magia para ir superando los distintos obstáculos. Además se está dando una apuesta fuerte al juego cooperativo de hasta 3 personas y multiplayer online. Veremos cómo se implementa esto.

La pre orden nos da acceso a la beta Multiplayer de 2 jugadores para Mac y Windows. Frozenbyte espera hacer un lanzamiento final en Diciembre para Windows, Mac OS X, XBLA y PSN. Desde ese momento se empezará a trabajar en la versión para GNU/Linux, la cual se espera lanza a principios de 2012. Después de haber jugado y disfrutado mucho Trine, espero con ansias la secuela para GNU/Linux :)

Les dejo un video con imágenes del modo cooperativo de Trine 2:

» Leer más, comentarios, etc...

Picando Código

Oil Rush build 0.82

Octubre 29th, 2011 - [Enlace local]

Oil Rush

Oil Rush

Unigine Corp, la empresa encargada del juegazo de estrategia Oil Rush, lanzó ayer la versión 0.82 del juego. Recordemos que el motor sobre el que está construido el juego soporta tanto DirectX como OpenGL, por lo que la empresa está trabajando en versiones para GNU/Linux, Mac OS X, Windows, Playstation 3 y Android.

Pueden ordenarlo ahora por U$S 19.95, lo que nos permite descargar cada nuevo build desde ahora hasta el lanzamiento de la versión final en cualquiera de las plataformas soportadas hasta el momento: GNU/Linux, Mac OS X y Windows. No sé ustedes, pero a mi me resulta muy interesante ir probando distintas versiones de un software desde sus inicios. En el caso de los juegos se hace mucho más interesante, ya que a medida que avanza el desarrollo, se van agregando elementos que mejoran la experiencia y lo hacen más interesante.

Como bonus para aquellos que pre ordenamos el juego, Unigine nos está ofreciendo el soundtrack en alta calidad. Este será vendido aparte una vez que el juego sea lanzado. Cuenta con 18 temas del artista Paralyzah. Como les comentaba en la reseña sobre Oil Rush, la música es muy buena, pasando de heavy a ambiental. En estos momentos estoy escuchando el OST para ver qué tal escucharlo sin el juego enfrente.

Oil Rush

Oil Rush

La nueva versión trae unos cuantos cambios y mejoras respecto a versiones anteriores. Al ejecutarlo me resultó ver un build más completo, como perfilándose ya a una versión final y cerrada. Las pantallas de Loading se muestran más responsivas hacia el usuario, haciéndonos saber cuando está cargando y con un diseño más profesional lo que nos va indicando que la versión final está muy cerca. Me pareció sentir que el juego en general se ve más fluído, como que esta nueva versión es más liviana respecto a versiones anteriores.

Vamos a los cambios específicos que anuncia Unigine desde la versión anterior:

Mapas

Jugabilidad

Código

Visual

Música

Les dejo unas imágenes de la nueva misión “Tutorial 3″, donde además del nuevo ambiente de cañón, podemos ver al Zeppelin en acción:

 

» Leer más, comentarios, etc...

El blog de pico.dev

¡Hola Planeta Código!

Octubre 28th, 2011 - [Enlace local]

Planeta Código
Últimamente las entradas que estoy escribiendo en el blog están más orientadas a la programación entorno a la plataforma Java que a GNU/Linux aunque siempre relacionadas con el software libre o código abierto. Por ello he incluido mi blog en el agregador de Planeta Código más orientado a temas de programación.



Al igual que cuando incluí mi blog en Planeta Linux el objetivo es llegar a más lectores y si es posible recibir más visitas y comentarios en el blog. Para los que no conozcan mi blog podeís visitarlo en http://elblogdepicodev.blogspot.com. La temática del mismo es el software libre, linux, la programación y cualquier cosa que tenga que ver con la tecnología o la informática.



Algunas de las últimas entradas que he escrito en él son:



Motivos para elegir el framework Apache Tapestry

Peticiones Ajax en Tapestry (II)

Peticiones Ajax en Tapestry

Seleccionar el lenguaje (locale) según el dominio en Apache Tapestry

Usar Apache Tapestry 5 con Groovy (u otros lenguajes de la JVM)

Componente AjaxSpinner para Tapestry 5



Ejemplo sencillo con JavaCC de un analizador léxico y sintáctico

Configuración de entorno en Java con ayuda de Groovy

Comparar cadenas en Java ignorando acentos

Integración continua con Jenkins

Internacionalización a lenguajes con diferentes formas plurales en Java

Hola mundo con Symfony 2 y Cherokee

Elegir herramientas para un proyecto Java



Espero que a alguno os resulten interesantes, si es así estáis invitados a suscribiros al feed de mi blog.

» Leer más, comentarios, etc...

Viricmind Labs

Peleando con Internet Explorer

Octubre 27th, 2011 - [Enlace local]

Go Out IE6

IE6 denial message for Momentile.com (by John Martz, CC)

[Actualizado el día 8 de Diciembre de 2011, añadiendo el punto 4]

Los que me conocen saben cuanto cariño siento por Internet Explorer, estoy orgulloso de quererlo tanto, y evidentemente no es suficiente para mí que lo sepan mis amigos, quiero gritarlo bien alto. Por eso hoy os brindo este artículo en el que cuento como darle una buena patada en el culo a este nefasto navegador.

Si más preámbulos, ahí van 3 ungüentos para aliviar el escozor que nos provoca a los desarrolladores:

  1. ie7-js : Una(s) librerías que nos ayudan a emular las características de las versiones más nuevas de IE en las más cochambrosas y antiguas. Yo particularmente uso la versión más nueva, ie9-js. Se nota, nos puede ahorrar unas cuantas horas creando horrendos hacks.
  2. Algo más drástico es dar un toque al oficinista cincuentón de turno indicándole que no estaría de más que cambiara su navegador, no es que sea complicado implementar un detector de navegadores... pero si ya está hecho ¿para qué perder el tiempo? http://www.devslide.com/labs/browser-detection . Con esta librería podremos mostrar un cuadro de diálogo a nuestro incauto usuario para sugerirle que jubile su viejo talismán antiprogramadores. Consejos respecto a esta librería: yo de vosotros no daría tregua a ninguna versión de IE excepto la 9 (se puede configurar el script para avisar con diferentes navegadores), en mi caso he llegado a modificar un poco el código para que no muestre la opción de descargar IE9 si se está en Windows XP (pues éste no funciona en Windows XP).
  3. Para los listillos de turno que instalaron IE9 y ya no pueden probar sus desarrollos en IE7 o IE8. Cuando se abre IE9, si se apreta la tecla F12 aparece un marco inferior (modo desarrollador) que permite cambiar 2 aspectos del navegador. En primer lugar permite que IE9 renderize las páginas web como si fuera IE7 o IE8, y en segundo lugar también permite engañar a las páginas web cambiando el userAgent, de forma que puedes comprobar también como reaccionan los sitios web con los navegadores IE7 e IE8 :D . Pocas veces diré esto, pero los de Microsoft tuvieron un detallazo implementando esta característica.
  4. Si queremos dar soporte a ciertas características de html5 en Internet Explorer podemos recurrir a htmlshiv. El código de esta librería también lo podemos encontrar integrado en Modernizr o jQuery 1.7 .

Y ya está, tampoco es que tuviera ninguna panacea, pero algo es algo! Por cierto, el segundo punto lo implementé entre ayer y hoy en una aplicación web que estoy desarrollando. El porcentaje de gente que usa al innombrable en mi aplicación es de un 60% (simplemente acojonante), supongo que en algunos días, o semanas talvez, escribiré un artículo analizando el impacto del aviso. Esperemos que sea efectivo!

» Leer más, comentarios, etc...

MadeInFlex

Disponibles las nuevas betas de Flash Player 11.2 y AIR 3.2

Octubre 27th, 2011 - [Enlace local]

Ya has salido las betas de Flash Player 11.2 y AIR 3.2.

Las nuevas características de Flash Player 11.2 beta son:

AIR 3.2 beta nos trae:

Enjoy it.

» Leer más, comentarios, etc...

Picando Código

Agregá un ribbon de RubyConf Uruguay a tu sitio

Octubre 26th, 2011 - [Enlace local]

Quienes visiten el blog habrán notado un “ribbon” de la RubyConf Uruguay 2011. La edición del año pasado fue un éxito rotundo, y este año se viene con más. Será la instancia que de cierre a la gira Ruby Sur, organización que eleva el nivel de la conferencia al realizarse de manera conjunta entre México, Colombia, Brasil, Chile, Argentina y Uruguay.

Si tienen un sitio web y quieren ayudar a la difusión de este evento, pueden usar el siguiente ribbon en su sitio web:

Plugin para WordPress

Lo encuentran en github o el directorio de plugins de WordPress.

Archivos fuente

A continuación el png usado para el ribbon:

Ribbon RubyConf Uruguay 2011

Ribbon RubyConf Uruguay 2011

Tanto en github como en el sitio del plugin se encuentra el archivo GIMP original que usé.

El código CSS:

#rubyconfuy_ribbon {
  position: fixed;
  right: 0;
  top: 0;
  z-index: 100;
}

Y el HTML:

<img id="rubyconfuy_ribbon"  src="rubyconfuy.png" alt="RubyConf Uruguay 2011" usemap="#rcuymap"/>
<map name="rcuymap">
shape="polygon" coords="0,0,200,0,200,200" href="http://rubyconfuruguay.org" alt="RubyConf Uruguay"/>';
</map>

¡No se la pueden perder! Nos vemos ahí…

» Leer más, comentarios, etc...

Arragonán

Métodos de evaluación de usabilidad

Octubre 25th, 2011 - [Enlace local]

Tras bastante tiempo conociendo a Dani Torres Burriel (y trabajando con él en alguna ocasión), que es uno de los principales culpables en despertar mi curiosidad en temas relacionados con la usabilidad y experiencia de usuario. Por fin pude hacer a principios de mes su curso con UX Learn de métodos de evaluación de usabilidad.

Posiblemente me vaya a resultar difícil encontrar proyectos donde aplicar estos métodos (seguramente sólo los use en proyectos propios), pero creo que alguno de ellos podría servirme puntualmente como apoyo para ayudar a conceptualizar proyectos para mis clientes.

UX Learn

Un pequeño resumen de los métodos, sacado de mis apuntes:

En los mismos enlaces que he ido dejando hay una información mucho más detallada de cada uno de los métodos para quien quiera más información.

Quizás esto suene a peloteo (entre otras cosas porque, además, compartimos oficina), pero supondréis que a mi eso me importa más bien poco ;) . Pero nada como un curso como el de torresburriel para aprender y conocer estos métodos con mayor profundidad, además de algunos truquillos que sólo puede dar la experiencia de alguien con muchos kilómetros en proyectos de todo tipo.

» Leer más, comentarios, etc...

Picando Código

Minecraft

Octubre 25th, 2011 - [Enlace local]

Multiverseros Minecraft

Multiverseros Minecraft

Hace unos días surgió una iniciativa en el portal Multiverseros de parte de Nick Constantine (uno de los fundadores del portal en cuestión) para sumar gente a Minecraft. Después de venir zafando del juego por todo este tiempo, decidí que era un buen momento para probarlo. Fue así que comenzó la época Multiminecrafteana, con Nick y yo inaugurando la  “Primera Construcción Conjunta Multiversera en Minecraft ©”.

Tras una primer instancia sumamente exitosa, Nick desplegó su arsenal verbal sobre un excelente artículo en el sitio de Multiverseros, parte del cual comparto con ustedes a continuación: Multiminecrafteando.

¿Qué contarles de Minecraft? La mayoría probablemente lo haya visto / leído / escuchado a esta altura. Creo que las palabras de Nick son bastante acertadas en su descripción, y como coincido plenamente con sus opiniones, copio y pego a continuación:

No hay dudas de que Notch, el creador de Minecraft, dio en el clavo con un juego que va a hacer historia. Minecraft es una especie de LEGO gigante que trasciende toda clasificación, con una idea subyacente de “explorar, concebir, construir, explorar…” que está mejor lograda en este sandbox abierto y enorme que en cualquier otra experiencia anterior.

Minecraft conjuga elementos que lo hacen único, con una jugabilidad abierta totalmente a los deseos del jugador, una belleza gráfica perfecta para la experiencia, una capacidad de generar inmersión en el participante casi irrepetible y aspectos técnicos en constante evolución y de gran atractivo (corre en cualquier máquina, pesa unos pocos megas, es sencillísimo de adquirir y jugar en minutos, y presenta constantes actualizaciones que lo hacen atractivo para veteranos y neófitos por igual).

Hasta ahora el foro de Multiverseros, la principal arteria de comunicación de una excelente comunidad de personas con gustos similares, había logrado organizar unas cuantas partidas Deathmatch de Urban Terror. Si les interesa, pueden darse una vuelta por el foro de Juegos y leer los hilos sobre los deathmatch. Están invitados a compartir las jornadas de desparramiento virtual de sangre (generalmente la nuestra) con la comunidad Multiversera.

Volviendo a Minecraft, se presentó una oportunidad excelente para comprar el juego, ya que su precio se encuentra rebajado a U$S 20. En las palabras de Nick: No es tanto, son 400 mangos por un juego que corre desde cualquier computadora y que realmente es una de las cosas más adictivas e inteligentes que se han hecho para PC. Como habrán podido notar en el blog, tengo un cariño especial hacia los videojuegos desarrollados por estudios independientes.

Minecraft - Sede de operaciones Multiverseros

Minecraft - Sede de operaciones Multiverseros

Un tema que conversamos en el foro fue el hecho de comprar el juego. Nick lo había conseguido gratis una vez que Notch decidió darlo gratis. Así y todo, a pesar de haber adquirido el juego de manera gratuita y totalmente legal, lo compró. Como comentábamos, votamos con la billetera. Es importante elegir apoyar iniciativas con las que compartimos ideales o simplemente porque estamos contentos con lo que nos proveen. En el caso de Notch, es una persona sumamente talentosa y generosa. En cada Humble Indie Bundle siempre es de las peronas que donan una suma considerable, y piensa liberar al dominio público su obra una vez que se haya lanzado la versión final y hayan mermado las ventas. Con nuestro apoyo, seguramente pueda seguir trabajando en cosas así, y está bueno que lo pueda hacer.

Siguiendo con la experiencia, tras algunos intentos levantando servidores de Minecraft y haciendo pruebas, nos decantamos por utilizar Hamachi. Nick levantó el servidor, exploró el nuevo mundo un poco, y al rato aparecí por ahí. Comencé de noche, por lo que el peligro acechaba por todos lados. El cuento entero de esa primer experiencia se encuentra relatado en el artículo Multiminecrafteando escrito por Nick. No tiene desperdicio, así que los invito nuevamente a darse una vuelta y leerlo. Para aquellos que nunca hayan jugado Minecraft es también una excelente introducción a la dinámica del juego y comenta más o menos qué se puede esperar de él.

Mis primeros pasos con Minecraft en realidad los di en solitario. Mientras coordinábamos el tema del servidor, me dediqué a crear mi mundito. Después tuve una primer instancia LAN con Grilix, quien tenía bastante experiencia en el tema. Ahí aprendí montón de cosas que luego llevé al mundo Multiminecrafteano. Como dice Nick en su artículo, jugar de a varios es mucho más divertido que solo. No solo se aprende un montón, sino que compartir las explosiones con los malditos creepers se vuelve menos frustrante.

Minecraft - Cuevas de lava

Minecraft - Cuevas de lava

Una frase importante del artículo en Multiverseros: Minecraft estimula el pensamiento lateral y las horas de insomnio. Al ser un juego tan abierto en sus posibilidades, estamos limitados básicamente por la creatividad de los jugadores. Tenemos tantas opciones, que nuestro éxito o satisfacción, está basado en las innovaciones que seamos capaces de llevar a cabo con los materiales y herramientas que nos provee el juego.
Otro punto a tomar en cuenta de Minecraft:

No es necesario tener familiarización previa con el juego, ni siquiera con juegos de PC (Minecraft es multiplataforma, por lo que pueden correrlo en Mac – ¡y GNU/LINUX!) o nada que se le asemeje.  Aún las personas que nunca disfrutaron de un juego de PC en su vida pueden valorar una experiencia que realmente no se asemeja a nada que haya surgido con anterioridad.

Esto es bastante acertado, sino prueben de enseñar a jugar a una persona totalmente ajena al mundo de los videojuegos y atestigüen cómo su percepción del tiempo se ve totalmente alterada pasando un buen tiempo colgados con la pantalla.

La inicitavia es abierta a quien le interese unirse. Pueden ingresar al sitio y probarlo: jugar Minecraft Online sin tener que instalar nada (deben contar con el plugin de Java en su navegador web). Si deciden unirse a la comunidad Multiminecraftiana, sigan el enlace y encuentren las instrucciones al final del artículo.

Minecraft - Los alrededores del cuartel Multiversero

Minecraft - Los alrededores del cuartel Multiversero

En principio estamos dejando armada la fortaleza y sus alrededores. Pero a medida que vayamos sumando gente, la idea es construir algo interesante como un castillo o una versión a escala del Salón de la Justicia de los Superamigos. Están invitados a conocer el mundo de Minecraft, algo totalmente innovador y alucinante. Hay mucho por ver y crear. Para quienes ya disfrutan del juego, la invitación queda hecha para sumarse al mundo Minecraft Multiversero.

 

» Leer más, comentarios, etc...

Koalite's blog

Mostrar avisos y errores con jQuery UI

Octubre 25th, 2011 - [Enlace local]

Como parte de mis juegos con javascript, estoy empezando a probar jQuery y jQuery UI. Se trata de dos librerías muy útiles que facilitan mucho el trabajo con html en una página web.

En el caso de jQuery UI, añade un buen número de controles y efectos gráficos que permiten dotar a nuestras aplicaciones web de un aspecto bastante profesional, sobre todo si no somos diseñadores y no somos capaces de crear ese aspecto nosotros mismos. Además, jQuery UI permite personalizar el aspecto de los controles, por lo que podemos elegir entre una amplia variedad de aspectos ya creados o incluso personalizarlos nosotros mismos.

Desde el punto de vista de la experiencia de usuario, es importante que los controles y la información que se muestran en la página estén diseñados con un aspecto consistente para que sean fácilmente reconocibles, por lo que vamos a intentar aprovechar los controles que ya tiene jQuery UI para usarlos en otros puntos de la aplicación.

jQuery UI incluye dos tipos de formas de resaltar un mensaje al usuario para indicarle errores y advertencias:

Ejemplo de errores y advertencias en jQuery UI

Estos mensajes son usados por jQuery UI en algunos controles, pero no he encontrado una forma fácil de usarlos arbitrariamente en nuestra aplicación. La parte buena de todo esto es que jQuery es muy sencillo de extender con nueva funcionalidad, y añadirle la funcionalidad necesaria para poder mostrar errores y advertencias que mantengan el estilo general del UI es fácil. Para ello, podemos declarar dos nuevas funciones dentro de jQuery:

jQuery.fn.asError = function() {
    return this.each(function() {
        $(this).replaceWith(function(i, html) {
            var newHtml = "
"; newHtml += "

"; newHtml += ""; newHtml += html; newHtml += "

"; return newHtml; }); }); }; jQuery.fn.asHighlight = function() { return this.each(function() { $(this).replaceWith(function(i, html) { var newHtml = "
"; newHtml += "

"; newHtml += ""; newHtml += html; newHtml += "

"; return newHtml; }); }); };

Para añadir nuevas funciones a jQuery, debemos agregarlas al objeto fn de jQuery. Esto deberemos hacerlo antes de empezar a utilizar jQuery en nuestra página. Una vez que lo hemos hecho, para añadir un mensaje de error basta con:

$('

').text('soy el mensaje de error').appendTo('#error-list').asError();

En este caso, en nuestro html tendríamos un div (error-list) en al que iríamos añadiendo los errores. Cuando queramos añadir un error, creamos un nuevo elemento de tipo p (párrafo), le establecemos el texto, lo añadimos a la lista de errores e invocamos a nuestra nueva función para que lo formatee como error.

Algunas cosas a tener en cuenta al añadir funciones a jQuery:

Todo bastante sencillo y práctico ;-) .

» Leer más, comentarios, etc...

Picando Código

Gira RubySur 2011: Bogotáconf – Bogotá, Colombia

Octubre 25th, 2011 - [Enlace local]

Lunes, 31 de Octubre
http://bogotaconf.co/
@bogotaconf

Bogotáconf 2011

Bogotáconf 2011

Bogotáconf se presenta como la primera conferencia de Desarrollo Web y Móvil en Bogotá. Una conferencia sin ánimo de lucro, con el propósito de exponer de primera mano a todos los involucrados en el desarrollo móvil y web en Colombia a experiencias exitosas de miembros de reconocidos de diferentes comunidades internacionales.

Conferencistas:
Tom Preston-Werner (Keynote de Cierre), Paul Irish, Obie Fernandez (The Next Big Leap), Edgar Gonzalez, Sebastian Delmont (Trucos y Tips para programacion Android) y Harold Giménez (Construyendo Suites de Pruebas Mantenibles).

Panelistas:
Gisella Borja, Andrés Barreto, Jonathan Tarud, Alan Colmenares y Juan Pablo Buriticá.

» Leer más, comentarios, etc...

Variable not found

El Tao de la Programación

Octubre 25th, 2011 - [Enlace local]

The Tao of ProgrammingHace unos días charlaba con un colega sobre aspectos filosóficos del desarrollo de software, y me pareció curioso que no conociera “The Tao of Programming”, todo un clásico de la literatura friki, y lectura indispensable para los que nos dedicamos a esto.



Este libro, escrito en el año 1987 por Geoffrey James, recoge, en un humorístico tono de misticismo oriental, distintas historias y parábolas con geniales mensajes de fondo sobre calidad en la programación, gestión de proyectos y otros temas que siguen siendo válidos veinticinco años después.



Como probablemente habrá más lectores que no lo conozcan, me ha parecido interesante reproducirlo aquí traducido en su totalidad, por supuesto contando previamente con el permiso expreso del Sr. James.



¡Que aproveche!

Warning: Post largo. Muy largo ;-)







El Tao de la Programación

por Geoffrey James

LIBRO PRIMERO: EL VACÍO SILENCIOSO

Así habló el maestro programador:

“Cuando hayas aprendido a extraer el código del error desde un trap frame,

será la hora de marcharte”

1.1

Algo misterioso se forma, nace en el vacío silencioso. Esperando solo e inmóvil, al mismo tiempo detenido y en movimiento constante. Es la fuente de todos los programas. Yo no sé su nombre, así que lo llamaré el Tao de la Programación.



Si el Tao es grandioso, entonces el sistema operativo es grandioso. Si el sistema operativo es grandioso, entonces el compilador es grandioso. Si el compilador es grandioso, entonces la aplicación es grandiosa. El usuario está complacido y hay armonía en el mundo.



El Tao de la Programación fluye lejos y regresa con el viento de la mañana.

1.2

El Tao engendró al lenguaje máquina. El lenguaje máquina dio vida al ensamblador. El ensamblador se la dio al compilador. Ahora hay diez mil lenguajes.



Cada lenguaje tiene su propósito, aunque sea humilde. Cada lenguaje expresa el Yin y el Yang del software. Cada lenguaje tiene su lugar dentro del Tao.



Pero no programes en COBOL si puedes evitarlo.

1.3

En el principio era el Tao. El Tao engendró el Espacio y Tiempo. Por tanto Espacio y Tiempo son el Yin y el Yang de la programación.



Los programadores que no comprenden el Tao siempre siempre se quedan sin tiempo y espacio para sus programas. Los programadores que comprenden el Tao siempre tienen tiempo y espacio suficiente para lograr sus objetivos.



¿Cómo podría ser de otra manera?

1.4

Al programador sabio le hablan del Tao y lo sigue. Al programador medio le hablan del Tao y lo busca. El programador necio se ríe cuando le hablan del Tao.



Si no fuera por la risa, no existiría el Tao.

Los sonidos más altos son los más difíciles de oír.

Avanzar es un camino para la retirada.

El gran talento se muestra tarde en la vida.

Incluso un programa perfecto todavía tiene errores.

LIBRO SEGUNDO: LOS MAESTROS ANCIANOS

Así habló el maestro programador:

“Después de tres días sin programar, la vida pierde sentido”

2.1

Los programadores de la antigüedad eran misteriosos y profundos. No podemos comprender sus pensamientos, así que todo lo que hacemos es describir su apariencia.



Consciente, cual zorro cruzando el agua. Alerta, como un general en el campo de batalla. Amable, como una anfitriona saludando a sus invitados. Simple, como bloques de madera sin tallar. Opaco, como negras piscinas en cuevas oscuras.



¿Quién puede contar los secretos de sus corazones y mentes?



La respuesta sólo existe en el Tao.

2.2

El Gran Maestro Turing una vez soñó que era una máquina. Cuando se despertó, exclamó:



”¡No sé si soy Turing soñando que soy una máquina, o una máquina soñando que soy Turing!'”

2.3

Un programador de una gran compañía fue a una conferencia de software y luego regresó para informar a su jefe, diciendo: “¿Qué clase de programadores trabajan en otras empresas? Se comportan mal y no se preocupan por las apariencias. Su cabello era largo y despeinado y sus ropas arrugadas y viejas. Destrozaron nuestra hospitalidad e hicieron ruidos groseros durante mi presentación''.



El director dijo: “Nunca debí haberte enviado a la conferencia. Esos programadores viven más allá del mundo físico. Consideran que la vida es absurda, una coincidencia accidental. Ellos van y vienen sin conocer limitaciones. Sin cuidado, ellos viven sólo para sus programas. ¿Por qué deberían preocuparse por las convenciones sociales?



Ellos viven dentro del Tao”.

2.4

El discípulo preguntó al Maestro: “Este es un programador que nunca diseña, documenta o prueba sus programas. Sin embargo, todos los que lo conocen lo consideran uno de los mejores programadores del mundo. ¿Por qué es esto?”



El Maestro responde: “Ese programador ha alcanzado la maestría del Tao. Ha ido más allá de la necesidad de un diseño; no se enoja cuando el sistema se cae, pero acepta al universo sin preocupación. Ha ido más allá de la necesidad de documentación; no le importa si alguien más ve su código. Ha ido más allá de la necesidad de pruebas; cada uno de sus programas son perfectos en sí mismos, serenos y elegantes, su propósito es auto-evidente. Realmente, él ha penetrado en el misterio del Tao''.

LIBRO TERCERO: DISEÑO

Así habló el maestro programador:

“Cuando el programa está siendo testeado,

es demasiado tarde para hacer hacer cambios de diseño”

3.1

Hubo una vez un hombre que fue a una feria de informática. Cada día, al entrar le decía al guarda de la puerta: “soy un gran ladrón reconocido por mis hazañas de robo. Estás prevenido de que esta feria no escapará sin ser saqueada”.



Estas palabras incomodaron mucho al guardia, porque dentro había millones de dólares en equipamiento informático, así que observó cuidadosamente al hombre. sin embargo, el hombre simplemente vagaba de stand en stand, murmurando para sí.



Cuando el hombre se iba, el guardia se lo llevó aparte y buscó entre sus ropas, pero nada fue encontrado.



Al siguiente día de la feria, el hombre regresó y regañó al guardia diciendo: "Ayer escapé con un gran botín, pero hoy será todavía mejor". Así que el guardia lo observó incluso más de cerca, pero sin resultados.



En el último día de la feria, el guardia no pudo resistir más su curiosidad. "Señor Ladrón", dijo, "estoy tan confuso que no puedo vivir en paz. Por favor ilumíneme. ¿Qué es lo que está robando?"



El hombre sonrió. "Estoy robando ideas", dijo.

3.2

Había una vez un maestro programador que escribía programas no estructurados. Un programador novicio, buscando imitarlo, también comenzó a escribir programas no estructurados. Cuando el novicio le pidió al maestro que evaluara su progreso, el maestro lo criticó por escribir programas no estructurados, diciendo:



“Lo que es apropiado para el maestro no es apropiado para los principiantes. Debes entender el Tao antes de trascender la estructura”.

3.3

Hubo una vez un maestro programador en la corte del señor de Wu. El señor preguntó al programador: “¿qué es más fácil de diseñar, un paquete de contabilidad o un sistema operativo?”.



“Un sistema operativo”, respondió el programador.



El señor lanzó una exclamación de incredulidad. “Sin duda, un paquete de contabilidad es trivial al lado de la complejidad de un sistema operativo”, dijo.



“No es así”, dijo el programador, “cuando se diseña un paquete de contabilidad, el programador actúa  como mediador entre personas con distintas ideas: cómo debe operar, cómo deben aparecer sus informes, y cómo se deben cumplir las leyes de impuestos". Por el contrario, un sistema operativo no está limitado por las apariencias externas. En el diseño de un sistema operativo, el programador busca la armonía más simple entre máquina e ideas. Esta es la razón por la que el sistema operativo es más fácil de diseñar”.



El señor de Wu asintió y sonrió. “Eso está bien, pero, ¿qué es más fácil de depurar?”.



El programador no respondió.

3.4

Un gerente fue al maestro programador y le mostró el documento de requisitos para una nueva aplicación. El gerente preguntó al maestro: “¿Cuánto tiempo se tarda en diseñar este sistema si le asigno cinco programadores?”.



“Tomará un año”, dijo el maestro rápidamente.



“¡Pero necesitamos este sistema inmediatamente o incluso antes! ¿Cuánto se tarda si le asigno diez programadores?”.



El maestro programador frunció el ceño. “En este caso, se tardará dos años”.



“¿Y si le asigno cien programadores?”



El maestro programador se encogió de hombros. “Entonces el diseño no se completará jamás”, dijo.

LIBRO CUARTO: CODIFICACIÓN

Así habló el maestro programador:

“Un programa bien escrito es su propio cielo;

un programa mal escrito, su propio infierno”

4.1

Un programa debe ser ligero y ágil, sus subrutinas conectadas como las perlas de un collar. El espíritu e intencionalidad del programa debe mantenerse en todo momento. No debe ser ni mucho ni poco, ni bucles innecesarios ni variables sin utilidad, ni ausencia de estructura ni rigidez excesiva.



Un programa debe seguir la “Ley de la menor sorpresa”. ¿Qué es esta Ley? Simplemente que el programa debe responder siempre de la forma que menos sorprenda al usuario.



Un programa, no importa cuán complejo sea, debería actuar como una sola unidad. El programa debe ser dirigido por la lógica interna en lugar de por las apariencias externas.



Si el programa falla en estos requisitos, se llegará a un estado de desorden y confusión. La única manera de corregir esto es reescribiendo el programa.

4.2

Un discípulo preguntó al maestro: “Tengo un programa que a veces funciona y veces aborta. He seguido las reglas de la programación, y estoy totalmente desconcertado. ¿Cuál es la razón?”.



El maestro respondió: “Estás confuso porque no entiendes el Tao. Sólo un necio espera un comportamiento racional de sus semejantes humanos. ¿Por qué ibas a esperarlo de una máquina que los humanos han construido? Los ordenadores simulan determinismo; sólo el Tao es perfecto.

Las reglas de la programación son transitorias; sólo el Tao es eterno. Por tanto, debes contemplar el Tao antes de ser iluminado.”



“Pero, ¿cómo sabré que he sido iluminado?”, preguntó el discípulo.



“Tu programa funcionará correctamente”, respondió el maestro.

4.3

Un maestro estaba explicando la naturaleza del Tao a uno de sus discípulos. “El Tao está presente en todo el software, independientemente de su insignificancia”, dijo el maestro.



“¿Está el Tao en una calculadora de bolsillo?”, preguntó el novicio.



“Está”, fue la respuesta.



“¿Está el Tao en un videojuego?”, continuó el discípulo.



“Incluso en un videojuego”, dijo el maestro.



“¿Y está en el sistema operativo de un ordenador personal?”



El maestro tosió y cambió levemente de posición. “La lección ha acabado por hoy”, dijo.

4.4

El programador del Príncipe Wang estaba codificando software. Sus dedos bailaban sobre el teclado. El programa compiló sin errores y se ejecutó cual ligera brisa.



“¡Excelente!”, exclamó el Príncipe, “¡Tu técnica es infalible!”.



“¿Técnica?”, dijo el programador girándose desde su terminal, “¡Lo que yo sigo es el Tao más allá de toda técnica! Cuando empecé a programar, veía ante mí el problema completo como un todo.



Después de tres años ya no veía ese bloque: empecé a usar subrutinas. Pero ahora no veo nada. Mi ser existe en un vacío sin forma. Mis sentidos están ociosos. Mi espíritu, libre para trabajar sin un plan, sigue su propio instinto. En resumen, mi programa se escribe a sí mismo. Es cierto que a veces hay problemas complejos. Los veo acercarse, me detengo, observo en silencio. Entonces cambio una única línea de código y las dificultades se desvanecen como una voluta de humo. Compilo mi programa. Me quedo quieto y dejo que el gozo del trabajo llene mi ser. Cierro los ojos un momento, y entonces cierro mi sesión”.



El Príncipe Wang dijo “Ojalá todos mis programadores fueran tan sabios”.

LIBRO QUINTO: MANTENIMIENTO

Así habló el maestro programador:

“Incluso un programa de tres líneas algún día tendrá que se mantenido”

5.1

Una puerta bien usada no necesita aceite en sus bisagras.

Un río que fluye veloz no se estanca.

Ni el sonido ni los pensamientos pueden viajar a través del vacío.

El software se pudre si no se utiliza.

Son grandes misterios.

5.2

Un gerente preguntó a un programador que cuánto tiempo le llevaría terminar el programa en el que trabajaba. “Se acabará mañana”, respondió rápidamente el programador.



“Creo que no estás siendo realista”, dijo el gerente, “De verdad, ¿cuánto tiempo tardará?”.



El programador pensó un instante. “Tengo algunas características que me gustaría añadirle. Me llevará al menos dos semanas”, dijo finalmente.



“Incluso eso es demasiado esperar”, insistió el gerente, “me basta si simplemente me avisas cuando el programa esté completo”.



El programador asintió.



Varios años más tarde, el gerente se retiró. De camino hacia su almuerzo de jubilación descubrió al programador dormido sobre su terminal. Había estado programando toda la noche.

5.3

Un programador novicio fue una vez asignado a la codificación de un sencillo paquete financiero.



El novicio trabajó furiosamente muchos días, pero cuando su maestro revisó su programa descubrió que contenía un editor de pantallas, un conjunto de rutinas gráficas generales, y una interfaz de inteligencia artificial, pero ni la más mínima mención de nada financiero.



Cuando el maestro le preguntó acerca de ello, el novicio se indignó. “No seas tan impaciente”, dijo, “Incluiré los temas financieros al final”.

5.4

¿Acaso un buen agricultor descuidaría un cultivo que ha plantado?

¿Acaso descuidaría un buen profesor incluso al estudiante más humilde?

¿Acaso un buen padre permitiría que uno de sus hijos murieran de hambre?

¿Acaso un buen programador rechazaría mantener su propio código?

LIBRO SEXTO: GESTIÓN

Así habló el maestro programador:

“Sean los programadores muchos y gestores pocos;

todos ellos serán entonces productivos”

6.1

Cuando los gestores tienen reuniones infinitas, los programadores escriben juegos. Cuando los financieros hablan de beneficios cuatrimestrales, el presupuesto de desarrollo está a punto de ser recortado. Cuando los científicos hablan de cielo azul, las nubes están a punto de aparecer.



Ciertamente, esto no es el Tao de la Programación.



Cuando los gestores de comprometen, los juegos son ignorados. Cuando los financieros hacen planes a largo plazo, la armonía y el orden son restaurados. Cuando los científicos se centran en los problemas cercanos, los problemas estarán a punto de resolverse.



Ciertamente, esto es el Tao de la Programación.

6.2

¿Por qué los programadores son improductivos?

Porque pierden su tiempo en reuniones.



¿Por qué los programadores son rebeldes?

Porque la gestión interfiere mucho.



¿Por qué los programadores reniegan unos de otros?

Porque están quemados.



Después de haber trabajado para un mal gestor, ya no valoran sus empleos.

6.3

Un gerente estaba a punto de ser despedido, pero un programador que trabajaba para él inventó un nuevo programa que se hizo popular y se vendió bien. Como consecuencia, el gerente conservó su empleo.



El gerente intentó darle al programador una bonificación, pero éste se negó diciendo “yo escribí el programa porque pensé que era un concepto interesante, por lo que no espero ninguna recompensa”.



Al oír esto, el gerente comentó: “Este programador, a pesar de su baja autoestima, entiende bien los deberes de un empleado. ¡Vamos a promocionarlo hacia la posición de consultor de gestión!”.



Pero cuando se le dijo esto, el programador lo rechazó una vez más diciendo: “Vivo para la programación. Si fuera ascendido no haría más que desperdiciar el tiempo de todos. ¿Me puedo ir? Tengo un programa en el que trabajar”.

6.4

Un gerente se dirigió a sus programadores: “En cuanto a sus horas de trabajo, van a tener que venir desde las nueve de la mañana hasta las cinco de la tarde”. En ese momento todos se enfadaron y muchos de ellos renunciaron en el acto.



Así que el gerente dijo: “Bien, pues en ese caso podéis establecer vuestros propios horarios de trabajo, siempre que terminéis los proyectos a tiempo”. Los programadores, ahora satisfechos, comenzaron a llegar a mediodía y trabajar hasta altas horas de la madrugada.

LIBRO SÉPTIMO: CONOCIMIENTO CORPORATIVO

Así habló el maestro programador:

“Puedes mostrar un programa a un ejecutivo de la empresa,

pero no puedes hacerlo experto en informática”

7.1

Un discípulo preguntó al maestro: “En el Este hay una gran estructura con forma de árbol que los hombres llaman sede corporativa. Está excesivamente inflada con vicepresidentes y contables. Generan una gran cantidad de notas diciendo ‘ve aquí’ o ‘ve allá’ y nadie sabe lo que significa. Cada año se colocan nuevos nombres en las ramas, todo en vano. ¿Cómo puede existir una entidad tan innatural?”.



El maestro respondió: “Percibes esta inmensa estructura y te perturba que no tenga un propósito racional. ¿No puedes encontrar entretenimiento con sus giros sin fin? ¿No disfrutas de la facilidad de programar sin problemas refugiado bajo sus ramas? ¿Por qué te molesta su inutilidad?”.

7.2

En el Este hay un tiburón que es mayor que todos los otros peces. Se transforma en ave cuyas alas son como nubes llenando el cielo. Cuando es ave, se mueve por toda la tierra y trae un mensaje desde la sede corporativa. Este mensaje cae entre los programadores como una gaviota dejando su huella en la playa. Entonces el pájaro remonta el vuelo y, con el cielo azul a sus espaldas, vuelve a casa.



El programador novicio mira sorprendido el ave porque no lo entiende. El programador intermedio teme la llegada del ave porque teme su mensaje. El maestro programador continúa trabajando en su terminal, no sabe que el ave ha llegado y se ha marchado.

7.3

El Mago de la Torre de Marfil llevó su último invento para que lo examinara el maestro programador. El Mago acarreó una gran caja negra a la oficina del maestro, mientras éste esperaba en silencio.



“Esto es una estación de trabajo de propósito general integrada y distribuida”, comenzó el Mago, “diseñada ergonómicamente con un sistema operativo propietario, lenguajes de sexta generación y múltiples interfaces de usuario de tecnología punta. Construirlo costó a mis asistentes varios cientos de años/hombre . ¿No es sorprendente?”.



El maestro alzó sus cejas ligeramente. “Sin duda es increíble”, dijo.



“La sede corporativa ha ordenado”, continuó el Mago, “que todos usen esta estación de trabajo como plataforma para los nuevos programas. ¿Está de acuerdo con esto?” .



“Ciertamente”, respondió el maestro, “Lo transportaré al centro de datos inmediatamente”. Y el Mago retornó complacido a su torre.



Varios días después, un novicio vagaba por la oficina del maestro programador y le dijo: “No puedo encontrar el listado de mi nuevo programa. ¿Sabes dónde puede estar?”.



“Sí”, respondió el maestro, “los listados están apilados sobre la plataforma del centro de datos”.

7.4

El maestro programador se mueve de un programa a otro sin miedo. Ningún cambio en los gestores puede dañarle. No será despedido, ni siquiera aunque el proyecto en el que trabaja sea cancelado. ¿Por qué es esto?



El Tao está en él.

LIBRO OCTAVO: HARDWARE Y SOFTWARE

Así habló el maestro programador:

“Sin el viento, el pasto no se mueve. 

Sin software, el hardware es inútil”

8.1

Un discípulo preguntó al maestro: “Percibo que una compañía de ordenadores es mucho mayor que todas las demás. Se eleva por encima de su competencia como un gigante entre enanos. Cualquiera de sus divisiones podría abarcar todo el negocio. ¿Por qué es esto así?”.



El maestro respondió: “¿Por qué haces preguntas tan necias? Esa compañía es así de grande porque es grande. Si sólo fabricara hardware nadie lo compraría. Si sólo hiciera software, nadie lo usaría. Si sólo mantuviera sistemas, la gente los trataría como a sirvientes. Pero al combinar todas esas cosas, la gente piensa que son dioses. Al no buscar la confrontación conquista sin esfuerzo”.

8.2

Un maestro programador pasó un día junto a un novicio. El maestro notó la preocupación del novicio con un juego en un dispositivo portátil. “Disculpe”, dijo, “¿me permite examinarlo?”.



El novicio atendió y pasó el dispositivo al maestro. “Veo que el aparato afirma tener tres niveles de juego: fácil, intermedio y difícil”, dijo el maestro. “Pero aún cada dispositivo tiene otro nivel de juego, donde el apartado no busca conquistar al humano, ni ser conquistado por el humano”.



“Ruego, gran maestro”, imploró el novicio, “¿cómo hace uno para encontrar esa misteriosa configuración?”.



El maestro arrojó el dispositivo al suelo y lo aplastó bajo su pie. Y de pronto, el novicio fue iluminado.

8.3

Había una vez un programador que trabajaba con microordenadores. “Mira lo bien que estoy aquí”, dijo a un programador de mainframes que lo fue a visitar. “Tengo mi propio sistema operativo y dispositivo de almacenamiento de archivos. No tengo que compartir mis recursos con nadie. El software es consistente y fácil de usar. ¿Por qué no dejas tu trabajo actual y te vienes conmigo?”



Entonces, el programador de mainframes comenzó a describir su sistema a su amigo, diciendo: “El mainframe está sentado como un antiguo sabio meditando en el centro de datos. Sus discos se encuentran de extremo a extremo como un gran océano de maquinaria. El software es tan polifacético como un diamante, y enrevesado como una selva virgen. Los programas, cada uno único, se mueven a través del sistema como un río de corriente rápida. Por eso estoy feliz donde estoy”.



El programador de microordenadores, al oír esto, se quedó en silencio. Pero los dos programadores siguieron siendo amigos hasta el final de sus días.

8.4

Hardware y Software se encontraron en el camino hacia Changtse. Software dijo: “Tú eres Yin y yo soy Yang. Si viajamos juntos nos haremos famosos y ganaremos vastas sumas de dinero”. Y así, el equipo se unió, pensando que conquistarían el mundo.



Actualmente se encontraron con Firmware, que estaba vestido con harapos y cojeaba apoyado en un palo espinoso. Firmware les dijo: “El Tao está más allá del Yin y Yang. Es silencioso y quieto como un estanque de agua. No busca la fama, por tanto, nadie sabe de su presencia. No busca fortuna, porque es completo en sí mismo. Existe más allá del espacio y del tiempo”.



Software y hardware, avergonzados, regresaron a sus hogares.

LIBRO NOVENO: EPÍLOGO

Así habló el maestro programador:

“Es hora de que partas”




Publicado en: Variable not found.



» Leer más, comentarios, etc...

Viricmind Labs

Primeros pasos con CoffeeScript

Octubre 24th, 2011 - [Enlace local]

CoffeeScript LogoComo dije en el anterior artículo sobre Nodejs, en este haré una introducción al lenguaje CoffeeScript.

CoffeeScript está diseñado para ser compilado a JavaScript, y parece estar basado en lenguajes como Python o Ruby. Mi empeño en explicar CoffeeScript antes de continuar con la guía de Nodejs radica en que probablemente voy a usarlo con asiduidad. Me gusta Nodejs... pero no me gusta Javascript.

Reconozco que JS es un lenguaje que obliga a pensar de manera diferente, y que en cierta manera le obliga a uno a lucir su ingenio cuando quiere crear código mínimamente interesante, pero a la vez me parece agobiante su falta de "limpieza" y la gran cantidad de construcciones "adhoc" que existen para poder trabajar siguiendo el paradigma OOP.

Empecemos con un ejemplo sencillo, transformaremos el "Hello world" que realizamos anteriormente en Javascript para Nodejs a código CoffeeScript. En primer lugar presentaremos el código que ya escribimos para usarlo de base:

1
2
3
4
5
6
7
8
var http = require('http');
 
http.createServer(function (req, res) {
	res.writeHead(200, {'Content-Type': 'text/plain'});
 	res.end('Hello Worldn');
}).listen(1337, "127.0.0.1");
 
console.log('Server running at http://127.0.0.1:1337/');

En segundo lugar, veamos como debería ser su equivalente en CoffeeScript:

1
2
3
4
5
6
7
8
http = require "http"
 
http.createServer((req, res) ->
  res.writeHead 200, {"Content-Type": "text/plain"}
  res.end "Hello Coffee!!\n"
).listen 1337, "127.0.0.1"
 
console.log "Server running at http://127.0.0.1:1337/"

Intentemos analizar las particularidades de este código. Podemos observar en la primera línea que no es necesario declarar las variables con la palabra reservada var, y que además las funciones son llamadas escribiendo sus parámetros después de sus nombres sin tener que rodearlos con paréntesis, un espacio basta. En la línea 4 podemos ver que cuando hay más de un parámetro estos deben separarse con comas.

Otro punto interesante es la no necesidad de punto y coma final, lo que puede ayudarnos a evitar algún que otro error tonto. Sigamos, pues hay una particularidad que podría darnos algunos dolores de cabeza si no caemos en la cuenta: en la línea 3 podemos ver como se llama a una función usando paréntesis, contrariamente a lo que había indicado antes. Esto solo se puede hacer si los paréntesis están pegados al nombre de la función.

Si hubiera un espacio entre createServer y el paréntesis, entonces se consideraría como parámetro no lo que hay dentro del paréntesis, sino el resultado de la llamada al  método listen (CoffeeScript creería que ese método pertenece al objeto retornado por el interior de los paréntesis).

Respecto a las funciones anónimas en CoffeeScript, estas se declaran de una forma que puede extrañar un poco, pero que para nada es complicada. Las funciones en CoffeeScript tienen estructuras como las que siguen:

1
2
3
4
5
funcionA = (param_1, param2) -> param_1*param_2
 
funcionB = (param_1, param_2) ->
    alert param_1
    param_1*param_2

Es decir, se indican los parámetros que aceptará dentro de un paréntesis, y el cuerpo de la función se escribe después de la flecha formada por el guión y el "mayor que". El último valor calculado se tomará como valor de retorno, y tal como pasa en Python, la identación es importantísima para definir el ámbito de las instrucciones. CoffeeScript tiene muchas otras características (bastante más) interesantes pero creo que será mejor que quien esté interesado las aprenda directamente de su sitio oficial :) .

Para acabar, veamos como se transforma este código nuevamente a Javascript para poder ser ejecutado por Nodejs o aplicado directamente en la parte del cliente de alguna aplicación web que estemos desarrollando. Antes será preciso instalar el compilador de CoffeeScript, y para ello usaremos NPM, como indiqué en el anterior artículo. Realizar la instalación es tan sencillo como teclear en la línea de comandos:

1
sudo npm -g install coffee-script

La opción -g sirve para indicarle a npm que queremos una instalación "global", que el compilador coffee sea accesible desde todo el sistema. Ahora, suponiendo que hayamos llamado ejemplo.coffee a nuestro código, para compilarlo a Javascript solo tenemos que escribir en la línea de comandos:

1
coffee -c ejemplo.coffee

Y obtendremos un fichero llamado ejemplo.js apto para ser ejecutado en Nodejs :D . Podéis comprobar como el código obtenido será ligeramente diferente a nuestra primera versión escrita en Javascript, ya que estará contenido dentro de una función autoejecutable. Si queréis, también podéis hacer el experimento de poner un espacio entre createServer y el paréntesis para comprobar lo que os he dicho anteriormente. Bien, esto es todo por hoy ^_^ , otro día más.

» Leer más, comentarios, etc...

Cuaderno de software

Ficheros .war sin las librerías del proyecto con maven y Tomcat

Octubre 24th, 2011 - [Enlace local]

Uno de los problemas que nos encontramos al trabajar con ficheros .war es el rápido crecimiento en volumen de estos en el momento en el que incluimos frameworks tipo Spring o Hibernate. Este problema da lugar a que al hacer pases a producción estemos subiendo un % de código que no cambia que resulta muy poco efectivo, aparte de que si tenemos 5 productos que utilizan el mismo framework lo estamos subiendo 5 veces.

Para resolver este problema hay que atacar desde dos lados.

Primero, construir los .war sin las librerías, en nuestro caso y utilizando maven fué suficiente con definir el scope de cada dependencia como provided. Para ahorrarnos quebraderos de cabeza en los desarrolladores con el manejo de librerías lo que hemos hecho ha sido crear dos ficheros pom, uno que construye durante la etapa de desarrollo y otro (el que tiene las dependencias marcadas como provided) que utilizamos para construir cuando queremos generar un paquete que irá a producción.

Segundo, configurar Tomcat (en nuestro caso versión 6.0.29), se tratará de crear un directorio en el que se alojarán aquellas librerías que serán compartidas por nuestras aplicaciones. Nuestra solución pasó por crear un directorio llamado shared/lib en $CATALINA_HOME (normalmente directorio en el que están los ficheros de Tomcat) en el que alojamos dichas librerías. Para que Tomcat lo utilice deberemos configurar en el fichero conf/catalina.properties la variable shared.loader para que lea el contenido de dicha carpeta de librerías:

shared.loader=${catalina.home}/shared/lib,${catalina.home}/shared/lib/*.jar

Evidentemente queda en nuestra mano encontrar el mejor modo de mantener correctamente el contenido de las librerías compartidas.

Si por h o por b quisieramos mantener librerías en un proyecto que no se compartiesen no habría ningún problema en mantener el scope como compile y esa librería viajaría empaquetada en el .war del proyecto y solo sería utilizable por este.

 

Nota I: Siguiendo la documentación de Tomcat parece ser que ciertas librerias como los jdbc no deberían alojarse en la carpeta shared sinó en la carpeta lib del propio tomcat, son casos muy excepcionales y con el que, por ahora, no nos hemos encontrado.

Nota II: Nuestro proyecto utilizaba la librería el-api.jar que viene por defecto en el directorio lib de Tomcat, el problema surgió en las versiones 2.1 para Tomcat y 2.2 para nuestra aplicación, lo resolvimos borrando la librería el-api.jar de Tomcat y creando un enlace a la librería 2.2 que utilizamos en nuestra aplicación, no ha habido ningún problema de funcionamiento por ahora. El problema surje porque la librería no tiene el número de versión incluido en el nombre.


» Leer más, comentarios, etc...

Picando Código

PDF Libre: se completa otro proyecto de alta prioridad de la FSF

Octubre 24th, 2011 - [Enlace local]

GNU PDF

GNU PDF

La Free Software Foundation lleva una lista de proyectos de alta prioridad. En mayo de este año sacaban de la lista las herramientas libres para extracción de archivos comprididos con RARv3. En este caso, le llegó el momento a GNU PDF:

Estamos satisfechos de anunciar que otro proyecto puede ser eliminado de nuestra lista de proyectos de software libre de alta prioridad: GNU PDF.

La meta del proyecto GNU PDF desde sus inicios en 2007 era proveer una implementación completa del estándar ISO emergente para PDF, ISO 32000-1. Hemos tenido visores PDF software libre por mucho tiempo, pero en el momento la mayoría no tenían soporte para nuevas características de PDF como las anotaciones y fórmulas.

Nos alegra reportar que libpoppler, la biblioteca PDF más común en GNU/Linux, ha madurado su soporte para estas y otras características de PDF — una movida que significa que cada usuario de software libre puede tener software PDF con capacidades que eran exclusivas al software privativo hasta hace poco.

GNU PDF

GNU PDF

La Free Software Foundation mantiene una lista de proyectos de software libre de alta prioridad, los cuales son de vital importancia para un sistema operativo totalmente libre. Anteriores proyectos de la lista que han sido completados incluyen soporte software libre para el formato RARv3 (The Unarchiver) y un sistema de base de datos para organizaciones sin fines de lucro (CiviCRM) y ahora el proyecto GNU PDF.

FSF Europa mantiene una lista de lectores PDF software libre para todos los sistemas operativos. También se pueden encontrar opciones buscando “PDF” en nuestro Directorio de Software Libre.

Comparte: Twitter Identi.ca del.icio.us Google Bookmarks BarraPunto Bitacoras.com Tumblr Print Facebook

» Leer más, comentarios, etc...

Javier Pérez

Cómo promocionar un blog: SEO

Octubre 24th, 2011 - [Enlace local]

Cómo promocionar un blog

Índice

0. Introducción
1. SEO
2. SEM
3. Social Media
4. Emailing
5. Usabilidad
6. Analítica Web
7. Afiliación

SEO

SEO es un acrónimo de Search Engine Optimization (optimización para motores de búsqueda). En la actualidad, los mortales que hacemos SEO lo hacemos exclusivamente para el buscador de Google, aunque existen más ámbitos del SEO, como Bing, Yahoo!, e incluso redes sociales como Facebook o Google+.

Además, el SEO tradicional es cada vez menos útil para posicionar una web debido a la influencia en los buscadores del componente social, es decir, el valor único e individual de cada enlace para cada usuario dependiendo de su actividad y sus relaciones en las redes sociales. Aún así la importancia del SEO sigue siendo básico para posicionar una web en lo más alto de los resultados de búsqueda, sin un buen SEO tu blog difícilmente estará arriba.

El algoritmo que usa Google para posicionar a un enlace en sus resultados de búsqueda se llama Pagerank ©, y aunque no es público totalmente, más o menos funciona de la siguiente manera: