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

PROGRAMANDO EN .NET

Novedades Visual Studio 2010 (I): Versiones

Junio 15th, 2010 - [Enlace local]

Con este post empiezo una serie con las novedades del nuevo Visual Studio 2010 y del .NET Framework 4.0, empezamos con las versiones:Como ya nos tiene acostumbrados, cada vez que sale un nuevo Visual Studio, también cambian los nombres de las versiones y lo que se puede (o no) hacer con ellas.En esta página tenéis un gráfico comparativo:http://www.microsoft.com/spain/visualstudio/productsPero

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

Bitácora de Javier Gutiérrez Chamorro (Guti)

SQLite compilado para DOS

Junio 15th, 2010 - [Enlace local]

Desde que a finales de 2009 publicase SQLite 3 compilado para x64, la adopción de SQLite no ha parado de aumentar. En gran parte gracias a Web SQL, lo que ha hecho que sea portado a todavía más plataformas.

Un caso curioso es el del anciano (no quiero decir obsoleto DOS), que aunque ofrece desde hace tiempo ports no oficiales de SQLite, en general son complicados, pues se basan en parches a los fuentes, que generalmente se compilan con DJGPP (GCC).

Por suerte, hay un camino mucho más sencillo, que es usar HX-DOS Extender, que en esencia permite ejecutar multitud de aplicaciones Win32, sobre DOS en modo protegido.

Para ello, he conseguido la versión 2.17 de HX-DOS Extender, y con PESTUB, he reemplazado la cabecera MZ del compilado para Windows que realicé en su día sobre SQLite 3.6.21. De esta manera, si el entorno de ejecución es DOS o compatible, a saber: MS-DOS, PC-DOS, DR-DOS, FreeDOS, PTS-DOS, etc, la cabecera DOS, hará que el sistema operativo cargue primero el extensor DPMILD32.EXE, que a su vez se encargará de ejecutar la imagen Windows, reemplazando las funciones del kernel de Windows por las suyas propias.

En este caso, como la dependencia a nivel de sistema operativo es pequeña en el caso de SQLite, con DKRNL32.DLL que reemplaza KERNEL32.DLL es más que suficiente.

Por un lado, crear el port, me ha llevado menos de 5 minutos, por otro, la ventaja de este sistema es que si ejecutamos el programa desde Windows, será la cabecera PE la que se ejecute, funcionando nativamente. Es decir, tenemos un mismo ejecutable que es dual DOS/Win32, al más puro estilo de finales de los 90.

Puedes descargar los binarios aquí (365 Kb. en formato ZIP).

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

Variable not found

Controladores automáticos en ASP.NET MVC

Junio 15th, 2010 - [Enlace local]

ASP.NET MVC Aunque las convenciones propuestas por el framework ASP.NET MVC nos ayudan a estructurar nuestras aplicaciones y, la mayoría de veces, a ser más productivos, de vez en cuando también nos obligan a introducir código repetitivo para respetar el patrón propuesto.



Por ejemplo, en el caso de controladores con acciones que retornan la vista por defecto, solemos utilizar un código como el siguiente:



public class HomeController: Controller
{
    public ActionResult Index()
    {
        return View();
    }
 
    public ActionResult Company()
    {
        return View();
    }   
 
    public ActionResult Services()
    {
        return View();
    }
    
    public ActionResult Contact()
    {
        return View();
    }
    
}


No es que sea algo terrible, pero en controladores con muchas acciones de este tipo puede resultar un poco pesado… ¿no podríamos hacer algo para mejorar esto?

Controladores automáticos

Si observamos el código del controlador anterior, vemos que la lógica de ejecución es muy simple: cada acción implementada retorna al usuario la vista que le corresponde según convención. Obviamente se trata de un comportamiento que puede ser generalizado jugando con los mecanismos de extensión del framework.



Una vía muy rápida para hacerlo es sobrescribir el método HandleUnknownAction() de la clase Controller, descrito por aquí hace tiempo, que nos permite procesar las peticiones realizadas a acciones no existentes en el controlador.



Recordemos que cuando una petición llega a un controlador, se ejecuta el método cuyo nombre coincide con el de la acción invocada; en caso de no existir, el framework llamada a HandleUnknownAction(), permitiéndonos tomar el control de la situación. En nuestro caso, podríamos introducir en este método la lógica para retornar al usuario, de forma automática, una vista cuyo nombre coincide con el de la acción, siguiendo la convención de nombrado estándar.



Para ello, basta con crear una clase base llamada AutoController, e introducir el siguiente código para tener el problema resuelto:



