miércoles, septiembre 17, 2008

Sabes manejar?


Voy a comenzar haciendo la aclarcion que este es un "rant", asi que estan advertidos.

Imagen: La conductora no choco o la chocaron, simplemente en el crucero no le "atino" a pasar por una separacion de 10 metros entre los camellones y simplemente quedo varada sobre el camellon.

Sobre el titulo de la entrada, es una pregunta valida, ¿Sabes manejar?, no unicamente por que tienes un auto, sabes como prenderlo, darle vuelta al volante, avanzar y detenerte es suficiente...

Y la pregunta viene en referencia a ¿por que la gente es tan PENDEJA cuando esta al volante?, ¿porque es tan pendeja que no es capaz de hacer un alto?, ¿porque es tan pendeja que no pude poner una direccional para dar vuelta?, ¿porque es tan pendeja que no sabe leer señalamientos?, ¿porque es tan pendeja que si sabe que va a quedar bloqueando una avenida por el cambio del semaforo, no le importa?

El trafico en la ciudad es un problema que se esta convirtiendo en un gran problema, en gran parte por el gran numero de autos que circulan y la muy poca infraestructura que se contruye en la ciudad, pero aun y con eso el problema mas grande sigue siendo que la gente es PENDEJA para manejar.

Si no me creen, solo basta ver la cantidad de accidentes por exceso de velocidad en avenidas que parecen queso gruyere, se tiene que ser muy pendejo para no darse cuenta que la combinacion de baches y velocidad van a desencadenar en accidentes.

O tambien, como ejemplo solo basta observar a todos lo que dan vuelta en lugares prohibidos, aun y cuando hay señalamientos, o la gente que no sabe ni para que sirven las direcionales y no las utilizan para indicar a otros conductores de sus intenciones o peor aun, el estupido que cruza toda la ciudad con la direccional prendida.

La gente pendeja no tiene idea de como interpretar las señales de trafico, no tienen la capacidad mental de entender que un disco rojo con la palabra "Alto" significa que se tiene que detener un momento, no tiene el suficiente cerebro para poder seguir unas lineas blancas y amarillas trazadas en los caminos para delimitar carriles, no saben que los acotamientos - los espacios entre las banquetas y la linea amarilla de indica la delimitacion de un carril - son para estacionarse si asi estan marcados o para deternese en caso de emergencia, NO son un carril para avanzar mas rapido y luego literalmente "hechar" el auto para meterse en la linea.

Todas estas observaciones casi estoy seguro que si se la enseñan a un chimpanse, el va a poder memorizarlas y aplicarlas mejor que la gente pendeja detras del volante.

Hace un mes cambiaron de sentido una avenida por donde vivo, y aun hay gente que se mete en sentido contrario y todavia se indignan que les indiques de su error, y no es que falten señalamientos, por que estos estan, es simplemente que la gente pendeja no sabe como interpretarlos, lo que vuelve a los señalamientos en un lujo innecesario en la ciudad y solamente un gasto absurdo; despues esos señalamientos algun "vago" se los robara y los vendera como fierro viejo, bueno al menos alguien va a tener un beneficio de los señalamientos inutiles.

Recurdo que antes de Hank, el presidente municipal Jesus ... algo, no recuerdo su apellido; intento poner boyas para delimitar carriles y hacer que la gente los respetara, pero se empezaron a quejar porque el pasar por arriba de la boyas ocasionaba daños en sus autos, PENDEJOS para eso eran las boyas para que no pasaran por encima de ellas !!, leugo llego Hank y las quito, que porque solamente con marcar con lineas seria suficiente que la gente no tenia que pasar por ahi, grave error, la gente es pendeja y no sabe leer las lineas !!.

El dia de ayer en la noticias locales se quejaban de que en San Diego habia un cruzero donde la gente con placas mexicanas daban una vuelta prohibida, pero que siempre ahi estaba un policia de transito americano "cazandolos", en la nota hablan de que eso era racismo y que policia hacia mal, que equivocados!. Que bien que lo haga, ojala le den un premio o mejor aun lo contraten para trabajar en Tijuana!. Si no quieren que haya gente que se aproveche de la pendejes de otros, NO DEN VUELTA donde no deben y punto.

En fin, creo que las multas de transito se deberian de elevar de entre 3,000 a 6,000 pesos, aunque con esto la gente se va a empezar a quejar que no, es mucho dinero, que los unicos que se van a beneficiar son los agentes de transito con las mordidas; pues que se beneficien y que si aceptan mordidas, no se vendan por 100 pesos, si la multa es de 3,000, por lo menos pidan mordida de 1,500 ó 2,000; que por lo menos alguien se beneficie de la pendejes de otros.

Actualizacion para un comentario anonimo:
Anonimo, no me creo, ni me siento superior a otros, pero de que existe mucha gente pendeja manejando es una realidad, gente que no tiene idea de los reglamentos de transito, gente sin placas, gente sin licencia.

Si es cierto todos podemos fallar en algun momento, pero no es falla cuando hay trafico y alguien se va por el acotamiento, no es falla cuando la luz esta roja y le aceleran para pasar, no es falla cuando esta el alto y no hacen ni el menor intento para pararse, no es falla cuando van en el tercer carril de la derecha y se cruzan hasta el primer carril de "repente" para dar vuelta a la izquieda, no es falla cuando en todas las vueltas no usan direccional, no es falla cuando saben que no van a alcanzar a cruzar el semaforo y aun asi se lo pasan quedando a media avenida bloquando a quienes vienen ortogonalmente, no es falla cuando un policia "inteligente" de US se dio cuenta que los pendejos con placas de Mexico dan vuelta donde no deben y los espera pacientemente para multarlos. Ninguna de estas cuestiones es la excepcion, desafortunadamente parace ser la regla.

