viernes, abril 27, 2007

Silverlight vs Flex

Al parecer Microsoft se ha aventurado en una nueva batalla, esta vez por el control de aplicacion interactivas y ricas en multimedia para Web, en contra del mismisimo Adobe y su Flash. El nuevo producto de Microsoft Silverlight (antes llamdo WPF/E) promete mejorar la experiencia en aplicaciones interactivas para Internet con la ayuda de video, animaciones de graficos vectoriales e interactivos; el programa esta basado en la definicion de interfaces declarativas mediante XAML, con soporte para AJAX y obviamente todo el soporte de .NET.

Para poder ver contenido del Silverlight, es necesario instalar un "plugin", el cual microsoft promociona como multiplataforma, pero en el area de preguntas comunes del sitio solo hablan de soporte para Windows y MAC OX con los navegadores IE, Firefox y Safari.

 

 

Pues Adobe no se quizo quedar atras y ha anunciado que su framework Flex lo va a liberar completamente como Open Source para finales de año, ya desde ahorita hay algunas partes de Flex que estan libres. Flex al igual que Silverlight ofrece crear aplicaciones para Web ricas en contenido y dinamicas, estas aplicaciones se pueden visualizar mediante el plugin de Flash 9, el cual soporta mas plataformas que Silverlight, al incluir Linux - junto con todos los navegadores desarrollados para linux, ya sea con el backend de Safari o Firefox - y el navegador Opera, esto sin contar que si no todas las pc, si un alto porcentaje de estas cuenta ya con el plugin de Flash instalado, esto gracias al tiempo que lleva en el mercado y a sitios muy populares como Youtube.com que requieren de ese plugin para visualizar el contenido.

Flex ademas proporciona una IDE open source basada en eclipse para el desarrollo de aplicaciones, ademas de permitir escribir el "backend" de las mismas con lenguajes como ColdFusion, Java, .NET, PHP y Ruby.

Microsoft ya tiene un largo historial de entrar con productos a mercados dominados por otras companias y ganarlos, veremos si en esta ocasion se repite la historia.

Por ultimo como dato curioso el 20 de Abril, antes del anuncio de Adobe sobre liberar Flex, Miguel de Icaza comenta acerca de Silverlight desde su perspectiva y por ahi hace un comentario sobre que el piensa que Flash deberia liberarse como Open Source, pues bien el framework para crear aplicaciones para Flash esta a punto de dar este paso, quizas el siguente si sea Flash?

lunes, abril 09, 2007

Revivir el blog

Hace ya tiempo que habia dejado el blog por la paz, tengo la intencion de revivirlo, aunque para esto he regreado nuevamente a blogger, y asi quitarme de los problema de tener que mantener un sitio para esto.

sábado, abril 07, 2007

Test para entrar a una carrera de Ingenieria (Humor)

Generalmente no publico este tipo de posts, pero este me parecio gracioso - y muy apegado a la realidad -, es un test para saber si la persona tiene las cualidades para ser un Ingeniero:

FACULTAD DE INGENIERIA
¿Usted toma? __SI ___NO
¿Mucho Mucho? __SI ___NO
¿En verdad? __SI ___NO
¿Asistirá a las pedas de la Facultad? __SI ___NO
¿Conoce al menos 20 palabras altisonantes? (Nota:Altisonantes quiere decir
que saben hablar puras pinches pendejadas y putas groserías de mierda.) ___A HUEVO __NO

Para tests para otras areas/carreras universitarias consultar aqui.

Dude!, donde quedo Merge?

Para quizas una de las instrucciones mas interesantes que SQL 2005 introducia en T-SQL era la instruccion Merge, la cual tambien es conocida como "Upsert". La funcionalidad de Merge permitia el mezclar los cambios de una tabla en otra existente, pudiendo generarse casos en donde el registro ya existia en la tabla destino, en ese caso solo se actualizaba el registro existente y cuando no existia, se insertaba el registro faltante todo con una instruccion.

En el libro "Introduccion Microsoft SQL 2005 for developers" se habla sobre esta instruccion, pero en la version final al parecer fue excluida, la pregunta clave es, porque?; de acuerdo con los ejemplos del libro mencionado la forma de escribirla era:

MERGE INTO MyTable
     USING MyTempTable
          ON MyTempTable.MatchingField1 = MyTable.MatchingField1
WHEN MATCHED THEN
     UPDATE UpdateField1 = MyTempTable.UpdateField1
WHEN NOT MATCHED THEN
     INSERT VALUES(MyTempTable.MatchingField1, MyTempTable.UpdateField1)

Sin esa instruccion la pieza de T-SQL que produce el mismo efecto es:

UPDATE m
     SET UpdateField1 = t.UpdateField1
FROM MyTable m
     INNER JOIN MyTempTable t
          ON m.MatchingField1 = t.MatchingField1

INSERT INTO MyTable (MatchingField1, UpdateField1)
SELECT t.MatchingField1, t.UpdateField1
FROM MyTempTable t
     LEFT JOIN MyTable m
          ON m.MatchingField1 = t.MatchingField1
WHERE m.MatchingField1 IS NULL

A mi parecer era una instrccion muy util - y mas ahora que la estoy necesitando -, pero por alguna razon desconocida - no he encontrado referencia en Internet del porque ya no existe -, la instruccion desaparecio. Ahora si quiero usar esa misma instruccion en mi base de datos, solo me queda migrarme a Oracle, que la implemento desde la version 9i hace ya algunos años.

Subversion en Windows

Subversion es un sistema para el control de codigo fuente, es decir ayuda al manejo y control de control de archivos y directorios que son colocados en un repositorio que se encarga de registrar cada cambio realizado en ellos, con lo cual nos es posible recuperar una version anterior de algun archivo, o revisar y auditar la historia de cambios ocurridos, la forma en como Subversion maneja la historia es mediante la asignacion de un numero de revision en cada cambio atomico - es decir en cada cambio de uno o un grupo de archivos y/o directorios -.

