Noticias Weblogs Foros Wiki Código

Meta-Info

¿Que es?

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

rss subscripción

Sponsors

Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
planetacodigo

planetacodigo

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

Idea: Juanjo Navarro

Diseño: Albin

Picando Código

Script en Ruby para sorteos

Julio 31st, 2011 - [Enlace local]

Ruby

Ruby

Una de las excusas para realizar el sorteo de Picando Código fue programar algo que me diera los nombres de los ganadores al azar.

El lenguaje elegido no podía ser otro que Ruby, mi lenguaje “hobby” favorito. Digo “hobby” ya que lo vengo estudiando y usando para cosas personales desde hace un tiempo, pero no he tenido la oportunidad de trabajar con Ruby. Bah, esto era cierto hasta que toqué mi primer código Ruby por trabajo. Fue simplemente modificar un poco un script, pero se sintió bien :D

Volviendo al tema del script en cuestión, les comento un poco cómo se fue desarrollando. En principio no tenía pensado un diseño, así que lo primero que hice fue ponerme a programar y probar cosas con Ruby. Obviamente al no usarlo todo el tiempo, es un lenguaje donde siempre estoy descubriendo cosas, y esto en parte es lo que lo hace tan divertido (además de haber sido diseñado para eso).

Una de las primeras ideas con el script era que los participantes a través de los comentarios en el post sobre el concurso, debían ser ingresados automáticamente. No tenía sentido copiar y pegar los nombres de a uno, así que empecé por ahí. Lo mismo con los tweets y dents. Mantuve una página actualizada con esa info.

Ejecutar comandos del sistema con Ruby

Lo primero que busqué fue cómo ejecutar un comando del sistema desde un script en Ruby. Para descargar las páginas, pensé en usar wget, y posteriormente procesarlas. Me encontré que ejecutar un comando del sistema es bastante sencillo, simplemente hay que encerrarlo entre comillas invertidas: ``

    puts '*     Descargando comentarios de la entrada    *'
    `wget http://picandocodigo.net/2011/concurso-en-picando-codigo/ -O comentarios.html`
    puts '*          Descargando tweets y dents          *'
    `wget http://picandocodigo.net/concurso-picando-codigo-tweets-y-dents/ -O tyd.html`

Fue así que se guardaron dos archivos html cuyo nombre definí con el parámetro -O de wget, para trabajar con su información más adelante.

Procesar HTML con Ruby

Ahora que tenía el HTML con la info, necesitaba procesarlo. En un trabajo anterior había pasado por la experiencia de procesar HTML. Creo que en su momento probé algo con Perl, aunque al final grilix se convirtió en el PerlMaster, y más adelante usé algo en PHP. En algún momento incluso hice la prueba de procesar HTML con expresiones regulares. La experiencia y lectura me han llevado a entender que pedirle a las expresiones regulares que parseen HTML arbitrario es como pedirle a Paris Hilton que escriba un sistema operativo. Así que me puse a buscar un parser.

Una búsqueda rápida sobre el tema me llevó a la siguiente conclusión (basada únicamente en la información obtenida en una mirada rápida a los resultados de búsqueda):
Hay dos parseadores de HTML en Ruby que son bastante populares: Hpricot y Nokogiri. El primero se ha convertido en “el estándar” en el mundillo Ruby. El segundo vino después y se promociona como más rápido y mejor que el primero.

¿Cuál elegir? En mi caso, elegí Nokogiri porque uno de sus responsables es Aaron Patterson (@tenderlove) y me cae bien. Como ven soy muy objetivo con las características técnicas de una biblioteca a la hora de incluir una en mi código…

Nokogiri (?) es un parseador HTML, XML, SAX, y Reader. Entre sus muchas características está la habilidad de buscar documentos a través de XPath o selectores CSS3.

XML es como la violencia – si no soluciona tus problemas, no lo estás usando lo suficiente.

La elección resultó bastante buena,  ya que a los pocos minutos de instalar Nokogiri ya tenía el código listo para parsear el HTML y obtener los nombres de los usuarios que comentaron en la entrada. El código es muy similar al de algunos ejemplos que pueden ver en el sitio web de Nokogiri, o el post en el blog de tenderlove:

    f = File.open("comentarios.html")
    comentarios_web = Nokogiri::HTML(f)
    f.close
 
    @participantes = []
    comentarios_web.css("p.author").each do |n|
      @participantes.push n.text
    end

Para sacar los usuarios por tweet, la solución fue mucho más sucia, agarré todos los enlaces de la página, y si su texto comenzaba con “@”, lo guardaba como nombre de usuario twitter/identi.ca:

    comentarios_td.css("a").each do |com|
      if com.text =~ /^@/
	n = com.text
	@participantes.push n
	i+=1
      end
    end

Esto fue lo “nuevo” que aprendí, además de varias cosas -que se harían bastante obvias para un programador Ruby- que uno va encontrando en el lenguaje. Voy a ir mejorando el script de a poco, ya que el sorteo estuvo muy bueno como para realizar nuevas ediciones y tiene varios bugs para arreglarle:

En fin, si a alguien le interesa ver el código completo de sorteo.rb, pueden verlo en github, descargarlo, reírse de él, o usarlo para leer en el baño.

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

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

Viricmind Labs

Validación de NIFs, NIEs, DNIs y CIFs en PHP

Julio 30th, 2011 - [Enlace local]

Hará unas dos semanas estuve lidiando con cierta porción de código dedicada a la validación de NIFs, NIEs, DNIs y CIFs para dificultar fraudes y "suciedad" en la base de datos que usa cierta aplicación que estoy desarrollando para la Facultad de Economía y Empresa de la Universidad de Barcelona. Tengo que decir que lo más difícil no fue programar, sino encontrar la información, que se haya en gran medida de forma dispersa a través de la red, y peor aun, en muchos casos es incorrecta.

Conviene destacar que gran parte de la dificultad de encontrar esa información está ligada a los sucesivos cambios legislativos (el último fue en 2008!), el poco interés que despierta en la "clase programadora", y la escasa reflexión de los primeros diseñadores del sistema de numeración del DNI.

Bien, después de pelearme largo y tendido con el problema, acabé encontrando todo lo que necesitaba, y aquí podéis ver el resultado, para que no tengáis que perder el tiempo buscando en mil y un lugares diferentes:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
	// Función auxiliar usada para CIFs y NIFs especiales
	private function getCifSum ($cif) {
		$sum = $cif[2] + $cif[4] + $cif[6];
 
		for ($i = 1; $i<8; $i += 2) {
			$tmp = (string) (2 * $cif[$i]);
 
			$tmp = $tmp[0] + ((strlen ($tmp) == 2) ?  $tmp[1] : 0);
 
			$sum += $tmp;
		}
 
		return $sum;
	}
 
	// Valida CIFs
	// El código comentado es para usar en modelos de CakePHP
	protected function validateCif ($cif /*$check*/) {
		$cif_codes = 'JABCDEFGHI';
 
		// $cif = array_pop ($check);
 
		$sum = (string) $this->getCifSum ($cif);
		$n = (10 - substr ($sum, -1)) % 10;
 
		if (preg_match ('/^[ABCDEFGHJNPQRSUVW]{1}/', $cif)) {
			if (in_array ($cif[0], array ('A', 'B', 'E', 'H'))) {
				// Numerico
				return ($cif[8] == $n);
			} elseif (in_array ($cif[0], array ('K', 'P', 'Q', 'S'))) {
				// Letras
				return ($cif[8] == $cif_codes[$n]);
			} else {
				// Alfanumérico
				if (is_numeric ($cif[8])) {
					return ($cif[8] == $n);
				} else {
					return ($cif[8] == $cif_codes[$n]);
				}
			}
		}
 
		return false;
	}
 
	// Valida NIFs (DNIs y NIFs especiales)
	// El código comentado es para usar en modelos CakePHP
	protected function validateNif ($nif /*$check*/) {
		$nif_codes = 'TRWAGMYFPDXBNJZSQVHLCKE';
 
		// $nif = strtoupper (array_pop ($check));
 
		$sum = (string) $this->getCifSum ($nif);
		$n = 10 - substr($sum, -1);
 
		if (preg_match ('/^[0-9]{8}[A-Z]{1}$/', $nif)) {
			// DNIs
			$num = substr($nif, 0, 8);
 
			return ($nif[8] == $nif_codes[$num % 23]);
		} elseif (preg_match ('/^[XYZ][0-9]{7}[A-Z]{1}$/', $nif)) {
			// NIEs normales
			$tmp = substr ($nif, 1, 7);
			$tmp = strtr(substr ($nif, 0, 1), 'XYZ', '012') . $tmp;
 
			return ($nif[8] == $nif_codes[$tmp % 23]);
		} elseif (preg_match ('/^[KLM]{1}/', $nif)) {
			// NIFs especiales
			return ($nif[8] == chr($n + 64));
		} elseif (preg_match ('/^[T]{1}[A-Z0-9]{8}$/', $nif)) {
			// NIE extraño
			return true;
		}
 
		return false;
	}