Ademas la critica no es cuestion de perfeccion o no, entonces si no somos perfectos no podemos criticar un servicio, un producto, al gobierno, o simplemente criticar una pelicula?

La critica significa resaltar algo que esta mal y ofrecer soluciones, mi solucion es que aumenten las multas y que al menos les cueste su pendejes y a la mejor se dan cuenta de que algo estan haciendo mal y rectificar, y quizas asi evitar algun accidente en el futuro.

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.


jueves, septiembre 11, 2008

Codigo de ejemplo del patrón ActiveRecord

Aquí esta el archivo zip con los cambios realizados el día de ayer al ejemplo de ActiveRecord.

NOTA: No olviden modificar el archivo AR.cfg.xml para indicar el nombre de su servidor de SQL, en caso contrario el programa va a fallar.

Para los ejercicios del día de hoy, hay que descargar e instalar la librería ASP.NET MVC. Bajar el archivo "ASP.NET MVC Codeplex Preview 5"

miércoles, septiembre 10, 2008

Accesos a base de datos: Patrón ActiveRecord

Uno de los problemas con los que nos enfrentamos cuando trabajamos con aplicaciones que hace uso de datos, por ejemplo almacenados en una base de datos relacional, es que estrategia elegir para acceder a ellos y poder consumirlos en nuestra aplicación orientada a objetos.

Este no es un problema trivial, debido a que tratamos de integrar dos paradigmas que manipulan la información de maneras muy diferentes, por un lado tenemos el paradigma relacional, con el cual podemos relacionar nuestros datos mediante uniones de nuestras tablas, y por otro lado tenemos el paradigma orientado a objetos que mediante relaciones entre los objetos podemos "navegar" a través de los datos.

Otros problemas son por ejemplo los diferentes tipos de datos que se manejan en una base de datos relacional y los que se manejan en nuestro lenguaje orientado a objetos; otro problema puede ser la estructura que almacena los datos en la base de datos relacional, puede ser muy diferente a nuestro modelo de objetos en nuestra aplicación orientada a objetos.

A todos estos problemas se le conoce como Impedancia de Discordancia Objeto-Relacional. Existen varias técnicas y patrones para tratar de minimizar los problemas que esta incompatibilidad entre los dos paradigmas crea. Todas las soluciones se centran principalmente en realizar un "mapeo" entre nuestros datos relaciones y nuestros objetos, a esta técnica se le conoce como ORM (Object-Relational Mapping)

En .NET tenemos varias opciones para acceder desde un modelo de objetos a un modelo relacional:

ADO.NET: Son las librerías base que permiten la conexión a datos, esta es la forma mas básica y a mas bajo nivel de como acceder a datos, requiere de una buena cantidad de esfuerzo para hacerla funcionar con nuestra aplicación.

Generadores de código DAL: Existen otras soluciones que generan código fuente a partir de un esquema de base de datos, el código generado generalmente conforma lo que se conoce como un Data Access Layer, la cual representa una capa en nuestra aplicación que contiene todo el comportamiento y lógica para acceder a nuestros datos a partir de nuestros objetos. Como ejemplo de estos generadores esta SubSonic.

ORM: Son librerías que integramos en nuestra aplicación a la cual le alimentamos una descripción de como nuestros objetos "mapean" a nuestros datos relacionales, y la librería ORM se encarga de gestionar la interacción con la base de datos y nuestros objetos de forma transparente para nosotros. Una forma común de indicar como nuestros objetos mapean a nuestra base de datos es mediante archivos XML. Ejemplo de este tipo de librerías es NHibernate y MS LINQ

Para el acceso a datos de nuestra aplicación vamos a hacer uso de librerías ORM. La librería que vamos utilizar hace uso de un patrón llamado ActiveRecord, de ahí el nombre de la librería es Castle ActiveRecord.

ActiveRecord es un patrón en el cual, el objeto contiene los datos que representan a un renglón (o registro) de nuestra tabla o vista, ademas de encapsular la lógica necesaria para acceder a la base de datos. De esta forma el acceso a datos se presenta de manera uniforma a través de la aplicación.



El patrón de ActiveRecord es utilizado en diferentes lenguajes/tecnologias como una manera estándar de acceder a datos, por ejemplo lo podemos encontrar en Ruby on Rails, CakePHP y por supuesto .NET a través de Castle ActiveRecord.

Castle ActiveRecord es una capa implementada encima de la librería ORM NHibernate, NHibernate hace uso de archivos XML para mapear objetos a datos relacionales, lo cual requiere de una curva de aprendizaje relativamente grande; ActiveRecord ayuda a minimizar esta curva, ya que a través de programación declarativa auto-genera los archivos de mapeo XML por nosotros.

Por ejemplo si tenemos la siguiente tabla en nuestra base de datos y deseamos leer un registro en nuestro objeto, la clase tendría que ser declarada de la siguiente forma:


[ActiveRecord]
public class Restaurante : ActiveRecordBase<restaurante>
{
[PrimaryKey(PrimaryKeyType.Native)]
public int Id { get; set; }

[Property]
public string Nombre { get; set; }

[Property]
public string Direccion { get; set; }

[Property]
public string Zona { get; set; }

[Property]
public string Telefono { get; set; }
}
</restaurante>

Los elementos entre [ ] se llaman atributos y es una forma declarativa de indicarle a ActiveRecord que propiedades de nuestra clase van a mapearse a un campo de la tabla. Si el nombre de la propiedad no corresponde con el nombre del campo entonces el atributo property lo podemos declarar como:

[Property("CampoTabla")]
, donde "CampoTabla" corresponde al campo de nuestra tabla.

