tag:blogger.com,1999:blog-9349511273964977172024-03-05T02:41:00.050-05:00Soy Freak, y tambien Geek!!!Blog inspirado por la necesidad de poner en algun lugar las cosas que leo, pienso y que no quiero olvidar, los temas giran alrededor de mis aficiones (mi lado freak) y mi trabajo (mi lado geek), bienvenidos y que lo disfruten!!!Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.comBlogger92125tag:blogger.com,1999:blog-934951127396497717.post-63543560193483430352013-01-20T20:57:00.002-05:002013-01-20T22:10:43.967-05:00Automatizando la Generación de la Base de Datos<br />
Hola hoy quiero compartir una técnica que aprendí hace algunos años y que he tratado de utilizar siempre en cada proyecto en que he estado, es sobre el versionamiento de los Scripts de la base de datos y la automatización de la creación de la misma, mis ejemplos estarán en Java y Ant pero la idea se puede aplicar a cualquier Tecnología/lenguaje.<br />
<br />
Imaginemos un entorno de desarrollo donde cada desarrollador tiene una base de datos propia en la cual desarrollar y hacer sus pruebas unitarias, y de pronto encontramos que necesitamos modificar alguna Tabla, Vista, o Store Procedure, una vez terminada la modificación tenemos que versionar el cambio; pero ¿Cómo propagamos el cambio al resto del equipo? tenemos que avisar al resto del equipo, todos suspenderían sus tareas, ejecutarían el Script de Actualizacion (si existe uno) o aplicar el backup correspondiente y cruzar los dedos para que todo siga funcionando, este es un proceso manual, engorroso, que debe ser ejecutado por cada integrante del equipo y sobre todo: Propenso a Errores, lo cual provoca que se evite al máximo los cambios (en algunos casos se le llega a tener verdadero terror a hacer este tipo de cambios) o se llegue incluso a hackear nuestro propio código para evitar tocar la base de datos, con esta técnica bastaría con actualizar con la versión del repositorio, ejecutar la tarea de reset a la base de datos y ya tenemos nuestra base de datos actualizada con la estructura de datos necesaria para la versión del código fuente que tenemos.<br />
<br />
Otro ejemplo es conforme se realiza el desarrollo el sistema evoluciona, las estructuras de datos cambian y se refleja en el estado del código si usamos un sistema de control de versiones (git, svn, etc) esto no representa ningún problema pues podemos viajar en el tiempo y obtener la versión que queremos en cada momento, pero que pasa si junto con los cambios en el código tenemos cambios en la estructura de la base de datos (tablas, vistas) o mas aun: en la <b><i>lógica</i></b> de procedimientos almacenados?, he encontrado que esto es mas común de lo que uno piensa, y terminamos teniendo el código con un buen historial pero solo la ultima versión de la base de datos, entonces si por alguna razón necesitamos una versión del código anterior, corremos el riesgo de que esta no funcione pues no tendrá la estructura de tablas o procedimientos almacenados con la cual funcionaba correctamente en su momento<br />
<br />
Una vez que consideramos esto y lo versionamos necesitamos alguna forma de poder hacer este despliegue de forma rápida, tal que si necesitamos regenerar la base de datos no tengamos que ejecutar backups o hacer una ejecución de scripts a mano, copiando y pegando a alguna herramienta visual, o escribiendo los scripts de ejecución desde 0 cada vez<br />
<br />
entonces comencemos:<br />
<br />
<a name='more'></a><br />
Primero abrimos el ide en mi caso usare STS (una version de Eclipse modificada para desarrollo con Spring) y creamos un proyecto cualquiera, en mi caso por default creo proyectos web así que ahí vamos:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0Hd7IMlNfhJ6BUpvsl69QwwZ9hD_h5rlOgB184YxkQzdLCH6kObtBHON2vvA7wFK_rxTARlscJpPnUMJVDHolFmKx5x6rF0YWuirYabFU_p4ZDYRUN9GRr_VuCHC984GwjPsfMZScVQYD/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0Hd7IMlNfhJ6BUpvsl69QwwZ9hD_h5rlOgB184YxkQzdLCH6kObtBHON2vvA7wFK_rxTARlscJpPnUMJVDHolFmKx5x6rF0YWuirYabFU_p4ZDYRUN9GRr_VuCHC984GwjPsfMZScVQYD/s1600/1.png" /></a></div>
<br />
<br />
A continuación Creamos una carpeta dentro del proyecto para contener los Scripts necesarios en un arranque de originalidad llamaremos a esta carpeta <b>ScriptsBD</b>, si el sistema que haces tiene mas de una base de datos recomiendo crear una carpeta dentro de la carpeta Scripts , una por cada base de datos, orden ante todo, yo lo haré así solo tenga una base de datos, para dejar todo preparado por si aparece la necesidad de tener mas BD's<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqMetvXdmYs44Y6F3WKQKQixRiO_9N40o8BQVio0RwyTjo2pIWVjS1yZ_olqjOr5KmWjJWGSqlJy7rEXpA4bEfBNoxpwHpMFdqlWVxoR2vg33UOLNCv9tKj_RnQHCmfQijVm6Dk2R0unP2/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqMetvXdmYs44Y6F3WKQKQixRiO_9N40o8BQVio0RwyTjo2pIWVjS1yZ_olqjOr5KmWjJWGSqlJy7rEXpA4bEfBNoxpwHpMFdqlWVxoR2vg33UOLNCv9tKj_RnQHCmfQijVm6Dk2R0unP2/s320/2.png" width="233" /></a></div>
<br />
<br />
Ahora presentamos nuestra base de datos se compone de 2 tablas: Compania y Empleado<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTeX04KHjW7OW9MU_HPz7ANqZnygZL2qiXIkxjnAupLoj4H8W02MtqJV47oStgmPYYzl9le6TV6DU0q4oBC8nTneZIJj8RE_Eu53jJy5Bj09KszpqBMVuYbFB1fN2xYR8Wi7aZda7ExMr0/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTeX04KHjW7OW9MU_HPz7ANqZnygZL2qiXIkxjnAupLoj4H8W02MtqJV47oStgmPYYzl9le6TV6DU0q4oBC8nTneZIJj8RE_Eu53jJy5Bj09KszpqBMVuYbFB1fN2xYR8Wi7aZda7ExMr0/s400/3.png" width="400" /></a></div>
<br />
<br />
Luego creamos los scripts, serán 3:<br />
<br />
Borrar Tablas<br />
Crear Tablas<br />
Cargar Datos<br />
<br />
Sobre esto ultimo hay muchas variantes, yo he llegado a crear hasta 6 archivos<br />
<br />
Borrar Tablas<br />
Crear Tablas<br />
Cargar Datos Maestros<br />
Cargar Datos Prueba<br />
Cargar Datos Demo<br />
Crear Store Procedure<br />
<br />
En particular me ha servido el de Datos Demo para un despliegue rápido en el caso de alguna demo, y el de Datos Prueba para que en caso de que alguna prueba de Integración que involucre la base de datos falle (sea que deje datos inconsistentes o no) poder rápidamente volver a poner la base de datos en un estado consistente<br />
<br />
bien aqui los Scripts<br />
<br />
Borrado de Tablas
<script class="brush: sql" type="syntaxhighlighter">
<![CDATA[
DROP TABLE IF EXISTS Empleado;
DROP TABLE IF EXISTS Compania;
]]>
</script>
Creacion de Tablas
<script class="brush: sql" type="syntaxhighlighter">
<![CDATA[
CREATE TABLE Compania (
idCompania INTEGER UNSIGNED NOT NULL ,
nombre VARCHAR(200) NULL ,
telefono VARCHAR(20) NULL ,
direccion VARCHAR(100) NULL ,
PRIMARY KEY(idCompania));
CREATE TABLE Empleado (
idEmpleado INTEGER UNSIGNED NOT NULL ,
idCompania INTEGER UNSIGNED NOT NULL ,
nombre VARCHAR(200) NULL ,
apellido VARCHAR(200) NULL ,
edad INTEGER UNSIGNED NULL ,
anioIngreso INTEGER UNSIGNED NULL ,
email VARCHAR(20) NULL ,
PRIMARY KEY(idEmpleado) ,
INDEX Empleado_FKIndex1(idCompania),
FOREIGN KEY(idCompania)
REFERENCES Compania(idCompania)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
]]>
</script>
Carga de Datos:
<script class="brush: sql" type="syntaxhighlighter">
<![CDATA[
insert into compania (idCompania, nombre, telefono, direccion) values(1, 'compania 1', '444-5555', 'Av Los Perdidos s/n');
insert into empleado (idEmpleado, idCompania, nombre, apellido, edad, anioIngreso, email) values(1, 1, 'Jose', 'Perez', 23, 1990, 'afwe@rg.com');
]]>
</script>
<br />
ahora que ya tenemos los scripts debemos escoger una forma de automatizar la ejecución de los mismos; yo usare Ant (http://ant.apache.org/) por que eclipse trae una vista para poder colocar archivos ant y ejecutar las tareas con solo 2 clicks, sin embargo sirve cualquier medio que prefieran: shell scripting, maven etc. el objetivo es no tener que copiar y pegar los archivos en una herramienta, ni tener que generar un backup cada vez, solo invocar un comando.<br />
Crearemos una carpeta donde almacenar el archivo para la ejecución de Scripts la llamaremos (Ant)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg97uKlR66Mh3HwUy6y33RNQZhd_rPuuU0Z0Rv2B0EHTWa6pFqIrqwTwS9dW9LrIlHUf6ALcV1we40kVbvdv4wa7NOD4w_jPR6jSHNFixGTVv01bzZIOh83_BfVHKmCseigHGgYUtISEhR/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg97uKlR66Mh3HwUy6y33RNQZhd_rPuuU0Z0Rv2B0EHTWa6pFqIrqwTwS9dW9LrIlHUf6ALcV1we40kVbvdv4wa7NOD4w_jPR6jSHNFixGTVv01bzZIOh83_BfVHKmCseigHGgYUtISEhR/s320/4.png" width="236" /></a></div>
<br />
<br />
y dentro colocaremos el siguiente script<br />
<br />
<script class="brush: xml" type="syntaxhighlighter">
<![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<project basedir=".." name="Demo Automatizacion" default="reset database">
<property file="WebContent/WEB-INF/classes/jdbc.properties"/>
<property name="lib.dir" value="WebContent/WEB-INF/lib"/>
<path id="master-classpath">
<fileset dir="${lib.dir}">
<include name="*.jar"/>
</fileset>
</path>
<target name="drop objects">
<echo message="Borrando las tablas de la base de datos ubicada en ${jdbc.url}"/>
<sql userid="${jdbc.username}"
password="${jdbc.password}"
url="${jdbc.url}"
driver="${jdbc.driverClassName}"
onerror="continue"
src="ScriptsBD/BDClientes/borrar_tablas.sql">
<classpath refid="master-classpath"></classpath>
</sql>
</target>
<target name="crea objetos">
<echo message="Creando las Tablas de la base de datos ubicada en ${jdbc.url}"/>
<sql userid="${jdbc.username}"
password="${jdbc.password}"
url="${jdbc.url}"
driver="${jdbc.driverClassName}"
onerror="continue"
src="ScriptsBD/BDClientes/crear_Tablas.sql">
<classpath refid="master-classpath"></classpath>
</sql>
</target>
<target name="carga datos">
<echo message="cargando datos en las tablas de la base de datos {jdbc.url}"></echo>
<sql userid="${jdbc.username}"
password="${jdbc.password}"
url="${jdbc.url}"
driver="${jdbc.driverClassName}"
onerror="continue"
src="ScriptsBD/BDClientes/cargar_datos.sql">
<classpath refid="master-classpath"></classpath>
</sql>
</target>
<target name="reset database" depends="drop objects, crea objetos, carga datos">
</target>
</project>
]]>
</script>
<br />
<br />
explicar ant esta mas allá del alcance de este tutorial pero si explicare que hace el script para que puedan saber que modificar cuando lo necesiten:<br />
<br />
<script class="brush: xml" type="syntaxhighlighter">
<![CDATA[
<project basedir=".." name="Demo Automatizacion" default="reset database">
]]>
</script>
<br />
<br />
En esta parte se ponen los datos básicos del proyecto: nombre, directorio base, se ha colocado como valor ".." que es el directorio superior al que tenemos significa que todas las rutas que usemos en el archivo usaran como directorio base la carpeta inmediatamente superior a la que tiene el script es decir si nuestro script esta en: c:\misdocumentos\proyecto\ant y en nuestro script tenemos la ruta: ScriptsBD/BDClientes/borrar_tablas.sql<br />
<br />
entonces la ruta final es: c:\misdocumentos\proyecto\ScriptsBD\BDClientes\borrar_tablas.sql<br />
<br />
<script class="brush: xml" type="syntaxhighlighter">
<![CDATA[
<property file="WebContent/WEB-INF/classes/jdbc.properties"/>
<property name="lib.dir" value="WebContent/WEB-INF/lib"/>
]]>
</script>
<br />
<br />
Aquí se ha definido un archivo donde se han declarado algunas variables y la variable que tiene la ubicación de las librerías necesarias para ejecutar el código sql, en este caso solo es necesario que contenga el driver de conexión a la base de datos<br />
<br />
<script class="brush: xml" type="syntaxhighlighter">
<![CDATA[
<path id="master-classpath">
<fileset dir="${lib.dir}">
<include name="*.jar"/>
</fileset>
</path>
]]>
</script>
<br />
Aquí definimos una ruta para encontrar archivos es la ruta de las librerías e indicamos que solo incluya los archivos tipo .jar<br />
<br />
por último una sección donde definimos una ejecución de Scripts<br />
<br />
<script class="brush: xml" type="syntaxhighlighter">
<![CDATA[
<target name="drop objects">
<echo message="Borrando las tablas de la base de datos ubicada en ${jdbc.url}"/>
<sql userid="${jdbc.username}"
password="${jdbc.password}"
url="${jdbc.url}"
driver="${jdbc.driverClassName}"
onerror="continue"
src="ScriptsBD/BDClientes/borrar_tablas.sql">
<classpath refid="master-classpath"></classpath>
</sql>
</target>
]]>
</script>
<br />
las variables conexión userid, password, url y driver están declaradas en el archivo jdbc.properties que mencione antes esto por que probablemente en tu proyecto sera el archivo que tambien uses para la configuracion de base de datos del mismo, aquí el archivo:<br />
<br />
<script class="brush: plain" type="syntaxhighlighter">
<![CDATA[
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/demo_sync
jdbc.username=root
jdbc.password=password
]]>
</script>
<br />
<br />
por último la última definición se arma usando las definiciones anteriores:<br />
<br />
<script class="brush: xml" type="syntaxhighlighter">
<![CDATA[
<target name="reset database" depends="drop objects, crea objetos, carga datos"></target>
]]>
</script>
<br />
<br />
esta definición borra las tablas, las vuelve a crear y carga los datos<br />
<br />
bien eso es todo, si ponemos el archivo dentro de la vista de Ant podremos ejecutar el archivo con solo ejecutar un doble click<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg53cT1F0j7xVBX5ZQqozXUb8g_NB0s2I_1F1rKykWe7iIHl6bHAfqAOnXqHe9pxhxJuNxnlEVm-wpZghblR26CHNjzItrMsebrwy3XyK3xr6xnkDqSmiN-edWwoiv04REOYGBny6K1oz3V/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg53cT1F0j7xVBX5ZQqozXUb8g_NB0s2I_1F1rKykWe7iIHl6bHAfqAOnXqHe9pxhxJuNxnlEVm-wpZghblR26CHNjzItrMsebrwy3XyK3xr6xnkDqSmiN-edWwoiv04REOYGBny6K1oz3V/s320/5.png" width="320" /></a></div>
<br />
La tarea en azul es la tarea por defecto, la que se ejecutara si damos doble click sobre el nombre del archivo<br />
<br />
al ejecutarla tendremos una salida como la siguiente<br />
<br />
<br />
<br />
<script class="brush: plain" type="syntaxhighlighter">
<![CDATA[
Buildfile: C:\WorkspacePersonal\AutomatizacionBD\demoAutomatizacionBD\Ant\bdDemo_tasks.xml
drop objects:
[echo] Borrando las tablas de la base de datos ubicada en jdbc:mysql://localhost/demo_sync
[sql] Executing resource: C:\WorkspacePersonal\AutomatizacionBD\demoAutomatizacionBD\ScriptsBD\BDClientes\borrar_tablas.sql
[sql] 2 of 2 SQL statements executed successfully
crea objetos:
[echo] Creando las Tablas de la base de datos ubicada en jdbc:mysql://localhost/demo_sync
[sql] Executing resource: C:\WorkspacePersonal\AutomatizacionBD\demoAutomatizacionBD\ScriptsBD\BDClientes\crear_Tablas.sql
[sql] 2 of 2 SQL statements executed successfully
carga datos:
[echo] cargando datos en las tablas de la base de datos {jdbc.url}
[sql] Executing resource: C:\WorkspacePersonal\AutomatizacionBD\demoAutomatizacionBD\ScriptsBD\BDClientes\cargar_datos.sql
[sql] 2 of 2 SQL statements executed successfully
reset database:
BUILD SUCCESSFUL
Total time: 791 milliseconds
]]>
</script>
<br />
<br />
<br />
Como se puede ver al final de la ejecución toma menos de un segundo borrar , crear tablas y poblarlas todo haciendo doble click.<br />
<br />
Entonces como conclusión repasemos las principales ventajas de esta forma de versionar y automatizar el despliegue de la base de datos:<br />
<br />
<br />
<ul>
<li>Rápida generación de la Base de Datos</li>
<li>El código en todo momento tiene la versión de base de datos con la cual trabaja</li>
<li>En caso de realizar un cambio este se propaga rápidamente con un impacto mínimo en tiempo y muy poco propenso a errores al resto del equipo.</li>
<li>En caso de un integrante nuevo basta con descargar la ultima versión y ejecutar el comando en ant para tener la base de datos lista para empezar a trabajar (menos de un segundo)</li>
<li>Una vez terminado el desarrollo se cuenta con los scripts de creación que se deben entregar como parte del producto.</li>
<li>Se pueden automatizar diferentes escenarios de datos: Demo, Pruebas, Datos Maestros, etc.</li>
</ul>
Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com8tag:blogger.com,1999:blog-934951127396497717.post-61015179905415785252012-08-07T04:12:00.000-05:002012-08-09T22:57:08.250-05:00Computacion en la nube explicada a través de la analogía de la Cena de Acción de Gracias.<br />
Hola a todos, esta vez he traducido un excelente artículo de <b><a href="http://www.jpmorgenthal.com/index.htm">JP Morgenthal</a></b> que encontré en InfoQ sobre computación en la nube, el articulo original lo pueden encontrar aquí:<br />
<br />
<a href="http://www.infoq.com/articles/cloud_computing_thanksgiving_parable#">Infoq: Cloud Computing Described Through The Analogy of (US) Thanksgiving Dinner</a><br />
<br />
quiero agradecer a JP autor del articulo y a Roxana Bacila facilitadora de los aportes comunitarios de <a href="http://www.infoq.com/">InfoQ</a> por dar los permisos necesarios para que podamos leer esto aqui, a ambos: Muchas Gracias!!!<br />
<br />
<blockquote>
Pregúntale a una persona técnica lo que es la computación en la nube y obtendrás en mayor parte una respuesta poco consistente que en algunas partes incluye los términos "elástico", "agilidad", "amplio acceso a la red", "dinámico", y "medible". Sin embargo, para la mayoría de las personas buscando entender el rol que la computación en la nube, juega en sus entornos de TI, estas definiciones realmente no responden la pregunta. Esto es por lo que se desarrolló una analogía basada en la cena de acción de gracias, para ayudar a introducir los conceptos de computación en la nube. Hasta ahora esta analogía ha funcionado muy bien en discusiones con clientes para crear una visualización de que intentamos adquirir con la nube y por que es diferente a lo que las aras de TI esta haciendo tipicamente hoy en día.<br />
<a name='more'></a>Vamos a empezar con el trozado del pavo. Cada año invitas a 10 personas para la cena de acción de gracias. Debido a que invitas a las mismas personas cada año, has aprendido después del primer par de años exactamente como dividir un pavo de 18 libras en pedazos que puedan alimentar a todos. Mas aún, sabes exactamente cuanta carne blanca y cuanta carne roja habrá. Adicionalmente, debido a que invitas a las mismas 10 personas cada año, has entendido que piezas prefiere cada uno. El resultado es que cada uno, en su mayoría, está feliz y tu tienes una maravillosa cena. La razón de que diga "en su mayoría", es debido a que algunas personas reciben las piezas menos preferidas; pero no les importa tomando en cuenta lo que hay disponible.</blockquote>
<br />
<blockquote>
Esto muestra en su mayor parte lo que ofrece la Infraestructura como Servicio (IaaS). Hay un pool de recursos (el pavo) y es dividido en trozos pequeños, medianos, y grandes de máquinas virtuales. y hay muy poca desviación de la plantilla trazada. Tienes un monto determinado de memoria, cpu, y ancho de banda asociado con tu selección, Dividir el pool de recursos de esta manera quiere decir que las operaciones pueden ser fácilmente administradas en un entorno en la nube, aseguramos que hay suficiente "pavo" para todos, y que satisface a una audiencia bien conocida. Basados en este enfoque, es fácil monitorear la capacidad y definir las reglas para expandir el pool de recursos. Adicionalmente, el pool es expandido en incrementos fijos, facilitando la adquisición de nuevos recursos.</blockquote>
<br />
<blockquote>
La explicación previa, describe bien en un primer paso el camino para entregar computación en la nube, pero no es computación en la nube. Mas aún las organizaciones en TI aplican este modelo para modelar sus centros de datos físicos como entidades virtuales. Entonces exploremos que pasa cuando nos movemos de la virtualización a la computación en la nube, continuando con nuestra analogia de la cena de accion de gracias.</blockquote>
<br />
<blockquote>
Este año, el loco tío Joe, retorna desde muy lejos y le agradaría asistir a tu cena. Introducir al tío Joe cambia mucho de tu ambiente. Para empezar Joe siempre pide su pavo en una forma en que trastorna totalmente tu método de trozar el pavo. Es decir, Joe quiere una pieza del ave que tu siempre dividías en dos piezas separadas. Además, Joe no pueden estar cerca a Tía Mimi, lo cual quiere decir que la asignación de los asientos también debe cambiar. El problema que tenemos al frente, es: ¿Como acomodas al tío Joe, mientras aun eres capaz de asegurar que haya suficiente pavo para los otros invitados. Y a la vez, asegurarte que no se desate una batalla campal en medio de la cena? Ahora si hablamos de computación en la nube!!</blockquote>
<br />
<blockquote>
Reformulando como un problema operacional: como puedes dividir tu pool de recursos de computo, en una forma dinámica que te asegure que tus clientes existentes continúen recibiendo el servicio en un nivel aceptable, sin añadir recursos - podrías necesitar capacidad adicional pero en este escenario asumiremos que los recursos están ahí, aunque necesitas enfocar la división del pool de forma diferente- y sin permitir que los procesos co-residan cerca a algún otro proceso que tenga la habilidad para limitar la performance de otros. Este es el desafió para las organizaciones de TI cuando se mueven hacia la computación en la nube.</blockquote>
<br />
<blockquote>
Enfoques tradicionales para TI residen en hardware dedicado para aplicaciones específicas. Así, si una aplicación necesita almacenamiento, simplemente añadimos mas disco al arreglo. Si necesitamos mas procesadores, arrojamos un par de blades mas al chasis, o un par de nodos mas al rack. El enfoque de apilar aplicaciones, es raramente impactado por otras aplicaciones corriendo en el centro de datos, debido a que usualmente están separadas, en subredes con controles de calidad de servicio ubicados en los routers. Todo-en-todo, si no fuera insanamente caro y despilfarrador, tal simplicidad tiene un sentido de belleza. Por otro lado, tomemos todas las aplicaciones, arrojemoslas al mismo pool de recursos, y el costo de energía y refrigeración se desploma, la utilización de recursos se dispara (<b>N.T</b>: esto se refiere a que aumenta la eficiencia del uso de recursos: obtenemos mas uso de recursos con un menor costo de operación) y la complejidad general de gestionar el entorno se incrementa exponencialmente. Esto es asumiendo que vas a entregar computación en la nube y no solo virtualización. </blockquote>
<br />
<blockquote>
Para pasar de virtualización a la computación en la nube se requiere un planeamiento significativo, entrenamiento y nuevas herramientas, usando una vez mas nuestra analogia del pavo, una vez que has definido la forma de dividir el pavo, hacerlo año tras año no requiere cambios. Aunque, ahora que Tío Joe aparece, necesitas ayuda para entender como dividir el pavo, de forma que sostenga la petición de Joe sin dejar impacto en la repartición. Si de alguna manera, Tío Joe encuentra una forma de sentarse al lado de Mimi, lo cual sucede, cuando las personas se mueven alrededor para hablar con mayor libertad, esta sera con certeza la cena de acción de gracias de la que la familia hablara por muchos años. Así que además necesitarás jugar el papel de policía de tráfico, conforme la gente se mueva deberás dirigir donde pueden moverse y donde no.</blockquote>
<br />
<blockquote>
El escenario anterior representa la necesidad de herramientas, para soportar la gestión de la capacidad de las soluciones basadas en la nube, control del governance sobre la ejecución de las maquinas virtuales, y herramientas de automatización y orquestación, todo esto para simplificar estas tareas, de forma que no consuman todos los recursos humanos disponibles para administrar y operar el ambiente. Además, estas herramientas son compatibles para la gran mayoría de catálogos de servicios y gestores de nubes. Como puedes ver este es un cambio integral para la mayoría de los entornos en ti</blockquote>
<br />
Bien espero se haya comprendido, es todo por ahora.Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com0tag:blogger.com,1999:blog-934951127396497717.post-73408104406910370072012-06-29T18:23:00.002-05:002012-06-29T18:23:19.856-05:00Dojos y niveles<br />
Esta es una reproduccion de mi articulo en el blog: <a href="http://software-craftsmanship-peru.blogspot.com/2012/06/dojos-y-niveles.html" target="_blank">Software Craftsmanship Peru</a><br />
<br />
Hola, en la comunidad Agile Peru se organiza muchos dojos, de hecho se viene una semana de dojos facilitados por diferentes miembros de la comunidad, he visto que se están armando con niveles (básico, intermedio y avanzado) (actualizacion: se han retirado los niveles) pero no se ha indicado en que consisten estos niveles, esto es un poco difícil pues los dojos son para aprender/practicar algo, y esto es muy difuso pues este algo puede ser desde un lenguaje, framework o técnica pero seria bueno tenerlo en algún lugar para saber si estoy interesado y cual me conviene mas<br />
<br />
Sin embargo creo que principalmente nos centramos en habilidades de programación asi que quiero proponer una escala:<br />
<br />
<a name='more'></a><br />
<br />
<b><u>Basico:</u></b><br />
Pair Programming<br />
TDD<br />
Refactorizaciones sencillas: Cambio de nombre, extraccion de metodos (codigo de producción y de pruebas)<br />
<br />
<b><u>Intermedio:</u></b><br />
Principales Smells y Refactorización de los mismos<br />
Uso de los patrones mas comunes en las soluciones<br />
<br />
<b><u>Avanzado</u></b><br />
Patrones especializados<br />
Técnicas avanzadas de refactorización como patrones de herencia y polimorfismo (para lenguajes orientados a objetos)<br />
Intercambio de maquinas<br />
Intercambio de lenguajes<br />
<br />
Cada nivel asume cierto conocimiento de los niveles anteriores entonces si alguien va a uno intermedio se asume que ya conoce y tiene practica en tdd y pair programming lo que permite concentrarse en los otros aspectos del ejercicio y enfocar el nivel del ejercicio, las preguntas y el apoyo de los facilitadores, también por respeto al esfuerzo de quien prepara el ejercicio y las expectativas de los participantes.<br />
<br />
Como ven he dejado las acrobacias (intercambio de maquinas y lenguaje) hasta el último nivel debido a que esto referencia mas que a una técnica de programación a enfrentarte al cambio de contexto y me parece que esto es algo muy importante pero que pertenece a una etapa mas avanzada, considero que la base es primero conocer bien las técnicas de codificación y algo de patrones de diseño, lo que dejaría a alguien listo para enfrentar una situación en un lenguaje y con una implementación desconocida, pues finalmente una vez que conoces patrones la implementación es solo la forma de expresar un patrón en un lenguaje en concreto, y ya que esto es una analogía de las artes marciales véanlo así: en las artes marciales no peleas ni te dan técnicas avanzadas el primer dia: primero entrenas el equilibrio, respiracion y balance, (lo cual frustra a muchos principiantes) y recién dominados estos puedes entrar a un combate (una situación cambiante donde debes adaptarte y pensar muy rápido similar a lo que sucede cuando tienes que de pronto implementar algo en un lenguaje desconocido y que tiene una implementacion ya creada por otra persona).<br />
<br />
Con esto digo que esta mal lo que se hace? no, me parece genial, solo propongo poner un poco de orden, me parece necesario, antes del dojo simplemente saber en que se basará para saber si es de interes del que piensa participar y dado que siempre la capacidad del local es un limitante ayudaría a que los participantes se autoregulen y si alguien considera que ya conoce el nivel y desea dejarle el lugar a otra persona que lo aprovecharía mejor, pues puede hacerse. También ayudara a tener una meta para poco a poco subir nuestro propio nivel y elevar un poco mas la valla de lo que se viene haciendo, al tener esto seria mas fácil saber el nivel de lo que hacemos y podríamos ver que si bien se hacen muchos dojos que tanto estamos buscando la mejora continua de todos y que nivel de habilidad estamos entrenando.<br />Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com0tag:blogger.com,1999:blog-934951127396497717.post-7559795847802261882012-06-03T05:14:00.001-05:002012-06-03T12:05:34.417-05:00Tesla: El geek mas grande de todos los tiemposEncontré en microsiervos este homenaje que los muchachos de <a href="http://theoatmeal.com/" target="_blank">The Oat Meal</a> han hecho a Nikola Tesla uno de los mayores inventores de la historia y también de los mas robados pues el crédito de casi todas sus invenciones fueron atribuidas a otras personas entre ellas:<br />
<br />
La Radio -no, no fue Marconi-<br />
Los Rayos X -no, no fue Rontgen y en honor a la verdad tesla no los descubrio pero inicio la investigacion en ese campo dejandola pues los consideraba peligrosos para el hombre y saben que? lo son.-<br />
Fue el padre de la era electrica -no, jamas en ningun universo posible fue Edison-<br />
<br />
De hecho Edison aparentemente invento muy poco de lo que se le atribuye, simplemente contrato mucha gente para trabajar en investigación y el patentaba los logros descubiertos (suena familiar a la forma en la que trabaja cierta empresa con una fruta por logo?)<br />
<br />
según citan la rivalidad entre ellos llego tan lejos que Edison llego a pagar a los chicos de su vecindario para que le lleven perros y gatos a los cuales poder electrocutar en publico y generar temor hacia la corriente alterna desarrollada por Tesla.<br />
<br />
lamentablemente murió pobre y solo en un hotel en Nueva York.<br />
<br />
realmente no tiene pierde y si te consideras un aficionado minimo a la tecnologia no puedes dejar de leerlo:<br />
<br />
<a href="http://theoatmeal.com/comics/tesla">http://theoatmeal.com/comics/tesla</a>
<br />
<br />
hay muchas cosas ciertas incluyendo varias criticas al papel de Edison como empleador y quien robara muchas de las creaciones de Tesla<br />
Algunas extractos:<br />
<ul>
<li>Un Geek es alguien que desarma el mundo para después volverlo a armar con nuevas características.</li>
<li>Un Geek repara cosas que ni siquiera estaban descompuestas.</li>
<li>Edison no era un Geek era un CEO. </li>
<li>Tesla era conocido por inventar cosas geniales y después olvidarlas, Edison por correr a la oficina de patentes cuando alguno de sus empleados inventaba algo nuevo.</li>
<li>Tesla era un jodido genio (y si, yo agregue lo de jodido y en mas de un sentido)</li>
</ul>
<br />Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com1tag:blogger.com,1999:blog-934951127396497717.post-15200491546234518242012-06-02T23:11:00.000-05:002012-06-02T23:13:12.049-05:00Gears Of Wars: JudgmentDesde que en la oficina tenemos Xbox 360 y que los unicos juegos que tenemos eran Gears of War 1 y 2 me he vuelto fan de la saga, no solo por la buena jugabilidad si no por el buen guion que tienen los personajes en particular el sentido del humor de los personajes secundarios: Augustus 'Train' Cole ex estrella de <a href="http://gearsofwar.wikia.com/wiki/Thrashball">trashball</a> y Damon Baird un soldado bastante cinico pero muy bueno para las reparaciones de emergencia.<br />
<br />
pues bien al parecer en este E3 se hara publico un trailer sobre esta nueva saga todo parece apuntar que estamos frente a una nueva trilogia que sera estelarizada por estos dos personajes y que estaria a cargo como siempre de Epic Games y desarrollado por "<a href="http://www.peoplecanfly.com/blog/" target="_blank">People can fly</a>" (quienes estan contratando por cierto asi que si tienes ganas de probar suerte pues puedes escribirles) desde gameinformer han soltado 2 imagenes como adelanto que muestran a ambos personajes esposados y acompañados por soldados de la CGO aqui las imagenes (click para verlas en mayor tamaño)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfSzkgsyUONbEekni2sQlXkdb-ljt9l87FLhdeS45D2iD_l67Q00rBtIKEjNOPu9IBTgi_Q2UGuPtqVSuxfgV5Q-tINafFf3Lv-0MPq6SsPVphk43Vnopv_x92rKFvwunK6DIT2sCHtKou/s1600/020612_gowju_01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="189" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfSzkgsyUONbEekni2sQlXkdb-ljt9l87FLhdeS45D2iD_l67Q00rBtIKEjNOPu9IBTgi_Q2UGuPtqVSuxfgV5Q-tINafFf3Lv-0MPq6SsPVphk43Vnopv_x92rKFvwunK6DIT2sCHtKou/s320/020612_gowju_01.jpg" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIZg-2pltPhhd-c7bXZ7xNcmt2tsfnLpYCd5GvI8hmQ7RWI3Y7H0I-Ov_-MuV9rwbDUWaPfnicdAEPjCPZqWF3nudjHVy7NQ8ZBS1Hlsq-p0fO8UYg84iRDArTSahyphenhyphen90zCPlR1RuK9RxoW/s1600/020612_gowju_02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="189" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIZg-2pltPhhd-c7bXZ7xNcmt2tsfnLpYCd5GvI8hmQ7RWI3Y7H0I-Ov_-MuV9rwbDUWaPfnicdAEPjCPZqWF3nudjHVy7NQ8ZBS1Hlsq-p0fO8UYg84iRDArTSahyphenhyphen90zCPlR1RuK9RxoW/s320/020612_gowju_02.jpg" width="320" /></a></div>
<br />Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com0tag:blogger.com,1999:blog-934951127396497717.post-11174524990032801812012-06-02T14:45:00.000-05:002012-06-02T14:48:52.054-05:00Nuevo trailer : Tomb RaiderDespués de mucho tiempo pongo una entrada sobre mis pasatiempos asi que sera sobre uno bastante comun :D VideoJuegos<br />
<div>
<br /></div>
<div>
Los chicos de Square Enix han lanzado el trailer para la nueva edicion de la saga de Lara Croft : Tomb Raider "Crossroads"</div>
<div>
<br /></div>
<div>
Las imágenes se ven espectaculares esta vez todo inicia cuando Lara ha sido capturada e intenta huir haciendose con todo el equipo que pueda por si misma: arco y cuchillo, me ha gustado especialmente el ver un heroe en los momentos en que se siente en shock, desvalido y sin saber como escapara de esta o si podrá hacerlo </div>
<div>
<br /></div>
<div>
<iframe width="640" height="360" src="http://www.youtube.com/embed/JkBZ6kKeoTI" frameborder="0" allowfullscreen></iframe>
<br />
<br />
<br />
Tambien puedes entrar al <a href="http://www.youtube.com/TombRaider" target="_blank">canal de Tomb Raider en Youtube</a></div>Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com0tag:blogger.com,1999:blog-934951127396497717.post-43434733943123062712012-06-02T11:48:00.001-05:002012-06-02T14:46:25.164-05:00Usar ORM o SQL Plano?Hola este es un post que escribo a Raíz de una consulta que se lanzó en el la lista de correo ITP-Java, pueden ver el hilo <a href="https://groups.google.com/d/topic/itp_java/l8kh2mgGoqE/discussion" target="_blank">aquí</a>:<br />
<div>
<br /></div>
<div>
La consulta en cuestión eran las principales diferencias entre usar un framework ORM o acceder directamente a través de SQL a la base de datos y las ventajas de uno u otro enfoque<br />
<div>
<br /></div>
<div>
La principal diferencia entre ORM y SQL es el hecho que ORM mapea las entidades del mundo relacional (También conocidas como Tablas, la mayoría) hacia objetos del mundo orientado a Objetos.</div>
</div>
<div>
<br /></div>
<div>
De la misma forma desde mi punto de vista una de las principales ventaja que encuentro, es que cuando ejecutas un query, ya no tendrás que revisar el modelo para recordar las tablas involucradas en el query, con orm puedes basarte en las relaciones entre tus objetos, usar polimorfismo e igualdades entre objetos, etc.<br />
<br />
Otra ventaja es el nivel de granularidad que puedes lograr en el mundo relacional tienes solo 2 niveles: Tabla y Columna por ejemplo si quieres acceder a otras entidades tienes que aplicar joins, para acceder a toda la información que necesitas (del álgebra booleana si no te salvas aunque con orm se reduce bastante la complejidad de esta) además del cambio de contexto pues debes dejar de pensar en objetos y cargar el paradigma relacional<br />
<br />
por ejemplo si tenemos una tabla salón que tiene una columna con el numero de salón y queremos el salón 304 haríamos algo como esto:<br />
<br />
<script class="brush: sql" type="syntaxhighlighter">
<![CDATA[
Select * from Salon where salon.numero=304<br />
]]>
</script>
<br />
simple, pero como mencione si tenemos que agregar mas entidades veremos como la complejidad de la sentencia crece al agregar joins tomar en cuenta las columnas igualdades etc.<br />
<br />
Por otro lado imaginemos que un horario se lleva a cabo en un salón si queremos saber todos los horarios que se llevan acabo en el salón 304 en hql (el lenguaje de querys de hibernate) simplemente tenemos que hacer:<br />
<br />
<script class="brush: sql" type="syntaxhighlighter">
<![CDATA[
from Horario h where h.salon.numero=304<br />
]]>
</script>
<br />
donde "h" es el alias para el la clase "Horario" la cual tiene un atributo "salon" el cual tiene un atributo "numero" y ese es el que igualamos a 304. Como se puede ver en este tipo de querys puedes "navegar" por los niveles de tu red de objetos tanto como lo desees y delegando al framework de persistencia el construir la sentencia sql necesaria para representar la búsqueda esto además evita que tengas que cambiar del contexto orientado a objetos al contexto relacional<br />
<br />
Explicada esta ventaja menciono las otras ventajas que considero importantes:<br />
<br />
<br />
<ul>
<li>Consultas en el el mundo orientado a objetos</li>
<li>Puedes manejar conceptos como herencia y polimorfismo en las clases que representan las entidades</li>
<li>Puedes manejar relaciones bidireccionales en las clases que representan las entidades es decir: que en el lenguaje relacional, una tabla conoce que tablas esta referenciando pero no puede saber que tablas la referencian; sin embargo cuando hablas de objetos una Clase puede tener un atributo para la clase referenciada y la clase referenciada puede tener un arreglo de todas las clases que la referencian</li>
<li>Portabilidad orm es agnóstico del dialecto sql, esto es que , al ser el framework quien genera las sentencias sql y tu usar un lenguaje intermedio para tus consultas, puedes portar tu aplicación entre diferentes motores sin modificar tu capa de persistencia</li>
</ul>
<br />
<br />
Pero como todo en la vida lo bueno tiene un precio y orm no es la excepción:<br />
<br />
<ul>
<li>Al ser el framework quien genera las sentencias sql debes estar atento a consultas muy pesadas que se puedan generar por un mal mapeo de las entidades y que estas usen demasiados joins (podrías terminar haciendo un join con 7 tablas cuando lo único que querías es la descripción del objeto)</li>
<li>La performance es mas baja que accediendo directamente a la base de datos pues estas incluyendo una capa que podría no ser necesaria, si la persistencia y el modelo de datos no es complejo, digamos que una aplicación que solo requiere hacer inserciones o búsquedas simples sobre un modelo sin muchas relaciones podría ser mejor hacerla en sql plano</li>
<li>Dependiendo del framework que uses también puedes hacer consultas en sql nativo sin embargo no recomiendo abusar de ello , si se cae en eso se debería reevaluar la razón por la que se decidió usar un framework orm pues no se esta aprovechando o simplemente nunca tuvo sentido.</li>
</ul>
<div>
si te he convencido y quieres empezar a ver algunos frameworks pero no sabes cuales existen en tu lenguaje aqui puedes encontrar algunos<a href="http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software" target="_blank"> frameworks ORM en diferentes lenguajes</a> gracias a wikipedia</div>
<br />
<br />
<br />
<br />
<br />
</div>Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com4tag:blogger.com,1999:blog-934951127396497717.post-48473233936884542682012-05-20T10:37:00.000-05:002012-05-20T11:59:07.212-05:00Horas extras, Amanecidas y Ritmo Sostenible<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBmiS7L-EvDFy62BJyJnCKb6FFObDmfflBT4mp8XxmcHXsjVimfmPEcQpoiPL-MFN9mhm4CXANJZKCChDX3dNlM8a4hfTwvfcRc5NWj6XIzbBCQ9prz3hQn54eOWMGY4ZTLlhjN-NCBzTf/s1600/work+time.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBmiS7L-EvDFy62BJyJnCKb6FFObDmfflBT4mp8XxmcHXsjVimfmPEcQpoiPL-MFN9mhm4CXANJZKCChDX3dNlM8a4hfTwvfcRc5NWj6XIzbBCQ9prz3hQn54eOWMGY4ZTLlhjN-NCBzTf/s400/work+time.jpg" width="384" /></a></div>
En nuestro querido Perú estamos acostumbrados por decirlo de una forma positiva al "amor al trabajo" al punto de darle muchas mas horas que las acostumbradas 8 horas obligatorias, yo mismo puedo declararme un workholic, sin embargo ahora que tengo gente a mi cargo no había notado que puedo dar la impresión ( y muy equivocada) de que espero lo mismo de los demás, esto me golpeó la última semana en la que junto a uno de los miembros de mi equipo estábamos tan entretenidos con resolver un problema que no nos dimos cuenta que nos habíamos pasado mas de hora y media de la hora de salida, esto junto con algunas bromas de la jefa de Recursos Humanos de la empresa (quien estaba de salida y nos vio aun trabajando), si bien todo fue en buena onda reflexione al respecto.<br />
<br />
<a name='more'></a><br />
<br />
Al día siguiente tocaba retrospectiva y coloque el tema sobre la mesa como algo que impactaba negativamente el proyecto, ya me imaginaba lo que iba a suceder, el paradigma cultural es que esto es normal ya que si estas con "la inspiración" o como yo lo llamo: "la zona". Pues no es recomendable cortar el trabajo pues al día siguiente te tomará mas esfuerzo retomar las cosas, otro argumento fue que generalmente en la ultima hora y media o así antes de la hora oficial de salida "te llega la inspiración" que como lo veo no es mas que un poco de presión o ansiedad por avanzar lo que no has podido avanzar durante el día, ambas respuestas no me parecieron que justificaban el sobre tiempo por lo siguiente:<br />
<br />
<ul>
<li>Si bien es cierto que hay cierto dinámica cuando uno trabaja intensivamente en un problema, decir que no podrás retomarlo después implica que podrías estar usando código que no es fácil de comprender o peor aun que no esta testeado (por ello necesitas continuar en ese momento para recordar que funciona y que no), dejar cosas en estado inconsistente y por consecuencia, que cuando se le deba dar mantenimiento por correcciones o cambios sera igual de trabajoso de hacer.</li>
<li>El dar por sentado que se hará sobre tiempo puede llevar a la falsa promesa de "después me pongo al día" y no dar el máximo durante el horario normal, esto es particularmente peligroso cuando se programan amanecidas de forma continuada pues durante el día uno esta tentado a no trabajar al ritmo adecuado para "reservar energías" para la noche, lo cual es una mentira, pues durante la noche como ya estamos agotados por el día de trabajo de todas formas no podemos tener el mismo desempeño y las "energías guardadas" no sirven de nada y solamente nos desgastamos por nada.</li>
<li>Uno debe tener una vida! luego del trabajo uno debe descansar para recuperar su capacidad de concentración, despejar la mente y al día siguiente llegar descansado y listo para 8 horas de trabajo intensivo nuevamente, durante las horas fuera del trabajo uno puede seguir viendo temas relacionados a su carrera si lo desea; pero estos no deberían ser necesariamente del trabajo podría ser practicar cosas nuevas o ampliar conocimientos sobre algo, por ultimo bajo ningún concepto se debería descuidar el equilibrio entre la vida profesional y la vida personal pues siempre que este equilibrio se altera el lado aparentemente favorecido siempre se ve afectado negativamente.</li>
</ul>
<div>
Aquí es donde entra en juego el término Ritmo Sostenible y es justamente el ritmo de trabajo que nos permite trabajar con máximo desempeño de forma prolongada.</div>
<div>
<br /></div>
<div>
Entonces esto significa que no debe hacerse sobre tiempo? pues depende, el sobre tiempo nunca es bueno dejemos eso en claro, sin embargo a veces puede ser necesario y tolerable mientras no sea por mucho tiempo, por ejemplo un pequeño impulso extra durante el cierre del proyecto o un pase a producción podría ser necesario mientras después se permita que el equipo recupere fuerzas.</div>
<div>
<br /></div>
<div>
Ah! y por si tienen curiosidad sobre como se resolvió el tema en mi retrospectiva?, pues establecimos como acuerdo que a lo mas nos quedaremos 30 minutos extra como máximo tras la hora normal de salida. Y me siento muy orgulloso de decir que hasta ahora no hemos excedido de los 10 minutos extras solo para estabilizar el proyecto sincronizar versiones y efectuar labores pequeñas.</div>Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com0tag:blogger.com,1999:blog-934951127396497717.post-86181163464203148522012-05-17T22:53:00.000-05:002012-05-17T22:53:38.303-05:00La CulpaNunca he sido partidario de tratar mal a la gente, me gusta decir que si alguien se equivoca, bueno se equivocó nadie se va a morir solo es necesario tener mas cuidado y corregirlo, pero como alguien se siente tras un error es un cantar distinto, cuando me equivoco nunca he podido evitar sentir algo de rabia y frustración, muchas veces cuando intento algo nuevo (lo cual creo que es genial y todos deberían hacer), aunque equivocarme me haga sentir como una basura, si así de fuerte, no me gusta me importa lo que hago y me gusta que este bien hecho, no solo debe funcionar ademas debe ser bueno y fácil de comprender.<br />
<br />
Una vez vi este episodio de Dr House y me hizo sonreir por que como House trata a Foreman es exactamente como me trato a mi mismo tras un error<br />
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="480" src="http://www.youtube.com/embed/cNDgjFIsJbk" width="640"></iframe>
</div>Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com0tag:blogger.com,1999:blog-934951127396497717.post-88073952316826126152012-03-28T22:14:00.000-05:002012-03-29T11:35:55.522-05:00El otro post sobre el Piura Agile Day 2012<div style="text-align: center;">
<br /></div>
Uzi ya presento el primer post sobre el evento lo puedes ver <a href="http://theagileroad.blogspot.com/2012/03/piura-agile-day-2012.html">aqui</a>, esta es mi version del mismo evento :)<br />
<br />
El 23 de Marzo del 2012 sera recordado como el dia en que se realizo el primer evento de la comunidad Agile Peru en provincia. concretamente en la calurosa ciudad norteña de Piura, Gracias al trabajo de Uzi Mamani (@uzigula) quien asumio el reto de coordinar la logistica y buscar el apoyo de la Universidad Cesar Vallejo de Piura.<br />
<br />
Unas semanas antes, luego de anunciar en la lista de correo la iniciativa, Servidor decidio apoyar con su grano de arena y me ofrecí a dar una charla sobre Software Craftsmanship la cual fue bien recibida e incluida en el programa del evento y desde aquí quiero dar las gracias por permitirme compartir.<br />
<br />
<br />
<a name='more'></a><br />
<br />
<br />
Luego de 15 horas de viaje en Bus llegue a la calurosa Piura, debo decir que no es broma lo que dicen sobre el calor, es realmente fuerte (mas si has pasado las ultimas 15 horas en un bus, comodo y con aire acondicionado) Uzi me comento que tenia suerte pues la temperatura habia bajado un poco, luego de llegar al hotel (me hospede en el hotel Perú muy cerca a la plaza de Piura muy cómodo y amable el personal del mismo) y descansar un poco. Nos volvimos a reunir para almorzar, fuimos al restaurante turístico Los Cantaros cerca a la plaza de Piura donde pude probar Mala Rabia un plato que solo se hace algunos viernes previos a Semana Santa y obviamente su infaltable cerveza Malta para acompañar. Debo confesar que no soy muy amante del pescado fuera del ceviche pero el plato es excelente, realmente es una lástima que no se prepare regularmente.<br />
<br />
Llego el momento y nos dirigimos a la Universidad, el local tenia una capacidad para 200 personas. sinceramente para ser el primer evento en Piura mis expectativas eran de encontrarme con un público de alrededor de 20 personas sin embargo conforme empezaba e iba contando, la audiencia aumentaba mas y mas cuando llegue a los 50 decidi dejar de contar y concentrarme en el evento.<br />
<br />
Fue un evento con apoyo de las autoridades de la Universidad gracias al Ing. Aldo Pereda y al Director de la Escuela de Ingenieria de Sistemas Ing. Marlon Martínez quienes dieron las facilidades para que el evento se diera por todo lo alto, todo esto me sorprendió gratamente pues no iba preparado para tanta acogida, comenzamos con la presentación de Uzi quien dio su charla titulada "Software throught The Agile Way" una charla introductoria donde abarco temas como Lean, Scrum, el manifiesto agile, principios y valores de la filosofia Agile y por que es una alternativa al desarrollo de software tradicional la charla duro alrededor de una hora despertando inquietud y dudas saludables en el publico, servidor logro grabar casi toda la charla la cual estara disponible muy pronto pero como adelante aqui tienen las diapositivas de la misma.<br />
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br />
<div id="__ss_12185082" style="width: 425px;">
<strong style="display: block; margin: 12px 0 4px;"><a href="http://www.slideshare.net/uzigula/the-agile-road-12185082" target="_blank" title="The agile road">The agile road</a></strong> <iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/12185082" width="425"></iframe> <br />
<div style="padding: 5px 0 12px;">
View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/uzigula" target="_blank">Uzi Mamani fernández</a> </div>
</div>
</div>
<div style="text-align: center;">
<br /></div>
Luego llego el turno de servidor, presente la charla Software Craftsmanship es una charla introductoria al pensamiento craftsmanship abarque, el manifiesto craftsmanship, la necesidad de un nuevo enfoque sobre el desarrollo de software y la importancia de recordar que sin importar las metodologías de gestión finalmente son las personas las que escriben y construyen el software por lo que es importante no perder de vista que debemos crear un ambiente que promueva la mejora profesional. De esta charla lamentablemente no pudo grabarse mucho debido a que la bateria de la camara que lleve murio<br />
<br />
<br />
<div id="__ss_11818305" style="width: 425px;">
<strong style="display: block; margin: 12px 0 4px;"><a href="http://www.slideshare.net/grubhart/software-craftsmanship-11818305" target="_blank" title="Software Craftsmanship">Software Craftsmanship</a></strong> <object height="355" id="__sse11818305" width="425"> <param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=softwarecraftsmanship-120301101524-phpapp02&rel=0&stripped_title=software-craftsmanship-11818305&userName=grubhart" />
<param name="allowFullScreen" value="true"/>
<param name="allowScriptAccess" value="always"/>
<param name="wmode" value="transparent"/>
<embed name="__sse11818305" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=softwarecraftsmanship-120301101524-phpapp02&rel=0&stripped_title=software-craftsmanship-11818305&userName=grubhart" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" width="425" height="355"></embed> </object> <br />
<div style="padding: 5px 0 12px;">
View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/grubhart" target="_blank">Edson Chávez</a> </div>
</div>
<br />
Luego de ambas charlas se abrio una ronda para preguntas del público, entre el publico habia estudiantes, miembros de la comunidad universitaria, y profesionales de consultoras de la región, hubieron preguntas sobre estimación de tiempos, alcance, negociación con el cliente, como aplicar prácticas agiles a entornos mas tradicionales etc. incluso alguien que estaba haciendo su tesis aplicando scrum! Luego de terminado el tiempo destinado para usar el auditorio nos quedamos conversando buen rato afuera de la universidad bajo la lluvia lo que demuestra el interés y entusiasmo de la comunidad local por el tema.<br />
<br />
Por último despues del evento salimos al respectivo after party cena y un par de piscos sour para festejar el exito del evento, reconozco que nos excedimos en los piscos pues a la mañana siguiente apenas si pude despertarme para ir por los famosos chifles piuranos al mercado y luego a la estación para regresar a Lima.<br />
<br />
En resumen fue una grata jornada de agilidad y compañerismo compartiendo entre todos conocimiento, dudas y entusiasmo por hacer mejor las cosas<br />
<br />
<br />
<br />Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com1tag:blogger.com,1999:blog-934951127396497717.post-41583856867867621752012-03-18T13:55:00.001-05:002012-03-18T13:55:42.676-05:00Convertir vídeos de Youtube a mp3Hola una entrada pequeña para avisarles que encontré una web que permite este servicio sin registrarse y gratis, con una calidad bastante decente, la única observación es que permite solo 15 conversiones por cada media hora<br />
<br />
la dirección es<br />
<br />
<a href="http://www.youtube-mp3.org/">http://www.youtube-mp3.org/</a><br />
<br />
la interfaz es bastante sencilla solo pega el enlace al video en youtube (el que aparece en la sección share del vídeo) y presionas convert video, la pagina se encarga del resto terminada la conversión puedes descargarloGrubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com1tag:blogger.com,1999:blog-934951127396497717.post-24940120967698016962012-01-14T12:38:00.000-05:002012-03-29T11:43:15.566-05:00La Carta (Traducción)Este es un post que traduzco del Blog de Uncle Bob en <a href="http://blog.8thlight.com/uncle-bob/2012/01/12/The-Letter.html">8th Light</a> luego de que me diera su consentimiento para hacerlo, es justo de lo que hablo cuando me refiero a la calidad del trabajo que cada uno hace y como a veces a los clientes presionan por lograr cronogramas mas ajustados sin pensar en la calidad y mantenibilidad, en la vida util del software y tiempo de respuesta frente a modificaciones futuras del producto entregado, bastando con que funcione de alguna forma. Sin agregar mucho mas los dejo con la traducción del post; el original lo encuentran <a href="http://blog.8thlight.com/uncle-bob/2012/01/12/The-Letter.html">aqui</a><br />
<br />
<blockquote style="font-family: arial; font-size: small;" type="cite">
<div>
<div>
La Carta</div>
<div>
<br /></div>
<div>
Necesitamos volvernos una profesión autorregulada y <wbr></wbr>auto vigilada, Las apuestas son simplemente demasiado altas para mantener el actual limbo adhoc de hackers, héroes y ermitaños</div>
<div>
<br /></div>
<div>
Considera con cuanto software interactuas cada día, la alarma de tu reloj, tu teléfono celular, la televisión y la tv por cable, el control remoto, tu horno tostador, tu reloj, tu auto, el tren al trabajo, la caja registradora en Starbucks , la cafetera en Starbucks, el elevador al que subes, etc, etc. la lista es virtualmente interminable, Casi cada aspecto de nuestras vidas diarias , casi cada rincón de nuestra civilización es de alguna forma tocada, controlada, gestionada, o influenciada por software.</div>
<div>
<br /></div>
<div>
Piensa acerca de ello nuevamente, virtualmente cada aspecto de nuestras vidas, tiene un componente de software, y sin embargo no se ejerce ningún control reglamentario sobre la escritura de ese software. Cualquier Harry Hacker con una "J" en su nombre puede ser contratado para escribir Código Java. Y es muy probable que el código de este Harry J Hacker. sera una basura, este mal y no sea explicitamente testeado antes de ser entregado.</div>
<div>
<br /></div>
<div>
Los plomeros son regulados, los electricistas son regulados, arquitectos, abogados, y doctores son regulados. Por que nosotros no?, Yo no quiero que el gobierno sea el regulador, Quiero que nos auto regulemos, pero si los desarrolladores de software no sabemos como hacerlo, entonces el gobierno se involucrará. Y entonces la vida se volverá realmente mala.</div>
<div>
<br /></div>
<div>
Ayer recibí una muy inquietante carta que resalta dramáticamente estos puntos. Pensé que les agradaría leerla. Trabaje con el desarrollador para limpiarla de forma que la gente inocente en esta historia no sea castigada. Aunque lamento no poder aplastar los nombres de los culpables en twitter.</div>
<div>
<br /></div>
<div>
<i>Hola "Uncle Bob",</i></div>
<div>
<i><br /></i></div>
<div>
<i>Soy un Programador freelance de 34 años quien ha estado desarrollando Software por 15 años.</i></div>
<div>
<i><br /></i></div>
<div>
<i>Algún tiempo atrás , fui contratado como líder de equipo para un sistema embebido de seguridad critica que controlaba un dispositivo para cirugías médicas. Todo fue bien durante los primeros meses. Puse mucho esfuerzo en la arquitectura de la seguridad. Use Active -Objects para la seguridad de los hilos. Máquinas de estado generadas por uml para los chequeos de seguridad de los controles, simulación y muchas pruebas unitarias (Aunque no con cobertura completa).</i></div>
<div>
<i><br /></i></div>
<div>
<i>Oh las cosas no fueron perfectas. Nos habían pedido terminar un proyecto de 4 años en menos de 1 año, entonces, la presión era muy alta. Incluso así tenia una buena sensación que el dispositivo podría ser seguro para millones de tratamientos.</i></div>
<div>
<i><br /></i></div>
<div>
<i>Eventualmente se volvió claro que no podríamos entregar todo el producto a tiempo. Cuando se lo dijimos al gerente, empezó a preocuparse por su bono. (Al menos eran mis sospechas), Cuando le dije que no podríamos lograr el plan, me dijo que no permitiría que hagamos mas estimaciones. Él gritó mucho durante todo el día y nos forzó a trabajar 7 días durante una semana. Tenia tanta ira, que incluso intimidó al equipo de validación para que terminaran la validación médica oficial en apenas unos días. Lo cual era demasiado pronto.</i></div>
<div>
<i><br /></i></div>
<div>
<i>Él sabia que la seguridad era el punto mas importante para mi, entonces empezó a cortar mis responsabilidades. Eventualmente le dio el control completo del proyecto al programador mas joven e impresionable de mi equipo, Continué codificando en la rama principal de código del proyecto; entonces el gerente hizo su propia rama del código y, junto con el rookie, produjo su propia versión del software.</i></div>
<div>
<i><br /></i></div>
<div>
<i>Entonces terminé mi contrato con la compañía.</i></div>
<div>
<i><br /></i></div>
<div>
<i>Unos cuantos días después el primer bug ocurrió durante un ensayo humano. Afortunadamente, durante los primeros días del proyecto, había hecho el software lo suficientemente robusto para que ese bug no lastimara al paciente. El dispositivo solo dejó de operar antes de iniciar la cirugía automática. <wbr></wbr>Pensarías que esta seria una llamada para reaccionar, pero la compañía ni siquiera analizo el bug (sin mencionar el detener un producto inestable). mas bugs fueron encontrados después.Incluso bugs obvios como mezclar las direcciones de la cirugía (arriba/abajo) fueron encontrados durante los primeros tratamientos en humanos. Es una posibilidad real, y uno de mis mas grandes temores, que mañana algún paciente sea severamente lastimado</i></div>
<div>
<i><br /></i></div>
<div>
<i>Los otros programadores no renunciaron. Ellos me dijeron: "El jefe es el jefe - solo hacemos lo que el nos dice - es su responsabilidad.". Entonces pensé que debí estar loco por renunciar, sentí que era débil e inútil. por que no pude manejar la presión. Pero después de eso, empece a leer "Clean Coder". y eso me hizo considerar que quizás, no soy tan débil - si no lo opuesto : Fuerte.</i></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Estoy por su puesto, furioso por el Gerente que hundió su organización a tan profundos abismos de falta de profesionalismo. Él es un idiota y un criminal, y espero que termine en prisión. Pero también estoy enfadado con los desarrolladores. No solo fueron cómplices de una idiotez criminal; Hicieron que el único chico que tomo una postura se sintiera estúpido y débil. Ellos son los estúpidos y débiles. Ellos no deberían ser programadores. Los programadores somos mejores que eso.</div>
<div>
<br /></div>
<div>
¿Lo somos?</div>
</div>
</blockquote>
<br />
Esta demás decir que estoy totalmente de acuerdo con lo mencionado aquí, cuando se empiece a notar la necesidad de una regulación y el estado tome cartas en el asunto (Mas alla de la norma tecnica existente) se volverá cada vez mas difícil innovar y probar nuevas técnicas (quien halla tenido que trabajar con el estado puede dar fe de lo burocrático que puede ser entregar una pieza sencilla de software trabajando) en resumen es momento de tomar responsabilidad por lo que hacemos y no ceder a las presiones de tiempos y horarios, un ejemplo que suelo dar es que ir a un equipo técnico es como ir con un medico cuando algo te duele, sabes que algo no esta bien pero no discutirás los exámenes y el tratamiento que un medico te dé lo seguirás al pie de la letra para recuperarte, con un desarrollo de software debería ser igual uno sabe que necesita algo pero solo el equipo de desarrollo conoce las técnicas y herramientas para hacerlo de la mejor forma, entonces, ¿por que no los dejamos hacer su trabajo y lo respetamos incluyendo sus estimaciones y desiciones?, y para los desarrolladores: ¿por que dejamos que nos presionen y no defendemos mas nuestra posición? mas aun toleramos tiempos ajustados, hackeamos nuestro propio código para torcerlo hasta que haga lo que nos pidieron con un nuevo cambio en lugar de rediseñar y velar por la mantenibilidad del sistema en general, generamos deuda técnica que nunca pagamos y no hacemos tests. Hasta cuando seguiremos con esa actitud? como dice el Tio Bob creo firmemente que los desarrolladores somos mejores que eso. solo tenemos que empezar a creernoslo.Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com0tag:blogger.com,1999:blog-934951127396497717.post-56262093852594122492012-01-14T12:01:00.001-05:002012-01-14T12:01:50.148-05:00El Nerd testBien tontenando decidi hacer un test para saber que tan Nerd soy con orgullo debo decir que he obtenido un grandioso 98 y soy considerado un dios nerd :D<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.nerdtests.com/ft_nq.php" style="margin-left: 1em; margin-right: 1em;">
<img alt="I am nerdier than 98% of all people. Are you a nerd? Click here to take the Nerd Test, get nerdy images and jokes, and talk on the nerd forum!" src="http://www.nerdtests.com/images/ft/nq/21991e3bef.gif" /></a></div>
Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com1tag:blogger.com,1999:blog-934951127396497717.post-2252986585228841902011-12-23T23:16:00.001-05:002011-12-23T23:17:41.472-05:00Cambio por un DolarEste es un vídeo de <a href="http://www.shesalwayswright.com/" style="color: #1155cc; font-family: arial, sans-serif; font-size: 13px;" target="_blank">Sharon Wright</a> que vi en la página de microsiervos y no pude resistirme a hacer el repost me parece adecuado para esta época ya que a pesar de no tener ningún símbolo navideño no deja de recordarme a santa claus. Para poner algo de contexto en ingles se dice change a las monedas menores que un dolar pero esta palabra también significa cambio, se hace un juego de palabras entre usar monedas y cambiar las cosas, además de que no he podido evitar pensar que el personaje principal es una especie de santa claus que con sus regalos nos da ese "cambio" que a veces tanto necesitamos<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="360" src="http://www.youtube.com/embed/9DXL9vIUbWg?hd=1" width="640"></iframe>
<br />
<br />Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com0tag:blogger.com,1999:blog-934951127396497717.post-82733613057503884392011-07-23T04:25:00.000-05:002014-10-08T11:04:36.004-05:00Libro Gratis: Jenkins La Guia DefinitivaSi no eres nuevo en <a href="http://es.wikipedia.org/wiki/Integraci%C3%B3n_continua">integración continua</a> debes haber oido hablar de <a href="http://hudson-ci.org/">hudson</a> y <a href="http://jenkins-ci.org/">Jenkins</a> este último es un fork del primero tras la compra de Sun por Oracle. Pues bien <a href="http://www.wakaleo.com/about-us/about-wakaleo-consulting">John Ferguson</a> ha redactado para la editorial O'reilly el libro <a href="http://www.wakaleo.com/books/jenkins-the-definitive-guide/download-jtdg-pdf">Jenkins: The Definitive Guide</a> el cual tambien sirve si usamos Hudson, entre otras cosas el libro indica como automatizar los procesos de compilación, integración del release y despliegue.<br />
<br />
Lo mejor de esto es que el libro es un libro open source publicado bajo la licencia creative commons lo que hace que pueda ser descargado gratis desde la página de la consultora de John: <a href="http://www.wakaleo.com/books/jenkins-the-definitive-guide/download-jtdg-pdf">Wakaleo Consulting</a><br />
<br />
Pues bien no hay excusa para no descargarlo y echarle una mirada, su equipo de desarrollo lo agradecerá.Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com0tag:blogger.com,1999:blog-934951127396497717.post-4848385337319636762011-03-26T05:49:00.000-05:002012-01-14T11:46:07.575-05:00Robert C Martin Oredev 2008 - Keynote - The Renaissance of CraftsmanshipEncontre este video de una charla que dio 'Uncle Bob' Robert C Martin en el 2008 sobre craftmanship, mucho de lo dicho esta en su libro Clean Code, y lo recomiendo para todo aquel que quiera seguir este camino de mejorar el codigo un poquito a la vez, el video esta en ingles sin subtitulos y dura aproximadamente una hora<br />
<br />
<br />
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" height="314" id="viddler_6b61223d" width="437"><param name="movie" value="http://www.viddler.com/player/6b61223d/" />
<param name="allowScriptAccess" value="always" />
<param name="allowFullScreen" value="true" />
<embed src="http://www.viddler.com/player/6b61223d/" width="437" height="314" type="application/x-shockwave-flash" allowScriptAccess="always" allowFullScreen="true" name="viddler_6b61223d"></embed></object><br />
<br />
Actualizacion:<br />
Lamentablemente el video ha sido retirado de la pagina he escrito a los organizadores para ver si es un tema de que considerar no compartirlo o si es un errorGrubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com0tag:blogger.com,1999:blog-934951127396497717.post-56398370494714564512011-03-12T08:40:00.001-05:002011-03-14T15:03:44.989-05:00Musica y MatematicaEsta entrada es para poner algo de ciencia todos saben lo que es pi para los que no en corto: es el resultado de dividir una circunferencia entre su diametro, para algo mas preciso revisen <a href="http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80">la entrada en wikipedia</a> a que viene todo esto? a que todas las constantes de la naturaleza ( aun una indeterminada como pi) siempre llevan armonia y belleza en ellas, esta vez encontre un video de <a href="http://www.youtube.com/user/michaeljohnblake">michael blake</a> donde hace una interpretacion muy personal del numero pi<br />
<br />
<object style="height: 390px; width: 640px;"><param name="movie" value="http://www.youtube.com/v/wK7tq7L0N8E?version=3"><param name="allowFullScreen" value="true"><param name="allowScriptAccess" value="always"><embed src="http://www.youtube.com/v/wK7tq7L0N8E?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="390"></object>Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com0tag:blogger.com,1999:blog-934951127396497717.post-81591110315280698192010-12-27T23:36:00.000-05:002010-12-27T23:36:01.134-05:00InfoQ: Continuous Delivery<a href="http://www.infoq.com/presentations/Continuous-Delivery">InfoQ: Continuous Delivery</a><br />
<div><br />
</div><div><a href="http://www.infoq.com/presentations/Continuous-Delivery"></a><span class="Apple-style-span" style="font-family: Lucida, 'Lucida Grande', Tahoma, sans-serif; font-size: 13px; line-height: 16px;">Jez Humble es co autor del libro Continuous delivery en esta presentacion nos muestra las ventajas de un efoque de entrega continua y el entorno en el que encajaria mejor, muy recomendable : (58 minutos, ingles sin subtitulos)</span><br />
<div><br />
</div><div><br />
</div></div>Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com0tag:blogger.com,1999:blog-934951127396497717.post-8351953936105582162010-12-05T13:52:00.000-05:002010-12-05T13:52:20.571-05:00Nuevos Servicios MegaWorld<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBF6Zm6NBpcgK6D5j0tpBa_xsw_hp7lhyphenhyphen_8Zlq6nNZwLHofUd8aJdFuLq6Fzjpvi75Lba1vbwJW1HVkWGh2zkObLv342IxN5tqi9YHC6wAQ3qtyeZddf2F7Xv_78Zt8WQV-V_dIGihsOIK/s1600/logoWorld.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBF6Zm6NBpcgK6D5j0tpBa_xsw_hp7lhyphenhyphen_8Zlq6nNZwLHofUd8aJdFuLq6Fzjpvi75Lba1vbwJW1HVkWGh2zkObLv342IxN5tqi9YHC6wAQ3qtyeZddf2F7Xv_78Zt8WQV-V_dIGihsOIK/s320/logoWorld.gif" width="320" /></a></div>Bueno me ha tomado por sorpresa, todos conocemos MegaUpload uno de los tantos servicios existentes para subir y compartir archivos, pues sucede que ahora tiene 6 nuevos hermanos, asi de golpe:<br />
<br />
MegaUpload(Compartir archivos)<br />
MegaLive (para emitir Streaming en vivo),<br />
MegaPix (compartir fotos al estilo de flicker o picassa),<br />
MegaBox (para poder llevar nuestra musica donde queramos) <br />
MegaClick(Para difusion de publicidad en linea)<br />
MegaFund(una web de asesoria en inversiones)<br />
MegaKey(un plugin que sustituira la publicidad en la web por la publicidad que mega controle, y da acceso gratuito a los servicios)<br />
MegaPay(Para poder hacer pagos via dispositivos moviles)<br />
<br />
Todo lo ha agrupado en un nuevo site llamado <a href="http://www.megaworld.com/">MegaWorld</a><br />
<br />
y si ya contabas con una cuenta esta estara activa y sera valida en MegaUpload, MegaLive, MegaPix, MegaBox y MegaVideo<br />
<br />
Me ha sorprendido gratamente puesto que yo ya contaba con una cuenta de pago y me he encontrado con muchos servicios de golpe que no tardare en consumir (y mas si me caen sin tener que pagar ni un centavo extra por ello!!) no puedo ocultar la satisfaccion que me genera que una empresa en la que habia confiado extienda sus servicios es una gran apuesta debido a que son muchos mas de aquellos con los que contaba esperemos que todo vaya bien y mantengan la calidad de siempreGrubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com0tag:blogger.com,1999:blog-934951127396497717.post-83187516576858077132010-11-06T22:22:00.001-05:002010-11-06T22:23:49.574-05:00InfoQ: Bad Code, Craftsmanship, Engineering, and Certification<a href="http://www.infoq.com/presentations/Robert-C.-Martin-Bad-Code">InfoQ: Bad Code, Craftsmanship, Engineering, and Certification</a><br />
<br />
El autor de Clean Code, nos da una excelente presentacion sobre mal codigo, buenas practicas, craftmanship y certificaciones, con su acostumbrado buen humor, video de una hora aproximadamente con las diapositivas empleadas en ingles sin subtitulos mas que recomendableGrubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com0tag:blogger.com,1999:blog-934951127396497717.post-87099661352898460302010-10-22T23:01:00.004-05:002010-10-22T23:41:07.497-05:00Acceder a Usuarios, Roles y permisos en Spring SecurityHola a todos este es un post corto que copio de un resumen que hice en la lista Spring Peru sobre una interesante discusion a raiz de una consulta sobre como configurar el acceso a los permisos (normalmente en un archivo de configuracion) desde una base de datos aqui el resumen en forma de pregunta - respuesta:<br />
<br />
<br />
<br />
<a name='more'></a><br />
<br />
<div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><b>Pregunta 1:</b> puedes crear Los usuarios y roles en una base de datos propia o usar un esquema que ya exista? : SI, de esta forma:</div><blockquote style="border-bottom-style: none; border-collapse: collapse; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0px; margin-left: 40px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><div class="im" style="color: #500050;"><div><br />
</div><div><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><a href="http://static.springsource.org/spring-security/site/docs/3.0.x/reference/appendix-schema.html" style="color: #5c4520;" target="_blank">http://static.springsource.<wbr></wbr>org/spring-security/site/docs/<wbr></wbr>3.0.x/reference/appendix-<wbr></wbr>schema.html</a></span></div><div><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><br />
</span></div></div><div class="im" style="color: #500050;"><div><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><authentication-manager></authentication-manager></span></div><div><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"> <authentication-provider></authentication-provider></span></div><div><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"> <jdbc-user-service data-source-=""></jdbc-user-service></span></div><div><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;">ref="dataSource"</span></div><div><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"> users-by-username-query="<wbr></wbr>SELECT</span></div><div><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;">U.USERNAME, U.PASSWORD, 'true' enabled FROM USUARIO U WHERE</span></div><div><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;">U.USERNAME=?"</span></div><div><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"> authorities-by-username-<wbr></wbr>query="SELECT</span></div><div><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;">U.USERNAME, R.ROL FROM USUARIO U, ROL R WHERE U.USERNAME=R.USERNAME</span></div><div><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;">AND U.USERNAME=?" /></span></div><div><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"> </span></div><div><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"></span></div></div></blockquote><br />
<span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;">solo una pequeña observacion: spring security define 3 datos para identificar a alguien: usuario, password y habilitado. el query empleado sirve en un entorno en que no tienes el concepto de habilitado, esto equivale a que un usuario siempre esta habilitado para acceder al sistema</span><span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><span style="font-family: arial, sans-serif;"><span style="border-collapse: collapse;"> como puede verse en el query:</span></span></span><br />
<div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><span style="font-family: arial, sans-serif;"><span style="border-collapse: collapse;"><span style="color: #500050; font-size: 13px;"></span></span></span><br />
<span style="font-family: arial, sans-serif;"><span style="border-collapse: collapse;"><span style="color: #500050; font-size: 13px;"></span></span></span><br />
<span style="font-family: arial, sans-serif;"><span style="border-collapse: collapse;"><span style="color: #500050; font-size: 13px;"></span></span></span><br />
<span style="font-family: arial, sans-serif;"><span style="border-collapse: collapse;"><span style="color: #500050; font-size: 13px;"><div class="im" style="color: #500050;"><div><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;">users-by-username-query="<wbr></wbr>SELECT</span></div><div><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;">U.USERNAME, U.PASSWORD, 'true' enabled FROM USUARIO U WHERE</span></div><div><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;">U.USERNAME=?"</span></div><div><br />
</div></div></span></span></span></div><span class="Apple-style-span" style="font-family: arial; font-size: small;"> el tercer elemento que devuelve el query esta colocado como una constante que siempre devuelve "true" si tu aplicacion si maneja el concepto de habilitado deberias reemplazar la constante por la columna correspondiente a dicho estado</span><br />
<div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><br />
</span></div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><br />
</span></div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><b>Pregunta 2:</b> puedes hacer el match entre las urls y los roles en una base de datos y obviar el archivo de configuracion? : SI</span></div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><br />
</span></div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><span style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;">aqui no hay ejemplo pero si un enlace que leer y da una idea de como hacerlo: </span><a href="http://static.springsource.org/spring-security/site/faq/faq.html#faq-dynamic-url-metadata" style="color: #5c4520;" target="_blank">http://static.<wbr></wbr>springsource.org/spring-<wbr></wbr>security/site/faq/faq.html#<wbr></wbr>faq-dynamic-url-metadata</a></div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><br />
</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;">algunos puntos importantes del enlace: un cambio en la seguridad debería ser siempre auditado, probado y autorizado si tomas eso en cuenta como creo que se hace ante cualquier cambio planificado y controlado en la seguridad, tendras que implementar la interface <span style="font-family: monospace; font-size: medium;">FilterInvocationSecu<wbr></wbr>rityMetadataSource </span>a fin de poder cargar estas relaciones desde una fuente diferente al archivo de configuracion.</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><br />
</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><b>Pregunta 3</b> : pueden modificarse los permisos de manera dinamica, entendiendo por dinamico que los cambios se hagan efectivos inmediatamente sin reiniciar la aplicacion?: aparentemente NO</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><br />
</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;">al menos de la lectura del enlace anterior se puede entender eso, el comportamiento por defecto es cargar los permisos en un mapa en memoria por lo que para cambiarlo es necesario reiniciar la aplicacion.</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><br />
si desean ver la discusión completa pueden hacerlo desde este enlace:<br />
<br />
<a href="http://groups.google.com/group/spring-user-group-peru/browse_thread/thread/28094fbbfe1bfbc0?hl=es">http://groups.google.com/group/spring-user-group-peru/browse_thread/thread/28094fbbfe1bfbc0?hl=es</a></div>Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com1tag:blogger.com,1999:blog-934951127396497717.post-87669026785499566232010-10-16T11:23:00.001-05:002010-10-16T11:32:29.450-05:00SpringSourceToolsuite 3.5.0 RC1<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwez9dbjTCM3FsDB8GphMYopnO_uHCffaUVINSGZGHEi15obzVxA0wPmKV6W_HHVlkwX9p1gkZNLYCOgD7GZx2XE8H8LY5-ko85A0X3Ah-UoVjFpmaR22QXFsunrZpGjwctquoawxNuH6J/s1600/Spring.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="98" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwez9dbjTCM3FsDB8GphMYopnO_uHCffaUVINSGZGHEi15obzVxA0wPmKV6W_HHVlkwX9p1gkZNLYCOgD7GZx2XE8H8LY5-ko85A0X3Ah-UoVjFpmaR22QXFsunrZpGjwctquoawxNuH6J/s320/Spring.png" width="320" /></a></div>Ha salido el día de ayer publicado en la web de Spring Source el anuncio de la nueva versión del ide SpringSource Toolsuite 2.5.0 RC1 (Release Candidate 1) recordar que este es un mod de eclipse con varios plugins para el desarrollo con este framework entre las principales novedades tenemos:<br />
<br />
<br />
<ul><li>Es un Bundle sobre el nuevo Eclipse 3.6.1 Helios</li>
<li>Soporte para Spring Roo 1.1.0 M3 </li>
<li>Soporte para test de integración de Gui sobre Grails</li>
<li>Wizard de comandos en grails</li>
<li>Corrección de varios bugs con respecto a la versión anterior</li>
</ul><div>Además el documento menciona las mejoras de la version 2.3.3 M2 como no he encontrado dicha version disponible en la web pongo esas mejoras ya que tambien son novedades con respecto a la version 2.3.2</div><div><br />
</div><div><ul><li>Editor visual para Spring Integration</li>
<li>Gestor de plugins para grails</li>
<li>Corrección de varios bugs con respecto a la versión anterior </li>
</ul><div>Si bien la web dice que esta disponible desde la <a href="http://www.springsource.com/landing/best-development-tool-enterprise-java?__utma=1.2006539895.1265995080.1272063281.1287241647.5&__utmb=1.18.10.1287241647&__utmc=1&__utmx=-&__utmz=1.1271892518.3.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=uninstall%20sts&__utmv=-&__utmk=259874954">web de descarga de STS</a> no pude encontrarlo ahi, en su lugar lo encontre en la <a href="http://www.springsource.com/products/eclipse-downloads">web de descarga de STS y Eclipse</a> esperemos que sea un problema que se corrija en los siguientes dias.</div></div><div><br />
</div><div>El instalador se encuentra disponible para los siguientes sistemas Operativos: Windows, Linux, Mac Os; en versiones tanto para 32 como para 64 bits</div><div><br />
</div><div>aqui una captura del instalador</div><div><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5U_xDk808aWwJgSUrG6-G1yYcsrwulO8OWPMqmbnPUKTJ9LXuN9gD0suEaZv3FrLA9cmlLvTWj4UZ8TRyN5eBdAySoMaXCkcAMkUXdprtA53MQgvg0D5X0I9IWwBYIlS2kAleXkBVNdDw/s1600/setup+STS.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5U_xDk808aWwJgSUrG6-G1yYcsrwulO8OWPMqmbnPUKTJ9LXuN9gD0suEaZv3FrLA9cmlLvTWj4UZ8TRyN5eBdAySoMaXCkcAMkUXdprtA53MQgvg0D5X0I9IWwBYIlS2kAleXkBVNdDw/s400/setup+STS.png" width="400" /></a></div><div><br />
</div>Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com0tag:blogger.com,1999:blog-934951127396497717.post-14962536387769565822010-10-10T01:32:00.000-05:002010-10-10T01:32:57.042-05:00Configurar DNS en CentosTe ha pasado que instalas centos y no puedes navegar mas que por la web centos.org? eso me paso hoy en un centos 5.4 instalado sobre una maquina virtual rapidamente (realmente no tanto) note que el problema era que no tenia direcciones para un servidor DNS validas oh bueno esto es rapido pense basta agregarlos al archivo /etc/resolv.conf y listo!!! hecho eso reinicio los servicios de red y nada aun no puede hacer una simple busqueda en google...<br />
<br />
revisando el archivo resolv.conf noto que este ya no tiene las direcciones que le agregue y un mensaje diciendo que este archivo es sobre escrito por el cliente dhcp (dhclient-script) el cual evitaba que mis cambios se hicieran permanentes <br />
<br />
pues bien antes de hacer algun hack modificando el script en cuestion googleando encontre en la pagina de centos las siguientes indicaciones que copio aqui por si tienen algun problema<br />
<br />
crear un archivo dhclient-enter-hooks en la carpeta /etc<br />
<br />
y dentro colocaremos:<br />
<br />
<script class="brush: powershell" type="syntaxhighlighter">
<![CDATA[
#!/bin/sh
make_resolv_conf() {
echo "doing nothing to resolv.conf"
}
]]>
</script><br />
luego damos permisos de ejecucion de dicho archivo a todos los usuarios<br />
<br />
chmod a+x /etc/dhclient-enter-hooks<br />
<br />
con eso el archivo resolv.conf ya no sera sobre escrito al reiniciar y podremos navegar y resolver nombres de internet tranquilamente, (de hecho el post lo escribo desde la maquina virtual recien creada)Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com0tag:blogger.com,1999:blog-934951127396497717.post-38111934580188891012010-09-27T23:05:00.002-05:002010-09-27T23:09:03.963-05:00Gran corto de Transformers o viral muy bien hecho?Este video lo vi en la web de microsiervos y me quedado con la boca abierta de lo bien que esta hecho y definitivamente me quedo con este comparado con la ultima pelicula de transformers lo curioso es el rumor de que podria ser un video viral muy bien hecho para telefonos, si los hacen asi pues que sigan regalandonos con cosas como estas!!<br />
<br />
<iframe src="http://player.vimeo.com/video/14852606?byline=0&portrait=0&color=0" width="501" height="241" frameborder="0"></iframe>Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com1tag:blogger.com,1999:blog-934951127396497717.post-17633267186107254482010-09-26T22:26:00.001-05:002010-09-26T22:26:59.338-05:00No se puede visualizar el codigo en lectores rss o google buzzHola a todos, he notado que cuando ves los posts desde algun lector de feeds o desde google buzz si el post incluye codigo de programacion, no queda visible, hace un tiempo <a href="http://soyfreakytambiengeek.blogspot.com/2010/02/habilitamos-syntaxhighlighter.html">habilite</a> un modulo de java Script llamado <a href="http://alexgorbatchev.com/SyntaxHighlighter/">syntaxhighlighter</a> este script añade algunas funcionalidades como el poder copiar al portapapeles, imprimir y una vista del codigo fuente como texto sin formato, estas funcionalidades me parecen utiles y provechosas lamentablemente dependen de un script que al no estar disponible desde los lectores de feed hace que no se pueda ver el codigo, la unica manera hasta el momento de poder verlo es dirigiendose a la pagina ,en la web original lamento las molestias pero despues de evaluar las opciones, un click me parece un esfuerzo razonable versus quitar las funcionalidades que da el script.Grubharthttp://www.blogger.com/profile/10015863235068159148noreply@blogger.com0