El repositorio es posible accederlo de forma local (file://myrepositorio) o a traves de la red (svn://myrepositorio) y su mecanismo de seguridad nos ayuda a controlar quien tiene acceso al repositorio, ya sea de solo lectura o con permiso de escritura.

La forma en como el repositorio es organizado por omision, consiste es tres directorios que nos ayudan a llevar una organizacion de nuestro codigo fuente:

Trunk: Este directorio se utiliza para colocar nuestra version de codigo fuente mas actual, es donde generalmente se colocan los archivos de codigo fuente con los que estamos trabajando, por ende contiene la version mas actual de nuestro programa.

Branches: Hay ocaciones que es necesario realizar algunas pruebas con nuestro codigo - por ejemplo agregar funcionalidad que puede o no concretarse en la version final -, pero que no queremos que se vea afectada por el desarrollo normal de la aplicacion o bien, con nuestra pruebas no queremos afectar el desarrollo normal de la aplicacion, en esos casos podemos hacer una copia desde el Trunk para nuestra copia de trabajo, despues si los cambios realizados en nuestra "branch" nos satisface, podemos sincronizarlos con el Trunk o viceversa, podemos sincronizar cambios desde el Trunk con nuestro "branch".

Tags: Finalmente cuando liberamos alguna version de nuestra aplicacion, hacemos una copia del codigo fuente del Trunk que compone nuestra version de la aplicacion y la copiamos al directorio Tags, de esa forma podemos identificar plenamente el codigo fuente del cual se compilo una version especifica de nuestra aplicacion, mientras que en Trunk se puede continuar con el desarrollo de la proxima version.

Repositorio
-------> Trunk
----------------> Miprograma ( <- lugar donde ocurren los cambios mas actuales a nuestro codigo fuente )
-------> Branches
----------------> Miprograma_Mario_Prueba ( <- Copia de alguna version del Trunk para pruebas personales )
-------> Tags
----------------> Miprograma_V1.0 ( <- Copia del Trunk del codigo que compone la version 1.0 )
----------------> Miprograma_V1.1 ( <- Copia del Trunk del codigo que compone la version 1.1 )

Para trabajar con el codigo fuente del repositorio, es necesario realizar una copia, por ejemplo del Trunk, a nuestro disco duro local, la cual permanece bajo el control de Subversion, en esta copia podemos realizar nuestros cambios, y cuando esten completos, estos se envian al servidor de Subversion para que se registren en el repositorio. Es imprtante mencionar que al realizar la copia local, los archivos no tienen candado que limiten a otros programadores copiar los mismo archivos a sus pcs, lo cual permite a mas de un programador trabajar con los mismos archivos almismo tiempo.

Si bien esto es una gran ventaja, tambien esta propenso a conflictos, por ejemplo si dos programadores copian el mismo archivo del Trunk a sus disco duro, y los dos trabajan en cambios sobre el, pero uno de los programadores envia sus cambios al servidor de Subversion antes que el otro, el segundo va a recibir posiblemente un error indicando que el archivo fue modificado en el servidor, por lo cual es necesario sincronizar el nuevo archivo del servidor con la copia local. En algunos de los casos el mismo Subversion va a ser capaz auto sincronizar los cambios entre los dos archivos, en otras ocaciones el programador va a tener que indicarle a Subversion como sincronizar los cambios.

Si bien Subversion ayuda al manejo de codigo fuente en un equipo de desarrolladores, eso no implica que si se es un desarrollador unico no se pueda usar Subversion, definitivamente si se realiza desarrollo es importante el contar con algun tipo de control de codigo fuente, que nos ayude a manejar el codigo, a organizarlo, a comentar y poder revisar cambios realizados, y sobre todo que nos permita "regresar en el tiempo" y rescatar, si se requiere, el codigo fuente como estaba antes de algun cambio que causo algun problema.

La siguiente guia de como instalar Subversion en Windows la tome y la traduje de aqui.

Obtener los programas necesarios

  • Es necesario descargar la version mas reciente de Subversion para Windows
  • Para configurar que Subversion se ejecute como un servicio en Windows es necesario descargar este archivo.
  • Finalmente y de manera opcional podemos descargar una herramienta grafica que nos ayude a manejar el repositorio, una de ellas puede ser TortoiseSVN que se integral al Windows Explorer o Ankhsvn que se integra al IDE de Visual Studio

Instalar Subversion

Solo es necesario ejecutar el instalador y listo, adicionalmente va a ser necesario agregar el directorio de instalacion a nuestra variable de ambiente PATH y opcionalmente configurar notepad u otro editor de texto como el editor por omision de Subversion.

Para agregar el path de Subversion a la variable de ambiente PATH solo es necesario agregar la linea %programfiles%\subversion\bin

Para indicar que el notepad va a ser el editor por omision de Subversion es necesario agregar la variable de ambiente SVN_EDITOR apuntandola a c:\windows\notepad.exe

 Creando un repositorio

Para crear un repositorio en una ventana de MS-DOS ejecutamos el siguiente comando

svnadmin create "c:\Documents and Settings\Subversion Repository"

Despues es necesario modificar nuestro archivo /conf/svnserve.conf para indicar que usuarios anonimos pueder ver el codigo fuente, solo usuarios autentificados pueden realizar cambios y que nuestro archivo de seguridad se va a llamar passwd.

[general]
anon-access = read
auth-access = write
password-db = passwd

En el archivo /conf/passwd damos de alta a los usuarios y sus password de la siguiente forma:

[users]
harry = harryssecret
sally = sallyssecret

Nota: El directorio conf se encuentra dentro del directorio que creamos para nuestro repositorio en nuestro caso fue: "c:\Documents and Settings\Subversion Repository"


Probar que nuestro repositorio trabaja


Para poder probar nuestro repositorio es necesario iniciar el servidor de Subversion para esto ejecutamos la siguiente instruccion desde una ventana de MS-DOS

svnserve --daemon --root "C:\Documents and Settings\Subversion Repository"

Despues creamos un directorio en nuestro repositorio

svn mkdir svn://localhost/trunk/myproject

Una ventana de notepad aparecera, esta ventana ponemos algun comentario que nos ayude a recordar el porque del cambio en el repositorio, en nuestro caso del porque de la creacion del directorio. Estos comentarios son importantes ya que quedan relacionados con los cambios realizados en el repositorio y son de gran utilidad cuando se revisa el historia del cambios ya que nos ayudan a comprender el porque de los mismos.


Hay que colocar nuestro comentario y guardar el archivo de texto con el nombre por omision.


Acto seguido se nos va a preguntar por nuestras credenciales de Subversion

Authentication realm:  0f1a8b11-d50b-344d-9dc7-0d9ba12e22df
Password for 'Administrator': *********
Authentication realm: 0f1a8b11-d50b-344d-9dc7-0d9ba12e22df
Username: sally
Password for 'sally': ************

Committed revision 1.

Una vez que las proporcionemos vamos a ver el mensaje Committed revision 1, el cual indica que nuestro cambio fue guardado con el numero de revision 1.


Iniciar el servidor de Subversion como un servicio de Windows


Para detener nuestro servidor de Subversion, en la ventana de MS-DOS donde se esta ejecutando es necesario presionar CTRL+C, despues hay que copiar el archivo SNVService.exe descargado de aqui en el directorio de instalacion de Subversion subversion\bin, finalmente hay que configurar el servicio para que apunte a nuestro repositorio y se inicie automaticamente con el siguiente comando

svnservice -install --daemon --root "C:\Documents and Settings\Subversion Repository"
sc config svnservice start= auto
net start svnservice

Lo unico que resta es probar que nuestro servicio funciona con el siguiente comando

svn ls svn://localhost/trunk

El cual nos debe de mostra nuestro directorio myproject que creamos anteriormente.


Herramientas graficas para el manejo del repositorio


TortoiseSNV se integra al shell de Windows Explorer, permitiendonos manejar de forma grafica el repositorio de SVN. Por cierto aqui hay informacion de como integrar TortoiseSVN dentro del IDE de Visual Studio




Ankhsvn es otra herramientra grafica que se integra al IDE de Visual Studio, y tambien permite el manejo grafico de repositorio.




Recursos adicionales


Como recursos adicionales para conocer mas acerca de subversion, esta disponible el libro gratuito "Version Control with Subversion". El sitio de TortoiseSVN tambien tiene informacion interesante.


Conclusion


Como mencione anteriormente no importa si se es un equipo de programadores o si se es un programador unico, es una buena practica el contar con un control de codigo fuente. El lo personal utilizo Subversion desde hace 2 años y me ha sido de gran utilidad cuando me ha sido necesario investigar cambios realizados en el pasado, o para mantener el codigo de mi version estable de un programa, mientras cuento con otra copia del codigo fuente de la version sobre la cual estoy trabajando.

Nokia 770 Internet Tablet

Ya hace una semana que compre un Nokia 770 Internet Tablet, el cual es un PDA que corre Linux.

El PDA es realmente pequeño (141 x 79 x 19 mm) y pesa 230 g; cuenta con un display de alta resolucion de 800 x 480 con 65, 536 colores.

Tiene conectividad Wi-Fi y Bluetooth, y cuenta con una serie de programas que me permiten navegar en Internet, Mensajeria Instantea, Voz sobre IP, Radio por Internet, reproductor video, reproductor de archivos de audio, block de notas, lector de PDF y correo electronico. Los metodos de entrada son a traves de su pantalla tactil, ya sea mediante el reconocimiento de escritura o con el teclado en pantalla.

De fabrica el Nokia 770 viene con los programas necesarios para empezar a trabajar con el, pero dada su naturaleza de que ejecuta Linux y que el Internet Tablet OS - Linux y ambiente grafico personalizado para el 770 - Nokia lo tiene liberado como open source, existe una comunidad de programadores que estan creando aplicaciones nuevas y portando existentes para que puedan ejecutarse en el. De hecho existe un listado "semi oficial" de las aplicaciones disponibles en este catalogo, ademas de que Nokia ofrece hospedaje para el codigo fuente de aplicaciones en su garage - muy a la sourceforge -.

Tanto en el catalogo como en el garage existen una gran cantidad de aplicaciones de todo tipo; ademas con la ayuda de Google, es posible encontrar aplicaciones adicionales disponibles no listadas en el sitio de Nokia.

Ayer instale el ambiente de prueba y compilacion de aplicaciones para el Nokia 770, espero poder tener algo de tiempo libre para desarrollar algo, aunque sea sencillo. Es posible desarrollar usando C, C++ y Phyton, existe soporte para Mono pero solo para aplicaciones en la version IT2005 del SO, para la version actual IT2006 del SO, se necesita algo de trabajo todavia para que funcione correctamente.

Actualizacion:
Como informacion adicional sobre el Nokia 770 se me paso comentar que en general me gusta la facilidad de uso, el que exista una lista importante de aplicaciones que se pueden cargar de forma sencilla, pero tambien encuentro los siguientes inconvenietes, algunos de ellos ya existe trabajo en proceso para solucionarlos, en otros no esta claro cual es su futuro, por ejemplo:

  • Utiliza Opera como navegador de Internet pero no soporta "tabs" para abrir nuevas sesiones - como Firefox -, algunos sitios que hacen uso de AJAX no funcionan; ya hay gente trabajando en portar Minimo de Mozilla, el cual si soporta "tabs" y aunque no lo he probado quiero pensar que tiene mejor soporte para AJAX.
  • Aunque soporta contenido flash, cuenta con la version 6.0, obviamente videos de sitios como Youtube y Google Video no se pueden ver, al parecer Macromedia esta cerca de poder liberar Flash 9.0 para Linux, con un poco de suerte en un futuro proximo se podria actualizar la version de flash del Nokia.
  • El cliente de email es malisimo, pero ya existe trabajo en un nuevo cliente llamado Modest.
  • No reproduce audio ni video en formato Windows Media, asi que se necesita convertirlo a algun otro formato compatible antes de poder pasarlo al Nokia, aqui la unica solucion viable es licenciar los codecs de Microsoft.

Día mundial de software libre

Este 16 de septiembre se va a llevar a cabo el dia mundial del software libre, y Tijuana no es la excepcion. El evento esta siendo organizado por Linux Baja en la sala de lecturas del Centro Cultural Tijuana de 2pm a 8pm.

Los temas que se van a presentar son:

  • 2:00 PM – 2:30 PM Registro
  • 2:30 PM – 3:00 PM Conferencia “¿Qué es el Software Libre?”
  • 3:00 PM – 3:50 PM Conferencia “Ventajas del Software Libre”
  • 4:00 PM – 4:50 PM Conferencia “Software Libre para Windows: The Open CD”
  • 5:00 PM – 5:50 PM Conferencia “Integración de soluciones empresariales utilizando Software Libre”
  • 6:00 PM – 6:50 PM Conferencia “GPL: Licenciamiento en el Software Libre”
  • 7:00 PM – 7:50 PM Panel Software Libre en la vida diaria

Andres Manuel, enfermo de poder

Ante los ultimos acontecimientos en relacion a las elecciones presidenciales del 2 de Julio, la unica conclusion que me queda acerca de la actitud Andres Manuel Lopez, es que esta enfermo de poder y quiere la presidencia a costa de todo y de todos.

Al margen de que si hubo fraude, ya sea "cibernetico", a la "antigϋita", "embarazo" de urnas, el algoritmo matematico, la corrupcion de los representantes de casilla de la coalicion; Andres Manuel quiere la presidencia para el y nada mas para el, no va a aceptar de ninguna forma que otra persona mas sea presidente si no es el.

Por que realizo tal aseveracion?, bueno en un post anterior ya mencione que ha descalificado a todo aquel, institucion o persona, que no crea que Andres Manuel gano las elecciones, solo restaban los ministros de la corte que estan decidiendo sobre las incorformidades presentadas por la Coalicion por el de bien de todos, pues bien ese momento ya llego, como al parecer la corte no va a invalidar la eleccion y tampoco le va a dar el triunfo a Andres Manuel, se refirio a ellos de la siguiente forma:

"Ellos, que aparentan ser gente de bien, la verdad es que son unos reverendos ladrones. Nos quieren despojar, nos quieren robar la Presidencia"
Articulo diario La jornada

Ademas agregro que - en la misma nota -:

''porque no soy cacique ni líder moral, sino dirigente de mujeres y hombres libres y con criterio''

O sea que si yo no lo apoyo, por lo tanto a mi no me liderea, eso indica que no soy libre - de pensamiento y/o accion -, ademas no tengo criterio... y lo mismo pasa con la demas gente que no lo apoya?, si bien es cierto Andres Manuel es apoyado por los llamados Intelectuales del pais - y no lo digo de forma irrespetuosa -, asi como por personas que creen en el; tambien es "apoyado" por una orde de borregos que no tienen ni la menor idea de que es lo que hacen ni porque, solo les dijeron que tenian que apoyar, gritar y estar al pendiente de los pases de lista.

A pocos de dias de que el Tribunal ratifique a Felipe Calderon como ganador de la eleccion, Andres Manuel asevero que no va a aceptar el resultado y que la resistencia continuara, pero no solo eso, se va a autoproclamar presidente de Mexico !!

En una entrevista publicada en Le Monde (Frances, Ingles) , Andres Manuel indica que no va aceptar otro resultado que no le sea favorable - como siempre ha sido con el, sin importar si esta mal, equivocado o no -.

En la entrevista comenta que de acuerdo al articulo 39 de la Constitucion, el pueblo tiene el derecho inalienable de cambiar al gobierno si este no vela por los intereses de los gobernados, por tal motivo comenta que no va de ninguna manera a reconocer al gobierno de Felipe Calderon, y que en base a este articulo a convocado a una asamblea constituyente para el proximo 16 de Septiembre.

Segun el, la asamblea constituyente estaria conformada por delegados de todas la regiones del pais, por lo tanto es una asamblea representativa, la cual en un acto republicano tiene la decision de nombrar a quien seria el legitimo presidente de Mexico, por tal aseveracion implica que habria una disolucion de los poderes legislativo, judicial y ejecutivo, ya que esta asamblea decidiria por ellos y por nosotros los Mexicanos... pero esperenme un momento si esta asamblea es convocada por Andres Manuel y la Coalicion por el bien de todos, entonces los delegados que supuestamente nos representarian son afines a Andres Manuel ... mmmm dejenme adivinar, si eligen al legitimo presidente de Mexico, esta eleccion no caeria en ... Felipe?, Madrazo?, Patricia?... no !, seria la mismisisima Excelencia, Emperador de Mexico, Don Andres Manuel Lopez Obrador !

Con esto nos dejan fuera de la jugada a los que votamos por otra opcion, llamese Alianza, Convergencia, PAN, PRI, o los que invalidaron su voto, votando por el Dr. Simi, Batman o algun otro personaje.

Ahora si lo puedo decir con todas sus letras, Andres Manuel Lopez Obrador esta enfermo de poder.

Ante tal perspectiva, quizas lo mejor seria que el tribunal invalide la eleccion, el poder legislativo nombre un presidente interino, y que Andres Manuel se espere 2 años para otra eleccion, haber si realmente recibe el apoyo de dice que tiene. O mejor aun que invaliden la eleccion y que no se les permita registrarse a los mismo candidatos a ver que hace Andres Manuel - aunque esto no es posible de acuerdo a la ley -.

ADO.NET vNext CTP

Hace unos dias Microsoft libero la primera version de prueba del ADO.NET vNext, el cual es una herramienta que ayuda a mapear entre el modelo de base de datos relacional al modelo orientado a objetos, lo cual ayuda a poder abstraer el modelo de la base de datos del diseño y programacion de la aplicacion.

ADO.NET vNext consiste en el ADO.NET Entity Framework y la integracion del mismo con LINQ. Con el ADO.NET Entity Framework podemos hacer uso del Entity Data Model para mapear la estructura de la base de datos a nuestro diseño orientado a objetos, de esta forma podemos trabajar en nuestra aplicacion puramente con objetos, y cuando nos sea necesario sincronizar nuestros objetos con la informacion de la base de datos (Actualizar, Insert, Eliminar) el ADO.NET Entity Framework de manera transparente y gracias al mapa creado con con el Entity Data Model se encargara de generar, enviar y ejecutar las instrucciones de SQL necesarias para realizar las operaciones requeridas.

Con ADO.NET Entity Framework se introduce una variante del SQL denominada Entity SQL - o simplemente eSQL - que nos permite escribir - si es que realmente requerimos - SQL para gestionar nuestros objetos, en lugar de SQL para gestionar datos - tal y como se hace actualmente en nuestras aplicaciones -. Otra forma de gestion de nuestros objetos es utilizando LINQ ya sea para gestionar nuestros objetos o Datasets.

Aqui dejo unos links intersantes que explican a detalle ADO.NET vNext

Community Serve 2.1

Como mencione en días pasados instale el Community Server para correr este weblog, al principio todo parecía bien, pero luego comenzaron los problemas.

El problema, y que esta relacionado y no, es que en los servicios proveedores de hosting se asigna un application pool de IIS por cada cuenta, este application pool esta configurado de manera que si no existe ninguna solicitud de paginas en un determinado tiempo, el application pool finaliza su ejecución, esto se hace con la finalidad de recuperar y administrar mejor los recursos del servidor, el problema aquí esta que cuando esto sucede y después se solicita alguna pagina, el CS tarda mucho en responder, debido a que el tiempo de inicialiacion del CS es muy grande - según se explica en el sitio del CS, tarda en inicializar porque crea cache de paginas y controles en memoria a partir de los datos de la bases de datos -, dando la impresión de que el sitio no esta respondiendo. Por tal motivo hace un par de días actualice el CS a la versión 2.1, la cual incluye correcciones a bugs, algunas mejoras de perfomance y de ejecución sobre ambientes "Medium Trust" - el cual es el modo en que si no todos, la mayoría de proveedores de hosting compartido utilizan -, ademas de la adición de nuevos controles de contenido y algunos temas para CS.

Aparentemente la situación se ha mejorado, aunque el sitio sigue con algunos problemas, como excepciones generadas por el CS, algunas de ellas ya las reporte, espero que exista alguna solución Una funcionalidad que me ha sido de gran ayuda para investigar y estar al pendiente de los errores generados en CS, a sido la infraestructura de Health Monitoring incluida en ASP.NET 2.0, de la cual quisiera comentar en un post posterior.

Por cierto estoy usando para escribir este post, y enviarlo a mi servidor de CS, la nueva herramienta de Microsoft Windows Live Writer, porque Gabriel Flores comenta sobre ella.

Ubuntu 6.06

El pasado 1ro de Junio se libero la nueva versión del distro de Linux Ubuntu 6.06, así que este fin de semana pasado me di a la tarea de descargar el iso e instalarlo en mi pc AMD64.

La instalación fue de manera gráfica, rápida - mucha mas rápida que una instalación de Windows - y sencilla, lo mas "complicado" - si se puede llamar así - fue particionar mi disco, pero con la herramienta visual fue fácil

Alrededor de 15 a 20 mins después de iniciar la instalación, esta finalizo y entre a una sesión de Ubuntu, en donde encontré 3 cosas que me gustaron mucho de esta nueva versión:

  1. El proceso de inicio - boot - realmente fue muy rápido, solo tardo unos pocos segundos, cuando ya me estaba pidiendo mi usuario y password para iniciar sesión.
  2. La interfase gráfica esta muy bien trabajada, y sobre todo muy responsiva, realmentemente se siente rápida en comparación a versiones anteriores.
  3. Mi tarjeta inhalambrica de red la reconoció automáticamente, esto se debe a que ya existen drivers nativos para ella, por tal razón ya no tuve que usar el ndiswrapper y los drivers de Windows para hacerla funcionar.

Después de iniciar mi sesión fue necesario realizar algunos pasos adicionales para tener un sistema completo con todos los programas y herramientas que necesito:

  1. Instale una versión del kernel especifica para mi CPU AMD64, ya que la instalación solo instalo el kernel para AMD genérico, con la ayuda de synaptic, fue solo cuestión de seleccionar el paquete correcto y listo.
  2. Instale el programa Network Manager, el cual identifica y permite conectarse a redes inhalambricas muy a la manera en como se hace en Windows.
  3. Con la ayuda de la aplicación Add/Remove instale programas para desarrollo, bases de datos, editor gráficos, etc... todo lo que se necesita para tener un sistema funcional. Add/remove realmente hace esta tarea muy trivial, ya que solo se selecciona la aplicación a instalar y listo.
  4. El ultimo paso fue el instalar soporte para multimedia - MP3, DVD, etc. -, tarea que también es muy sencilla con la ayuda de al herramienta Automatix.


En general Ubuntu 6.06 - dentro de lo poco que lo utilice este fin de semana -, me parece que supero pero de forma muy importante a versiones anteriores, aunque bueno esto realmente se debe a que a partir de esta versión, Ubuntu cuenta con soporte corporativo, para quienes así lo requieran.

PrintDialog y AMD64

Realizando unos cambios a una aplicación de uno de mis clientes, la cual programe inicialmente en .NET 1.1, decidí probar que tan difícil seria convertirla a .NET 2.0 manteniendo el código original - o con el mínimo de cambios -, la duda venia básicamente de que la aplicación es Windows Forms y varios de los controles de .NET 1.1 cambiaron de manera importante en .NET 2.0; el asistente de actualización de finalizo de manera exitosa y todo parecía funcionar bien, hasta que llegue al momento de realizar una prueba de impresión, el dialogo donde se elijen las propiedades de la impresora no se mostraba ... revise el código y todo se veía bien, pero el dialogo seguía sin mostrarse y el valor DialogResult siempre regresaba falso.

Pues resulta que mi notebook tiene un procesador AMD64 y de acuerdo con la documentación el PrintDialog "puede" no funcionar en este tipo de procesadores a menos de que la propiedad UseEXDialog se coloque en verdadero, aun y cuando la documentación dice que la propiedad por omisión tiene como valor verdadero.

Después de este pequeño cambio la aplicación funciono como se esperaba.

Codeplex y RedGate Sql Prompt

Desde la semana pasada Microsof revelo el sitio Codeplex, el cual esta destinado a ser un ambiente para el desarrollo de aplicación de código fuente, ofreciendo funcionalidad para el manejo del proyecto y el código fuente del mismo.

Codeplex esta basado en el Team Foundation Server, y es gratuito. Al parecer Codeplex pretende reemplazar a Gotdotnet workspaces. Como parte del apoyo a Codeplex Microsoft libero de forma gratuita el cliente Team Explorer, el cual permite conectividad con el Team Foundation Server, y por tanto con Codeplex; de forma integral con el Visual Studio 2005.

Por otro lado Redgate libero de forma gratuita la herramienta Sql Prompt, la cual precisamente agrega la funcionalidad de intellisense a las herramientas del SQL de microsoft, llámese query analizer, SQL management studio y Visual Studio 2005.

Sql Prompt es gratuito de descargar e incluye toda la funcionalidad del producto, aunque esta promoción solo es valida hasta el 1ro de Septiembre, quien lo descargue antes de esta fecha lo va a poder seguir utilizando sin restricción alguna después del 1ro de Septiembre.

ASP.NET Development server

En la version 2005 del VSNET cuando se desarrolla bajo ASP.NET ya no se requiere de tener corriendo el servicio de IIS, ya que el VSNET utiliza una herramienta llamada ASP.NET development server para ejecutar el sitio Web en desarrollo.

Este Development server al ser ejecutado se le asigna un puerto aleatorio en donde nuestra aplicación va a responder al ser accedida por medio de un navegador, la dirección IP del server siempre va a apuntar al LocalHost, ya que el servidor solo atiende a llamados locales.

Es posible hacer uso del Development server fuera del ambiente de desarrollo del VSNET, por ejemplo para ejecutar alguna aplicacion ASP.NET de forma temporal o una pequeña prueba, sin necesidad de tener que configurar el IIS. Para ejecutarlo, solo hay que copiar la siguiente linea dentro de un nuevo archivo .bat o .cmd y colocar el archivo dentro de nuestro PATH - por ejemplo en el directorio de Windows -:

start /B %FrameworkDir%\%FrameworkVersion%\webdev.webserver.exe /port:%1 /path:%CD%  /vpath:/

La forma de llamarlo es mediante una consola de MS-DOS dentro del directorio que contiene los archivos .aspx, y como parametro le pasamos el número de un puerto TCP libre - en mi caso mi archivo bat se llama webdev.bat:

webdev 6897

Con esto se va a iniciar una sesión del Development server, a la cual nos podemos conectar con nuestro navegador de web.

Service Pack 1 SQL 2005

Apenas la semana pasada se libero el service pack 1 para SQL 2005, el cual trae una serie de mejoras relacionadas con la compatibilidad con SQL 2000, ademas de una serie de correcciones a bugs, algo curioso en este service pack, es que me da la impresión que la lista de mejoras es mayor que la lista de bugs corregidos.

Por cierto el problema que reporte anteriormente sobre que los objetos SQL-SMO generaban scripts incompatibles con SQL 2000 ya quedo corregido.

Innovatech 2006, actualizado

Hace unos días mencione sobre el evento Innovatech 2006 a llevarse a cabo en el ITT, pues desde esa fecha al día de hoy han surgido cambios sobre el evento, uno de ellos es que se mueve de principios de Mayo a finales del mismo mes, ademas de extenderse de solo conferencias a: conferencias, foros, visitas industriales y talleres, para pasar de ser un evento de 2 días a 4, del 29 de Mayo al 1ro de Junio.

Por cierto el sitio ya fue actualizado, y esta en proceso de contener la información que aquí les comento, ademas de que el registro ya esta abierto.


Probando Linux con Cosmopod

Cosmpod es un servicio gratuito que permite probar linux sin instalar nada en la pc, bueno casi nada, solo el cliente NX que mide 4Mb y que esta disponible desde la pagina de Cosmopod.

Por medio del cliente se realiza una conexión remota a el servidor de Cosmopod donde se inicia una sesión de nuestro propio escritorio Linux – solo soporta KDE -, el cual cuenta con todas la herramientas de escrito como OpenOffice, cliente de mensajería, correo electrónico, organizadores, juegos y acceso a Internet.

Ademas de permitir probar Linux sin crear dobles boots, usar live cds o instalar maquinas virtuales, el servicio ofrece espacio limitado de 1GB para guardar documentos o archivos, lo cual permite personalizar nuestra sesión y que los cambios queden almacenados cada vez que regresamos.

Yo me conecto con un DSL a 256 kbps y al respuesta del escritorio remoto es buena – no como en mi pc local, pero muy aceptable -.

IIS falla al iniciar - Skype

El día de hoy trate de iniciar el IIS desde el inetmgr, pero cada vez que trataba de iniciar el Website default, me mostraba el siguiente error y no se iniciaba “The process cannot access the file because it is being used by another process”, la ultima vez que había iniciado el IIS en mi pc fue apenas la semana pasada y en esa ocasión funciono sin problemas, trate de recordar que cambios o nuevo software había instalado recientemente, pero lo único que me vino a la mente fueron unas actualizaciones criticas para Windows, nada fuera de los normal.

En mi primer intento por solucionar el problema cambie el puerto de servicio Web del 80 al 8080 y funciono, el servicio pudo iniciar, lo cual se me hizo extraño, algo estaba ocupando el puerto 80, corrí el TaskManager para ver que procesos estaba ejecutando y ver si encontraba algo raro pero nada, así que abrí una consola de MS-DOS y ejecute el comando: netstat -oan para que me mostrara el numero de proceso que estaba conectado al puerto 80, después ejecute el comando: tasklist, donde ya con el PID del proceso conectado al puerto pude encontrar al culpable: Skype!

Al parecer resulta que si se esta detrás de un Firewall con el puerto de Skype bloqueado, este por omisión se conecta del puerto 80 y/o 443, situación que “chocaba” con el IIS y aunque el Skype lo tengo desde hace tiempo, creo que nunca lo había tenido activo mientras trabajaba con el IIS.

La solución fue sencilla, configurar mi Firewall para que le permitiera a Skype conectarse por algún otro puerto, deshabilitar la opción en Skype para usar el puerto 80; finalmente después de esto, pude levantar el servicio del IIS.

OracleXE

Desde finales del año pasado comente acerca de la inminente liberación de OracleXE (Oracle Express), la cual es una versión reducida de la base de datos Oracle, y que cuenta con licencia de producción, pues bueno, hace algunas semanas atrás salio la versión final de OracleXE, y hasta hace algunos días tuve la oportunidad de instalar la nueva versión y probarla.

OracleXE es una buena opción para esos proyecto pequeños que requieran de una base de datos segura y confiable y que ademas se pueda ejecutar en ambiente Windows o Linux, y aunque tiene algunas limitantes como el máximo de memoria que puede utilizar o el tamaño de los datafiles que se pueden crear, es muy simple el migrarse a una versión de paga de Oracle.


La instalación y configuración del OracleXE, es simplemente sencilla, ademas para la configuración y administración, Oracle provee de una aplicación web con la que se puede administrar cualquier área de la base de datos e inclusive es posible realizar consultas desde este administrador web desde código o utilizar la funcionalidad de "drag and drop" para crear consultas de forma visual.

Ademas de la liberarnos gratuita de OracleXE, Oracle libero el Oracle SQL Developer, el cual es una herramienta IDE gratuita para trabajar las bases de datos Oracle, una características interesantes que ofrece el SQL Developer es el soporte a autocompletar los scripts con la información de los objetos de la base de datos, ademas de la posibilidad de depurar el código de los procedimientos o paquetes paso por paso, teniendo visibilidad de las variables locales.


Definitivamente OracleXE y SQL Developer son una buena opcion para quien tengan el interés de probar la base de datos de Oracle, contrario a la idea general que se tiene de Oracle, la instalación y configuración de ambos productos es muy sencilla - solo el asistente de instalación -.


Por ultimo solo deseo hacer notar que OracleXE se instala con la configuración de utilizar alrededor de 190 megas de memoria RAM, pero con el asisten es sencillo disminuir los valores del SGA y PGA para que utilice una menor cantidad de memoria, ademas los servicios de la base de datos y el listener de la misma se activan para iniciar encender la pc, pero con solo ir al área de servicios en el control panel es posible cambiar esta configuración para que no se inicie automáticamente.

Mono Windows Forms y Monodevelop

El dia de hoy Miguel de Icaza publico un post interesante donde habla sobre el soporte de Mono para Windows Forms, y la experiencia de portar un aplicación Windows a Linux, en donde el menciona solo algunos cambios triviales requeridos para realizar la migración, algunos de ellos ya comente yo previamente el el siguiente articulo hace tiempo: Mono, lleva el .Net Framework a plataformas no-Windows

Windows Forms bajo Mono va tomando forma y si se tiene cuidado en observar que la aplicación no este completamente ligada a Windows – uso de servicios solo disponibles en Windows o librerías que solo se ejecutan bajo Windows -, va a ser muy sencillo el poder crear clientes .NET que se puedan ejecutar en diferentes plataformas.

Otra de las cosas que Miguel menciona en el post es el soporte de Monodevelop para el diseño gráfico integrado para la creación de formas GTK#, asi como el insipiente soporte para el desarrollo gráfico de aplicaciones ASP.NET.





Innovatech 2006

Ya prácticamente es oficial, este mayo 8 y 9 se llevara a cabo en el Instituto Tecnológico de Tijuana, por segunda vez, el evento Innovatech 2006, el cual es un evento de conferencia multidisciplinarias relacionadas al área de Tecnologías de Información.

La pagina correspondiente para el nuevo evento aun no esta lista, como tampoco el temario de las conferencias que se llevaran a cabo, pero con el trabajo que se esta realizando por parte de los organizadores y con el apoyo del Cluster IT Baja California, en los próximos días esperemos que este listo y definido.

El evento esta enfocado principalmente a los estudiantes de carreras relacionadas con  Tecnologías de Información, y aunque se lleva a cabo por segunda ocasión en el ITT y esta organizado por alumnos del mismo, es un evento abierto – y gratuito - para estudiantes de otras universidades y profesionistas.

Asi que hay que estar pendiente de los siguientes días cuando se abra el registro y este listo el temario de las conferencia, ya que promete muy agradables sorpresas para esta nueva edición.

GNOME 2.14

Oficialmente el día de mañana 15 de marzo se libera oficialmente la versión 2.14 del escritorio gráfico para Linux Gnome, esta versión cuenta principalmente con mejoras en cuanto al uso de memoria, área en la que se le dedico una buena parte del trabajo, como se puede apreciar en el gran numero de "blogs" relacionados a este tema en Planet Gnome, o bien en el weblog de Federico Mena Quintero - quien es junto con Miguel de Icaza uno de los fundadores del proyecto Gnome -. Adicionalmente las aplicaciones base recibieron una serie de mejoras para hacerlas en su mayoría mas funcionales; para conocer a detalle el listado de las mejoras mas destacables vale la pena revisar el documento "A look at GNOME 2.14".

Actualmente estoy utilizando la distribución Ubuntu Dapper Flight 5, la cual es una beta de la versión de Ubuntu a liberarse el 20 de abril, y que a partir de esta mañana - al menos fue cuando me di cuenta - ya cuenta con los paquetes de la versión 2.14 de Gnome, de igual forma en el sitio de Ubuntu hay una lista con las mejoras incluidas en esta versión Flight 5 de Ubuntu.

Ready to Rock

Hace un momento me acaba de llegar un paquete de Microsoft por DHL, al abrirlo me encontre con un mini estuche de una guitarra azul, el estuche tiene pegadas etiquetas del Visual Studio 2005, SQL Server 2005 y BizTalk Server 2006. Cool !

Creo que he sido infectado...

Blog.Worm

Mexicali vuelve a la edad de piedra, por 6 horas !

Leyendo el periodico Frontera me encuentro con la noticia de que Mexicali volvio a la edad de piedra por 6 horas :D

SQL Injection

Hace ya como 6 meses había yo mencionado un problema de SQL injection en un sitio publico del ITT - por cierto la ultima vez que lo revise en Diciembre, aun y cuando yo ya lo reporte, sigue con el mismo problema -, bueno pues hoy leyendo este weblog me encontré que mencionaban una vulnerabilidad en un nuevo sitio de la Secretaria de Seguridad Publica del DF - lanzado apenas el dia de ayer - donde se presenta un problema de SQL Injection también, el único problema es que alguien ya encontró como explotarlo y el sitio esta inaccesible.



Nota: Parece que ya repararon el sitio de la SSP, pero la vulnerabilidad aun esta presente.

Es realmente critico que empresas y dependencias de gobierno usen desarrolladores inexpertos para crear sitios web - quizás porque cobran mas barato? - con errores tan increíbles como la construcción de sentencias de SQL con strings, dejando COMPLETAMENTE vulnerable el sitio y la información alojada en el. Ambos sitios - el del ITT y el de la SSP - usan MS SQL Server y ASP (clásico y ASP.NET), pero en este caso definitivamente el problema no es una vulnerabilidad ni del sistema operativo, ni del servidor de la base de datos, ni de ASP, el error es un grave error de diseño y definitivamente la falta de experiencia.

Pero que es una inyección de SQL?, bueno es un forma de explotar el acceso no autorizado a servicios o a datos de un sitio Web, en donde se envían instrucciones de SQL en algunos de los campos de captura, por ejemplo de un formulario, para tratar de que estos se ejecuten en la base de datos del sitio Web y con ellos ganar el acceso buscado.

Por ejemplo, uno de los errores mas comunes que expone este tipo de vulnerabilidad es el crear sentencias de SQL como simple strings dentro del programa, en donde si hay que pasar valores de variables al SQL, estos se pasan concatenado el SQL con la variables que contienen dichos valores, ej:

string usuario = "minombre";
string clave = "miclave";

string sql = "SELECT nombre FROM usuarios WHERE usuario = '" + usuario + "' AND clave = '" + clave + "'";

Aquí el sql es construido dinámicamente para validar que el usuario existe con la clave correspondiente, si suponemos que las variables usuario y clave están ligadas a los textboxes donde el usuario captura esa información, alguien podría "inyectar" otras instrucciones de SQL para lograr acceso, ej:

string usuario = "minombre";
string clave = "miclave' OR 'X' = 'X";

string sql = "SELECT nombre FROM usuarios WHERE usuario = '" + usuario + "' AND clave = '" + clave + "'";

Con "' OR 'X' = 'X" que le agregue a la clave, me aseguro que si el nombre de usuario o la clave están incorrectas, el query si va regresar algún registro y muy posiblemente la lógica del programa me va a permitir tener el acceso que busco.

El problema mayor proviene que si se captura alguna secuencia de caracteres para generar un error en el SQL, los programadores descuidados van a mostrar el mensaje de error completo, el cual muchas veces provee el nombre del servidor, información sobre el motor de bases de datos usado, información sobre la tabla de usuarios, etc, dejando la puerta abierta para que alguien con un poco de malicia pueda causar grandes daños que pueden implicar la caída del servidor, el robo de datos o el borrado de información.

La forma de protegerse de este tipo de ataques realmente es muy sencilla, lo primero es evitar a toda costa usar instrucciones de SQL dinámicas concatenando valores, por ejemplo con ADO.NET se puede hacer algo como:

SqlCommand cmd = new SqlCommand();
cmd.Text = "SELECT nombre FROM usuarios WHERE usuario = @usuario AND clave = @clave";

SqlParameter param1 = cmd.Parameters.Add("@usuario");
param1.Value = "minombre";

SqlParameter param2 = cmd.Parameters.Add("@clave");
param2.Value = "miclave";

De esta forma sencilla ya se esta evitando la posible inyección de SQL en nuestro servidor, adicionalmente es recomendable que el usuario con el que la aplicación Web se conecta a la base de datos, tenga los mínimos privilegios sobre la base de datos (no usar el usuario sa), si es posible, es todavía mejor usar Stored Procedures ya que estas ofrecen un mayor nivel de seguridad al realizar la función exclusiva para la que están programadas y el usuario que se use para conectarse a la base de datos, no necesita de privilegios para insertar, actualizar o eliminar en las tablas utilizadas por la aplicación; finalmente si es un servidor de producción, poner un manejador de errores global en la aplicación para que muestre una pagina amigable informando al usuario de que existió un error en la aplicación, y que no muestre información critica del error, el cual puede ser enviado mediante una alerta al administrador o bien guardado en una bitácora.

Nuevo semestre en el ITT

El día de hoy comenzó un nuevo semestre en el ITT, este comienzo viene con la novedad de que al parecer finalmente se va a adoptar el lenguaje C# en lugar de C++ para todos los cursos relacionados con programación ( por lo menos en Ing en Sistemas e Informática ) y que están sujetos al ultimo cambio de retícula de hace 2 años, esto quiere decir que  todos los que tenemos de antigüedad de 2 años o menos vamos a comenzar a trabajar con C#, al parecer ahora si es oficial.

Debido a esto, ya surgió la demanda de quemar el CD creado para distribuir C# y SQL Express en las reuniones de la comunidad TJ.NET, por lo menos entre la gente de 3er semestre del ITT.

SQL Management Studio genera scripts incompatibles con SQL2000

El día de hoy visitando a un cliente, estaba listo para crear una base de datos que yo traía en mi laptop en el servidor de mi cliente; El servidor es un SQL Server 2000 y el que tiene instalado mi laptop es SQL Server 2005. Mi opción de copiar la estructura de la base de datos fue generando el script tanto para las tablas como los demás objetos de la misma, y aunque el SQL Management Studio tiene una opción para copiar una base de datos entre servidores, no me fue posible utilizarla, ya que solo funciona teniendo un SQL Server 2005 como destino, lo cual no era mi caso.

Al generar el script me asegure de utilizar la opción "Generar script compatibles con SQL Server 2000" estaba activada; al finalizar copie el script al servidor SQL 2000 y procedí a ejecutarlo, pero fallo rotundamente con una gran numero de errores, después de revisarlo una y otra vez me dí cuenta que el script era valido para SQL 2005 pero no SQL 2000, aun y cuando al generarlo active la opción para que fuera compatible.

Después de buscar como solucionar el problema, me encontré con este post donde al parecer Microsoft ya tiene conocimiento de este problema, pero aun no hay solución.

Así que si alguien mas esta desarrollando en SQL 2005 y desea después llevar ese desarrollo a SQL 2000, cuidado, porque los scripts para recrear la base de datos no van funcionar, hay que hacerle algunos cambios de forma manual para que función, los cambios están descritos en el post que mencione anteriormente.

Hay otra forma de copiar bases de datos, la cual consiste en hacer un "deattach" de la base de datos, copiar los datafiles al nuevo servidor y después realizar un "attach", pero esto funciona haciéndolo entre servidores de la misma versión o desde servidores de versiones anteriores a versiones nuevas - por ejemplo funciona de SQL 2000 a SQL 2005 -, no he probado el procedimiento de SQL 2005 a SQL 2000, peor tengo dudas de que sea posible.

Generics, ¿no Generics?

Generics es posiblemente la característica mas importante que se agrego al .NET 2.0 – desde mi punto de vista -, es por esta razón que el uso de Generics en un desarrollo en el que actualmente estoy trabajando, tiene un papel importante en el mismo, ya que me permite realizar algunas cosas de una forma muy simple, y sobre todo me permite una gran reducción en las lineas de código dentro del desarrollo, ayudándome a tener consistencia y sobre todo a reducir errores.

Debido a lo mencionado arriba, revisando cierta parte de mi código encontré que se repetía bajo cierto patrones, lo revise mas a fondo y me decidí a realizar una refactorización con la finalidad poder reutilizar de una forma mas efectiva esas partes de mi código.

Cuando finalice y quise realizar pruebas, me encontré con una limitante del VS.NET 2005, ya que parte del código que refactorice incluida UserControls (Controles de Usuario) y algunas Forms (formas que me sirven de base), la limitante consiste que el editor de interfase gráfica para Windows Forms no soporta Generics, y de acuerdo a este reporte de Microsoft  parece que no va a haber solución a corto plazo, debido a que actualmente no existe la infraestructura para necesaria en el diseñador de formas para dar soporte a Generics, y posiblemente va a ser necesario esperar hasta la siguiente versión del VS.NET.

También ya me había dado cuenta que no es posible crear un DataSource a partir de una colección de objetos, si la colección implementa Generics.

Desafortunadamente en mi proyecto es importante el poder utilizar el diseñador de forma, así que tuve que darle la vuelta a esta limitación, reimplemente el código de forma que pudiese ser reusable y extensible, y que además evitara el tener controles de usuario y formas que requieran Generics.

Aun y con esta limitante del VS.NET, Generics simplemente Rocks !

Clone, serialización y eventos

La semana pasada, trabajando en un proyecto, tuve la necesidad de poder obtener una copia de un objeto, al decir copia no me refiero a asignar mi objeto a otra variable, ya que esto no saca una copia, simplemente crea otra referencia a mi objeto, en cambio la copia crea otra nueva instancia del objeto en memoria, con los datos del objeto original, pero que cualquier cambio realizado a cualquiera de ellos no afecta al otro; esto en .NET se logra implementando la interfase ICloneable.

La forma de implementa el metodo Clone de la interfase ICloneable es mediante el uso de la serializacion:
        public object Clone()
        {
            MemoryStream buffer = new MemoryStream();
            BinaryFormatter formatter = new BinaryFormatter();
           
            formatter.Serialize(buffer, this);
            buffer.Position = 0;

            object temp = formatter.Deserialize(buffer);
            return temp;
        }

Donde el objeto regresado es una copia en memoria e independiente del original, aquí es donde comenzaron mis problemas con el método Clone, la serializacion y los eventos. Resulta que mi objeto que implementa la interfase ICloneable expone un evento, y cuando intente sacar una copiar mi objeto  la parte donde se realiza la deserializacion fallaba horriblemente con una excepción:
The serialize method works at it should be, but when I try to deserialize the buffer, it fails with the following exception:
System.Runtime.Serialization.SerializationException was unhandled
  Message="Cannot get the member 'Child_PropertyChanged'."
  Source="mscorlib"

El motivo del error en la deserializacion se debe a que el BinaryFormatter serializa y deserializa todas las variables declaradas a nivel de la clase (fields) que no estén marcadas con el atributo NonSerialized; el problema se genera si el objeto a serializar contiene la declaración de un delegado (EventHandler) o la declaración de un evento, y estos no están marcados como NonSerialized.

El motivo por el cual se tienen que marcar la declaración del evento y delegado (EventHandler) como NonSerializable para que el proceso de deserilizacion no falle se debe a que, cuando un objeto se subscribe para recibir la notificación de un evento de otro objeto, el objeto que genera el evento mantiene una lista de a quien debe de notificar, por lo tanto si el objeto que genera el evento es serializado, al momento de ser deserializado es posible que que los objetos que estaban subscritos ya no existan, ya que hay que recordar que la serializacion se puede utilizar para guardar un objeto a disco, a una base de datos; o bien transmitirlo remotamente con un WebService o Remoting; o como en mi caso serializarlo a memoria para después recrearlo.

Para la declaracion de un delegado (EventHandler), simplemente con colocar el atributo NonSerialized es suficiente para que BinaryFormatter no trate de serializarlo, en el caso de la declaración de un evento el atributo NonSerializable no puede colocarse directamente en la declaración del evento:
        [NonSerialized]
        public event PropertyChangedEventHandler PropertyChanged;
Ya que el atributo esta restringido para ser usado solo sobre campos (fields), la forma en como se tiene que colocar, es especificando que atributo es para el campo que declara el evento, no para el evento en si mismo:
        [field:NonSerialized]
        public event PropertyChangedEventHandler PropertyChanged;

Después de colocar el atributo, todo funciono a la perfección, pude utilizar el método Clone para crear una copia de mi objeto original.

Kuali

Desde hace ya unos meses me entere de una aplicación llamada Kuali, la cual ayuda a administrar proyectos de desarrollo de software basados en el modelo de calidad Moprosoft, modelo diseñado exclusivamente para llevar a cabo las mejores practicas en el desarrollo de software y que es apoyado por la industria mexicana de software y la secretaria de economía.

El modelo Moprosoft dicta una serie de procesos y requerimientos que se tienen que llevar a cabo con la finalidad de asegurar que el producto final, en este caso software, sea exitoso, pasando por procesos como el diseño, la administración, desarrollo, mantenimiento y otros mas.

Kuali, de acuerdo a lo ya mencionado anteriormente, ayuda a la administración de los procesos requeridos por el modelo Moprosoft, por ende ofrece las siguientes características:

  • Administración de documentos
  • Base de datos de conocimiento
  • Catálogos de proyectos, clientes, contactos
  • Administración de requerimientos, defectos, tareas y riesgos
  • Así como a una versión reducida del modelo Moprosoft

Lo interesante de la aplicación es que esta desarrollada en .NET 2.0 y usa el SQL 2005 como base de datos, además el proyecto esta auspiciado por la secretaria de economía, y según el sitio de Kuali el código fuente de la aplicación va a ser liberado cuando se llegue a la versión 1.0 de Kuali, actualmente esta en RC2, y bueno como punto adicional es una herramienta gratuita.

Kuali aun esta en desarrollo, pero parece que es usable, aunque puede darnos algunos problemas, por ejemplo en mi caso me encontré imposibilitado para instalarla debido aun error en el asistente de instalación, pero después de investigar un poco pude solucionar mi problema.

Por cierto Kuali se instala mediante la tecnología ClickOnce de Microsoft, asi que cada vez que hay una nueva versión se actualiza sola.

Aquí dejo algunas ligas a información de Kuali y Moprosoft




Por fin, se termino el semestre.

El viernes pasado, finalmente se termino el semestre en la escuela, el ultimo mes estuvo algo pesado, debido a la gran cantidad de exámenes y trabajos para terminar, pero finalmente llego a su fin, y sin ninguna complicación con las calificaciones, ahora a disfrutar de casi un mes de vacaciones para en la ultima semana de enero comenzar el nuevo semestre, el cual parece que va a ser un poco complicado, ya que llevo Matemáticas 3, Matemáticas 4 y Física 2, todo en el mismo curso.

Por cierto, mientras mas conozco C++, mas me gusta C#, y no es que este mal C++, pero hace las cosas un poco mas difíciles de lo normal, aunque a la mejor el comentario no es justo, ya que C# es muy nuevo y el enfoque que tiene en comparación con C++ es diferente.

Tengo varios pendientes sobre los cuales escribir, pero por la falta de tiempo los he ido dejando de lado, espero en los próximos días tener el tiempo para escribirlos y publicarlos.

Lanzamiento de Visual Studio 2005 y SQL Server 2005

Pues finalmente se llego la fecha y el día de hoy 7 de Noviembre oficialmente se liberaron el Visual Studio 2005 y el SQL 2005 con diversos eventos en varias ciudades de Estados unidos.

Una cosa interesante sobre las versiones express de Visual Studio, es que originalmente se había indicado que iban a tener un precio de alrededor de los 50 USD, pero hoy se anuncia que se podrán descargar de forma gratuita durante un año, es decir hasta Noviembre 6 del 2006, así que si tienen una conexión de Internet lenta, no pierdan tiempo y empiecen a descargarlas ya. La versión del SQL 2005 express no tiene esta limitante, ya que va a continuar siendo gratuita, aun después de transcurrido el año.

Aquí en la ciudad de Tijuana, el evento de lanzamiento esta programado para los días 22 y 23 de Noviembre, como parte de un esfuerzo de Microsoft, la comunidad TJ.NET y el Instituto Tecnológico de Tijuana.

Durante el día 22 se van a llevar a cabo una serie de conferencia enfocadas a los estudiantes y desarrolladores profesionales; el día 23 se destinara a la realización de talleres prácticos sobre las nuevas características de esta tecnología Todo el evento sera gratuito.

El evento se llevara a cabo en el teatro Calafornix del Instituto Tecnológico de Tijuana, unidad Tomas Aquino, para mas información sobre el mismo, consultar la información del evento en la comunidad TJ.NET.

MSSQL 2005 y Oracle Express

He estado usando el MSSQL 2005 beta2 – próxima a liberarse - de forma regular desde hace ya algunos meses y la verdad me han gustado bastante las mejoras que Microsoft ha agregado a la nueva versión, de entre las mejoras, por lo menos de las que a mi me llaman la atención, puedo listar las siguientes:

  • Unificación del entreprise manager y sql query analyzer - inclusive tiene una mejor apariencia, el único punto malo es que no cuenta con Intellisense el editor de sql -
  • La introducción del CLR en la base de datos, me parece muy buena idea el poder escribir ciertos procedimientos, por ejemplo en C#, aunque esta funcionalidad puede también llevar a muchos problemas si no se usa apropiadamente, es decir primero tratar de solucionar el problema con T-SQL, si finalmente no es posible, entonces implementarlo con algún lenguaje de .NET
  • El nuevo manejo de errores en T-SQL con bloques TRY-CATCH
  • Las nuevas funciones de T-SQL para realizar "ranking" - posiblemente esto es de lo que mas extrañaba de Oracle -
  • Una característica que me gusta mucho es Common Table Expressions, muy útiles para simplificar y entender queries muy grandes
  • Otra nueva característica es la introducción del PIVOT y UNPIVOT para rotar datos, es decir convertir lineas a columnas y viceversa - Igual que en Excel -
  • Y finalmente creo que la mas importante de todas es el manejo de versiones de las lineas y el uso de candados a nivel del linea - en vez de nivel de tabla -, es decir al poner un candado ahora, solo se hace sobre las lineas que estamos afectando, lo cual no bloquea que otro proceso pueda leer las mismas lineas, y mas aun, el proceso de lectura toma una "versión" de la linea, para que en caso de que esta se modifique durante el proceso de lectura, el proceso de lectura nos de datos consistentes dándonos las lineas tal y como estaban al iniciar la lectura.

Quizás valga la pena realizar un post mas detallado con algunos ejemplos de esta pequeña compilación de los cambios en SQL2005 - que a mi vista y opinión personal, son los mas importantes para mi -.

Por otro lado, pero en el mismo tema de las bases de datos, tengo que admitir que mi base de datos preferida es Oracle, mi preferencia la puedo resumir por unas pocas razones:

  • Su escalabilidad y estabilidad increíble, tanto en Windows, Linux y Unix, ambientes donde la he manejado
  • Su falsa complejidad, es decir si es un tanto compleja, pero la complejidad se elimina con el entendimiento de como funciona la base de datos - el motor, algoritmos, estructuras de memoria, etc -, entendimiento que muchas veces es omitido por quienes manejan solo MSSQL, ya que este oculta muchas de las cuestiones de configuración de la base de datos, algunas personas pueden decir que que por ese motivo Oracle es muy compleja, pero yo creo que el entendimiento es un conocimiento útil si se maneja MSSQl, Oracle o cualquier otra base de datos
  • Por ultimo mi primer base de datos relacional fue MSSQL 6.5 y con MSSQL las bases de datos que he manejado han sido de apenas un par de Gigabytes con un par de decenas de usuarios concurrentes, con Oracle en cambio he manejado bases de datos de mas de 350 Gb con varios cientos de usuarios, y la respuesta y control de Oracle ha sido excelente

Pues bien ya sin mas preámbulo, Oracle la semana pasada lanzo la versión beta de su Oracle Express Database (OracleXE), basada en la versión Oracle 10gR2, esta es una base de datos gratuita y enfocada a pequeños grupos de usuarios, el instalador es muy simple practico - solo 2 preguntas donde instalar la base de datos y el password de administración -, además incluye un ambiente de desarrollo llamado HTMLDB para aplicaciones web sin necesidad de escribir código

Las licencias de Oracle siempre han sido amigables con los desarrolladores, debido a que se podía descargar de Oracle la base de datos sin ninguna restricción de tiempo y funcionalidad, y se podía usar sin cargo alguno para propósitos de desarrollo y pruebas, solo exigían el pago de licencia si la base de datos se usa en producción

Lo que ofrece OracleXE aparte de ser gratuita es que el instalador mide apenas 130MB a diferencia de los 3 CDs que se tienen que descargar de las versiones no libres de Oracle, como mencione el instalar esta "super" simplificado, y viene configurada para utilizar poca memoria, situación que mas escuchaba como queja de quienes querían probar Oracle, ya que instalación por omisión de la versión no libre, si mal no recuerdo viene preconfigurada para utilizar 250 Mb de RAM - aunque quien conoce de Oracle sabe que es muy sencillo disminuir o aumentar este valor -.

Dentro de las limitantes que OracleXE ofrece es que los datafiles no pueden ser mayores de 4GB y solo permite una instancia por máquina, pero pues siendo una base de datos comercial ofrecida de forma gratuita no esta mal. Un problema que si observe es que una vez instalada, los datafiles de System, Temp y SysAux ocupan prácticamente 1GB de espacio en disco, entiendo que son los mismos datafiles de la base de datos comercial que contienen la funcionalidad de la base de datos - paquetes, librerías, espacio temporal, rollbacks, etc - y que son necesarios, y por lo que vi de momento en Oracle no existe ninguna intención de tratar de reducir el tamaño de ellos, lo que a la mejor puede ser un punto en contra para OracleXE.

Si se desea conocer más sobre OracleXE, en ésta página hay información y tutoriales.

Ubuntu Breezy Liberado

Ok, quizás este post llegue un poco tarde, pero el día de hoy fue liberada la versión Ubuntu Breezy 5.10, después de 6 meses de trabajo, dentro de las mejoras que la nueva versión de Ubuntu provee puedo citar:
- Incluye la versión 2.12.1 del escritorio Gnome
- OpenOffice Beta 2
- Una nueva herramienta para instalar aplicaciones de un forma sencilla
- Pantalla gráfica de inicio, con barra de progreso
- Kernel 2.6.12.6 con drivers actualizados
- El sistema de ventanas XOrg 6.8.2
- Mejoras para el soporte de notebooks - teclas especiales, etc -
- Compilador GCC 4.0

He estado utilizando Breezy desde la primera versión de prueba liberada, así que la actualización del día de hoy solo me requirió un par de paquetes - la mayoría de ellos los actualice la semana pasada -.

Una cosa interesante es que Ubuntu soporta de buena forma a Mono, por lo tanto instalarlo e instalar las aplicaciones que requieren Mono es muy sencillo.

La descarga básica de Ubuntu solo requiere de un CD de instalación, esta opción es buena para quien desee instalar Ubuntu en un boot dual - por ejemplo junto con Windows -, el instalador trae consigo una herramienta para reorganizar el tamaño de las particiones, por ejemplo hacer mas pequeña la partición NTFS para poder liberar espacio y crear una partición para Ubuntu.

Otra forma de probar Ubuntu es por medio del LiveCD, de forma que solo realizando el boot de la computadora con este disco es posible ejecutar Ubuntu para probarlo sin instalar nada en nuestra PC.

Como ultima opción esta la posibilidad de instalar Ubuntu en un VirtualPC, la instalación no tiene ningún problema, solo es necesario realizar un pequeño ajuste, ya que Ubuntu por omisión instala el soporte gráfico para 24bits y VirtualPC solo soporta 16Bits, los pasos de como cambiar la configuración después de la instalación están aquí.

Programador DCE 2005 y asesorias de C++

El día de hoy vi el post de Gabriel Flores sobre el programa DCE 2005, y ... no lo pude evitar me dí una vuelta por sitio y tome las pruebas, asi que ahora soy parte de las estadísticas... ;)



