lunes, noviembre 24, 2008

Instalando Ruby on rails a la Mac en Windows

Por cuestiones de un proyecto en el que estoy trabajando, estamos utilizando Ruby on Rails como la herramienta para el desarrollo web. En el equipo de desarrollo hay gente que utiliza OSX y Windows como sistemas operativos.

Primeramente se instalo y se creo el esqueleto del proyecto en OSX, usando como editor del código fuente el excelente editor TextMate. posteriormente cuando los desarrolladores de Windows les toco hacer su parte, la pregunta que surgió, fue iban ellos a editar el código fuente de RoR.

Siendo que los desarrolladores de Windows estaban mas acostumbrados a IDEs, se busco una IDE con la que pudieran trabajar. De entre las opciones se eligió Aptana y su plugin RadRails, el cual se veía muy bien como entorno de desarrollo, por el gran soporte ofrecido para RoR.

Hasta aquí todo parecía que iba por buen camino, pero los desarrolladores se comenzaron a quejar de que Aptana tardaba mucho tiempo para iniciar, que después de estarse ejecutando por tiempos prolongados, la maquina empezaba a "alentarse".

Por otra parte cuando discutíamos cuestiones del código y yo usaba TextMate, solo con una serie de comandos (atajos de teclas) de teclado y ellos para realizar la misma acción en Aptana tenían que hacer uso del mouse y escribir instrucciones para obtener el mismo resultado, surgió la inquietud de tener una herramienta como TextMate en Windows.

Buscando encontramos e-TextEditor, el cual es un editor de código fuente modelado a partir de TextMate, es tan cercano su parecido que inclusive "Bundles" (Extensibilidad mediante comandos y fragmentos de código) de TextMate en su mayoría son compatibles con e-TextEditor. Esto es precisamente lo que buscábamos; ya que nos permitiría a todos trabajar de manera muy similar aunque algunos estemos en OSX y otros en Windows.

El único detalle con e-TextEditor, es que necesita soporte en Linux en Windows para poder trabajar de manera optima con RoR y hacer uso de los bundles de TextMate disponibles para RoR, pero con las instrucciones que voy a mostrar a continuación, podrán tener un ambiente de desarrollo para RoR muy parecido a trabajar con RoR en OSX.

Nota: Antes de proceder con las instrucciones aquí mencionadas si se tiene instalado Ruby, RubyGems y/o Rails a partir de un instalador para Windows, es necesario des-instalarlo y ademas eliminar la carpeta C:\ruby

Instalando ambiente Linux en Windows
Primeramente hay que instalar Cygwin, el cual es un ambiente parecido a Linux para Windows, de hecho provee una capa de emulación que permite a herramientas de Linux trabajar en Windows.

Para instalarlo, hay que dirigirnos al sitio http://cygwin.com/ y descargar el instalador, una vez descargado, lo ejecutamos y el asistente de instalación nos pedirá que le indiquemos donde se va instalar Cygwin, de que repositorio se va a descargar Cygwin y finalmente nos pedirá que paquetes deseamos instalar, las opciones por omisión están bien, en los paquetes a instalar ahí es donde nos detendremos un momento.

De la opción de paquetes hay que instalar:
  • Ruby
  • Make
  • sqlite3
  • libsqlite*
  • gcc
  • gcc+
  • gcc4
  • gcc4++
  • git
  • automake
  • autogen

Todos esos paquetes están distribuidos en las categorías: Interpreters, Databases y Devel. Algunos de ellos al seleccionarlos, seleccionaran automáticamente otros paquetes dependientes; la instalación va a tomar unos minutos ya que los paquetes se descargan primero de Internet.

Cygwin
Uploaded with plasq's Skitch!


Si todo salio bien tendremos un icono como el que se muestra en el escritorio, ademas de que si, lo ejecutamos, nos va a abrir una ventana de MS-DOS, solo que en interprete en lugar de ser MS-DOS de Windows, va a ser el Bash de Linux.

