• Shortcuts : 'n' next unread feed - 'p' previous unread feed • Styles : 1 2

» Publishers, Monetize your RSS feeds with FeedShow:  More infos  (Show/Hide Ads)


Date: Friday, 12 Apr 2013 15:35
Una vez que tenemos desarrollada una aplicación que hace uso de RequireJS como herramienta para gestionar las dependencias y archivos de javascript podemos realizar una optimización para conseguir que haya menos archivos y tengan menor tamaño. Esta optimización hará que la aplicación web realice menos peticiones al servidor y necesite transferir menos bytes dando como resultado una aplicación más rápida.

Para conseguir esta optimización necesitamos tener instalado la herramienta node.js y descargar el javascript que realizará la optimización, r.js. En Arch Linux instalar node.js consiste en instalar su paquete con:

Teniendo instalado node.js y habiendo descargado r.js el proceso consiste en ejecutar un comando desde la terminal. Este es:

El contenido del archivo build.js contendrá alguna información como el archivo de salida y la localización del módulo principal de la aplicación, básicamente la configuración es:

Este sería el resultado de optimizar el ejemplo de introducción sobre RequireJS. En el resultado se han eliminado los espacios y tabuladores, los diferentes archivos se han fusionado en uno solo (en este caso únicamente figuras.js y main.js) y los nombres de las variables se han acortado, esto reduce el tamaño del Javascript final. Esta optimización sirve también en cierta forma como ofuscación del código si queremos dificultar a alguien (como a la competencia de un producto) se aproveche del código que hemos desarrollado:


Al optimizar los archivos es recomendable ver las notas que indican en la documentación de RequireJS.

Si se quiere optimizar archivos individuales de javascript o no usamos RequireJS se puede utilizar la herramienta Closure Compiler, es muy sencilla, no hace falta instalar nada en nuestro equipo sino simplemente usar el servicio y da un resumen de la optimización que realiza.

Referencia:
Código fuente completo de este ejemplo de RequireJS
Introducción y ejemplo de RequireJS
Introducción y ejemplo de Mustache
Logging en Javascript con log4javascript
Capturar errores de Javascript
Author: "__OVERFLOW__" Tags: "Programación, JavaScript, planeta códi..."
Send by mail Print  Save  Delicious 
Date: Thursday, 11 Apr 2013 17:12
Ruby Meetups

Ruby Meetups

El martes pasado tuvimos el Meetup de Ruby de Abril. Todos los meses nos juntamos -el segundo martes de cada mes- a conocernos, hablar de programación, Ruby, herramientas y demás.

Esta reunión fue bastante interesante. Hubo gente nueva que se sumó, y un comentario general que oí varias veces es que la comunidad local formada entorno a Ruby está buena y dan ganas de formar parte. Por ese lado creo que estamos haciendo un buen trabajo al destacar una de las características más importantes del lenguaje de programación Ruby: La comunidad.

No hubieron charlas preparadas como otras veces, así que improvisamos, lo que resultó en un intercambio excelente. En principio comentamos un poco sobre Heroku, qué es, para qué sirve, etc. Los temas de conversación se iban llevando segun preguntas o comentarios de los asistentes.

No tuvimos “oradores” definidos, mas bien “mostramos cosas”. Yo mostré ghpreview, una gema para tener un preview de archivos Markdown usando el formato exacto de GitHub. La idea fue alentar a la gente a colaborar con proyectos Open Source, mostrando lo fácil que fue modificar la gema ni bien salió para que funcionara en GNU/Linux. Hace un tiempo escribí un poco más al respecto (en inglés) en el blog de Neo.

Entre medio hablamos un poco el funcionamiento de GitHub, hicimos una demostración de cómo funcionan los Pull Requests (facilitando enormemente la colaboración entre desarrolladores), y alguna cosa más.

En eso llegó la pizza y comimos un poco, siempre acompañados de bebidas varias, e intercambiamos opiniones, conocimos gente nueva, y todo lo bueno de socializar en un evento de este tipo. Programadores: recuerden que es importante asistir a eventos técnicos de este tipo.

Ya con el estómago lleno, Martín Loy conectó su laptop al proyector y se animó a hacer una sesión de live coding espontánea. Su objetivo fue mostrar lo fácil que es entrarle a cosas nuevas en Ruby. Había escuchado hablar mucho de Sinatra, pero nunca lo había usado. Así que siguió el tutorial del sitio de Sinatra y mostró la fácil que es armar una aplicación web con Sinatra.

Otro tema que se discutió fue sobre los gemsets y RVM contra RBenv. Respecto a eso, justo hoy vi este artículo de Thoughtbot:
Using rbenv to manage rubies and gems
Puede ayudar en el debate :)

A modo de conclusión, personalmente estoy muy contento de cómo se vienen llevando estas reuniones. Está bueno saber que al menos una vez por mes nos juntamos con gente de otras empresas / ámbitos a compartir un rato de Ruby. Para el mes que viene aparentemente vamos a tener algunas charlas preparadas sobre bloques, lambdas y Procs en Ruby y alguna cosa más.

Recuerden que no es necesario saber Ruby para asistir. La idea es difundir un poco lo bueno de Ruby y cómo lo usamos, así que si usan otras tecnologías a diario, es una buena oportunidad para conocer un poco qué se hace con Ruby. Estén atentos al sitio de Ruby Meetups e inscríbanse si les interesa estar al tanto de las novedades.

Ruby Meetup - foto por @neo_uy

Ruby Meetup – foto por @neo_uy

Author: "fernando" Tags: "Ruby, Eventos, Ruby Meetup"
Send by mail Print  Save  Delicious 
Date: Wednesday, 10 Apr 2013 05:52
Hace algunos días surgió una conversación en la que varias personas se sorprendían porque siguiera usando el lenguaje Pascal en estos días. Me pareció lo suficientemente interesante como para reflexionar sobre ello, y publicarlo aquí, ya que en lo que a mi respecta, Pascal es un lenguaje que nunca me ha gustado demasiado, que que [...]
Author: "Javier Gutiérrez Chamorro (Guti)" Tags: "Programación, personal, Informática, R..."
Send by mail Print  Save  Delicious 
Date: Tuesday, 09 Apr 2013 07:15
SignalR
SignalR permite controlar el acceso a los métodos del interior los Hubs de una forma muy similar a como hacemos en ASP.NET MVC o WebAPI.

Y cuando digo muy similar no estoy exagerando en absoluto, como podéis observar en el siguiente código:

[Authorize]
public class AlertService : Hub
{
    public void Alert(string msg)
    {
        this.Clients.All.showAlert(msg);
    }
}
imagePues sí, también tenemos disponible aquí el atributo [Authorize]. O mejor dicho, otro atributo [Authorize]. Cuidado con esto, porque en un proyecto MVC4 con WebAPI y SignalR tendremos a nuestra disposición tres atributos con el mismo nombre, y si seleccionamos el namespace incorrecto será ignorado por completo, dejando libre el acceso al recurso que se intenta proteger.

¿Recordáis el famoso infierno de las DLL de antaño? Pues no va a ser nada comparado con el namespace hell que se está cociendo ;-D

Bueno, la cuestión es que aplicando este atributo a un Hub de la forma mostrada anteriormente impediremos el acceso a sus métodos a clientes que no hayan sido autenticados en el sistema. Si únicamente queremos efectuar este control en métodos concretos, bastará con decorarlos con [Authorize] de forma individualizada:
public class AlertService: Hub
{
    [Authorize]
    public void Alert(string msg)
    {
        this.Clients.All.showAlert(msg);
    }

    // Other hub methods
}
A la hora de introducir el atributo podemos ser aún más explícitos. Así, es posible permitir el acceso a un Hub o método a uno o varios usuarios separando su nombre por comas:
[Authorize(Users="fmercury,mjackson,fsinatra")]
public void Sing(string msg)
{
    // ...
}
O también podemos hacerlo por roles dentro del sistema:
[Authorize(Roles= "greatsingers")]
public void Sing(string msg)
{
    // ...
}
Por último, comentar que a diferencia de los homónimos atributos usados en MVC y WebAPI, este nuevo Authorize dispone de un parámetro booleano adicional llamado RequireOutGoing que si establecemos a falso hará que las peticiones al método afectado sean ejecutadas sin necesidad de autenticación.

Publicado en Variable not found.
Author: "José M. Aguilar" Tags: "Desarrollo, Trucos, signalr"
Send by mail Print  Save  Delicious 
Date: Monday, 08 Apr 2013 14:04

Video presentación de Desarrollando América Latina 2012, les recomiendo verlo para que se hagan una idea de qué se trata la hackatón, y les inspire participar en la edición 2013 :)

Se muestran organizadores, segmentos de la hackatón y ganadores de todos los países participantes de la pasada edición:

Más info del evento en:

 

Author: "fernando" Tags: "Eventos, Datos Abiertos, Desarrollando A..."
Send by mail Print  Save  Delicious 
Date: Monday, 08 Apr 2013 07:10
Enlaces interesantesEstos son los enlaces que he ido recopilando recopilados del 1 al 5 de abril de 2013. Espero que os resulten interesantes :-)

Eventos

.Net

Asp.net

Data access

Html/Css/Javascript

Visual Studio/Complementos/Herramientas

Windows 8/WinRT/WP

Otros

Y no olvidéis que podéis seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.

Publicado en Variable not found
Author: "José M. Aguilar" Tags: "enlaces"
Send by mail Print  Save  Delicious 
Date: Monday, 08 Apr 2013 05:06

En los últimos años estamos viviendo un auge muy fuerte de Javascript, pasando de ser un lenguaje para hacer pequeñas manipulaciones en páginas web a ser una alternativa real para desarrollar aplicaciones de muy diversa índole.

Con el avance de smartphones y tablets, la necesidad de tener aplicaciones multiplataforma se hace cada vez mayor, y aprovechar para ello HTML5/JS/CSS3 es una alternativa habitual, lo que lleva a que al final casi todos acabemos expuestos de una forma a otra a Javascript.

Para algunos Javascript es un lenguaje feo, mal diseñado y lleno de comportamientos inconsistentes o, al menos, poco previsibles. Para otros es un lenguaje cómodo, flexible, con un buen equilibrio entre complejidad y potencia.

Sin entrar a valorar esos aspectos que pueden ser bastante subjetivos, creo que es una lástima que a veces nos olvidemos de todo lo que nos ha dado Javascript.

¿Qué ha hecho Javascript por nosotros?

Aunque nos empeñemos en ver sólo el código fuente y juzgarlo en base a eso, ni siquiera los mayores detractores de Javascript pueden negar su aportación al estado actual de la tecnología.

Javascript ha sido el gran habilitador de la nueva web. Una web en la que no sólo se consumen contenidos, sino que también se crean. Una web que es algo más que un repositorio de información, una web en la que existen auténticas aplicaciones que mejoran nuestra productividad.

Todas las plataformas cuentan con navegadores lo bastante avanzados como para ejecutar código Javascript moderno a una velocidad aceptable. En este sentido podríamos decir que ha tomado el relevo de Java y su JVM que nunca llegó a cuajar para aplicaciones de escritorio, aunque ahora esas antiguas aplicaciones de escritorio se hayan reencarnado como aplicaciones web.

Además se ha convertido en la lengua franca de internet. Tener disponible en cada sistema operativo una plataforma capaz de renderizar HTML y ejecutar código Javascript, ha hecho que aparezcan lenguajes de distintas características que pueden ser compilados a Javascript, permitiéndonos aprovechar automáticamente la ubicuidad del entorno de ejecución.

En lugar de tener que aprender un lenguaje de programación y unas librerías UI para cada plataforma, Javascript permite manejar los mismos conceptos en todas las plataformas; obviamente no ofrece todas las posibilidades que las alternativas nativas, pero no deja de ser una opción viable para muchos tipos de aplicaciones.

Lo mejor que ha hecho Javascript

Todos los motivos anteriores están muy bien, pero creo que ha hecho algo aún más importante en el mundo del desarrollo de software.

Somos muchos los que vivimos gran parte del tiempo en lenguajes como C# o Java, con su orientación a objetos, su tipado estático, sus completas librerías y sus potentes entornos de desarrollo, y tener que tratar con Javascript nos ha obligado a replantearnos ciertas cosas.

Tratar con un sistema de tipos dinámicos. No tener una única forma de hacer las cosas. Sustituir frameworks que tratan de cubrir todas tus necesidades por librerías ligeras y específicas. Tener que elegir tus propias herramientas en lugar de usar el entorno de desarrollo que decide un fabricante.

Son cosas que hace unos años la mayoría de programadores en .NET ni siquiera se planteaban, pero que poco a poco van calando en la comunidad de desarrollo y permite establecer un sano debate sobre la mejor forma de hacer cada cosa.