Los exámenes son relativamente sencillos, pero hubo un par de cosas que me incomodaron:

  • En el examen cero (0), porque mezclar preguntas especificas de C# y VB.NET?
  • Las preguntas, si es que fueron traducciones, a mi punto de vista son muy malas; a la mejor aquí el que esta mal soy yo, ya que estoy acostumbrado a que toda la información referente a desarrollo la recibo en ingles – no compro libros en español -; y la verdad le batallo cuando veo información este tipo en español
  • En el examen de Desarrollo para Web, de Web solo tiene tiene el titulo, ya que una buena cantidad de preguntas son de tipo general – Web o no Web -, quizás aquí esperaba preguntas que fueran mas acordes al material de referencia que hay para este examen.

Por otro desde la semana pasada estoy dando asesorías – formales y reconocidas por el ITT – sobre C++ y la programación orientada a objetos, se me hace muy buena onda que la academia de Ingeniería en Sistemas del ITT se haya acercado a mi para pedirme el apoyo. Aunque la asesoría es solo una hora a la semana, espero que sea de beneficio para la gente que acude.

Microsoft LINQ

El día de hoy comenzó el evento Microsoft PDC 2005 en la ciudad de Los Angeles, US; dentro de las cosas que se anunciaron el día de hoy, hay una que me llamo mucho la atención y al parecer Anders Hejlsberg – el creador de Delphi y C# - esta trabajando en este proyecto, el cual se llama LINQ, acrónimo para Language Integrated Query.

