Mostrando las entradas con la etiqueta Microsoft. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Microsoft. Mostrar todas las entradas

viernes, julio 30, 2010

Recursos de ASP.NET MVC

Debido a un posible próximo proyecto con un cliente, me solicito le pasara una lista de recursos para conocer ASP.NET MVC, ya que su idea original era realizar el proyecto con ASP.NET Webforms, pero después de hablarle un poco de MVC y realizarle algunos demos, su interés por el mismo crecio.

De algunas de las platicas que tuve con él, al principio no estaba muy convencido, debido a que como él me lo comento "parece que en MVC tienes que hacer las cosas a mano", ya que no haríamos uso del "drag and drop" ni de la suite de controles web de Infragistics como él deseaba. Mis puntos para que se interesara en MVC fueron los siguientes:
  • El patrón de MVC es una "receta" probada por varias décadas
  • El usar MVC generalmente implica el uso de otra serie de patrones adicionales para resolver otros problemas en la aplicación
  • Aplicando estas "recetas" ayuda a que el desarrollo de la aplicacion sea mas uniforme si se siguen ciertos lineamientos, los cuales creo que son mucho mas claros si los comparamos con una aplicacion de Webforms
  • El usar MVC crea una linea de complejidad de la aplicacion mas estable, la cual puede ser un poco alta para pequeños proyectos, mas no asi para medianos y grandes, donde esta complejidad es mas uniforme, en cambio con Webforms la complejidad si es muy baja en proyectos pequeños, pero esta se va incrementando casi exponencial con proyectos mas grandes.
  • Otro punto importante es que en MVC se puede desarrollar y probar funcionalidad de la aplicación de manera aislada, mediante el uso de tecnicas y herramientas como: mocks, stubs, TDD o BDD, lo que permite ir creando bloques estables de la aplicacion e irla creciendo organicamente.
A final de cuentas, no se cual sea la decision del cliente con respecto al proyecto, espero me sea favorable, pero mientras tanto aqui les dejo el listado de recursos que le hice llegar sobre ASP.NET MVC esperando que les sirva de algo.

Libros interesantes
- Brownfield Application Development in .NET http://www.manning.com/baley/

Herramientas y arquitectura
- SharpArchitecture, framework para MVC http://sharparchitecture.net/

Videos
- Comunidad C4MVC.NET http://www.c4mvc.net/Home/Events
- Tekpub, videos de paga http://tekpub.com/production/aspmvc

Recursos de sitios y páginas interesantes
- Links de Gabriel Flores @gabo http://delicious.com/gabofr/mvc

viernes, junio 19, 2009

Como mover una DB o archivo de una DB MSSQL a otro disco

Curiosamente, esta pregunta me la hecho ya un par de ocasiones distintas personas en unos pocos días, por tal motivo realizo este post con la información pertinente de como hacerlo.

Pero antes de avanzar, la pregunta obligada es ¿Porque mover la DB o algún archivo de la DB a otro disco? Bueno, las causas pueden ser muchas, pero algunas de la posibles son:

  • El MSSQL Server por default instalo sus base de datos como master, model, tempdb en el mismo disco duro donde esta instalado el sistema operativo, esta es una mala practica.
  • El disco donde tenemos las DB ya esta a punto de llenarse o ya se lleno.
  • Por cuestiones de rendimiento es mejor mover tempdb, cuando se generan reportes complejos, a otro disco diferente a donde están las DBs con datos.
  • Igual por cuestiones de rendimiento es aceptable el mover los archivos de log del disco donde están los datafiles a otro diferente.

Para realizar esta operación hay que seguir los siguientes pasos:

Abrir el query analyzer y para mover, por ejemplo la db tempdb hay que ejecutar primero el siguiente comando para obtener información de ella:

USE TempDB
GO
EXEC sp_helpfile
GO

Esta nos va a mostrar información similar a la siguiente:

name fileid filename filegroup size
——- —— ————————————————————– ———- ——-
tempdev 1 C:Program FilesMicrosoft SQL ServerMSSQLdatatempdb.mdf PRIMARY 16000 KB
templog 2 C:Program FilesMicrosoft SQL ServerMSSQLdatatemplog.ldf NULL 1024 KB

Este resultado nos indica la ruta de donde están los archivos que deseamos mover.

Lo importante aquí es anotar los nombres de la primer columna porque los vamos a necesitar en el siguiente paso:

USE master
GO
ALTER DATABASE TempDB MODIFY FILE
( NAME = <FILE1>, FILENAME = '<FILEPATH1>.mdf' )
GO
ALTER DATABASE TempDB MODIFY FILE
( NAME = <FILE2>, FILENAME = '<FILEPATH2>.ldf' )
GO

Hay que reemplazar <FILE1> y <FILE2> con los nombre obtenidos en el primer script y también reemplazar <FILEPATH1> Y <FILEPATH2> con la ruta completa y el nombre de archivo a donde se van a mover - aunque todavía no se hayan movido - los archivos, una vez que el script esta correcto, hay que ejecutarlo; posteriormente hay que apagar el servicio del servidor de sql.

Una vez apagado el servicio de sql, hay que ir al disco duro y mover los archivos de su ubicación original - ver resultado del primer script -, para ponerlos en la nueva ruta que indicamos en el segundo script.

El ultimo paso consiste en iniciar el servicio del sql server y este ya debe de estar haciendo uso de la nueva ubicación de los archivos.


viernes, abril 17, 2009

Microsoft, you did it again !

A principios de este año, se origino una polémica por una parte de la comunidad de desarrolladores de Microsoft, en relación a la mala calidad de diseño y código de la aplicación Oxite, la cual inicialmente en su sitio web citaba que era una aplicación que podría ser usada como guía para el desarrollo de aplicaciones con el framework ASP.NET MVC.

La polémica causo que se quitara la leyenda de que era una aplicación de referencia y que entrara sobre una fuerte re-factorizacion para cubrir los puntos criticados por la comunidad.

Pues, Microsoft lo ha hecho otra vez. En esta ocacion Microsoft libero en su centro de arquitectura la aplicación Kobe: Kit de recursos de desarrollo y servicios Web 2.0; la cual segun su descripcion es:

El proyecto Kobe es un kit de recursos de iniciación para la planeación, arquitectura e implementación de aplicaciones y servicios Web 2.0 que usen la plataforma de Microsoft. Este kit de recursos tiene como enfoca a los que toman decisiones tecnologicas, arquitectos de soluciones, gerentes de desarrollo y programadores que aspiran al desarrollo de empresas "Startups" y de negocios - corporativas, que buscan invertir en nuevas aplicaciones/servicios Web 2.0

