ASP.NET MVC

Enero 19, 2008 por Miguel

Anoche fui a una TechNight de Microsoft donde presentaron ASP.NET MVC. Los chicos que dieron la exposición estuvieron muy bien, y que haya habido cerveza y papas fritas a la salida me pareció un gran gesto. Eso y los ojos de una muchacha que andaba dando vueltas por ahí, azules como el cielo de este hermoso día.

Mi pregunta era como habían hecho las cosas… No las hicieron mal, solo que las hicieron igual… ¡Ejemplo del blog con comentarios incluido!

Igual a Ruby on Rails, a Monorail, a CakePHP, a todos los frameworks MVC, pero con las tecnologías de VS 2008. Como ORM utilizan LINQ, como API para Sindicación usan WCF, etc.

Algo muy positivo es que los módulos que componen el modelo se comportan como módulos realmente y son intercambiables.

Tiene un router de urls, expresiones regulares para validar. ¡Está todo!

Tal vez lo más interesante sea en que cada parte sea implementada como una interfaz, permitiendo implementar las propias, hacer mock-objects, utilizar sistemas de templates como los de MonoRail o implementar el propio sistema de Ruby On Rails. Es muy flexible en eso. Esto para integrar aplicaciones ya desarrolladas es un golazo.

Otra ventaja -que al programador asp.net medio no le parece tal- es que se van el viewstate y el postback. ASP.NET depende mucho de estas cuestiones y ahí es donde se complican la mayoría de las páginas. Haber transportado el esquema de eventos de Visual Basic a la web es algo que ayuda mucho a acortar la curva de aprendizaje para pasar de una tecnología a otra, pero los dolores de cabeza empiezan cuando hay que hacer cosas en AJAX, o necesitamos manosear el DOM desde javascript. Se puede calcular o directamente obtener el id del DOM de los controles. El drama es cuando estos son generados como ItemTemplates, hay que hacer alguna chanchada. El esquema es bueno en una aplicación de escritorio, pero en web es muy pesado. Esto lleva a que todos los controles que dependían del viewstate y del post-back hayan quedado, bueno, “deprecated”. Tendrían que haber visto como se puso la monada cuando los chicos tuvieron que avisar que el GridView no iba más. AJAX.NET también se ve comprometida.

Tranquilos muchachos, están los Helpers de la UI para generar nuestros nuevos controles. En vez de Viewstate usamos el cache del lado servidor. Es programar un poco más, pero podemos armar nuestro propio Viewstate usando la Cache. Y ganamos obteniendo páginas y sesiones más livianas.

Con .NET 3.5 hay variables tipadas dinámicamente, saludando al variant de VB. Sinceramente, si no era porque las variables NO empezaban con $, hubiera jurado que estaba viendo código PHP y templates de CakePHP en Visual Studio 2008.

Otra cosa es que IIS 7 ya permite Rewrite Rules o algo por el estilo. Lo que nos permite hacer la magia de las urls amigables a la intuición del usuario y a los buscadores.

La verdad es que me parece muy bueno que ASP.NET provea la posibilidad de trabajar con MVC, al margen de que yo lo haga. Le da al desarrollador un enfoque nuevo muy útil en varios escenarios.

Espero que le den para adelante, porque se va a ganar mucho en flexibilidad y legilibidad del código. Pero tal vez lo mejor es que trabajar con MVC nos ayuda a identificar mejor los requerimientos de nuestra aplicación y trabajar en función de ellos. Después si tiene que salir en ATOM, XHTML o código morse ya es problema de la vista y sus helpers. Nosotros tenemos nuestro controlador que hace el trabajo importante.

Yo voy a seguir firme junto a PHP5, SPIP y CakePHP en trabajo independiente, dado que no tengo un IIS7, ni plata para comprar un módulo ISAPI de redirección para IIS6 (otra cosita que tuvieron que contar los chicos), pero ASP.NET MVC sería mi “weapon of choice” a la hora de trabajar en web con .NET.

A colación de la Collation…

Diciembre 26, 2007 por Miguel

Un problema típico trabajando con cadenas y comparaciones es como lidiar con cuestiones de acentos y la diferencia de mayúsculas y minúsculas.

