<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>El blog de Raul Cotrina</title>
	<atom:link href="http://sixservix.com/blog/rcotrina/feed/" rel="self" type="application/rss+xml" />
	<link>http://sixservix.com/blog/rcotrina</link>
	<description>Just another Sixservix.com Blogs weblog</description>
	<lastBuildDate>Tue, 22 Feb 2011 16:46:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Groovy &amp; Alberto Vilches</title>
		<link>http://sixservix.com/blog/rcotrina/2011/02/22/groovy-alberto-vilches/</link>
		<comments>http://sixservix.com/blog/rcotrina/2011/02/22/groovy-alberto-vilches/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 16:46:55 +0000</pubDate>
		<dc:creator>Raul Cotrina</dc:creator>
				<category><![CDATA[Sin categoría]]></category>

		<guid isPermaLink="false">http://sixservix.com/blog/rcotrina/?p=63</guid>
		<description><![CDATA[¿Qué narices es eso de Groovy?, ¿Para qué sirve?, ¿ Cómo me puede ayudar en mi trabajo?. Pues sí, son preguntas que yo también me hago, y que muchos de vosotros seguro que también. Así que en Sixservix hemos decidido llamar a  Alberto Vilches para que nos cuente todo esto. Seguro que ya muchos de vosotros [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sixservix.com/blog/rcotrina/files/2011/01/Groovy.jpg"><img class="alignright size-medium wp-image-66" title="Groovy" src="http://sixservix.com/blog/rcotrina/files/2011/01/Groovy-293x300.jpg" alt="" width="293" height="300" /></a>¿Qué narices es eso de Groovy?, ¿Para qué sirve?, ¿ Cómo me puede ayudar en mi trabajo?. Pues sí, son preguntas que yo también me hago, y que muchos de vosotros seguro que también.</p>
<p>Así que en Sixservix hemos decidido llamar a  <a href="http://albertovilches.com/" target="_blank">Alberto Vilches</a> para que nos cuente todo esto. Seguro que ya muchos de vosotros le conocéis, Alberto es un desarrollador con más de 10 años de experiencia en estas lides, javero de pro que famélico de nuevas tecnologías decidió hace un par de años devorar todo lo referente a este nuevo lenguaje.</p>
<p>El viernes 4 de Marzo a partir de las 17:00h le tendremos en nuestras instalaciones para que nos cuente qué es Groovy y por qué no podemos pasar ni un día más sin utilizarlo.</p>
]]></content:encoded>
			<wfw:commentRss>http://sixservix.com/blog/rcotrina/2011/02/22/groovy-alberto-vilches/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Manejando Glassfish desde Ant</title>
		<link>http://sixservix.com/blog/rcotrina/2010/03/09/52/</link>
		<comments>http://sixservix.com/blog/rcotrina/2010/03/09/52/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 15:57:34 +0000</pubDate>
		<dc:creator>Raul Cotrina</dc:creator>
				<category><![CDATA[Sin categoría]]></category>

		<guid isPermaLink="false">http://sixservix.com/blog/rcotrina/?p=52</guid>
		<description><![CDATA[Sigo con mi intención de automatizar lo más posible las construcciones y subidas de mi proyecto a entornos de producción e integración. En mi proyecto actualmente usamos Glassfish v2, y cuando me puse a jugar un poco con Husdon me di cuenta de que el pluggin de Hudson para realizar despliegues la opción para Glassfish [...]]]></description>
			<content:encoded><![CDATA[<p>Sigo con mi intención de automatizar lo más posible las construcciones y subidas de mi proyecto a entornos de producción e integración. En mi proyecto actualmente usamos Glassfish v2, y cuando me puse a jugar un poco con Husdon me di cuenta de que el <a href="http://wiki.hudson-ci.org/display/HUDSON/Deploy+Plugin" target="_self">pluggin de Hudson para realizar despliegues</a> la opción para Glassfish es una castaña pilonga. ¿Por qué era una castaña?, fácil, por que no te deja hacer despliegues en remoto, es decir, sólo puedes desplegar en un glassfish que tengas instalado en la misma máquina que se ejecuta el Hudson&#8230;</p>
<p>Esto me ha obligado a buscar otras opciones. Pues googleando un poco encontré las <a href="http://docs.sun.com/app/docs/doc/819-3672/beaer?a=view" target="_blank">librerías de glassfish</a> para añadir nuevas task a Ant. Para conseguir que esta librería nos funcione en nuestros scripts de Ant simplemente tendremos que anadir a nuestro path:</p>
<p>&lt;path id= &#8220;glassfishtask.classpath&#8221;  &gt;<br />
&lt;fileset dir= &#8220;./lib/&#8221; &gt;<br />
&lt;include name= &#8220;**/*.jar&#8221; /&gt;<br />
&lt;/fileset&gt;<br />
&lt;/path&gt;</p>
<p>En esa ruta tendremos que situar todos los jars de administración de glassfish, sí, son unos cuantos. Os dejo una captura de pantalla para que los veáis.</p>
<p><img class="aligncenter size-full wp-image-57" src="http://sixservix.com/blog/rcotrina/files/2010/03/Dibujo2.JPG" alt="Dibujo" width="610" height="401" />Ya tenemos todo este churro de librerias en nuestro path. Ahora le tenemos que decir a Ant dónde está el descriptor que define las tareas que puede usar, para esto añadimos esto a nuestro script:</p>
<p>&lt;typedef resource=&#8221;com/sun/tools/appserver/antlib.xml&#8221; classpathref=&#8221;glassfishtask.classpath&#8221; /&gt;</p>
<p>Concretamente este xml se encuentra en el sun-appserv-ant.jar, uno de los que hemos añadido. Pero además en el pantallazo vemos una carpeta lib. Esto es la pequeña chapucería (xD) que he tenido que hacer para que esto funcione, y es que hay que copiar &#8220;config&#8221;  situada en la raiz de nuestra instalación de glassfish (p.e. d:/glassfish/config ).</p>
<p>Ahora ya tenemos todo lo que necesitamos para empezar a trabajar. Os dejo un ejemplo de una tarea:</p>
<p>&lt;target name=&#8221;deploy-INT&#8221; description=&#8221;Despliega la aplicacion&#8221; &gt;<br />
&lt;sun-appserv-deploy file=&#8221;${dist}/Storetto.ear&#8221;<br />
name=&#8221;Storetto&#8221;<br />
force=&#8221;true&#8221;<br />
precompilejsp=&#8221;false&#8221;<br />
verify=&#8221;false&#8221;<br />
createtables=&#8221;false&#8221;<br />
upload=&#8221;true&#8221;<br />
user=&#8221;admin&#8221;<br />
passwordfile=&#8221;glassfishpassword.txt&#8221;<br />
host=&#8221;172.16.18.99&#8243;<br />
port=&#8221;4848&#8243;<br />
asinstalldir=&#8221;D:/hudson/lib&#8221; /&gt;</p>
<p>Muy importante es el atributo &#8220;asinstalldir&#8221; , el cual debe apuntar a donde tengamos nuestras librerias y nuestra carpeta config.</p>
<p>Espero que os sirva de ayuda, gracias.</p>
]]></content:encoded>
			<wfw:commentRss>http://sixservix.com/blog/rcotrina/2010/03/09/52/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Camino a la integración continua (I)</title>
		<link>http://sixservix.com/blog/rcotrina/2010/02/23/camino-a-la-integracion-continua-i/</link>
		<comments>http://sixservix.com/blog/rcotrina/2010/02/23/camino-a-la-integracion-continua-i/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 15:24:58 +0000</pubDate>
		<dc:creator>Raul Cotrina</dc:creator>
				<category><![CDATA[Sin categoría]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[integracion continua]]></category>
		<category><![CDATA[storetto]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://sixservix.com/blog/rcotrina/?p=13</guid>
		<description><![CDATA[Según wikipedia integración continua es : &#8220;La integración continua (continuous integration en inglés) es una metodología informática propuesta inicialmente por Martin Fowler que consiste en hacer integraciones automáticas de un proyecto lo más a menudo posible para así poder detectar fallos cuanto antes. Entendemos por integración la compilación y ejecución de test de todo un [...]]]></description>
			<content:encoded><![CDATA[<p>Según wikipedia integración continua es : &#8220;La <strong>integración continua</strong> (<em>continuous integration</em> en inglés) es una metodología informática propuesta inicialmente por Martin Fowler que consiste en hacer <em>integraciones automáticas</em> de un proyecto lo más a menudo posible para así poder detectar fallos cuanto antes. Entendemos por integración la compilación y ejecución de test de todo un proyecto&#8221;. Bonito, verdad?.</p>
<p>Actualmente en el proyecto en el que estoy involucrado (<a title="Storetto" href="http://sixservix.com/es/storetto.php" target="_blank">Storetto</a>) tengo que reconocer que hemos dejado un poco dejado de la mano de Dios este asunto. Hacemos las subidas usando la técnica &#8220;manubrio&#8221;, muy funcional, pero arcaica y muy dada a fallos (compilamos con nuestros propios IDE&#8217;s y realizamos la subida). Esto nos produce multitud de quebraderos de cabeza debido, principalmente, a que no es lo mismo una subida a producción, integración o desarrollo en cuanto a archivos properties y xml&#8217;s.</p>
<p><img class="alignright size-medium wp-image-49" src="http://sixservix.com/blog/rcotrina/files/2010/02/camino2-291x300.jpg" alt="camino" width="291" height="300" /></p>
<p>Después de algún susto y viendo lo poco productivo que supone hacer eso así hemos decidido arrancar este camino hacia la integración continua. Con menos verguenza que el destista de Pedro Guerra nos embarcarnos en esta aventura.</p>
<p>En un entorno de integración continua deben intervenir muchos actores : el proyecto a integrar, una sistema de control de versiones, test, una manera de construir ese proyecto y de integrarlo. Veamos qué tenemos. Ahora mismo cuento con un sistema de control de versiones subversion, algo que sí que no nos podía faltar, con el proyecto propiamente dicho y&#8230;. poco más.  Así que habrá que empezar por alguna parte, y como no se puede comenzar la casa por el tejado (el servidor de integración continua) creo que comenzaremos por algo que nos ayude a construir el proyecto: usaré Ant, sencillo y efectivo. En este humilde artículo os intentaré mostrar cómo he resuelto yo este problema, pero no voy a poner todo el fichero build.xml que he creado (sería muy repetitivo) sino sólo las partes más interesantes, y tampoco será una guía de Ant, por lo que daré muchas cosas por supuestas.</p>
<p>Pues nada, manos a la obra. Crear un script de ant que compile que se actualize tu proyecto, compile y genere los jar, war y finalmente tu ear realmente no es excesivamente difícil. Como ya he dicho algo que quería era actualizarme el proyecto de mi svn cada vez que contruyera la aplicación. Para conseguir que Ant tenga soporte para svn he tenido que &#8220;parchear&#8221; o meterle un pluggin . Podría enrollarme contando cómo hacerlo, pero creo que no tiene mucho sentido y prefiero dejaros la<a href="http://subversion.open.collab.net/articles/IntegratingSubversionIntoYourAntBuild.html" target="_blank"> web de donde yo lo hice </a>. Es bastante fácil, a grandes rasgos consiste en bajarte unas fuentes, compilarlas y referenciar en tu script de ant a el &#8220;jar&#8221; generado.</p>
<address>&lt;path id= &#8220;svnant.classpath&#8221;  &gt;<br />
&lt;fileset dir= &#8220;./svnant-1.2.1/svnant-1.2.1/lib&#8221; &gt;<br />
&lt;include name= &#8220;*.jar&#8221; /&gt;<br />
&lt;/fileset&gt;<br />
&lt;/path&gt;<br />
&lt;typedef resource=&#8221;org/tigris/subversion/svnant/svnantlib.xml&#8221; classpathref=&#8221;svnant.classpath&#8221; /&gt;</address>
<address> </address>
<address> </address>
<address> </address>
<p>Antes de continuar con nuestro script, tendremos que hacer un checkout de nuestro proyecto. El lugar donde lo hagamos es indistinto, luego configuraremos una propiedad en nuestro script que apuntará al proyecto. Se me pasó por la cabeza hacer un checkout cada vez que se lanzara la tarea y luego borrar todos los archivos; esto estaría bien si se tratara de un proyecto pequeño, pero en mi casa no es sostenible, el script tardaría una barbaridad en bajarse todo y luego en borrar todo de nuevo. Así que me creo una especie de repositorio de fuentes</p>
<address> </address>
<p>Primero tenemos que definir una serie de propiedades que serán usadas a lo largo de todo el script. Sobra decir la utilidad que tiene esto a la hora de pasarle a otra persona el script o cambiarlo de ubicación, etc&#8230;. . Estas son alguna de las que yo he utilizado:</p>
<address> </address>
<address>&lt;property name=&#8221;src&#8221; location=&#8221;./src&#8221;/&gt;<br />
&lt;property name=&#8221;build&#8221; location=&#8221;./classes&#8221;/&gt;<br />
&lt;property name=&#8221;dist&#8221;  location=&#8221;./dist&#8221;/&gt;<br />
&lt;property name=&#8221;temp&#8221;  location=&#8221;./temp&#8221;/&gt;<br />
&lt;property name=&#8221;repository.url&#8221;  location=&#8221;svn://svn.varma.es&#8221;/&gt;<br />
&lt;property name=&#8221;libraries&#8221;  location=&#8221;D:/Storetto_JAR&#8221;/&gt;</address>
<address> </address>
<p>Mi problema principal a la hora de realizar las subidas era el tener que renombrar ficheros de propiedades dependiendo de a donde fuera a subir el archivo generado. Así que la primera tarea Ant que se debe ejecutar en mi script será la que decida a que entorno subir, para eso creamos una estructura similar a esta:</p>
<address>&lt;target name=&#8221;LOCAL&#8221;&gt;<br />
&lt;antcall target=&#8221;RUN-LOCAL&#8221;/&gt;<br />
&lt;/target&gt;<br />
&lt;target name=&#8221;PROD&#8221;&gt;<br />
&lt;antcall target=&#8221;RUN-PROD&#8221;/&gt;<br />
&lt;/target&gt;</address>
<address> </address>
<p>Que nos permite llamar a una u otra tarea dependiendo de la construcción que queramos hacer y simplemente poniendo en la línea de comandos &gt;ANT PROD/LOCAL. Veamos una de estas tareas:</p>
<address>&lt;target name=&#8221;RUN-PROD&#8221; &gt;<br />
&lt;echo message=&#8221;&#8212;&#8212;&#8212;&#8212;&gt; GENERANDO STORETTO PARA PRODUCCION:&#8221;/&gt;<br />
&lt;mkdir dir=&#8221;${temp}/descriptors&#8221;/&gt;<br />
&lt;copy todir=&#8221;${temp}/descriptors/&#8221;&gt;<br />
&lt;fileset dir=&#8221;${src}/viewcontroller/src/&#8221; includes=&#8221;storetto.properties.PROD&#8221; /&gt;<br />
&lt;fileset dir=&#8221;${src}/viewcontroller/WebRoot/WEB-INF/&#8221; includes=&#8221;web.xml.PROD&#8221; /&gt;<br />
&lt;fileset dir=&#8221;${src}/viewcontroller/WebRoot/WEB-INF/&#8221; includes=&#8221;trinidad-config.xml.PROD&#8221; /&gt;<br />
&lt;/copy&gt;<br />
&lt;move file=&#8221;${temp}/descriptors/storetto.properties.PROD&#8221; tofile=&#8221;${temp}/descriptors/storetto.properties&#8221;/&gt;<br />
&lt;move file=&#8221;${temp}/descriptors/web.xml.PROD&#8221; tofile=&#8221;${temp}/descriptors/web.xml&#8221;/&gt;<br />
&lt;move file=&#8221;${temp}/descriptors/trinidad-config.xml.PROD&#8221; tofile=&#8221;${temp}/descriptors/trinidad-config.xml&#8221;/&gt;<br />
&lt;antcall target=&#8221;generate-ear&#8221;/&gt;<br />
&lt;/target&gt;</address>
<address> </address>
<p>Esta tarea cómo se puede ver, crea la carpeta donde copiaremos los archivos que cambian dependiendo de la construcción, los renombra y llama a otro target de Ant, ese target será al que todos los &#8220;modos de despliegue&#8221; llamen. Ahora usaremos la típica estructura de dependencias de Ant. Llamaremos al target &#8220;generate-ear&#8221; que dependerá de otro target, ese a su vez de otro, etc.. para crear una estructura secuancial de acuerdo con nuestras necesidades de despligue. Vamos a ver algunos ejemplos:</p>
<address>&lt;target name=&#8221;clean&#8221; description=&#8221;clean up&#8221; &gt;<br />
&lt;mkdir dir=&#8221;${build}&#8221;/&gt;<br />
&lt;mkdir dir=&#8221;${dist}&#8221;/&gt;<br />
&lt;delete includeemptydirs=&#8221;true&#8221;&gt;<br />
&lt;fileset dir=&#8221;${build}&#8221; includes=&#8221;**/*&#8221;/&gt;<br />
&lt;/delete&gt;<br />
&lt;delete includeemptydirs=&#8221;true&#8221;&gt;<br />
&lt;fileset dir=&#8221;${dist}&#8221; includes=&#8221;**/*&#8221;/&gt;<br />
&lt;/delete&gt;<br />
&lt;/target&gt;</address>
<address> </address>
<address> </address>
<address> </address>
<p>Primero creamos los directorios, puede ser que sea la primera vez que lanzamos el script. Y luego, como de pequeño me enseñaron que había que dejar las cosas según las encontraras, vaciamos su contenido. Creamos dos directorios, una donde iremos poniendo los compilados y ficheros que necesitemos para constriur nuestros ficheros de despliegue y otro donde depositaremos nuestros ficheros ear,war,xml que usaremos más tarde para crear el fichero ear.</p>
<p>Una vez que hemos barrido nuestra casa, procederemos a actualizar nuestro proyecto, veamos cómo:</p>
<address>&lt;target  name=&#8221;svn-update&#8221; &gt;<br />
&lt;echo message=&#8221;&#8212;&#8212;&#8212;&#8212;&gt; ACTUALIZAMOS EL PROYECTO:&#8221;/&gt;<br />
&lt;svn&gt;<br />
&lt;update dir=&#8221;${src}/Communications&#8221; /&gt;<br />
&lt;update dir=&#8221;${src}/viewcontroller&#8221; /&gt;<br />
&lt;update dir=&#8221;${src}/model&#8221; /&gt;<br />
&lt;update dir=&#8221;${src}/util&#8221; /&gt;<br />
&lt;update dir=&#8221;${src}/jasperreports&#8221; /&gt;<br />
&lt;update dir=&#8221;${src}/pdf&#8221; /&gt;<br />
&lt;update dir=&#8221;${src}/STORETTO&#8221; /&gt;<br />
&lt;/svn&gt;<br />
&lt;/target&gt;</address>
<address> </address>
<address> </address>
<p>Lo siguiente que vamos a hacer es contruir nuestro jar de modelos de datos. Storetto utiliza como sistema de acceso a datos EJB 3.0. Éstos van empaquetados , juntos con muchas otras cosas en un jar. Veamos cómo lo construimos:</p>
<address>&lt;target name=&#8221;generate-model&#8221; depends=&#8221;generate-util&#8221; description=&#8221;compile the source &#8221; &gt;<br />
&lt;echo message=&#8221; &#8212;&#8212;&#8212;&gt; GENERAMOS EL MODULO MODEL:&#8221;/&gt;<br />
&lt;javac srcdir=&#8221;${src}/model/src/&#8221;  destdir=&#8221;${build}&#8221;<br />
classpath=&#8221;${toString:storetto.classpath};${dist}/lib/util.jar&#8221; fork=&#8221;true&#8221;<br />
memoryInitialSize=&#8221;192m&#8221; memoryMaximumSize=&#8221;256m&#8221; &gt;<br />
&lt;/javac&gt;<br />
&lt;mkdir dir=&#8221;${build}/com/six/storetto/model/util/pbnoteagrupationline/resources/&#8221;/&gt;<br />
&lt;copy todir=&#8221;${build}/com/six/storetto/model/util/pbnoteagrupationline/resources/&#8221;&gt;<br />
&lt;fileset dir=&#8221;${src}/model/src/com/six/storetto/model/util/pbnoteagrupationline/resources&#8221;                               includes=&#8221;ovlfpicking.properties&#8221; /&gt;<br />
&lt;/copy&gt;<br />
&lt;copy todir=&#8221;${build}/com/six/storetto/model/validator&#8221;&gt;<br />
&lt;fileset dir=&#8221;${src}/model/src/com/six/storetto/model/validator&#8221; includes=&#8221;plugings.properties&#8221; /&gt;<br />
&lt;/copy&gt;<br />
&lt;mkdir dir=&#8221;${src}/META-INF/&#8221;/&gt;<br />
&lt;copy todir=&#8221;${build}/META-INF/&#8221;&gt;<br />
&lt;fileset dir=&#8221;${src}/model/src/META-INF/&#8221; includes=&#8221;persistence.xml&#8221; /&gt;<br />
&lt;/copy&gt;<br />
&lt;jar jarfile=&#8221;${dist}/lib/model.jar&#8221; basedir=&#8221;${build}&#8221;/&gt;<br />
&lt;!&#8211;Borramos los compilados generados &#8211;&gt;<br />
&lt;delete includeemptydirs=&#8221;true&#8221;&gt;<br />
&lt;fileset dir=&#8221;${build}&#8221; includes=&#8221;**/*&#8221;/&gt;<br />
&lt;/delete&gt;<br />
&lt;/target&gt;</address>
<address> </address>
<address> </address>
<address> </address>
<p>Como se puede ver la técnica a seguir es compilar y copiar todos los archivos que queremos que formen parte de nuestra jar a un directorio &#8220;temporal&#8221;, para finalmente lanzar la tarea &#8220;jar&#8221;. Esto lo repetiremos tantas veces como ficheros .war o .jar necesitemos crear para nuestro fichero EAR. Una vez creados todos estos ficheros se lanzará la generación del fichero de despliegue:</p>
<address> </address>
<address>&lt;target name=&#8221;generate-ear&#8221; depends=&#8221;generate-viewcontroller&#8221; description=&#8221;Crea el EAR de Storettor&#8221; &gt;<br />
&lt;mkdir dir=&#8221;${dist}/lib/META-INF/&#8221;/&gt;<br />
&lt;copy todir=&#8221;${dist}/lib/META-INF/&#8221;&gt;<br />
&lt;fileset dir=&#8221;${src}/STORETTO/META-INF/&#8221; includes=&#8221;sun-application.xml&#8221; /&gt;<br />
&lt;/copy&gt;<br />
&lt;ear destfile=&#8221;${dist}/Storetto.ear&#8221; appxml=&#8221;${src}/STORETTO/META-INF/application.xml&#8221;&gt;<br />
&lt;fileset dir=&#8221;${dist}/lib&#8221; includes=&#8221;*.jar,*.war,**/*.xml&#8221;/&gt;<br />
&lt;/ear&gt;<br />
&lt;/target&gt;</address>
<address> </address>
<p>Evidentemente esto son sólo algunos casos, sirvan cómo ejemplo de cómo construir un fichero de despliegue. Con esto ya hemos dado un paso adelante. Hemos conseguido unificar la construcción de nuestro proyecto. Este script ant nos valdrá, con algunos retoques, para los siguientes pasos en nuestro camino hacia la Integración Continua total. En el día a día de un equipo de desarrollo pequeño e invuclado en una puesta en producción no es factible abordar toda esta tarea de una sola tacada, así que volveremos a la carga con los siguientes pasos en nuestro camino : Test Unitarios y/o instalación de un servidor de integración continua Hudson.</p>
<address> </address>
<address> </address>
<p style="text-align: justify">
<address> </address>
<address> </address>
]]></content:encoded>
			<wfw:commentRss>http://sixservix.com/blog/rcotrina/2010/02/23/camino-a-la-integracion-continua-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Database links</title>
		<link>http://sixservix.com/blog/rcotrina/2009/09/29/database-links/</link>
		<comments>http://sixservix.com/blog/rcotrina/2009/09/29/database-links/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 10:21:20 +0000</pubDate>
		<dc:creator>Raul Cotrina</dc:creator>
				<category><![CDATA[Sin categoría]]></category>

		<guid isPermaLink="false">http://sixservix.com/blog/rcotrina/?p=6</guid>
		<description><![CDATA[Cuando trabajas en un proyecto más o menos grande, lo normal es que tengan diferentes entornos, y esto hace que a veces el mantenimiento sea un poco engorroso. En el proyecto en el que ahora mismo estoy trabajando usamos 3 servidores (desarrollo, pruebas, producción) de base de datos oracle, cada uno de ellos en maquinas [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left">Cuando trabajas en un proyecto más o menos grande, lo normal es que tengan diferentes entornos, y esto hace que a veces el mantenimiento sea un poco engorroso. En el proyecto en el que ahora mismo estoy trabajando usamos 3 servidores (desarrollo, pruebas, producción) de base de datos oracle, cada uno de ellos en maquinas físicamente distintas. En el día a día, cuando trabajas con estos servidores es común hacer muchos cambios, consultas, insertar, borrar datos, etc.. y esto puede a llegar a ser un poco lioso, teniendo que tener varias ventanas abiertas de tu software cliente de base de datos (toad, pl/sql developer).</p>
<p>Hace poco descubrí una herramienta que desconocía y que puede llegar a ser muy útil, sobre todo para copias datos entre diferentes base de datos: los Database links.  ¿Qué narices es esto?. Pues muy sencillo, es un &#8220;enlace&#8221; entre dos base de datos,dicho de manera algo profana. De esta manera puedo tirar sentencias estando conectado desde una DDBB A a una DDBB B. Veamos un ejemplo :</p>
<p><code>SELECT * FROM usuarios@varma2</code></p>
<p>Siendo &#8220;varma2&#8243; en nombre de Database link. Simplemente habrá que ponerlo inmediatamente a continuación del nombre de la tabla seguido de una arroba. Es bastante sencillo. Veamos cómo crear uno:</p>
<p><code>CREATE DATABASE LINK varma2<br />
CONNECT TO "usuario"<br />
IDENTIFIED BY "password"<br />
USING '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST =<br />
MiHostname)(PORT = 1521)) (CONNECT_DATA = (SID = VARMA2)))'</code></p>
<p>Esta sentencia bastaría con ejecutarla desde la bbdd A, llamemosle VARMA1, desde la que deseariamos lanzar las consultas contra esta bbdd identificada con el SID = VARMA2 Podríamos crear una relación circular entre ambas simplemente creado otro enlace desde VARMA2 que apuntara a VARMA1</p>
<p><code>CREATE DATABASE LINK varma1<br />
CONNECT TO "usuario"<br />
IDENTIFIED BY "password"<br />
USING '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST =<br />
MiHostname)(PORT = 1521)) (CONNECT_DATA = (SID = VARMA1)))'</code></p>
<p>Ya tenemos creados nuestros links entre ambas base de datos. Ahora las posiblidades son infinitas, ya que podremos realizar consultas, borrados, insercciones de una manera muy rápida entre ellas. Fijaros en esta sentencia:</p>
<p><code>INSERT INTO usuarios (select * from usuarios@varma1)</code></p>
<p>Podremos hacer migraciones de datos sencillas y muy rápidas sin tener que usar las herramientas exp/imp, mucho más potentes, pero mucho engorrosas.Por último, os preguntareis, donde consulto los links que tiene creados mi bbdd, muy fácil, la tabla de sistema que soporta esto es :<span style="font-family: Courier"> </span><span style="font-family: Courier">&#8220;all_db_links&#8221;. </span><br />
<span style="font-family: Courier"><br />
</span></p>
<p>Espero que os sirva de introducción y de ayuda, al menos tanto como me ha sido útiles para mi. Los Database links tienen muchísimas más opciones y posibilidades, pero creo os ayudará mucho mejor un buen manual de Oracle.</p>
]]></content:encoded>
			<wfw:commentRss>http://sixservix.com/blog/rcotrina/2009/09/29/database-links/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Hola a todos.</title>
		<link>http://sixservix.com/blog/rcotrina/2009/07/22/hola/</link>
		<comments>http://sixservix.com/blog/rcotrina/2009/07/22/hola/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 12:51:14 +0000</pubDate>
		<dc:creator>Raul Cotrina</dc:creator>
				<category><![CDATA[Sin categoría]]></category>

		<guid isPermaLink="false">http://sixservix.com/blog/rcotrina/?p=2</guid>
		<description><![CDATA[Mi nombre es Raul Cotrina y pertenezco al equipo de desarrollo de Sixservix, principalmente centrado en el lenguaje Java, pero como en toda empresa, estoy abierto a tocar cualquier otra campo que pueda llevar a buen puerto nuestros objetivos. ¿Por qué este blog?. La idea de este blog es llevar día a día una bitácora [...]]]></description>
			<content:encoded><![CDATA[<p>Mi nombre es Raul Cotrina y pertenezco al equipo de desarrollo de Sixservix, principalmente centrado en el lenguaje Java, pero como en toda empresa, estoy abierto a tocar cualquier otra campo que pueda llevar a buen puerto nuestros objetivos.</p>
<p>¿Por qué este blog?. La idea de este blog es llevar día a día una bitácora de mi trabajo, publicar todas las ideas que crea interesantes para compartir y que crea que pueden aportar algo, tanto a otras personas como al día a día de mi trabajo, y generar un feedback con otros técnicos que nos puedan enriquecer a todos.</p>
<p>Sin más dilación, bienvendos a éste, mi humlide blog.</p>
<p>Alea jacta est.</p>
]]></content:encoded>
			<wfw:commentRss>http://sixservix.com/blog/rcotrina/2009/07/22/hola/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