En realidad, estas características no son exclusivas de la filosofía de desarrollo de Javascript, muchas de ellas son compartidas por otros lenguajes como Ruby o Python. De hecho hay ideas que se ven hoy en día como algo natural en .NET que se popularizaron en esos entornos, como por ejemplo el uso de convenciones en lugar de configuración.

La diferencia es que el desarrollador habitual de .NET no necesitaba estar en contacto con esas plataformas, podía esperar a que alguien adaptase esas ideas a .NET (Castle MonoRail, Nancy) y limitarse a usarlas “desde este lado” sin llegar a comprender todo lo que había detrás de ellas.

Javascript es algo que te encuentras día a día y no queda más remedio que remangarse y tratar con él directamente. Aunque existan cosas como TypeScript, de momento su ecosistema es muy limitado y no puedes esconderte de Javascript.

Lo mejor de Javascript es que nos ha obligado a conocer otra forma de hacer las cosas.

No pretendo decir con todo esto que Javascript sea una maravilla, ni que los lenguajes dinámicos sean mejores que los estáticos, ni que haya que usar herramientas de línea de comandos y editores de texto en lugar de IDEs.

Lo importante es conocer alternativas que nos permitan evaluar mejor nuestras herramientas habituales y nos ayuden a tomar mejores decisiones. Da igual si al final vuelves al Visual Studio y C# convencido de que son las mejores herramientas del mundo, lo que importa es que ahora sabes que no son las únicas herramientas del mundo.

Posts relacionados:

  1. Echo de menos la BCL: formato y parsing de fechas en Javascript
  2. Mixins en Javascript
Author: "Juanma" Tags: "JavaScript, opinion, rant, development, ..."
Send by mail Print  Save  Delicious 
Date: Friday, 05 Apr 2013 15:44
Tener un sistema de logging para el código Javascript de una página está muy bien para depurar el código cuando las cosas van mal en el sentido de que no hacen o no se comportan como se espera. Pero a veces las cosas pueden ir peor que mal, esto es, si hay algún error de «compilación» en en código de javascript el navegador detiene la ejecución y por tanto dejan de emitirse las trazas. Si el error nos sucede en el entorno de desarrollo o pruebas en nuestro propio navegador nos daremos cuenta del error pero en un entorno de producción no ya que el código se ejecuta en el navegador del usuario.

Sin embargo, no todo está perdido, los navegadores proporcionan como último recurso la función «window.onerror» que será llamada cuando se detecte un error de compilación o ejecución que impida continuar ejecutando el código javascript. Lo que podremos hacer para tratar el error será limitado pero al menos con log4javascript podremos enviar al servidor ese mensaje para que podamos primeramente conocer que se está produciendo y luego resolverlo, de otra manera nos sería desconocido ya que el código javascript se ejecuta en un entorno al que no tenemos acceso, en el navegador del usuario.

En el siguiente ejemplo mostraré como enviar al servidor esos errores de javascript que se produzcan. Para conseguirlo usaremos una combinación de la librería log4javascript comantada en la entrada anterior y la función window.onerror. A continuación el contenido de una página con el contenido completo usando RequireJS:

En la siguiente imagen se puede ver la petición que hace log4javascript para enviar el error al servidor.


Aparte de la propia traza del error que envía log4javascript (aunque en la imagen anterior no es muy descriptiva) podemos obtener otra información relacionada con la petición http que se realiza como el navegador en el que se ha producido, sistema operativo y versiones de ambos aparte de cookies si las hubiese o la dirección IP. En esa URL deberemos tener algo que atienda la petición y saque a los logs del servidor el mensaje enviado. En caso de usar Java probablemente hagamos uso de un servlet, u otra cosa en función del framework web que usemos, y utilizaremos slf4j, log4j o logback para sacarlo al registro de trazas del servidor. El código completo de este ejemplo está alojado en mi repositorio de GitHub.

Referencia:
Introducción y ejemplo de RequireJS
Introducción y ejemplo de Mustache
Logging en Javascript con log4javascript
Author: "__OVERFLOW__" Tags: "Programación, JavaScript, Java, JAVA, p..."
Send by mail Print  Save  Delicious 
Date: Thursday, 04 Apr 2013 05:06

Compartir una carpeta con IIS para que esté accesible a través de una página web es algo sencillo y útil en determinadas ocasiones: basta con crear una carpeta virtual y habilitar el listado de directorios.

Lo malo es que IIS no nos ofrece muchas opciones para personalizar el formato del listado. Después de buscar un rato en Google no encontré ninguna alternativa que me convenciese, así que en 5 minutos me monté una solución casera.

El código importa, pero el contexto más

Para hacer esto no voy a usar node, ni compojure, ni rails, ni, dios me libre, PHP. Todos los IIS que tengo cerca tienen instalado .NET así que lo más lógico es usarlo y no tener que instalar nada más.

Además, no todos tienen la última versión, por lo que usar Razor queda descartado y eso nos lleva a WebForms (!).

Si le unimos que no quiero tener que abrir el Visual Studio para compilar nada y no me quiero complicar la vida desplegando más ficheros de lo necesario, llegamos a un código feo donde se mezcla todo.

De todas formas, por si ha alguien le sirve, aquí lo dejo.

El resultado

Para usarlo, sólo hace falta guardar el siguiente código como Default.aspx en la carpeta que queramos exponer vía web, convertir la carpeta virtual en una aplicación y permitir la ejecución de comandos.

OJO: esto es código de andar por casa, no hay control de errores, no está muy probado, … si lo quieres usar, allá tú.

<%@ Page Language="C#" AutoEventWireup="true"%>
<%@ Import Namespace="System.IO" %>



<%
    string workingFolder = Server.MapPath("~");
    string folder = string.IsNullOrEmpty(Request.Params["folder"]) 
                    ? workingFolder 
                    : Request.Params["folder"];

    if (!folder.StartsWith(workingFolder))
        throw new UnauthorizedAccessException(
            string.Format("Cannot access folder outside {0}", workingFolder));

    DirectoryInfo directory = new DirectoryInfo(folder);
%>
    
    <%=directory.Name %>
    
    * {
        font-family: Segoe UI, Tahoma, Verdana;
        font-size: 18px;
        color: #333;
    }
    body {
        margin: 25px auto;
        max-width: 960px;
    }
    h1 {
        font-size: 24px;
        padding-bottom: 12px;
        border-bottom: solid 1px #cecece;
    }
    ul {
        list-style: none;
        padding: 0px;
    }
    a {
        color: #000;
        text-decoration: none;
        border-bottom: 1px dotted #aaa;
    }
    a:visited {
        color: #aaa;
    }
    a:hover {
        border-bottom: 1px solid #000;
    }
    


    