LINQ es una extensión para C# y VB.NET que ofrece soporte para sintaxis SQL, manejo de sets de datos y transformación La ventaja principal es que la sintaxis LINQ es validada al momento de compilar el programa, no como sucede actualmente que si agregamos código de SQL en nuestros programas, esta se valida al momento de ejecución, lo que puede llevar a que un programa “truene” al estarlo ejecutando; otra de la ventajas es que la sintaxis tiene soporte para Intellisense.

LINQ no solo sirve para acceder bases de datos, por el demo y código ejemplo que esta disponible, se puede ver que se puede usar la sintaxis para acceder a arreglos, colecciones de objetos, File System, Active Directory, etc.

Para el acceso a bases de datos LINQ proporciona unos atributos que son usados para “mapear” los datos a nuestros objetos, muy a la ObjectSpaces (q.e.p.d.).

Se ve interesante LINQ ya que proporciona una misma interfase para acceso a datos relacionales y no; para el caso de transformación de datos, y si estos provienen de una base de datos, prefiero hacer la transformación en la base de datos, que es donde reside mi información, en lugar de pasar grandes bloques de datos por la red, para que sean procesados por un cliente.

Esperemos que LINQ sobreviva este PDC y que no quede como otras tecnologías anunciadas en los PDCs (alguien recuerda a ObjectSpaces q.e.p.d?)