Otro punto importante a notar aquí es que la clase esta marcada con el atributo [ActiveRecord], con el cual indicamos que nuestra clase va aser manejada por ActiveRecord, al igual que el atributo Property, si el nombre de nuestra clase no corresponde al nombre de la tabla, podemos colocar el atributo de la siguiente forma:

[ActiveRecord("MiTabla")]

Ademas de los atributos, es necesario que nuestra clase herede de la clase ActiveRecordBase, ya que esta clase base nos va a proporcionar el comportamiento necesario para poder realizar operaciones CRUD (Create, Read, Update and Delete; Crear, Leer, Actualizar y Borrar), a través de una serie de métodos estáticos.

Con los métodos estáticos Find* podemos realizar cualquier consulta sobre nuestros registros, por mas compleja que esta sea, pero como buenos desarrolladores que somos vamos agregar una serie de métodos estáticos adicionales sobre consultas que pueden resultar comunes, para quien consuma nuestras clases le sea mas fácil utilizarlas. Por ejemplo una par de consultas comunes pueden ser el buscar un restaurante por su llave primaria o bien por el nombre del restaurante. A continuación se muestran ambas consultas como serian usando únicamente los métodos Find*:

// Busqueda por llave primary, para restaurante con llave 1
Restaurante restaurante = Restaurante.FindByPrimaryKey(1);

// Busqueda por nombre, esta consulta también puede ser escrita con los métodos FindOne o FindFirst
Restaurante[] restaurantes = Restaurante.FindAllByProperty("Nombre", "Nombre del restaurante a buscar");
Restaurante restaurante;
restaurantes.Length > 0 ? restaurante = restaurantes[0] : restaurante = null;

Para ambas consultas podemos agregar los siguientes métodos estáticos a nuestra clase Restaurante:

public static Restaurante GetById(int id)
{
return Restaurante.FindByPrimaryKey(id);
}

public static Restaurante GetByName(string restaurante)
{
var restaurantes = Restaurante.FindAllByProperty("Nombre", restaurante);

return restaurantes.Length > 0 ? restaurantes[0] : null;
}

De forma que los usuarios de nuestra clase solo tengan que escribir:

Restaurante restaurante = Restaurante. GetById(1);

ó

Restaurante restaurante = Restaurante. GetByName("Nombre del restaurante a buscar");

ActiveRecord nos ofrece una serie de métodos para persistir cambios a la base de datos como Create, Delete, Save y Update, todos ellos mantienen nuestros cambios en memoria en un objeto llamado Session, en el momento que la sesión recibe un llamado a un método que en nombre tenga la palabra Flush, los cambios son enviados a la base de datos. SI queremos que nuestros cambios se vayan inmediatamente entonces podemos llamar los métodos CreateAndFlush, DeleteAndFlush, SaveAndFlush y finalmente UpdateAndFlush.

Una de las complicaciones de los datos relacionales al querer manipularlos como objetos, son las relaciones, por ejemplo podemos tener dos o mas tablas que están relacionadas entre si, por medio una llave externa o "Foreign Key", las cuales podemos relacionar mediante un "join", en el caso de los objetos cuando tenemos una relación de, por ejemplo encabezado/detalle.
En nuestros objetos debemos tener una propiedad, en la clase que sirva como encabezado, la cual sea una colección de los objetos que representan el detalle , por ejemplo en el caso de nuestra clase Restaurante, es importante poder acceder a el listado de menús para cada restaurante:

IList<Menu> menus = Restaurante.Menus;

La forma en como podemos representar estas relaciones en ActiveRecord es también a través de programación declarativa, en donde tenemos los atributos HasMany, BelongsTo, OneToOne, HasAndBelong y HasManyToAny, por ejemplo en nuestro caso donde un restaurante puede tener una o mas opciones de menu la vamos a representar con los atributos HasMany y BelongsTo.

Primeramente en nuestra clase Restaurante vamos a agregar una nueva propiedad llamada Menus la cual va a contener una colección de los menús que ese restaurante ofrece:

[HasMany(typeof(Menu), Inverse = true, Cascade = ManyRelationCascadeEnum.All)]
public IList&lt;menu&gt; Menus { get; set; }

Donde a HasMany le indicamos que la relación va a ser con nuestra clase Menu, en nuestra clase Menu también agregamos una nueva propiedad y la marcamos con el atributo BelongsTo donde le indicamos cual es el campo en nuestra tabla Menu que nos va a dar la relación con la tabla Restaurante.

[BelongsTo("RestauranteId")]
internal Restaurante Restaurante { get; set; }

De forma que podemos recorrer nuestra colección de Menu a través de un objeto Restaurante.

Para finalizar es necesario configurar e iniciailizar ActiveRecord en nuestra aplicación. La configuración nos permite indicar a que tipo de base de datos relacional nos vamos a conectar ademas de indicar la cadena de conexión que contenga la información del servidor, base de datos e información de seguridad, esta configuración se realiza por medio de un archivo XML. Un ejemplo de este archivo es el siguiente:

<activerecord>
<config>
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/>
<add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2005Dialect"/>
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
<add key="hibernate.connection.connection_string" value="Data Source=SERVIDOR;Initial Catalog=BASEDEDATOS;Integrated Security=True"/>
<add key="hibernate.show_sql" value="true"/>
</config></activerecord>

Es importante indicar el nombre de servidor de base de datos correcto, el nombre de la base de datos adecuado y la información de seguridad - usuario y clave si nuestro servidor lo requiere -.

Como ultimo paso es necesario inicializar ActiveRecord en nuestra aplicación, esta inicialización se debe de hacer únicamente una vez durante la ejecución de nuestra aplicación y antes de intentar utilizar alguna de las clases que creamos para usar con ActiveRecord:

var configurationSource = new XmlConfigurationSource("AR.cfg.xml");
ActiveRecordStarter.Initialize(typeof(Restaurante).Assembly, configurationSource);

AR.cfg.xml representa el archivo XML con la configuración para ActiveRecord.

Como conclusión, ActiveRecord es un patrón muy fácil de entender y utilizar en nuestras aplicaciones que requieren de acceso a base de datos, tal es la razón de que es un patrón popular en varios lenguajes.

Referencias e información
La siguiente lista de ligas contiene información mas extensa y detallada sobre ActiveRecord:

martes, septiembre 09, 2008

Curso sobre programacion avanzada en el ITT

Desde la semana pasada comencé a dar un curso en ITT a alumnos de 7mo, 8vo y 9no semestre sobre C# y el como programar una aplicación que se conecte a una base de datos y consuma servicios web.

El curso es parte de la materia Programación Avanzada, la cual de forma general ve los temas de Integración de Aplicaciones Empresariales (EAI), Arquitectura Orientada a Servicios (SOA) y Aplicaciones distribuidas. La idea del curso es darles un panorama general de como crear este tipo de aplicaciones en C#.

El curso solamente es por una semana y media, por lo tanto la transferencia de conocimiento es un poco difícil, ya que solamente tengo una hora diaria para mostrar como hacer esta aplicación funcionar.

La aplicación que se esta utilizando como ejemplo, es una aplicación que nos permita registrar restaurantes que ofrecen servicio de entrega a domicilio, los cuales estarán conectado a Internet a forma de "Food Court", donde el usuario se va a registrar para poder ordenar opciones de los menús de los restaurantes para que le sea entregada en el lugar que el usuario indique, teniendo la posibilidad de pagar con tarjeta crédito/debito o al momento de recibir su pedido.

Por el lado del restaurante, este va a poder recibir los pedidos realizados a través del sitio web, procesarlos y retro-alimentar al sitio web para que el usuario pueda monitorear su pedido.

Desafortunadamente por el tiempo asignado al curso, no va a ser posible construir esta aplicación al 100%, solo algunas partes de ella que muestre los conceptos que quiero mostrar en el curso.

La parte positiva, por lo menos para mi, es que tengo libertad en elegir como va a ser escrita la aplicación, siempre y cuando sea en C#, es decir puedo seleccionar las técnicas o patrones que yo crea convenientes para este curso. Así que aprovechando esa libertad no quiero que el curso aplicación este centrado 100% en la visión de Microsoft, aunque esto parezca raro; mi interés es que conozcan patrones y técnicas que van mas alla de Microsoft y C# y que puedan ser implementadas en otros lenguajes/plataformas que no tengan nada que ver con Microsoft.

Así que el siguiente post va a hablar sobre nuestro acceso a datos.

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 28, 2008

MySQL Workbench

MySQL no es mi primera opcion como motor de base de datos, sobre bases de datos open source mi primera opcion es Postgresql, realmente no tengo ninguna razon tecnica para fundamentar mi preferencia sobre una base de datos u otra, es simplemente una cuestion de gustos, creo.

Pero aun y cuando MySQL no es de mi total agrado, no puedo omitir que posiblemente entre las bases de datos open source es la mas popular de todas, y por tal motivo la he tenido que utilizar en algunos proyectos de la escuela.

Una de mis principales desaveniencias con las bases de datos, son las herramientas de administracion y desarrollo, las cuales o son muy malas o son pesimas. Durante mucho, a mi forma de ver, tiempo las herramientas de MSSQL server eran las unicas que ofrecian una buena experiencia - remontandome desde unos 8 años a la fecha -.

Posteriormente Oracle buscando mejorar sus herramientas tuvo varios intentos, hasta finalmente salio a la luz el Oracle SQL Developer, pero por el lado de las bases de datos open source no se veia luz al final del camino; con herramientas basadas en Web, que en lugar de ayudar, causan mas dolores de cabeza.

Por eso el dia de hoy al enterarme que la herramienta MySQL Workbench ha sido anunciada para Linux como para OSX, dio como motivo este post.

Si bien el MySQL Workbench ya funcionaba en Windows, no estaba disponible para otras plataformas (Linux, Solaris, OSX), situacion que va a cambiar con las primeras versiones Alpha a finales de Septiembre y las versiones Beta planeadas para principios del 2009.

No he utilizado el MySQl Workbench, aun, asi que solamente me limitare de momento a decir que se ve como una herramienta interesante que vale la pena tener en cuenta y darle seguiiento a su evolucion. Ya que esten disponibles las versiones Alpha con soporte Linux/OSX tendre la oportunidad de comentar con mas detalle mis impresiones, por lo pronto aqui les dejo unos "screenshots".







jueves, agosto 21, 2008

sábado, agosto 16, 2008

Intento de plagio frustrado

El día de hoy sale una nota en el periodico Frontera sobre un intento de plagio fallido contra un arquitecto, ya que el arquitecto fue defendido por los albañiles de la obra que el arquitecto supervisaba, si los albañiles le hicieron frente a los plagiarios con piedras, aun y cuando los maleantes les dispararon.

Gracias a esta ayuda el arquitecto se salvo de ser secuestrado. En si la noticia no es novedad, ya que este tipo de acciones ocurren de manera cotidiana, lo que si es novedad, es que es la primera vez que escucho que alguien le hace frente a este tipo de delincuentes y mas aun, hacen que huyan sin lograr sus objetivos.

Obviamente las autoridades ¨no tienen¨ ni la menor idea de donde están los delincuentes y mucho menos idea de como capturarlos.