<%=directory.FullName%>

Posts relacionados:

  1. IHandlerSelector'>Usando convenciones para mejorar IHandlerSelector
Author: "Juanma" Tags: "C#, development, iis, aspnet"
Send by mail Print  Save  Delicious 
Date: Wednesday, 03 Apr 2013 07:15
ASP.NETLa nueva versión de System.Web.Optimization traerá (aún está en beta) algunas novedades interesantes al sistema de bundling que se incluye de serie en los proyectos ASP.NET MVC y se distribuye a través de Nuget en el paquete Microsoft.AspNet.Web.Optimization.

En particular, vamos a centrarnos en una característica muy práctica si queremos utilizar una Content Delivery Network (CDN) externa (como la de Microsoft, Google o incluso una propia) para delegar a ella la carga de bibliotecas de script comunes, pero queremos a la vez proporcionar una alternativa local por si acaso ésta fallase debido a cualquier motivo.

1. La situación actual

El sistema de bundling ya nos permitía, al mismo tiempo que definíamos los bundles, especificar la dirección en la CDN a través de la cual el archivo podía ser obtenido. Esto lo hacíamos justo en el momento de la creación del bundle:
bundles.Add(new ScriptBundle(
        "~http://www.planetacodigo.com/bundles/jquery", // Bundle virtual path
        "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js" // CDN Path
    )
    .Include("~/Scripts/jquery-{version}.js"));
Este bundle podemos referenciarlo desde la vista usando la dirección virtual asignada como sigue:
      ...
      @Scripts.Render("~http://www.planetacodigo.com/bundles/jquery")
   </body>
</html>
El código resultante de esta llamada depende del valor establecido en la propiedad booleana BundleTable.Bundles.UseCdn . Si contiene false, el valor por defecto, el tag <script> generado apunta a la dirección del servidor local a través de la cual es posible descargar el archivo comprimido:
<script src="http://www.planetacodigo.comhttp://www.planetacodigo.com/bundles/jquery?v=UgyEMAYOuSB9Bb6HcOEVHpd6fIIp54yF086SRNVcdIY1"></script>
En cambio, si el valor de BundleTable.Bundles.UseCdn es true, la URL que aparecerá en el tag es la indicada como dirección del archivo en el CDN:
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js"></script>

2. Las novedades

Lo anterior está bien pero, aunque puede resultar válido en muchos escenarios, hay casos en los que es claramente insuficiente y tenemos que hacer algunos apaños para que todo vaya bien. Sólo tenéis que imaginar que estamos desarrollando una aplicación con esas referencias en un ordenador sin internet…

Pues para evitarnos trabajo, la nueva versión de System.Web.Optimization incluye un mecanismo automático de fallback que nos permite detectar cuándo ha habido problemas descargando nuestra biblioteca desde el CDN, y, en este caso, cargar el bundle local de forma automática.

La forma de conseguirlo es idéntica a la de antes: definimos un bundle de un archivo especificando la dirección de la URL para obtenerlo desde la CDN, e indicamos en él una expresión de fallback, es decir, una expresión que será evaluada en tiempo de script y que debe determinar si la biblioteca ha sido cargada con éxito. Por ejemplo, para saber si jQuery ha sido cargado con éxito sólo hay que observar si hay un objeto en window.jQuery, ¿verdad? Pues esa sería la expresión de fallback.

El siguiente ejemplo muestra cómo deberíamos crear el bundle y añadirlo a la tabla de bundles del sistema especificando la expresión de comprobación:
var jquery = new ScriptBundle(
        "~http://www.planetacodigo.com/bundles/jquery", // Bundle virtual path
        "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js" // CDN Path
    )
    .Include("~/Scripts/jquery-{version}.js");

jquery.CdnFallbackExpression = "window.jQuery";
BundleTable.Bundles.Add(jquery);
Una vez referenciado en la vista, el código de marcado generado será el siguiente:
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js"></script>
<script>(window.jQuery)||document.write('<script src="http://www.planetacodigo.com/bundles/jquery"><\/script>');</script>
Observad que lo único que se hace es introducir un bloque de script justo después de la referencia al CDN en el que se evalúa la expresión de fallback y, si no se cumple, se genera sobre la página una nueva referencia al bundle local. Si queréis comprobar su funcionamiento, sólo tenéis que introducir una dirección incorrecta en la URL al CDN, y veréis cómo se utiliza el archivo local.

Por último, indicar que podéis probar estas cosas descargando desde Nuget la versión prerelease del paquete. Ah, y recordad que para que el bundling funcione correctamente es necesario desactivar el modo depuración en el web.config, o bien habilitar manualmente este mecanismo introduciendo la siguiente asignación en algún punto de la inicialización de la aplicación:
BundleTable.EnableOptimizations = true;
En definitiva, es algo que ya podíamos solucionar desde la primera versión de forma manual, pero que ahora lo tendremos más fácil al venir integrado en el producto :-)

Publicado en Variable not found.
Author: "José M. Aguilar" Tags: "Trucos, ASP.NET, optimización, novedade..."
Send by mail Print  Save  Delicious 
Date: Tuesday, 02 Apr 2013 07:15
Enlaces interesantesEstos son algunos enlaces recopilados la semana pasada, especialmente corta por los festivos. Espero que os resulten interesantes :-)

Asp.net

Conceptos/Patrones/Buenas prácticas

Data access

Html/Css/Javascript

Visual Studio/Complementos/Herramientas

Otros

Y no olvidéis que normalmente podéis seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.

Publicado en Variable not found
Author: "José M. Aguilar" Tags: "enlaces"
Send by mail Print  Save  Delicious 
Date: Monday, 01 Apr 2013 13:34
A cambiar el mundo

A cambiar el mundo

Una de las “actividades” surgidas de RubyConf Uruguay vino de la mano de Alan Cyment y Pablo Tortorella. Conocía a Alan porque fue uno de los coach en el curso de Scrum Master que hice en 2009. Pablo también es Agile Coach en Kleer, una de las empresas que sponsorearon la RubyConf, y el autor de esta obra de arte sobre RubyConf :)

Durante una lightning talk, Alan y Pablo plantearon cambiar el mundo en 5 minutos. Para esto, cada asistente debía encontrar un “compañero de ruta” que lo ayudara a cumplir ciertos objetivos que cambiarían el mundo.

