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]
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 Twitter y Variable 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 :-)
- Eduard Tomàs "Sobre ir recorriendo enumerables" o también IEnumerable vs IEnumerator
Fecha: 11/06/2010 - Prevenir (al menos un poco) el copiado/pegado de texto en campos de un formulario web. Válido en Webforms, MVC o HTML.
Fecha: 11/06/2010 - Otra aportación de Microsoft a jQuery: Globalization Plugin.
Fecha: 11/06/2010 - Cómo detectar procesos que no responden.
Fecha: 11/06/2010 - Transactional File Manager: operaciones con archivos de forma transaccional.
Fecha: 10/06/2010 - Permitiendo caracteres raros en el path y el querystring. Poderse, se puede; otra cosa es que se deba...
Fecha: 10/06/2010 - Persistencia de sesiones ASP.NET entre distintas instancias del navegador.
Fecha: 10/06/2010 - Disponible Visual Studio Pro Power Tools. Por fin un filtro al añadir referencias y ¡copiar y pegar código en HTML! :-)
Fecha: 09/06/2010 - Gestión global de la validación de peticiones en ASP.NET MVC.
Fecha: 09/06/2010 - Colecciones en .NET, magnífico post de José Miguel Torres. Inicio de una serie que promete.
Fecha: 09/06/2010 - Helper para facilitar el uso de jqGrid en ASP.NET MVC.
Fecha: 08/06/2010 - HTML 5 en un vistazo.
Fecha: 08/06/2010 - Plantilla de edición para botones de tipo radio en MVC 2.
Fecha: 08/06/2010 - Mapeo, DTO's y ViewModels en ASP.NET MVC.
Fecha: 07/06/2010
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
. 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
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
, 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
), 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…
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
).
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:
- 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.
- 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.
- 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 ![]()
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:
» 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:
» 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]
Basado en el hash #haytabla de Twitter.
Créditos: nicoman , juanpehar, mezquerra
Comparte:
» 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]
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:
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:
Concretamente 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.
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.
Una vez hecho esto, pulsamos el botón download y salvamos en nuestro equipo el archivo .zip generado. De él tendremos que extraer:- por un lado, la hoja de estilos (.css) e imágenes utilizadas por el tema elegido, disponibles dentro de la carpeta
/css/startdel archivo .zip que hemos descargado. Descomprimimos esta carpeta sobre el directorio/Contentde nuestro proyecto MVC. - el archivo de scripts, jquery-ui-1.8.1.custom.min.js, disponible en la carpeta
/jsdel fichero .zip, que descomprimimos sobre la el directorio /Scripts de nuestro 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:
- Durante la ejecución de la llamada al helper
Html.EditorFor(), el framework examinará la propiedad que deseamos editar, determinando que se trata, en este caso, de un tipoDateTime. - Si existe una plantilla llamada “DateTime.ascx” en un directorio definido por convención, renderizará su contenido como editor para la propiedad.
- En caso contrario, intentará generar un editor por defecto.
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:/Views/{ControladorActual}/EditorTemplates, si lo que queremos es que la plantilla sea utilizada exclusivamente dentro del contexto de un controlador./Views/Shared/EditorTemplates, lo más frecuente, si queremos que la plantilla de edición sea utilizada desde cualquier punto del sistema.
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:
- La vista parcial hereda de
ViewUserControl<DateTime>, pues es el tipo de datos sobre el que va a operar. La propiedadModela nivel de vista será por tanto una fecha. - Lo primero que hacemos es generar, ahora sí, un cuadro de edición para editar el valor suministrado. Aquí destacan varios detalles:
- en primer lugar, el nombre o identificador de la propiedad está como cadena vacía. Esto es así porque es la vista que utiliza esta plantilla la que le suministrará el nombre; tened en cuenta que el mismo editor podría ser utilizado para varias propiedades, por lo que no tendría sentido introducir aquí el nombre de ninguna de ellas.
- A continuación asignamos un valor inicial al control, que obtenemos formateando la fecha.
- Por último, añadimos varios atributos HTML al tag <input>, como el tamaño máximo del texto o la clase CSS que queremos utilizar.
- Incluimos también en la vista un texto fijo indicando el formato de la fecha (dd/mm/aaaa).
- Finalmente, creamos el script que hace la magia. Detectamos si están presentes tanto jQuery como Datepicker y, en caso afirmativo, inicializamos el plugin para que tome el control del cuadro de edición que acabamos de generar.
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:- si vamos a utilizar el editor u otras características de jQuery, o UI por toda la aplicación, lo más razonable es incluirlas en la página maestra del sitio,
- en caso contrario, si se trata de un uso puntual, podemos añadirlas exclusivamente a la vista donde se necesite.
<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:
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 :-)
- Validación condicional en ASP.NET MVC.
Fecha: 04/06/2010 - RT Bruno Capuano: New blog post: [EVENTO] Java vs Net vs Java vs Net vs Java vs Net …
Fecha: 03/06/2010 - Uso de diccionarios para sustituir bloques switch o múltiples sentencias if.
Fecha: 02/06/2010 - Smacchia comenta la orientación de C# 5 hacia la metaprogramación.
Fecha: 02/06/2010 - Interesante howto sobre validación en ASP.NET MVC (en PDF descargable).
Fecha: 02/06/2010 - Creación de informes con el control Chart y ASP.NET MVC.
Fecha: 02/06/2010 - RT Eduard Tomàs: ModelBinders vs Value Providers y un ejemplo de ello usando JSON...
Todo lo que los geeks de Windows y .Net tienen que contar en sus blogs y en nuestros foros
Fecha: 01/06/2010 - Uso de ViewModels dinámicos para eliminar lógica de presentación en las vistas. Fecha: 31/05/2010
- Evolución del sonido en nuestro PC, utilizando como muestra la BSO de Monkey Island. Fecha: 31/05/2010
- JM Alarcón Aguín: "Serializar objetos comprimiéndolos antes para ahorrar espacio y los problemas que podremos tener"
Fecha: 31/05/2010 - La conversión entre tipos no cumple la propiedad distributiva.
Fecha: 31/05/2010 - Magnífico post de Gisela Torres sobre OAuth.
Fecha: 31/05/2010 - Uso del plugin jQuery Autocomplete con ASP.NET MVC.
Fecha: 28/05/2010 - Código fuente de ejemplo de proveedor EF4 para SQL Server.
Fecha: 28/05/2010 - Creación de proyectos que contienen sólo archivos estáticos en Visual Studio.
Fecha: 28/05/2010 - Proyectos open source para facilitar la interoperabilidad con archivos .pst de Outlook.
Fecha: 26/05/2010 - Publicado Fluent NHibernate 1.1.
Fecha: 26/05/2010 - Second Nug: Tercer aniversario de SNUG
Fecha: 25/05/2010 - Retorno de información de contacto desde ASP.NET MVC: vCard ActionResult.
Fecha: 24/05/2010 - Abstracciones de clases intrínsecas de ASP.NET usadas por el framework MVC para facilitar el testeo.
Fecha: 24/05/2010
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
» 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:
» 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:

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:
Parece una mezcla de Space Invaders con Duck Hunt
» 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:
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:
- Usar amelie() en nuestros sitios.
- Fingir confusión y negar cualquier problema cuando las personas empiezen a quejarse y decir que nuestro código es correcto.
- 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).
- 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.
- Consultar a otros expertos y vincular los dolores de cabeza generados por el trabajo de oficina con la mala visión.
- 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.
» 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í.
-
#rpm -ivh portsentry-1.2-1.te.src.rpm
Ahora debemos modificar el archivo donde se configura dónde logueará:
-
#cd /usr/src/redhat/SOURCES
-
#tar xvfz portsentry-1.2.tar.gz
-
#cd portsentry_beta
Editamos el archivo portsentry_config.h cambiando la línea 32 para que quede así:
-
#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:
-
#tar cvfz portsentry-1.2.tar.gz portsentry_beta
Ya podemos reconstruir el rpm:
-
#cd /usr/src/redhat/SPECS
-
#rpmbuild -ba portsentry.spec
Si todo va bien tendremos el paquete generado:
-
#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:
-
local6.* /var/log/portsentry.log
y al principio de todo veremos algo parecido a:
-
*.info;mail.none;authpriv.none;cron.none /var/log/messages
La cambiaremos por:
-
*.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:
-
#/sbin/service syslog restart
-
#/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]
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
» Leer más, comentarios, etc...
Fetishcode
Tutoriales paso a paso de ADF
Junio 4th, 2010 - [Enlace local]
A





