Picando Código
La Marcha Imperial en dos disqueteras floppy de 3½
Septiembre 30th, 2011 - [Enlace local]
Un video muy interesante con dos disqueteras de disquetes de 3½ pulgadas tocando la Marcha Imperial de Star Wars:
El autor las llamó Evil floppy drives, y explica un poco cómo lo logró:
No es nada nuevo y es bastante simple. El sonido proviene de un cabezal magnético movido por un motor paso a paso. Para crear un sonido específico, el cabezal debe ser movido con la frecuencia apropiada.
Pueden visitar la entrada original para ver más detalle. Nos comenta que llegó el momento de buscar unas disqueteras de 5¼ y 8 para crear una orquesta…
Via twitter: @thinkgeek
Comparte:
» Leer más, comentarios, etc...
Picando Código
Novedades del estudio independiente de videojuegos Frozenbyte
Septiembre 29th, 2011 - [Enlace local]
Frozenbyte es un estudio independiente finlandés de desarrollo de videojuegos. Escribí por acá hace un tiempo sobre su Humble Frozenbyte Bundle. Sus títulos incluyen Splot (a lanzarse este año), Shadowgrounds, Shadowgrounds Survivor, Trine, y Trine 2. Todos menos la secuela de Trine disponibles en el bundle que comentaba anteriormente.
Ya que estamos en el tema, permítanme recomendarles Trine. Este juego me mantuvo varias horas jugando en la computadora por su excelente calidad tanto en gráficos como en jugabilidad. Está disponible para GNU/Linux, Mac OS X, Microsoft Windows y a través de Playstation Network.
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.
Como las imágenes valen más que mis palabras, les dejo un video del gameplay de Trine. Dénse un gusto, y véanlo a 720p en pantalla completa:
Siguiendo con las novedades de Frozenbyte:
Versiones para GNU/Linux en Desura
Trine, Shadowgrounds y Shadowgrounds Survivor están ahora disponibles a través del cliente beta de Desura para GNU/Linux. Los desarrolladores están trabajando en sacarlo para el Ubuntu Software Center, pero el desarrollo de Trine 2 los tiene bastante ocupados. Desura es una plataforma de distribución digital de contenidos similar a Steam. Recientemente lanzaron una versión beta cerrada para GNU/Linux, y aseguran tener una versión estable y abierta en poco tiempo.
Nuevo Humble Bundle
El éxito indiscutible de los Humble Bundle han hecho que se sigan repitiendo ediciones. Esta vez llega el Humble Frozen Synapse Bundle. Consta del juego Frozen Synapse, un juego de estrategia por turnos.
Si bien la oferta no puede resultar demasiado llamativa por ser un solo juego en comparación a los 5 que se entregan generalmente, aquellos que paguen más del promedio (en estos momentos U$S 4.49) se llevan también el Frozenbyte Bundle. No pierdan esta oportunidad! Si se perdieron el bundle anterior, ahora por unos U$S 5 se llevarían Trine, Shadowgrounds, Shadowgrounds: Survivor, el prototipo de Jack Claw y una pre-orden de Splot.
Ya estoy descargando mi copia de Frozen Synapse para probarlo. A continuación el video promocional de este bundle:
Los Humble Bundle ya le han dado más de U$S 2.000.000 a la caridad y siguen manteniendo el modelo de “pagar lo que quieras” por juegos sin DRM y multiplataforma. En su primer día se vendieron más de 60.000 copias con una recaudación mayor a los U$S 250.000. Se mantienen los mismos promedios de precio, siendo los usuarios de GNU/Linux los que más elegimos pagar por los juegos, seguido de los usuarios Mac y luego Windows.
Comparte:
» Leer más, comentarios, etc...
Variable not found
ASP.NET MVC Request Pipeline
Septiembre 29th, 2011 - [Enlace local]
Iba a publicar un enlace hacia este documento en Twitter y Facebook, pero me ha parecido tan interesante que merece un post independiente.
El caso es que el gran Simone Chiaretta ha publicado un excelente diagrama con el ciclo de vida de una petición en el framework ASP.NET MVC. Simplemente imprescindible para comprender lo que pasa por ahí dentro desde que se recibe una petición en el servidor hasta que es enviada la vista con la respuesta al cliente.