Hasta aquí todo esta bien, pero el problema se origino una vez mas cuando la comunidad comenzó a analizar el código fuente de Kobe y se encontró con que repitió muchos de los errores iniciales de Oxite, ademas de introducir sus propios errores, simplemente voy a lista algunos de los puntos que se trataron ya en los blogs en Ingles:

  • Controladores "Gordos", demasiado código dentro de los controladores
  • Métodos complejos y muy largos
  • Uso de cadenas de texto "mágicas"
  • Un controlador puede regresar diferentes vistas bajo una gran cantidad de condiciones
  • Bloques try-catch usados de forma absurda
  • No hay separación en la lógica y la vista
  • Uso de dos diferentes frameworks de JavaScript
  • Manejo extraño CSS
  • Inconsistencia en el código y los nombres de variables
  • Código que nunca se ejecuta
  • Abuso de ViewData
  • Entre otros muchos mas
El día de hoy Microsoft opto por retirar el código fuente de la aplicación, usando la siguiente nota como explicación:

Esta aplicación de ejemplo esta siendo actualizada para incorporar la retro-alimentación de la comunidad. Una versión actualizada va a ser publicada nuevamente en corto tiempo.

Mi pregunta, es ¿Porque?, ¿Porque Microsoft? ¿Porque no se tomo como base la experiencia previa con Oxite?, ¿Porque si gente como Scott Hanselman, Phil Haack y Rob Conery, que trabajan para Microsoft y que en Mix09 evangelizaron sobre como debe de ser la anatomía de una aplicación ASP.NET MVC no se tomaron en cuenta para desarrollo de Kobe?, o ya de perdida los desarrolladores de Kobe hubieran comprado el libro "Profesional ASP.NET MVC 1.0", en donde también participa Scott Guthrie ademas de los antes mencionados.

¿Que esta pasando, acaso las aplicaciones de referencia de Microsoft cada vez son mas malas? o ¿Ya antes eran así, solo que nadie levantaba la mano para criticarlas?, o ¿Simplemente la comunidad hace mucho escandalo por detalles insignificantes?

Sitios donde se comenta sobre Kobe:

Ayende - Kobe – In the nuts & bolts and don’t really liking it
Karl Seguin - Kobe - Oh Dear Lord Why?!
Kazi Manzur - KOBE – MS NEW WEB 2.0 RESOURCE KIT IN ASP.NET MVC AND MY THOUGHTS
Phil Haack - Code Sample Taxonomy


sábado, abril 04, 2009

ALT.NET

Desde principios del 2007 en las comunidades de Microsoft, principalmente es Estados unidos, se comenzó a generar un movimiento: ALT.NET, el cual de manera muy simplista me atrevo a decir que propone una mente abierta sobre las cuestiones de desarrollo y el uso de principios y practicas sobre el uso de herramientas, es decir las herramientas pasan a un segundo plano, ya sean de Microsoft, terceros u open source.

Algunos grupos dentro de Microsoft no han visto con malos ojos este movimiento, de hecho la primera presentación de ASP.NET MVC, cuando aun era un concepto se realizo en un evento Open Spaces de ALT.NET.

Realmente no voy a abundar sobre este tema ya que me encontré un excelente post de Jorge Gamba al respecto, en donde él realiza una completa descripción del concepto ALT.NET, y aparte propone la creación de ALT.NET Hispano, idea que en lo personal me parece excelente, mientras tanto ya hay un grupo de discusión en Google: ALT.NET Hispano.

Por cierto en este momento en Huston se esta llevando a cabo el evento ALT.NET Huston y se están transmitiendo grabado las sesiones para Internet: http://www.kyte.tv/ch/272888-altnethouston


miércoles, abril 01, 2009

ASP.NET MVC 1.0 es open source

El día de hoy Microsoft ha anunciado que su oferta de patrón MVC para el desarrollo de aplicaciones Web, ASP.NET MVC 1.0, ha sido liberado bajo la licencia MS-PL, la cual es compatible Open Source.

Esto implica que cualquiera puede tomar el código fuente, hacerle cambios, realizar un "fork" o adaptarlo/compilarlo para que se ejecute legalmente en las plataformas soportadas por Mono.

No me extrañaría que Miguel de Icaza y su equipo anuncie en un periodo corto el soporte oficial para el ASP.NET MVC

Nota: No es una broma de April fools

miércoles, marzo 18, 2009

ASP.NET MVC 1.0

Después de que la versión final del ASP.NET MVC 1.0 no fue liberada a finales de Febrero como se había mencionado, no era un secreto que iba a ser liberada en el Mix09, y así fue.

Ya se puede descargar la versión 1.0 del ASP.NET MVC.

Ademas aquí hay una lista de aplicaciones de ejemplo.

Y en caso de que alguien se lo hubiera perdido, aquí se puede descargar todo un capitulo del libro "Professional ASP.NET MVC 1.0", donde explica como crear el sitio nerddinner.com


martes, diciembre 16, 2008

Oxite, el proyecto que termino quemandose solo


Hace algunos días se anuncio con mucho eco Oxite, un manejador de contenido Web desarrollado por Microsoft. El revuelo que causo en algunos lados era debido a que esta desarrollado con el ASP.NET MVC Framework y que esta acompañado de una licencia Open Source - Ms PL -.

Por otro lado en algunos sitios se llego a mencionar que ahora Microsoft quería competir contra WordPress.

Oxite nació, como se como una herramienta Open Source para el manejo de contenidos del sitio Mix Online de Microsoft, y según la pagina en Codeplex de Oxite, tiene dos objetivos principales:
1.- Ser un ejemplo de funcionalidad base de un blog
2.- Ser un ejemplo de una aplicación real desarrollada en ASP.NET MVC

Ante la publicidad que Microsoft le ha proporcionado a Oxite, sobre todo señalando que es una aplicación "real" de ASP.NET MVC, no era de extrañarse que ante la falta de aplicaciones guía para el desarrollo con ASP.NET MVC una horda de programadores "corrieran" a descargar el código fuente y empezar a utilizarlo como base para otras nuevas aplicaciones, del 5 de Diciembre a la fecha el código fuente se ha descargado 15,326 ocasiones.

Pero días después, ya que "humo" alrededor de Oxite se ha asentado le han empezado a caer las criticas al ser una aplicación pobremente realizada. El primer critico de la aplicación fue Rob Conery - Microsoft -, el menciona lo siguiente:

* La aplicación esta abierta a ataques, ya tiene vulnerabiliades XSS - Cross-site Scripting -, al omitir el uso de Html.Encode para desplegar texto en la pagina.

* En términos de arquitectura hace uso del patrón Repository, pero delegan al patrón la tarea de crear sus DataProviders en lugar de hacer uso de Inyección de Dependencias, permitiendo así que los DataProviders se inicialicen únicamente una vez de forma Singleton.

* Critica el uso de controladores como capa de negocio o "Fat Controllers"

* Recomienda separar y agrupar las acciones de los controladores por áreas funcionales.

