<?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>fboiton&#039;s blog &#187; how-to</title>
	<atom:link href="http://www.fboiton.com/tag/how-to/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fboiton.com</link>
	<description>Blog Técnico y personal: Ideas, Guias, Tutoriales, Comentarios, Pensamientos, Entre otros.</description>
	<lastBuildDate>Sun, 05 Feb 2012 22:01:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Incursionando con RavenDB: Caracteristicas, instalación y nuestro primer documento</title>
		<link>http://www.fboiton.com/ravendb-caracteristicas-instalacion-y-nuestro-primer-documento</link>
		<comments>http://www.fboiton.com/ravendb-caracteristicas-instalacion-y-nuestro-primer-documento#comments</comments>
		<pubDate>Wed, 07 Jul 2010 23:31:15 +0000</pubDate>
		<dc:creator>fboiton</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[document database]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[ravendb]]></category>

		<guid isPermaLink="false">http://www.fboiton.com/?p=38</guid>
		<description><![CDATA[Según lo indica el sitio web de RavenDB es una document database Open Source para la plataforma .Net/Windows. Es una opción almacenamiento de datos&#160; no relacionados dentro del movimiento NoSQL. Entre sus características tenemos Infraestructura Escalable Configuración en Windows Simple &#8230; <a href="http://www.fboiton.com/ravendb-caracteristicas-instalacion-y-nuestro-primer-documento">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Según lo indica el sitio web de <a href="http://ravendb.net" target="_blank">RavenDB</a> es una document database Open Source para la plataforma .Net/Windows. Es una opción almacenamiento de datos&#160; no relacionados dentro del movimiento <a href="http://en.wikipedia.org/wiki/NoSQL" target="_blank">NoSQL</a>.</p>
<p>Entre sus características tenemos</p>
<ul>
<li>Infraestructura Escalable</li>
<li>Configuración en Windows Simple</li>
<li>Transaccional</li>
<li>Map/Reduce</li>
<li>.Net Client API</li>
<li>RESTful API</li>
<li>Sharding</li>
<li>Indexamiento (<a href="http://lucene.apache.org/java/2_4_0/queryparsersyntax.html" target="_blank">Lucene syntax</a>)</li>
</ul>
<p>En cuanto a documentacion parece estar bastante completa (en inglés), podemos consultar:</p>
<ul>
<li><a href="http://ravendb.net/documentation" target="_blank">Documentación de RavenDB en el sitio oficial</a></li>
<li><a href="http://www.codeproject.com/KB/cs/RavenDBIntro.aspx" target="_blank">Introducción a RavenDB en codeproject.com</a>&#160;</li>
</ul>
<p>Antes de comenzar directamente con RavenDB si aún no tenemos en mente lo que una document database es podemos consultar la <a href="http://en.wikipedia.org/wiki/Document-oriented_database" target="_blank">Wikipedia: Document-oriented database</a> o también ver el video de la <a href="http://altnet-hispano.pbworks.com/van-2010-05-08-nosql" target="_blank">VAN de Alt.Net Hispano sobre NoSQL</a></p>
<p>Cabe mencionar que aún no puede correr en Mono y que los modos Servidor y Embedded corren bajo la framework .NET 4.0. El Cliente si corre (con algunas condiciones) en la framework .NET 3.5 y si puede correr en Mono.</p>
<p>Y para comenzar podemos ir directamente al clásico <a href="http://ravendb.net/tutorials/hello-world" target="_blank">RavenDB HelloWorld! Tutorial</a></p>
<p>Según indica el tutorial, luego de descargar el build que decidamos, nos vamos al folder “server” y lo ejecutamos</p>
<p><a href="http://www.fboiton.com/images/IncursionandoconRavenDB_E7D9/image.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/IncursionandoconRavenDB_E7D9/image_thumb.png" width="232" height="150" /></a> </p>
<p>Nota: Para este ejemplo modifiqué la configuración para que corriera en el puerto 8088, por default va a correr en el 8080.</p>
<p>Ahora que ya tenemos el servidor corriendo</p>
<p><a href="http://www.fboiton.com/images/IncursionandoconRavenDB_E7D9/image_3.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/IncursionandoconRavenDB_E7D9/image_thumb_3.png" width="583" height="108" /></a> </p>
<p>procedemos a trabajar en una pequeña implementación utilizando el cliente de RavenDB, no olvidemos referenciar el cliente de Raven DB en nuestro proyecto.</p>
<p>Para esta prueba crearé una console application donde tendremos un par de clases que será la definición de nuestro documento:</p>
<p><a href="http://www.fboiton.com/images/IncursionandoconRavenDB_E7D9/image_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/IncursionandoconRavenDB_E7D9/image_thumb_4.png" width="395" height="164" /></a> </p>
<p>Una vez teniendo nuestros POCO objects, procedemos a inicializar el DocumentStore y utilizarlo, para lo cual tendremos una clase más con un field que será el storage inicializado en el constructor y un método que se encargará de llenar el documento y almacenarlo en el storage.</p>
<p>Ahhh, no olvidemos que el inicializar el storage no es el único paso que debemos realizar. Para poder interactuar con los documentos necesitamos una sesión abierta, aquí el código:</p>
<p><a href="http://www.fboiton.com/images/IncursionandoconRavenDB_E7D9/image_5.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/IncursionandoconRavenDB_E7D9/image_thumb_5.png" width="505" height="353" /></a> </p>
<p>Finalmente, utilizamos nuestro ClientsDirectory en una console application</p>
<p><a href="http://www.fboiton.com/images/IncursionandoconRavenDB_E7D9/image_6.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/IncursionandoconRavenDB_E7D9/image_thumb_6.png" width="592" height="75" /></a> </p>
<p>y al ejecutar nuestra aplicación y luego irnos a la interfaz web de nuestro RavenDB Server</p>
</p>
</p>
</p>
<p>http://localhost:8088</p>
<p>Podemos ir a la sección “Documents” y bingo!</p>
<p><a href="http://www.fboiton.com/images/IncursionandoconRavenDB_E7D9/image_7.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/IncursionandoconRavenDB_E7D9/image_thumb_7.png" width="761" height="92" /></a> </p>
<p>Nuestro primer documento creado, mismo que al darle click en la interfaz web podemos manipularlo:</p>
<p><a href="http://www.fboiton.com/images/IncursionandoconRavenDB_E7D9/image_8.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/IncursionandoconRavenDB_E7D9/image_thumb_8.png" width="407" height="378" /></a> </p>
<p>No olvidemos que tenemos la opción de utilizar RavenDB embebido en nuestras aplicaciones lo cual nos quita la dependencia a un servicio adicional a nuestra aplicación que esté corriendo, adicionalmente que esto nos da libertad de utilizarla para muchos tipos de proyectos, no dejen de ver la sección <a href="http://ravendb.net/documentation/docs-client-api-index" target="_blank">Raven’s Client API</a></p>
<p> El proyecto puede descargarse <a href="http://www.fboiton.com/ClientsDirectory.rar">Aqu&iacute;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fboiton.com/ravendb-caracteristicas-instalacion-y-nuestro-primer-documento/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Utilizando las clases Uri y HTTPUtility para obtener los elementos de una URL</title>
		<link>http://www.fboiton.com/utilizando-las-clases-uri-y-httputility-para-obtener-los-elementos-de-una-url</link>
		<comments>http://www.fboiton.com/utilizando-las-clases-uri-y-httputility-para-obtener-los-elementos-de-una-url#comments</comments>
		<pubDate>Thu, 24 Jun 2010 18:49:25 +0000</pubDate>
		<dc:creator>fboiton</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[practices]]></category>

		<guid isPermaLink="false">http://www.fboiton.com/?p=33</guid>
		<description><![CDATA[Recuerdo los tiempos cuando para obtener algunos elementos de una URL como el nombre del Archivo o el Query String trabajabamos manipulador de cadenas que separaba por “/”, “?”…. y bueno, olvidemos eso. La .NET Framework nos provee 2 herramientas &#8230; <a href="http://www.fboiton.com/utilizando-las-clases-uri-y-httputility-para-obtener-los-elementos-de-una-url">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Recuerdo los tiempos cuando para obtener algunos elementos de una URL como el nombre del Archivo o el Query String trabajabamos manipulador de cadenas que separaba por “/”, “?”…. y bueno, olvidemos eso.</p>
<p>La .NET Framework nos provee 2 herramientas <em>Uri</em> y el método <em>ParseQueryString </em>de la&#160; <em>HttpUtility</em> cuyos detalles de documentación se encuentran acá:</p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/system.web.httputility.parsequerystring.aspx">HttpUtility.ParseQueryString Method</a> </li>
<li><a href="http://msdn.microsoft.com/en-us/library/system.uri.aspx">Uri Class</a> </li>
</ul>
<p>Demos una vista a la Uri Class, para esta clase debemos tener el namespace <em>System</em> incluido en nuestra clase. Luego de instanciarla pasando con el constructor el URL con el que vamos a trabajar, tenemos ya las diferentes partes accesibles por medio de atributos del objeto.</p>
<p> <code>
<p>&#160;&#160;&#160; var uri = new Uri(url);      <br />&#160;&#160;&#160; Debug.Write(uri.AbsolutePath);       <br />&#160;&#160;&#160; Debug.Write(uri.AbsoluteUri);       <br />&#160;&#160;&#160; Debug.Write(uri.Query);       <br />&#160;&#160;&#160; Debug.Write(uri.Host);       <br />&#160;&#160;&#160; Debug.Write(uri.Port);       </p>
<p> </code>
<p>Y ahora HttpUtility.ParseQueryString, este método es estático asi que podemos utilizarlo con habilitar el namespace <em>System.Web</em></p>
<p> <code>
<p>using System.Web;</p>
<p>//…class structure</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; NameValueCollection qryStringCollection = HttpUtility.ParseQueryString(“a=1&amp;b=2&amp;c=3”);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Response.Write(qryStringCollection[&quot;a&quot;]); // escribirá 1       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Response.Write(qryStringCollection[&quot;b&quot;]); // escribirá 2       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Response.Write(qryStringCollection[&quot;c&quot;]); // escribirá 3       </p>
<p> </code>
<p>como verán el método retorna una “NameValueCollection” cuyo comportamiento es como un diccionario (llave, valor).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fboiton.com/utilizando-las-clases-uri-y-httputility-para-obtener-los-elementos-de-una-url/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How-To: Split with AWK – Separar una cadena con AWK</title>
		<link>http://www.fboiton.com/how-to-split-with-awk-separar-una-cadena-con-awk</link>
		<comments>http://www.fboiton.com/how-to-split-with-awk-separar-una-cadena-con-awk#comments</comments>
		<pubDate>Thu, 10 Jun 2010 23:36:16 +0000</pubDate>
		<dc:creator>fboiton</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[awk]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[text parser]]></category>
		<category><![CDATA[text utils]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.fboiton.com/?p=30</guid>
		<description><![CDATA[Para quien no conozca a nuestro amigo AWK pueden avocarse a wikipedia http://en.wikipedia.org/wiki/AWK. Extenderme a hablar de esta textutil de linux en su totalidad es mucho para un post, asi que por ahi irán saliendo uno que otro how-to de &#8230; <a href="http://www.fboiton.com/how-to-split-with-awk-separar-una-cadena-con-awk">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Para quien no conozca a nuestro amigo AWK pueden avocarse a wikipedia <a href="http://en.wikipedia.org/wiki/AWK">http://en.wikipedia.org/wiki/AWK</a>.</p>
<p>Extenderme a hablar de esta textutil de linux en su totalidad es mucho para un post, asi que por ahi irán saliendo uno que otro how-to de textutils.</p>
<p>Resulta que por algun motivo tenemos una cadena que necesitamos hacer pedazos a partir de un caracter en específico, por ejemplo un archivo con path de origen y destino para mover o copiar archivos, vamos a tomar de ejemplo lo que sería una linea del archivo</p>
<p><code>/home/fernando/hola.txt|/root/hola.txt</code></p>
<p>esto quiere decir que necesitamos una sentencia como esta:</p>
<p><code>cp /home/fernando/hola.txt /root/hola.txt</code></p>
<p>Acá es donde llega nuestro amigo AWK para plantearnos la solución a este dilema que viene a ser algo así:</p>
<p><code>echo &quot;/home/fernando/hola.txt|/root/hola.txt&quot; | awk '{split($1,arrayName,&quot;|&quot;); print &quot;cp &quot;arrayName[1]&quot; &quot;arrayName[2]}'</code></p>
<p>Especificamente quien hace la tarea es el comando “split” el cual tiene 3 parametros:</p>
<ul>
<li>Cadena de entrada ( $1 ) [Ver wikipedia el segmento del <a href="http://en.wikipedia.org/wiki/AWK#The_print_command">comando print</a>&#160; ] </li>
<li>nombre del Arreglo ( arrayName ) , el conteo de posiciones comienza en 1. </li>
<li>separador ( “|” ) </li>
</ul>
<p>Si tenemos varias lineas en un archivo de entrada en lugar del comando “echo” podemos utilizar “cat [archivo de entrada]” asi:</p>
<p><code>cat listado.txt | awk '{split($1,arrayName,&quot;|&quot;); print &quot;cp &quot;arrayName[1]&quot; &quot;arrayName[2]}'</code></p>
<p>La salida de este comando nos dará un listado de sentencias que podremos utilizar y ejecutar directamente, lo cual podríamos hacerlo con un apóstrofe invertido (`)</p>
<p><code>`echo &quot;/home/fernando/hola.txt|/root/hola.txt&quot; | awk '{split($1,arrayName,&quot;|&quot;); print &quot;cp &quot;arrayName[1]&quot; &quot;arrayName[2]}'`</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fboiton.com/how-to-split-with-awk-separar-una-cadena-con-awk/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SpecFlow, xUnit, WatiN mis primera experiencia con  TDD y BDD</title>
		<link>http://www.fboiton.com/specflow-xunit-watin-mis-primeros-trotes</link>
		<comments>http://www.fboiton.com/specflow-xunit-watin-mis-primeros-trotes#comments</comments>
		<pubDate>Fri, 28 May 2010 02:56:56 +0000</pubDate>
		<dc:creator>fboiton</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[SpecFlow]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Watin]]></category>
		<category><![CDATA[xUnit]]></category>

		<guid isPermaLink="false">http://www.fboiton.com/?p=27</guid>
		<description><![CDATA[Hace un par de semanas comenc&#233; a interactuar con TDD y BDD mas all&#225; del aprendizaje con base en lecturas&#8230; y bueno&#8230; d&#233;jenme contarles que no puedo decir nada mas que TDD y BDD Rules! La configuración es bien sencilla, &#8230; <a href="http://www.fboiton.com/specflow-xunit-watin-mis-primeros-trotes">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hace un par de semanas comenc&eacute; a interactuar con TDD y BDD mas all&aacute; del aprendizaje con base en lecturas&#8230; y bueno&#8230; d&eacute;jenme contarles que no puedo decir nada mas que TDD y BDD Rules!</p>
<p>La configuración es bien sencilla, encontré más información utilizando nUnit y por ello que nace este post  (ya era hora no? <img src='http://www.fboiton.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ) para ejemplificar utilizando xUnit</p>
<p>Primero comenzamos con las descargas e instalación de:</p>
<ol>
<li><a href="http://www.specflow.org/">specFlow</a> </li>
<li><a href="http://watin.sourceforge.net/">watiN</a> </li>
<li><a href="http://xunit.codeplex.com/">xUnit</a> </li>
</ol>
<p>Adicionalmente a esto, deberán tener configurado el ejecutor de test units ya sea con <a href="http://xunit.codeplex.com/wikipage?title=HowToUseTdNet&amp;referringTitle=Home">TestDriven.Net</a> o con <a href="http://xunit.codeplex.com/wikipage?title=HowToUseResharper&amp;referringTitle=Home">Resharper</a> en Visual Studio. </p>
<p>Ya que descargamos todo esto procedemos a crear un nuevo proyecto y a agregarle las referencias a las 3 librerias descargadas.</p>
<p>Ojo! Por default SpecFlow genera el código para ser utilizado por nUnit y pues resulta que queremos trabajar con xUnit… Casaca! (chapinismo para decir que algo es “simple, facil,…”) <img src='http://www.fboiton.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  debemos agregar un Application Configuration File a nuestro proyecto con lo siguiente:</p>
<div><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;        <br />&lt;configuration&gt;         <br />&lt;configSections&gt;         <br />&lt;section name=&quot;specFlow&quot; type=&quot;TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow&quot;/&gt;         <br />&lt;/configSections&gt;         <br />&lt;!-- the following configuration represent the defaults -–&gt;         <br />&lt;specFlow&gt;         <br />&lt;language feature=&quot;en&quot; /&gt;         <br />&lt;unitTestProvider name=&quot;XUnit&quot; /&gt;         <br />&lt;runtime detectAmbiguousMatches=&quot;true&quot; stopAtFirstError=&quot;false&quot; missingOrPendingStepsOutcome=&quot;Inconclusive&quot; /&gt;         <br />&lt;trace traceSuccessfulSteps=&quot;true&quot; traceTimings=&quot;false&quot; minTracedDuration=&quot;0:0:0.1&quot; /&gt;         <br />&lt;/specFlow&gt;         <br />&lt;/configuration&gt;</code></div>
<p>( mjm… creo que debo cambiar el theme de mi blog, les dejo el formato a ustedes por el momento )</p>
<p>Bueno, a este punto ya estamos listos para comenzar con nuestro primer test, para el cual tomaremos esta Feature:</p>
<p> <code>Feature: googling    <br />In order to use watin     <br />As entusiast     <br />I want to be able to get a page and validate text     </p>
<p>Scenario: google to search about frogs     <br />Given I have written URL in browser http://www.google.com     <br />When I see google home page with title Google     <br />Then I check if Advanced Search link appear     <br /></code>
<p>Cabe mencionar que SpecFlow utiliza como sintaxis Gherkin cuya documentación pueden encontrarla en <a href="http://wiki.github.com/aslakhellesoy/cucumber/gherkin">http://wiki.github.com/aslakhellesoy/cucumber/gherkin</a>&#160;</p>
<p>Para utilizar esta feature debemos agregar un SpecFlowFeature File, el cual aparece entre los templates de visual studio si instalamos todo como nos indicaron los links que compartí al inicio.</p>
<p><a href="http://www.fboiton.com/images/xUnitSpecFlowyJavascript_7489/image.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="330" alt="image" src="http://www.fboiton.com/images/xUnitSpecFlowyJavascript_7489/image_thumb.png" width="547" border="0" /></a></p>
<p>una vez creada nuestra feature</p>
<p>&#160;</p>
<p>ejecutamos la test unit, sabiendo que va a ser fallida y observamos el mensaje de salida:</p>
<p>&#160;</p>
<p><a href="http://www.fboiton.com/images/xUnitSpecFlowyJavascript_7489/image_3.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="407" alt="image" src="http://www.fboiton.com/images/xUnitSpecFlowyJavascript_7489/image_thumb_3.png" width="694" border="0" /></a> </p>
<p>cool! tenemos el código base para iniciar, entonces agregamos una nueva clase a nuestro proyecto con el código que SpecFlow nos mostró en el mensaje de error. A este punto comenzamos a interactuar con Watin.</p>
<p>No debemos olvidar la respectiva referencia a la libreria en los “using” de nuestra clase:</p>
<p>using WatinN.Core;</p>
<p>la forma de interacción con WatiN es bastante extensa, yo me enfocaré en lo que nuestra feature quiere probar, que el texto “Advanced Search” aparezca al obtener el URL. Si desean adentrarse mas en el ejemplo pueden ir directamente al sitio de <a href="http://watin.sourceforge.net/gettingstarted.html">WatiN</a></p>
<p>Por cada una de las sentencias de nuestro “Scenario” tendremos un método lo cual nos permite dividir las acciones o validaciones segun cada una de las sentencias. Para esta prueba dejemos la instancia del browser al momento del “Given” de nuestro “Scenario”, sin embargo tambien existen las opciones de tenerlo en un constructor, trabajar un metodo setup, entre otras. Nuestro código se puede ver algo así:</p>
<p><a href="http://www.fboiton.com/images/xUnitSpecFlowyJavascript_7489/image_4.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="448" alt="image" src="http://www.fboiton.com/images/xUnitSpecFlowyJavascript_7489/image_thumb_4.png" width="704" border="0" /></a> </p>
<p>en el primer método se instancia el Watin para que utilice Internet Explorer y definimos la URL que se obtendrá, esto corresponde a nuestro “Given”.</p>
<p>Luego viene el “When” donde le inddicamos al Browser que obtenga la dirección que necesitamos evaluar.</p>
<p>Finalmente llegamos a la sentencia “Then” donde indicamos al browser que espere al texto que estamos buscando (esta en ingles y en español por la deteccion de idioma que tiene google) y adicionalmente se hace el “Assert” para verificar que se encuentre en el HTML. Esta validación, es muy relacionada a lo que queremos probar.</p>
<p>En este caso utilizo un “WaitUntilContainsText” porque la página de google pareciera mostrar con javascript estos textos, o al menos darles algun efecto, así que le digo a Watir que espere hasta que dicho texto se encuentre en el DOM. Lo cual nos indica que no importando si la página tiene javascript y a su vez este genera más elementos en el Dom, podemos realizar validaciones sobre el mismo. </p>
<p>No olvidemos cerrar el navegador al finalizar la ejecución desde código para evitar llenarnos de browsers con las ejecuciones de las pruebas <img src='http://www.fboiton.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Aca está el código de nuestra clase: </p>
<p><code>using System.Text.RegularExpressions;      <br />using TechTalk.SpecFlow;       <br />using WatiN.Core;       <br />using Xunit; </code></p>
<p>namespace testingIISInstance    <br />{     <br />&#160;&#160;&#160; [Binding]     <br />&#160;&#160;&#160; public class StepDefinitions     <br />&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; private IE _browser;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; private string _httpAddress;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; [Given(@&quot;I have written URL in browser <a href="http://www\.google\.com&quot;)]&#8220;>http://www\.google\.com&quot;)]</a>     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void GivenIHaveWrittenURLInBrowserHttpWww_Google_Com()     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _browser = new IE();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _httpAddress = &quot;<a href="http://www.google.com&quot;;">http://www.google.com&quot;;</a>     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; [Then(@&quot;I check if Advanced Search link appear&quot;)]    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void ThenICheckIfAdvancedSearchLinkAppear()     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _browser.DomContainer.WaitUntilContainsText(new Regex(&quot;Advertising Programs|Programas de publicidad&quot;));     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Assert.True(     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _browser.Html.IndexOf(&quot;Advertising Programs&quot;) &gt;= 0 || _browser.Html.IndexOf(&quot;Programas de publicidad&quot;) &gt;= 0     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; );     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _browser.Dispose();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _browser.Close();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; [When(@&quot;I see google home page with title Google&quot;)]    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void WhenISeeGoogleHomePageWithTitleGoogle()     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _browser.GoTo(_httpAddress);     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160; } </p>
<p>Prometo continuar con este tema y desglosar con mejor detalle cada uno de los elementos ac&aacute; mencionados</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fboiton.com/specflow-xunit-watin-mis-primeros-trotes/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>crear multiples zonas de DNS con bind9 rapidamente</title>
		<link>http://www.fboiton.com/crear-multiples-zonas-de-dns-con-bind9-rapidamente</link>
		<comments>http://www.fboiton.com/crear-multiples-zonas-de-dns-con-bind9-rapidamente#comments</comments>
		<pubDate>Fri, 28 Nov 2008 21:45:17 +0000</pubDate>
		<dc:creator>fboiton</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[bind]]></category>
		<category><![CDATA[bind9]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[how-to]]></category>

		<guid isPermaLink="false">http://www.fboiton.com/?p=26</guid>
		<description><![CDATA[este post detalla como agregar dominios con zona generica primero debemos crear la configuracion de la zona a utilizar como genérica $ttl 1800 @ IN SOA ns1.dominio.com. root.dominio.com. ( 2008112801 10800 3600 604800 1800 ) IN NS ns1.dominio.com. IN NS &#8230; <a href="http://www.fboiton.com/crear-multiples-zonas-de-dns-con-bind9-rapidamente">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>este post detalla como agregar dominios con zona generica </p>
<p>primero debemos crear la configuracion de la zona a utilizar como genérica<br />
<code>$ttl 1800<br />
@       IN      SOA     ns1.dominio.com. root.dominio.com. (<br />
                        2008112801<br />
                        10800<br />
                        3600<br />
                        604800<br />
                        1800 )<br />
                IN      NS      ns1.dominio.com.<br />
                IN      NS      ns2.dominio.com.<br />
                IN      A       192.168.10.5<br />
www             IN      CNAME   @<br />
</code></p>
<p>debera crearse en /var/cache/bind/[nombrequequiero].zone y los ns1 y ns2 deberan existir en la zona correspondiente a &#8220;dominio.com.&#8221;</p>
<p>Luego, configuramos en el master&#8230; para comenzar creamos el archivo</p>
<p><code>/etc/bind/named.conf.[nombrequequiero]</code></p>
<p>al cual se le van a colocar las definiciones de la zona de esta forma:<br />
<code><br />
zone "nuevodominio1.com" {<br />
type master;<br />
allow-query { any; };<br />
file "[nombrequequiero].zone";<br />
};<br />
zone "nuevodominio2.com" {<br />
type master;<br />
allow-query { any; };<br />
file "[nombrequequiero].zone";<br />
};<br />
</code><br />
una por cada dominio que se necesite, para ello se puede utilizar el script<br />
<code><br />
#!/bin/bash<br />
DOMAINSLIST=$1<br />
for i in $(cat $DOMAINSLIST); do<br />
echo "zone \"$i\" {"<br />
echo "type master;"<br />
echo "allow-query { any; };"<br />
echo "file \"[nombrequequiero].zone\";"<br />
echo "};"<br />
done</code></p>
<p>que toma como entrada el nombre de un archivo de texto que tenga todos los dominios sin ningun prefijo para concatenarlo al archivo</p>
<p>ejemplo:<br />
<code><br />
nuevodominio1.com<br />
nuevodominio2.com<br />
nuevodominio3.com<br />
</code></p>
<p>En el caso de los slaves tambien creamos un archivo </p>
<p>/etc/bind/named.conf.[nombrequequiero]</p>
<p>solo que en este caso el texto a incluir es de esta forma:<br />
<code><br />
zone "nuevodominio1.com" {<br />
type slave; masters { [ipdelDNSmaster]; };<br />
allow-query { any; };<br />
file "[nombrequequiero].zone";<br />
};<br />
zone "nuevodominio2.com" {<br />
type slave; masters { [ipdelDNSmaster]; };<br />
allow-query { any; };<br />
file "[nombrequequiero].zone";<br />
};</code></p>
<p>de similar forma puede generarse con el siguiente script:<br />
<code><br />
#!/bin/bash<br />
DOMAINSLIST=$1<br />
for i in $(cat $DOMAINSLIST); do<br />
echo "zone \"$i\" {"<br />
echo "type slave; masters { 209.85.29.20; };"<br />
echo "allow-query { any; };"<br />
echo "file \"[nombrequequiero].zone\";"<br />
echo "};"<br />
done<br />
</code></p>
<p>y agregarlo al archivo /etc/bind/named.conf.[nombrequequiero]</p>
<blockquote><p><strong>ATENCION! QUE NO SE NOS OLVIDE! HAY QUE AGREGAR LA REFERENCIA AL ARCHIVO PARA QUE SE INCLUYAN LAS ZONAS</strong></p></blockquote>
<p>/etc/bind/named.conf.[nombrequequiero]</p>
<p>EN<br />
/etc/bind/named.conf</p>
<p>al final de las zonas existentes del named.conf incluimos dicho archivo de la siguiente forma:</p>
<p><code>include "/etc/bind/named.conf.3rdtierdomains";</code></p>
<p>reiniciamos el bind del slave o los slaves, si se tiene habilitada la salida a syslog, podran ver que las zonas reportan error&#8230;</p>
<p>Luego reiniciamos el bind del master y listo! una forma práctica de crear varias zonas de DNS</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fboiton.com/crear-multiples-zonas-de-dns-con-bind9-rapidamente/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