El problema surge de que la computadora guarda los caracteres como (sucesiones de) bytes: así la letra A es un byte 65 o 0×41, la B es 66 o 0×42, la a es 97 o 0×61 y, en la tabla ISO-8859-1 á es 160 o 0xA0. Cuando la computadora compara los bytes A es disntito de a y de á. Esto es extrictamente cierto y necesario, pero hay (muchas) veces en la que es un efecto no deseado.

La solución más común es “normalizar” las cadenas para búsquedas y comparaciones. Para eso hacemos unas funciones muy bonitas que termina metiéndole mano hasta el kiosquero de la esquina.

Este enfoque no es malo, pero en seguida resulta ineficiente, ya que por cada búsqueda o comparación hay que normalizar. Para eso nuestro DBA amigo nos sugirió crear un campo donde podamos guardar nuestra cadena normalizada -pobre tipo, ya tiene bastante lío revirtiendo nuestros accidentes-. Nosotros, codeadores empedernidos sentimos un poco de frustración por guardar dos veces lo que podemos calcular con nuestra superfunción. Pero todo sea en nombre de la concurrencia y el rendimiento.

¿Nadie resolvió esto ya?

¡Sí!

¡Para eso se inventó la Collation de nuestras bases de datos, tablas, o incluso de nuestros campos!

Lo que hace la Collation es establecer un orden alternativo independiente del mapeo de caracteres. Es una secuencia de orden alternativa. No es un algoritmo de ordenación.

De esta manera nuestra base de datos ya nos provee el tratamiento de cadenas con caracteres especiales.

Si quisiéramos aplicar Collation en una base MySQL para un campo con charset utf8 utilizaríamos utf8_spanish_ci.

Si quisiéramos aplicar Collation para un campo con charset iso-8859-1 (latin-1) latin1_spanish_ci.

Se puede leer más y mejor en la documentación de mysql para charset utf-8 y para el caso iso-8859-1.

El tema tiene mucha tela para cortar y dejo esto para empzar. Ya volveremos con algo más interesante.

Saludos y ¡buen año!

Problemas con Charset y PHP

Octubre 9, 2007 por Miguel

Los problemas de charset surgen de dos cuestiones:

  • Estoy abriendo una fuente utf-8 y mi salida se ve en iso-8859-1
  • o bien el opuesto: iso-8859-1 la fuente, salida utf-8

Vamos a “simular” que abrimos un archivo XML y tenemos problemas con el charset.

Primer caso

Diagnóstico: Por lo general el primer caso se da cuando veo en vez de eñes y acentos dos caracteres. Suelen ser un à y algo más. En el ejemplo el archivo XML estaría codificado en utf-8 (caso más común) y nuestra página se ve en iso-8859-1

Solución: La fuente está viniendo en utf8 y necesito pasarlo a Latin-1. Esto se hace con la función utf8_decode().

$origen = "http://algunblog/feed/";

//CURL mediante o file_get_contents
//En este caso hacemos la conversion de utf-8
//a iso-8859-1
$contenido = utf8_decode(file_get_contents($origen));

$xml = simplexml_load_string($contenido);
//"masajeamos" el contenido del XML

Segundo caso

Diagnóstico: En vez de caracteres especiales vemos unos signos de interrogación o cuadraditos con números. Esto significa que no puede traducir el caracter a alguno Unicode porque está “mal formado”.

Solución: Hay que convertir nuestra cadena a utf-8 mediante la función utf8_encode().

$origen = "http://algunblog/feed/";

//CURL mediante o file_get_contents
//En este caso hacemos la conversion de iso-8859-1
//a utf-8
$contenido = utf8_encode(file_get_contents($origen));

$xml = simplexml_load_string($contenido);
//"masajeamos" el contenido del XML

Estos son los dos casos básicos. Desde ya que esto tiene una explicación un poco más teórica, pero que vamos a abordar en otro post o tal vez le dediquemos una página. Por ahora con esto ya podemos solucionar muchos problemas.

Cuando trabajemos con bases de datos también tenemos que tener en cuenta estas consideraciones. Tenemos ventajas además, por lo general nos permite seleccionar el encoding de la conexión. El parámetro suele llamarse “charset”.