* Evitar usar ViewData como cubeta donde "tirar" datos, ya que la ideología tanto de los controladores como de las vistas es ser "ligeras" como sea posible.

* Extraer la lógica de las vistas y moverla a "Helpers", evitando así el código espagueti de Oxite.

Por su lado Karl Seguin critica los siguientes puntos:
* La arquitectura esta sobre-diseñada

* La falta de pruebas de unidad, integración y funcionales, después de todo el Framework MVC favorece al uso de pruebas para asegurar el funcionamiento de la aplicación.

* Al igual que Rob, comenta sobre el abuso de los controladores, con lógica que no debería de estar ahí, y la falta de Inyección de dependencias para el manejo de las mismas.

* También menciona el hecho de las Vistas con código espagueti y el abuso de ViewData

* Otro punto importante es porque la aplicacion hace uso de Linq To SQL, si su futuro esta dudoso, ya que Microsoft favorece Linq To Entities.

* También critica la desaparición de la M del acrónimo MVC, indicando que la V se desarrollo de forma mediocre y la C completamente horrible.

* Para rematar hace una serie de observaciones sobre inconsistencias en el código donde parece que intervinieron varias personas, pero cada una aplico su estilo propio.

Chad Myers recomienda sobre Oxite:
* Oxite debe de ser retirado hasta que se arreglen por lo menos los problemas de seguridad

* Oxite no debe de ser visto como base o guia para desarrollar aplicaciones ASP.NET MVC

* Si quieres aprender ASP.NET MVC y no te es familiar el patrón MVC, alejate lo mas que puedas de Oxite.

Y para finalizar aqui hay un post de Scott Koon aka "lazycoder" donde compila una serie de posts criticando Oxite, pero tambien invita a la gente a aportar a Oxite, ya que al ser Open Source es posible que se pueda corregir.

Con esto queda demostrado que ASP.NET MVC no es un "Silver bullet" para el desarrollo de aplicaciones Web, y que cualquier herramienta/tecnologia puede ser abusada al extremo y sin piedad.

Si quieres conocer ASP.NET MVC te recomiendo ver el código fuente de CodeCampServer y SharpArchitecture, ambas proveen de una buena guía como usar ASP.NET MVC.

jueves, diciembre 11, 2008

Curso ASP.NET Upgrade información para asistir

 Ya esta disponible la información para asistir al curso ASP.NET Upgrade.

Como mencione en un post anterior, el curso iniciara el Sábado 10 de Enero, continuara el sabado 17 de Enero y finalizara el sabado 24 de Enero 2009 en las instalaciones de IT@Baja.

IT@Baja Clúster de TI de Baja California
Dirección:
Blvd. Díaz Ordaz, 4558-209,
Edificio Salomón Local 209,
Col. Las Palmas, Tijuana, B.C.
Tijuana, B.C. 22123

El costo del curso es de 500.00 pesos -pago único por los tres días - como cuota de recuperación, NO DEPOSITES ANTES DE CONFIRMAR TU LUGAR !.

Para confirmar sigue estos pasos:
1. Envía un mail a Gabriel Flores con la intención de apartar lugar en el curso
2. Se te responderá con un mail si aún hay cupo
3. Deposita tu cuota de recuperación en
Banamex
Cuenta de Cheques Sucursal 13 Cuenta 7692082
Nombre Gabriel Flores Romero
4. Envía un scan de la ficha de depósito a Gabriel Flores por mail
5. Te esperamos en las instalaciones del Clúster

Temario del curso esta disponible en la pagina de la Comunidad Tijuana.NET.

miércoles, noviembre 26, 2008

LINQ2SQL: Recuperandonos de errores al crear un registro nuevo

El día de hoy me preguntaron como manejar conflictos en el DataContext de LINQ al insertar nuevos datos - específicamente si falla debido a un valor duplicado en algún cambio que tenga indice único -.

Supongamos que tenemos el siguiente método que nos permite crear una nueva Categoría en nuestra DB, tomando como entrada la categoría y la descripción de la misma; categoría en nuestra base de datos tiene un indice de tipo único, por lo tanto no pueden existir dos categorías con el mismo nombre.

private void CreaCategoria(string categoria, string descripcion)
{
var categoria = new Categoria(categoria, descripcion);
context.Categoria.InsertOnSubmit(categoria); // context es un DataContext inicializado en alguna
          // parte de nuestro programa y Categoria es el 
          // nombre de nuestra tabla

try
{
context.SubmitChanges(ConflictMode.FailOnFirstConflict);
} catch (ChangeConflictException ex)
{
// Manejo de la excepcion, a la mejor un MessageBox al usuario indicando el error.
}
} 

El método aquí mostrado va funcionar correctamente en nuestro escenario si lo llamamos para crear una categoría nueva:

CreaCategoria("Categoria 1", "Primera categoria");

Pero si lo mandamos llamar para crear otra categoria con el mismo nombre el método va a fallar y vamos a recibir el mensaje de alguna forma.

CreaCategoria("Categoria 1", "Segunda categoria");

Falla, porque como se menciono el campo Categoria tiene un indice único, y aunque llamemos una tercera vez el método con los valores correctos:

CreaCategoria("Categoria 2", "Segunda categoria");

El método va continuar fallando aun y cuando ya estamos creando un nuevo objeto con los valores correctos, esto se debe a que el DataContext que creamos mantiene registro del registro invalido de nuestro intento previo al anterior.

La forma de como solucionar esto es, agregando lógica en el bloque de captura de la excepción para que que el DataContext elimine ese dato invalido de su registro, esto lo podemos hacer manipulando la colección ChangeConflicts que nos ofrece DataContext y que es donde residen todos los objetos con algún problema.

Podemos recuperarnos de este error de dos forma, la primera es eliminando todos los objetos con conflicto en nuestro DataContext, lo cual no puede ser muy buena idea, pero si así lo deseamos, lo podemos hacer de la siguiente forma:

context.ChangeConflicts.Clear();

o podemos ser mas especifico y solo eliminar el objeto que estamos tratando de insertar:

context.ChangeConflicts.Remove(categoria);

Por lo tanto nuestro método quedaría como sigue, y nos permitiría intentar crear una vez mas la categoría, ya que el usuario soluciono el problema:

private void CreaCategoria(string categoria, string descripcion)
{
var categoria = new Categoria(categoria, descripcion);
context.Categoria.InsertOnSubmit(categoria); // context es un DataContext inicializado en alguna
          // parte de nuestro programa y Categoria es el 
          // nombre de nuestra tabla

try
{
context.SubmitChanges(ConflictMode.FailOnFirstConflict);
} catch (ChangeConflictException ex)
{
// Manejo de la excepcion, a la mejor un MessageBox al usuario indicando el error.
context.ChangeConflicts.Remove(categoria);
}
} 

viernes, noviembre 07, 2008