El Frontera tiene la opción de poder realizar comentarios sobre las notas, sobre este tipo de hechos, normalmente un grupo de ¨troles¨ se apropian de los comentarios para descalificar e insultan a los gobiernos, policías, partidos políticos, a las personas por su lugar de procedencia; con justificación o sin ella, eso lo dejo a criterio de cada quien, pero esta vez hay un par de comentarios que cito:

"Se solicitan Albañiles para sustituir a toda la policia municipal, ministerial y federal, unico requisito es tener we-bos." del pseudonimo "Pepe Perez" y "SEGURAMENTE LE CARGARAN EL PAGO DE LOS CRISTALES DE LA BLAZER DE LOS SECUESTRADORES AL POBRE ARQUITECTO, ASI COMO LE VAN A ACUSAR DE TENER EN SU CONSTRUCCION "PIEDRAS DE ALTO PODER"", "QUE CONTRATEN A LOS ALBAÑILES LOS EMPRESARIOS PARA CUSTODIA" del pseudonimo "giann ruiz".

Obviamente son en todo de burla a las autoridades, pero, dada la situación, no parase tan descabellado el primer comentario de "Pepe Perez"...

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

miércoles, agosto 13, 2008

Horarios de ISC en el ITT

Los horarios de las carrera ISC del ITT son los siguientes, darle click a la hoja de horarios completa para ir al sitio donde están las imágenes donde se aprecian mejor los horarios para cada semestre.

Para información de la asesoría y la re-inscripcion favor de visitar esta pagina.

IMG_0371

La arquitectura de cebolla: parte 2

En la parte 1 se introdujo el patrón arquitectural llamado "La arquitectura de cebolla". Los conceptos de diseño orientado a objetos no es nuevo, pero el agrupar estas técnicas y convenciones en un patrón único, nos da como resultado esta arquitectura propuesta. La idea en general, es que la industria utilice este nombre para comunicar estos conceptos de forma apropiada.

Ejemplo practico
CodeCampServer hace uso de la arquitectura de cebolla. Si estas buscado por una aplicación de ejemplo, completa y funcional, esta es la aplicación a observar. Este ejemplo practico, se basa directamente en el CodeCampServer. Es un ejemplo de una aplicación vertical. El alcance de este ejemplo va a ser muy pequeño, con la finalidad de que sea digerible.

Primeramente comenzaremos con un diagrama para entender donde es que reside el código dentro de las capas de la cebolla.

OnionArq2


CodeCampServer hace uso del framework ASP.NET MVC, así SpeakerController es parte de la interface de usuario. Este controlador esta acoplado con el framework ASP.NET. SpeakerController depende de IConferenceRepository y IUserSession (también de IClock, pero vamos a omitir eso). El controlador solo depende de interfaces, las cuales están definidas en la base de la aplicación. Hay que recordar que todas las dependencias van dirigidas hacia el centro.

Ahora vamos a poner nuestra atención a las clases ConferenceRepository y UserSession. Hay que notar que están definidas en capas fuera de la base de la aplicación, y ellas dependen de interfaces también, de manera que puedan ser implementadas por estas clases. Estas dos clases implementan interfaces que existen muy cerca al centro. Al momento de ejecución el contener de Control de Inversión (Inversion of Control) va a buscar en su registro y construir las clases apropiadas para satisfacer las dependencias en el constructor de la clase SpeakerController, aquí se muestra parte del código:

public SpeakerController(IConferenceRepository conferenceRepository,
IUserSession userSession, IClock clock)
: base(userSession)
{
_conferenceRepository = conferenceRepository;
_clock = clock;
_userSession = userSession;
}

Así que al momento de ejecución el contenedor IoC resolverá las clases que implementan las interfaces y las pasa al constructor de SpeakerController. En este punto, SpeakerController pueda realizar su trabajo.

De acuerdo con las reglas de la arquitectura de cebolla, SpeakerController PODRIA hacer uso directo de UserSession, debido a que están ambas clases en la misma capa, pero no así en el caso de ConferenceRepository. El controlador debe de apoyarse en ayuda externa para obtener una instancia de IConferenceRepository. Este patrón es utilizado en toda a aplicación, el contener IoC nos ayuda a que sea transparente para nosotros.

Al final de estas series, el plan es publicar un sistema completo que este basado en esta arquitectura.

Jeffry Palermo CTO de Headspring Systems en Austin, TX, es ademas MCSD.Net, Microsoft MVP, Scrummmaster certificado, líder del grupo Austin .Net, miembro del consejo AgileAustin, ponente de INETA y mentor de INETA.

martes, agosto 12, 2008

Innscripciones semestre Ago-Dic 2008 en el ITT


Ya esta proximo a iniciar un nuevo semestre en Instituto Tecnologico de Tijuana, de hecho esta semana inicial las actividades para el proceso de resinscripcion, pero en el sitio web NO HAN PUBLICADO NADA al respecto.

Por tal motivo aqui les proporciono la siguiente informacion que me paso mi hermano.

Primeramente las asesorias academicas empiezan de la siguiente manera - informacion para la carrera de ISC -:
  • 13 de agosto, alumnos de los semestres 2, 3 y 4
  • 14 de agosto, alumnos de los semestres 5, 6 y 7
  • 15 de agosto, alumnos de 8, 9 y otros
Recuerden que hay que pasar a la coordinacion de cada carrera a realizar el horario para el proximo semestre. En esta ocacion alguna "mente brillante" del ITT decidio no publicar los horarios tentativos, para asi llegar a la asesoria con una idea de las materias a tomar.

Las ordenes de reinscripcion para todas la carreras se encuentra aqui. Los datos para el pago son los siguientes:
  • Costo de semestre: $1,900.00 MN
  • Referencia bancaria: 5200212-8
  • Banco: SCOTIABANK INVERLAT
  • No. Cuenta: 13002648938