En unos minutos había que definir algunas metas a futuro, basado en la experiencia de la conferencia. La primera para el lunes siguiente, la segunda para dentro de 2 semanas y la tercera para el 23 de setiembre (6 meses).

Mi primer objetivo para el lunes siguiente fue aplicar las medidas de seguridad de las que habló Bryan Helmkamp de Code Climate en su charla. Bryan habló sobre seguridad en aplicaciones Rails.

La herramienta que empecé a usar gracias a su charla es Brakeman, un analizador estático de seguridad para Rails. Instalarlo es bastante sencillo:

gem install brakeman

o podemos agregarlo a un Gemfile:

gem "brakeman", :require => false

Brakeman

Brakeman

Para usarlo podemos ir al directorio de nuestra aplicación Rails y ejecutar el comando brakeman o llamarlo desde cualquier directorio con un path brakeman ~/code/rails_blog. Tenemos varias opciones como mandar el resultado de brakeman a un archivo, con distintos formatos: texto, html, tabs y csv. Pueden leer más en la documentación de brakeman.

Entonces usé por primera vez esta gema, y la agrego a mi “cinturón de herramientas” para Rails. Por suerte no encontré problemas mayores de seguridad en el proyecto en cuestión. De todas formas empezamos a usar Code Climate en este proyecto, y tenemos una nueva característica: Security Monitor, que nos avisa de riesgos de seguridad.

La participación de Alan, Pablo y Bryan en RubyConf Uruguay, en mi caso, ya rindió frutos. Excelentes personas que aportaron su grano de arena para que fuera una conferencia espectacular :)

Primer objetivo cumplido, el siguiente debería estar pronto para el lunes de la semana que viene, pero es un poco más ambicioso y todavía no empecé: Probar varias (y usar en algunos proyectos) de las gemas que comentó Soveran en su charla “sorpresa”, probar Padrino, probar mi código Ruby en JRuby y hacer deploy de alguna aplicación en Torquebox para conocer un poco de qué va la mano. Ampliaremos…

Author: "fernando" Tags: "Ruby, rails, Seguridad"
Send by mail Print  Save  Delicious 
Date: Monday, 01 Apr 2013 05:06

Hace poco terminaba el pequeño tutorial sobre compojure que he estado escribiendo y que me ha servido para hacerme una idea de cómo se desenvuelve un lenguaje funcional en aplicaciones “normales”.

Es cierto que he dejado sin cubrir partes importantes y necesarias en la mayoría de aplicaciones, como es el acceso a bases de datos (SQL o NoSQL), la autenticación y autorización, test unitarios, etc., pero creo que tengo la base suficiente como para empezar a buscar y valorar soluciones a cada uno de esos problemas por separado cuando llegue el momento.

Pese a esos aspectos que quedan en el aire, ha llegado la hora de hacer balance sobre lo que supone usar clojure para el desarrollo de aplicaciones web.

Las partes buenas

Sin duda, lo que más me ha gustado es la simplicidad y naturalidad con que encaja todo.

Para poder trabajar con compojure no hace falta comprender un montón de abstracciones y conceptos nuevos. Al final todo se reduce a definir funciones que reciben maps con las peticiones y devuelven maps con las respuestas.

Aquí además se nota mucho el uso de estructuras de datos sin esquema tan frecuente en clojure. Esto, unido a las opciones de desestructurado de clojure hace que sea muy sencillo obtener los datos que necesitamos de las peticiones para generar las respuestas.

Al trabajar con algo tan básico como funciones y maps, si necesitamos algo nuevo sólo necesitamos decorar nuestras funciones con middlewares como veíamos en el caso de recibir datos con JSON.

Esto además permite tratar todo de una forma mucho más homogénea si lo comparamos, por ejemplo, con ASP.NET MVC, donde el pipeline de proceso de peticiones es más complejo y debemos distinguir entre cosas como ActionFilters, HttpHandlers, Controllers, ModelBinders, ValueProviders, Results, etc., a la hora de decidir cómo implementar algo.

Otro aspecto que me ha gustado mucho es la forma en que se genera HTML usando Hiccup. Poder generar HTML usando el mismo lenguaje en el que estamos programando la aplicación hace que muchos de los problemas que hay que resolver con otros sistemas de plantillas directamente no existan en Hiccup.

Por ejemplo, el uso de controles/helpers para encapsular HTML es algo que se resuelve sencillamente creando una función que devuelva el HTML que necesitamos. Algo similar pasa con los layouts, no hace falta recurrir a nuevas abstracciones para resolver el problema porque estamos usando el mismo lenguaje en el que desarrollamos, por lo que las mismas técnicas que se usan para reutilizar código, las podemos aplicar en la generación de HTML.

Lo más parecido que he visto en C# son fluent builders para generar el HTML, pero aunque tienen la ventaja de tener tipado estático (y todo lo que ello conlleva a nivel de tooling), la sintaxis de C# mete demasiado ruido y acaban siendo poco legibles.

Las partes menos buenas

Nada es perfecto y hay algunas cosas que me han parecido más incómodas, algunas de ellas genéricas de clojure y otras específicas de algunas de las librerías que he usado.

Por una parte, la sintaxis hay veces que se hace un poco cuesta arriba. La simplicidad de conceptos que mencionaba antes tiene un coste: todo son funciones, todo son paréntesis. A veces se hace complicado seguir qué va dentro de qué, especialmente cuando se construyen estructuras complejas como las que se usan para generar HTML desde Hiccup.

Parte de esto se puede solucionar mediante tooling, pero tampoco es fácil. Parece que la forma canónica de escribir clojure es usando emacs y alguno de los cientos de configuraciones personalizadas para clojure, pero la verdad es que aprender a manejar emacs no es cosa de dos días y cuesta acostumbrarse, y no sólo por el paso de un IDE tipo Visual Studio a un editor más ligero, sino porque la filosofía de trabajo es bastante distinta.

Hiccup está muy bien y supone un cambio en la forma de pensar en la generación de HTML, pero si pretendes que te lo genere alguien que sepa diseñar páginas bonitas, se va a volver loco. De todas formas, que esto sea grave depende de cómo trabajes. La mayoría de las veces que he trabajado con diseñadores, no tenían acceso al código fuente y trabajaban “por libre”. Nos daban HTML y nosotros nos encargábamos de generarlo usando WebForms, Razor, o lo que tocase, por lo que puede que este punto no sería crítico.