public class AutoController : Controller
{
    protected override void HandleUnknownAction(string actionName)
    {
 
        // Intentamos localizar una vista con el nombre de la acción...
 
        ViewEngineResult viewResult = ViewEngines.Engines.FindView
                            (this.ControllerContext, actionName, null) ;
 
        if (viewResult.View != null)
        {
            View(actionName).ExecuteResult(ControllerContext);
            return;
        }
 
        // Si no hemos encontrado nada, seguimos el 
        // comportamiento por defecto…
 
        base.HandleUnknownAction(actionName);
    }


¿Sencillo, no? Lo único que hacemos en el código es utilizar la colección de ViewEngines para buscar una vista cuyo nombre coincida con el de la acción que se está intentando ejecutar, retornándola al usuario cuando sea posible localizarla.



Si no es posible localizar una vista para la acción invocada, se ejecutará el tratamiento por defecto para esta situación, que no es más que el lanzamiento de una excepción de tipo HttpException con el error 404 (not found).



¡Y eso es todo! A partir de este momento, todas las clases controlador que hereden de AutoController incluirán este comportamiento, por lo que será posible obviar la implementación de métodos cuya única misión sea retornar la vista por defecto según convención.



Por ejemplo, el controlador que escribíamos al comienzo de este post podría quedar de la siguiente forma, bastante más compacta:



public class HomeController: AutoController
{
}

Pero ojito, que no es oro todo lo que reluce…

Eso sí, antes de usar esta técnica tenemos que tener claro lo que significa realmente para no toparnos con sorpresas desagradables.



Cada petición recibida por el controlador que no se encuentre implementada de forma explícita será procesada con el automatismo introducido en HandleUnknowAction() sin pasar por ningún tipo de filtro, ni enviar información alguna en el ViewData.



Por ejemplo, sería posible acceder a vistas directamente, sólo con saber su nombre,  lo que en algunos escenarios puede resultar peligroso desde el punto de vista de la seguridad del sistema.



Obviamente, la técnica tampoco será válida en aquellas ocasiones en que la vista espere recibir algún tipo de información del controlador (como datos de vista, o la indicación de utilización de una página maestra concreta), o cuando la acción deba estar decorada con un filtro.



En estos casos, estas acciones concretas deberán seguir siendo implementadas explícitamente en el controlador, aunque el resto puedan seguir siendo procesadas de forma automática:



public class HomeController: AutoController
{
    // GET /Home/Customers
    // Sólo para usuarios registrados
    [Authorize]
    public ActionResult Customers()
    {
        return View();
    }
 
    // GET /Home/References
    public ActionResult References()
    {
        var services = new AppServices();
        return View(services.GetReferences());
    }
 
    // GET /Home/{CualquierOtraCosa}
    // Procesado por defecto, retorna la vista {CualquierOtraCosa}
}


En resumen, en este post hemos estudiado una técnica que nos permite crear controladores capaces de aportar un comportamiento por defecto para todas las peticiones realizadas hacia el mismo, ahorrándonos la escritura de acciones que simplemente retornan la vista por defecto.



Y aunque, como todo, en la práctica presenta limitaciones y peligros, su uso puede ser interesante en sitios web sin grandes requisitos de seguridad, como webs de información pública, cuyos controladores sean principalmente del tipo descrito.



Publicado en: Variable not found.



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

Fetishcode

HTML 5 y lo que nos viene encima

Junio 14th, 2010 - [Enlace local]

A

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

Variable not found

Enlaces interesantes 9

Junio 13th, 2010 - [Enlace local]

Estos son los enlaces publicados en TwitterVariable not found en Facebook desde el lunes, 07 de junio de 2010 hasta el domingo, 13 de junio de 2010. Espero que os resulten interesantes :-)

Y no olvides que, si te interesa, 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...

Arragonán

Convocado el II encuentro Agile Aragón

Junio 13th, 2010 - [Enlace local]

Hace un par de semanas, Teresa Oliver avisaba en la lista de correo de Agile Spain que ya estaba preparado el II encuentro Agile Aragón. Este jueves 17 de Junio en el edificio del ITA en Zaragoza.

En esta ocasión será un evento formal, donde gente de Frogtek, en mi humilde opinión, una de las startups tecnológicas con mejor pinta en Aragón; nos explicará cómo trabajan y el ecosistema de herramientas que utilizan.

Hay un video que ronda desde hace unas semanas por youtube y en algunas listas de correo a las que estoy suscrito, en donde se puede intuir de que hablaran este jueves :)

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

Fetishcode

Application Resources de JDeveloper no encuntra conexiones

Junio 12th, 2010 - [Enlace local]

A

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

Arragonán

Vivir en el pueblo

Junio 12th, 2010 - [Enlace local]

Después de 5 años fuera, he estado 10 meses viviendo en el pueblo que me vio crecer, y donde me nafré taaantas veces haciendo el bestia con mis amigos :) .

El tiempo ha pasado volando y parece que fue ayer cuando dejaba Zaragoza, y ahora cuando vuelvo a irme de San Esteban de Litera(para vivir la vida entera! XD), quería compartir como vive un freak/geek/ponga_aquí_lo_que_le_dé_la_gana en un pueblo oscense de menos de 600 habitantes ;)

Fue un gran paso hacia adelante el que llegara por fin la llamada banda ancha hace cosa de 2-3 años al pueblo(no es broma…) y a mi esto me da la posibilidad de poder trabajar sin grandes problemas desde allí. Y como ya estaba trabajando desde hace bastante tiempo a distancia, esta no era una limitación. Por otro lado, en este tiempo he percibido como la brecha digital ha disminuido mucho, pero sigue ahí.