Nota: Los datos anteriores son tomados tal y cual de la pagina del ITT, es responsabilidad de quien los use validar que sean los correctos. No asumo ninguna responsabilidad en caso de no ser los correctos.

Nota 2: El lugar para resincripcion de TODAS LAS CARRERAS va a ser en la unidad Otay (En el centro de computo), no importa si las clases se llevan en la unidad Tomas Aquino.

Ya que han estado preguntando... No hay horarios para las asesorias solo se sabe que van a ser de 9 am a 5 pm el dia que le corresponda a cada quien. La asesoria se va a realizar en la coordinacion de cada carrera. La inscripcion es la que se va a realizar en el centro de computo.!!!

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

jueves, agosto 07, 2008

La "migra" te puede quitar tus aparatos electronicos

Vas a viajar a Estados Unidos por avión, vía terrestre u otro?, vas a llevar contigo algún dispositivo electrónico o dispositivo de almacenamiento de información como: Computador portátil, celular, CD's, iPod, memorias USB, etc.

Pues cuidado, ya que según Estados Unidos con el afán de detener a esos "terribles" y "malévolos" terroristas, van a poder revisar todos esos dispositivos aun y cuando no exista alguna sospecha sobre ti, es decir cuando se les de la gana, sin importar si eres ciudadano Estadounidense o no.

Ademas de poder llevarse tus equipos para examinarlos en algún otro lugar, copiar tus datos, traducirlos, etc. e inclusive detener tus aparatos por meses, y todo legalmente.

Inclusive se pueden quedar con tus libros y folletos.

Lo único que puedo comentar claramente ante esta situación es: QUE POCA MADRE !!

Nota del periodico Frontera

La arquitectura de cebolla: parte 1

Este post es parte de una serie de post en ingles de Jeffrey Palermo, en ellos se describe lo que Jeffrey llama la "Arquitectura de Cebolla" - Onion Arquitecture -.

La arquitectura aquí descrita es muy apropiada para aplicaciones de negocio con un amplio ciclo de vida o aplicaciones que tienen un comportamiento complejo. Mediante el énfasis del uso de interfaces para los contratos de comportamiento, se fuerza a la externalizacion de la infraestructura.

Arquitectura tradicional en capas

El diagrama 1, muestra la representación de la arquitectura tradicional en capas. Esta es el tipo de arquitectura básica y mas utilizada. Cada capa inferior depende de la capa superior, y a su vez cada capa va a depender de una infraestructura común y servicios comunes.

Diagrama 1: Arquitectura en capas

La gran desventaja de esta arquitectura de capas de arriba hacia abajo, es que crea acoplamientos fuertes, es decir cada capa es acoplada a las capas inferiores, y cada capa es también acoplada con varias partes de la infraestructura que tienen diferentes preocupaciones. Aunque, sin acoplamiento, nuestros sistemas realmente no harían nada útil, el problema es que esta arquitectura tradicional crea acoplamientos innecesarios.

El problema principal (y también el mas común) es el acoplamiento entre la UI (interface de usuario, por sus siglas en ingles) y la lógica de negocios para acceder a los datos. Sí, la UI esta acoplada con el acceso a datos en esta arquitectura, dependencias transitivas continúan siendo dependencias; la UI no puede funcionar sin la lógica de negocios y la lógica de negocios no puede funcionar sin el acceso a datos; intencionalmente ignoramos la infraestructura, ya que esta puede variar de sistema a sistema.

Las técnicas de acceso a datos cambian frecuentemente, históricamente, la industria a modificado estas técnicas por lo menos cada tres años, por lo tanto, posiblemente en tres años vamos a tener que modificar sistemas sanos, de larga vida que son de misión critica para los negocios. Los sistemas no son actualizados para mantenerse al día, debido a que es muy difícil lograrlo, por lo tanto si el acoplamiento impide el actualizar fácilmente partes del sistema, no queda otra opción que despreciar el sistema y dejar que se convierta en obsoleto. Así es como un sistema heredado - legacy - se congela en el tiempo, y eventualmente es reemplazado por uno nuevo.

Arquitectura de Cebolla

Aquí es donde entra la arquitectura de cebolla, que si bien no es algo nuevo, si se propone este nombre para identificar este patrón arquitectural. Los patrones son útiles debido a que proporciona a los profesionales del software un vocabulario común mediante el cual comunicarse. En la arquitectura de cebolla existen varios aspectos, que si tenemos un termino común para describirlos, entonces nos podemos comunicar eficientemente.

El diagrama 2 muestra esta arquitectura. La parte importante es que controla el acoplamiento; como regla general, todo el código puede depender de capas centrales, pero no puede depender de capas fuera de la capas base - core -. En otras palabras, el acoplamiento se dirige hacia el centro. Esta arquitectura favorece la programación orientada a objetos.

Diagrama 2: Arquitectura de cebolla

En el centro podemos observar el dominio de modelos - Domain model -, que representa la combinación de estado y comportamiento de los modelos a través de la organización. Alrededor del dominio de modelos existen otras capas que incluyen mas cuestiones de comportamiento. El numero de capas de la base de la aplicación puede variar, pero hay que recordar que siempre el domino de modelos esta en el centro y debido a que las capas se acoplan al centro, el dominio de modelos solo puede acoplarse a si mismo.

La primera capa alrededor de nuestro dominio de modelos, es donde típicamente encontramos las interfaces que nos van a proporcionar el comportamiento para guardar u obtener un objeto, esta capa se llama las interfaces de repositorio. El guardar o leer un objeto, no es un comportamiento de la base de la aplicación, ya que típicamente esto es competencia de la base de datos; así que solo la interface con este comportamiento es la que se encuentra en la base de la aplicación.

