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]
¡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
- 09:00 – Acreditaciones
- 09:45 – Bienvenida
- 10:00 – ¿Que Es Tan Especial de Ruby on Rails? – Stephen Anderson.
Un discurso para programadores considerando or recién llegados a Ruby on Rails. - 10:30 – Ruby on Rails – Santiago Pastorino y Jorge Bejar -
La idea es mostrarle a la gente que no sabe nada o muy poco de Ruby on Rails, qué es lo que se puede lograr con esta tecnología y qué tan productivo se puede ser. Mostraremos de principio a fin como se construye una aplicación Ruby on Rails, mostrando todas las ventajas que el ambiente brinda para lograrlo. Veremos como el fuerte apoyo de la comunidad y sistemas existentes (github y ruby toolbox) facilitan la elección/instalación de librerías. - 11:30 – Coffee Break
- 11:45 – A Tale of Three Trees – Scott Chacon
Git is the version control system most of us use every day. However, there are some strangenesses to it. Raise your hand if you really understand the ‘reset’ command. When it comes down to it, this is one of the most interesting, fundamental and amazing commands that Git has, yet nearly everybody is afraid of it. This is just bad marketing. This talk will de-mystify the ‘reset’ command so that you are not only comfortable using it, but can do new and interesting things with it and in doing so will arrive at a better understanding of the entire Git system. We will explore the Three Trees of Git (HEAD, index, work tree) and all the cool and mind-bending fun you can have with them. - 12:15 – HTML & CSS – Best Practices – Verónica Rebagliatte
80% of the end-user response time is spent on the front-end. (YSlow Team) By following these best practices we can have a great impact over the performance of our sites and applications. In these talk we will go through some best practices related to performance, semantics & accessibility and patterns for better maintainability and readability which is gold when collaborating.Then we will share some tips on how to pick the best layout available, master the CSS basics and keep your code nice and clean. - 12:45 – JRuby: Introduciendo Ruby en un mundo enterprise – Jano González
Esta charla mostrará como usar JRuby, la implementación de Ruby parala JVM, en entornos enterprise con el objetivo de mejorar los tiempos de desarrollo, la calidad y la simplicidad de las aplicaciones.La charla se centrará en como ejecutar Ruby on Rails en servidores de aplicaciones como Websphere, JBoss y Tomcat, en la reutilización de componentes Java ya existentes dentro de una aplicación Ruby y finalmente, en como simplificar el entorno enterprise.
La charla se estructurará de la siguiente forma:- Revisión del entorno enterprise: J2EE, servidores de aplicaciones, integración de aplicaciones- Características de JRuby- Cómo JRuby nos permite simplificar el desarrollo en el complejo entorno enterpriseEjemplos:- JRuby on Rails- Integración de JRuby con Spring- Simplificando un arquitectura con JRuby - 13:15 – Almuerzo
- 14:30 – CRUD Is Not REST – Hypermedia For Y’All! – Nick Sutterer
REST is an architectural style for distributed systems. However, manyimplementations forget about the distributed part of REST and simplymap CRUD operations to HTTP verbs in a monolithic application. We’re gonna go further and learn why hypermedia is the crucial part of REST architectures and how machines can browse resources just like humans using self-describing representations. Monolithic applications are boring, so let’s separate things andcreate a REST system as it is intended to be. Let’s build a simplesystem using the Roar gem, Rails and Sinatra and discuss the benefits and drawbacks we get from distributed hypermedia systems. - 15:00 – Resources, For Real This Time (with Webmachine) – Sean Cribbs
Over the past 5-6 years we have seen a lot of changes in the way that Ruby apps speak HTTP — from Rails’ “REST” conventions, to the brilliantly simple Sinatra, to the modular Rack abstraction — but we haven’t yet unlocked the entire subtle power of HTTP. We know HTTP is so much more than verbs and URLs that correspond to CRUD, and yet it’s still too hard to do conditional requests, content negotiation, and then return the right type of response. What if, instead of forcing HTTP into our MVC-shaped applications, we shaped our applications like HTTP? Instead of forcing a resource into seven controller actions or verb/URL-specific methods, what if the resource itself was the abstraction? A whole world of subtle and powerful programming patterns emerge. This is the world of Webmachine, a toolkit for building HTTP applications and a port of the Erlang toolkit of the same name. I will introduce Webmachine’s unique programming model and demonstrate how to easily expose rich HTTP behavior in a few short lines of Ruby code. - 15:30 – Real Time Rack – Konstantin Haase
At least since node.js everyone knows that real time HTTP responses are the next big thing. The secrets of handling incoming requests asynchronously with Ruby is not yet far spread among Rubyists, as the internals needed for such responses are neither specified nor documented and there is a lack of tools. Still, it is possible to use Server-Sent Events, WebSockets and akin with Rack today. This talk will demonstrate the underlying technologies and how to use them in your Ruby application. - 16:00 – Coffee Break
- 16:15 – Javascript tooling in rails 3.1 and how you should be doing it – Duda Dornelles
The new assets pipeline in rails 3.1 has coffescript as its standard UI language with sprockets as the library to manage javascript dependencies. Also, nowadays, we have TDD as a good practice that we try to apply everyday to ensure the quality of our code. The question is: now that we have all the tools in our hands, what’s the best way to use them and what are the best practices? That’s what I’ll try to answer in this talk. - 16:45 – Anatomía de una aplicación: Introducción a Backbone.js – Álvaro Mouriño
Mediante la biblioteca Backbone.js se presentará el concepto de MVC del lado del cliente y su importancia en la creación de grandes aplicaciones.
La idea no es quedarse solamente con la implementación de Backbone sino utilizarla como vehículo para mostrar con ejemplos concretos el problema que esta herramienta soluciona. El el camino veremos cómo lo hace, ventajas, desventajas y qué alternativas existen. - 17:15 – Faster than your IDE: vim for rubyists – Ben Orenstein
Many new rubyists are surprised to hear that vim is the most widely-used editor in our community. However, those with some vim experience know exactly why: there’s simply no faster way to edit code. In this talk, beginning vimmers will learn how (and why) to leave their IDEs behind, and advanced vim-users will discover new tricks to increase their speed even further.
This talk will be highly-interactive, with lots of live vimming and exactly zero slides. After this talk, expect to be writing code faster than when you walked in.
Topics to be covered include:- the fundamentals of efficient editing
- navigating Rails projects at top-speed
- the power of tags
- running ruby from inside vim
- five incredibly-useful plugins
- macros, registers, marks, and more
- 17:45 – Coffee Break
- 18:00 – Who makes the best asado? – Aaron Patterson
Starting a holy war is easy, understanding Rails internals is not. In this talk we’ll take a look at some of the code that makes Rails tick. Highlights will include ActiveRecord, connection pooling, resource management, and how these impact the request and response life cycle. Based on what we learn from exploring these facets of Rails, we’ll discuss what we need to do for the future of Rails itself! - 18:30 – Ruby’s past, present, and future – Shugo Maeda
Si leyeron hasta acá, estarán tan ansiosos como yo por que llegue el 11 de noviembre
Sábado 12 de noviembre
- 09:00 – Acreditaciones
- 09:45 – Charla de sponsor – Cubox
- 10:00 – Por que pasé de c# a ruby – Pablo Rozanski
El mundo esta cambiando y los proyectos de software cambian con el la idea es plantear ejemplos de proyectos y las diferencias que encontrariamos en desarrollarlos con c# y todo el ecosistema .net que lo rodea (visual studio, microsoft, la comunidad, nhibernate, spring.net) y desarrollarlo con ruby comparando las ide’s, la comunidad, los proyectos open source, gems.La idea es que a partir de esta charla mi experiencia en el salto .net – ruby le de valentia a quienes todavia no se animan a dar ese salto, a salir de la zona de confort que les brinda lo que ya saben y aventurarse a este nuevo mundo y sumar una mas a su caja de herramientas. - 10:30 – What every programmer should know about distributed systems – lessons learned at Heroku – Pedro Belo
It’s time to talk about distributed systems: what are they, why youshould be writing one, and what to look for while doing so. We’ll cover the basics, understand some of the technology behind it – like REST, MQ with AMQP, ZeroMQ, etc – and discuss things we’re doing at Heroku to avoid the pitfalls of a distributed architecture. - 11:00 – On Distributed Failures – Blake Mizerany
In unreliable networks, with unreliable processors (also known as “The Cloud”) one must know all the ways their thing can fail; and just as importantly, how to recover. It is even better to have the ability to recover in an automated way. I’ll go over the common failure conditions in distributed systems, and then introduce you to Doozer, the highly-available, consistant data store that makes recovering from these problems easy. - 11:30 – Coffee Break
- 11:45 – Client and Developer Interactions – Álvaro Gil
Esta presentación intenta demostrar que el trabajo de los desarrolladores no se limita a escribir código sino a saber trabajar con una serie de factores que nos van a ayudar a que los proyectos tengan éxito o que al menos trabajemos de la mejor y más comoda manera posible. - 12:15 – Lean Startups for the Ruby Hacker – Evan Henshaw-Plath
Talk about what’s going on in startups and the business side so that programmers can understand their clients. Also perhaps build their own products. - 12:45 – Documentation: You’re Doing It Wrong – Danish Khan
Most developers hate having to do documentation, yet we complain about how tools and libraries we use lack documentation. So, the question is how do you get developers to write good documentation without having to feel like they are wasting their time. There are plenty of good documentation tools out there such as TomDoc, YarDoc, and RDoc. These tools are useful for creating documentation for tools, gems and varies open source projects and each one has it’s unique way of making documentation easier for developers. However, how do you manage documentation for a product? At Engine Yard we have our AppCloud product and having good external documentation for our customers is very important to us. We want to make sure they can easily understand how to use our product and be able to accomplish what they need. However, it has been difficult to get good documentation out quickly. - 13:15 – Almuerzo
- 14:30 – Why, How and What should I test? – Thais Camilo
One of the most intimidating things to someone who is starting to learn Ruby on Rails is testing.Sometimes you don’t know the answer to questions like:Why should I test?How should I test?What should I test?
When you finally get to the point where you can answer all of those questions, you start asking yourself:What’s the difference between Unit Test and Integration Test, Rspec, TestUnit, Cucumber, and so on?
All of the new terms such as TDD, BDD, Unit Test, Integration Test, Mock, Stub, RSpec, TestUnit, Cucumber, Fixtures and Mocha makes no sense. Let’s talk about this and clarify all the beginner’s questions about testing. - 15:00 – Practices for maintainable test suites – Harold Giménez
Many test suites reach a point where they are no longer maintained because they either exhibit sporadic failures or becomes too slow.
There are well known practices for building and maintaining a large test suite, and here we will discuss many of them in the context of the Ruby tools available today. - 15:30 – Winning strategies in the battle against code smells – Nigel Fernandes
As a consultant and developer on large ruby projects, I’m often called upon to do a health check of a complex ruby code-base.
In this talk I’ll cover ways to quickly diagnose code smells and toxicity idiomatic to many ruby systems. More importantly I’ll discuss simple and effective techniques to tackle specific types of smells. Like any good doctor, I’ll also cover ways to keep your code base healthy post recovery.
In terms of smells, I’ll cover with examples, things like code duplication, tangles, cyclometric complexity, feature envy, control couples, leaky abstractions, naked literals, etc. I’ll also provide techniques to first visualize such smells and then to refactor them away.
If time permits, I’ll cover in a brief, architectural smells common to ruby code bases. - 16:00 – Coffee Break
- 16:15 – Lightning Talks
- 17:15 – GitHub Flavored Ruby – Tom Preston-Werner
Someone once told me that software development is a constant battle against complexity. Over the past three years we’ve built several large systems at GitHub and if anything, that saying is an understatement. Things like tight coupling, insufficient testing or documentation, lack of versioning discipline, and underspecified design documents can easily lead you down a path of ruin. In this talk I’ll cover many of the techniques we use at GitHub to defend against complexity in our Ruby systems, including Readme Driven Development, Semantic Versioning, TomDoc, Git/GitHub workflow, modularization, metrics, and exception reporting. - 17:45 – Coffee Break
- 18:00 – Keynote: Agile Development, Lean UX – Ian McFarland
What’s the right team size for maximum throughput? How do you manage large teams without losing efficiency?
How often should you pair? How frequently should you change pairs? How do you balance consistency and new blood on a team?
How do you find great candidates, and discern the great ones from the ones who just interview well?
How do you manage a stand-up with 50+ people in it? How do you keep a consistent culture across multiple locations? How do you work remotely?
What makes Pivots so good at what they do?
Does it really matter if you test first or test after? Why?
Why is pairing a good idea? Why is it faster? How does the layout of the workspace affect productivity, communication, and developer happiness?
What do I do if my management is resistent to doing this? My team?
I heard you have breakfast every day. Is that true? Why does that make a difference?
How do you bring in new ideas?
Do you really just work 40 hours a week? Even in ‘crunch time’? Don’t your clients make you work more hours? Does that really produce the most work product per week? Why?
These are all questions we’ve had, from clients, developers, and other firms. We’ve been practicing these methods for over 10 years, so we’ve learned a thing or two about how it all works. We want to share what we’ve learned, and we think you’ll take away new insights you can apply right away. It’s been great for us, and we think it can make your own work more sustainable, delightful, and productive. - 19:00 – Despedida y Sorteos
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]
Í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:
- Indicas las palabras clave por las que quieres pujar, y el precio máximo que estás dispuesto a pagar por ellas (por cada vez que alguien haga clic en tu anuncio).
- Otros anunciantes harán lo propio por esas mismas palabras, y cada uno pondrá su precio máximo de puja.
- Si alguien busca por las palabras por las que pujaste, el sistema de AdWords mostrará primero los anunciantes que más pujen, y continuará con el resto en el mismo orden. Por lo que es posible que incluso nunca aparezcas si tu puja fue demasiado baja. En la propia herramienta podrás ver todas las estadísticas.
- Cuando el usuario haga clic en tu anuncio será cuando AdWords te cobre, desde 0,01 € hasta el máximo que indicaste en la puja. A esto se le llama CPC (Coste Por Clic).
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/Funccuya 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:
- Decidir si un evento es interesante para el proceso y, por tanto, debe ser procesado
- Realizar el proceso del evento
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]
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]
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.
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
- Se agregó la misión “Tutorial 3″ con secuencia cinemática. Aprende a dividir unidades por tipo y conquistar a tu enemigo.
- Se agregó el mapa “Sabotage” (1 vs 1)
- Se agregó el mapa “Sunset” (1 vs 1, un set limitado de unidades, Zeppelin en acción)
- Se agregó el mapa “Circle” (1 vs 1, un diseño de laberinto experimental)
Jugabilidad
- Se agregó la habilidad “Napalm” (salpicaduras de aceite en llamas daña unidades y torres)
- Se agregó la habilidad “Repair ship” (un barco repara unidades que lo rodean)
- Se agregó la habilidad “Mine field” (unidades tanto aliadas como enemigas se dañan al golpear minas)
Código
- El build de Mac OS X ahora soporta multiplayer
- Se implementó soporte para invitaciones de Steam
- Se mejoró el movimiento de las unidades aéreas
- Se redujeron los crashes inducidos por “HeapChunk”
- Se corrigieron varios errores de GUI
- El nivel de la IA quedó fijado en “Normal” por defecto en el modo “Quick Game”
- Se corrigieron varios errores menores
Visual
- Se optimizaron los modelos Barracuda y Mantaray
- Se agregó ambiente de cañón
- Se agregó una unidad Zeppelin
- Se corrigieron las unidades Seagull
- Se agregó el efecto desvanecimiento en el menú principal
- Se agregó el logo de Unigine al inicio
- Se mejoró la destrucción de unidades
Música
- Se agregó una nueva pista de música de batalla
- La banda sonora está ahora disponible en alta caldad como bonus de la pre orden
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]

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]
[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:
- 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.
- 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).
- 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
. Pocas veces diré esto, pero los de Microsoft tuvieron un detallazo implementando esta característica. - 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:
- Multi-threaded video decoding (Windows, Mac OS yLinux): el pipeline de decodificación de video ya es completamente multi thread. De esta manera se mejorará de forma substancial el rendimiento en la reproducción de video.
- Actualizaciones de Flash Player en background (sólo Windows).
AIR 3.2 beta nos trae:
- Multi-threaded video decoding (Windows y Mac OS): La misma característica de FP 11.2, pero para desktop.
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:
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.
Un pequeño resumen de los métodos, sacado de mis apuntes:
- Card Sorting: Test para agrupar conceptos (o categorías). Gestión de expectativas de los usuarios respecto al contenido o funcionalidad.
- Tree Test: Es un test para evaluar la findability (facilidad para encontrar un contenido/funcionalidad en cuestión) en base al árbol de contenidos y/o su navegación.
- Focus Group: Para, a partir de un grupo de personas consideradas cualificadas, obtener opiniones, sensaciones, actitides e ideas. Tratar de confrontar puntos de vista para intentar llegar a puntos en común.
- Test de los 5 segundos: Con este test se trata de comprobar la eficacia del foco de atención de una interfaz.
- Test con usuarios: Es una prueba para analizar como se comportan los usuarios en un contexto cercano al real (aunque hay que tener en cuenta que son pruebas de laboratorio), donde se pone a prueba un diseño que quizás deba ser modificado a raíz de los problemas de usabilidad que se hayan encontrado.
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]
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.
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.
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.
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:
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 += html;
newHtml += "
";
return newHtml;
});
});
};
jQuery.fn.asHighlight = function() {
return this.each(function() {
$(this).replaceWith(function(i, html) {
var 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:
- Hay que tener en cuenta qué representa
thisen cada contexto. - Puesto que podemos seleccionar varios objetos a la vez, deberemos hacer un
eachpara aplicar la acción a todos. - La guía para crear plugins recomienda devolver
$(this)para poder seguir encadenando funciones.
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 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]
Hace 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
LIBRO PRIMERO: EL VACÍO SILENCIOSO
“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
“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
“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
“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
“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
“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
“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
“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
“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]
Como 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
. 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]
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.
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:
» Leer más, comentarios, etc...
Javier Pérez
Cómo promocionar un blog: SEO
Octubre 24th, 2011 - [Enlace local]
Í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:
- A cada página se le asigna un valor, en base a la cantidad de enlaces que recibe y del valor de cada una de esas páginas. Ese valor es lo que se conoce como Pagerank, y tiene un valor entre 0 y 10.
- Si una página tiene un Pagerank de 5, éste se divide entre todos los enlaces que tenga, enviando esa parte a cada una de esas páginas. Por lo tanto, cuanto más Pagerank tenga una página, y cuanto menos enlaces externos tenga, mayor puntuación dará a la página que enlace.
- Por otro lado está la densidad de palabra. Si alguien busca “javier pérez” en Google, se posicionarán mejor las páginas que más veces tengan contenidas esas palabras clave.
- Es importante que esas palabras clave estén contenidas además en el título (
del ), títulos HTML ( ,
…), META description, dominio, URL, contenido…
Ten en cuenta que para que Google comience a indexar tus páginas debes recibir al menos un enlace a tu blog, aunque sea un enlace nofollow. Esto es muy fácil, basta con poner un enlace en tu perfil de YouTube, en un tweet, o en un comentario en otro blog que ya esté siendo indexado por Google, por ejemplo.
Estos consejos sobre SEO son muy básicos, pero es fundamental que los cumplas al 100%:
- Enlaces, consigue enlaces… de tus amigos, de otros blogs, de donde sea. Sin enlaces a tu blog el SEO no vale para mucho. Es importante que quien te enlace tenga más Pagerank que tú. Es decir, no vale que te crees un blog para poner enlaces a tu blog, lo cual además está penalizado por Google (se denominan link farms). A más enlaces mayor pagerank, y a mayor pagerank más arriba aparecerás en los resultados de búsqueda.
- Usa un nombre de dominio propio, ni miblog.blogspot.com ni miblog.wordpress.com, usa siempre miblog.com. Un dominio no cuesta más de 10-15 € al año.
- Usa URL’s semánticas. Es decir, en lugar de http://miblog.com/?p=1, que sea http://miblog.com/marketing/mi-ultimo-articulo-chupiguay/. De esta manera aumentarás la densidad de palabra.
- Usa un sitemap.xml de Google y añádelo a las Herramientas para Webmasters. De este modo Google tendrá a su disposición todo tu mapa web y lo indexará más rápidamente. Usa el plugin Google XML Sitemaps.
- Usa palabras clave en el contenido poniéndolas en negrita. No demasiadas, que no sea molesto para el lector. Importantísimo es además las palabras claves que uses para el título del artículo. Ten en cuenta que tu blog aparecerá en los resultados de búsqueda cuando alguien busque esas palabras.
- No cometas faltas de ortografía. Si escribes marketin como palabras clave, y alguien busca la palabra marketing, posiblemente no aparezcas en los resultados de búsqueda.
- Y lo más importante, procura que tu contenido sea de interés, de calidad y enlazable (que alguien desee enlazar ese artículo en su blog).
- El vídeo es muy importante, y está bien que lo uses en tus artículos, pero siempre debes acompañarlo de contenido en texto. Aplica lo mismo para las imágenes, aunque contengan texto.
Debes tener unos mínimos conocimientos sobre HTML. Por ejemplo, debes seguir estas tres reglas fundamentales:
- Cada artículo debe mostrar un meta description con un resumen del artículo. Algunos temas de WordPress no crean este meta. Este contenido es lo que aparecerá bajo el enlace en los resultados de búsqueda de Google, o la entradilla automática que aparece al compartirlo en Google+ o Facebook.
- Sólo puedes poner un solo H1 en cada página. Es la cabecera más importante, lo que pongas aquí tendrá mucha relevancia para Google.
- La página principal (inicio/home) puede tener un H1 con el título del blog, pero cada página de artículo debe tener en el H1 el título del artículo. La mayoría de temas de WP lo hacen bien. Y usa cabaceras H2 para dividir el artículo. De esta manera podrás dar más densidad de palabra y además hacer la lectura mucho más sencilla y fluida.
Si además quieres mostrar unos resultados bien profesionales, el siguiente paso es aplicar Rich Snippets en tus contenidos, pero para hacer esto necesitarás a un desarrollador web experimentado, o bien que tengas amplios conocimientos en HTML y CSS. Puedes documentarte aquí: Rich Snippets Testing Tool.
Con WordPress y los plugins SEO Tools y Google XML Sitemaps tienes todo lo que puedas necesitar para aplicar el mínimo de SEO necesario para promocionar un blog, y mucho más.
Si necesitas ayuda profesional puedes contar conmigo. Te espero la próxima semana para contarte cómo aplicar SEM en tu blog.
» Leer más, comentarios, etc...
Variable not found
Enlaces interesantes 56
Octubre 24th, 2011 - [Enlace local]
Estos son los enlaces publicados en Variable not found en Facebook y Twitter del 17 al 23 de octubre de 2011. Espero que os resulten interesantes. :-)
- ASP.NET MVC: Enlazar una propiedad a jQuery UI Slider
Eduard Tomás - Avoiding MvcBuildViews build time impact in developers environment by using ASP.NET compiler as an external tool
Luis Rocha - Impresionante! Avances en holografías: el HoloDesk de Microsoft
Microsiervos
[HowTo] Modificar cadena de conexión, la eterna pregunta
Lluis Franco - Optimizing Long Lists Of Yes/No Values With JavaScript
Lea Verou - Microsoft Codename “Data Explorer” Walkthrough
Data Explorer Team - Comprimir y descomprimir ficheros (II)
Javier Torrecilla - Detectando DEBUG en código y en Razor
Pablo Núñez - Using Roslyn to implement an MVC Razor view engine
David Ebbo - Today we are releasing the first Community Technology Preview of the Roslyn Project!
Visual Studio Blog - Implementing an Authorization Attribute for WCF Web API
Phil Haack - How We Talk about EF and its Future Versions
ADO.NET Team blog - Never Mind the Controller, Here is the Orchestrator
Dino Esposito - Finding Clone Codes in Visual Studio 2011 Developer Preview
Abhijit - Azure Blob Storage – a simple example
Peter von Lochow - How to Deploy Your ASP.NET MVC 3 with SQL CE 4.0 & Entity Framework
Christian D. Yellington - Find out the Geo-coordinates of an address – geocoding with Google Maps
Code Inside Team - Using ASP.NET MVC 3 to Build Ajax Form with JQuery Validation
Christian D. Yellington - Obtaining Results from Parallel Tasks
Black Wasp - [Testing] Pruebas de acoplamiento
Luis Ruiz - Prevent ASP.NET cookies from being sent on every css, js, image request
Omar Al Zabir - CQRS, Commands, Command Handlers and Command Dispatcher
Shiju Varghese's - Improve the YSlow score - remove the ETags
Mark Monster - El señor de las moscas: interfaces al cerebro
José Manuel Alarcón - The Dangers of Implementing Recurring Background Tasks In ASP.NET
Phil Haack - ASP.NET MVC, Random Sign-offs and TempData Loss DevDirective
Publicado en: Variable not found
» Leer más, comentarios, etc...
Najaraba.com: Software libre, metodologías ágiles y más.
CAS2011. Ya ha pasado
Octubre 23rd, 2011 - [Enlace local]
Ya hemos estado en la 2ª Conferencia Agile Spain, y quiero comentar mis impresiones. Nosotros finalmente pudimos llegar al "warm-up" un rato el miercoles, y escuchar un rato la presentación de artículos. Me alegra muchísimo ver el esfuerzo que hace Agustín en la universidad para enseñar estas cosas del agilismo a los alumnos. Y para mi fue un descubrimiento ver a Juan Gasca presentando una
» Leer más, comentarios, etc...
Viricmind Labs
Problemas con Ubuntu 11.10
Octubre 23rd, 2011 - [Enlace local]
No se puede decir que sea fan de Ubuntu (ni de ninguna otra distribución Linux), pero la verdad es que por lo general lo he estado prefiriendo durante los últimos años. Lo que ha hecho que prefiera Ubuntu por encima de otras distribuciones ha sido básicamente que está basada en Debian, usaban Gnome por defecto y han apostado decididamente por la simplicidad.
Pero... últimamente me estoy mosqueando. En primer lugar, Unity llegó 6 meses antes de lo que debería. Tengo que decir que adoro la característica del "global menu" que me permite aprovechar al máximo el tamaño de la pantalla, pero la lentitud general del entorno y la poca configurabilidad es desesperante, eso sin mencionar el caótico panel, que dificulta enormemente encontrar aplicaciones de forma rápida.
No he dicho nada nuevo hasta ahora, si fueran estas mis únicas quejas ni me habría planteado escribirlas. Pero hay más, y "nuevo". Aunque el primer defecto que mencionaré es de la versión 11.04 y no de la 11.10 creo que debe ser explicado.
- En Ubuntu 11.04 solía pasar que, de haber varios usuarios, multitud de veces GDM (la pantalla de login) sólo mostraba uno de ellos, el primero que se creó. No han llegado a solucionarlo nunca... en parte lo entiendo (iban a abandonar GDM en la próxima versión en pos de LDM, y el equipo de Gnome estaba trabajando en otra versión de GDM más nueva, dedicar esfuerzos a eso no resultaba rentable), pero no deja de ser frustrante.
- En Ubuntu 11.10 hay problemas parecidos, pero peores. No sé si solo me pasa a mi pero... si salgo de mi sesión sin cerrarla y vuelvo a entrar en ella (sin haber entrado en ninguna otra antes) entonces el equipo queda "colgado". Lo único que obtengo es una pantalla negra, no puedo ir ninguno de los terminales y lo único que se puede hacer es reiniciar. Podría ser que tuviera que ver con mi tarjeta gráfica (es una ATI), aunque la verdad es que me importa poco. Eso nunca había pasado, y es un fallo prácticamente imperdonable.
- Otro error que me ha dado muchos problemas (tanto en la versión 11.04 como en la 11.10) es el de las firmas de los repositorios. Por alguna extraña razón pasa que cada dos por tres tanto apt como aptitude me indican que las firmas de los paquetes son incorrectas (suele pasar en días que ciertos servidores de Ubuntu parecen colapsados). En general este error no debería causar problemas excesivos, le indicamos al sistema que instale el nuevo software aunque los paquetes no estén bien firmados... y listos. Ahora bien, eso se puede hacer desde la línea de comandos, pero no desde el entorno gráfico, lo que implica que los más perjudicados son los novatos (precisamente a los que Ubuntu se dirige en teoría).
Dicho esto, espero que para la versión 12.04 le den un repaso a todos estos incordios y los hagan desaparecer. Lo cierto es que probablemente me quede con ella durante unos años, tengo necesidad de estabilidad... al menos por un tiempo. Y lo vuelvo a decir, me he enamorado de la característica del "global menu", y estoy dispuesto a tragar Unity solo por eso (tampoco lo sufro mucho porque uso Synapse como lanzador).
» Leer más, comentarios, etc...
Koalite's blog
Open/Closed Principle: Method template, Strategy y otras alternativas
Octubre 23rd, 2011 - [Enlace local]
La O de SOLID, el Open/Closed Principle, es para mi uno de los principios más importantes a la hora de diseñar software y, a veces, uno de los más difíciles de llevar a cabo.
El Open/Closed Principle, que podríamos traducir como Princicio de Abierto/Cerrado, dice lo siguiente:
Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification
Las entidades del software (clases, módulos, funciones, etc.) deben estar abiertas para la extensión pero cerrados para la modificación
La idea es bastante sencilla. En OOP, normalmente se suele aplicar a clases y lo que quiere decir es que, una vez que hemos terminado de implementar una clase, la clase debe quedar cerrada para la modificación (no se debe tocar excepto para corregir errores), pero abierta para la extensión (debe ser posible añadirle nueva funcionalidad o modificar la ya existente).
Al aplicar este principio conseguimos una gran estabilidad en la aplicación. Puesto que evitamos tocar lo que funciona (la clase que tenemos implementada), es más difícil que al evolucionar la aplicación se rompa lo que ya teníamos. Además, al tener diseñadas desde un principio nuestras clases para permitirnos cambiar su comportamiento sin necesidad de tocar su código, muchas veces el añadir nueva funcionalidad es más sencillo, porque basta con implementar pequeñas partes de la aplicación y utilizarlas con la parte ya existente.
En un lenguaje de estático, como C#, hay varias técnicas que nos pueden ayudar a implementar este principio. Veamos algunas de ellas.
Template method (método plantilla)
El patrón template method consiste en definir la estructura de un proceso en una clase base y permitir redefinir uno o varios métodos (los métodos plantilla) en las clases derivadas para personalizar el comportamiento del proceso.
Un ejemplo rápido sería algo así:
public abstract class OrderProcessorBase
{
public void Process(IEnumerable orders)
{
foreach (var order in orders)
{
// TODO: procesar de alguna forma order
NotifiyOrderProcessed(order);
}
}
protected abstract void NotifyOrderProcessed(Order order);
}
public class ConsoleOrderProcessor : OrderProcessorBase
{
protected override void NotifyOrderProcessed(Order order)
{
Console.Out.WriteLine(“Processed Order: {0}”, order.Number);
}
}
En este caso, el algoritmo encapsulado en OrderProcessorBase estaría cerrado para modificación y no deberíamos tocarlo. Sin embargo, existen puntos de extensión para cambiar la forma en que se notifica que Order ha sido procesado. Para ello basta con crear clases derivadas que definan el método NotifiyOrderProcessed.
Esto puede ser inconveniente si tenemos muchas variaciones en el comportamiento que se usan cada una en un único punto de la aplicación, porque nos llevará a definir muchas clases derivadas que sólo tendrán un uso. Aquí se echan en falta las clases anónimas de Java.
Esta técnica la he utilizado en innumerables ocasiones, pero debo reconocer que, con el paso del tiempo, cada vez me gusta menos y prefiero usar alternativas que no requieran herencia.
Patrón Estrategia
El patrón estrategia podríamos considerarlo como una vuelta de tuerca al template method que veíamos antes. Si en el template method usábamos herencia para conseguir aplicar el OCP, en el patrón estrategia usaremos composición. La idea es similar a la de antes, definimos en una clase la estructura del proceso (prefiero no llamarlo algoritmo para que esto suene menos teórico) y hacemos que partes de ese proceso queden delegadas a métodos de otra clase.
El ejemplo anterior quería así:
public interface IOrderProcessedNotifier
{
void Notify(Order order);
}
public class OrderProcessor
{
public void Process(IEnumerable orders, IOrderProcessedNotifier notifier)
{
foreach (var order in orders)
{
// TODO: procesar de alguna forma order
notifier.Notifiy(order);
}
}
}
public class ConsoleOrderProcessorNotifier : IOrderProcessorNotifier
{
public void void Notify(Order order)
{
Console.Out.WriteLine(“Processed Order: {0}”, order.Number);
}
}
// Al utilizarlo
var processor = new OrderProcessor();
processor.Process(orders, new ConsoleOrderNotifier());
En este caso, la clase OrderProcessor sigue definiendo la estructura del proceso, pero está abierta para la extensión implementando distintas estrategias de notificación, es decir, creando nuevas implementaciones de IOrderProcessorNotifier.
Al igual que en el caso anterior, si tenemos muchas variaciones de comportamiento que se usan cada una en un único punto de la aplicación, acabaremos con muchas implementaciones de IOrderProcessorNotifier que sólo se usan una vez.
Aunque en este caso estamos pasando la estrategia en el método que la necesita, también podríamos inyectarla en el constructor de OrderProcessor, lo que nos permite una gran flexibilidad si estamos usando un contenedor de inversión de control para hacer inyección de dependencias.
Personalmente me gusta más esta alternativa que el template method, sobre todo porque no requiere herencia y evitar la herencia suele llevar a diseños más flexibles. Además el hecho de que sea más cómodo de utilizar con contenedores de inversión de control lo hace aún más atractivo para mi.
Inyectar Funcs o Actions
Aunque era posible hacerlo con delegates, la inclusión en C# 3 de las expresiones lambda, facilita mucho usar otra técnica para conseguir aplicar el OCP.
Esta alternativa se parece mucho al patrón estrategia, pero en lugar de definir un interface con los métodos a los que se delega parte del proceso, se utilizan directamente Funcs o Actions con la signatura de esos métodos. De esta forma no es necesario definir nuevas implementaciones del interface, sino que se pueden crear esas funciones “al vuelo”.
Veamos cómo sería el ejemplo anterior con esta técnica:
public class OrderProcessor
{
public void Process(IEnumerable orders, ActionnotifyOrderProcessed)
{
foreach (var order in orders)
{
// TODO: procesar de alguna forma order
notifyOrderProcessed(order);
}
}
}
// Al utilizarlo
var processor = new OrderProcessor();
processor.Process(orders,
order => Console.Out.WriteLine(“Processed Order: {0}”, order.Number));
La principal ventaja de este método es que no es necesario definir nuevos interfaces cada vez que queremos variar el comportamiento. A cambio, es un poco menos claro que el patrón estrategia porque la única forma que tenemos de saber qué representa cada acción es el nombre del parámetro en el método (o en el contructor) de la clase que la utiliza. Esto se puede evitar en parte utilizando delegates tipados:
public delegate void NotifyOrderProcessed(Order order);
public class OrderProcessor
{
public void Process(IEnumerable orders, NotifyOrderProcessed notifyOrderProcessed)
{
...
}
}
Esta técnica funciona bastante bien cuando sólo hay que inyectar un método dentro del proceso que estamos haciendo, tal y como sucede en el ejemplo anterior. Si hace falta definir varios pasos del proceso y, por tanto, se necesitan varios métodos, suele ser más claro utilizar directamente un patrón estrategia.
Aun así, 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.
Conclusiones
Lo que hemos visto en este post son 3 alternativas que nos pueden permitir respetar el OCP en C#. Como decía al principio del post, aplicar correctamente este principio no siempre es sencillo, sobre todo porque es bastante difícil detectar a priori qué partes de la aplicación son las que más van a cambiar y, por tanto, aquellas en las que debemos hacer un mayor esfuerzo para plantear diseños como los que he explicado.
En general, lo mejor suele ser esperar hasta que se presenta la necesidad (YAGNI) y, en ese momento, refactorizar hacia alguna de estas alternativas, pero siempre es bueno tenerlas presentes porque pueden ser una herramienta muy valiosa.
» Leer más, comentarios, etc...
Picando Código
Gira Ruby Sur 2011
Octubre 21st, 2011 - [Enlace local]
Ya comenzó la Gira Ruby Sur, y la comunidad latinoamericana de desarrolladores entra en ebullición en todo lo que respecta a Ruby y Rails (o por lo menos así me gusta imaginármelo).
A través de Ruby Sur, las comunidades locales de varios países se unieron para organizar una serie de conferencias en cada país.
La semana pasada comenzó la gira, con México como primera sede organizando Magmarails. Los siguientes destinos incluyen a Colombia, Brasil, Chile, Argentina y Uruguay.
Si se encuentran cerca de alguna de las instancias, les recomiendo acercarse ya que eventos de este tipo no tienen desperdicio.
Pueden entrar en el sitio de MAGMARAILS - http://www.magmarails.com/ para ver videos de lo que fue esta segunda entrega del evento. También pueden seguir a @MagmaRails en Twitter para enterarse de novedades y estar atentos a una nueva instancia el año que viene



