ASP.NET Upgrade: Curso de la Comunidad Tijuana.NET

Pues hoy por fin se anuncio en la pagina de la comunidad, el curso llamado ASP.NET Upgrade, el cual pretende actualizar conocimiento sobre la tecnologia ASP.NET.

El curso se somprende de tres sesiones con una gran cantidad de topicos, los dias en que se llevara a cabo son los sabados 29/Nov, 6/Dic y 13/Dic, en un lugar todavia por definirse, en esta ocasion el curso completo (3 dias) no sera gratuito, pero el costo del mismo sera simbolico.

ASP.NET Momentum
Gabriel Flores - 29/nov/2008
  • Introducción a ASP.NET Ajax
  • Aplicaciones web con Visual Studio 2008
  • Introducción a Silverlight
  • Windows Azure
    • SQL Data Services
    • .NET Services
    • Live Services

Tópicos avanzados en .NET

Mario Alberto Chávez - 6/dic/2008
  • Source Control System
  • Separation of Concerns (SoC)
  • Interface based programming
  • Inversion of Control (IoC)
  • Test Driven Development
  • Unit and integration testing

ASP.NET MVC
Mario Alberto Chávez - 13/dic/2008
  • LINQ
  • Repository pattern
  • Object relational mapping with NHibernate
  • MVC Framework

sábado, septiembre 27, 2008

Msdn blogs hackeados?

Hoy intentando leer un post sobre MEF en los blogs de MSDN de Microsoft, me aparecio el siguiente error 404. 

Lo curioso, es que el mensaje me da la opcion de buscar en Google y no en MSN Search;  ademas me aparece un mensaje indicando que Firefox es recomendable para navegar el sitio de Microsoft.

Después de varios intentos de cargar la pagina finalmente me desplegó el contenido esperado, asi que la unica explicacion lógica para mi, es que blogs.msdn.com fue hackeado.


martes, septiembre 23, 2008

CodeCamp Comunidad TJ.NET



La Comunidad TJ.NET esta planeado la realización de un evento denominado CodeCamp.

Un CodeCamp es un evento que se rige por algunas normas simples:
- Es un evento de desarrolladores para desarrolladores, es un espacio en donde como desarrolladores vamos a mostrar como solucionamos los problemas en este campo con la intención de que si otros experimentan problemas similares, puedan aprender de experiencias previas.

- Es un evento gratuito, aun que se contempla algún tipo de cooperación para refrigerios y la hora de la comida.

- Todo el material mostrado en el evento debe ser proporcionado a los asistentes sin ninguna restricción de contenido.

- Al puro estilo de Jerry Mcguire, el mantra es "Show me the code", las presentaciones deben de ser practicas, las presentaciones powerpoint no son bienvenidas del todo.

- El evento se realizara fuera del horario de trabajo o días laborables, en este caso se contempla en día sábado, esperando que las personas que trabajan, nos puedan acompañar y participar.

- Las laptops en el evento son bienvenidas, ya mencione que las sesiones serán practicas?, buenos pues una laptop no caería nada mal.

- El horario contemplado para el evento es de 9am a 4pm en día sábado, lo cual nos da un total de seis sesiones posibles con una hora para comer.

- Si eres parte de una empresa de desarrollo y deseas participar en una sesión, solo recuerda que no es un evento de mercadotecnia para promocionar tu producto, es sobre compartir experiencias de como han enfrentado problemas durante su proceso de desarrollo.

Por favor si tienen sugerencias sobre sesiones en las que estarían interesados ver o participar, compartanlas con nosotros en los foros de la Comunidad TJ.NET o directamente a los correos de mario.chavez y gflores @tjnet.org.

Estén también pendiente al sitio de la Comunidad TJ.NET, ahí se avisara del lugar y el día del evento, ademas de la información de registro, ya que por la naturaleza del evento el cupo puede llegar a ser limitado.

Imagen bajo licencia de Creative Commons, fuente original

jueves, septiembre 18, 2008

Programación Web: Patrón MVC

Los patrones son una parte importante en el desarrollo de aplicaciones, ya que nos proporcionan soluciones probadas para problemas comunes o recurrentes.

En este caso el patrón MVC ofrece una metodología consistente en el desarrollo de aplicaciones que interactuan con el usuario para la manipulación de información.

MVC es un patrón de arquitectura y que debe su nombre a los tres elementos que lo componen, Model-View-Controller (Modelo-Vista-Controlador). El objetivo de este patrón es separar la lógica de negocios de la interface gráfica de manera que cambios en la misma no afecten a la lógica de negocios. A este concepto de aislar bloques de nuestra aplicación de otros mas que la componen se le conoce como "Separación de preocupaciones" (Separation of concerns - SoC -)

El modelo representa a la información que tanto el usuario como la aplicación puede manipular. La vista implica todos los elementos que componen la interface gráfica, como cuadros de texto, botones, rejillas, etc.

El controlador maneja la interacción y la comunicación entre el modelo y las acciones del usuario como teclas o movimientos del mouse.

Este patrón fue descrito en 1979 por Trygve Reenskaug y fue implementado inicialmente en el lenguaje Smalltalk. Durante este tiempo, este patron ha sido implementado en una gran cantidad de Frameworks para aplicaciones Web y de escritorio como:
Aunque últimamente ha cobrado popularidad en el desarrollo de aplicaciones Web, su uso en aplicaciones de escritorio es extendido, por ejemplo Oracle Applications, que es el software ERP de Oracle, ha migrado algunos de sus módulos de Oracle Forms al framework Oracle Applications Framework.

Otro caso es OSX cuyo modelo de programación para aplicaciones con el framework Cocoa es basado en el patrón MVC, por lo tanto, prácticamente todas las aplicaciones que se ejecutan en OSX funcionan con este patrón.

Después de esta introducción nos vamos a enfocar en como el framework ASP.NET MVC funciona y de que manera lo podemos utilizar en conjunto con el patrón ActiveRecord implementado por Castle ActiveRecord.

El Microsoft ASP.NET MVC framework es relativamente nuevo, a finales del 2007 se anuncio sobre el inicio de sus desarrollo, durante este tiempo Microsoft ha hecho publico su código fuente (bajo una licencia muy limitada), ademas de publicar cinco "Code Previews" y con la promesa de tener una versión beta disponible en los próximos meses.

La forma en como este patrón funciona en ASP.NET MVC se describe a continuación
  1. El usuario navega hacia una URL de nuestro sitio web
  2. El controlador correcto recibe la acción que se debe ejecutar
  3. El controlador se comunica para modelo para indicar alguna acción a tomar
  4. El modelo regresa datos si es que la acción que se esta ejecutando así lo requiere
  5. El controlador pasa los datos a la vista a través del objeto ViewData, y llama a la vista
  6. La vista, que funciona como plantilla, genera el código HTML que se desplegara en el navegador del usuario al final de la acción.