Además, aquí tenéis la lista de fuentes en las que me he basado. En primer lugar las no oficiales, comentadas para indicar las que no me parecen de fiar, porque eso también puede llevar quebraderos de cabeza.

  1. http://es.wikipedia.org/wiki/Número_de_identificación_fiscal (información incompleta)
  2. http://es.wikipedia.org/wiki/Código_de_identificación_fiscal (información incompleta)
  3. http://compartecodigo.com/javascript/validar-nif-cif-nie-segun-ley-vigente-31.html (a mi entender, tiene fallos)
  4. http://sourcecookbook.com/en/recipes/36/validacion-automatica-de-cif-nif-y-nie-segun-la-ultima-legislacion-j-query (otro con bastantes fallos)
  5. http://menudoproblema.es/blog/entries/2011/01/05/como-realizar-la-validacion-de-un-cif-en-python/ (incompleto, pero inspirador)
Sobre fuentes oficiales, una serie de artículos del BOE que dan cuenta de la evolución de la legislación referente a esos códigos identificativos:
  1. http://boe.es/boe/dias/1975/10/22/pdfs/A22177-22178.pdf
  2. http://boe.es/boe/dias/1987/12/24/pdfs/A37785-37839.pdf (artículo 113)
  3. http://boe.es/boe/dias/1990/03/14/pdfs/A07256-07259.pdf
  4. http://boe.es/boe/dias/2007/09/05/pdfs/A36512-36594.pdf
  5. http://boe.es/boe/dias/2008/02/26/pdfs/A11374-11376.pdf
Los dos últimos son los más interesantes por ser los más nuevos, aun así, la lista de documentos oficiales relativos al asunto es mucho más extensa, y se podría completar a través de las referencias hechas a los que faltan en los que yo he enlazado.
Bien, espero que esto pueda resultar de ayuda a alguien.

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

Buayacorp

No puedo encontrar mysql al instalar Drupal 7

Julio 29th, 2011 - [Enlace local]

Hace ya unos años estoy trabajando fuertemente con Drupal 6, sólo hace unas semanas he empezado a usar la versión 7 y me parece un avance excelente. Poco a poco estaré publicando información relacionada a Drupal.

Instalando Drupal 7 bajo Windows y Apache he encontrado que no me da la opción de usar MySQL:

Instalación Drupal y MySQL

Esto es porque ahora Drupal 7 tiene como requerimiento el uso de la extensión PDO, además que requiere MySQL 5.015 o mayor.

Para solucionarlo, sólo debemos abrir el archivo php.ini, buscar y descomentar las líneas que permiten el uso de estas extensiones:

;extension=php_openssl.dll
extension=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll

Reiniciamos Apache y listo:

Instalación Drupal y MySQL

Es posible que tengas algunos otros errores, si es así, los comentarios están abiertos

Por cosas pequeñas y sencillas... :)

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

Picando Código

Feliz día del SysAdmin

Julio 29th, 2011 - [Enlace local]

It's fixed. SysAdmins used strong magic

It's fixed. SysAdmins used strong magic!

Hoy es el día del reconocimiento del Administrador de Sistemas, o conocido más cariñosamente como SysAdmin. Es el día para ser agradecidos y reconocer el trabajo de los SysAdmin. Como dice en el sitio oficial del evento:

Un sysadmin es un profesional, quien planea, se preocupa, hackea, arregla, empuja, aboga, protege y crea buenas redes de computadora, para obtener tus datos, ayudarte a hacer tu trabajo – para traer el potencial de la computación más cerca a la realidad.

En Buenos Aires se organizó el AdminFest, una fiesta para celebrar el día del SysAdmin. Están llevando adelante una campaña por la elección del root, y los contendientes son UDP y TCP, cada uno con sus pros y contras. ¡Visiten el sitio para conocer más! (me hubiera gustado ir :( )

Aprovechen el día para abrazar o dar un regalo a su SysAdmin más cercano :)

Más:
20 cosas que aprendí como Administrador de Sistemas

 

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

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

Cuaderno de software

CRC Cards – Antipatterns

Julio 27th, 2011 - [Enlace local]

Dentro de la profundización en las reglas XP,  me da la sensación de que no se habla mucho de las CRC Cards. Las CRC Cards están consiguiendo hacer por mí lo que el UML siempre prometió: ayudarme a diseñar de manera visual la relación entre mis clases. Y, sobre todo, son una herramienta estupenda de discusión a la hora de implementar un diseño…

Cómo se ve una CRC Card:

Antipatrón1:

la descripción de la responsabilidad de la clase es muy larga: ¿no será que son varias responsabilidades? Quizá podamos sacar parte de esa responsabilidad a un colaborador.

 

Antipatrón 2:

La clase tiene más de dos colaboradores. ¿No será que no estamos eligiendo mal el nivel correcto de abstracción?

 

Antipatrón 3:

Las clases y sus colaboradores implementan relaciones circulares. ¿Se puede establecer una jerarquía y decir qué está arriba y qué abajo?

 

Bueno, pues he aquí una de mis pedradas a día de hoy. Aquí la dejo pro si alguien quiere aportar algo… :-)


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

Cuaderno de software

Responsabilidades de un controller (pequeño esquema)

Julio 27th, 2011 - [Enlace local]

A raiz de la Melee sobre Clean Code de la semana pasada, un colega meleero me envió parte del código que está desarrollando para echarle un vistazo. Lo primero a por lo que quise atacar fueron los controllers. Y es que uno de las revelaciones de esta temporada ha sido para mí: “los controllers son clases, las clases tiene que tener una sola responsabilidad, los controllers tienen que tener una sola responsabilidad“. Si es que ya lo dice el tío Bob:

El caso es que dándole un par de vueltas me he hecho un esquema que me ha ayudado a pensar qué hace un controller exactamente…

Por si a alguien le sirve para algo.. o le apetece discutirlo en los comentarios… :-)


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

Picando Código

Humble Indie Bundle 3: Juegos sin DRM al precio que quieras

Julio 26th, 2011 - [Enlace local]

A estas alturas es tremenda alegría tener que postear sobre una nueva entrega del Humble Indie Bundle. Este paquete de videojuegos de estudios independientes, viene llevando la bandera de la revolución en la industria de venta de videojuegos.

Humble Indie Bundle 3

Humble Indie Bundle 3

El primer paquete humilde de videojuegos tuvo un éxito tal que decidieron liberar el código de los juegos. Volvieron para una segunda entrega con un éxito similar, y se sumó el estudio Frozenbyte con su paquete con todo su material. El paquete se puede comprar por el precio que elijas, pagando con PayPal, Amazon o Google Checkout. Además, las ganancias pueden ir a dos caridades: Child’s Play y EFF.