Bash
Uploaded with plasq's Skitch!


El programa de consola de Windows tiene muchas carencias, por tal motivo vamos a reemplazarlo por otro programa, que soporte múltiples ventanas, múltiples interpretes, background transparentes entre otras cosas, este programa se llama Console, hay que descargar la versión mas reciente disponible (Console 2.00 Beta, build 141).

Console
Uploaded with plasq's Skitch!


Una ves descargado, lo descomprimimos en el directorio de nuestra preferencia y ejecutamos el programa Console.exe, de preferencia creamos un acceso directo a nuestro escritorio o quicklaunch bar. Para configurar que Cygwin se ejecute dentro de Console, nos dirigimos al menú Edit > Settings y en la ventana de configuración nos dirigimos a la opción de Tabs, hacemos "click" en el botón de "Add" y en el "Textbox" llamado "Shell" introducimos la siguiente linea, siempre y cuando Cygwin se haya instalado en c:\cygwin:

C:\cygwin\bin\bash --login -i

Le ponemos un titulo para ese interprete y con el botón de "Move up" movemos nuestro nuevo "Tab" al principio, para que así cada vez que ejecutemos Console, automáticamente se abra con el interprete de "Bash". Un paso recomendable en la configuración de Console, es cambiar la tipografía, esto lo podemos hacer en "Apparence" en mi caso elegí Consolas de 14pt.

Console-config
Uploaded with plasq's Skitch!


Instalando el ambiente Ruby on Rails
Hay que descargar RubyGems, de preferencia la versión 1.3.1 del archivo en formato tgz, una vez descargado, lo copiamos al directorio c:\cygwin\tmp, y desde Console ejecutando en interprete "Bash" los descomprimimos e instalamos con los siguientes comandos:

cd /tmp
tar xzvf rubygems-1.3.1.tgz
cd rubygems-1.3.1
ruby setup.rb


Despues de un momento gems debio de quedar instalado, ahora podemos proceder a instalar Rails y eso lo hacemos de la siguiente forma, desde Console:

gem install rails --include-dependencies

Ahora podemos continuar instalando otros gems que utilicemos en el desarrollo en Rails, por ejemplo podemos instalar soporte para SQLite3, de la siguiente forma:

gem install sqlite3-ruby

De igual forma podemos instalara cucumber, rspec o tras mas:

gem install rspec rspec-rails cucumber webrat
gem install term-ansicolor treetop diff-lcs hpricot
gem install thoughtbot-shoulda --source=http://gems.github.com
gem install thoughtbot-factory_girl --source=http://gems.github.com


Para instalar soporte para MySQL, es necesario compilar MySQL con soporte para Cygwin y eso lo vamos a hacer en la siguiente sección.

Instalando soporte MySQL para Cygwin
Suponiendo que MySQL es el servidor de base de datos con el que vamos a trabajar en Rails y que actualmente esta instalado en Windows, debemos prepararlo para poderlo utilizar en Rails desde Cygwin.

Por tal motivo descargamos el codigo fuente de MySQL que corresponda con la versión binaria que tenemos instalada en Windows; en mi caso este archivo corresponde con la versión MySQL 5.0.67, el codigo fuente lo podemos descargar de aqui.

Una vez descargado, copiamos el archivo al directorio c:\cygwin\tmp, y desde Console, procedemos a descomprimirlo, compilarlo e instalarlo así:

cd /tmp
tar xzvf mysql-5.0.67.tar.gz
cd mysql-5.0.67
./configure
make install


Durante este paso hay que buscar en que entretenerse ya que tarda bastente tiempo...

Cuando la instalación haya terminado, nuestro siguiente paso es instalar el soporte de MySQL en Rails, para tal efecto desde Console ejecutamos:

gem install mysql

Probando Rails
Para verificar que Rails quedo instalado correctamente en Cygwin, en Console ejecutamos las siguientes instrucciones para crear una nueva aplicación Rails usando MySQL:

cd
mkdir Proyectos
cd Proyectos
rails -d mysql SampleApp


Una vez creado el esqueleto de la aplicación, es necesario modificar el archivo database.yml, primeramente para indicarle la clave del usuario root de MySQL y posteriormente para indicar el servidor MySQL al que nos vamos a conectar.

Para editar el archivo database.yml podemos usar el Notepad de Windows, pero Notepad no se lleva bien con los archivos Linux; por tal motivo vamos a usar el programa Notepad2, para editar el archivo lo encontramos en la ruta c:\cygwin\Home\[usuario]\Projects\SampleApp\config\database.yml

Primero hay que poner la clave correspondiente para el usuario root de MySQL, después hay que modificar el valor del host, hay que reemplazar "localhost" por 127.0.0.1, ya que localhost aquí, va a provocar que Rails no encuentre el servidor.

database.yml
Uploaded with plasq's Skitch!


Después de guardar los cambios, regresamos a Console, con las siguientes acciones crearemos las bases de datos en MySQL, crearemos un Modelo, Controlador y Vistas usando el generador Scaffold:

cd
cd Proyectos/SampleApp
rake db:create
script/generate scaffold Post title:string body:string
rake db:migrate


Ahora vamos a ejecutar el servidor Web desde Console:

script/server

Si apuntamos nuestro navegador a la dirección http://localhost:3000 debemos de recibir la pagina de bienvenida de Rails y si navegamos a http://localhost:3000/posts, podremos ver parte de nuestra aplicación generada a partir del modelo Post.

Rails welcome
Uploaded with plasq's Skitch!



Rails app
Uploaded with plasq's Skitch!


eTextEditor
Ya que comprobamos que Rails esta funcionando en Cygwin y que nuestra instalación de MySQL también funciona, ahora procedemos a instalar el editor eTextEditor, que a fin de cuentas es el motivo por el cual estamos realizando estas acciones.

Hay que descargar el eTextEditor de su sitio web, la licencia la podemos comprar en linea o podemos continuar con los 30 días de evaluación. Una vez instalado, lo ejecutamos desde Console simplemente con teclear (Nota: Si ya tenemos Console abierto, es necesario cerrarlo y volverlo a abrir):

e

Al iniciar nos indicara que necesita actualizar unos paquetes de Cygwin, elegimos la forma automática, después de un momento el edito estar listo para usarse. Lo que sigue en este punto es instalar/actualizar algunos bundles que nos harán la vida mas fácil en Rails. Primeramente vamos al menú Bundles > Edit Bundles > Manage Bundles, a continuación nos presentara una ventana con un listado de bundles disponibles para instalarse o para actualizarse.

Mi recomendación es actualizar instalar los siguientes bundles:
  • Bundle Development
  • JavaScript JQuery
  • JavaScript Prototype & Scrip_aculo_us
  • Ruby on Rails
  • Ruby RSpec
  • Ruby Shoulda
  • Ruby
  • TextMate

Bundles
Uploaded with plasq's Skitch!


A parte de los bundles que nos muestra esta pantalla, podemos instalar algunos bundles adicionales a través de Console, por ejemplo vamos a instalar el bundle para Git (Sistema de Control de Versiones) y el bundle para Cucumber, por lo tanto en Console tecleamos las siguientes instrucciones:

cd /cygdrive/c/Users/[usuario]\ Data/e
mkdir Bundles
cd Bundles
git clone git://gitorious.org/git-tmbundle/mainline.git Git.tmbundle
git clone git://github.com/bmabey/cucumber-tmbundle.git Cucumber.tmbundle


Una vez que termine, en la pantalla del eTextEditor seleccionamos el menú Bundles -> Bundle Editor -> Reload Bundles, después de esto los bundles recién instalados aparecerán en le menú Bundles, mostrandonos las acciones, comandos y fragmentos de código que cada bundle provee.