Mi intención es fundar la SALPICADA (Sociedad Argentina por la Lucha contra Problemas Indescifrables de Charset Accediendo a Datos y Archivos) para investigar el tema, capacitar y ofrecer ayuda. Evitemos que nuestras páginas terminen SALPICADAs por feos caracteres que hacen los textos menos legibles.

Cualquier duda, acá estoy.

Volvió Peter Capusotto y sus videos

Octubre 3, 2007 por Miguel

Peter Capusotto está de vuelta y más podrido que antes:

“…Nacer, estudiar, casarse, tener hijos, mirar telefé y después morir.
No hay dudas de que nuestra vida está pautada.
Es muy difícil escapar de las garras de la rutina que nos obliga a saber quién es Rocío Marengo.
Pero el rock te da nuevas alternativas
Nuevas sensaciones para que tu vida sea algo más que ese mensaje de texto     que dice me voy a pegar un corchazo detrás de la oreja derecha…”

Y los dejo con Pinky Lavié.

Es esto o hacer algo de tu vida…

Accediendo a XML con XPath y PHP5

Septiembre 23, 2007 por Miguel

Bien, hasta ahora vimos como acceder al documento XML con PHP 5 accediendo a los nodos directamente e iterando colecciones.

Pero qué pasa si queremos acceder a un nodo en particular, sin tener que recorrer el documento.

Esto se puede hacer mediante XPath. XPath es un lenguaje de expresiones para acceder a partes de un documento XML. También permite hacer cálculos.

La base es considerar al documento como un arbol de directorios de unix donde cada nodo es un directorio. De esta manera si queremos acceder al título de un documento XHTML basta con consultar el elemento: “/html/head/title”. Si queremos acceder todas las entradas de un feed RSS. la consulta será a “entry”. Esto devolverá un array con todos los nodos de tipo entry donde cada elemento del array será un nodo.

También podemos acceder por los atributos. Supongamos que tenemos un documento XML en donde guardamos contactos. Cada nodo “contacto” tiene un atributo que se llama “tipo” y entre sus valores posibles están “Personales”, “Negocios”, etc. Si queremos listar todos los contactos de tipo “Personales”:

$xml = simplexml_load_file('contactos.xml');
$res = $xml->xpath("contacto[@tipo=Personales]");

foreach ($res as $contacto)
{
  //hacer algo con los contactos...
}

Es decir invocamos al método xpath de la clase SimpleXML pasándole por parámetro nuestra consulta XPath. Como queremos filtrar por atributos ponemos entre corchetes el atributo precedido por una @ e igualamos al valor que queremos filtrar. En el ej:[@tipo=Personales].

Esto es solo la punta del iceberg, ya que se pueden hacer cálculos, consultas complejas acceder a nodos relativos, por ejemplo, el nodo padre de los nodos que tengan cierto valor en cierto atributo.

Cualquier duda o comentario, pregunten. Saludos!

SPIP y las palabras clave

Septiembre 20, 2007 por Miguel

SPIP tiene un mecanismo muy poderoso de categorizar contenidos por palabras clave.

Por un lado propone las secciones para cargar artículos asociados a una temática. Un ejemplo sería una comunidad en particular que quiere publicar noticias y opiniones, cada uno con su formato particular.

De golpe en el contexto ocurre un evento, por ejemplo: la comunidad es una comunidad de jugadores de rugby y a su vez está ocurriendo el Mundial de Rugby de Francia. Este mundial genera noticias (resultados, fixtures, etc) y por otra parte opiniones (comentarios de partidos, amistosas sugerencia, etc)

Si quisieramos armar una página especial por el mundial de Rugby podríamos armar una sección nueva y cargar todos las noticias y las opiniones ahí. Pero surgiría el problema del formato. Además, ¿que pasaría si yo quisiera que las noticias del mundial salgan con las noticias de la comunidad, lo mismo que las opiniones?

Las palabras clave vienen al rescate. SPIP permite definir grupos de palabras clave a los cuales se les asocian diversas palabras clave. En nuestro ejemplo podríamos definir un Grupo de Palabras Clave que se llama Torneos y en ese grupo una palabra clave concreta: “Mundial de Rugby Francia 2007″. Podríamos crear otras palabras Clave: “Campeonato de la URBA”, “Gira a Nueva Zelanda” y así las que queramos.

Bastará con crear un esqueleto con el contenido estático y el recorrido de las palabras clave que estemos usando.