Puedes pulsar sobre la imagen para descargar la versión PDF, lista para ser impresa :-)
Publicado en: Variable not found.
» Leer más, comentarios, etc...
Picando Código
Amazon Kindle extingue el fuego del aprendizaje
Septiembre 29th, 2011 - [Enlace local]
El siguiente artículo fue publicado por la campaña DefectiveByDesign.org. Si no saben de qué se trata DefectiveByDesign, o qué significa DRM, les recomiendo el siguiente artículo:
DefectiveByDesign.org: Lucha en contra del DRM
El nuevo Amazon Kindle Fire nace como una alternativa de bajo costo al iPad de Apple. Cada usuario es libre de elegir los dispositivos que adquiere pero es importante que conozcan las libertades con las que cuentan o de las que son privados a la hora de usar uno de estos dispositivos.
Muchas veces detrás del marketing de un nuevo producto se esconden verdades que a las empresas no les conviene divulgar. En el siguiente artículo se explica por qué el Kindle Fire es un dispositivo defectuoso de fábrica y cuenta con una campaña de marketing engañosa para el usuario final (artículo original):
Amazon lanzó hoy su nueva línea de lectores de ebook Kindle, incluyendo el nombrado apropiadamente “Kindle Fire” (encender fuego).
Para citar su comercial de TV: “La instrucción que encontramos en los libros es como el fuego. Lo obtenemos de nuestro vecino, lo encendemos en casa, se lo comunicamos a otros, y se convierte en propiedad de todos.”
Este dispositivo no enciende ese fuego — lo extingue, con más de las mismas restricciones digitales.
Observemos los hechos:
- Amazon reclama que no tienes derecho de vender o compartir los libros que compras. Anuncian una característica de “préstamo” la cual, en el mejor de los casos, te permite prestar un libro una sola vez, a una persona, quien debe también ser usuario de Kindle. No te toca tomar la decisión de si puedes prestar un libro o no — el editor y Amazon lo hacen. Eso no es compartir.
- De hecho, cuando la gente ha intentado cooperar haciendo uso a gran escala de la característica de préstamo, Amazon los cerró. El ejemplo más destacado de esto fue el sitio Lendle, el cual está arriba de nuevo ahora, aunque con menos características, incluyendo una funcionalidad que facilitaba prestar los libros que tienes sin tener que escribir todos los títulos — una movida forzada por Amazon para desalentar el intercambio.
- El poder ejercido sobre sus usuarios, bloqueando arbitrariamente el préstamo de libros y eliminando remotamente libros, es inaceptable incluso si luego cambian de parecer o prometen dejar de hacerlo.
- Amazon está trabajando su camino hacia las bibliotecas públicas y escuelas, subvirtiendo el funcionamiento de los mismos lugares que dicen apoyar.
- A través de la conectividad inalámbrica de estos dispositivos, Amazon puede guardar información de todo lo que lees.
- También a través de la conectividad, Amazon puede eliminar libros de Kindles. Ya han hecho esto varias veces. Dicen que no lo harán más, pero hacen que los usuarios firmen un acuerdo el cual todavía les da la autoridad de hacerlo. Solo han demostrado razones para dudar de su palabra.
- Aunque es posible usar el Kindle para materiales sin DRM, no es el sistema que Amazon promociona ni en el cual está trabajando más activamente. Financiar el trabajo de Amazon en esta área, incluso si lo usas de manera diferente, es apoyar sus movimientos hacia limitar el compartir y el acceso a los libros.
El resultado: Más de lo mismo: Una amenaza mayor a compartir — como el fuego — que ha permitido avanzar a la cultura humana y el conocimiento.
¡Toma medidas!
- Envía un mensaje al equipo de Amazon Kindle via Twitter — @amazonkindle — ten cuidado con el uso directo de Twitter, ya que usa JavaScript privativo. Usar tu cuenta de Twitter via identi.ca es una buena opción.
- Contacta el servicio al cliente de Amazon: Soporte de chat, teléfono y correo electrónico está disponible, y pídeles que saquen el DRM del Kindle.
» Leer más, comentarios, etc...
Variable not found
[Auges] Materiales y grabación de la charla sobre validaciones en ASP.NET MVC 3
Septiembre 28th, 2011 - [Enlace local]
Bueno, pues ayer por la tarde echamos un buen rato hablando sobre los Mecanismos de Validación de ASP.NET MVC 3 en Auges.
Lo primero, agradeceros la asistencia y reconocer el mérito de los jabatos que aguantaron hasta el final. No es fácil tragarse dos horas seguidas de monólogo y menos aún sobre una temática algo densa en algunos puntos. Muchas gracias a todos :-)
Durante estas dos horas recorrimos distintas técnicas que podemos utilizar para validar las entradas de datos. En resumidas cuentas, lo que vimos fue:
- La evolución que nos lleva desde una validación totalmente artesana, sin el más absoluto respeto al patrón MVC hasta el sistema de validación integrado en ASP.NET MVC.
- Las anotaciones “estándar”: Required, Range, StringLength… comentando también algunas de las novedades que nos depara el futuro ASP.NET vNext.
- Los modos de validación en cliente de MVC 3, la validación unobtrusive y su repercusión en la vista.
- La validación personalizada con CustomValidation.
- Validación remota con el atributo Remote.
- También vimos el atributo AllowHtml, que aunque no tenía mucho que ver con el resto, me parecía interesante comentarlo.
- El uso de los interfaces IDataErrorInfo e IValidatableObject para realizar validaciones personalizadas en servidor.
- Creación de custom annotations, o anotaciones personalizadas en las que introducir la lógica de validación que nos interese.
- Cómo llevar a la vista estas anotaciones personalizadas, generando las reglas y construyendo los adaptadores y funciones de validación en cliente.
- Y por último, creamos un validator provider capaz de obtener validadores a partir de información almacenada en el archivo de configuración, en lugar de obtenerlos desde las anotaciones en las clases del Modelo.
Enlaces:
- Materiales (PPT y proyecto Visual Studio 2010)
- Grabación del evento (descarga o visualización online)
» Leer más, comentarios, etc...
Preparando SCJP
Asignaciones – Paso de Parámetros en Java
Septiembre 28th, 2011 - [Enlace local]
El paso de parámetros en Java se hace siempre por valor, ya se trate de un tipo primitivo o de un tipo de referencia, el método trabaja con una copia de la variable.
En el caso de una variable de tipo primitivo, si dentro del método se modifica la variable, estamos modificando la copia y no la variable original.
En el caso de variables de referencia, si se modifica la variable dentro del método se está modificando una copia de la referencia y no la referencia original. Eso sí, al tener una copia de la referencia que apunta al mismo objeto, sí se puede cambiar el contenido de éste.
Veámoslo con un ejemplo:
class PasoParametros{
public static void main(String[] args){
//Para un entero comprobamos que se modifica la copia, despues vuelve a su valor orig.
int entero = 100;
System.out.println("Antes de modificar: " + entero);
modificar(entero);
System.out.println("Despues de modificar: " + entero);
//Para un array de un entero, comprobamos que con la copia de la referencia
//podemos cambiar su contenido.
int[] array = new int[1];
array[0] = 100;
System.out.println("\nAntes de modificar: " + array[0]);
modificarContenido(array);
System.out.println("Despues de modificar: " + array[0]);
//Para el mismo array de entero, comprobamos que no podemos modificar la referencia.
System.out.println("\nAntes de modificar: " + array[0]);
modificar(array);
System.out.println("Despues de modificar: " + array[0]);
}
static void modificar(int e){
e = 200;
System.out.println("Dentro de modificar: " + e);
}
static void modificarContenido(int[] a){
a[0] = 200;
System.out.println("Dentro de modificarContenido: " + a[0]);
}
static void modificar (int[] a){
//Creamos un nuevo array "b" y hacemos que "a" apunte a este nuevo array.
//Funciona solo dentro del metodo, puesto que "a" aquí es una copia.
int[] b = new int[1];
b[0] = 300;
a = b;
System.out.println("Dentro de modificar: " + a[0]);
}
}
Resultado de la ejecución:
Filed under: Estudio, Tema 3 Tagged: Certificacion Java, Java, ocpjp, Paso de Parámetros, Programacion, SCJP, Tecnologia
» Leer más, comentarios, etc...
Variable not found
Enlaces interesantes 52
Septiembre 26th, 2011 - [Enlace local]
Ahí van los enlaces publicados en Variable not found en Facebook y Twitter del 19 al 25 de septiembre de 2011. Espero que os resulten interesantes. :-)
- Optimizing the website Performance using ASP.NET 4.5
Kalyan Bandarupalli - Premature optimization
Keyvan Nayyeri - HTML5 compatibility on mobile and tablet browsers
Vía Genbetadev. - EF vNext- Migrations 0.7.0.0
Unai Zorrilla - The Secret Life of JavaScript Primitives
Angus Croll. Vía CampusMVP. - Writing a Recipe for ASP.NET MVC 4 Developer Preview
Phil Haack - Regex engine updated to allow timeouts in .NET 4.5
Ahmad Mageed - 2D transforms in CSS 3
John. A secas. - Functions in javascript
Ricky Delaney - WebMatrix 2 Beta–Released
Roberto Lucero - Released: Project Silk Client-Side Web Development for Modern Browsers
Karl Shifflett - What’s new in C# 5.0 and VB.Net
Samuel Jack - Improvements in the CLR Core in .NET Framework 4.5
Sasha Goldshtein - Introduction to Entity Framework Code First
Bipin Joshi - Espectacular (Chrome): Very cool 3D WebGL Water demo. Like can 'touch' water to create waves! :)
Vía Brian Henderson - C#5 Tomando una cerveza con Feynman (o await 2a parte)
Eduard Tomás - The scoped attribute in HTML5
Html5 doctor - What’s New For Parallelism in .NET 4.5
Stephen Toub - C# Future directions
Christian Nagel - C#/.NET Little Wonders: The String Remove() and Replace() Methods
James Michael - WinRT demystified
Miguel de Icaza - C# 5: Async / Await
Eduard Tomás - ASP.NET MVC 4: Display modes
Gunnar Peipman - ASP.NET MVC 4: New mobile web application template
Gunnar Peipman
Publicado en: Variable not found
» Leer más, comentarios, etc...
carlosrovira.com
Encar’s Bakery
Septiembre 22nd, 2011 - [Enlace local]
Hace unos días mi mujer, Encar, ha abierto su propia web. Encar’s Bakery es una web dedicada a la repostería, una de sus máximas pasiones, donde irá añadiendo periodicamente sus recetas dulces. Esta nueva experiencia de usuario, pretende ofrecer una cuidada selección de las mejores recetas de Encar, a través de un contenido de calidad, tanto a nivel de fotografías, texto y selección de contenido.
Este lanzamiento supone la culminación de un proyecto gestado con cariño y a ratos durante largo tiempo en nuestros ratos libres. Todos aquellos que os gusten los postres, os recomiendo que os deis os paseo por la web y que intentéis poner en práctica alguna de las propuestas ofrecidas ya que seguro que son de vuestro interés.
Mi aporte a nivel técnico se ha basado en ofrecer una cuidada usabilidad a través de una organización del contenido accesible gracias a las posibilidades que brinda Wordpress 3.0. En el podemos encontrar en uso las últimas características que ofrece el sistema como son los custom posts (receta), taxonomies (postres o ingredientes) o custom menus entre otras.
A nivel personal me encantan ver a Encar persiguiendo su sueño repostero que tanto le gusta y poniendo toda la carne en el asador para hacer realidad esta idea. Desde aquí me gustaría apoyar la iniciativa y desearle el mejor de los futuros. Larga vida a Encar’s Bakery!
.
» Leer más, comentarios, etc...
Variable not found
[Auges] Webcast: Mecanismos de validación en ASP.NET MVC 3
Septiembre 22nd, 2011 - [Enlace local]
Como ya sabréis (o no, pero yo os lo cuento ;-)), el próximo martes día 27 de septiembre, a las 19:00 (hora peninsular española, GMT+1) daré una charla con AUGES en la que trataremos los mecanismos de validación que encontramos en ASP.NET MVC 3.
El tema, que ha sido propuesto por algunos de vosotros, es sin duda muy interesante. Sea cual sea el tipo de aplicación que desarrollemos, nos vemos obligados a validar los datos de entrada y, afortunadamente, MVC 3 viene acompañado de un sistema realmente potente para ayudarnos con esta crítica tarea. De hecho, es tan amplio que no es fácil conocerlo en toda su extensión.
Y lo que voy a intentar en esta charla es dar un repaso al sistema de validación de MVC 3 completo. De esta forma podréis conocer qué es lo que hay, lo que se puede hacer, y tener una idea de cómo hacerlo. Trataremos desde aspectos muy simples como las anotaciones incluidas en el framework, su personalización y extensión, hasta temas algo más avanzadillos como la creación de validadores en cliente o los proveedores de validación. Espero que me dé tiempo a todo, uuf!
Para poder seguirla creo que es conveniente (por no decir necesario) conocer ASP.NET MVC 3 (o 2) al menos a un nivel básico; no voy a tener tiempo para detenerme en ver qué es un controlador, cómo le llegan los parámetros a la acciones, o cómo se construye un formulario. Pero tampoco es que sean unos requisitos muy exigentes: cualquiera que haya jugado mínimamente con el framework creo que podrá entenderlo todo… o al menos ese es el objetivo.
Os recuerdo que se trata de un Webcast, o sea, que podéis asistir a este evento desde vuestro sillón favorito y con un saco de palomitas a la vera, y por supuesto es totalmente gratuito. Eso sí, debéis registraros previamente para poder asistir:
- Día: martes 27 de septiembre, 19:00 hora peninsular española (GMT+1)
- URL del registro: https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032494252&Culture=es-ES
» Leer más, comentarios, etc...
Picando Código
Arrays en Ruby
Septiembre 21st, 2011 - [Enlace local]
Hoy voy a compartir mis apuntes sobre Arrays en Ruby. Como comentaba en posts anteriores, vengo estudiando con el libro Programming Ruby 1.9: The Pragmatic Programmers’ Guide. Vengo acompañando la lectura con los Ruby Koans, y algunos video tutoriales. Ya repasé lo de Rails For Zombies, y descubrí otro excelente recurso que son los RailsCasts. Vamos a ver si en algún momento tenemos algo escrito en Ruby para compartir
Vamos entonces con estructuras de datos de Ruby. Los Arrays y Hashes son dos clases creadas para el manejo de colecciones:
La maestría en estas dos clases es clave para ser un programador Ruby efectivo. Esta maestría puede llevar tiempo, porque ambas clases tienen interfaces muy grandes.
Teniendo en cuenta esta cita del libro, veamos una definición bien específica de qué es un Array en Ruby:
- Arrays
- Colección de referencias a objetos.
En Ruby, las variables guardan la referencia a un objeto, y no el objeto en sí. Cada referencia a un objeto ocupa una posición en el array identificado por un índice entero.
a = [3.141592, "pi", 42] a.class # Array a.length # 3 a[0] # 3.141592 a[3] # 42 a[15] # nil b = Array.new b.class # Array b.length # 0 b[0] = "Uno" b[1] = "Dos" b # ["Uno", "Dos"]
Se indexan los elementos usando el operador [], un método de instancia de la clase Array que puede ser sobrescrito. Llamar a una posición de un entero positivo, retorna el objeto en ese lugar o nil si no hay nada ahí. Con los índices negativos, se cuenta desde el final siendo -1 el último elemento del array, y -array.length el primero.
a = [1, 5, 6, 38, 95] # 0, 1, 2, 3, 4 índices positivos # -5, -4, -3, -2, -1 índices negativos a[-1] # 95 a[-3] # 6 a[-56] # nil
Se pueden indexar con un par de números (inicio, cantidad). Esto devuelve un nuevo array con referencias a la cantidad de objetos comenzando en la posición inicio.
a = [1, 5, 6, 38, 95] a[1,3] # [5, 6, 38] a[-3, 2] # [6, 38]
También se pueden usar rangos. Ruby implementa un objeto para representar rangos como los meses de Enero a Diciembre, secuencias de números y demás. En el caso de los arrays, se usan los rangos que implementan secuencias (también implementan condiciones e intervalos). Estos funcionan así:
1..10 1...10
Cuando se usan los tres puntos, se excluye al último elemento del rango.
De esta manera, podemos acceder a los elementos de un array así:
a = [1, 5, 6, 38, 95] a[1..3] # [5, 6, 38] a[-4..4] # [5, 6, 38, 95]
El operador [] tiene un operador []= para setear elementos en el array. Si se usa un solo índice entero, el elemento en esa posición se reemplaza con lo que haya a la derecha de la asignación. Si quedan espacios sin asignar en el medio, estos se llenan con nil.
a = [1, 5, 6, 38, 95] a[1] = 'Stegosaurus' #[1, 'Stegosaurus', 6, 38, 95] a[3] = [5, 6] #[1, 'Stegosaurus', 6, [5, 6], 95] a[6] = 99 #[1, 'Stegosaurus', 6, [5, 6], 95. nil, 99]
Si el índice de la asignación []= son dos números(un inicio y longitud) o un rango, los dos elementos en el array original son reemplazados por lo que haya a la derecha de la asignación.
a = [1, 5, 6, 38, 95] a[2,2] = 'Velociraptor' #[1, 5, 'Velociraptor', 95] #Si la longitud es 0, se inserta el valor de la derecha antes de la posición de inicio a[2,0] = 'Nintendo 64' #[1, 5, 'Nintendo 64', 'Velociraptor', 95] #Si el valor a asignar es un array, se usan sus elementos en la asignación a[1,1] = [4, 7, 82] #[1, 4, 7, 82, 'Nintendo 64', 'Velociraptor', 95] a[0..3] = [] #['Nintendo 64', 'Velociraptor', 95] a[5..6] = 'AYBABTU', 98 #['Nintendo 64', 'Velociraptor', 95, nil, nil, 'AYBABTU', 98]
Arrays como pilas y colas
Los arrays implementan las funciones push y pop que agregan y quitan elementos al final del array, por lo que pueden ser usados como pilas (stack):
pila = [] pila.push "Leonardo" pila.push "Donatello" pila.push "Raphael" pila.push "Michelangelo" puts pila.pop # Michelangelo puts pila.pop # Raphael p pila # ["Leonardo", "Donatello"]
Los métodos shift y unshift agregan y quitan elementos del principio del Array. Combinando ambos obtenemos una cola FIFO:
cola = [] cola.push "Leonardo" cola.push "Donatello" puts cola.shift puts cola.shift
En este código, los elementos se quitan del array en el orden que fueron insertados. Está bueno ir escribiendo todo esto en el shell interactivo de Ruby (irb), el cual debería estar instalado en su sistema si instalaron Ruby. De esa forma pueden ir comprobando los resultados esperados de cada método y demás.
Otra opción es usar los métodos first y last. Éstos devuelven los elementos pero sin quitarlos del array. Se puede pasar como parámetro la cantidad de elementos que queremos recibir.
Más info:
- La clase Array en RubyDoc – http://www.ruby-doc.org/core/classes/Array.html
» Leer más, comentarios, etc...
MadeInFlex
Flash Player 11, AIR 3 y Flash Builder 4.6
Septiembre 21st, 2011 - [Enlace local]
Se ha hecho oficial el anuncio de Player 11, AIR 3, Flex 4.6 y Flash Builder 4.6. Se estima que estarán disponibles a partir de octubre.
Os dejo a continuación dos links para que podáis haceros una idea de lo que esto implicará:
link 1
link 2
» Leer más, comentarios, etc...
Variable not found
ASP.NET MVC 4 Developer Preview: un primer vistazo
Septiembre 20th, 2011 - [Enlace local]
Es habitual que los eventazos que organiza Microsoft de vez en cuando sean aprovechados para presentar nuevas versiones de productos, y por supuesto el pasado \\BUILD no ha decepcionado en ese aspecto: han sido liberadas versiones preliminares para desarrolladores de Windows 8, Windows 8 Server, Visual Studio 11, ASP.NET 4.5, MVC 4, Webpages 2, y seguro que muchas más cosas que ahora no recuerdo. Obviamente, el revuelo de estos últimos días ha sido, como siempre, brutal.
Pero bueno, centrándonos en ASP.NET MVC 4, se trata de un adelanto de lo que ya se nos avanzó en el Roadmap del producto, y que se ha distribuido en dos paquetes distintos: uno para Visual Studio 2010, y otro para el flamante Visual Studio 11 Developer Preview, también lanzado durante el Build. Ambos pueden descargarse a través de Web Platform Installer, o desde los enlaces proporcionados en esta página.
Este post vamos a dedicarlo a comentar algunas de las cosas que me han ido llamando la atención durante los primeros paseos por el producto. Y ojo, que se trata de una versión muy preliminar: puede tener fallos, cambiar conforme vayamos aproximándonos a la versión final, o incluso hay características que podrían desaparecer.
Por ejemplo, en el caso de la distribución para Visual Studio 2010, no debería interferir con otras versiones del producto instaladas, por lo que deberíais poder probarla en vuestra máquina habitual sin miedo a que os rompa nada. Sin embargo, sí que me ha dado algún problemilla al compilar proyectos MVC 3 existentes, puesto que se introducían dependencias a la versión 2 de System.Web.Webpages (distribuida con MVC 4), pero vaya, nada que no pueda solucionarse en un par de minutos retocando las referencias del proyecto.
1. Primeras novedades
Una vez instalado, lo primero que encontramos al crear un proyecto de tipo Web es una nueva plantilla llamada “ASP.NET MVC 4 Web Application”.
Hasta aquí, todo normal. Pero las primeras sorpresas aparecen en el habitual cuadro de diálogo posterior:

Como podéis ver, hay varias novedades. Primero, el checkbox “Use HTML5 semantic markup” que fue introducido con la última actualización de MVC aparece deshabilitado en todas las plantillas exceptuando la vacía. Esto parece dar a entender que HTML5 ya no es una opción… es la opción; habrá que ver si en la versión final incluyen plantillas no-HTML5, o se confirma esta tendencia.
Y segundo, además de las habituales plantillas (Vacía, Aplicación Internet y Aplicación Intranet) podemos ver la nueva “Mobile Application”. Sin duda, como ya se adelantaba en el Roadmap, las aplicaciones web para móviles toman bastante protagonismo en esta entrega.
Seguimos avanzando. Creamos un proyecto de tipo Internet Application, y nos encontramos con una plantilla mucho más moderna y elegante. La verdad es que estaba ya un poco cansado de ver siempre la misma:


Pero no se trata únicamente de un cambio estético. La maquetación utiliza una técnica llamada renderizado adaptativo, que en la práctica significa que se adapta a distintos anchos de pantalla, por lo que es válida tanto para ser visualizada correctamente en dispositivos grandes (captura de pantalla de arriba) como en móviles. Es fácil de comprobar simplemente cambiando el tamaño de la ventana del navegador.
Obviamente esta capacidad no tiene que ver con MVC 4, sino con la forma en que ha sido maquetada la página, pero de nuevo pone de manifiesto la orientación del producto hacia los dispositivos móviles.
También se ha dado un giro radical al habitual sistema de membresía que venía con las plantillas tradicionales MVC. Ahora, si el usuario tiene activado el scripting (lo que es habitual), las funcionalidades de acceso y registro de usuarios se realizan utilizando cuadros de diálogo basados en jQuery UI, y llamadas Ajax. Si en cambio no existe la posibilidad de utilizar scripts, estas funcionalidades se realizarán a pantalla completa, como siempre.