A nivel de servicios, como supondréis, un pueblo tan pequeño tiene pocos: médico por la mañanas, tienda de comestibles, dos bares, una farmacia, un taxi… y durante la semana van apareciendo furgonetas de venta ambulante :P . La parte buena es tener muy cercanos pueblos más grandes como Binéfar y Monzón, donde están la mayoría de servicios que puedes necesitar en el día a día, y a mayores uno siempre puede acercarse a Lleida. Eso sí, por descontado que para vivir en un pueblo así necesitas carné de conducir y coche si quieres sentir que eres libre.

Por supuesto que para vivir en un pueblo pequeñito, siempre es preferible que no se le tenga fobia a la naturaleza en estado puro, osea a los animales y bichos en general ;)

Panorámica de San Esteban

CALIMERO_MODE=ON

Para mi una de las cosas más difíciles de estos meses ha sido hacer cambiar la opinión de la gente que se creía que estaba jugando, tomándome un año sabático o cosas del estilo… empezando por la gente de casa y los recados “por que tú no trabajas” XD. Vamos, que en ocasiones me veía completamente incomprendido.

CALIMERO_MODE=OFF

Y otra de las cosas duras ha sido la falta de gente a mano para frikear. Dejar un poco de lado los cadius, las quedadas del JUG, quedar a tomar unas cañas/cafés con amigos del mundillo… y el montón de eventos relacionados con internet y tecnología de una o otra forma a los que me había acostumbrado. De todas formas he ido escapándome a algún evento, que hay que ir dejándose ver :)

Llegando a este punto, imagino que alguno os preguntaréis que hacía para salir del exceso de calma/monotonía y para despejar la cabeza. Pues básicamente manterme activo a base de hacer deporte: ir al gimnasio, salir a correr, entrenar a fútbol, jugar alguna pachanga… por supuesto que no todo en el mismo día :P , pero siempre me ha sentado bien machacar un poco al cuerpo haciendo deporte para descansar la mente.

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

Buayacorp

¿Qué es HTML5 y por qué debería importarme?

Junio 10th, 2010 - [Enlace local]

Excelente infografía que nos dice qué es HTML5 y porque nos debería importar. En inglés

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

Fetishcode

Infraestructura de descargas Oracle caída

Junio 10th, 2010 - [Enlace local]

A

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

Picando Código

Claro: ¿Pasados de la raya o me estoy volviendo viejo?

Junio 9th, 2010 - [Enlace local]

Ayer tuve un día largo en el trabajo. Entré temprano, y pensaba salir temprano para hacer algunas cosas en la tarde que tengo pendientes. Se complicó la cosa (dicho sea de paso, Eclipse colmó mi paciencia :P ), y terminé saliendo relativamente tarde. En fin, venía en el bus contento escuchando música, a pesar que las tareas pendientes quedarían para hoy. Esto va pintando un poco el panorama, probablemente haya influido en mi reacción ante el siguiente hecho.

Capaz que ya estoy viejo… capaz que me estoy poniendo paranoico por todo el tema de la privacidad… capaz que estamos en un mundo Orwelliano donde nadie está a salvo, las grandes corporaciones luchan por el poder de controlar nuestras vidas y eso hace que me salte la térmica por poca cosa… o capaz que Claro cruzó la delgada línea entre Spam e invasión…

Claro - Abusivos

Claro - Abusivos

Tengo un servicio de telefonía móvil Claro, y de repente suena mi teléfono, un número celular con la característica de los móviles Claro 096. Ya no usan los 0800 o números privados, ahora llaman de “números comunes”.  Al escuchar la voz con acento distinto, me di cuenta enseguida de qué se trataba.

Ya me han llamado varias veces. Algunas para ofrecerme un módem 3G, otras para aumentar mi plan, y siempre respondo educadamente con el “No, gracias”. Los empleados de Claro no tienen la culpa, hacen su trabajo, el cual involucra llamar y molestar para ofrecernos cosas que no queremos ni necesitamos. Pero el problema viene desde los encargados, así que no hay sentido en descargarse con los empleados que nos llaman, por eso no justifico a la gente que insulta o responde mal a estos llamados (pero a su vez los entiendo :P ).

Veamos qué es la definición de SPAM según WikiPedia: mensajes no solicitados, no deseados o de remitente desconocido. Este llamado fue no solicitado, no deseado, y de un remitente desconocido hasta que me di cuenta que eran ellos. De todas formas, no tengo ninguna seguridad de que fueran ellos, ya que me llamaron de un número de teléfono común y corriente. Por lo tanto no tengo forma de comprobar que fuera la compañía de teléfonos Claro la que me llamó y sabía tantos datos sobre mí.

La persona que llamó me informó que en los próximos días estaré recibiendo en mi domicilio un módem 3G de Claro sin costo alguno. Me lo estarían entregando para probarlo gratis durante 5 días. Me explicaba que un cartero vendría a mi casa a entregar el módem (pregunto si mi dirección es donde recibo las facturas de cobro), que no debía entregarle dinero, y cómo podría seguir usando el módem 3G tras probarlo.