En general, la documentación es un poco escasa y gran parte está repartida en posts e hilos de discusión desactualizados (como seguramente estarán estos posts dentro de unos meses). La parte positiva es que el código fuente tanto de compojure como de hiccup es bastante fácil de seguir, incluso aunque no seas un experto en clojure, como es mi caso.

Conclusiones

Desde mi época de estudiante siempre me ha atraído la programación funcional, pero nunca había intentado ponerla dentro de un contexto actual. Siempre la había percibido como algo académico y teórico, más enfocado a la experimentación y solución de problemas más “algorítmicos” que al mundo real.

Cuando desarrollo con C# hago bastante uso de las características funcionales del lenguaje (que no están mal), pero no dejo de estar en un entorno orientado a objetos con pinceladas funcionales. Al final lo que mandan son los objetos y la estructura de la aplicación está dictada por ellos.

Desarrollar la mini aplicación web del tutorial de compojure me ha permitido comprobar que realmente se puede llegar muy lejos con un lenguaje funcional en aplicaciones cotidianas. Me ha encantado la naturalidad y simplicidad con que se resuelven algunos problemas, sin necesidad de construir capas y capas de abstracción.

No hay posts relacionados.

Author: "Juanma" Tags: "Clojure, development, compojure"
Send by mail Print  Save  Delicious 
Date: Friday, 29 Mar 2013 11:55

Buenos días,

Nuestro distribuidor y gran amigo René Flores organiza una vez más un gran encuentro de usuarios de Xailer en Cancún, en el cual tendré el placer de poder presentar nuestra nueva versión de Xailer 3 y durante tres días revisaremos todas sus novedades, analizaremos los cambios que supone esta nueva versión, como afectará a sus propias aplicaciones y sobre todo veremos programación avanzada con Xailer. Desde la creación de controles de usuario, plantillas y asistentes, programación en la nube con WebDatasource, comunicaciones asíncronas y SQL avanzado. No obstante, me encantará oir vuestras sugerencias e incluirlas igualmente.

El sitio, Cancún, y el hotel, no puede ser mejores. Os animo a que vengáis. Lo pasaremos bien y además será muy productivo. Más información en el siguiente enlace:

http://www.blogger.com/comment.g?blogID=11070235&postID=5783582622724051840&page=0&token=1364556968242

Hasta pronto.

Author: "Ignacio OZ" Tags: "Noticias"
Send by mail Print  Save  Delicious 
Date: Thursday, 28 Mar 2013 11:38
log4javascript
En esta serie de artículos que estoy escribiendo sobre varias librerías y herramientas relacionadas con el lenguaje de programación Javascript como RequireJS, Mustache y Backbone en esta ocasión voy a hablar de una librería de logging para javascript que también puede hacernos la vida más sencilla como programadores.

Sistemas de trazas hay muchos para Java y otros muchos lenguajes pero en el entorno de las aplicaciones web estos suelen usarse en la parte del servidor de las aplicaciones. Sin embargo, en el cliente también puede producirse errores y nos puede interesar tener información para averiguar la causa de forma que podamos solucionarlos más rápidamente o simplemente para tener un registro de lo que se ha ido haciendo en este caso en el cliente. Una librería de logging en el cliente también nos puede servir para tener información de errores en el navegador que de otra forma nos pasarían desapercibidos si solo tenemos trazas en el servidor, con la librería de trazas que explicaré en esta entrada podemos enviar las trazas de error al servidor de forma muy sencilla. Además, nos puede servir de utilidad en el momento de desarrollo del código javascript.

Por los motivos anteriores aunque no lo consideremos imprescindible nos puede resultar muy interesante la librería log4javascript. Los conceptos que emplea son muy parecidos a log4j con lo que si programamos en java aprenderemos fácil y rápidamente a usarla, en cualquier otro caso no nos llevará mucho tiempo aprender.

Lo primero que deberemos hacer es descargarla y una vez descomprimido el paquete incluirla en el código html de nuestra página con, haciendo uso de RequireJS:

Posteriormente deberemos usarla definiendo los appenders que determinarán a donde se envían las trazas, a los appenders les asociaremos un layout que determinará el formato de la traza y el nivel mínimo que ha de tener la traza («threshold») para ser emitido. log4javascript proporciona varios appenders según nuestras preferencias o necesidades:
  • AlertAppender: muestra las trazas usando la función alert del navegador.
  • AjaxAppender: realiza una petición ajax al servidor enviando la traza generada en el navegador, con este appender podremos tener el registro de lo que sucede en los clientes. Se ha de indicar el path de la URL que procesará las trazas en el servidor.
  • PopUpAppender: muestra las trazas en una ventana emergente en la que se pueden filtrar las trazas y en la que cada nivel aparece con un color distinto para reconocerlas más fácilmente.
  • InPageAppender: muestra la misma consola del PopUpAppender pero de forma incrustada en el pie de la página.
  • BrowserConsoleAppender: muestra los mensajes en la consola de depuración con los mensajes de javascript que incorporan los navegadores.
Con el siguiente bloque de código inicializamos el sistema de trazas, la variable log4j será la que utilicemos para emitir las trazas. En el ejemplo utilizamos el appender PopUpAppender con un layout que nos mostrará la hora, el nivel de la traza y el mensaje, el threshold del PopUpAppender es INFO con lo que todo mensaje con nivel menor prioridad como TRACE o DEBUG no aparecerán en el appender, para el caso de AjaxAppender el threshold será ERROR de modo que tampoco aparecerán en el las trazas INFO y WARN. Al emitir las trazas indicamos el mensaje más adecuado que consideremos más nos pueda ayudar y con el nivel de trazas según la importancia que tenga el mensaje, este nivel de trazas nos permitirá filtrarlos según su nivel en el popup:

El resultado que obtenemos en la consola emergente es el siguiente, los mensajes de nivel de trace y debug no aparecen por el threshold del appender PopupAppender.


Como los ejemplos de RequireJS y Mustache el código fuente completo lo puedes encontrar en mi repositorio de GitHib.

Referencia:
Introducción y ejemplo de RequireJS
Introducción y ejemplo de Mustache
Capturar errores de Javascript
Author: "__OVERFLOW__" Tags: "Programación, JavaScript, planeta códi..."
Send by mail Print  Save  Delicious 
Date: Monday, 25 Mar 2013 15:09

familiaBruce Feiler propuso Scrum y los principios de la gestión ágil en la charla que dió el mes pasado en el TEDSalon de Nueva York como solución a los problemas habituales de las familias.