Aquí dejo algunos recursos sobre LINQ:

Software Libre

El día de ayer 10 de Septiembre me dí una vuelta al CECUT para asistir al evento FLOSS/LinuxBaja organizado por LinuxBaja y LinuxTj, aunque no pude quedarme todo el evento, pues aquí les comento lo bueno, lo malo y lo feo.


Por el lado de lo bueno hay que resaltar el esfuerzo realizado por las 2 comunidades para llevar a cabo este evento, el cual creo que supero por mucho las expectativas de asistencia de los mismos organizadores. El CECUT les facilito la sala de lectura que se encuentra junto al museo, la cual simplemente no fue suficiente para la gran asistencia de gente interesada por el Software Libre. Y como dicen que una imagen vale mas que mil palabras aquí hay algunas fotos del evento donde se puede apreciar la gran asistencia, y sobre todo interesada y con preguntas interesantes.

Lo malo, en este caso pues se cumplió la famosa ley de Murphy que dice “Si algo puede ir mal, ira...”, en algunas de la platicas en las que estuve, existieron algunos problemas con el software a demostrar, con el acceso a Internet y con las memory sticks que no tenían la presentación necesaria para la platica, en fin, esto es algo por lo que mas de uno hemos pasado.


Lo feo, ok esto es mas bien una queja, y no es contra los organizadores del evento, si no con algunos de los asistentes. Primero había una persona que se creía un “sabelotodo”, que se la pasaba interrumpiendo a los expositores, de cualquier tema que se hablaba, el tenia siempre algo que “aportar”, la verdad es que llego a ser molesto para algunos de los asistentes y me imagino también para los expositores.

Por otro lado un charlatán que estaba sentado detrás de mi que le estaba contando puras incoherencias y mentiras sobre Linux a una persona que había asistido para aprender algo de Linux, en fin.

Inicio de semestre

Este lunes 22 de agosto inicia un nuevo semestre en el Tec, y al parecer va a estar menos excitante que el anterior – y eso que el anterior no fue nada excitante -.

En el semestre anterior lleve 2 materias que me interesaban – aparte de las de cajón -, de las cuales solo Matemáticas para PC lleno las expectativas, en buena parte por lo interesante de los temas, y la excelente forma de dar la clase del Dr. Lomelí; la otra materia Fundamentos de programación, definitivamente se quedo corta y aunque el temario se veía interesante, realmente la materia en si no fue nada interesante. 

Esta ultima materia se decía que iba a darse en C#, pero por problemas de actualización de los maestros finalmente se termino dando en C++, así que aquí les muestro lo que aprendí en el semestre:


#include <iostream.h>
#include <conio.h>
main()
{
 cout<<"Hola mundo ;)";
 getch();
}

Pues bueno en este semestre solo veo una materia interesante Programación Orientada a Objetos (POO), de la cual sinceramente no espero mucho, estoy casi seguro que va a ser igual que Fundamentos de Programación, pero bueno haber como se desarrollan las cosas.


Mientras escribía el texto anterior me vino a la mente como es que aprendí a programar y que lenguajes fueron los primeros, así que aquí les va la pequeña historia:
Todo comenzó cuando tenia 16 años en un proyecto para la prepa, mi perfil era completamente de electrónica, pero necesitábamos hacer un programa que controlara unos motores y unos sensores ópticos mediante un puerto de la pc, ahí aprendí lo básico de gwbasic, luego durante el verano un amigo me presto su pc y aprendí Pascal ( que por cierto con un programa de Pascal y un circuito electrónico en 1992 gane el premio nacional de ciencia y tecnología “Dr. Marcos Moshinsky”, en la categoría de electricidad y magnetismo ), después durante un semestre de la prepa aprendí ensamblador, ya que lo requeríamos para programar controladores; durante mi vida profesional he aprendido además:



  • C, C++
  • TAS
  • Clarion DOS
  • Quickbasic
  • Visual Basic
  • ASP y ASP.NET
  • Java
  • Cobol y JCL para mainframe
  • Oracle Forms
  • C#
  • Diversos dialectos de SQL

Y pues infinidad de tecnologías relacionadas con todos ellos.

QueryCommander

El dia de ayer di por casualidad con una herramienta llamada QueryCommander, la cual es un reemplazo del Query Analizer incluido con el MSSQL Server.
Dentro de las cosas interesantes del QueryCommander estan:
  1. El soporte de "Tabs" - cejas - donde podemos tener varios fragmentos de codigo abiertos al mismo tiempo.
  2. Palabras claves son mostradas con diferente color - syntax color -.
  3. Soporte de Intellisense para el esquema de la base de datos con la que estemos trabajando.
  4. Si ejecutamos un stored procedure o varios queries en batch, el resultado es mostrado en un grid separado, es decir un tab para cada resultado.
  5. Es posible modificar el resultado directamente en el grid y que el cambio se refleje en la base de datos.
  6. Puede guardar el resultado a un archivo de textp, Xml o Excel.
  7. Puede importar datos a una tabla desde un archivo Xml.
  8. Nos permite explorar el esquema de la base de datos, generar automaticamente scripts para modificar y/o ejecutar alguna accion en los objetos de la base de datos.
  9. Puede autogenerar codigo insertar/actualizar una tabla a partir de los datos de otra, es decir si tenemos una table con ciertos registros base, y queremos poner esos mismo registros en otra tabla, el QueryCommander nos puede generar un script que inserte cada unos de los registros.
  10. Nos permite ver el plan de ejecucion de un query, muy util para detectar problemas de performace.


El QueryCommander es gratuito para cualquier uso (Comercial o no), y el codigo fuente se encuentra bajo GNU General Public License (GPL).

Windows Forms o ASP.NET?

No me cabe la menor duda que desde la salida del .NET Framework 1.0 hace ya algunos anos, la tecnología que mas ha llamado la atención es ASP.NET. Esta aseveración es muy fácil de medir, simplemente con realizar una búsqueda, por ejemplo en amazon.com por los términos ASP.NET y Windows Forms para constatar la gran diferencia de libros entre un tema y otro; o bien revisar los sitios de recurso y/o revistas de internet para darse una idea de lo desbalanceado que esta el contenido.

En la próxima versión 2.0 de .NET Framework esta situación no ha cambiado mucho, ASP.NET es quien se sigue llevando la mayor atención debido a nuevas características como Master Pages, Web Parts, Autorization, Profiles, Membership, databinding mejorado, etc.

Las aplicaciones Web son sumamente populares debido a la popularidad del Internet, y que usualmente es sinónimo que si no se esta en Internet, no se esta en lo ultimo en la tecnología.
Este tipo de aplicaciones presentan una serie de beneficios sobre las aplicaciones tradicionales (Windows Forms):
1.- Solo es necesario instalarlas una sola vez en el servidor.
2.- Cambios a la aplicación solo tienen que instalarse una sola vez y se hacen efectivo para todos los usuarios, evitando tener usuarios que corren versión no actualizadas.
3.- Es posible acceder la aplicación desde cualquier lugar sin necesidad de instalar nada.
4.- Son ideales cuando no se tiene control sobre las redes o los recursos de las PC clientes de los usuarios.

Así como tienen beneficios, existen también algunas desventajas:
1.- Las aplicaciones no son tan interactivas con el usuario, aunque mediante el uso de la tecnología de moda Ajax, google mail y google maps, han demostrado que se pueden hacer aplicaciones mas ricas y reactivas.
2.- No es posible utilizar los recursos de la PC del usuario, por ejemplo para realizar algún calculo que consuma tiempo de CPU, o guardar de forma local información de estado de la aplicación - mas allá de las limitaciones de una cookie -
3.- No es posible hacer uso de este tipo de aplicaciones de forma desconectada.
4.- El manejo de reportes es muy malo, si estos se muestran como una pagina html, generalmente su impresión causa algún de tipo de problema - no sale correctamente en la pagina, sale cortado, sin pie de pagina, encabezados, etc -; o bien si se muestra por ejemplo con un archivo PDF, si pierde la sensación de integración, ya que se tiene que abrir otro programa para poder ver y/o imprimir el reporte.

Pero que ofrece una aplicación de Windows Forms?
Dentro de las características importantes que ofrece una aplicación de Windows Forms encuentro las siguientes:
1.- Existe una integración con el Sistema Operativo, tanto en el uso de recursos como en la parte visual.
2.- Como se menciono en el punto 1, es posible hacer uso de los recursos de CPU y almacenamiento de la PC donde se ejecuta la aplicación, por ejemplo tareas de CPU intensivas, guardar en cache datos comúnmente utilizados por la aplicación.
3.- Ofrece un mejor manejo y recuperación de errores que una aplicación de ASP.NET.
4.- Es posible ejecutar ciertas tareas en otro hilo de ejecución (multi-thread), ofreciéndole al usuario la posibilidad de realizar varias actividades a la vez.
5.- La interfase grafica es mas rica y funcional para el usuario quien cuenta con una serie de elementos que le ayudan a trabajar mejor.
6.- Es posible hacer la aplicación trabaje de forma desconectada y que realice una sincronización de datos al momento de conectarse nuevamente a la red.
7.- Mediante Web services es factible que la aplicación instalada, por ejemplo en una notebook pueda funcionar, sin importar desde que red se conecte.

Aunque también existen algunas desventajas:
1.- Se requiere generalmente que la PC que va a ejecutar la aplicación cuente con ciertos requisitos de hardware mínimos.
2.- Hay que instalar un mínimo de componentes en cada PC para que pueda funcionar la aplicación - como mínimo se requiere el .NET Framework -, aunque con características como ClickOnce es posible publicar la aplicación en nuestro servidor de intranet y con un par de clicks el usuario mismo pueda auto instalar la aplicación.
3.- Cambios a la aplicación generalmente requiere de actualizar todos los clientes, pero es posible hacer que la aplicación misma busque por actualizaciones, notifique al usuario y se auto-actualice.

Ademas de lo mencionado anteriormente, desde mi punto de vista, es mas sencillo hacer una aplicación Windows Forms y controlar el flujo de manera correcta, que en una aplicación ASP.NET, donde ademas se requiere de verificar si se ve bien al aplicación en diferentes navegadores.

Para finalizar quiero dejar en claro que ambas tecnologías ofrecen una serie de ventajas y desventajas, pero que al final cuando a uno le toca evaluar que utilizar para un proyecto, se tiene que elegir la herramienta correcta para el mismo. Mi recomendación es que si no se tiene control sobre el ambiente donde se va a ejecutar la aplicación o se requiere que usuarios fuera de la organización la puedan utilizar, se opte por una aplicación ASP.NET, en caso contrario contemplar realizar la aplicación con Windows Forms.

O ustedes que opinan?

Cajeros automáticos y lo frustrante que pueden llegar a ser.

Los cajeros automáticos se han convertido en unas maquinas muy populares gracias principalmente a los bancos. Debido a que es posible encontrarnos por lo menos uno prácticamente en cualquier lugar donde nos encontremos. Este tipo de cajeros principalmente su función es poder consultar nuestro saldo de la cuenta de banco, retirar dinero y algunas otras operaciones mas; pero existe otro tipo de cajeros que su función es ayudarnos a realizar el pago de servicios, como puede ser el telefono y al luz eléctrica.

A mi punto de vista este ultimo es el tipo de cajeros que pueden llegar a ser realmente frustrantes, por dos simples razones:
La primera es porque cuentan con un lector de códigos de barras - de esos que generan un rejilla láser - para que podamos pasar nuestro recibo e identifique sobre que cuenta queremos realizar la transacción, el problema es que hay que asegurarse que el código de barras quede exactamente frente al lector, que no este doblado, que se encuentre a la distancia correcta para poder ser leído; lo cual se convierte en un verdadero problema ya que termina uno moviendo sin sentido el recibo para todos lados para ver si corremos la suerte que lo lea.

En el caso de la C.F.E., mejor opto por tener una persona para que le ayude a los usuarios con esta operación, y en el caso de los cajeros de Telnor, pues mejor llegar sin recibo y capturar el numero telefónico directamente en la pantalla.

La solución a este problema, realmente no me parece muy compleja, creo que con colocar un cristal o acrílico sobre la superficie de la caja, mover el lector hacia adentro, a una distancia que permita solo recargar el recibo sobre el cristal para que pueda ser leído, se puede corregir en un alto porcentaje este problema.

El segundo problema y el mas frustrante, es el lector de billetes; el cual parece estar programado para hacerle las cosas difíciles al usuario, molestarlo y hasta ponerlo nervioso.

Una buena cantidad de los problemas provienen de que el usuario coloca el billete en la posición incorrecta, y en ocasiones intenta mas de una vez hasta que se da cuenta de su error.

Cuando un billete es rechazado, el lector toma cierto tiempo - segundos - para volver a aceptar un billete, el usuario simplemente lo toma y lo trata de forzar para insertarlo, cuando esto sucede el lector no toma el billete hasta que es retirado completamente y se vuelve a colocar.

El ultimo de los problema es cuando por fin el billete es tomado por el lector, pero este lo rechaza una y otra vez hasta que finalmente lo acepta, obviamente esto produce frustración y un tanto de nerviosismo cuando vemos por nuestro hombro y nos percatamos que ya no hay 2 personas esperando si no que la fila se hizo larga, y todos nos ven con cara de "haber a que hora terminas !".

Para el caso del billete en la posición correcta, pues no hay de otra, hay que revisar las instrucciones.
En el caso del billete rechazado, una solución puede ser agregar un indicador luminoso (LED) de color verde y rojo para indicar cuando el lector puede tomar un billete y cuando hay que esperar.
Para el ultimo caso, pues no hay solución simple, los lectores identifican la denominación del billete gracias a la tinta electromagnética que produce frecuencias diferentes para cada denominación, y en algunos casos se utilizan técnicas fluorescentes también para la identificación. Realmente aquí no queda de otra que tener paciencia e insistir con el billete y si se disponen en el momento de otro billete probar con ese.

Mientras tanto cuando haga uso de cajeros este tipo, no lleve el dinero exacto llévese algún billete extra, no vaya pensando que va a tardar solo un par de minutos, y tómelo con calma.