Usando Git & GitHub & Nodester

Sabian que Codeplex ahora soporta Git como DVCS? (https://www.infoworld.com/d/application-development/microsoft-adds-git-support-codeplex-repository-189372?source=rss_application_development) Este chisme me sirve como introduccion a lo que les voy a contar. Hace algunas semanas unos amigos me pidieron ayudar en un proyecto que involucra Node.js, el porque Node.js y no ASP.NET va ma alla de este simple post, aunque en realidad si usaremos ASP.NET en combinacion con Node.js, pero esa es otra historia. Entonces acepte la idea y tome el desafio, con mi conocimiento escencial de javascript & coffeescript emprendimos un par de semanas de arduo trabajo nocturno, pues mi trabajo “normal” me consume la mayor parte del dia y las clases que doy en la universidad un par de horas de la noche, como se imaginaran casi no me quedo tiempo de dedicarlo a mi familia y a dormir, al menos ese par de semanas fue una locura. Pero todo fue excelente pues aunque el proyecto no es la gran cosa “no podemos decir exactamente que es por acuerdos de confidencialidad” para mi fue una oportunidad de aprender nuevas tecnologias y eso hice y aqui, en este espacio, les voy presentando algunas de las aventuras que vivi.

La aplicacion Node.js no es el tema que me trae precisamente a este punto, la aplicacion la programamos en un servidor local y mi aventura comienza cuando debemos encontrar un hosting para la aplicacion, afortunadamente escucho de Nodester que ofrece un servicio gratuito precisamente para Node.js, la unica cosilla que novedosa…. es que usa Git para controlar los cambios en los archivos.

Git es un software de control de versiones, digamos al mejor estilo de comparacion con SVN, Mercurial, etc. (No lo comparo con TFS porque aunque se podria decir que TFS tiene un control de versiones, TFS es mucho mas que solo un VCS). Pero tambien Git tiene sus bondades y es que hace tiempo anduve buscando un VCS que me permita hacer un rastreo de los cambios de mis archivos de modo local, es decir sin tener que instalar un servidor de TFS o un servidor de SVN …. bueno uds me entienden y efectivamente Git permite eso, ademas que trae un interesante concepto llamado Social Coding que va mas alla del Open Source. El concepto, la filosofia y las herramientas de Git me encantaron, despertaron mi interes mas alla de Nodester Smile entonces decidi instalarlo, configurarlo y utilizarlo.

Aqui algunos pasos que segui y algunas de mis recomendaciones para los que tambien se inician:

El libro de referencia perfecta para Git es “Git Pro” de Scott Chacon: http://progit.org/book/, recomiendo leer al menos los primeros 3 capitulos, el libro es genial

  1. Afortunadamente Nodester me paso un excelente punto de inicio. Yo usuario de Windows no pienso resignar mi Sistema Operativo asi que empece por aqui: http://help.github.com/win-set-up-git/, que es la guia oficial de Github para instalar Git bajo Windows, genial
  2. La recomendacion que les hago al seguir la guia es, hacerlo exactamente con los pasos tal cual les dicen, de lo contrario estaran viendose a ustedes mismos bloqueados en algun punto de la configuracion.
  3. La generacion de las llaves puede resultar un poco truculenta Smile pero una vez que lo hagan todo funciona bien. Truculenta en el sentido de que si se equivocan en algo por ejemplo en el directorio donde generan las llaves puede ser que la conexion con Github o Nodester, no funcionara!
  4. Luego a instalar la app de nodester usando “npm install nodester-cli -g ”
  5. Hacer un setup de las cuentas de Nodester
  6. Finalmente seguir las instrucciones del video http://www.youtube.com/watch?v=jwsP1Ejv-_w hay algunas cosas que no me funcionaron al seguir esas instrucciones, ya lo reporte y seguramente haran un update de sus herramientas o en el peor de los casos del video Smile

Pero las cosas no quedaron ahi, yo me adentre mas al mundo de Git y comence a usar Github, se que hay otras muchas opciones pero bueno seguramente en algun momento las probare.

  • Descargue e instale un conjunto de herramientas llamadas GitExtensions, que tienen varias utilidades entre ellas un plugin para VS2010, de tal forma de integrar Git dentro de VS, debo decir que no le llega ni a los talones a TFS Smile pero tampoco lo necesita porque todo puede hacerse desde la la linea de comandos llamada Git Bash, que es absolutamente genial.
  • El siguiente paso es subir un proyecto a Github y las instrucciones para crear y “promover” cambios a un repositorio en Github estan aqui: http://help.github.com/create-a-repo/
  • El comando “git remote add origin git@github.com:username/Hello-World.git” es el “secreto” de todo, pero aunque las instrucciones son simples y hay documentacion por todo lado, un serio problema me mantuvo bloqueado un par de horas fue un error que decia “Disconnected: No supported authentication methods available”
  • La causa del error… la falta de un archivo .profile en el /home, el archivo tenia que contener la ruta al ejecutable ssh.exe, el contenido del archivo a continuacion:

SSH_ENV=»$HOME/.ssh/environment»
GIT_SSH=»/usr/bin/ssh.exe»

Luego de agregar este archivo todo funciono de maravillas a tal punto que ya subi un proyecto a github, justamente el proyecto de mi anterior post Objetos Globales con CoffeeScript / Javascript, lo pueden encontrar aqui: https://github.com/tecnocrata/GlobalObjectsCoffeeScript

Bueno eso es todo por ahora.

Saludos

Objetos Globales con CoffeeScript / Javascript

Antes que nada debo indicar que no soy un experto en Javascript y mucho de lo que escribire a continuacion puede sonar conocido, repetitivo y tonto para algunos, sepan disculparme. Bueno, por aquella complejidad intrinseca de Javascript es que yo he encontrado fabuloso el concepto de CoffeeScript y ultimamente estoy involucrandome bastante con Node.js lo que me lleva a tener que prepararme mas aun en javascript y este post contiene la respuesta a una de mis grandes preguntas: Como puedo estructurar objetos globales usando Javascript+CoffeeScript+jQuery+ASP.NET MVC? y todo esto de manera orientada a objetos ….uff para los que no conozcan estas tecnologias puede sonar mas complejo de lo que en realidad es. Encontre tres soluciones que se las presento a continuacion.

Primeramente mostrarles el contenido resumido del archivo index.cshtml, que basicamente contiene un boton y codigo jQuery, para capturar el evento click:

1 @{ 2 ViewBag.Title = "Home Page"; 3 } 4 5 <h2>@ViewBag.Message</h2> 6 <p> 7 To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>. 8 <br/> 9 <input type="button" id="btnDemo" value="Click me!"/> 10 </p> 11 12 <script type="text/javascript"> 13 14 $("#btnDemo").click(function () { 15 //Code here... 16 }); 17 </script>

El contenido relevante del archivo _Layout.cshtml es el siguiente:

1 <head> 2 <title>@ViewBag.Title</title> 3 <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /> 4 <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script> 5 <script src="@Url.Content("~/Scripts/tx/common1.js")" type="text/javascript"></script> 6 <script src="@Url.Content("~/Scripts/tx/common2.js")" type="text/javascript"></script> 7 <script src="@Url.Content("~/Scripts/tx/common3.js")" type="text/javascript"></script> 8 </head>

 

Solucion 1

Mi archivo common1.coffee es el siguiente, el “secreto” en esta solucion es el caracter de arroba (@) colocado por delante del nombre de la clase, esto “magicamente” logra el efecto de crear la clase GlobalMessage1 y asignarla al objeto this que gracias al closure de coffeescript es window, es decir aqui this == window.

1 class @GlobalMessage1 2 say_hello: () -> 3 alert "Hello Method 1" 4 5 class PrivateMessage1 6 say_nothing: ()-> 7 alert 'Nothing'

He utilizado una clase adicional llamada PrivateMessage1 para que puedan ver la diferencia con GlobalMessage1 al momento en que se genera el archivo javascript common1.js.

1 <script type="text/javascript"> 2 3 $("#btnDemo").click(function () { 4 var gm = new GlobalMessage1(); 5 gm.say_hello(); 6 }); 7 </script>

Solucion 2

En esta solucion la idea es preparar las clases para estar dentro de namespaces, ficticios porque javascript no soporta el concepto de namespace. Pero gracias al “truco” utilizado, estoy simulando uno. Debo indicar que no considero recomendable tener mas de dos niveles en el namespace del framework que armen, basicamente porque resultaria bastante complicado e ilegible ir escribiendo todos los niveles, a continuacion el contenido del archivo common2.coffee:

1 window['Framework1'] = {} 2 #window['Framework1.Utilities'] = {} 3 window['Framework1.GlobalMessage'] = {} 4 5 class Framework1.GlobalMessage 6 say_hello: () -> 7 alert "Hello Method 2"

El contenido del archivo index.cshtml es el siguiente:

1 <script type="text/javascript"> 2 3 $("#btnDemo").click(function () { 4 var gm = new Framework1.GlobalMessage(); 5 gm.say_hello(); 6 }); 7 </script>

Solucion 3

Finalmente, encontre una solucion “mas adecuada” y que segun lo que lei es la que debe usarse cuando se utiliza Node.js, entonces aqui tenemos el codigo del archivo common3.coffee:

1 root = exports ? this 2 root.Framework2 = 3 Utilities: {} 4 GlobalMessage: {} 5 6 class Framework2.GlobalMessage 7 say_hello: () -> 8 alert "Hello Method 3"

El contenido de archivo index.cshtml, es el siguiente:

1 <script type="text/javascript"> 2 3 $("#btnDemo").click(function () { 4 var gm = new Framework2.GlobalMessage(); 5 gm.say_hello(); 6 }); 7 </script>

Si alguno tiene algun comentario u observacion a este codigo es mas que bienvenido, muchas gracias.

Aqui el archivo comprimido de la solucion:

Error con Windows Phone & Microsoft Expression Blend

Cuando creo un proyecto Windows Phone en Expression Blend, me aparece un error por demas inexplicable:

"The specified solution configuration "Debug|MCD" is invalid. Please specify a valid solution configuration using the Configuration and Platform properties (e.g. MSBuild.exe Solution.sln /p:Configuration=Debug /p:Platform="Any CPU") or leave those properties blank to use the default solution configuration"

Una solucion mas que escurridiza:

The only solution I found within a few hours scrapes between forums and knowledge base of Microsoft. It is as simple as opening the registry editor (Win + R and then enter Regedit) and there find the path to HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerEnvironment and once there, delete the PLATFORM variable. After this, close the registry editor and restart the machine.

2012-03-15_222642

Si alguien conoce la causa, sera bienvenida la explicacion.

Saludos