ASP.NET MVC Framework
La introducción presentada aquí al ASP.NET MVC Framework es una introducción rápida, donde se omiten algunos detalles conscientemente con la finalidad de que el post no sea muy largo, ademas de que el tema aquí tratado se vio en el curso que se llevo a cabo en el ITT.

Cuando creamos un nuevo proyecto para MVC desde Visual Studio, por omisión se crea la siguiente estructura de de directorios, que si bien no es necesario usarla estrictamente, si es recomendable utilizarla:

/Controllers
/Models
/Views

En el directorio Controllers es donde debemos colocar nuestras clases que funcionan como controladores, Models es donde deben de ir nuestras clases que representan datos y finalmente Views es donde colocamos nuestras plantillas ASP.NET que se van a encargar de generar nuestra interface HTML.

El Controlador

En ASP.NET MVC existe una convención por omisión acerca de como vamos a nombrar las clases que corresponden a nuestros controladores, esta convención nos indica que por ejemplo para nuestro controlador de restaurantes, el nombre debe de ser RestauranteController, ademas debe de derivarse de la base base System.Web.MVC.Controller.

Por lo tanto cuando naveguemos hacia el URL /Restaurante/, este será manejado por el controlador restaurante. Cada controlador responde a un grupo de acciones definidas para él, mediante métodos públicos, por lo tanto si deseamos que nuestro controlador realice una acción nuestra URL debe de ser /Restaurante/Menu, en donde menu es la acción a ejecutar.

Nuestras acciones pueden recibir parámetros, cuyos valores pueden provenir, por ejemplo de una forma HTML, si nuestro método solo recibe un parámetro, por ejemplo de tipo entero, la URL para nuestra acción se vería así: /Restaurante/Menu/1, donde 1 es el parámetro entero que acepta nuestra acción; si la acción acepta mas de un parámetro, la forma en como estos se representaran en nuestra URL es de la siguiente forma: /Restaurante/Menu/1?parametro2=34; donde parametro2 es el nombre de nuestro segundo parámetro cuyo valor es 34.


public class RestauranteController : Controller
{
public ActionResult Index()
{
return View();
}

public ActionResult Menu(int restaurante)
{
return View();
}
}
Algo importante a notar en la definición de nuestras acciones realmente son funciones que regresan el tipo ActionResult, este es un tipo especial que en nuestro caso cuando se ejecuta la instrucción return View(), sucede que la vista es cargada y ejecutada para producir el código HTML que va a ser presentado en el navegador Web.

El ruteo

Como se vio el ASP.NET MVC hace uso de ciertas convenciones para realizar su trabajo, una de estas convecciones esta relacionada en como la URL es interpretada para luego ser enviada al controlador/accion correcta.

El manejo de la URL proviene de una tabla de rutas con las cuales se define como la URL va a trabajar en nuestra aplicación, la convención por omisión estable que la URL va a ser interpretada como: [controlador]/[accion]/[parametro], pero no es posible cambiarla de manera que se ajuste mejor a nuestras necesidades.

La configuración de ruteo se encuentra en el archivo Global.asax de nuestro proyecto, ahí vamos a encontrar el método RegisterRoutes, el cual tiene definida la manera por omisión en como nuestra aplicación va a interpretar las URL que el usuario navegue.


public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);

}
Esta ruta especifica lo que hemos venido observando en nuestra aplicación, que la primera parte de nuestra URL corresponde al controlador, la segunda parte indica la acción a ejecutar y la tercera parte pertenece a los parámetros.

También especifica que si recibimos una URL sin parámetros, nuestro parámetro va a ser nulo, si la URL no cuenta con la acción a ejecutar, entonces se llamara la acción Index de nuestro controlador, por lo tanto es importante tener una acción Index; finalmente también indica que si no especificamos el controlador, entonces la petición se dirigirá al controlador Home con la acción Index.

En esta sección de nuestro programa podemos agregar nuevas rutas con diferentes características que satisfagan nuestras necesidades, solo hay que tener en cuenta que las rutas son evaluadas en el orden que se registran.

Vistas

Las vistas en nuestra aplicación de MVC se encuentran en el directorio /Views, dentro de este directorio existe una sub-estructura de directorios, que una vez mas, obedecen a una convención de nombres sobre la cual funciona el framework.

Dentro del directorio /Views encontramos un directorio Shared, el cual contiene un archivo de Master Pages, Site.master, este archivo es la plantilla HTML que nuestra aplicación va a utilizar, la naturaleza de este archivo es proveer de una interface unificada en toda la aplicación. Esta plantilla global cuenta con una sección la cual funciona como un contenedor, el cual va a ser llenado con el HTML generado por nuestras vistas.

Este archivo Site.master debe de contener un tag:


<asp:ContentPlaceHolder ID="MainContent" runat="server" />
Con el cual indicamos que en esa sección es donde deseamos que el contenido generado por nuestra vista se despliegue, así que si creamos una plantilla maestra, hay que recordar agregar ese tag.

Volviendo al contenido de nuestro directorio /View, también encontramos un folder por cada uno de los controladores de nuestra aplicación, y cada uno de estos folders tienen por nombre el mismo nombre del controlador al que pertenecen.

Dentro de cada folder con nombre de controlador vamos a encontrar archivos cuyo nombre corresponden a las acciones de nuestro controlador, los archivos tienen la extensión .aspx, lo cual nos indica que que son archivos de ASP.NET, pero estos archivos en realidad son plantillas MVC.

La gran diferencia es que las vistas MVC en ASP.NET MVC no contienen controles ASP.NET, sino controles HTML, aunque dentro de las plantillas colocamos código en C# o VB.NET dentro de los tags <% %>, este código corresponde a lo que se conoce como "Ayudantes de HTML" (HTML Helpers), los cuales son implementados como métodos de extensión (Extension Methods) y cuya finalidad es que al momento que nuestra vista es evaluada para enviar el código HTML a cliente, los ayudantes de html generen el código HTML apropiado.

Loas ayudantes de HTML predefinidos nos permiten crear una gran variedad de objetos HTML, por ejemplo si deseamos agregar una liga dentro de nuestra vista, el código del ayudante que realizaría esta acción es:

<%= Html.ActionLink("Comprar", "Comprar", new {id = 1}) %>
Este código va a generar la siguiente liga en HTML:


<a href="/Restaurante/Comprar/1">Comprar</a>
El primer parámetro de Html.ActionLink es el texto que se va a desplegar con la liga, el segundo es la acción del controlador a la cual la liga nos va a enviar y finalmente pasamos un parámetro para nuestra acción, en este caso el valor entero 1.

Existe un mecanismo mediante el cual podemos enviar desde el controlador la información gestionada con el modelo a la vista, para tal efecto tenemos un objeto de tipo Dictionary < string, object > llamado ViewData al cual podemos hacer referencia desde el controlador y desde la vista.

Por ejemplo si deseamos enviar información a nuestra vista, podemos usar el objeto ViewData de la siguiente forma:


ViewData["MiLlave"] = "Mensaje a desplegar en la vista";
"MiLlave" representa el identificador dentro del objeto diccionario con el cual vamos a poder acceder al dato guardado, por ejemplo si queremos imprimir ese mensaje en nuestra vista, lo podemos hacer de la siguiente manera:

<% Html.Encode(ViewData["MiLlave"]) %>
El objeto ViewData tiene una propiedad que es especifica para pasar la información de nuestro modelo a la vista, esta propiedad es Model, por ejemplo para pasar el objeto mimodelo a la vista lo hacemos así:
ViewData.Model = mimodelo;

Para acceder al modelo desde la vista lo hacemos de la siguiente forma:

<% Html.Encode(ViewData.Model.Dato) %>
Aquí asumimos que el objeto mimodelo tiene una propiedad llamada Dato, que es la que nuestra vista despliega.

Modelo

El modelo en una aplicación representa a los datos con los cuales la aplicación va trabajar. El modelo se compone de un grupo de clases que sirven para representar un dominio de información, la información puede provenir de diferentes fuentes como base de datos relacionales, archivos de texto, servicios REST.

De igual forma el modelo puede administrado por diferentes tecnologías, técnicas o patrones, tal y como se describió en el post "ActiveRecord".

Para el caso de la aplicación que se vio durante este curso, nuestro modelo esta implementado con el patrón ActiveRecord y específicamente con las librerías Castle ActiveRecord.

Par tal motivo esta sección se va a destinar a indicar como habilitar Castle ActiveRecord para que funcione con el ASP.NET MVC.

El primer paso va a ser agregar las referencias necesarias a nuestro proyecto MVC. Primeramente necesitamos referencias las librerías NHibernate.dll y Castle.ActiveRecord.dll, posteriormente agregamos la referencia a nuestra librería que contiene nuestros modelos de ActiveRecord, esta librería es ITT.ParaLlevar.Model.

Nuestro siguiente paso es agregar al archivo Web.config la configuración de ActiveRecord, dentro de la sección < configSection/ > agregamos la siguiente configuración:

<section name="activeRecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler,
Castle.ActiveRecord"
/>

Dentro del mismo Web.config dentro de la sección < configuration/ > agregamos las siguientes lineas que configuran ActiveRecord con nuestra base de datos relacionales, hay que recordar modificar la cadena de conexión para que refleje el nombre de nuestro servidor:

<activeRecord isWeb="true">
<config>
<add key="hibernate.connection.driver class"
value="NHibernate.Driver.SqlClientDriver"/>
<add key="hibernate.dialect"
value="NHibernate.Dialect.MsSql2000Dialect"/>
<add key="hibernate.connection.provider"
value="NHibernate.Connection.DriverConnectionProvider"/>
<add key="hibernate.connection.connection_string"
value="Data Source=SERVIDOR;Initial Catalog=ParaLlevar;Integrated Security=True"/>
</config>
</activeRecord>

Esta configuración es exactamente la misma que la configuración que teníamos en nuestro archivo AR.cfg.xml de la aplicación de Windows.Forms, el único cambio es que en el tag < activeRecord > agregamos la propiedad isWeb="true".

Ahora debemos inicializar ActiveRecord dentro de nuestra aplicación, por lo tanto nos vamos a dirigir al archivo Global.asax, ahí buscamos el metodo Application_Start() y agregamos las siguientes lineas:

var source = System.Configuration.ConfigurationManager.GetSection("activeRecord") as Castle.ActiveRecord.Framework.IConfigurationSource;

Castle.ActiveRecord.ActiveRecordStarter.Initialize(typeof(Restaurante).Assembly, source);

Y con esto estamos listos, podemos regresar y completar nuestro controlador Restaurante para que gestione información del modelo y la pase a la vista, nuestro controlador completo quedaría como sigue:

public class RestauranteController : Controller
{

public ActionResult Index()
{
var restaurantes = Restaurante.FindAll();

ViewData.Model = restaurantes;
return View();
}

public ActionResult Menu(int id)
{
var restaurante = Restaurante.GetById(id);
ViewData.Model = new RestauranteData {Restaurante = restaurante};

return View();
}

public ActionResult Comprar(int id)
{
return View();
}
}

Ahí podemos ver claramente como nuestro controlador gestiona la información, la pasa a través del objeto ViewData y su propiedad Model, para finalmente con return View() llama la vista apropiada para su evaluación. Nuestra vista para la acción Index() se vería así:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="ITT.ParaLlevar.Web.Views.Restaurante.Index" %>
<%@ Import Namespace="ITT.ParaLlevar.Model"%>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<ul>
<% foreach (var restaurante in (ViewData.Model as Restaurante[])) { %>
<li>
<%= Html.ActionLink(restaurante.Nombre, "Menu", new { id = restaurante.Id })%>
</li>
<%} %>
</ul>
</asp:Content>

Lo que nos da como resultado una lista con los restaurantes registrados en nuestra base de datos.

Conclusión
Como mencione casi al principio de este post, tanto este como el post de ActiveRecord hablan sobre patrones establecidos en la industria para resolver problemas recurrentes, ambos post son parte del curso donde se discutió con un poco mas de detalle cada uno de los temas.

En ambos posts se omitieron algunos detalles de la implementación debido al tiempo y a la longitud de las mismo. El código fuente que acompaña ambos posts, no representa una aplicación completa, mas bien ilustra los puntos a resaltar.

Aunque los post estuvieron centrados sobre Castle ActiveRecord y ASP.NET MVC, el conocimiento de ambos patrones es ampliamente utilizados en diferentes lenguajes/tecnologias, por lo tanto el conocimiento no se limita a estos dos frameworks.

Referencias

martes, septiembre 16, 2008

Libro gratuito sobre las novedades de SQL 2008

En relacion a la parte 1 y parte 2 de mis post sobre las novedades en SQL 2008, el día de hoy me encontré que hay un libro gratuito de Microsoft Press llamado "Introducing SQL Server 2008", solo se requiere de una cuenta de Passport.


martes, septiembre 09, 2008

Guerra de publicidad o al menos asi parece

Creo que de todos es conocida la campaña de Apple "Get a Mac" (Obten una Mac), donde Apple representada por un tipo "cool" interactua con el tipo de lentes y traje "suit" que representa a las pc en general, en los videos de la campaña generalmente el tipo pc se deja en evidencia a si mismo con referencia a la Mac.

Quiero pensar que la campaña ha tenido un cierto nivel de exito, ya que se dice que actualmente Apple ha alcanzado un mercado del 21% en US y se espera que pueda llegar a alcanzar un 30 % en este año, lo cual ha puesto presion al fabricante No. 1 de pc (Dell), esto aunado a la mala percepcion sobre el sistema operativo Vista de Microsoft.

Obviamente Microsoft ha estado tratando de mejor su imagen ante los usuarios, por tal motivo "ha tratado de engañar" a los consumidores con un nuevo sistema operativo Mojave, cuando en realidad es Windows Vista, pero tambien se ha lanzado en una campaña publicitaria que incluye la creacion de videos con el comediante Jerry Seinfeld, buscando de alguna forma contrarestar la campaña de Apple.

Hasta aqui todo bien, el problema es que salio el primer video de esta campaña y la verdad no supe si el video vendia Zapatos, Chorros o membresias para el "Club de payasos"; pero nunca me dio la impresion de que estaban vendiendo software, juzguenlo por ustedes mismos:



Si asi van a ser el resto de los videos de la campaña, creo que Microsoft se puede ahorrar un dinero y utilizarlo para mejorar sus productos, porque es caso perdido. Creo que Apple hace un mejor trabajo en sus comerciales para decirnos que es lo que esta vendiendo, no deja duda alguna:

jueves, agosto 14, 2008

Novedades en SQL 2008: Parte 2

En la parte 1, ya se comentaron algunas de las nuevas características de SQL 2008, en este post comentare algunas novedades relacionadas con el manejo y programación de SQL 2008.

Antes que nada, me llama la atención que algunas de estas novedades, existan ya desde hace algunos años en Oracle, lo que me deja la impresión de que MS-SQL aun esta tratando de alcanzar a Oracle con respecto a funcionalidad.

Adicción en vivo de CPU
Imaginemos el escenario de cierre de mes en una empresa de tamaño medio a grande, los servidores de base de datos están al 100% y todavía faltan algunas hora para que el cierre termine; mientras tanto tenemos por ahí un par de CPU que no se están utilizando en producción porque ya es media noche y producción no trabaja de noche, que desperdicio.

Bueno, pues con SQL 2008 y hardware que soporte la adición de CPUs en vivo, vamos a poder trasladar temporalmente esos CPUs ociosos a nuestro servidor de finanzas para tratar de acelerar el proceso de cierre mensual. De igual forma si nuestro servidor es una maquina virtual también vamos a poder adicionarle mas CPUs ociosos.

Solo basta agregar los nuevos CPUs y ejecutar RECONFIGURE para notificarle al SQL que puede hacer uso de esos CPUs y listo, no es necesario interrumpir el proceso actual, el SQL va a distribuir carga sobre los nuevos CPUs.

Gobernador de recursos
A quien no le pasado que tiene un programa de terceros que hace uso de nuestra base de datos, y el programa es terriblemente ineficiente, y cada vez que se ejecuta "ahoga" al CPU o la memoria, bloqueando otros procesos en el servidor de SQL?, pero el proveedor no ha podido solucionar el problema y el programa es necesario que se ejecute...

Bueno con SQL 2008 vamos a poder limitar esos programas voraces para que usen solo un limitado porcentaje del CPU o de la memoria. A través de grupos vamos a poder catalogar esos procesos "groseros" y restringirlos en el uso de recursos de manera que otros procesos que si se comportan bien, también puedan hacer uso de los preciados recursos.

Filestream
Inicialmente las base de datos relacionales fueron concebidas para almacenar información estructurada en forma de tablas y campos, pero en algunas ocasiones el únicamente guardar esta información no es suficiente ya que puede estar ligada a datos no estructurados como: imágenes, documentos, planos, vídeos, música, etc.

SQL permite guardar este tipo de información no estructurada en forma de BLOB (Binary Large Objects, por sus siglas en ingles), el problema es que tener este tipo de campos en una tabla, provoca una penalización de rendimiento, sobre todo cuando el tamaño de los datos no estructurados es mayor a 1MB.

Por tal motivo SQL 2008 incluye esta característica Filestream, la cual nos permite mover los campos BLOB fuera de la tabla y guardar la información no estructura en el sistema de archivos, manteniendo relación con los datos estructurados.

Esta separación trae como consecuencia mejor rendimiento de lectura en las tablas que tienen un campo Filestream, ademas de que el limite para la información no estructurada es el espacio disponible en el sistema de archivos, mientras que los campos BLOB tienen un limite de 2GB.

SQL Management Studio
El SQL Management Studio también incluye mejoras para ayudarnos al desarrollo de aplicaciones, la primera de ellas, es la inclusión de Intellisense, la que va auto-completando nombre de los objetos en la base de datos conforme tecleamos las primeras letras del nombre. Esta funcionalidad es de mucha ayuda cuando el esquema de la base de datos nos es relativamente nuevo.

La otra mejora, es la inclusión de un depurador para T-SQL, que nos permite ejecutar linea por linea de un procedimiento almacenado o una función, funcionalidad que anteriormente solo estaba disponible en Visual Studio.

Programación
Por el lado de la programación también hay varias mejoras, pero hay dos que en lo personal me llaman la atención.

A quien no le ha pasado que tiene en una tabla un campo datetime y la lógica para un reporte necesitamos hacer un DISTINCT sobre este campo para obtener las fechas donde hubo transacciones en este mes, pero... este campo también tiene la hora en que se capturo la transacción!!, por lo tanto esta solución simple no funciona, hay que buscar alguna forma de "truncar" la fecha, oh pero esperen, no hay una forma sencilla de hacer esto.

Aquí es donde los nuevos tipos de datos entran al rescate: DATE y TIME, si, como posiblemente adivinaron DATE solo almacena la parte de la fecha y TIME solo almacena la parte de la hora.

Por lo tanto para solucionar el problema planteado arriba, basta con realizar un CAST de nuestra campo DATETIME a DATE y vóila, ya podemos realizar el DISTINCT y obtener el resultado que buscamos.

Ahora veamos el problema de que tenemos una tabla con ciertos registros, pero necesitamos actualizarlos a partir de otra tabla, en la tabla fuente tenemos registros que son nuevos, que necesitan ser borrados y que necesitan ser actualizados en nuestra tabla destino.

Lo normal seria escribir la lógica por separado para cada una de las posibles operaciones y de esa forma mantener nuestra tabla destino actualizada, bueno con SQL 2008 se incluye la instrucción MERGE, la cual nos permite sincronizar las dos tablas (fuente y destino) en una sola instrucción.

Merge existía en el beta 1 de SQL 2005, pero misteriosamente desapareció en el beta 2, ahora finalmente llego con SQL 2008.

Por el momento es todo en esta primera y segunda parte sobre las novedades en el SQL 2008. Para mayor información favor visitar la documentación del SQL 2008

viernes, agosto 08, 2008

Novedades en SQL 2008: Parte 1

SQL 2008 por fin alcanzo la meta de ser RTM (Release for manufacturing, por sus siglas en ingles), lo que indica que próximamente se podrá adquirir oficialmente; aunque ya esta disponible para los subscriptores que MSDN y TechNET.

Leyendo la documentación, me encuentro con una serie de nueva funcionalidad o funcionalidad mejorada que en lo particular me interesa; por tal motivo, en esta primera parte voy a describir estas nuevas o mejoradas características en relación al motor de la base de datos.

Administración de la base de datos
Compresión en los respaldos: Esta funcionalidad que anterior a SQL 2008 solo encontrábamos con herramientas de terceros, ahora es parte de SQL. A partir de ahora podemos comprimir nuestros respaldos al momento de realizarlos.

La ventajas son que se requiere de menos tiempo tiempo, menos espacio y menor numero de operaciones I/O para respaldar nuestra información.

La desventaja, es que el algoritmo de compresión requiere de mayor uso del CPU al momento de respaldar, lo que puede provocar que ciertas operaciones tomen mas tiempo al momento de realizar respaldos.

Seguimiento de cambios: Esta es una nueva característica que proporciona una forma ligera - la penalización en rendimiento es relativamente baja - para identificar cambios realizados en las tablas de nuestra base de datos. Con este nos podemos olvidar de soluciones ad-hoc que hacen uso de triggers, timestamps y otros trucos, que por lo general son ineficientes y muy específicos para cada aplicación.

El seguimiento de cambios permite escribir aplicaciones de sincronización de una vía con otras bases de datos o bien sincronización de 2 vías, aunque aquí se requiere una mecanismo para la detección de conflictos.

Es importante mencionar que los registros que cambiaron son identificados por medio de su llave primaria, por lo tanto debe de ser una llave única a través de las diferentes bases de datos o aplicaciones que consumen esta información.

Esta característica de alguna forma me recuerda a la característica de replicacion, de tipo merge, aunque en este caso el seguimiento de cambios no incorpora mecanismo para trasladar los cambios detectados a otras bases de datos, tal y como lo hace la replicacion de tipo merge.

Captura de cambio en datos: Esta es otra nueva característica de SQL 2008, que nos permite identificar cambios en nuestros datos, pudiendo determinar que fue lo que se modifico en ellos.

Por ejemplo esta es una característica muy útil para procesos ETL (Extract, Transform, Load) en donde actualizamos los cambios que van sucediendo en nuestra base de datos a un Datamart o Datawarehouse.

La forma como funciona esta característica consiste, primero, en indicar explícitamente las tablas de las que deseamos capturar cambios, estas tablas las ligamos a una instancia de captura que es quien realiza la operación. Posteriormente nuestra instancia va a monitorear el log de la base de datos para poder determinar que registros sufrieron cambios.

Por cada tabla monitoreada se crea una nueva tabla con el mismo schema, en estas tablas copia es donde se guardan los cambios realizados por una operación del DML. En las tablas de captura vamos a encontrar nuevos registros creados, los registros que fueron eliminados y 2 registros por cada actualización, uno con la imagen de como era el registros antes del cambio y otro con el cambio sufrido en el registro.

En caso de que nuestra tabla monitoreada sufra cambios en el esquema el mecanismo de captura de cambios actuara de la siguiente forma:
- Nuevas columnas, estas serán ignoradas por el monitoreo de cambios, si nos interesa que sean monitoreadas, entonces podemos crear una nueva instancia de captura que incluya el nuevo esquema o recrear la instancia actual.

- Columnas eliminadas: En este caso se insertan valores nulos en las columnas que ya no existen

- Cambio de tipo de una columna: Para evitar perdidas en los datos, se creara una nueva columna con el nuevo tipo de dato y ahí se almacenaran los nuevos valores.

Debido a que monitoreo de cambio puede llevar a tener miles de cambios, existe un tiempo de retención, que por omisión son tres días, cambios capturados anteriores a esta fecha son eliminados de la tabla de captura.

Por el momento es todo en esta primera parte sobre las novedades en el SQL 2008. Para mayor información favor visitar la documentación del SQL 2008

miércoles, abril 23, 2008

Ya mañana es el Heroes {Community} Launch




Ya mañana 24 de Abril es el Lanzamiento de:
  • Windows Server 2008
  • Visual Studio 2008
  • SQL Server 2008
El evento es gratuito y te puedes registrar en esta página.

Ven y participa, no pierdas la oportunidad de ganar licencias de Visual Studio 2008, SQL Server y otros premios mas.

La agenda es la siguiente:
2:00 Bienvenida
2:15 Introducción a Visual Studio 2008
3:00 LINQ aplicado
3:40 Visual Studio Team System
4:20 Visual Studio Team System y estándares de calidad
5:00 Silverlight en acción
5:50 Premios y despedida


Y el evento se llevará a cabo en:
Teatro Calafornix
Instituo Tecnológico de Tijuana
Calzada Tecnológico S/N, Fracc. Tomás Aquino
Tijuana, B.C. 22414 México

jueves, abril 17, 2008

Innovatec 2008



Una vez mas se llevara a cabo el congreso de Ingeniería en Sistemas Computacionales e Informática del Instituto Tecnológico de Tijuana.

El evento se llevara a cabo los días 22 y 23 de Abril del presente año, en el Teatro Calafornix de la Unidad Tomas Aquino. La entrada al evento es gratuita.

El temario del congreso es el siguiente:

Martes 22 de Abril
9 - 10 Inauguración
10 - 11 "Computo móvil y ubicuo", J. Antonio García Macías, CICESE
11 - 12 "MoProSoft y la norma Mexicana NMX-I-059", Ing. Iván González Quintero, Nabu-Solutions
12 - 13 "Logística", Juan Francisco Magallón Rangel, NEXTEL
13 - 14 "Tecnologías del futuro", M.I. Luis Guillermo Martínez Méndez, UABC

Miércoles 23 de Abril
9 - 10 "Computo forense"
10 - 11 "Herramientas para la enseñanza de la programación", Dr. Guillermo Licea Sandoval, UABC
11 - 12 "Avances y retos en las redes inalámbricas de sensores", MC Luis Enrique Palafox, CICESE
12 - 13 "Clúster"

lunes, abril 14, 2008

Heroes {Community} Launch de la comunidad TJ.NET



Si siempre habías querido ser un {Héroe} y no sabias como, esta es tu oportunidad, ven y convierte en un {Héroe} junto con muchos otros profesionales que asistirán al Héroes {Community} Launch de la Comunidad Tijuana.NET.


Cuando: Este 24 de Abril
Donde: En el teatro Calafornix de la unidad Tomas Aquino del Instituto Tecnologico de Tijuana
Que: Lanzamiento de la nueva gama de productos:
- Visual Studio 2008
- Windows Server 2008
- SQL Server 2008

El evento es gratuito y comienza a partir de las 2:00 pm. Para mayor informacion visita la pagina de la Comunidad Tijuana.NET