Algunas de las cosas que dijo

"En los últimos 50 años se ha revolucionado el concepto familia. Ahora hay familias reconstruidas, separadas, monoparentales... Familias nucleares que viven en casas separadas y familias divorciadas que viven en la misma casa ... 

...Casi todo el mundo está abrumado por el caos de su vida familiar. Todos los padres, yo incluido, sentimos que estamos continuamente jugando a la defensiva. En cuanto les salen los primeros dientes, empiezan las primeras rabietas... 

... Nuestros hijos sienten que estamos fuera de control. Ellen Galinsky preguntó a 1.000 niños de instituto qué desearían de sus padres. Los padres predijeron que la respuesta sería que pudieran pasar más tiempo con ellos. Estaban equivocados. Los niños dijeron que querían que estuvieran menos cansados y menos estresados..
¿Cómo podemos cambiar esta dinámica? ...

... Vivíamos en total caos, dijo Eleanor. Lo que hizo a continuación Starrs, fue sorprendente. En lugar de recurrir a amigos o familiares, recurrieron al modelo de gestión de vanguardia surgido en las startups japonesas y que se estaba propagando por Silicon Valley: 'desarrollo ágil'. En el desarrollo ágil los trabajadores se organizan en pequeños grupos y hacen las cosas en lapsos de tiempo muy corto. En lugar de contar con directivos de grandes planes y proclamas, el equipo se autogestiona. Se logra una retroalimentación constante

.....

Propongo tres bases: Adaptación continua, apodere (empowerment) a sus hijos y cuente su historia (la misión y valores de su familia) ...

La charla completa en el vídeo TED ;-)

 

Author: "Juan Palacio" Tags: "Blog"
Send by mail Print  Save  Delicious 
Date: Monday, 25 Mar 2013 09:01
Enlaces interesantesEstos son los enlaces publicados en Variable not found en Facebook y Twitter del 18 al 22 de marzo de 2013.

Espero que os resulten interesantes :-)

.Net  

Asp.net

Azure / Cloud

Conceptos/Patrones/Buenas prácticas

Data access

Html/Css/Javascript

Windows 8/WinRT/WP

Otros

Y no olvidéis que podéis seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.

Publicado en Variable not found
Author: "José M. Aguilar" Tags: "enlaces"
Send by mail Print  Save  Delicious 
Date: Monday, 25 Mar 2013 05:06

No es la primera vez que hablo de mi relación de mi amor/odio con los lenguajes de scripting. Son algo que considero imprescindible para crear esas pequeñas herramientas que mejoran tu flujo de trabajo, pero que se me resisten especialmente.

También he dicho que cada vez me da más pereza utilizar IDEs pesados, sobre todo cuando estoy experimentando con un lenguaje o resolviendo tareas sencillas, y que me gusta la forma en que se trabaja con otros lenguajes, como es el caso de Clojure con leiningen.

Por eso cuando me enteré del proyecto de Glenn Block para poder utilizar C# como lenguaje de scripting sin depender de Visual Studio, me pareció que merecía la pena dedicar un rato a echarle un vistazo.

¿Qué es scriptcs?

Lo mejor para entender scriptcs es leer el post de Glenn Block en el que explica los motivos que le llevaron a empezar el proyecto.

La idea de scriptcs es poder aprovechar Roslyn para compilar scripts escritos en C# y NuGet como gestor de dependencias. Con eso conseguimos montar un combo entre scriptcs y NuGet similar al de node.js y npm.

Con NuGet podremos instalar los paquetes que vayamos a utilizar y scriptcs se encargará de compilar “al vuelo” y ejecutar los scripts que escribamos.

¿Cómo se usa?

OJO: este proyecto es MUY nuevo, por lo que seguramente dentro de poco todo esto esté obsoleto. La información actualizada siempre la podrás encontrar en la web de scriptcs.

Para empezar a utilizar scriptcs sólo hacen falta dos cosas:

Con esto ya podemos crear nuestro primer script. Creamos una carpeta y creamos dentro un fichero sample.csx:

using System;

Console.WriteLine("¡Soy un script simple!");

Como veis, no hay clases ni métodos (aunque se pueden añadir), sólo los using y el código. Ejecutarlo es muy sencillo:

scriptcs sample.csx

OJO: actualmente hay un bug en la rama master que hace que se genere un error si no hemos instalado ningún paquete con nuget y no existe la carpeta packages. Lo puedes evitar si creas a mano esa carpeta al mismo nivel que el script.

Si quieres añadir algún paquete, sólo tienes que instalarlo con nuget:

nuget install Nombre.Del.Paquete -o Packages

scriptcs lo detectará automáticamente y podrás usarlo desde tus scripts.

Un proyecto interesante

No es la primera vez que alguien intenta utilizar C# como lenguaje de scripting fuera del Visual Studio. Existen cosas como Snippet Compiler, CS-Script o incluso LINQPad. Usando System.CodeDom.Compiler es relativamente fácil hacer cosas similares (yo mismo hice algo parecido para Mono hace muchos años), pero la idea de usar Roslyn e integrarlo con NuGet abre muchas puertas.

Con Roslyn no estamos tan atados a la sintaxis habitual de C# y podemos adecuarla a un estilo más propio de lenguajes de scripting, y NuGet facilita mucho la gestión de dependencias sin necesidad de definir un archivo de proyecto en el Visual Studio.

La comunidad de desarrollo de C# está muy apegada a sus herramientas (es en lo que se ha centrado Microsoft siempre), por lo que esta filosofía de trabajo resultará extraña para muchos, pero en los últimos tiempos cada vez es más habitual trabajar con distintos lenguajes dentro de un mismo proyecto y acabar expuesto a otras formas de trabajo (estoy pensando fundamentalmente en node.js).

Tampoco creo que haya que verlo como algo excluyente, hay casos en que contar con todo un Visual Studio y sus múltiples utilidades de análisis estático, refactorización, gestión de proyectos, etc., es muy valioso, pero también es cierto que otras veces resulta excesivo.

En cualquier caso, me ha parecido un proyecto con un enfoque muy interesante y tengo ganas de ver hasta dónde es capaz de llegar.

No hay posts relacionados.

Author: "Juanma" Tags: "C#, development, scriptcs"
Send by mail Print  Save  Delicious 
Date: Monday, 25 Mar 2013 01:43

Tras el rediseño de la home, este fin de semana he hecho lo propio con este blog, que conociéndome iba a ser peligroso dejarlo pasar un par de semanas… Lo he hecho basándome en el diseño y hojas de estilo ya existentes, modificando algunas cositas para que se adaptara a la idea que tenía para el blog.