Podríamos incluso abrir un canal RSS dedicado solo al evento mediante el mismo uso de la palabras clave.

Como se puede ver tiene muchas posibilidades. Espero que haya sido útil. Nos vemos y vamo’ lo’ puma’!

Leyendo xml con PHP 5

Septiembre 12, 2007 por Miguel

Estoy necesitando parsear XML con PHP. La idea es ir armando una maqueta para un sitio que muestra artículos que obtiene de unos archivos XML.

Parsear XML en PHP4 era lento y poco práctico, razón por la cual siempre traté de evitarlo. Si hacía falta sacar algo de un archivo XML lo recorría como un archivo plano y extraía los datos con expresiones regulares.

Por otra parte entre las novedades PHP 5, el soporte para XML fue optimizado. Esto se basa en una nueva clase que envuelve la funcionalidad de una biblioteca que llama libxml: SimpleXML.

¿Por donde empezar?

La biblioteca es muy cómoda de utilizar. Acepta iteradores y permite acceder a los nodos hijos como atributos del nodo/objeto padre.


$archivo = 'entrada.xml';

//Caso 1: Directamente trayendo el archivo
$xml = simplexml_load_file($entrada);

$cadena = file_get_contents($entrada);

//Caso 2: Teniendo el contenido de texto
$xml = simplexml_load_string($cadena);

//Caso 3: O como instancia de la Clase SimpleXML
$xml = new SimpleXML($cadena);

En cualquiera de los 3 casos voy a tener un objeto $xml que representa al nodo raíz.

Supongamos que queremos mostrar links a los posts más recientes de un blog mediante feeds RSS. Mediante CURL o file_get_contents obtuvimos los datos en la variable $cadena.

$xml = new SimpleXML($cadena);

echo "Fuente :<a href=\\"".
$xml->channel->link ."\\">".
$xml->channel->title."</a>
\\n";

echo "
<ul>";
foreach ($xml->channel->item as $item)
{
echo "
	<li><a href=\\""
.$item->link ."\\">"
.$item->title."</a></li>
\\n";
}
echo "</ul>
";

Así de fácil podemos recorrer el RSS. Hay que tener encuenta que el objeto $xml es el elemento raíz de la cadena pasada (<rss> en este caso).

La próxima vez vamos a hablar de XPath, y de como acceder a los hijos y a los atributos del documento xml.

Montar iso en XP

Septiembre 10, 2007 por Miguel

Encontré cómo montar archivos iso en Windows XP sin tener que usar ni Alcohol, ni Nero Imagedrive.

Es cuestión de copiar un archivo al directorio %systemroot%\system32\drivers y usar un programita cliente.

Chapeau!

maldito disco

Septiembre 6, 2007 por Miguel

Será posible, el disco rígido está a punto de fenecer. Me tira errores el SMART en booteo y me sugiere que backupee todo y lo cambie.

Sospecho que tengo problemas con la corriente. Voy a tener que rendirme y comprar un estabilizador de corriente. @#!

interface: widgets para jQuery

Agosto 30, 2007 por Miguel

Estoy haciendo un sitio institucional estático para un vivero, muy básico. Puro HTML y trabajo en javascript.

La diseñadora gráfica armó un esquema muy lindo, aunque que muy “à la Flash”. Así que estoy haciendo magia con CSS y javascript para que quede lindo como en el bosquejo que me mandaron.

El problema era un ScrollBar no estándar muy bonito que por más que se presione al CSS, se ponía poco menos que imposible.

Había que apelar a algún widget en javascript y encontré el Slider de la biblioteca Interface para jQuery.

La única observación es que no funciona en Internet Explorer con jQuery 1.1.3 o 1.1.4, pero funciona de pelos con jQuery 1.1.2 que es la que podés descargar del sitio de Interface.

El problema era que en total toda la biblioteca pesa 80KB + 21KB de jQuery es pesadito. Interface también ofrece una solución para esto: se puede seleccionar los widgets que queremos y nos genera la biblioteca con lo que usás y nada más. Para el Slider necesitaba Drag&Drop y el propio Slider, peso del interface personalizado: 24KB + 21KB de jQuery.

Con eso conseguí el bloquecito de texto, y me quedó bastante bien el layout.

¡Hasta la próxima!