En: How to
27 Nov 2011El día de ayer comencé a jugar con Ruby y termine creando un Hola Mundo la cual la subí a Heroku, a continuación mostraré los pasos que seguí y los errores con los que me encontré.
Para poder desarrollar una aplicación con Ruby ocupando Heroku como servidor, necesitamos instalar Ruby y Git ya que Heroku ocupa este control de versiones para subir tu aplicación.
Lo primero que debemos hacer es instalar Ruby, para esto debemos bajarlo desde http://rubyforge.org/frs/?group_id=167, y descargar rubyinstaller-version.exe. Es muy sensillo, hacemos doble clic en el instalador, aceptamos la licencia y damos instalar.
Luego debemos instalar GIT, para esto nos dirigimos a http://git-scm.com/download y tenemos dos proyectos que implementan Git para Windows, yo utilice msysGit.
Cuando lo instalemos debemos tener presente lo siguiente:
Existe tres formas de ejecutar GIT, utilizando un bach, el cual no ingresa un path en las variables de entorno de Windows, la otra forma es agregando el PATH a las variables de entorno, con lo que logramos ejecutar GIT por linea de comando. Yo utilice la segunda opción debido a que me gusta trabajar bajo Windows Power Shell.
Te recomiendo que utilices Checkout Windows-style, que es la opción por defecto.
Ya tenemos todos los software necesario para desarrollar, ahora debemos instalar las gemas necesarias para el desarrollo con Sinatra y Heroku, para esto debemos abrir la línea de comandos y ejecutar:
gem install sinatra gem install heroku gem install bundler
Con esto habremos instalado las gemas que necesitamos para el desarrollo. La última gema la utilizaremos para mantener las gemas utilizadas en nuestra aplicación.
Crearemos un Hola Mundo, para ello nos iremos a su editor de texto favorito (para mi Notepad++), y escribiremos lo siguiente:
require 'sinatra' get '/' do 'Hola Mundo' end
La primera línea indica que utilizaremos Sinatra , es muy parecido a un include o using de PHP o C#. La siguiente línea indica que utilizaremos el comando GET de HTTP, Sinatra al ser un Lenguaje de Dominio Especifico (DSL), utiliza los comandos GET, POST, PUT y DELETE, bueno aquí estamos indicando que si llega un requerimiento GET a la ruta “/”, o sea, a la raíz del sitio realice lo que se encuentra dentro del “do end”, muy sensillo
.
Guardamos el archivo con el nombre que deseamos con extensión .rb (extensión de ruby) en mi caso lo nombre “hola_mundo.rb”
Ahora para ejecutar nuestra aplicación nos dirigimos a la línea de comando, nos posicionamos en la carpeta donde guardamos el archivo y ejecutamos:
ruby hola_mundo.rb
Con esta línea iniciamos el servidor de ruby, y nuestra aplicación se alojará en http://localhost:PUERTO, donde el Puerto es el que remarque con color amarillo.
Ya tenemos lista nuestra aplicación, ahora a subirla a Heroku, para ello debemos seguir con los siguientes pasos.
Primero debemos crearnos una cuenta en Heroku, y luego debemos configurar las claves SSH, Heroku al igual que GitHub utilizan llaves publicas/privadas para establecer el login con sus repositorios. Para crear estas llaves te recomiendo usar GIT UI que viene dentro del paquete de msysGit, y te diriges al menú “Help/Generate SSH Key”, aquí existe un botón para generar la clave la cual te pedirá una palabra secreta que debes recordar.
Luego de generar la clave, la cual la almacenará en “%User%\.ssh\” debes subirla a heroku, para ello nuevamente a la linea de comandos ubicado en esta carpeta y ejecutar:
heroku keys:add id_rsa.pub
Con esto subiremos a heroku nuestras credenciales.
Luego debemos crear un archivo de configuración para que heroku sepa cual es el archivo que levantará nuestra aplicación para esto creamos el archivo “config.ru” y agregamos las siguientes líneas
require 'rubygems' require 'bundler' Bundler.require require './hola_mundo' run Sinatra::Application
Luego configuraremos nuestras gemas utilizando Bundler, que es el administrador de gemas por defecto utilizado en Ruby 3.
Para ello debemos crear un archivo llamado “GemFile” el cual contendrá todas las gemas y sus versiones.
source :gemcutter gem 'sinatra', '1.3.1'
Y ejecutamos bundle con la siguiente instrucción:
bundle install
Esto nos generará un archivo “Gemfile.lock”, el cual se debe subir a su repositorio.
Previo a subir el repositorio, debemos configurar dos variables globales de GIT,
git config --global user.email Your.Email@domain.com git config --global user.name "Your Real Name"
Estas indican nuestro nombre y mail, el cual debe ser el mismo con el que nos creamos la cuenta en Heroku.
Luego debemos crear el repositorio de GIT, para ello ejecutamos:
git init git add . git commit -m "Iniciando repositorio HolaMundo"
Con esto se inicializará git y realizamos el primer commit.
Luego creamos la aplicación en heroku para ello ejecutamos
heroku create [nombreApp]
Donde, [nombreAPP] será el nombre que tendrá nuestra aplicación, en nuestro caso lo llamare HolaMundoAlabra. Al ejecutar esta linea de código heroku nos retornará la url y repositorio de git que se asigno a nuestra aplicación.
Luego debemos hacer push de nuestro código en el repositorio de heroku para ello ejecutamos
git push heroku master
Con esto subiremos a la rama principal nuestro código, aquí nos pedirá nuestra palabra secreta de nuestra clave SSH.
Luego estamos listos para ejecutar nuestra aplicación nos dirigimos a la url que nos dio http://holamundoalabra.heroku.com/ y listo
.
El código fuente completo lo puedes descargar desde http://alabra.codeplex.com/SourceControl/changeset/changes/357e82c58dd1
Cuando realice esta prueba me ocurrieron varios problemas, para resolverlos puedes ver el log de heroku ejecutando:
heroku logs
Podrás ver el log completo de tu aplicación.
Referencias:
El Sábado 8 de Enero, junto a Rubén López (@spakinz), hemos realizado un Code Katas del problema String Calculator.
La idea de realizar este code katas, nació en la lista de correos de AltNet Hispano y en twitter, en donde propuse realizar este problema con la finalidad de practicar TDD y Pair Programing.
Ante esta propuesta, Rubén, se contacto y nos juntamos en la fecha propuesta a resolver este problema.
Cuando iniciamos nos pusimos de acuerdo en los siguientes puntos:
Definimos que usaríamos Visual Studio 2010 y Nunit para realizar pruebas unitarias. En cuanto a la forma de comunicación, decidimos usar Codeplex, donde hemos creado un proyecto llamado “Code Kata AltNet Hispano“, para mantener el código fuente con SVN y LiveMetting para comunicarnos.
Como resumen puedo decir que fue muy productiva la sesión, además de ser muy satisfactoria por varios elementos, primero me sirvió para practicar TDD, que es un punto que todavía me encuentro desarrollando. Luego me sirvió para tener una experiencia de programación en parejas, nunca lo había realizado y creo que ayuda un montón, muchas veces a uno se le olvidan las cosas o no sabe como resolver un punto en particular y aquí entra el otro compañero que te apoya e indica como solucionarlo. Aunque nos hemos demorado un poco más del tiempo estimado, al rededor de 1 hr con 20 minutos, creo que por ser la primera vez es un muy buen tiempo.
A continuación les dejo la grabación de la sesión (desde aquí pueden descargar el vídeo, o verlo en linea desde screencast) , el código fuente lo pueden descargar directamente de CodePlex http://ckaltnethispano.codeplex.com.
En: Actualidad
1 Dic 2010Los ciudadanos y las empresas usuarias de Internet adheridas a este texto manifestamos:
La Red Neutral es un concepto claro y definido en el ámbito académico, donde no suscita debate: los ciudadanos y las empresas tienen derecho a que el tráfico de datos recibido o generado no sea manipulado, tergiversado, impedido, desviado, priorizado o retrasado en función del tipo de contenido, del protocolo o aplicación utilizado, del origen o destino de la comunicación ni de cualquier otra consideración ajena a la de su propia voluntad. Ese tráfico se tratará como una comunicación privada y exclusivamente bajo mandato judicial podrá ser espiado, trazado, archivado o analizado en su contenido, como correspondencia privada que es en realidad. Europa, y España en particular, se encuentran en medio de una crisis económica tan importante que obligará al cambio radical de su modelo productivo, y a un mejor aprovechamiento de la creatividad de sus ciudadanos. La Red Neutral es crucial a la hora de preservar un ecosistema que favorezca la competencia e innovación para la creación de los innumerables productos y servicios que quedan por inventar y descubrir. La capacidad de trabajar en red, de manera colaborativa, y en mercados conectados, afectará a todos los sectores y todas las empresas de nuestro país, lo que convierte a Internet en un factor clave actual y futuro en nuestro desarrollo económico y social, determinando en gran medida el nivel de competitividad del país. De ahí nuestra profunda preocupación por la preservación de la Red Neutral. Por eso instamos con urgencia al Gobierno español a ser proactivo en el contexto europeo y a legislar de manera clara e inequívoca en ese sentido.
(Si te sientes cómodo y representado por este texto, dale toda la difusión que puedas y quieras: reprodúcelo, enlázalo, tradúcelo, compártelo, vótalo… todas esas cosas que puedes hacer con total tranquilidad y libertad gracias, precisamente, al hecho de que tenemos todavía una red neutral. Hagamos posible el seguir teniéndola)
Copio y pego de Microsiervos y aNieto2K, SentidoWeb haz lo mismo!.
En: How to
22 Nov 2010Estos días he estado investigando cómo ejecutar un paquete de SQL Server Integration Services (SSIS), creado con Visual Studio 2008 y SQL Server 2005 y con esto me he encontrado:
Se desea ejecutar un paquete SSIS desde un WebService programado en J2EE. El WebService no necesariamente, de hecho lo más probable que no, se encuentre instalado en el mismo servidor de SQL Server.
Buscando solución al problema he encontrado con 4 formas diferentes de ejecutar un paquete SSIS, las cuales van desde crear una aplicación en .NET hasta ejecutar procedimientos almacenados. A continuación veremos cuales son:
xp_cmdshell: El procedimiento almacenado xp_cmdshell permite la ejecución de comandos de windows en SQL Server. Así se puede ejecutar la utilidad DTExec.exe, del punto dos, a través de este procedimiento almacenado. Hay que tener precaución, ya que la llamada de xp_cmdshell se ejecuta con los mismos privilegios de la cuenta de SQL Server, por lo que puede haber problemas de seguridad.Para resolver nuestro problema solamente podemos utilizar las opciones 3 y 4. A continuación veremos los pasos necesarios para llevar a cabo esta tarea.
Este comando, por seguridad, desde la versión de SQL Server 2005 viene desactivado por defecto. Para poder activarlo se debe ejecutar el siguiente código:
<pre>-- To allow advanced options to be changed. EXEC sp_configure 'show advanced options', 1 GO -- To update the currently configured value for advanced options. RECONFIGURE GO -- To enable the feature. EXEC sp_configure 'xp_cmdshell', 1 GO -- To update the currently configured value for this feature. RECONFIGURE GO
Luego que tengamos habilitado este procedimiento almacenado, podemos ejecutar la utilidad “DTExec.exe”, aquí les muestro un código de ejemplo:
-- Variable donde almacenaremos la linea a ejecutar declare @lineExecute varchar(8000) -- Variable donde almacenaremos el nombre del Paquete declare @packageName varchar(100) -- Nombre del Servidor SSIS declare @serverName varchar(100) -- Parametros declare @params varchar(8000) <pre> set @packagename = '"\File System\PackageName"' set @servername = 'ServerName' set @params = '' set @lineExecute = 'dtexec /dts ' + @packageName + ' /ser ' + @serverName + ' ' set @lineExecute = @lineExecute + @params --Ejecutando el comando DECLARE @returnCode int EXEC @returnCode = xp_cmdshell @ssisstr -- Mostrando el resultado de la ejecución select @returnCode
En este ejemplo hemos cargado el paquete a Integration Service, dentro de la carpeta “File System”. Ustedes pueden ejecutar el paquete desde diferentes ubicaciones, para ver todos los comandos pueden dirigirse aquí: http://msdn.microsoft.com/en-us/library/ms162810.aspx
Cuando ejecute el código anterior el servidor me arrojo el siguiente error:
“Description: The version number in the package is not valid. The version number cannot be greater than current version number.”
Y más adelante mostraba lo siguiente:
“Description: Package migration from version 3 to version 2 failed with error 0xC001700A “The version number in the package is not valid. The version number cannot be greater than current version number.”.”
El problema que ocurre es que dentro de el servidor donde ejecutaba la consulta existía 2 instancias de SQL Server, una con la versión 9.00 (SQL Server 2005) y otra 10.0 (SQL Server 2008). Como Intregration Service no tiene instancias, se ejecutara la primera utilidad de “DTEXEC” que encuentre. Así como hemos desarrollado nuestro paquete SSIS en Microsoft SQL Server Integration Services Designer Version 10.0, solamente podemos ejecutarlo en versiones posteriores a la 10.0.
Para solucionar este problema he encontrado 3 formas:
1. En ves de llamar a la utilidad por el nombre (línea 14), llamarlo por la ruta completa, de la siguiente forma:
set @lineExecute ='C:\Program Files\Microsoft SQL Server\100\DTS\Binn\DTExec.exe /dts ' + @packageName + ' /ser ' + @serverName + ' '
2. Renombrar el antiguo ejecutable de la utilidad “DTExec.exe”, Ej: C:\Program Files\Microsoft SQL Server\90\DTS\Binn\DTEXEC_Old.exe
3. Modificar la variable de sistema “Path” y agregar antes de la ruta “C:\Program Files\Microsoft SQL Server\90\DTS\Binn”, la ruta de la instancia correcta “C:\Program Files\Microsoft SQL Server\100\DTS\Binn”
Próximamente crearé un nuevo post explicando esta solución.
Referencias:
Como siempre, cualquier critica, pregunta o sugerencia no duden en comentar…
En: How to
22 Nov 2010
Hace unas semanas atrás estuve leyendo sobre buenas practicas en Software Configuration Manager, y existe algo que me gustaría destacar.
Esta duda la tenía hace mucho tiempo y existe un punto importante que me “abrió los ojos”, “Código + Herramientas = Producto“. Si un producto de software no solamente se compone de código fuente, si no que también de las herramientas utilizadas. La combinación de ambas generan el producto de software.
Herramientas es todo aquello utilizado para concebir el producto, puede ser librerías, software, componentes, etc. Estas deben ser almacenadas dentro del repositorio, ya que sin ellas el producto no existe.
Ahora no hay que ser extremos en esta metodología, me refiero a que no deberíamos incluir por ejemplo instalador del IDE, SO, pero si debemos indicar que IDE se utilizo, SO, compiladores, inclusive hasta las características de la maquina donde se desarrollo, solo si es relevante.
Además de las herramientas, debemos incluir la documentación, así nuestro template quedaría de la siguiente manera:
Esto lo podemos ver en varios proyectos opensource,
Ejemplos:
Como siempre cualquier comentario, critica, sugerencia será bienvenida….
En: General
13 Oct 2010
En mi trabajo, un cliente, nos ha pedido que lo ayudemos para mejorar su proceso de administración de configuración de software. Es en este sentido que nos encontramos trabajando en mejorar apoyado de las mejores practicas.
Es la tarea de seguimiento y control de los cambios producidos en el sofware.
Dentro de las mejores practicas, podemos englobar en los siguientes grupos:
Referencia
Update: Me he encontrado con un articulo, escrito por Luix, en el cual explica sobre patrones para la Administración de Configuración de Software, aquí lo dejo: http://es.debugmodeon.com/articulo/patrones-en-gestion-de-configuraciones-software-i
En: Recursos
2 Ago 2010El otro día en el blog de Scott, me encontré con un listado de los Shortcuts de Visual Studio 2010, para ser descargados en formato PDF, en A4 y y Legal.
Deben tener en consideración el lenguaje que desean descargar [CSharp = C#, VB = VB, FSharp = F#, CPP = C++)]
Aquí les dejo el link de Descarga.
Fuente: ScottGu’s Blog
En: How to
29 Jul 2010Una de las funcionalidades interesantes que he descubierto hace poco, incluida desde la versión del framework 3.0, es la posibilidad de extender otras clases a través de Extension Methods.
La implementación es bastante sencilla y requiere de una clase estática y que el método que se desea incluir también lo sea y que el primer parámetro reciba el tipo que se desea extender precedido del modificador this.
A continuación mostraré un ejemplo extendiendo la clase DateTime agregándole dos métodos uno que obtenga el primer día del mes de la instancia y otro que obtenga el último día.
/// <summary>
/// Contiene extensiones para DateTime
/// </summary>
public static class DateTimeExtension
{
/// <summary>
/// Obtiene el primer día del mes
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime FirstDayOfMonth(this DateTime dateTime)
{
return dateTime.AddDays((-1 * dateTime.Day) + 1);
}
/// <summary>
/// Retorna la fecha con el último día del mes
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime LastDayOfMonth(this DateTime dateTime)
{
return dateTime.AddDays(dateTime.AddMonths(1). FirstDayOfMonth().Subtract(dateTime).Days - 1);
}
}
De igual modo pueden bajar el código fuente desde el sitio en codeplex alabra.codeplex.com
Referencias:
En: Proyectos
20 Jul 2010El pasado 26 de Junio, se ha comenzado la creación de un framework para realizar validaciones de objetos de negocio, utilizando TDD.
Con la ayuda de Fabio Maulo, quien realizo las primera implementación, ya se ha logrado un gran avance.
Existe una serie de Issue por resolver y muchas cosas más que iran ocurriendo, así que si quieren participar y no saben como les dejo un screencast realizado por Jorge Gamba y Fabio Maulo donde se explica como crear un repositorio en CodePlex, subir el código usando Mercurial y crear un Fork para enviar contribuciones.
Además ya nos hemos juntado 3 veces en lo que denomina “ALT.NET Café“, que es una sesión a modo des conferencia. A continuación les dejo los videos y links para que sigan el proyecto.
Iniciamos este blog, veremos que resulta, ojala sea de ayuda para alguien…