Los juegos de esta ocasión son Crayon Physics Deluxe, Cogs, VVVVV, Hammerfight y And Yet It Moves.

Juegos Humble Indie Bundle 3

Juegos Humble Indie Bundle 3

Al momento de escribir esta entrada, se han vendido casi 60.000 paquetes, con una recaudación de casi U$S 260.000, por lo que podemos suponer que la cifra del millón de dólares será alcanzada a las risas en esta ocasión. Hay una estadística bastante marcada y que se sigue manteniendo con cada Bundle, la cantidad de dinero que pagan los usuarios de los 3 sistemas operativos principales. Los usuarios de GNU/Linux seguimos siendo los que desembolsamos más por estos juegos. En este momento los promedios vienen así:

Entren ya en Humble Indie Bundle, elijan su precio, cómo repartir los dólares, y comiencen con la descarga de estos juegos. Sean parte de esta nueva tradición que desafía los modelos de negocio antiguos de distribución de contenidos. Pueden apoyar el desarrollo de estudios independientes de videojuegos o donar su dinero a la caridad.

Ya contaré qué tal están después de probarlos. Les dejo el video presentación para que vean algunas imágenes de los juegos:

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

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

Buayacorp

jQuery Boilerplate: empieza a escribir tus propios plugins de jQuery

Julio 26th, 2011 - [Enlace local]

Boilerplate constructor de plugins jQuery

Si estás interesado en construir plugins jQuery, Boilerplate te da una plantilla lista para empezar.

El código está comentado de tal manera que peudas empezar fácilmente. No sólo servirá para construir un plugin, sino también sirve para entender el comportamiento de otros ya existentes.

Enlace: jQuery BoilerPlate

Fuente: Kabytes

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

Picando Código

Ganadores del primer sorteo de Picando Código

Julio 26th, 2011 - [Enlace local]

¡Terminó el concurso de Picando Código! Ayer escribí un script rápido en Ruby para parsear los comentarios de la entrada original, así como la página con tweets y dents, y elegir ganadores al azar. Otra forma hubiera sido anotar los nombres en papelitos, meterlos en una bolsa e ir sacando. Pero me resultó bastante divertido crear un script para eso. Obviamente no es perfecto, y tiene mucho por mejorar, pero es tan al azar y válido como el método de los papelitos.

AVISO: Por un tema de tiempos, no incluí las opciones de cada participante en cuanto al premio, por lo que todos participaron de todos los premios. Hoy discutí con brAzzi64, @juanobes y @gonchuki sobre el algoritmo para implementar esto, pero salí tarde de trabajar, y la gente se puso impaciente. Así que o sacaba el concurso como estaba, o se me atrasaba un par de horas más. Gracias por la discusión sobre el algoritmo, fue más que interesante, y las disculpas del caso. Para la próxima ya tengo trabajo adelantado :)

Los ganadores son:

Felicitaciones a los ganadores, y gracias a todos por participar. Me estaré contactando con ustedes para enviarle los premios. Hace pocos días me confirmaron dos premios más, que entrarán para un concurso más adelante, así que el script tiene lugar para ser mejorado. Mañana se publica el código del script aprovechando para comentar un poco algunas cosas que aprendí con Ruby.

El concurso en general fue bueno como primer experiencia, prometo seguir haciéndolo ya que mucha gente se prendió a participar. Lo único que puedo adelantar como premio para la próxima es un juego para PC (ninguno de los 2 sorteados en esta ocasión) y más camisetas. Como bien dijo una vez Cerebro: A todo el mundo le gustan las camisetas gratis.

Les dejo el video con la ejecución del script:

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

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

Buayacorp

Screenfly: una herramienta para ver tu sitio en diferentes dispositivos

Julio 25th, 2011 - [Enlace local]

Ver tu sitio web en diferentes dispositivos

Para los diseñadores y preocupados de que su sitio se vea bien, Screenfly es una herramienta gratuita que permite ver tu sitio web en diferentes dispositivos con las siguientes opciones:

Si te interesa también ver tu sitio en diferentes navegadores o sistemas operativos puedes usar Browsershots.

Visto en Webresourcesdepot.

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

Variable not found

Shutting down

Julio 21st, 2011 - [Enlace local]

MallorcaParecía que no iban a llegar nunca, pero por fin tenemos aquí las vacaciones :-). Es el momento de dejar el motor en ralentí, descansar un poco, renovar energías y disfrutar de la familia y la buena compañía, esos a los que durante el año no podemos prestarles toda la atención que merecen.



¿Y qué planes tenemos? Pues inmejorables. :-)



Este año vamos a tener la fortuna de poder pasar unos días en Mallorca, una isla que tengo muchas ganas de visitar, y donde seguro que vamos a disfrutar de lo lindo. Todo el mundo que la conoce no duda en calificarla como una auténtica maravilla, así que estamos ya locos por hacer las maletas y montarnos en el avión :-)



También, al igual que en ocasiones anteriores, pasaremos unos días en Sanlúcar de Barrameda, un pueblo que ya nos cautivó hace años y al que seguimos acudiendo cada verano a disfrutar de sus playas, sus calles, su gastronomía y todo lo que le rodea. Y por último, probablemente nos dejemos caer algunos días por El Portil, otro enclave costero al que solemos ir a descansar cada verano y algunos fines de semana (como el del viaje con sorpresa ;-)).



Así pues, dejo el blog con el piloto automático hasta el inicio de la nueva temporada, allá por finales de agosto o principios de septiembre, cuando volveremos con las pilas recargadas, los ánimos a tope y totalmente listos para afrontar el año con ganas e ilusión.



¡Felices vacaciones, amigos! :-)



PD: Como de costumbre, cierro los comentarios anónimos para que los spammers no se ceben en ellos y conviertan variablenotfound.com en un festival de enlaces a sitios inapropiados ;-)



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

Fetishcode

Columnas dobles en tablas

Julio 21st, 2011 - [Enlace local]

A

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

Variable not found

Roadmap de ASP.NET MVC 4

Julio 20th, 2011 - [Enlace local]

ASP.NET MVCHace unos días Phil Haack anunció la publicación del Roadmap de ASP.NET MVC 4, un documento muy esperado por la comunidad de desarrolladores que plasma las líneas maestras que guiarán el diseño de la nueva versión del framework.



Y aunque suene a chiste, esta vez viene con retraso; hasta ahora, cada lanzamiento de la plataforma iba acompañado por la actualización del roadmap de la siguiente revisión del producto, es decir, nada más aparecer la versión X ya sabíamos hacia dónde se dirigirían los esfuerzos para la versión X+1. En esta ocasión hemos tenido seis meses (!) para asentar la v3 antes de empezar a pensar en la 4.



Ya hemos comentado en otras ocasiones que este ritmo no es fácil de digerir ni por la comunidad de desarrolladores ni por el mercado, e incluso supone un hándicap para la difusión y generalización del uso de la plataforma, pero bueno, es lo que hay.



Otro tema también bastante criticado es la facilidad con que MVC incrementa sus números de versión, cuando realmente las novedades ofrecidas en cada lanzamiento no parecen merecer tal distinción. Días atrás comentaba el amigo Eduard Tomás vía Twitter, y no puedo estar más de acuerdo, que MVC 3 probablemente podría haber pasado perfectamente por MVC 2.1. De hecho, si os fijáis, bastantes de sus novedades más destacables (como Nuget, Razor o los Helpers) poco o nada tienen que ver con el framework MVC en sí. Y quizás con la llegada de las tools update podríamos haberlo estirado hasta la 2.2, aunque en realidad se trataba de una mejora sobre las herramientas de Visual Studio.



No sé, a veces parece que se trata simplemente de una carrera para poder igualar la numeración de versiones con la plataforma, es decir, llegar a hacer coincidir el lanzamiento de ASP.NET MVC 5 con la propia plataforma ASP.NET 5 y la entrada por la puerta grande de HTML 5. Desde luego no sería mala cosa, al menos se relajaría un poco la actual fiebre de lanzamientos de releases que sufrimos ;-)



Pero bueno, disertaciones filosóficas aparte, la verdad es que la aparición de pistas sobre lo que incluirá una nueva revisión del producto siempre es interesante. En esta ocasión, bajo el ambicioso objetivo general de “hacer de ASP.NET MVC la mejor plataforma para la creación de aplicaciones ricas y modernas para la web”, el nuevo roadmap incluye las líneas maestras y características que, a día de hoy, están siendo consideradas para MVC 4 y vale la pena echarle un vistazo.



Aunque como bien se indica se trata de un documento muy preliminar y con toda seguridad sufrirá muchas modificaciones, ya se dejan entrever las herramientas que tendremos a nuestra disposición en unos meses, y que paso a comentar.



Y empezamos por recipes (¿recetas?), una de las novedades especialmente destacadas en el roadmap. Según se describe en éste, los recipes son cuadros de diálogo distribuidos a través de Nuget, que contienen tanto el interfaz de usuario como la lógica de generación de código que automatice determinadas tareas frecuentes y que actualmente no pueden realizarse de forma sencilla.



Un escenario descrito en el mapa de rutas podría ser la inserción de un grid Ajax. Actualmente debemos implementar la vista, acciones en el controlador que retornen datos de forma asíncrona, y sus correspondientes clases en el Modelo. El uso de un “recipe” en este caso podría ayudarnos a generar estos elementos de forma automatizada, atendiendo a los parámetros indicados a través de un cuadro de diálogo.



Prototipo de pantalla de selección de RecipeEn cierto sentido, es similar a lo conseguido con la última actualización de herramientas para MVC3 en cuanto a la generación de andamiaje de escenarios CRUD; antes podíamos generar todos los elementos utilizando scaffolding, pero ahora se hace de forma integrada en el proceso de creación de controladores y desde el propio IDE.



Otro aspecto muy interesante de las recipes es que serán fáciles de crear gracias a su API simplificado. Obviamente, el objetivo no es otro que hacer que sea la propia comunidad de desarrolladores la que amplíe el “recetario” que vendrá de serie con el producto, de la misma forma que ocurrió con Nuget.



Como idea para incrementar la productividad, me parece muy acertada; de hecho, seguro ya que habíais echado en falta algo similar para simplificar la generación de código en vuestros escenarios habituales. Habrá que ver cómo se plasma en el producto para ver si realmente nos ayuda en nuestro trabajo, y cómo se enfocan algunas cuestiones como el soporte para las versiones Express (que supongo que existirá, pero habrá que verlo), las capacidades reales de generación de código de la herramienta, o la disponibilidad de utilizar las mismas funciones desde línea de comandos para los virtuosos del teclado.



En cualquier caso, sí es curioso que una de las principales novedades de MVC 4 vaya a ser algo prácticamente ajeno a la plataforma, como en su momento fue Nuget. Esto supongo que indica que, como en aquel caso, se trata de algo que probaremos primero los desarrolladores de MVC y que más adelante, si prospera la idea, podrán disfrutar desde otras plataformas.



Vistas específicas para dispositivos móviles

Cambiando de tercio, también entra en escena de forma muy destacable el soporte para dispositivos móviles. Están previstos cambios simples en la plantilla inicial de proyectos MVC, la creación de nuevas plantillas específicas para proyectos de aplicaciones móviles con layouts, vistas y scripts (jQuery Mobile), o la creación de vistas específicas para estos dispositivos.



Por otra parte, el soporte para HTML5, ya tímidamente introducido en la reciente tools update, tomará ahora mayor fuerza, al incorporarse a nivel de controles de edición. De esta forma, se podrá aprovechar la potencia de la nueva versión del lenguaje de marcado para la creación de formularios con controles específicos para la introducción de fechas, valores numéricos, etc. No es nada que no pueda hacerse a día de hoy, pero sin duda es una buena noticia el traerlo ya de fábrica.



También los controladores asíncronos se van a ver beneficiados de una importante simplificación gracias al uso de las clases de procesamiento en paralelo y de las futuras mejoras de C# 5 (¡vaya, otra versión 5! ¿coincidencia?). Hasta ahora, el uso de la asincronía en las acciones, aunque eficaz, resultaba algo engorrosa; en MVC 4, el código de un controlador asíncrono podría ser tan limpio como el mostrado en el siguiente ejemplo:



public async Task<ActionResult> Index(string city) {
    var newsService = new NewsService();
    var sportsService = new SportsService();
    
    return View("Common",
        new PortalViewModel {
        NewsHeadlines = await newsService.GetHeadlinesAsync(),
        SportsScores = await sportsService.GetScoresAsync()
    });
}


MVC 4 también integrará mecanismos para comprimir y empaquetar archivos externos de scripts y hojas de estilo con objeto de minimizar el ancho de banda y, por tanto, los tiempos de descarga de los mismos. De nuevo, no es algo revolucionario porque hoy en día existen soluciones para ello.



Se pretende también mejorar la construcción de helpers Razor. En la versión actual, los helpers que introducimos en la carpeta App_Code son funcionalmente válidos, pero les falta integración con la plataforma. Por ejemplo, desde ellos no es posible acceder al contexto de la vista, y esto puede resultar bastante molesto.



Y por cierto, respecto a Razor, comenta Phil Haack en su blog que de forma paralela se introducirán novedades en Razor y Webpages que podremos aprovechar desde MVC, como ocurre ahora, aunque no ha desvelado ninguna de ellas.



Por último, el roadmap recoge más novedades agrupadas como las siguientes, de las que se aportan únicamente los titulares:

En definitiva, aunque se plantean algunas ideas muy interesantes, sigo echando muy en falta un mayor soporte para la globalización, un aspecto bastante descuidado en MVC, más y mejores helpers o componentes de serie, las esperadas áreas móviles (áreas en proyectos independientes, cuya necesidad no sé aún si puede ser cubierta con las recipes) y muchos detallitos de los que facilitan el trabajo en el día a día.



En cualquier caso, ya estoy deseando tener a mano alguna preview sobre la que poder ver estas ideas materializadas y poder opinar con mayor conocimiento de causa.



Enlaces:



Publicado en: Variable not found.



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

Variable not found

Enlaces interesantes 49

Julio 18th, 2011 - [Enlace local]

Estos son los enlaces publicados en Variable not found en Facebook y Twitter desde el domingo, 10 de julio de 2011 hasta el lunes, 18 de julio de 2011. Espero que te resulten interesantes. :-)

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

Google code soporta git

Julio 18th, 2011 - [Enlace local]

Google Code soporta git.

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

Picando Código

El atraso en los videojuegos libres

Julio 16th, 2011 - [Enlace local]

Un área del software que parece tener un estigma en el mundo utópico que muchos imaginamos donde todo el software es libre, son los videojuegos. Siempre que recibo una pregunta en este sentido -y tengo ganas de contestar porque no viene con intención de armar un flamewar-, comento que el tema viene por un cambio de cabeza. Mucha gente discute sin embargo que no existe una manera viable de desarrollar videojuegos libres, así como se ha dicho antes del software libre en general.

Los modelos de negocio usados en la industria de distribución de videojuegos, música y demás obras artísticas se están quedando antiguos. De a poco van surgiendo nuevas formas de recaudar que patean el tablero, reinventan la industria, y permiten a los creadores mantenerse de maneras alternativas. El crowd-sourcing, el modelo de pago por suscripción o el “paga lo que quieras” -entre otros- son nuevos modelos que de a poco se van imponiendo en la industria de la música, el cine, y eventualmente en el de los videojuegos.

Estos fenómenos se vienen dando entre otras cosas gracias a la evolución de las comunicaciones y seguramente en parte gracias a la divulgación de las filosofías inspiradas en el software y la cultura libres.