En las orillas de nuestro diagrama vemos la UI, infraestructura y las pruebas, esto se debe a que la capa exterior es reservada para los artefactos que cambian constantemente; por lo tanto estos deben de ser intencionalmente aislados de la base de la aplicación. Ahí mismo en la orilla nos encontraremos con alguna clase que implemente la interface de repositorio. esta clase va a estar particularmente acoplada al método de acceso a datos, y es por eso que reside fuera de la base. Debido a que esta clase implementa la interface repositorio, esta clase esta acoplada a la interface.

La arquitectura de cebolla se apoya plenamente en el principio de Dependencia Inversa - Dependency Inversion -. La base de la aplicación necesita de la implementación de las interfaces base, y si las clase que las implementas existen en los bordes de la aplicaciones, entonces necesitamos de algún mecanismo que "inyecte" esas clases al momento de ejecución de la aplicación, para que así, haga algo útil.

Un cambio importante es esta arquitectura es, que la base de datos no es el centro, si no un recurso externo. Externalizar la base de datos puede ser un reto para algunas personas que piensan en las aplicaciones como aplicaciones de datos. Con la arquitectura de cebolla, no hay aplicaciones de datos. Pueden existir aplicaciones que podrían hacer uso de las base de datos como un servicio de almacenamiento, pero solo a través de alguna infraestructura externa de código, que implemente las interfaces que hagan sentido para la base de la aplicaciones. Desacoplar las aplicaciones de las bases de datos, sistemas de archivos, etc. minimiza el costo de mantenimiento durante la vida de la aplicación.

Alistar Cockburn ha escrito sobre la arquitectura hexagonal; tanto esta la arquitectura hexagonal como la arquitectura de cebolla comparten la siguiente premisa: Externalizar la infraestructura y escribir un adaptador en código de manera que la infraestructura no tenga un acoplamiento fuerte con la aplicación.

En los siguientes posts se hablara mas detalle acerca de esta arquitectura.

Jeffry Palermo CTO de Headspring Systems en Austin, TX, es ademas MCSD.Net, Microsoft MVP, Scrummmaster certificado, líder del grupo Austin .Net, miembro del consejo AgileAustin, ponente de INETA y mentor de INETA.

jueves, julio 03, 2008

Twitter vs Identi.ca

Twitter popularizo el microblogging a través del Internet así como por medio de mensajes SMS, el ser un sitio popular puede pensarse que es algo positivo, pero en caso de Twitter parece ser lo contrario.

twitter_deadbird.jpg (JPEG Image, 480x360 pixels) - Mozilla Firefox (Build 2008061004)
Uploaded with plasq's Skitch!

Twitter se ha convertido en una necesidad de expresión para sus usuarios, que en tan solo 140 caracteres nos dejan saber que ocurre con ellos, pero también se ha convertido en una frustración diaria, con las fallas en el servicio, mensajes de que esta sobrecargado, deshabilitacion de funcionalidad y limites para poder acceder a Twitter mediante su API.

El problema con Twitter ha sido a tal grado que existe un blog para conocer el estatus de Twitter: http://status.twitter.com/; inclusive Ruby on Rails, que es el software con el esta programado Twitter ha recibido parte de las criticas de la fallas de Twitter, implicando que Ruby on Rails no es la herramienta adecuada para sitios de alto trafico.

El problema de Twitter, en lo personal, creo que es de arquitectura y no de las herramientas que hacen que Twitter funcione (o medio funcione), creo también que en buena parte es que para realizar cambios en la arquitectura es necesario "romper" buena parte de la funcionalidad actual y los arquitectos de Twitter no están dispuestos a hacer eso, en su lugar están batallando con código "legacy" mientras se mueven a una nueva arquitectura.

twitter-whale.png (PNG Image, 400x300 pixels) - Mozilla Firefox (Build 2008061004)
Uploaded with plasq's Skitch!

De hecho existe un post donde se de se admite que el Twitter fue diseñado como un sistema de administración de contenido en lugar de como lo que es, un sistema de mensajería.

Pero aun y con todos estos problemas que hace que los usuarios se queden en Twitter?. Durante todo este tiempo han salido un buen numero de clones de Twitter buscando aprovecharse de la mala reputación de este, pero no han podido desbancarlo como el servicio mas utilizado.

En buena medida se debe a que la mayoría de los usuarios aun siguen en Twitter, y si alguien se mueve a otro servicio, es posible que no todas las personas a las que siga se muevan a mismo servicio que el, por lo tanto aun y cuando algunos han probado otros servicios a final de cuentas regresa a Twitter.

El soporte de clientes para Twitter es otra gran ventaja que le ha permitido mantener su base de usuarios, ya que muchos usamos clientes que corren es nuestras PC's para "Twittear". Por lo general esos clientes no soportan otros servicios de microblogging.

Pero la pregunta importante es, cuanto tiempo mas podrá soportar así?, antes de ocurra una desbandada de usuarios a algún otro servicio con mejores perspectivas.

Como mencione anteriormente muchos aun estamos en Twiter, porque ahí esta la gente a la que seguimos, o por los clientes que nos permiten hacer uso de Twitter en nuestra PC's o por el envío de mensajes SMS o IM; pero que pasaría si existiera otro clon de Twitter con la misma funcionalidad, sin problemas y que la misma comunidad pueda dirigir?

Pues bien esa es la idea detrás de un nuevo servicio que acaba de ser lanzado: Identi.ca. Identi.ca actualmente es un servicio de microblogging con capabilidades inferiores a Twitter, ya que solo permite el "twittear" pero no cuenta con forma de buscar a amigos, no cuenta con API para escribir clientes, no tiene servicio SMS, aunque si permite "twittear" con Jabber o GTalk.