Ahora para editar nuestra aplicación Rails, hay que cerrar el eTextEditor, en la pantalla de Console nos dirigimos al directorio de nuestro proyecto:

cd
cd Proyectos/SampleApp
e .


El comando e . nos abrirá la pantalla del eTextEditor con nuestro proyecto cargado, como paso adicional podemos cambiar los colores del editor por unos mas "ruby- ish", para esto vamos al menú Edit > Edit Theme y de la lista de temas elegimos "Vibrant Ink" adicionalmente podemos cambiar la tipografía a Consolas.

Ahora para ver como funciona el bundle de Ruby on Rails vamos a ejecutar las pruebas de unidad en nuestro modelo Post, a través de la consola la forma de hacer esto es: rake test:unists, pero con el bundle en eTextEditor vamos al menú Bundles > Ruby on Rails > Run Tests > Test Units y despues de un momento obtendremos el resultado de nuestras pruebas de unidad.

eTextEditor-RoR
Uploaded with plasq's Skitch!


Las opciones que nos brindan los bundles generalmente tienes una combinación de teclas de acceso o palabras que al complementarlas con un "Tab" realizar cierta acción, por loo tanto recordar estos accesos rápidos a las acciones mas comunes son de gran ayuda para evitar usar el mouse y navegar a través de los menús.

BundleKeys
Uploaded with plasq's Skitch!


Conclusión
Ruby y Ruby on Rails tienen como concepto la simplicidad para realizar nuestro trabajo, por lo tanto las herramientas que usemos deben de seguir esa linea de simplicidad y no causarnos dolores de cabeza (Lentitud en el sistema, alto consumo de recursos) mientras desarrollamos nuestra "Killer Application", si bien TextMate y eTextEditor no son gratis, su costo es bastante moderado y accesible.

En el ambiente Linux también hay opciones para el desarrollo en Ruby on Rails, pero eso de momento es otra historia para otro post.

Entrepreneur Workshop

En un post pasado comente acerca del Entrepeneur Workshop que la Comunidad Tijuana.NET estaba organizando para el pasado 22 de Noviembre. El evento se llevo a cabo y de buena manera.

Para conocer un poco mas de lo que ahi sucedio los invito a visitar los siguientes posts donde hay reseña, material del evento y los audios-videos de lo que ahi se discutio

jueves, noviembre 20, 2008

Desarrollo de Software Avanzado

Para quienes lleven esta materia en el ITT con el profesor Miramontes, aqui les dejo la informacion que me paso en relacion al proyecto de fin de semestre.

La documentacion de proyecto debe de consistir en:
  • Analisis de requerimientos
  • Especificacion
  • Diseño y arquitectura
  • Prueba
  • Documentacion
  • Mantenimiento
Actualizacion: Me comenta el profesor Miramontes que no es necesario tener la aplicacion completa, pero por lo menos entregar una parte representativa en codigo.

En los puntos tambien me marco "Programacion", pero tambien me comento que espera el trabajo en unos 10 dias - laborables -, por lo tanto no espera mucho detalle en la documentacion, por lo tanto no se si realmente este esperando la programacion del proyecto, lo verifico con el y actualizo esta informacion.

miércoles, noviembre 12, 2008

Entrepreneur Workshop


La Comunidad Tijuana.NET ha estado muy activa en este mes, y precisamente como parte de esa actividad es que se esta organizando el evento Entrepreneur Workshop, el cual es una reunion informal que tiene como objetivos compartir experiencia e información inicial para iniciar negocios en el área de TI:
  • Experiencias para trabajar como freelance
  • Apoyos del gobierno para nuevas empresas en TI
  • Apoyo de Microsoft para nuevas empresas
  • Discusión en general
El evento es gratuito e informal, ven y comparte tus experiencias con nosotros, sin importar el área de las TI de la que tengas experiencia, ni sistemas o programas.