Aclaro en este punto: No me ofrecieron 5 días gratis de prueba de sus módems 3G, me los impusieron. En una movida de marketing totalmente invasiva, llamaron para confirmar mis datos y notificarme que iba a recibir un módem 3G. Nunca pedí un módem de éstos. Tengo ADSL por línea fija, y es la excusa que siempre usé de forma educada por teléfono. Así le he dicho que no a otras tantas llamadas no solicitadas ni deseadas de remitentes desconocidos que me ofrecían un módem 3G de Claro a precio económico “por ser tan buen cliente” o “buen pagador”.

La persona me explicaba que a partir del momento en que empezara a usar el módem, se “activaría” y tendría 5 días para probarlo. En caso de estar conforme, me podía quedar con el módem gratis, y pagar una cuota de no sé cuántos cientos de pesos por mes por el servicio. Y si no estaba conforme, debía ir a una de las sucursales de Claro a devolver el módem con la caja y todo lo que trajera. Encima que me imponen una oferta que no pedí, y por la cual nunca mostré interés, si no estaba conforme tenía que perder el tiempo en ir a una de sus casas a devolver el aparato.

Tuve que interrumpir a la persona que llamó, ya que entré medio despistado en la llamada y le iba siguiendo el juego. Cuando caí en cuenta de lo que estaba pasando, frené el discurso robótico marketinero para explicar que no me interesaba la propuesta, y que no quería que alguien me llevara un módem de esos a mi casa. La persona preguntó hasta sorprendida, ¿porqué diría yo tal cosa? ¿Es que no tengo computadora? Repetí el versito de siempre: “Tengo sí, pero tengo contratado ADSL fijo y no me interesa un módem 3G”. Respondió amablemente, y se despidió deseándome buenas tardes.

Lo que le pediría a Claro, si les parece que me deben algo “por ser tan buen cliente” es:

  1. Déjenme tranquilo, no me llamen más para ofrecerme el módem 3G, ni para que mande PLATA al 8080 a $5 por sms por la oportunidad de ganar plata, ni incluyan más Spam en los mensajes de llamadas perdidas.
  2. Dejen de vender modelos de celulares defectuosos como el Sony Ericsson W395, el peor teléfono móvil que he tenido que sufrir desde que uso este servicio.
  3. Hagan algo con su maldito servicio de consulta de saldo. El servicio por SMS nunca funcionó, y llamar es un martirio, tengo que escuchar que tengo cero saldo de la tarjeta que cargué el año pasado y se venció en enero, que no tengo saldo promocional, para después recién escuchar el saldo de mi cuenta.

Me sentí sumamente perseguido… No sé porqué este ataque de paranoia, pero creo que algún tipo de regla o convención rompieron con esta movida. De paso descargué toda mi disconformidad con la empresa en este post… Hoy mi Blog = catársis :P
Por el momento, lo único que me ata a esta empresa es el tiempo que he tenido mi número, por el cual se hace dificil cambiar. Pero a la más mínima excusa que tenga, me cambio de compañía, y me despido de Claro para siempre.

Acto seguido consigo un Nokia 1100, que por lo que me han dicho es el mejor celular que existe: Recibe llamadas, hace llamadas, tiene una interfaz rápida, es resistente a golpes, y tiene linterna.

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

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

Picando Código

Mortal Kombat Rebirth: La película confirmada

Junio 9th, 2010 - [Enlace local]

La gente de g4tv compartió este enlace por twitter, donde muestran el video de la nueva película Mortal Kombat Rebirth. No les quiero arruinar el video, así que no voy a decir qué personajes hay (por lo menos hasta más abajo en el post). Apaguen las luces, suban el volúmen, y mírenlo en pantalla completa y HD. Conserva parte de la esencia de lo que hizo famoso al juego – Mucha violencia:

El sitio CHUD (Cinematics Happenings Under Development) confirmó que se trataría de un reinicio de la saga en el mundo del cine. Vendría de la mano del coreógrafo Larnell Stovall, responsable de las peleas en Undisputed 3: Redemption.

Spoiler Alert

Las referencias al videojuego son increíbles, por mi parte ya la espero ansioso. Parece que van a reivindicar la saga en el cine con una película al estilo Batman, con un perfil más “realista” (si se puede).

Me causó gracias que Johnny Cage ya estuviera muerto en el trailer. Para los que no saben, Daniel Pesina – el actor que hizo de Johnny Cage -fue despedido de Midway por usar el disfraz de Cage en un anuncio para el videojuego BloodStorm. Por esto Johnny Cage fue asesinado para Mortal Kombat 3.

Lo de Reptile fue un poco rebuscado… Y no vi referencias a Liu Kang en ningún momento.

Esperemos que conserven la esencia de los personajes, o le den un giro que apele a los viejos fanáticos. Mataría la aparición en algún momento de la película de Dan Forden. Todavía queda ver cómo van a manejar la parte “mágica” y “mística” del juego, ya que no pueden faltar las fatalities, lo “demoníaco” de Scorpion, el hielo de Sub-Zero, y obviamente tiene que aparecer alguno de los jefes del otro mundo. Si le quitan todo esto, no puede llamarse “Mortal Kombat”.

Veremos cómo se desarrolla esta noticia, y si tenemos novedades de fechas pronto.

Finish Him!

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

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

DGG

Backups de repositorios subversion

Junio 8th, 2010 - [Enlace local]

Si queremos hacer un backup de un repositorio subversion o también por ejemplo exportarlo para importarlo en otro servidor podemos hacerlo fácilmente ejecutando unos simples comandos:

1.- Backup repositorio

$ svnadmin dump /var/svn/repository/  > /var/svn/repository.dump

2.- Mover el repositorio entre máquinas

scp ficheroOrigen userHostRemoto@host:ficheroDestino

3.- Creación del nuevo repositorio

svnadmin create /var/svn/repository

4.- Importar el dump del repositorio en el nuevo servidor svn

svnadmin load /var/svn/repository < repository.dump

Si teníamos también una instancia de Trac asociada a ese repositorio también es posible realizar un backup o hacer una migración al nuevo servidor Trac

1.- Backup de trac

trac-admin /pathToTracEnvironment hotcopy 

2.- Mover el backup entre máquinas

Si hay que mover el directorio entre máquina usamos la orden rsync o scp como antes

 rsync -avz /directory userHostRemoto@host:directory

3.- Restaurar el entorno de trac:

1.- Inicializar el entorno

a) trac-admin /pathToEnvironment initenv

b) Copiar los directorios del backup a este nuevo directorio

c) Ejecutar el comando upgrade trac-admin /pathToEnvironment upgrade

d) Cambiar los permisos para que el usuario del apache pueda leer y escribir sobre este directorio

Filed under: mini-tutorial Tagged: backup, subersion

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

Picando Código

Si no visitas este post, hay tabla – #haytabla

Junio 8th, 2010 - [Enlace local]

Hay tabla

Hay tabla

Basado en el hash #haytabla de Twitter.

Créditos: nicoman , juanpehar, mezquerra

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

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

Variable not found

Edición elegante de fechas con jQuery Datepicker y MVC, paso a paso

Junio 7th, 2010 - [Enlace local]

ASP.NET MVC Las plantillas de edición, incorporadas con la versión 2 de ASP.NET MVC, permiten crear muy fácilmente interfaces de edición reutilizables, y asociarlas a tipos de datos concretos.



En el caso de las fechas se trata de una práctica muy habitual, puesto que la edición por defecto para este tipo de campos casi nunca es suficiente y siempre tendremos necesidad de modificar este comportamiento.



Es decir, pongamos una entidad del Modelo como la siguiente:



public class Persona
{
    [Required(ErrorMessage="Dime el nombre, anda")]
    public string Nombre { get; set; }
 
    [Required(ErrorMessage="Hey, este dato es fundamental")]
    [DisplayName("Fecha de nacimiento")]
    public DateTime FechaNacimiento { get; set; }
}


Si generamos desde Visual Studio la vista de creación o edición por defecto de esta entidad, obtendremos un código, más o menos como el siguiente:

Formulario de edición de la entidad
(Por cierto, ya he hablado por aquí en otra ocasión sobre cómo generar el código correcto del andamiaje de edición para las entidades del Modelo con propiedades de tipo DateTime, decimal o double).



Ejecutando ahora la solución y accediendo a esta vista de edición podremos comprobar que el resultado está bastante lejos del que seguro desearíamos obtener. En particular, la fecha se introduce en un cuadro de texto bastante desarbolado y muy poco profesional:

 Edición de fechas por defecto 
Vamos a ver paso a paso cómo mejorar esto utilizando los templated helpers, una característica introducida en ASP.NET MVC 2 que nos brinda un mecanismo de creación de plantillas de visualización y edición de propiedades muy potente y reutilizable.



Datepicker en acciónConcretamente utilizaremos el widget Datepicker, incluido en el framework jQuery UI, que además de permitir la introducción manual de fechas con el formato correcto, permite la selección visual a través de un bonito calendario.



El post es un poco largo, pues iremos muy despacio y comentando cada paso, pero una vez sepáis hacerlo no tardaréis más de cinco minutos en activar este editor para todos los controles de introducción de fechas de vuestro sitio web :-)

1. Descargamos jQuery UI

El primer paso es hacernos con la infraestructura necesaria para implementar la solución, por lo que debemos descargar la librería jQuery UI. Aunque es un procedimiento sencillo, hay que tener cuidado con algunos detalles.



image
La página de downloads de jQuery UI permite personalizar el contenido del paquete a descargar. Por ejemplo, si únicamente vamos a utilizar el widget “DatePicker”, podríamos desmarcar el resto de componentes para aligerar el peso del paquete final.



Para pruebas, lo más sencillo es dejar marcados todos los elementos, así no nos dejamos por detrás nada; en producción sería mejor descargar una versión más ligera, sólo con los componentes que vayamos a utilizar.



También debemos elegir el tema visual a emplear. Esto es importante, pues determina la apariencia visual de los widgets empleados. En nuestro caso, seleccionaremos el tema “Start”, aunque hay una gran variedad de ellos a elegir, e incluso desde el mismo sitio web puedes personalizarlos y crear temas nuevos.



Proyecto MVC tras incluirle los archivosUna vez hecho esto, pulsamos el botón download y salvamos en nuestro equipo el archivo .zip generado. De él tendremos que extraer:

Por último, debemos descargar el archivo de localización al español del widget, que nos permitirá mostrar las fechas y mensajes en nuestro idioma, que debemos dejar también en el directorio /Scripts del proyecto.



La captura de pantalla adjunta muestra cómo quedaría el proyecto MVC tras incluir estos elementos.

2. Modificamos la vista

Si acudimos a la vista de edición de la entidad, observamos que la propiedad de tipo fecha se edita a través del control generado por el siguiente código:



<%= Html.TextBoxFor(model => model.FechaNacimiento) %>


De esta forma estamos diciéndole al framework, poco más o menos: “eh, genera un cuadro de texto para editar la propiedad FechaNacimiento del modelo”, es decir, explícitamente le indicamos que la fecha de nacimiento sea editada con un text box.



Pero como en este caso lo que nos interesa no es utilizar un cuadro de texto sino un editor más potente, modificamos dicha línea, dejándola como sigue:



<%= Html.EditorFor(model => model.FechaNacimiento) %>


Y ahora la cosa ha cambiado; la sustitución de TextBoxFor por EditorFor viene a ser como hubiéramos cambiado la frase anterior por “eh, genera un editor específico para la propiedad FechaNacimiento del Modelo”.



Este editor específico se trata de una vista parcial, una plantilla que podemos implementar en un archivo .ascx a nuestro antojo, incluyendo todos aquellos elementos que consideremos interesantes a la hora de ayudar al usuario a editar dicha propiedad.



Existen diversas vías para indicar a ASP.NET MVC la plantilla de edición a utilizar en cada caso, aunque aquí utilizaremos la forma más potente: la selección basada en el tipo de datos, un mecanismo compartido por la tecnología de datos dinámicos (Dynamic Data), que simplifica enormemente la construcción de interfaces.



Su funcionamiento es muy simple:

La potencia que tiene este método es que podemos reutilizarlo a lo largo y ancho de la aplicación. Siempre que tengamos que editar una propiedad de tipo fecha, si utilizamos EditorFor(), se utilizará la plantilla que hayamos creado para ello. De lo más DRY, vaya :-)



Otra ventaja es que esta solución es aplicable incluso a toda clase de tipos de datos. Es decir, podemos crear plantillas como “Boolean.ascx” para crear editores para valores lógicos, o “Persona.ascx” si lo que queremos es definir la plantilla para la edición de la clase Persona del Modelo.

3. Creamos la plantilla de edición

Al tratarse de componentes de la Vista, las plantillas de edición de un tipo concreto las crearemos dentro de la carpeta /Views del proyecto, y más concretamente en:

Utilizaremos la segunda opción, creando en dicha carpeta la plantilla “DateTime.ascx” utilizando la opción “Añadir vista” del menú contextual sobre la misma:



image


Observad que dado que vamos a implementar un editor para la clase DateTime, estamos creando una vista parcial fuertemente tipada hacia dicho tipo. El código para la plantilla DateTime.ascx es el siguiente:

Código de la plantilla DateTime.ascx
Comentamos rápidamente lo que podemos ver ahí:

4. Incluimos las referencias a las librerías de scripts y estilos

Por último, sólo nos falta añadir las referencias a las librerías y estilos en el punto donde nos interese:

En cualquier caso, el código será el mismo. Ojo, que es importante tener en cuenta el orden de las inclusiones:



<script src="<%= Url.Content("~/Scripts/jquery-1.4.1.min.js")%>" 
        type="text/javascript"></script>
<script src="<%= Url.Content("~/Scripts/jquery-ui-1.8.1.custom.min.js")%>" 
        type="text/javascript"></script>
<script src="<%= Url.Content("~/Scripts/jquery.ui.datepicker-es.js")%>" 
        type="text/javascript"></script>
<link href="<%= Url.Content("~/Content/start/jquery-ui-1.8.1.custom.css")%>" 
        rel="stylesheet" type="text/css" />


Como podéis observar, estamos utilizando el helper Url.Content para obtener la ruta absoluta de los recursos.

5. Y… ¡voilà!

¡Hemos terminado! Si ejecutamos ahora nuestra aplicación, podremos comprobar que tanto el aspecto como la usabilidad del resultado han mejorado notablemente:



image
Y lo mejor es que a partir de este momento todas las fechas que vayamos a editar en nuestra aplicación podrán beneficiarse de este editor simplemente introduciendo en las vistas la llamada al helper Html.EditorFor()  :-).



Como se puede comprobar, se trata de una solución muy elegante, productiva, fácil de mantener y respetuosa con el patrón MVC, de la que seguro no podréis prescindir en cuanto la utilicéis y veáis lo sencillo que resulta crearos vuestra propia biblioteca de editores personalizados.



Ah, dejo el proyecto de demostración, para Visual Studio 2008, en mi Skydrive, por si queréis comprobar "en directo" lo bien que queda ;-)



Publicado en: Variable not found.



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

Ingenieria de Software / Software Engineering / Project Management

Scope Creep

Junio 7th, 2010 - [Enlace local]

Interesante artículo de Mejores Proyectos aunque recalco que esta tarea se torna complicada en el ámbito del software por su aspecto intangible, es aquí donde la metodologías de software se vuelven importantes y que no basta con la metodología de proyectos sino que para la industria de software deba venir acompañada de una metodología de desarrollo o implementación

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

Variable not found

Enlaces interesantes 8

Junio 6th, 2010 - [Enlace local]

Estos son los enlaces publicados en Variable not found en Facebook desde el lunes, 24 de mayo de 2010 hasta el domingo, 06 de junio de 2010. Espero que os resulten interesantes :-)

Y no olvides que, si te interesa, 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...

Ingenieria de Software / Software Engineering / Project Management

UML Pasado, Presente y Futuro

Junio 6th, 2010 - [Enlace local]

Desde la aparición de la versión de UML 1.0 este estandar se ha posicionado bien dentro de la industria de software en lo particula me gusta mucho el lenguaje el cual es un mecanismo perfecto de comunicación entre la empresa de software y los clientes.

El siguiente artículo habla de una manera muy sintetizada de la historia de UML y menciona el posible futuro en la versión 3.0

Artículo

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

Picando Código

[Fotos] – Nuevo workspace :) escritorio nuevo

Junio 5th, 2010 - [Enlace local]

Hoy llegó el escritorio nuevo que compré con algo de ahorro y algún trabajito freelance. Mi espacio de trabajo se ve más amplio y mejoró su usabilidad. Hasta ahora venía usando la mesa para la computadora, pero ahí mismo comía, cocinaba, y hacía todo lo que necesitara una superficie para apoyar.

Dejo fotos de mi nuevo espacio de trabajo, que iré personalizando con el tiempo:

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

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

Buayacorp

Apple nos muestra HTML5 y los web standards, pero sin respetar los standards.

Junio 5th, 2010 - [Enlace local]

El día de ayer Apple nos presentó HTML5 and the web standards, un lugar donde podemos ver ejemplos de lo que se puede hacer combinando HTML5, CSS3 y Javascript. Como introducción nos dicen:

...Éstos web standards son abiertos, confiables, altamente seguros y eficientes. Permiten a los diseñadores y desarrolladores crear gráficos avanzados, tipografía, animación y transiciones. Los standards no son add-ons en la web. Son la web. Y puedes empezar a usarlos ahora mismo.

Entre los ejemplos que ofrecen está la capacidad de insertar video, tipografía, transiciones, audio, etc.

Obviamente se nota muy inspiradora la cita, sin embargo notamos que al querer entrar a ver los ejemplos obtenemos una gran advertencia:

Aca me entras con Safari, sino no me entras.

Si quieres tener una experiencia con este demo, simplemente ¡bájate el Safari!. Se supone que si es una demostración de web standards, pues debería poder ingresar tranquílamente con cualquier navegador moderno.

Con este tipo de actitudes Apple cada vez se está conviertiéndose en el Microsoft de hace unos años, obligándonos en cierta forma a usar software que no queremos o a comprar productos (sino fíjense los lindas fotos del iPhone, iPad y demás íes) que no necesitamos.

Veamos que reacciones tendremos en estos días.

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

Picando Código

Cazando invasores espaciales

Junio 5th, 2010 - [Enlace local]

No sé ni cómo llegué a estas fotos, pero están muy buenas:

Cazando Space Invaders

Cazando Space Invaders

Cazando Space Invaders

Cazando Space Invaders

Parece una mezcla de Space Invaders con Duck Hunt :P

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

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

Buayacorp

amelie() un “diabólico” script para deshacerse de IE6

Junio 4th, 2010 - [Enlace local]

Internet Explorer 6 ya nos tiene locos a todos, personalmente hay veces que tengo que hacer doble trabajo para que algo se vea en todos los navegadores e IE6.

Ahora que la misma gente de Microsoft está planeando destruir Internet Explorer 6, hay algunos otros que están ayudando en esta labor o al menos intentándolo.

Aprovechando el filtro MotionBlur que funciona en IE6 y usando este script se logra una extraña experiencia al navegar con IE6:

JAVASCRIPT:
 
if(document.all && !window.XMLHttpRequest){
var x = 1,when=0,str,dir,fil;
function amelie(){
  if(x == 2){ x = 0; }
  if(x == 0){
    str = 0; dir = 0;
    when = Math.floor( Math.random() * 10000 ) + 2000;
    setTimeout( 'amelie()', when );
  } else {
    str = Math.floor( Math.random() * 2 ) + 2;
    dir = Math.floor( Math.random() * 360 );
    setTimeout( 'amelie()', 500 );
  }
  var fil = "progid:DXImageTransform.Microsoft.MotionBlur(strength="+ 
            str + ",direction=" + dir + ",enabled='true')";
  document.body.style.filter = fil;
  x++;
}
setTimeout('amelie()',1000);
}

Podemos ver el funcionamiento en el siguiente video:

Según el autor del script, el diabólico plan que se tiene es:

  1. Usar amelie() en nuestros sitios.
  2. Fingir confusión y negar cualquier problema cuando las personas empiezen a quejarse y decir que nuestro código es correcto.
  3. Consultar a los expertos acerca de la “fatiga de software”. Este falso concepto debe indicar que el software, como cualquier otra máquina, se deteriora con el tiempo y empieza a comportarse de manera extraña (generalmente todos se creen esto).
  4. Correr el rumor de que la “fatiga de software” de IE6 no funciona bien con las tarjetas de video y que esto podría ser la razón del error.
  5. Consultar a otros expertos y vincular los dolores de cabeza generados por el trabajo de oficina con la mala visión.
  6. Por lo tanto, culpamos a IE6 de los problemas de salud y seguridad de las empresas logrando que todas las empresas actúen inmediatamente.

Enlaces

The Amelie approach to the IE6 problem.

Vía Ajaxian

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

Cerebro en la Sombra » Técnico

Reempaquetar el rpm de Portsentry para que loguee en su propio archivo

Junio 4th, 2010 - [Enlace local]

Desde hace mucho tiempo utilizo como media preventiva de seguridad el paquete Portsentry en los servidores para detectar potenciales accesos maliciosos y bloquearlos directamente en el firewall. El problema es que por defecto Portsentry deja sus logs en el archivo principal del sistema, /var/log/messages, lo que genera tal cantidad de ruido que es imposible encontrar algo útil en el log. El archivo donde loguea Portsentry no es configurable sino que viene predefinido en tiempo de compilación, con lo que deberemos recompilarlo si queremos que sea otro. Podríamos compilar e instalar el fuente directamente, pero no quiero perder las ventajas que ofrece rpm, veamos como hacerlo para Centos5.5 (o RHEL5.5).

Lo primero que debemos hacer es descargar e instalar el rpm con los fuentes desde aquí.

  1. #rpm -ivh portsentry-1.2-1.te.src.rpm

Ahora debemos modificar el archivo donde se configura dónde logueará:

  1. #cd /usr/src/redhat/SOURCES
  2. #tar xvfz portsentry-1.2.tar.gz
  3. #cd portsentry_beta

Editamos el archivo portsentry_config.h cambiando la línea 32 para que quede así:

  1. #define SYSLOG_FACILITY LOG_LOCAL6

Con esto simplemente le decimos que loguee al “facility” local6 en vez de al “daemon” por defecto.

Se guarda el archivo y se empaqueta de nuevo:

  1. #tar cvfz portsentry-1.2.tar.gz portsentry_beta

Ya podemos reconstruir el rpm:

  1. #cd /usr/src/redhat/SPECS
  2. #rpmbuild -ba portsentry.spec

Si todo va bien tendremos el paquete generado:

  1. #cd /usr/src/redhat/RPMS/x86_64

Y ahí estará nuestro portsentry-1.2-1.te.x86_64.rpm preparado para loguear donde queremos que lo haga. Sólo queda instalarlo. Si tu arquitectura es de 32bits lo encontrarás en /usr/src/redhat/RPMS/i386.

Nos queda un detalle, configurar syslog para que guarde donde nos interesa la facility local6. Para eso editamos /etc/syslog.conf. Añadimos al final de todo la línea:

  1. local6.*   /var/log/portsentry.log

y al principio de todo veremos algo parecido a:

  1. *.info;mail.none;authpriv.none;cron.none /var/log/messages

La cambiaremos por:

  1. *.info;mail.none;authpriv.none;cron.none;local6.none    /var/log/messages

Es decir, le decimos que de local6 no loguee nada en /var/log/messages. Solo nos queda reiniciar los demonios:

  1. #/sbin/service syslog restart
  2. #/sbin/service portsentry start

A partir de ahora tendremos nuestro log general bien limpio y la información de se seguridad separada.

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

Picando Código

Nueva oportunidad para certificarse como Scrum Master en Uruguay

Junio 4th, 2010 - [Enlace local]

Certified Scrum Master

Alan Cyment, el entrenador oficial de la Scrum Alliance, vuelve a Uruguay. Es una excelente oportunidad para introducirse al mundo de Scrum en una experiencia muy interesante que es el curso de Scrum en dos días.

Ya sea que estén trabajando como programadores, diseñadores, desarrolladores en general, Scrum es una excelente opción como metodología de trabajo. Asumo que sería aplicable a cualquier trabajo en equipo que requiera uso de la creatividad y el razonamiento.

Hace poco Tobias Mayer publicó algo en Twitter que me quedó grabado como una buena definición de Scrum:
Scrum es un framework basado en valores; no es una metodología, ni un proceso, ni una herramienta.

El curso se llevará a cabo el jueves 8 y viernes 9 de julio de 9:00 a 18:00 horas y tiene un costo de U$S 600. Publiqué en Aplicando Scrum el resto de la información:
Nuevo curso de Scrum Master certificado en Montevideo, Uruguay

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

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

Fetishcode

Tutoriales paso a paso de ADF

Junio 4th, 2010 - [Enlace local]

A

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

Información legal y técnica