Les dejo a continuación un artículo publicado en el boletín de la Free Software Foundation que discute este tema, y concuerda con mi punto de vista de las cosas :)

Hay una categoría de software que puede ser vista insostenible como software libre: Los videojuegos libres se han quedado atrás de otras áreas del software libre, y las razones detrás de esto son bastante simples.

GNU Go

GNU Go

Aun así, incluso muchos defensores del software libre pueden fallar al brindar una respuesta a aquellos que son escépticos sobre la viabilidad de los juegos libres. Mientras que es cierto que el software debería ser ético, los videojuegos no deben sufrir por eso. Los modelos de negocios para la producción simplemente deben cambiar, y así como lo han hecho para otro software, lo harán para los juegos también. Cuando la gente te pregunta cómo los juegos como los conocemos pueden existir en un mundo de software libre, debería abrir tu respuesta con, “No pueden, pero puede mejorar.”

Hay una tendencia natural en el software libre de atacar aspectos más esenciales de la computación en primer lugar. Si bien es subjetivo, está claro que los juegos no son una prioridad primaria y, como tal, no han avanzado tan rápidamente como por ejemplo, los navegadores web o procesadores de texto. Eso no quiere decir que no se haya progresado. En realidad, los juegos libres han ido poniéndose al día, pero llevará un tiempo sobrepasar la calidad de los juegos privativos. Esto no debería ser sorprendente o alarmante. Llegaremos a buen tiempo. Mientras el software libre se sigue propagando, crecerá el interés por los juegos libres, y la falta de entendimiento sobre como estos juegos se puedan mantener no debería -y no necesita- ser una razón de hacer de los videojuegos una excepción en el software libre.

GNU Freedink

GNU Freedink

El estado de los juegos no-libres se ha deteriorado tanto, que un esfuerzo llamado The Humble Indie Bundle se lanzó para vender juegos que no forzaran a usar una plataforma en particular, y no usaran DRM. A través de un simple modelo paga-lo-que-quieras, los contibuyentes pusieron un total de $1.2 millones porque tanta gente está desesperada por escapar de las normas que han evolucionado del mundo del software privativo. Aunque no había sido prometido, luego de un éxito tan amplio, la mayoría de los juegos en el paquete fueron lanzados como software libre. Hay un interés claro en lo que ofrecen los juegos software libre, y gradualmente hay más y más esfuerzos para producir estos juegos libres.

Siempre es gracioso enfrentar los mismos argumentos que se han presentado al movimiento de software libre y refutado completamente en la práctica (ej. ¿Por qué alguien produciría software libre?). Los posibles incentivos para crear juegos libres son tan numerosos como las motivaciones para producir otro software libre. Tal vez una empresa de hardware gráfico quiere financiar el desarrollo de un juego para mostrar las capacidades de su hardware. Tal vez un hospital quiera financiar una manera disfrutable de que sus cirujanos mejores su destreza. Tal vez una escuela quiera financiar una suite de juegos educativos para sus estudiantes. Tal vez una liga competitiva de juegos quiera financiar su propio juego para campeonatos. Ya hay varios ejemplos notables de juegos libres que están probando que se pueden construir modelos de negocios entorno a los juegos libres.

Ryzom

Ryzom

A través de una asociación con la Free Software Foundation, Winch Gate Properties Ltd lanzó Ryzom, el juego de rol multijugador masivo en línea, como software libre bajo la AGPL, y su arte como trabajos culturales libres bajo la licencia CC-BY-SA. Como juego en línea, financian su desarrollo a través de la suscripción, así que lanzarlo como software libre solo puede ayudarlos en acercar una comunidad más amplia y ganar contribuciones de quien esté interesado en mejorar su software. Aun así, muchos juegos no requerirán una suscripción, y hay muchas maneras para que esos financien sus desarrollos también.

Las posibilidades no terminan ahí, y con suerte con estos ejemplos se vuelva más claro cómo los juegos libres pueden avanzar con suficiente interés. El mundo de los juegos libres nunca se verá como el mundo de los juegos privativos hoy. No usarán DRM para prevenirte de compartirlos, y no limitarán tu libertad de otra manera. Podemos esperar juegos que no sean lisiados por anticaracterísticas y puedan construir uno sobre el otro para desarrollar mas rápido de lo que lo harían de otra manera. Mientras tanto, deberíamos seguir apoyando los juegos libres y tener confianza en ellos. Deberíamos de hecho tomarlo como una buena señal cuando dudas críticas que alguna vez se levantaron contra el software libre entero son ahora enfocadas en un subconjunto de software. Ahora, la próxima vez que alguien pregunte sobre videojuegos en el software libre, deberíamos tener una buena respuesta para dar.

Texto original de Danny Piccarillo
Via The Free Software Foundation

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

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

Ingenieria de Software / Software Engineering / Project Management / Business Process Management

BPM, ROI y Beneficios

Julio 14th, 2011 - [Enlace local]

Muy buen artículo donde se expone los beneficios de la adopción de una estrategia BPM y la forma de calcular el ROI

http://www.bpminstitute.org/articles/article/article/future-with-bpm-cost-vs-benefits-strategies.html?m=e&s=n&c=edt&k=052611&v=article

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

Ingenieria de Software / Software Engineering / Project Management / Business Process Management

Contrarrestar la resistencia al cambio

Julio 14th, 2011 - [Enlace local]

Poniendo como ejemplo la vida cotidiana se pueden encontrar aprendizajes para la vida profesional

http://www.hbral.com/blog/blog.asp?modulo=2&idBlog=35

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

Variable not found

Lorempixum, imágenes de relleno al instante

Julio 14th, 2011 - [Enlace local]

Como desarrolladores web, seguro que os habéis encontrado muchas veces con la necesidad de incluir texto de relleno en las páginas, y muy probablemente hayáis usado servicios como http://www.lipsum.com/ para generarlos.



LorempixumPues bien, hace poco he dado con Lorempixum, un interesante servicio que nos proporciona algo similar sobre el contenido gráfico: un generador de imágenes de relleno. Y es que, durante nuestro trabajo, también nos viene de fábula tener a mano un buen banco de imágenes clasificadas, con distintos tamaños, y sin problemas de licencia, listas para ser utilizadas en prototipos de sitios web.



Lorempixum

Lorempixum permite dos vías para generar imágenes. La primera de ellas se basa en acudir al sitio web (http://www.lorempixum.com/) y utilizar el pequeño formulario que aparece para indicar los detalles de la imagen que deseamos generar.



Simplemente introduciendo o seleccionando el ancho, alto, la temática (a elegir entre las once disponibles, tales como gente, tecnología, transporte, naturaleza, etc.), y si deseamos que sea en color o escala de grises, el sistema seleccionará y generará automáticamente una imagen totalmente ajustada a nuestras pretensiones :-)



Otra posibilidad es invocar directamente al generador de Lorempixum utilizando URLs en las que introduciremos los parámetros de la imagen a generar. A continuación se muestran algunos ejemplos de llamadas, y el resultado obtenido:



Imagen aleatoria en color de 200px de ancho por 100px de alto

Categoría “Sports”

http://lorempixum.com/200/100/sports/
Imagen aleatoria en grises de 200px de ancho por 100px de alto

Categoría “Sports”

http://lorempixum.com/g/200/100/sports/




(La “g” indica que queremos la imagen en grises)
Quinta imagen en color de 200px x 100px

Categoría “Fashion”

http://lorempixum.com/200/100/fashion/5/
Imagen aleatoria en color de 200px de ancho por 180px de alto

Categoría “City”

Texto sobreimpreso “Variable not found”



http://lorempixum.com/200/180/city/Variable not found/


Obviamente, estas direcciones podemos teclearlas directamente en el navegador para obtener las imágenes, o bien introducirlas como origen de los <img> de nuestras páginas, por ejemplo así:

<img src="http://lorempixum.com/200/180/city" alt=”Ciudad” />


En definitiva, un servicio interesante para no tener que andar por ahí mendigando buscando imágenes de prueba para nuestros prototipos y demostraciones. Imágenes de calidad aceptable, justo del tamaño y temática que necesitamos, y que podemos obtener de forma muy rápida y sencilla.



Publicado en: Variable not found.



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

MadeInFlex

Betas de las nuevas versiones de Flash Player y AIR

Julio 14th, 2011 - [Enlace local]

Ya tenemos disponibles las betas de Flash Player 11 y AIR 3 en Adobe Labs.
A grandes rasgos podemos decir que se centran en potenciar la innovación en el campo de rich media, mejorar las experiencias con nuevas caracerísticas y conseguir un desarrollo más flexible.
Aquí van los links para que miréis en detalle que nos aportan:
Flash Player 11
AIR 3

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

Buayacorp

Deshabilitar notificaciones de correo electrónico en Google+

Julio 13th, 2011 - [Enlace local]

Generalmente los que tienen una cuenta en Google+ es porque también tienen una cuenta en Gmail. Me parece absurdo que junto a la notificación roja 1 que está en la parte superior, tengamos que recibir también un correo electrónico.

Estoy seguro que muchos ni se han percatado de como deshabilitar esta opción, sin embargo es mucho más fácil de lo que parece

Sólo entramos a https://plus.google.com/settings/plus y empezamos a desmarcar las notificaciones al correo electrónico.

Deshabilitar notificaciones en Google+

Por cosas pequeñas y sencillas...

¿Todavía no tienes una cuenta? Pasa por aquí :)

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

Picando Código

Se largó: Concurso en Picando Código

Julio 13th, 2011 - [Enlace local]

Con motivo del cuarto aniversario de Picando Código, decidí organizar un sorteo para regalarle algunas cosas a los queridos lectores que hacen tan interesante esta experiencia de tener un blog.

Para los premios, decidí regalar cosas que conozco, que realmente me gustaron, y me gustaría que ustedes también puedan disfrutar. Por eso, todos los premios constan de algo que puedo recomendar de primera mano y provienen de empresas o iniciativas cuyos productos o servicios he probado y recomiendo. Para no alargar mucho la cosa, vamos con el concurso empezando por listar los premios:

Camiseta de Picando Código

Yo ya tengo la mía (edición especial con mi usuario de Twitter en la espalda), regalé una (otra edición especial), y debo otra (Luckita te estoy mirando). Habría alguna más para un lector con suerte que participe del sorteo. La camiseta es negra y lleva el honorable logo que identifica a este blog.

Camiseta Picando Código

Camiseta Picando Código

Vale de compra en SplitReason

SplitReason, es una de mis tiendas online favoritas, y mi sitio preferido a la hora de adquirir nuevas camisetas (como mi camiseta de SkyNet). Vende equipamiento para geeks y gamers, y entregará a un ganador un vale por U$S 25 para gastar en la tienda. En el catálogo hay algunas de las mejores camisetas que pueden existir para mujeres, hombres, bebés además de ropa interior, libros, imanes, stickers, tazas y otros coleccionables.

SplitReason Gift Certificate

SplitReason Gift Certificate

Tienen también la tienda oficial de Ctrl+Alt+Del, uno de mis webcomics favoritos, así como Destructoid, Heroes Of Newerth, y más.

Juegos

Gracias a su apoyo, regalo juegos para computadora de estudios independientes que vienen realizando un trabajo sensacional. Estos juegos tienen la imprescindible característica (por lo menos para ganarse el apoyo incondicional de Picando Código) de ser multiplataforma, por lo que funcionan en GNU/Linux, Windows y Mac OS X.

Revenge Of The Titans

Revenge Of The Titans

Revenge of the Titans

Un juego que podría definirse dentro de la modalidad Tower Defence con aspectos de estrategia en tiempo real y gestión del tiempo. Lo reseñe en el blog hace un tiempo: Revenge Of The Titans. Además, tuve el gusto de entrevistar a Cas de Puppy Games, uno de los responsables de este excelente juego.

Actualmente Puppy Games está desarrollando un juego nuevo. Aprovecho para comentarles de su Ultra Bundle. Este paquete incluye 3 juegos del estilo retro-pixelado moderno que los caracteriza: Ultraton + Titan Attacks + Droid Assault y lo pueden comprar por la irisoria suma de U$S 4.97.

Oil Rush

Oil Rush

Oil Rush

Otro ganador se lleva una clave de activación para descargar el juego Oil Rush. Oil Rush es un juego de estrategia naval en tiempo real con toques de Tower Defence. Ya lo comentamos en Picando Código, y se entrega como premio cortesía de Unigine Corp.

Como comentaba en el post al respecto, está programado sobre el motor Unigine desarrollado por Unigine Corp. Este motor soporta OpenGL 4.0 y DirectX 11, por lo que funciona de manera nativa tanto en sistemas operativos Windows con DirectX como en GNU/Linux con OpenGL. También estará disponible para Mac OS X y PlayStation 3.

La clave de activación da acceso por el momento a los builds para Windows, GNU/Linux y Mac OS X. Con suerte iremos armando de a poco una comunidad online de videojugadores de OilRush de habla hispana :)
Sitio oficial de Oil Rush.

Cómics uruguayos

Armé unos paquetes de cómics que me gustaron en mi cabeza, me contacté con los autores, y estuvieron de acuerdo :)
Son dos paquetes de autores nacionales, ambos incluirán los 2 números publicados hasta el momento de GAS3K, y el crossover entre los universos creados por Dragon Comics y Ninfa Comics: Freedom Knights en Ciudad Fructuoxia. Además de unos excelentes aportes a su colección, los cómics tendrán valor agregado ya que contarán con una dedicatoria personal de los autores para el ganador.

Paquete “Roy y Bea”: Freedom Knights + Orange Shaft

Dragon Comics

Dragon Comics

De la mano de Roy y Bea de Dragon Comics llega la saga de Freedom Knights. Los Freedom Knights son un grupo de superhéroes viviendo en un Uruguay alternativo intentando evitar un futuro devastado. El paquete del premio incluye las primeras dos recopilaciones de este cómic que comenzó hace más de 8 años y se sigue publicando todavía. Además incluyo el “spin-off” Orange Shaft, del cual pueden leer una reseña en la sección de Cómics.

Paquete “Nicolás Peruzzo”: Ranitas + Ciudad Fructuoxia

Ninfa Comics

Ninfa Comics

Otros excelentes cómics nacionales que tengo pendiente reseñar. Del autor Nicolás Peruzzo y a través de Ninfa Cómics y Grupo Belerofonte (en el caso de Ranitas) el paquete incluye dos universos distintos provenientes de la misma mente. Los cómics de Ciudad Fructuoxia tienen como escenario un Uruguay ya “devastado”, con un contexto histórico diferente. La ciudad de Fructuoxia es protagonista de varias historias de superhéroes, con personajes corruptos, sucios y políticamente muy incorrectos. Ranitas es un cómic autobiográfico completamente distinto en cuanto a guión y arte.

GAS3K

GAS3K.1 y GAS3K.2

GAS3K.1 y GAS3K.2

Los dos paquetes de cómics incluyen también GAS3K.1 y GAS3K.2.

GAS3K.1 y GAS3K.2 son la primer incursión de GAS Comics al mundo impreso. Se trata de dos fanzines con historias cortas en formato cómic. El primer número cuenta con tapa de Diego Jourdan, y participan también Carlos Lemos, MaGnUs (a.k.a. Martín A. Pérez), Carlos López, Henry Dávida Río y Taibox (a.k.a. Federico Taibo). El segundo lleva la tapa a cargo de Alejandro Figueroa (con fondo y color de Nicol Kikult) y participan además Taibox, MaGnUs, Lisandro di Pasquale y Mike Vilardi. Unas revistitas muy interesantes de coleccionar, con historias varias.