Esta reunión se va a llevar a cabo en el café D'volada ( consumo requerido ) de Otay en Plaza Dorada, sobre Blvd Industrial a un costado del nuevo puente sobre Blvd Manuel J Cloutier (Gato Bronco), el día sábado 22 de Noviembre, de 9 am a 2 pm

Por favor confirmar presencia en los foros del la Comunidad TJ.NET, con un simple, voy a asistir.

Por cierto información de la Comunidad Tijuana.NET, la pueden encontrar en los sitios sociales:
Plaza Dorada

viernes, noviembre 07, 2008

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

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

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

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

Tópicos avanzados en .NET

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

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

viernes, octubre 31, 2008

CodeCamp Comunidad Tijuana.NET

El dia de mañana 1ro de Noviembre se llevara a cabo el primer CodeCamp de la Comunidad Tijuana .NET.



El evento es gratuito y comenzara a las 9:00am, en la sala de capacitacion de Palacio Municipal de Tijuana, en la Zona del Rio. La sala se encuentra en la segunda planta en la esquina derecha si se entra por el lado de la bilblioteca.

No olviden llevar sus laptops o notebooks. Mas informacion del evento: CodeCamp





viernes, octubre 24, 2008

CodeCamp de la Comunidad Tijuana.NET

Hace un par de semana publique la intencion de llevar a cabo un CodeCamp sobre .NET por parte de la Comunidad .NET



Pues bien el evento ya es una realidad y estamos a una semana de que se lleve a cabo - la anticipacion y premura - se debe a que teniamos que encontrar un lugar apropiado, el ayuntamiento de Tijuana nos ayudo a obtener este espacio, pero desafortunadamente la unica fecha disponible es el 1ro de Nov.:

    Fecha: Miércoles 1 de noviembre de 2008

    Horario: 9:00 a.m. a 2:00 p.m.

    Ubicación:  Palacio Municipal de Tijuana

    Dirección:  Av. Independencia No. 1350, Zona Río

               Tijuana, Baja California, México CP 22320

    Costo: Entrada gratis


Mas informacion en la pagina de la Comunidad Tijuana.NET

Oferta de empleo para adminstrador de redes Windows

Hay una empresa aqui en Mexico que esta solicitando a un Ingeniero o Licenciado en sistemas computacionales con experiencia en:
  • Manejo y administracion de servidores Windows 2003
  • Manejo y administracion de servidores Exchange
  • Soporte basico a usuarios finales
  • Manejo y operaciones de dispositivos Cisco (ruteadores, VOIP)
El sueldo y las prestaciones son muy buenas, ademas de que la empresa ofrece capacitacion constante. Se requiere que la persona interesada este dispuesta a cambiar su residencia a San Quintin, Baja California.

Si alguien esta interesado por el puesto, por favor envienme un correo a
con su curriculum y datos de contacto, yo enviare esa informacion a la empresa interesada y ellos se contactaran con ustedes.

viernes, octubre 17, 2008

Webforms vs ASP.NET MVC

Ya no es novedad que el nuevo beta del ASP.NET MVC esta disponible, la noticia esta por todos lados, en twitter y blogs relacionados con tecnologia de Microsoft.

De hecho la cantidad de comentarios en Twitter, en donde tengo una busqueda programa para "twitts" relacionados al tema, es impresionante la cantidad de mensajes es diversos idiomas sobre este hecho.

Esta situacion me llevo a preguntarme que pasa con Webforms, cuando el ASP.NET MVC voi la luz publica, surgieron preguntas sobre si ASP.NET MVC vendria a reemplazar a Webforms, de acuerdo con Microsoft la respuesta indicaba que no, que ASP.NET MVC se iba a programar a la par de Webforms y que solamente iba a representar una opcion mas para el desarrollo Web en el area Microsoft.

Si bien Microsoft no creo que tenga intenciones de descontinuar Webforms ni a corto, ni a mediano plazo; las tendencias parecen indicar que el auge de ASP.NET MVC sobre Webforms van en aumento.