El proceso ha sido bastante rápido y sencillo, tan sólo 3-4 horas trabajando relajadamente sobre el theme de wordpress. Por consejo de Guillermo, en vez de empezar de cero o sobre alguno de los themes que ya tenía, me descargué uno generado basado en underscores. Al parecer un theme bastante utilizado como base por la comunidad de wordpress.

Aunque ya hacía mucho tiempo, el haber trasteado en varias ocasiones con los themes de wordpress es algo que me resultaba familiar. Enseguida empecé a recordar su estructura de ficheros y plantillas, a cambiar el css, a modificar los templates para que se ajustara a mi html y a lo que quería mostrar en la interfaz, a sustituir textos, etc.

Para haberlo hecho sin ayuda, con cositas mejorables y teniendo algunas dudas sobre si debería modificar algunos detalles, creo que no ha quedado del todo mal.

En fin, con esto creo que ya puedo dar por cerrado el tema del (más que necesario) re-diseño que tenía pendiente hacer.

Al fin puedo presumir de web :) .

Author: "Dani" Tags: "Diseño"
Send by mail Print  Save  Delicious 
Date: Friday, 22 Mar 2013 17:04

Mustache
Como comentaba en la Introducción y ejemplo sobre RequireJS el lado cliente están tomando cada vez más responsabilidad y peso en las aplicaciones. El lado cliente con los navegadores ya no se limitan a mostrar el html que se genera en el servidor de forma dinámica sino que son ellos mismos que obteniendo los datos en formato JSON probablemente mediante un servicio REST se encarga de transformar esos datos en el html que finalmente se ha de mostrar en la página. Generar el html en el cliente en vez de en el servidor tiene las siguientes ventajas:
  • Se reduce la carga del servidor.
  • La cantidad de datos devueltos es menor ya que el tamaño de la plantilla y los datos podrán ser menor que el html final generado por la combinación de ambos si una plantilla puede aplicarse varias veces sobre alguna lista de los datos.
Para transformar esos datos al html mediante una plantilla hay diferentes librerías que proporcionan esa funcionalidad entre ellas Mustache y Handlebars. Mustache es más simple que Hadlebars y Handlebars es un superconjunto de Mustache por lo que si tenemos una plantilla en Mustache podremos utilizarla en Handlebars. En esta entrada comentaré un ejemplo simple y sencillo con las posibilidades de Mustache.

Mustache se caracteriza por su simplicidad evitando incluir lógica en las plantillas, es decir, sin sentencias if y bucles aunque algunas etiquetas proporcionan la misma funcionalidad. El hecho de no incluir lógica en las plantillas hace que estas sean sencillas, fáciles de desarrollar y de mantener además de obligar a no mezclar conceptos lo que hace que el código sea «limpio».

La esencia de Mustache al igual que otros sistemas de plantillas es que por un lado tenemos los datos que forman parte del modelo y por otro lado la plantilla que forma parte de la vista, juntando ambos obtenemos un resultado.

Veamos como se traduce todo esto en código javascript. Lo primero y más sencillo son las variables que en la plantilla se indican entre {{ }}, estos corchetes con forma de mostacho le dan nombre a la librería, la variable es sustituida por el valor proporcionado en el modelo:


Secciones

Otra posibilidad de Mustache con las secciones que se indican con un # delante de la variable. Si la variable de una sección es false, tiene valor null o es un array vacio, esa sección se omite en el resultado. De esta forma una sección puede hacer de lo que en un lenguaje de programación sería una condición.


Secciones lista

En el caso de hacer una sección en el que la variable sea una array o lista, la sección recorrerá cada uno de los elementos de la lista y generará un contenido por cada elemento. Esto nos proporciona la funcionalidad de un bucle.


Parciales

Si no queremos tener una plantilla muy grande o queremos rehusar cierta parte en varias plantillas la podemos dividir usando parciales. Los parciales se indican con el caracter > y son una forma de llamar a un trozo de una plantilla. En la plantilla los parciales son sustituidos por su correspondiente código del mapa de parciales y la plantilla se procesa como si fuese una completa. Este es el mismo ejemplo de la sección lista pero usando parciales:


Compilación

Para una mayor eficiencia sobre todo en dispositivos móviles las plantillas pueden compilarse con:


Esto es lo básico de Mustache, tiene alguna posibilidad más como las funciones donde se puede añadir algo de lógica, también están las secciones invertidas que se indican con ^ y generan resultado si la variable de la sección es null, false o vacía, es decir, lo contrario de una sección normal. Por defecto los caracteres html de una variable son escapados pero puede evitarse con tres llaves {{{ }}} o un & antes del nombre de la variable. También puede cambiarse el delimitador de Muchache, los {{ }}, por otra cadena pero será poco habitual que lo necesitemos.

La otra alternativa que comentaba es Handlebars con la que si tenemos una plantilla de Mustache podemos utilizarla en Handlebars sin ningún cambio ya que Handlebars soporta todas las características de Mustache y añade algunas otras. Las principales diferencias entre Mustache y Handlebars es que Mustache puede ser usada desde diferentes lenguajes como Java, Python, Ruby, D, .NET, PHP, y alguno más que puede verse en la página del proyecto, Handlebars solo se puede utilizar usando javascript. Dado que Mustache puede ser utilizado con Java puede ser una alternativa a librerías como FreeMarker de esta manera podemos hacer uso de la misma librería de plantillas tanto en el servidor como en el cliente de forma que evitemos tener que aprender y conocer varias tecnologías que hacen lo mismo y aprovechemos mejor lo que conocemos. Otra diferencia es que Handlebars añade el concepto de funciones de ayuda («helpers») mediante los cuales se puede añadir lógica si nos es necesario y aunque puede facilitarnos ciertas tareas no conviene abusar de ello ya que puede hacer que las plantillas dejen de ser tan simples y empiecen a no ser fáciles de mantener.

El código fuente completo de este ejemplo los puedes encontrar en mi repositorio de GitHub.

Referencia:
Introducción y ejemplo de RequireJS
Logging en Javascript con log4javascript
Capturar errores de Javascript
Author: "__OVERFLOW__" Tags: "Programación, JavaScript, Software, sof..."
Send by mail Print  Save  Delicious 
Next page
» You can also retrieve older items : Read
» © All content and copyrights belong to their respective authors.«
» © FeedShow - Online RSS Feeds Reader