Cómo participar

Definamos algunas reglas:

Los ganadores se anunciarán el lunes 25 de julio mediante un algoritmo aleatorio que será publicado en el mismo post de este anuncio. Los resultados serán verificados por mi persona y ningún escribano público.
Voy a ser totalmente imparcial, por lo que pido a amigos, conocidos y familiares que no me intenten sobornar para ganar uno de los premios, ya que no voy a ceder…

Para participar deben hacer lo siguiente:

Pueden elegir por qué premio quieren concursar en el tweet o comentario, o concursar por cualquiera de ellos. Se pueden llegar a agregar más premios de acá al 25 de julio.

Las claves para los juegos serán enviados por correo electrónico ya que se obtienen mediante descarga digital. El vale de compra en SplitReason también se entregará por correo electrónico al ganador. El paquete de cómics así como las remeras serán enviados por correo (sin importar en qué parte del mundo se encuentre el ganador). De esta forma, no hay límites geográficos que te impidan participar.

Publiquen el concurso en sus blogs, Twitters, Identi.ca’s, perfiles de Facebook, Google+, listas de correo, foros,  e inviten a sus amigos. Si sumamos mucha gente, hay más posibilidades de agregar algunos premios. Si todo sale bien, prometo organizar concursos más seguido :D

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

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

Picando Código

Primer Python Day en Uruguay – 20 de agosto de 2011

Julio 13th, 2011 - [Enlace local]

Ya están abiertas las inscripciones y el llamado a charlas y sponsors del Primer Python Day del Uruguay. Esta jornada de difusión de la tecnología Python a cargo de PyUy. Una lástima que por la fecha, no voy a poder asistir, ¡pero invito a todos a acercarse!

PyUy

PyUy

Python Day Uruguay
Laboratorio Tecnológico del Uruguay – 20 Agosto 2011

PyDay Uruguay 2011 es un evento organizado por la comunidad de desarrolladores Python con el objetivo de difundir el uso del lenguaje además de fomentar proyectos y negocios basados en tecnologías relacionadas.

Estudiantes, Empresarios, Desarrolladores, Administradores de Sistemas, Técnicos, etc… Acompañanos en una jornada de talleres y charlas de todos los niveles.

Python es un lenguaje de código abierto de alto nivel, multipropósito, multiplataforma y multiparadigma fácil de aprender y divertido al usar.

Es la herramienta principal en empresas como Google o Industrial Light and Magic y organizaciones como la Administración Nacional de Aeronáutica y del Espacio (NASA).

Conoce Python – Usa Python

contacto@python.org.uy

Llamado a charlas:

La temática debe estar en relación con el evento. Las mismas deben contener:
- Título
- Autor(es): nombre y apellido (nick si corresponde)
- Resumen del perfil del expositor (ej. Programador con 5 años de
experiencia en Web, actualmente trabajando …)
- Teléfono
- E-mail
- Tiempo de duración (máximo 45′)
- Descripción explicando en resumen el contenido de la presentación
(Para mostrar en el sitio)
- Nivel: básico/medio/avanzado
- Conocimientos previos necesarios para aprovechar la charla.

Un autor puede enviar más de una propuesta de ponencia.
El formato del archivo a enviar debe ser libre (Openoffice, HTML, PDF
o texto plano) y su licencia debe permitir su libre distribución.
Los archivos de presentación se encontrarán disponibles para descargar inmediatamente después de finalizada la charla en el sitio del evento.
La fecha límite de entrega es el 29 de Julio.
El evento contara con un track especial para charlas relámpago de aproximadamente 15 minutos, los interesados en participar en esta modalidad pueden hacerlo enviando el titulo de la ponencia con sus datos personales.

charlas@python.org.uy

Llamado a sponsors:

Los interesados en auspiciar el evento pueden contactar al e-mail sponsors@python.org.uy. Nos pondremos en contacto.

Beneficios:

- Presencia en el sitio web del PyDay Uruguay 2011.
- Presencia en toda gráfica impresa que se distribuya previamente al evento y durante el mismo.
- La empresa podrá entregar merchandising propio durante el evento con libertad de incluir el logo del evento.
- Tener un Stand propio.
- Dar una charla relámpago.
- Intercambio de propuestas laborales y recepción de CVs.

python.org.uy

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

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

Arragonán

Panenka, el fútbol que se lee

Julio 12th, 2011 - [Enlace local]

Soy aficionado a hacer deporte, me gusta practicarlo y sigo algunos. Y el que más me gusta es el fútbol (soy un tipo raro, lo sé :P ), seguidor/simpatizante del Zaragoza y el Huesca. Pero aunque sufro y disfruto de esos equipos, no soy un forofo y mucho menos un gran consumidor de prensa deportiva.

Pero para mi el fútbol y derivados, son deportes que ha tenido siempre un lado romántico para mi, juego en ligas de amigos a fútbol sala y fútbol 7; y en su día jugué en el equipo de fútbol de mi pueblo, en la 2ª regional aragonesa por muchos campos de los pueblos de la provincia de Huesca. Esto me ha permitido conocer gente, hacer amigos, descubrir algunos pueblos o conocer un poco mejor la ciudad en la que vivo.

Y seguramente os preguntaréis porqué escribo esto en un blog que suele ser de temática técnica o profesional. Pues porque he participado en el desarrollo de la web de la revista Panenka: un desarrollo donde nos hemos repartido el trabajo con Guillermo, el tío que entre otras cosas más y mejor desarrolla con wordpress que conozco; donde yo me he encargado principalmente del trabajo con PayPal haciendo alguna cosita con php.

Los que conocéis el tipo de proyectos en los que participo como programador freelance quizás os sorprenda que haya trabajado en un proyecto de estas características, porque a nivel técnico NO es de los que yo suela participar. Pero el que para mi el fútbol tenga ese punto romántico, que la revista trata el fútbol desde un punto de vista principalmente cultural y con quienes hay detrás de la revista hizo que me gustara mucho el proyecto y me apeteciera mucho participar.

Aunque como en todo desarrollo de un proyecto web, ha tenido momentos críticos, es un proyecto en el que me ha gustado mucho participar y sólo puedo animaros a que compréis el número 0 de la revista en pdf o en papel, si os gusta el fútbol, claro :) .

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

Variable not found

Binding de enums en ASP.NET MVC

Julio 12th, 2011 - [Enlace local]

ASP.NET MVCTratar con tipos enumerados (enum en C#), a pesar de su comodidad e idoneidad en multitud de ocasiones, suele siempre una tarea pesada debido a la falta de soporte directo existente en algunas tecnologías.



Por ejemplo, hasta la fecha, Entity Framework los ha ignorado por completo (aunque que esto va a cambiar y la próxima versión de EF sí soportará enums :-)), lo cual resulta muy incómodo en el momento de crear componentes de acceso a datos, viéndonos obligados a realizar demasiadas conversiones, o incluso a veces el plantearnos otras soluciones, como el uso de constantes numéricas en su lugar para simplificar las operaciones.

public enum Color
{
    Rojo = 1,
    Verde = 2,
    Azul = 3
}
Ya centrados en ASP.NET MVC, un aspecto muy interesante del mecanismo de binding es su capacidad para trabajar de forma muy natural con estos tipos de datos, aunque esto pueda acarrear algunos problemillas. Veámoslo con un ejemplo partiendo del siguiente controlador:

public class EnumController : Controller
{
    public ActionResult Test(Color color)
    {
        return Content("Color: " + color);
    }
}
Suponiendo que utilizamos la ruta por defecto, una petición dirigida a la dirección URL /enum/test?color=1 retornará por pantalla el texto “Color: Rojo”. Durante el binding, el framework ha recuperado el parámetro “color” presente en la query string (un “1”) y lo ha transformado en el elemento de la enumeración correspondiente con este valor.