En cuanto a la plantilla específica para dispositivos móviles, utiliza jQuery Mobile, una popular biblioteca para componer interfaces web específicos para dispositivos táctiles como smartphones y tablets.
La funcionalidad es idéntica a la plantilla de aplicaciones para Internet, pero optimizada para la interacción desde estos dispositivos.
2. Display Modes
Sin embargo, el hecho de tener dos plantillas de proyecto independientes dependiendo del dispositivo no parece demasiado natural, y por eso MVC 4 incluye una nueva característica llamada display modes (modos de visualización).Esta característica permite crear una única aplicación y renderizar una u otra vista en función del dispositivo o las condiciones que deseemos.
Por ejemplo, si la acción “Index” del controlador “Home” retorna la vista por defecto, lo habitual es que el framework devuelva al usuario el resultado de procesar la plantilla /Views/Home/Index.cshtml. Pues bien, gracias a los display modes, si la petición ha sido realizada desde un dispositivo móvil, se retornará la vista Index.mobile.cshtml y sólo en caso de no existir, la habitual Index.cshtml. Y lo mismo ocurre con los layouts y vistas parciales: se seleccionarán en función del cliente.
También se permite un control más granular sobre los dispositivos. El siguiente código (tomado de las notas de la revisión), registra un nuevo display mode en el sistema. Básicamente, lo que hacemos es asociar el nombre “iPhone” al dispositivo que ha realizado una petición en cuyo user-agent aparece ese mismo texto:
DisplayModes.Modes.Insert(0, new DefaultDisplayMode("iPhone") { ContextCondition = (context => context.Request.UserAgent.IndexOf ("iPhone", StringComparison.OrdinalIgnoreCase) >= 0) });
Una vez hecho esto, y siguiendo con el ejemplo anterior, la vista que se intentaría renderizar en este caso sería Index.iPhone.cshtml. Qué bueno, eh?
Otra capacidad muy interesante que vamos a tener a nuestra disposición es el browser overriding, o lo que es lo mismo, el poder establecer el navegador del usuario independientemente del utilizado por el mismo. Esto permitirá, por ejemplo, forzar la visualización en modo completo a alguien que está accediendo desde un dispositivo móvil, o justo lo contrario, forzar la visualización del modo móvil a alguien accediendo desde desktop.
El agente de usuario sobrescrito será persistente entre las sucesivas peticiones puesto que se almacenarán por defecto en una cookie, aunque, como es habitual, será posible utilizar otros mecanismos de persistencia personalizados.
Para facilitar el desarrollo de este tipo de sistemas, se ha puesto a disposición de los desarrolladores el paquete jQuery.Mobile.MVC (descargable a través de Nuget con esta denominación), que incluye un Layout para móviles, un controlador, algunos helpers y una útil vista parcial llamada ViewSwitcher que permite conmutar entre el modo móvil y modo desktop.
3. Bibliotecas de scripting
Hasta MVC 3, en todas las plantillas de proyectos incluían las bibliotecas de scripting de Microsoft relativas a Ajax y los sistemas de validación. Ya en la última versión del framework era más recomendable utilizar las soluciones basadas en jQuery, pero estas bibliotecas seguían pululando por ahí; en ASP.NET MVC 4, simplemente las bibliotecas javascript de Microsoft han dejado de distribuirse en las plantillas de proyectos MVC.Y como sorpresa, en la carpeta /Scripts, además de los tradicionales Modernizr, jQuery, jQueryUI, jQuery validate, y jQuery unobtrusive, nos encontramos ahora con Knockout, una biblioteca javascript que permite crear interfaces de usuario dinámicos utilizando el patrón MVVM.
Claramente se intenta poner un poco de orden en ese caos en lo que a veces se convierten las vistas cuando son muy dinámicas y utilizan mucho scripting.
4. Microsoft.Web.Optimizations
Curioseando por las referencias que se añaden a los nuevos proyectos, muchas de ellas en forma de paquetes Nuget preinstalados, me encuentro conMicrosoft.Web.Optimizations, una joya que ya deja ver cómo va a resolverse la promesa hecha en el roadmap sobre la compactación y minimización de archivos javascript y estilos.Se trata de un sistema mediante el que podemos crear paquetes (bundles) de archivos .js o .css y asignarles una URL única. Cuando se realice una petición a esta dirección, se compactarán y minimizarán los archivos originales y se retornará al usuario la copia reducida. Obviamente esto sólo se producirá una vez, puesto que el resultado quedará almacenado en caché.
Por ejemplo, podemos asociar la URL “/myscripts.js” a todos los scripts presentes en la carpeta “~/scripts” del proyecto incluyendo subdirectorios, con lo que podremos descargar todo el javascript que necesita una página simplemente referenciando desde ella al archivo myscripts.js. E igual ocurre con las hojas de estilo.
No es nada que no pudiera hacerse antes incluyendo los procesos de compactación en compilación, pero la verdad es que este nuevo sistema está muy bien, y facilita la creación de
En el caso de los scripts, la compactación no consiste únicamente en reducir los comentarios, espacios y saltos de línea, sino que también son transformados los nombres de las variables, métodos y funciones privadas para reducirlos a su mínima expresión. O sea, que de paso estamos ofuscando el código.
Y lo que es mejor, al tratarse de un paquete independiente que no tiene dependencias con MVC 4 ni con ASP.NET 4.5, podemos usarlo ya en nuestras aplicaciones MVC 3, simplemente descargando el paquete desde Nuget y poniéndolo en marcha. La forma de usarlo, para no extenderme mucho aquí, la dejaré para otro post, aunque ya os adelanto que es realmente sencillo.
5. ASP.NET Universal providers
El sistema de membresía de los proyectos ASP.NET MVC 4 utiliza ahora los nuevos proveedores universales (ASP.NET Universal Providers), lo cual facilita enormemente el cambio desde el motor por defecto (SQL Express) a otros más apropiados para nuestra aplicación, como SQL Server, SQL Azure, o SQL Compact.Aquí puedes leer algo más sobre los proveedores universales de ASP.NET.
6. Más características incluidas
Durante las pruebas, me he encontrado en las vistas con nuevos helpers como los imprescindiblesHtml.IdFor() y Html.NameFor() que ya vimos por aquí hace tiempo, y que son útiles para averiguar respectivamente el id y name que serán asignados al campo de edición de una propiedad en un formulario. Viene también con sus versiones no tipadas, nombrados como Id() y Name(), y las versiones para el modelo completo IdForModel() y NameForModel().También encontramos un interesante helper
Html.Value(), ValueFor() y ValueForModel() que permite obtener el valor para una propiedad siguiendo la lógica de los habituales helpers de edición, teniendo en cuenta tanto el ModelState como los datos de la vista.Por último, aunque no las he comprobado, en el documento de Release Notes se destacan también los siguientes aspectos:
- simplificación de controladores asíncronos, utilizando C# 5 y los tipos
TaskyTask<ActionResult>. - soporte para la release 1.5 del SDK de Azure.
7. Pero… ¿y las cosas que faltan?
De momento no he encontrado ni rastro de las famosas recetas (recipes). Bueno, el IDE incorpora una nueva opción “Run recipe…” en el menú contextual que nos lleva a un cuadro de diálogo en el que en principio deberían aparecer las recetas disponibles, pero está vacío. Tal y como se indicaba en el Roadmap, estas recetas serían descargables a través de Nuget, pero no he conseguido dar con ninguna.Tampoco se generan aún las etiquetas
<input> con el type ajustado según el tipo de datos para aprovechar las nuevas capacidades de HTML5, otra de las características que acompañarán a MVC 4.En fin, que mirando el Roadmap está claro que estos chicos tienen todavía mucho trabajo por delante. Pero no olvidemos que, como indica Phil Haack en su post de presentación, se trata de una versión preliminar para desarrolladores. Ni siquiera se puede considerar una beta, por lo que hay que tomárselo como tal. Faltan muchas cosas, y probablemente las que vemos cambiarán bastante antes de la versión definitiva.
Enlaces:
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering / Project Management / Business Process Management
Frases emprendedoras
Septiembre 19th, 2011 - [Enlace local]
Siempre es motivante escuchar frases en el mundo de los negocios, aquí una lista de ellas
http://www.soyentrepreneur.com/20-frases-emprendedoras.html
» Leer más, comentarios, etc...
Variable not found
Enlaces interesantes 51
Septiembre 19th, 2011 - [Enlace local]
Estos son los enlaces publicados en Variable not found en Facebook y Twitter desde el domingo, 11 de septiembre de 2011 hasta el domingo, 18 de septiembre de 2011.
Espero que te resulten interesantes. :-)
- New Features for Web Development in Visual Studio 11 Developer Preview
Microsoft Web development tools - Tutorial: build a Mobile Website with ASP.NET MVC 4 and jQuery Mobile.
Vía Scott Hanselman - Get the scoop on the ASP.NET 4.5, ASP.NET MVC 4, ASP.NET Web Pages 2, and Visual Studio 11 Developer Previews
Jon Galloway - ASP.NET MVC 4 Developer Preview Released
Phil Haack - Probando jQuery en el escritorio de Windows 8
Gonzalo Pérez - Javascript no es tu enemigo: Patterns For Large-Scale JavaScript Application Architecture
Addi Osmani, vía Marc Rubiño - [ASP.NET vNext] Model Binding: Actualizando datos (Ya tenemos Data Annotations!)
Luis Ruiz - Estudiando el diseño de jQuery paso a paso
Carlos Benítez - Sync Framework now Open Source.
Eric Golpe - [ASP.NET vNext] Model Binding: Filtrando datos
Luis Ruiz Pavón - Volatile fields in .NET.
BlackWasp - EF vNext-Migrations - I
Unai Zorrilla - ¡Feliz día del programador!
Wikipedia - [Tip] Intellisense entre ficheros .Js
Marc Rubiño - Usando SQL Server Table-Valued Parameters en C# (mediante un Custom Iterator)
Lluis Franco - [WebCast] Mecanismos de validación en ASP.MVC 3
AUGES - Dictionary of Algorithms and Data Structures.
National Institute of Standards and Technology - Evento de ADO.NET en Second Nug.
Omar del Valle - C#/.NET Little Wonders: The String Split() and Join() methods.
James Michael - Simulating Function Overloading in #JavaScript
Joe Stagner - ¿Realmente emerge el diseño con TDD?
Josep Maria Camps. - ASP.NET page methods are only as secure as you make them
Dave Ward - Leer variables Session desde una capa de Negocios
Jesús Velasco, vía Omar del Valle.
Y no olvides que puedes 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
» Leer más, comentarios, etc...
Buayacorp
MySQL ya no es completamente una base de datos libre
Septiembre 18th, 2011 - [Enlace local]
MySQL ya no es completamente libre. Sólo era un producto libre, no un proyecto. Sin embargo aun nos queda Drizzle.
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering / Project Management / Business Process Management
Informe Anual de Salarios TI 2011
Septiembre 16th, 2011 - [Enlace local]
Informationweek pone a nuestra disposición el informe anual de salarios en el área de TI, sin duda alguna material importante para la industria
» Leer más, comentarios, etc...
Picando Código
Hackathon sobre GWT y AppEngine en Barcelona
Septiembre 16th, 2011 - [Enlace local]
Para los que me leen desde el viejo continente, les comento que la empresa donde trabajo estará realizando un evento por aquellos lados:
Globant organiza una Hackathon en España.
Globant te invita a un EVENTO exclusivo para DESARROLLADORES;
un Hackathon sobre GWT y AppEngine, dos tecnologías de Google que lideran la revolución de soluciones web 2.0.
¡Preparate para desafiar tus conocimientos y participar de una competición única en España! Ven enfrente a los mejores geeks españoles.
Por cualquier consulta escríbenos a communications@globant.com¡PIZZA, CERVEZA y PREMIOS!
La primer instancia se llevará a cabo en Barcelona el 28 de septiembre. Una instancia próxima a anunciarse en Madrid. No tengo muy clara la modalidad de la hackathon, pero todo parece indicar que los premios se distribuirán entre aquellos que hagan buen uso de la Fuerza y sus habilidades Jedi (o Sith) de manera acertada.
Google Web Toolkit (GWT) es un toolkit de Google para el desarrollo de aplicaciones web complejas. Su objetivo es permitir desarrollar soluciones de alto rendimiento y compatibles con cualquier navegador, sin la necesidad de que el desarrollador cuente con experiencia sólida en JavaScript.
Google AppEngine permite crear y alojar aplicaciones web, utilizando los mismos sistemas que soportan las aplicaciones de Google.
PONENTES:
GABRIEL PRAINO (Premier League Guru, Globant)
LUGAR: Universitat Politècnica de Catalunya (UPC) Aula Màster c/Jordi Girona, 1-3 08034 Barcelona.
REQUISITOS:
- Conocimientos básicos de lenguaje Java
- Una notebook cada 2 a 3 personas, con:
. Windows preferentemente
. Tener una cuenta de Gmail y AppEngine
. Eclipse instalado
. Plugin Google instalado
. JDK 1.6
. Plugin GWT para al menos 1 navegador: IE | Firefox | Safari | Chrome
Pueden visitar el sitio oficial por actualizaciones, o para saber más sobre Globant. ¡Que la fuerza los acompañe!
Comparte:
» Leer más, comentarios, etc...
Arragonán
Introducción a Grails (1.0.3)
Septiembre 15th, 2011 - [Enlace local]
Artículo publicado hace un par de años en debug_mode=on y recuperado a mi blog depués del último tuit de la cuenta oficial y de Belmonte. Aunque no sea (ni de muy lejos) el mejor contenido que me haya trabajado, me hace duelo pensar en perderlo, por eso lo reproduzco aquí:
Introducción:
Grails es un framework web open source para la plataforma Java, que sigue los principios Don’t Repeat Your Self(No te repitas) y Convention over Configuration(Convención sobre configuración). Grails se inspiró de incio en Ruby on Rails, llegándose a llamar de inicio Groovy on Rails con el que además de estos principios comparten otras similitudes como: scaffolding, layouts, taglibs(en rails helpers), sistema de plugins…
Grails es algo más que un framework MVC, también nos ofrece capa de persistencia, capa de servicio, contenedor de servlets y gestor de bases de datos. Se sustenta sobre varios frameworks y librerías Java muy conocidas y probadas como son Spring Framework, Hibernate, Sitemesh, Log4j, Jetty, Hsqldb… y del lenguaje de programación Groovy.
Instalación:
Para instalar Grails debemos descargarnos la última versión(en éste momento 1.0.3) en http://www.grails.org/Downloady extraer el contenido del archivo comprimido.
Crear la variable de entorno GRAILSHOME apuntando hacia el directorio que hemos extraído y añadir el GRAILHOME/bin en la variable de entorno PATH.
Tras esto ejecutamos en una consola el comando grails help y con el que nos debería salir el listado de comandos de grails.¡Ya podemos crear nuestra primera aplicación!
La aplicación:
Veremos una aplicación de ejemplo que se compondrá tan sólo de una clase de dominio para una gestión de un catálogo de productos.
Creamos la aplicación con:
grails create-app catalogUna vez ejecutado entramos al directorio de nuestra aplicación:
cd catalogAquí podemos ver la estructura de directorios que se ha generado:
- grails-app: Artefactos de Grails(controllers, vistas, clases de dominio, taglibs, configuraciones…)
- lib: Librerías para nuestro proyecto (que no traiga Grails de serie, claro)
- plugins: Plugins instalados
- scripts: Scripts Gant
- src: Clases java o groovy que no sean artefactos de Grails
- test: Tests de nuestra aplicación
- web-app: css, imágenes, ficheros html estáticos…
Tras ésto creamos la clase de dominio:
grails create-domain-class productVemos que en grails-app/domain se ha creado Product.groovy(además en los tests ProductTest.groovy), que abriremos y añadiremos los atributos a la clase(por ejemplo: name, description y provider)
class Product{ String name String description String provider int quantity }Y con ésto hemos terminado de definirlo, al ser un POGO no son necesarios getters y setters, ya que Groovy es quien se encargará de generarlos en tiempo de ejecución.
Tras esto utilizaremos el scaffolding, que nos creará un controller con las acciones básicas y susrespectivas vistas:grails generate-all productVeremos que en grails-app/controllers tendremos un ProductController.groovy y en grails-app/views/product los .gsp que son las respectivas vistas de las acciones de ProductController.
Tras ésto, podemos arrancar el servidor embebido que trae Grails y una vez arrancado podemos ver el resultado enhttp://localhost:8080/catalog/:
grails run-appCon esto tenemos generado el esqueleto de nuestra aplicación sin crear un war, sin ir a crear tablas en la base de datos, sin configurar nada…
Con esto no hemos hecho más que empezar, como ejercicio es recomendable mirar el código que se ha generado en el controller y en las vistas, modificar algo, tratar de añadir alguna acción nueva como podría ser una acción para sumar 1 a la cantidad de un producto. Y cómo no, no dejar de seguir la guía de referencia
Ojalá aparezca alguien con capacidad y motivación suficiente para reflotar y mantener debugmodeon.
» Leer más, comentarios, etc...
Buayacorp
Google+ lanza su esperada API
Septiembre 15th, 2011 - [Enlace local]
Hoy Google lanzó lo que muchos desarrolladores estaban esperando con ansias, por fin tenemos el API de Google+.
Después del lanzamiento de Google+ y la avalancha de curiosos que quisieron probarlo, la red social ha tenido un bajón grande en estos últimos meses. Esto se debe mas que nada a la monotonía de publicar "manualmente", y la falta de integración de productos como Google Reader.
Lo único que hizo que Google+ no se caiga totalmente fue la introducción de los juegos que en un primer momento también tuvo un gran revuelo, sin embargo, hoy también parece relegado.
Hoy después de mucha espera y espectativas tenemos una primera versión de la API que sirve para mostrar información publica de usuarios registrados.
Por ejemplo para ver la información de cierto perfil, sólo se hace una simple petición via GET
GET https://www.googleapis.com/plus/v1/people/107447198372749768472?pp=1&key={YOUR_API_KEY}y obtenemos datos en JSON:
{ "kind": "plus#person", "id": "107447198372749768472", "displayName": "Braulio Soncco", "tagline": "Misio pero feliz", "gender": "male", "aboutMe": "Super mormón
", "url": "https://plus.google.com/107447198372749768472", "image": { "url": "https://lh5.googleusercontent.com/-5JLDS7_WVoU/AAAAAAAAAAI/AAAAAAAAANc/SQqkX0081z4/photo.jpg" } }
Para hacer estas peticiones, necesitamos un API Key.
Por ahora son funciones básicas, pero ya es un avance para estar construyendo aplicaciones simples.
Y a tí ¿Qué se te ocurre hacer con la API?
Enlaces: Lanzamiento del Google+ API | Documentación de la API | Invitaciones a Google+
» Leer más, comentarios, etc...
Variable not found
Reformateo de Javascript en IE9
Septiembre 15th, 2011 - [Enlace local]
Coincidiréis en que leer o depurar una página cuyos scripts han sido minimizados o compactados es un infierno, debido a que la falta de saltos de línea, espacios e indentaciones hace que su lectura sea prácticamente imposible.
Pues bien, resulta que IE9 trae de fábrica una herramienta que nos permite reformatear el código script de una página para hacerlo más legible. Yo no lo conocía, así que aquí lo pongo por si puede ser de utilidad para alguien más.
Lo único que hay que hacer es acceder a la pestaña “Script” de las Developer Tools, desplegar el menú de herramientas y marcar la opción “Formato Javascript”:

Y ahí lo tenemos:

Obviamente no hace milagros; si se han utilizado técnicas de ofuscación o se han modificado los nombres de funciones y variables vamos a seguir teniéndolos igual, pero algo es algo…
Publicado en: Variable not found.
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering / Project Management / Business Process Management
Talent Management
Septiembre 15th, 2011 - [Enlace local]
Como Director de Proyectos y debido al crecimiento de nuestra empresa estoy constantemente en la búsqueda de Talento, el cual nos permita alcanzar los objetivos en la forma adecuada. las personas que laboran en una empresa dejaron de ser recursos, pasaron a ser Capital Humano y es muy importante el poder potencializar sus capacidades a través de la Gestión de Talento.
Aquí una revista especializada en el tema
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering / Project Management / Business Process Management
Business Modelling with UML
Septiembre 14th, 2011 - [Enlace local]
De lectura obligada el siguiente artículo, muy bien redactado, de fácil lectura y comprensión. Como comenta el autor es bueno saber UML pero es mejor saberlo aplicar de la manera mas práctica y entendible, también concuerdo con el que el modelo de un sistema si se desarrolla adecuadamente es una herramienta muy poderosa en el proceso de desarrollo de un sistema.
» Leer más, comentarios, etc...
Bitácora de Javier Gutiérrez Chamorro (Guti) » Programación
Fuentes para programadores
Septiembre 14th, 2011 - [Enlace local]
Cuando programas, y tu pantalla sólo muestra código, una tipografía que esté especialmente diseñada para ser clara de leer, espaciada, y cuadrada, resulta extremadamente útil. Aumentará nuestra productividad, y disminuirá nuestra fatiga mental y ocular. Además, y debido a que la mayoría de editores e IDE, permiten configurar la fuente que se usa para mostrar [...]
Artículos relacionados:
Evolución de los editores para programadores
Fuentes de Buggy Boy
Atom y otras novedades para SPHPBlog
» Leer más, comentarios, etc...
Picando Código
¡Feliz día del programador!
Septiembre 13th, 2011 - [Enlace local]
Hoy 13 de setiembre, el día 256 del año, ¡es el día del programador! Feliz día a todos los pica código, ingenieros, desarrolladores, programadores, hackers, y demás. Es el quinto año consecutivo que mi blog me acompaña en esta aventura que ha sido vivir del código y la programación. Repasemos el concepto:
El día del programador es un “feriado” el 256º día del año celebrado mayoritariamente por programadores de computadora. La fecha es significativa para los programadores porque 256 = 28, la cantidad de valores representables en un byte de datos.
Aprovecho el día para repasar un poco cómo han ido las cosas. Festejándolo con Picando Código:
Día del programador 2007
Programando en el trabajo con .NET, y algoritmos en C en casa.
Día del programador 2008
Mucho código Java
Día del programador 2009
Tras unos meses trabajando en gestión, me reivindiqué como programador volviendo al código con PHP y jQuery. Terminé el año viviendo en Montevideo ![]()
Día del programador 2010
Mi primer año trabajando en Globant, segundo año en Montevideo. En las oficinas de Globant Montevideo celebramos el día del programador con cerveza, refrescos, papitas y una conferencia de Pablo Brenner sobre aplicar metodologías a la innovación.
Este año puedo decir que he aprendido algo de Spring, Android y seguí por mi cuenta con Ruby. Tuve una oportunidad para un proyecto en GWT pero al final no salió, y ahora estoy viendo por dónde sigue la cosa. ¿Cómo lo vienen festejando ustedes?
A modo de celebración, dejo un video de la excelente canción de Jonathan Coulton – Code Monkey, con la que muchos se sentirán identificados:
Comparte:
» Leer más, comentarios, etc...
Variable not found
ASP.NET MVC: Binding de enums y EnumDataType
Septiembre 13th, 2011 - [Enlace local]
El pasado mes de julio publicaba el post “Binding de enums en ASP.NET MVC”, donde analizaba los problemas que podían aparecer cuando estamos intentando bindear tipos enumerados y los datos de entrada contienen valores incorrectos, y planteaba una solución basada en un model binder personalizado.
A raíz de dicho post, el amigo Héctor S. (¡gracias!) me envió una interesante pregunta: ¿por qué no utilizar la anotación System.ComponentModel.DataAnnotations.EnumDataType para ello?
Y la respuesta corta es: pues también se podría. Con sus particularidades, pero sería posible controlar los valores de entrada a un enum usando esta anotación.
Empecemos por el principio. EnumDataTypeAttribute es una anotación introducida en .NET 4 que nos permite indicar que una propiedad (no necesariamente de tipo enum) admite exclusivamente valores definidos en un enumerado. Mejor lo vemos con algo de código:
public enum Sexo
{
Hombre = 1,
Mujer = 2
}
[EnumDataType(typeof(Sexo))]
public int Sexo { get; set; }
En el ejemplo anterior observamos una propiedad
Sexo de tipo int, lo que le permite virtualmente alojar cualquier valor entero posible. Sin embargo, el hecho de decorarla con el atributo EnumDataTypeAttribute y asociarla a la enumeración Sexo hará que en la validación de la entidad su valor sea considerado incorrecto si éste no pertenece a los permitidos en ella, en este caso, 1 y 2.Su uso es interesante, por ejemplo, como método para acercar representaciones de la información. Por ejemplo, si la propiedad
Sexo está mapeada hacia un campo de base de datos, es bastante habitual que éste sea de tipo entero, por lo que el hecho de declararla en la entidad como int facilita el movimiento de datos entre uno y otro. Al decorarla con EnumDataType lo que hacemos simplemente es asegurar que contendrá un valor correcto conforme al enumerado, pero ojo, siempre que la entidad sea validada considerando sus anotaciones (como ocurre durante el binding).Y volviendo al tema del post, entonces, ¿por qué no utilizamos este método para asegurar la validez de los datos en el post al que hacía referencia, en lugar de montar un binder personalizado?
Pues el motivo principal sería la pereza. Realmente, me parece demasiado trabajoso el tener que decorar cada propiedad
enum del modelo con una declaración tan redundante como la siguiente: public class Persona
{
public string Nombre { get; set; }
[EnumDataType(typeof(Sexo))]
public Sexo Sexo { get; set; }
...
}
A ver, si estoy declarando una propiedad de tipo
Sexo, me resulta pesado tener que decirle algo más arriba que ésta es un tipo de datos enumerado de tipo Sexo.Pero bueno, salvando este incómodo detalle,
EnumDataType es una buena fórmula para controlar la corrección de los valores de entrada, y sobre todo muy cómoda si la propiedad parámetro a actualizar es de un tipo no enum, como un int:. [EnumDataType(typeof(Sexo))]
public int Sexo { get; set; }
Su uso aporta, además, otras posibilidades interesantes. Por ejemplo, sería posible crear editores personalizados sobre el tipo
int que, basándose en este atributo, mostraran a nivel de vista desplegables u otros controles de selección de forma automática.Es importante tener en cuenta que, a diferencia de mi enfoque, la comprobación del atributo se realiza durante el proceso de validación, que es posterior al binding en sí. La ventaja de esto es que se integra de forma natural en dicho proceso (por ejemplo, ModelState.IsValid retornará falso si hemos intentado introducir un "3" en Sexo), pero también pueden producirse errores previos generados por el propio binder si no es capaz de realizar la transformación de forma automática (por ejemplo, al intentar un valor textual no presente en la enumeración, como 'Gato'), que de la otra forma sí sería posible controlar.
Publicado en: Variable not found.