Si bien mi percepcion se basa en especulaciones y no es un trabajo de investigacion, voy a atreverme a decir que si bien Microsoft no favorece ninguna de las dos tecnologias en particular, parece que la comunidad si podria estarlo haciendo.

Por ejemplo, el blog de Scott Guthrie ya tiene tiempo que favorece con la cantidad de posts a ASP.NET MVC y Silverlight sobre Webforms, de igual forma sucede con el blog de Scott Haselman, y de alguna forma tambien lo percibo en los blogs de weblogs.asp.net, otra vez quiero aclarar que es una cuestion de percepcion de mi parte.

Ademas de la gran cantidad de "twitts" relacionados con ASP.NET MVC en diversos idiomas que recibo de Twitter, me di a la tarea de usar Google Trends, para ver que tan bien o que tan mal estaba mi percepcion; el resultado fue el siguiente:

Aunque esta tendencia puede estar no del todo correcta, debido a que mucha gente se refiere a Webforms como unicamente ASP.NET, pero, si busco tendencias sobre ASP.NET vs ASP.NET MVC, ASP.NET se dispara, pero incluye tambien busquedas relacionadas con ASP.NET MVC.

Aun asi la grafica muestra que a partir del anuncion de ASP.NET MVC, las busquedas de informacion relacionadas ha ido en crecimiento. Seria muy interesante conocer el ritmo de adoptacion/investigacion de ASP.NET MVC dentro de las empresas, que si bien despues de un año apenas a llegado al estado de Beta, la licencia de "Go-Live" la alcanzo desde Preview 3 ó 4.

Para conocer un poco sobre la opinion de las 3 personas que leen este blog - incluyendome yo - he colocado una encuenta para saber de sus opiniones sobre este tema - estara disponible unicamente una semana -, espero de su ayuda y colaboracion para contestar una unica opcion de las presentadas:
  • Me inclino por trabajar con ASP.NET sobre otras tecnologias
  • Me quedo con ASP.NET
  • Programo para Web en Windows, pero uso otras tecnologias
  • Programo para Web pero no en Windows
  • No programo para Web
La encuesta se encuentra en el lado superior izquierdo de mi weblog


jueves, octubre 09, 2008

Nuevo proyecto: Herramientas de organizacion y colaboracion

Estoy iniciando un nuevo proyecto, en donde la gente que va a colaborar en el no estamos trabajando físicamente en el mismo lugar, aunque si estamos en la misma ciudad.

El primer reto para la formación de este equipo de trabajo es que todos debemos ser auto-suficientes y debes de tener auto-organizacion, con respecto a las tareas de desarrollo que debemos de llegar a cabo; por tal motivo elegí Scrum como la metodología de administración del proyecto, ya que esta enfocada a un desarrollo incremental, ademas de promover la auto-organiacion del equipo de desarrollo y ofrecer una serie de procesos relativamente sencillos en comparación con los procesos "formales" o mas reconocidos de la ingeniería de software.

La parte mas importante de Scrum, desde mi punto de vista, es el reconocer que el cliente puede cambiar las directrices del proyecto en cualquier momento, ademas de que no requiere planeación detallada fundamentada en "castillos sobre el aire", la planeación, al igual que el desarrollo se va realizando de forma incremental, lo que permite responder a cambios de una manera mas natural.

Otro punto importante, para mi, es el seguimiento a los avances, en Scrum las tareas no pueden excederse de 24 horas - o 10 horas laborables al día - lo cual implica que tareas de mayor duración, deben de "romperse" en tareas mas pequeñas, esta granularidad ayuda a tener una visión mas efectiva de los avances reales del equipo.

Por el lado de las herramientas para colaboración, mi búsqueda se centro en:
  • Espacios de trabajo colaborativo
  • Edición de documentos colaborativo
  • Conferencia vía voz/video
  • Administración de Scrum