Y no sólo eso, también podemos hacer referencia al identificador asignado en la enumeración; así, una petición como /enum/test?color=Verde será capaz de interpretarlo de forma correcta, asignando al parámetro color el valor apropiado.



Pero en realidad no se trata de un mérito del binder, ni tan siquiera del framework MVC. Internamente, el proceso de conversión de los tipos enumerados se delega a la clase EnumConverter (presente en System.ComponentModel), que a su vez llamará a Enum.Parse() para obtener el valor apropiado desde el string obtenido por el value provider desde la query string. Este método examina la cadena y en función de su contenido buscará de una u otra forma el miembro de la enumeración a retornar:

Asimismo, este mecanismo funciona perfectamente cuando es una enumeración de flags. Como sabréis, estos tipos enumerados permiten definir “switches” o banderas combinables entre sí utilizando operadores lógicos binarios. Así, una petición como /enum/test/?color=Rojo,Verde será también interpretada de forma correcta, introduciendo en el parámetro color la combinación (un "or" binario) de ambos valores, de la misma forma que lo sería /enum/test/?color=1,2.



En resumen, esta flexibilidad a la hora de interpretar los valores y obtener el elemento correspondiente del enumerado es realmente potente y da mucho juego a la hora de crear en nuestras aplicaciones acciones muy expresivas y respetuosas con el protocolo HTTP sobre el que trabajamos. Sin embargo, esta potencia tiene también unas contraindicaciones que debemos conocer.

¿Y qué ocurre cuando los valores que se envían a una acción no son correctos?

Pues aquí llegan los problemas, claro ;-). Si a la acción anterior enviamos una petición incorrecta introduciendo en el navegador una URL como /enum/test?color=Amarillo veremos que se produce una excepción:



Error al suministrar un valor incorrecto



Observad que, a diferencia de lo que podríamos esperar, la excepción no hace referencia al hecho de que el miembro Amarillo no pertenece al enum, sino a que el parámetro color no puede contener un nulo. Es decir, el framework utiliza los componentes descritos anteriormente para intentar la conversión, pero éstos retornan un nulo y, dada la firma de la acción, éste es un valor que no puede aceptarse.



Para confirmarlo, sólo tenemos que utilizar un tipo anulable en el parámetro de la acción, así:

    public ActionResult Test(Color? color)
    ...


Simplemente con esa línea ya aseguramos que la aplicación no se parará en ejecución cuando llegue un nombre incorrecto del miembro de la enumeración, simplemente deberemos controlar lo que queremos hacer en caso de que color sea nulo.



Pero un problema aún más grave tenemos cuando el valor incorrecto viene expresado en forma numérica, indicando un valor inexistente en el tipo enumerado, por ejemplo en /enum/test?color=24. Fijaos que el valor está fuera de los permitidos, sería equivalente a hacer lo siguiente desde código:

    Color color = (Color) 24;
Seguro que ya sabéis lo que ocurre en este caso: nada. A la hora de asignar valores a una variable de tipo enum no se realiza de forma automática ningún tipo de comprobación que permita detectar que el valor no forma parte de los permitidos, por lo que la variable color contendrá un bonito 24 que en el contexto de nuestro sistema no significa absolutamente nada :-(



Y precisamente por eso decía el problema es más grave que antes, que al menos la excepción o el valor nulo en el parámetro de entrada indicaba que el valor recibido no es correcto. Si lo que nos llega es un número fuera de rango no nos enteraremos y “se colará” silenciosamente en nuestra lógica, lo que podría liar un desaguisado tremendo.



A continuación se muestra cómo podríamos gestionar en la acción la entrada de un dato incorrecto, bien sea por tratarse de un identificador inválido (que entraría un nulo) o bien un valor numérico fuera de los permitidos en la enumeración. Observad que utilizamos el método IsDefined() de la clase Enum para comprobar si el valor suministrado es válido:

    public ActionResult Test(Color? color)
    {
        if (!color.HasValue || !Enum.IsDefined(typeof(Color), color))
            throw new  ArgumentOutOfRangeException("color");
        

        return Content("Color: " + color);
    }
Supongo que estaréis pensando, y con razón, que sería demasiado trabajo repetirlo estas comprobaciones en todas las acciones que acepten parámetros de tipo enum, ¿verdad?

Controlando los valores de entrada mediante un model binder personalizado

Sin duda, sería mejor idea aprovechar las posibilidades de extensión del framework y crear rápidamente un binder específico que sea capaz de liberar a nuestro controlador de realizar las tareas de comprobación de los parámetros de entrada de tipo enum, como el siguiente:

public class EnumBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = base.BindModel(controllerContext, bindingContext);
        var type = bindingContext.ModelType;
 
        if (value!=null && Enum.IsDefined(type, value))
            return value;
            
        throw new ArgumentOutOfRangeException(bindingContext.ModelName);
    }
}
Como se observa en el código, se comprueba que el valor no sea nulo y que se encuentre entre los definidos en la enumeración, lanzando una excepción en caso contrario. Os dejo como deberes la implementación del binder que acepte enumeraciones de tipo flag, y parámetros de tipo anulable ;-)



A continuación tenemos que indicar al framework que debe utilizar este model binder para las enumeraciones. Una posibilidad sería registrar en la colección ModelBinders una asociación para cada tipo de enumeración, algo así:

    ModelBinders.Binders.Add(typeof(Color), new EnumBinder());
Desafortunadamente, esta fórmula de registro de binders no funciona para jerarquías de clases; es decir, no podemos registrar un binder para la clase Enum y que se aplique automáticamente para todas sus descendientes, por lo que si usamos muchas enumeraciones sería bastante tedioso registrar uno por uno los binders.



Otra posibilidad sería utilizar los nuevos ModelBinderProviders, una característica introducida en ASP.NET MVC 3, que permiten introducir lógica en el momento de obtención de los binders y, por tanto, decidir qué binder queremos asignar a cada clase. El siguiente código podría ser un proveedor simple que conseguiría el efecto deseado:

class MyModelBinderProvider: IModelBinderProvider
{
    public IModelBinder GetBinder(Type modelType)
    {
        if (modelType.IsEnum)
            return new EnumBinder();
        return null;
    }
}
Y su registro en el global.asax.cs sería así:

    protected void Application_Start()

    {

        AreaRegistration.RegisterAllAreas();

        ModelBinderProviders.BinderProviders.Add(new MyModelBinderProvider());

        RegisterGlobalFilters(GlobalFilters.Filters);

        RegisterRoutes(RouteTable.Routes);

    }


En cualquier caso, sea cual sea la vía utilizada, una vez asociado el binder en la inicialización de la aplicación, ya controlará por nosotros la entrada de valores incorrectos para la enumeración:

    public ActionResult Test(Color color)
    {
        // Podemos asegurar que "color" es un color válido
        return Content("Color: " + color);
    }

Generación de rutas hacia acciones en cuyos parámetros hay enums

Ya hemos visto cómo funciona el mecanismo de binding en acciones entre cuyos parámetros se encuentran enums, pero, ¿cómo tenemos en cuenta esta particularidad a la hora de generar enlaces o rutas hacia estas acciones?



Pues la respuesta es bien simple: como si se tratara de cualquier otro tipo de datos. El siguiente código muestra la generación de enlaces hacia la acción vista anteriormente utilizando el helper Html.ActionLink(), primero de forma directa y a continuación utilizando T4MVC:

     @Html.ActionLink("Enlace a azul", "Test", "Enum", new {color = Color.Azul}, null)
     @Html.ActionLink("Enlace a verde", MVC.Enum.Test(Color.Verde))
Como se puede observar, no hay que realizar conversiones ni ningún otro tipo de malabarismos, simplemente podemos utilizar elementos de la enumeración de forma directa cuando sean necesarios :-)



Publicado en: Variable not found.



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

Información legal y técnica