Pero como Identi.ca con apenas la funcionalidad mínima puede desbancar a Twitter? La respuesta puede ser simple, es Open Source. Si, Identi.ca carece de funcionalidad, pero es Open Source, y algunos de los primeros usuarios son programadores Open Source, así que realmente espero que Identi.ca dentro de poco tiempo alcance la misma funcionalidad de Twitter, ademas prometen un API compatible con Twitter, lo cual lograra que los clientes para Twitter puedan funcionar en Identi.ca sin cambios.

Pero que pasa si todos saltan del barco de Twitter a Identi.ca?, tendrá los mismos problemas de fallas en el servicio y sobrecarga?, bueno aquí es donde esta una de las fortalezas de Identi.ca, al ser Open Source cualquiera puede tomar el código y montar su propio servidor con lo que se vuelve en una solución distribuida, pero esperenme, esto causaría fragmentación del servicio con usuarios en alguno de los servidores, pero no en todos ... bueno no realmente, ya que Identi.ca seria un servicio federado, es decir que existen enlaces de comunicación entre los servidores del servicio, lo que permitirá el envío de mensajes a cualquier sistema de microblogging - no únicamente Identi.ca igual y hasta Twitter puede ser parte de la federación - que se una a la federación, por lo tanto no importaría que servidor de Identi.ca estemos utilizando.

Aunque esto no deja ser en este momento mas que especulación, habría que esperar algunas semanas para poder apreciar como Identi.ca evoluciona son la ayuda del Open Source. Por lo pronto mi cuenta de Identi.ca es http://identi.ca/mariochavez.

Por cierto hoy Twitter amaneció con mejor salud http://twitter/mario_chavez

lunes, junio 30, 2008

VW Crossfox

Hace ya algunas semanas adquirí - bueno es un decir, di el enganche y me autorizaron el crédito - un nuevo vehículo de la VW que recientemente introdujeron al mercado de México, es como una especie de SUV pequeño y todo terreno, el auto es un VW Crossfox.

En lo personal la forma el vehículo me gusta, es cómodo y económico, ademas de que el precio del vehículo es muy accesible. Poco a poco veo como el numero de vehículos de este tipo empiezan a aparecer cada vez mas en Tijuana.

El caso, es que actualmente estoy en Estados Unidos, en la ciudad de Oxnard California, a trescientos millas al norte de la frontera con México, muy cerca a la ciudad de Santa Mónica.

Llegue manejando aquí y precisamente me viene en el Crossfox, el cual es un auto que tengo entendido esta solo en los mercados de México y Brasil, por lo tanto en esta área el Crossfox no común de ver.

Definitivamente a llamado la atención, desde el conductor que esta al lado mío en el semáforo volteando a ver el auto con curiosidad, hasta el que le toma fotos con el celular y los que se me han acercado con preguntas como: ¿Que auto es?, ¿Lo venden aquí en US?, ¿Que tal el consumo de gasolina?, y también comentarios como ¨Esta bonito el auto, me gusta¨,¨Ojala lo vendan aquí en US tambien¨.

En lo general estoy contento con el auto y me agrada el que cause, aunque sea un poco de expectación, por lo menos aquí donde me encuentro ahora.


viernes, junio 13, 2008

Fin de semestre en el ITT

Hace un par de días se acabo otro semestre mas en el ITT, el séptimo para mi, para ser mas exactos. En general no me gusto el semestre mucho que digamos, en buena parte por algunos maestros, que definitivamente dejaron mucho que desear; sobre todo en materias como Simulación e Inteligencia Artificial que eran de las mas interesantes del semestre y al final fueron un fiasco.

Este semestre a diferencia de otros se caracterizo por la cantidad de proyectos que se tuvieron que realizar:

Evaluación y formulación de un proyecto para monitoreo y localización de unidades, por ejemplo automóviles, camionetas y/o camiones de reparto, por medio de GPS y redes telefónicas - tringulacion -, ademas de que con el uso de redes 3G es posible obtener información detallada sobre el vehículo, como velocidad, imágenes exteriores e interiores, audio; también es posible controlar ciertas funciones del vehículo, como el encendido, puertas, etc.

Generador de números pseudoaleatorios y pruebas de aleatoriedad, así como algunas aplicaciones de simulación para predecir situaciones mediante la repetición de cientos de experimentos, lo interesante aquí es que LINQ fue de gran ayuda para reducir la complejidad del proyecto.

Monitor de movimiento, Este proyecto consiste en colocar una o varias cámaras de video en lugares que deseamos monitorear, las cámaras publican las imágenes tomadas, las cuales son consumidas por un programa de monitoreo, el cual analiza las imágenes para detectar movimiento, marca en la imagen el área donde detecto movimiento, activa una alarma visual, registra la secuencia de imágenes donde se detecto movimiento, finalmente envía notificaciones de este evento.

Análisis de un proyecto para el registro de votos en forma electrónica, el proyecto consiste en un sistema central para despliegue de la elección y recolección de datos de las casilla de votación electrónica. Las casillas consisten en un monitor "touchscreen" para recibir los votos, los cuales son almacenados en una base de datos - encriptados -, ademas de impresión del voto en un rollo interno de una impresora, con la finalidad de dejar evidencia física del voto. La casilla mediante redes 3G envía los votos recolectados cada cierto tiempo.

Me toco trabajar con Joomla y PHP, experiencia horrenda, por lo menos Joomla no lo vuelvo a tocar mientras pueda.

Finalmente tuve otro proyecto con PHP, porque así se requirió, en lo personal no me gusta PHP, pero en este proyecto utilice CakePHP, el cual es un Framework MVC para PHP, el cual hizo la experiencia bastante agradable. No he cambiado mi opinión de no gustarme PHP, pero bueno CakePHP lo hizo interesante