Como solución para el espacio colaborativo la decisión cayo sobre Huddle en cual ofrece la posibilidad de manejar varios Workspaces (áreas de trabajo) en donde es posible manejar proyectos, equipos de trabajo, información en forma de Whiteboards y listas de discusión, ademas de permitir el intercambio y la edición de documentos en linea.

Para la edición en linea y colaborativa de documentos (varias personas en el mismo documento al mismo tiempo) la decisión fue usar Google Docs. El soporte para múltiples usuarios a la vez es muy bueno, es posible realizar comentarios sobre el documento que se esta editando, enviar invitaciones a diferentes personas para poder realizar cambios o únicamente ver el documento, no es necesario guardalo, automáticamente se va guardando por nosotros, y finalmente lo podemos exportar a varios formatos entre ellos PDF.

Para las conferencias de voz/video estamos utilizando Skype, funciona sin problemas, es multi-plataforma y podemos estar varias personas en conferencia. La calidad del video y el audio es aceptable.

Para la administración de Scrum y sus artefactos de momento tenemos la información en hojas de Excel, pero la intención es moverlo a un sistema mas formal, por tal motivo, estoy evaluando 3 diferentes productos:

- Mingle, es una herramienta desarrollada por ThoughtWorks, bastante completa y madura para la administración de proyectos Agiles, esta basada en RubyOnRails y soporta diferentes bases de datos como "backend". La aplicación en si esta muy Web 2.0, la instalación y configuración es muy sencilla, y es fácil comenzar a utilizarla con las plantilla de proyectos que ofrece. Es posible conseguir una licencia de hasta 5 usuarios de manera gratuita, pero mas de cinco usuarios el costo es algo alto. Algo positivo de Mingle, es que tiene soporte para conectarse a diferentes sistemas de control de codigo fuente, permitiendo rastrear cambios en el codigo a tareas o bugs en Scrum.


- Storyverse, esta es una aplicación realizada en C# y Monorail, enfocada exclusivamente a Scrum, es fácil de instalar y configurar, soporta varias bases de datos como backend, funciona muy bien en .NET, pero tiene algunos problemas en Mono. La aplicación es "open source" lo que facilita el hacerle cambios y personalización, ademas de no tener costo para su uso. La desventaja es que no se integra con sistemas de control de codigo fuente.

-Agilo, esta es una aplicación "open source" desarrollada como plugin de Python para el software Trac, quien también es "open source", el único problema es que simplemente no puede hacer que funcionara, muchos problemas de instalación y configuración, así que realmente no tuve la oportunidad de probarla. Agilo al igual que Mingle, ofrece integracion con sistemas de control de codigo fuente, para ayudar a rastrear los artefactos de Scrum hast el codigo donde se implementan.

El proyecto va avanzado lentamente, pero de forma estable, ya existe el "Backlog" de las características del servicio que se va a desarrollar y ya se comenzó con la creación de historias y tareas para el primer "Sprint". Ya se tiene también la arquitectura que se va a utilizar para el desarrollo, aunque faltan definir todavía algunos detalles.

En un post posterior ya estaré comentando de las herramientas de desarrollo utilizadas en el proyecto.

martes, septiembre 30, 2008

AppleTV, ¿como Media Center?


Hace un par de meses me regalaron una AppleTV, el cual es un media center que se conecta directamente a la televisión y/o equipo de sonido.

Por medio de la AppleTV es posible gestionar películas, series de tv, música, podcast, vídeos de YouTube y fotos, todo "out of the box". La única condición es que todos los medio sean gestionados por iTunes.

La AppleTV cuenta con conexión a redes mediante un puesto RJ-45 así como mediante conexión inalámbrica.

La salida de video para TV es digital y ajusta el contenido para que se pueda ver en formato de HD (1080 como máximo), aun y cuando el video original no lo sea; el audio también es digital (Mediante fibra óptica).

Ademas Apple integro la posibilidad de comprar contenido de la iTunes Store directamente en la AppleTV, con lo cual realmente no se necesita una computadora intermedia para gestión. La iTunes Store cuenta con películas y series de tv en formato normal de TV, pero también en formatos de HD.

Hasta aquí todo suena muy bien, un media center pequeño, sin teclado, discreto, muy bonito visualmente, pero, no soporta formatos de video como DivX, no se le puede cargar vídeos o música si no se usa el iTunes y sobre todo, no puede grabar video en tiempo real de la antena o cable.

La solución a esta limitación de la AppleTV es relativamente sencilla. El primer paso consiste en lograr acceso a través de SSH y SFTP a la AppleTV, esto se logra a través de un PatchStick.

El PatchStick es una imagen OSX con la capacidad de hacer boot, la cual se monta en una memoria USB; posteriormente se reinicia la ATV con la memoria insertada en su puerto USB, después de un par de reinicios ya es posible conectarnos a nuestra ATV por medio de los protocolos mencionados.

Esto nos da la oportunidad de instalar programas adicionales como NitoTV, el cual abre un mundo de posibilidades, por ejemplo entre las cosas que nos permite hacer NitoTV:

  • Instalar mplayer y codecs adicionales de video como DivX, WMV, etc
  • Habilitar el puerto USB para conectar dispositivos, como discos portátiles
  • Realizar conexión de red para reproducir recursos multimedia
  • Abre posibilidad de instalar y ejecutar aplicaciones OSX
  • Gestionar medios fuera de iTunes

Con este paso logramos que nuestra ATV sea mas "abierta" y amigable con formatos no Apple, ahora el siguiente paso seria el agregarle la capacidad de reproducir y grabar video "en vivo".

Una vez que logramos el control total de nuestra ATV mediante un PatchStick, podemos adquirir un sintonizador de HDTV compatible con el programa EyeTV, en mi caso adquirí un dispositivo EyeTV 250 Plus, el cual es sintonizador análogo-HDTV, pero que ademas codifica la señal dentro del mismo dispositivo, liberando al CPU de la ATV para otras funciones.

La instalación del software EyeTV es un poco "laboriosa" en la ATV, pero una vez instalado funciona muy bien, el único detalle es, que como el software EyeTV no esta personalizado para ejecutarse en una ATV, debido a las restricciones de Apple, existen algunos detalles, como por ejemplo para programar la grabación de un programa a futuro es necesario abrir una sesión median VNC desde una pc (o Mac) para introducir la información necesaria.

Para la operación del EyeTV, este incluye un control remoto desde el cual se puede cambiar de canal, modificar el volumen, habilitar Closed Caption, pausar televisión en vivo, grabar al momento, reproducir vídeos de la librería, etc.

Al final de estas modificaciones la ATV termina siendo un Media Center completo.

Un sitio con bastente informacion sobre modificaciones a la ATV es el sitio de awkwardtv, ahi tambien es posible encontrar programas adicionales para la ATV como:

sábado, septiembre 27, 2008

Msdn blogs hackeados?

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

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

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


martes, septiembre 23, 2008

CodeCamp Comunidad TJ.NET



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

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

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

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

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

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

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

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

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

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

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

Imagen bajo licencia de Creative Commons, fuente original

jueves, septiembre 18, 2008

Programación Web: Patrón MVC

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

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

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

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

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

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

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

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

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

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

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

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

/Controllers
/Models
/Views

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

El Controlador

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

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

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


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

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

El ruteo

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

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

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


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

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

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

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

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

Vistas

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

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

Este archivo Site.master debe de contener un tag:


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

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

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

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

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

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


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

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

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


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

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

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

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

Modelo

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

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

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

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

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

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

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

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

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

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

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

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

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

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

public class RestauranteController : Controller
{

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

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

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

return View();
}

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

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

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

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

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

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

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

Referencias

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: