<?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</title>
	<atom:link href="http://www.fboiton.com/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>Thu, 22 Jul 2010 02:00:00 +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>Microsoft.WebApplication.targets not found</title>
		<link>http://www.fboiton.com/microsoft-webapplication-targets-not-found</link>
		<comments>http://www.fboiton.com/microsoft-webapplication-targets-not-found#comments</comments>
		<pubDate>Thu, 22 Jul 2010 02:00:00 +0000</pubDate>
		<dc:creator>fboiton</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[asp.net 4.0]]></category>
		<category><![CDATA[msbuild]]></category>
		<category><![CDATA[psake]]></category>
		<category><![CDATA[team fundation server]]></category>
		<category><![CDATA[teamcity]]></category>
		<category><![CDATA[webapplication]]></category>

		<guid isPermaLink="false">http://www.fboiton.com/microsoft-webapplication-targets-not-found</guid>
		<description><![CDATA[Creando un build script con psake y configurandolo en un servidor de integración con TeamCity me topé con el siguiente error: The imported project &#8220;C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets&#8221; was not found Dicho archivo .targets corresponde a un set de elementos, propiedades, targets &#8230; <a href="http://www.fboiton.com/microsoft-webapplication-targets-not-found">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Creando un build script con psake y configurandolo en un servidor de integración con TeamCity me topé con el siguiente error:</p>
<p><em>The imported project &#8220;C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets&#8221; was not found</em></p>
<p>Dicho archivo .targets corresponde a un set de elementos, propiedades, targets y tareas de escenarios comunies segun se puede ver en la <a href="http://msdn.microsoft.com/en-us/library/ms164312.aspx" target="_blank">referencia de MSBuild</a>. Estos archivos se instalan con el Visual Studio y/o MSBuild, sin embargo el correspondiente a WebApplication no está incluido.</p>
<p>Buscando si alguien más ha tenido este problema encontré esta nota “<a href="http://www.sharepointsecurity.com/sharepoint/team-foundation-server/tfs-2010-solving-the-imported-project-microsoft-webapplication-targets-was-not-found-error/" target="_blank">TFS 2010 – Solving The Imported Project Microsoft.WebApplication.targets Was Not Found Error</a>”</p>
<p>En dicha nota sugieren literalmente copiar el directorio “C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications” de una máquina de desarrollo al build server, acción que que la compilación suceda.</p>
<p>Al volver a ejecutar el build script comencé a obtener varios warnings indicando lo siguiente:</p>
<p><em>C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(847,9): warning MSB3644: The reference assemblies for framework &#8220;.NETFramework,Version=v4.0&#8243; were not found. To resolve this, install the SDK or Targeting Pack for this framework version or retarget your application to a version of the framework for which you have the SDK or Targeting Pack installed. Note that assemblies will be resolved from the Global Assembly Cache (GAC) and will be used in place of reference assemblies. Therefore your assembly may not be correctly targeted for the framework you intend.</em></p>
<p>Donde lo que procede es la instalación del <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=6b6c21d2-2006-4afa-9702-529fa782d63b&amp;displaylang=en" target="_blank">SDK para la .NET Framework 4</a>. Ojo, la Framework 4 se encontraba ya instalada en el servidor de integración, mas no el SDK, así que las referencias que utilizamos en nuestra aplicación, según lo indicaban los warnings,&nbsp; se resolvían con el GAC, sin embargo, nuestro build no está completamente lipio. Una vez realizadas estas acciones tenemos ya nuestro “Build Success!”</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fboiton.com/microsoft-webapplication-targets-not-found/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Psake : Herramienta de automatización para nuestros builds.</title>
		<link>http://www.fboiton.com/psake-herramienta-de-automatizacin-para-nuestros-builds</link>
		<comments>http://www.fboiton.com/psake-herramienta-de-automatizacin-para-nuestros-builds#comments</comments>
		<pubDate>Thu, 15 Jul 2010 18:52:28 +0000</pubDate>
		<dc:creator>fboiton</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[build script]]></category>
		<category><![CDATA[msbuild]]></category>
		<category><![CDATA[psake]]></category>

		<guid isPermaLink="false">http://www.fboiton.com/psake-herramienta-de-automatizacin-para-nuestros-builds</guid>
		<description><![CDATA[psake es una herramienta de automatización de Builds escrita en PowerShell. Con similitudes a rake y bake y características de extensibilidad por estar hecho en PowerShell es una buena recomendación para crear nuestras Tareas interdependientes de compilación. Podemos descargarlo directamente &#8230; <a href="http://www.fboiton.com/psake-herramienta-de-automatizacin-para-nuestros-builds">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://wiki.github.com/JamesKovacs/psake/what-is-psake" target="_blank">psake</a> es una herramienta de automatización de Builds escrita en PowerShell. Con similitudes a rake y bake y características de extensibilidad por estar hecho en PowerShell es una buena recomendación para crear nuestras Tareas interdependientes de compilación.</p>
<p>Podemos descargarlo directamente de <a href="http://wiki.github.com/JamesKovacs/psake/where-can-i-get-psake" target="_blank">GitHub</a> y para instalarlo tenemos 2 formas:</p>
<p><strong>Importar el módulo en PowerShell e invocarlo directamente</strong></p>
<p>Esto lo realizamos con las lineas:</p>
<p>
<pre>Import-Module .\psake.psm1
Invoke-psake .\default.ps1
</pre>
</p>
<p>Debemos estar seguro que la execution policy nos permitirá ejecutar el módulo para ello podemos utilizar el comando de PowerShell</p>
<pre>get-executionpolicy</pre>
<p>y en caso necesitemos modificarlo, la sugerencia es establecer la policy “remotesigned”</p>
<pre>set-executionpolicy remotesigned</pre>
<p><strong>Ejecutar el script de PowerShel psake.ps1</strong></p>
<pre># call the psake.ps1 file directly
.\psake.ps1 .\default.ps1
</pre>
<p>Ejemplo de un script de psake</p>
<p><a href="http://www.fboiton.com/images/PsakeHerramientadeautomatizacinparanues_8A0D/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/PsakeHerramientadeautomatizacinparanues_8A0D/image_thumb.png" width="244" height="178"/></a></p>
<p>Algunos puntos clave</p>
<ul>
<li>Todo comienza con la task de nombre “Default”
</li>
<li>Es sugerible trabajar siempre con paths absolutos y para ello podemos apoyarnos en los comandos de PowerShell, por ejemplo: <a href="http://technet.microsoft.com/en-us/library/dd315377.aspx" target="_blank">Split-Path</a> en la función “Properties” que podemos observar en la <a href="http://wiki.github.com/JamesKovacs/psake/what-is-the-structure-of-a-psake-build-script" target="_blank">documentacion de la estructura de un script psake</a>
</li>
<li>Tenemos a disposición la gama de comandos de PowerShell y por ende la capacidad de extender nuestros build scripts, acá algunos links de referencia:
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/ms714415(v=VS.85).aspx" target="_blank">Starting Windows PowerShell</a>
</li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms714409(v=VS.85).aspx" target="_blank">Using Windows PowerShell</a></li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.fboiton.com/psake-herramienta-de-automatizacin-para-nuestros-builds/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conceptos claves en Team Foundation Server 2010</title>
		<link>http://www.fboiton.com/conceptos-claves-en-team-foundation-server-2010</link>
		<comments>http://www.fboiton.com/conceptos-claves-en-team-foundation-server-2010#comments</comments>
		<pubDate>Thu, 08 Jul 2010 22:29:26 +0000</pubDate>
		<dc:creator>fboiton</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[team fundation server]]></category>

		<guid isPermaLink="false">http://www.fboiton.com/conceptos-claves-en-team-foundation-server-2010</guid>
		<description><![CDATA[Comenzando con mi investigación sobre Team Foundation Server me topé con algunos conceptos claves en un post de bharry, donde menciona&#160; estas características y que resumo a continuación. Team Project Collections Cada colleción es un grupo de proyectos relacionados y &#8230; <a href="http://www.fboiton.com/conceptos-claves-en-team-foundation-server-2010">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><font color="#333333" size="3"></font></p>
<p>Comenzando con mi investigación sobre Team Foundation Server me topé con algunos conceptos claves en un <a href="http://blogs.msdn.com/b/bharry/archive/2009/04/19/team-foundation-server-2010-key-concepts.aspx" target="_blank">post de bharry</a>, donde menciona&nbsp; estas características y que resumo a continuación.</p>
<h3>Team Project Collections </h3>
<p>Cada colleción es un grupo de proyectos relacionados y cada TFS Farm&nbsp; puede contener varias collecciones.<br />Cada colección es totalmente independiente una de la otra</p>
<h3>Bases de Datos</h3>
<p>Por la introducción de los Team Project Collections </p>
<h5>TFS_Config</h5>
<p>Base de datos raiz que centraliza los datos de la configuración del TFS incluyendo el listado de team project collections.</p>
<h5>TFS_Warehouse </h5>
<p>Contiene la información de reportes de todas las team project collections, con esto provee la capacidad de reporteria entre todas las team project collections en la TFS farm</p>
<h5>TFS_* </h5>
<p>Una base de datos por cada team project collection. La cual contiene toda la información operacional relacionada con un sub sitema para determinada team project collection (contol de versiones, seguimiento de ítems en trabajo, builds, etc). </p>
<h3>TFS Farms </h3>
<p>La introducción de las TFS Farms se considera un gran cambio de arquitectura, permitiendo mayor flexibilidad con relación al TFS 2008. Dichos cambios que dan vida a las TFS Farms son:</p>
<ul>
<li><strong>soporte de NLB entre TFS application tiers</strong>. El habilitar balanceo de carga tiene como proposito habilitar una mas limpia y completa historia de alta disponibilidad. </li>
<li><strong>Scale out for SQL data tiers</strong>. Debido a que cada base de datos es independiente éstas pueden estar en cualquier SQL Server.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.fboiton.com/conceptos-claves-en-team-foundation-server-2010/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Incursionando con RavenDB: Crear un Indice y Realizar una Consulta</title>
		<link>http://www.fboiton.com/incursionando-con-ravendb-crear-un-indice-y-realizar-una-consulta</link>
		<comments>http://www.fboiton.com/incursionando-con-ravendb-crear-un-indice-y-realizar-una-consulta#comments</comments>
		<pubDate>Thu, 08 Jul 2010 17:53:45 +0000</pubDate>
		<dc:creator>fboiton</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[ravendb]]></category>

		<guid isPermaLink="false">http://www.fboiton.com/incursionando-con-ravendb-crear-un-indice-y-realizar-una-consulta</guid>
		<description><![CDATA[Luego de instalar y agregar documentos en nuestro RavenDB, continuamos con la interacción llegando ahora a la búsqueda de documentos. Tomando como base el mismo proyecto ejemplo del post Incursionando con RavenDB: Características, instalación y nuestro primer documento… nos vamos &#8230; <a href="http://www.fboiton.com/incursionando-con-ravendb-crear-un-indice-y-realizar-una-consulta">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Luego de instalar y agregar documentos en nuestro RavenDB, continuamos con la interacción llegando ahora a la búsqueda de documentos. Tomando como base el mismo proyecto ejemplo del post <a href="http://www.fboiton.com/ravendb-caracteristicas-instalacion-y-nuestro-primer-documento" target="_blank">Incursionando con RavenDB: Características, instalación y nuestro primer documento…</a> nos vamos a nuestra interfaz web del servidor RavenDB. Anticipadamente agregué algunos documentos extras</p>
<p><a href="http://www.fboiton.com/images/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/image_thumb.png" width="640" height="118"/></a> </p>
<p>Antes de Realizar una Consulta vamos a crear un Indice, para ello utilizamos la intefaz web en la opción “indexes”</p>
<p><a href="http://www.fboiton.com/images/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/image_3.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/image_thumb_3.png" width="244" height="38"/></a> </p>
<p>Luego utilizamos la opción “Create New Index”</p>
<p><a href="http://www.fboiton.com/images/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/image_4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/image_thumb_4.png" width="244" height="107"/></a> </p>
<p>al ver el formulario de creación</p>
<p><a href="http://www.fboiton.com/images/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/image_5.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/image_thumb_5.png" width="446" height="373"/></a> </p>
<p>llenamos estos campos :</p>
<p><a href="http://www.fboiton.com/images/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/image_6.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/image_thumb_6.png" width="526" height="176"/></a> </p>
<p>Por el momento las opciones de “Reduce” y personalización del índice no las utilizaremos.</p>
</p>
</p>
<p>Una vez creado el índice nos vamos a nuestro proyecto (el mismo del post anterior) y vamos a crear el método de búsqueda</p>
<p><a href="http://www.fboiton.com/images/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/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/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/image_thumb_7.png" width="461" height="153"/></a> </p>
<p>Nos concentramos en la sentencia donde le decimos a la sesión que haremos una consulta de clientes sobre el índice “ClientsByName” que creamos previamente en nuestra RavenDB</p>
<p><a href="http://www.fboiton.com/images/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/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/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/image_thumb_8.png" width="593" height="68"/></a> </p>
<p>Podemos darnos cuenta que “Query&lt;Client&gt;(string indexName)” es un “IRavenQueryable&lt;Client&gt;” con lo que podemos armar una expresión Linq, por lo que para efectos de prueba tenemos un “FirstOrDefault” </p>
<p>Una vez listo nuestro método lo utilizamos desde nuestra console application:</p>
<p><a href="http://www.fboiton.com/images/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/image_9.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/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/image_thumb_9.png" width="459" height="78"/></a> </p>
<p>y al ejecutarla tenemos la salida:</p>
<p><a href="http://www.fboiton.com/images/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/image_10.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/IncursionandoconRavenDBCrearunIndiceyRea_8FA2/image_thumb_10.png" width="509" height="57"/></a> </p>
<p>Y para que puedan probarlo, aca esta el <a href="http://www.fboiton.com/ClientsDirectory_v2.rar" target="_blank">codigo fuente</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fboiton.com/incursionando-con-ravendb-crear-un-indice-y-realizar-una-consulta/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>WinCache Extension para PHP en IIS</title>
		<link>http://www.fboiton.com/wincache-extension-para-php-en-iis</link>
		<comments>http://www.fboiton.com/wincache-extension-para-php-en-iis#comments</comments>
		<pubDate>Wed, 07 Jul 2010 19:43:39 +0000</pubDate>
		<dc:creator>fboiton</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[iis]]></category>
		<category><![CDATA[iis extension]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[wincache]]></category>

		<guid isPermaLink="false">http://www.fboiton.com/?p=37</guid>
		<description><![CDATA[Ya hay un release final de Windows Cache Extension for PHP es la versión 1.1 la cual incluye, funcionalidades nuevas como: Puede ser utilizada como una API de cache para almacenar objetos y variables de PHP. Tiene la opción de &#8230; <a href="http://www.fboiton.com/wincache-extension-para-php-en-iis">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ya hay un release final de <a href="http://www.iis.net/download/wincacheforphp" target="_blank">Windows Cache Extension for PHP</a> es la versión 1.1 la cual incluye, funcionalidades nuevas como:</p>
<ul>
<li>Puede ser utilizada como una API de cache para almacenar objetos y variables de PHP. </li>
<li>Tiene la opción de configurarse como Session Handler de PHP con persistencia en disco.</li>
</ul>
<p>Entre las características que posee esta extensión estan:</p>
<ul>
<li>Cache del bytecode de PHP en memoria, agilizando el tiempo de respuesta al no tener que parsear completamente los scripts PHP, lo cual reduce tambien el I/O overhead.</li>
<li>Debido a que la persistencia de los elementos en cache es en disco, situaciones como un Reciclado de los application pools no afectan en el cache ya creado.</li>
<li>Soporta las notificaciones de cambio de archivos, permitiendo refrescar los bytecodes en cache.</li>
<li>Cuenta con funciones de PHP para conocer el estado del cache.</li>
</ul>
<p>Creo que es una buena alternativa a utilizar en IIS para mejorar el performance de nuestras aplicaciones en PHP reduciendo el tiempo de interpretación de los scripts.</p>
<p>Para mayores detalles de uso podemos consultar el <a href="http://www.php.net/wincache/" target="_blank">Manual de PHP sobre Windows Cache</a> y para otros recursos sobre la extensión pueden consultar el blog de RuslanY con el <a href="http://ruslany.net/2010/06/wincache-extension-1-1-for-php-release-to-web/" target="_blank">post original</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fboiton.com/wincache-extension-para-php-en-iis/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual Studio 2010 Productivity Improvements</title>
		<link>http://www.fboiton.com/visual-studio-2010-productivity-improvements</link>
		<comments>http://www.fboiton.com/visual-studio-2010-productivity-improvements#comments</comments>
		<pubDate>Tue, 06 Jul 2010 18:21:07 +0000</pubDate>
		<dc:creator>fboiton</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://www.fboiton.com/?p=36</guid>
		<description><![CDATA[Hace un momento @elijahmanor compartió por twitter un artículo sobre las mejoras de productividad de Visual Studio 2010, el cuál corresponde a una serie de 4 posts en el Weblog de Somasegar y que pueden ver acá: &#160;VS 2010 productivity &#8230; <a href="http://www.fboiton.com/visual-studio-2010-productivity-improvements">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hace un momento @elijahmanor compartió por twitter un artículo sobre las mejoras de productividad de Visual Studio 2010, el cuál corresponde a una serie de 4 posts en el Weblog de <a href="http://blogs.msdn.com/b/somasegar/" target="_blank">Somasegar</a> y que pueden ver acá:</p>
<p>&#160;<a href="http://blogs.msdn.com/b/somasegar/archive/2010/05/25/vs-2010-productivity-improvements-part-i.aspx">VS 2010 productivity improvements, Part I</a></p>
<p><a href="http://blogs.msdn.com/b/somasegar/archive/2010/06/01/vs-2010-productivity-improvements-part-ii.aspx">VS 2010 productivity improvements, Part II</a></p>
<p><a href="http://blogs.msdn.com/b/somasegar/archive/2010/06/23/vs-2010-productivity-improvements-part-iii.aspx">VS 2010 Productivity Improvements, Part III</a></p>
<p><a href="http://blogs.msdn.com/b/somasegar/archive/2010/07/02/vs-2010-productivity-improvements-part-iv.aspx">VS 2010 Productivity Improvements, Part IV</a></p>
<p>Entre las características que me llamaron la atención estan:</p>
<ul>
<li>Code Navigation</li>
<li>Block Select and Block Edit</li>
<li>Pin Tabs</li>
<li>Multi-Monitor support</li>
</ul>
<p>Y bueno, no dejo por un lado las extensions que podemos agregar y que pueden seleccionar desde la <a href="http://visualstudiogallery.msdn.microsoft.com/en-us/site/search?sortBy=Popularity" target="_blank">Galería</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fboiton.com/visual-studio-2010-productivity-improvements/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fluent NHibernate : Component() y ComponentMap</title>
		<link>http://www.fboiton.com/fluent-nhibernate-component-y-componentmap</link>
		<comments>http://www.fboiton.com/fluent-nhibernate-component-y-componentmap#comments</comments>
		<pubDate>Mon, 05 Jul 2010 20:47:39 +0000</pubDate>
		<dc:creator>fboiton</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[fluent nhibernate]]></category>
		<category><![CDATA[nhibernate]]></category>
		<category><![CDATA[orm]]></category>
		<category><![CDATA[orm mappings]]></category>
		<category><![CDATA[storage]]></category>

		<guid isPermaLink="false">http://www.fboiton.com/?p=35</guid>
		<description><![CDATA[Pensemos que ya hemos interactuado aunque sea un poco con Fluent Nhibernate Al momento de realizar nuestros mapeos podemos manejar la composición simple manteniendo en una sola tabla las clasesque se relacionan En este caso “PreInitSearchContext” esta compuesto por un &#8230; <a href="http://www.fboiton.com/fluent-nhibernate-component-y-componentmap">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Pensemos que ya hemos interactuado aunque sea un poco con <a href="http://fluentnhibernate.org/" target="_blank">Fluent Nhibernate</a></p>
<p>Al momento de realizar nuestros mapeos podemos manejar la composición simple manteniendo en una sola tabla las clasesque se relacionan</p>
<p><a href="http://www.fboiton.com/images/FluentNHibernateComponentyComponentMapT_963E/image.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Figura 1: Clases para Ejemplo Nhibernate con 2 clases utilizando Component()" border="0" alt="Figura 1: Clases para Ejemplo Nhibernate con 2 clases utilizando Component()" src="http://www.fboiton.com/images/FluentNHibernateComponentyComponentMapT_963E/image_thumb.png" width="368" height="87" /></a> </p>
<p>En este caso “PreInitSearchContext” esta compuesto por un “ContextCreator”.</p>
<p>Traduciendo esto a un Mapeo con FluentNhibernate utilizando <a href="http://wiki.fluentnhibernate.org/Fluent_mapping#Components" target="_blank">“Component()”</a> tendríamos algo así:</p>
<p><a href="http://www.fboiton.com/images/FluentNHibernateComponentyComponentMapT_963E/image_3.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Figura 2: Codigo Ejemplo Nhibernate con 2 clases utilizando Component()" border="0" alt="Figura 2: Codigo Ejemplo Nhibernate con 2 clases utilizando Component()" src="http://www.fboiton.com/images/FluentNHibernateComponentyComponentMapT_963E/image_thumb_3.png" width="584" height="195" /></a> </p>
<p>Y con esto estaríamos Manteniendo en la misma tabla “pre_init_search_context” ambas clases. </p>
<p>Ahora bien, resulta que existe otra clase que tambien tiene una relación de composición con “ContextCreator”, asi:</p>
<p><a href="http://www.fboiton.com/images/FluentNHibernateComponentyComponentMapT_963E/image_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Figura 3: Clases para Ejemplo Nhibernate con 3 clases utilizando ComponentMap&lt;T&gt;" border="0" alt="Figura 3: Clases para Ejemplo Nhibernate con 3 clases utilizando ComponentMap&lt;T&gt;" src="http://www.fboiton.com/images/FluentNHibernateComponentyComponentMapT_963E/image_thumb_4.png" width="543" height="195" /></a> </p>
<p>Imagino que pensaron en “reutilizar” el código del método Component que tenemos en la clase anterior… y aunque es una opción, estamos generando código repetido y obviamente cayendo en conflictos existenciales relacionados con mantenibilidad.</p>
<p>Es aquí donde “<a href="http://wiki.fluentnhibernate.org/Fluent_mapping#ComponentMap.3CT.3E" target="_blank">ComponentMap&lt;T&gt;</a>” entra en juego, permitiendonos reutilizar el mapeo, en este caso del “ContextCreator”, entre las clases que sean necesarias <img src='http://www.fboiton.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Queda entonces nuestro mapeo asi:</p>
<p><a href="http://www.fboiton.com/images/FluentNHibernateComponentyComponentMapT_963E/image_5.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Figura 4: Codigo Ejemplo Nhibernate con 3 clases utilizando ComponentMap&lt;T&gt;" border="0" alt="Figura 4: Codigo Ejemplo Nhibernate con 3 clases utilizando ComponentMap&lt;T&gt;" src="http://www.fboiton.com/images/FluentNHibernateComponentyComponentMapT_963E/image_thumb_5.png" width="605" height="122" /></a> </p>
<p>dejando en cada una de las clases solamente:</p>
<p><a href="http://www.fboiton.com/images/FluentNHibernateComponentyComponentMapT_963E/image_6.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Figura 5: Codigo Ejemplo Nhibernate con 3 clases utilizando ComponentMap&lt;T&gt;" border="0" alt="Figura 5: Codigo Ejemplo Nhibernate con 3 clases utilizando ComponentMap&lt;T&gt;" src="http://www.fboiton.com/images/FluentNHibernateComponentyComponentMapT_963E/image_thumb_6.png" width="218" height="27" /></a> </p>
<p>De esta forma las clases “PreInitSearchContext” y “SearchContext” con sus respectivos mapeos independientes pueden reutilizar el mapeo de “ContextCreator” el cual se traducirá a un par de campos (segun la clase utilizada en el ejemplo) en cada una de las tablas correspondientes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fboiton.com/fluent-nhibernate-component-y-componentmap/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C#: Objetos son por referencia…</title>
		<link>http://www.fboiton.com/c-sharp-objetos-son-por-referencia</link>
		<comments>http://www.fboiton.com/c-sharp-objetos-son-por-referencia#comments</comments>
		<pubDate>Fri, 02 Jul 2010 19:26:05 +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[OOP]]></category>
		<category><![CDATA[software design]]></category>

		<guid isPermaLink="false">http://www.fboiton.com/?p=34</guid>
		<description><![CDATA[Varias veces se que hemos instanciado objetos por todos lados, y es más… cuántas veces hemos creado métodos donde recibimos un objeto, lo manipulamos y al final lo retornamos&#160; para asignarlo nuevamente a la variable que originalmente enviamos a método… &#8230; <a href="http://www.fboiton.com/c-sharp-objetos-son-por-referencia">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Varias veces se que hemos instanciado objetos por todos lados, y es más… cuántas veces hemos creado métodos donde recibimos un objeto, lo manipulamos y al final lo retornamos&#160; para asignarlo nuevamente a la variable que originalmente enviamos a método… uff! hasta yo mismo creo que me enredé….</p>
<p>A ver… C# nos dice que LAS CLASS INTANCES SON POR REFERENCIA MIENTRAS QUE LAS STRUCT INSTANCES(struct, enum, int, bool, chars… ) SON POR VALOR.</p>
<p>No voy a adentrarme esta vez en lo que implica el último párrafo con relación al uso de memoria o las struct instances y me enfocaré esta vez al título de este post: “C#: Objetos son por referencia…” con una pequeña Console Application.</p>
<p>Partimos de una clase que en si misma tendrá algunas properties y la responsabilidad de instanciarse a partir de un set de datos.</p>
<p><a href="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image_thumb.png" width="571" height="241" /></a> </p>
<p>Adicionalmente, para efectos de ejemplo, utilizaré un pequeño contenedor con una Lista Generica de Objetos “MyClass” la cual comenzamos así:</p>
<p><a href="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image_3.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image_thumb_3.png" width="494" height="249" /></a> </p>
<p>Luego en nos vamos a nuestra console application, en donde primero creamos 2 instancias, es decir, tendremos 2 variables que apuntan a 2 objetos diferentes:</p>
<p><a href="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image_4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image_thumb_4.png" width="602" height="51" /></a> </p>
<p>Cada una de las variables únicamente son apuntadores a los objetos. Con esto, cuando los enviamos como parámetros al método “AddAnMarkAsSaved”, dicho método estará modificando uno a uno y agregando dicha referencia a la Lista Genérica del Contenedor.</p>
<p><a href="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image_5.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image_thumb_5.png" width="632" height="229" /></a> </p>
<p>A este punto al ejecutar nuestra aplicación de ejemplo tenemos esta salida:</p>
<p><a href="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image_6.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image_thumb_6.png" width="587" height="106" /></a> </p>
<p>Una vez instanciado un objeto, las diferentes referencias que podamos tener al mismo, nos permitirán accesarlo, ojo… esto implica modificarlo… así que si pasamos por alto esto, podemos llegar a modificar “inconscientemente” el estado de un objeto cambiando lo que en nuestra aplicación realmente necesitamos.</p>
<p>Ohhh… Y entonces esto quiere decir que si extraigo el objeto de la lista que está en el contenedor y lo modifico, estoy cambiando el mismo objeto referenciado por las primeras variables?¿?¿?&#160; </p>
<p>Respuesta: SI!</p>
<p>Veamoslo en código, primero agreguemos a nuestro contenedor el método que nos retorne un objeto MyClass por su Id:</p>
<p><a href="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image_7.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image_thumb_7.png" width="484" height="76" /></a> </p>
<p>Luego, si obtenemos de la lista el objeto cuyo Id sea el mismo que el objeto que referencia la variable “one” y le modificamos su “Comment” :</p>
<p><a href="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image_8.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image_thumb_8.png" width="477" height="53" /></a> </p>
<p>Sorpresa! accesando al objeto con las variables “one” y “objectFromContainer” </p>
<p><a href="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image_9.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image_thumb_9.png" width="538" height="158" /></a> </p>
<p>en ambos casos obtendremos el mismo “Comment”… Aca la salida de nuestro programa:</p>
<p><a href="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image_10.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.fboiton.com/images/CObjetossonporreferencia_A5DB/image_thumb_10.png" width="625" height="175" /></a> </p>
<p>En resumen, cada vez que asignamos una variable donde hayamos instanciado un objeto a otra variable, o la pasamos como parametro a un método, lo que estamos haciendo realmente es <strong>ENVIAR UNA REFERENCIA</strong> a donde se encuentra el objeto en memoria. Es un juego de apuntadores donde podemos llegar a caer en problemas serios en nuestras aplicaciones si descuidamos este tema <img src='http://www.fboiton.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Acá el link a la MSDN Library por si desean adentrarse un poco mas en este tema:</p>
<p><a href="http://msdn.microsoft.com/en-us/library/ms173110." target="_blank">Objects (C# Programming Guide)</a></p>
<p>En este URL el <a href="http://www.fboiton.com/code-samples/ObjectsByReference.zip" target="_blank">código del ejemplo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fboiton.com/c-sharp-objetos-son-por-referencia/feed</wfw:commentRss>
		<slash:comments>0</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>ASP.NET Website Generic Handlers</title>
		<link>http://www.fboiton.com/aspnet-website-generic-handlers</link>
		<comments>http://www.fboiton.com/aspnet-website-generic-handlers#comments</comments>
		<pubDate>Thu, 24 Jun 2010 15:22:35 +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[practices]]></category>
		<category><![CDATA[web application]]></category>
		<category><![CDATA[webforms]]></category>

		<guid isPermaLink="false">http://www.fboiton.com/?p=32</guid>
		<description><![CDATA[Existen ocasiones que necesitamos dejar por un lado el HTML y responder XML, json, etc. Muchas veces hemos utilizado una página ASPX y el Response.Write para estos fines, sin embargo, existe otra opción… Los ASP.NET Generic Web Handler cuando trabajamos &#8230; <a href="http://www.fboiton.com/aspnet-website-generic-handlers">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Existen ocasiones que necesitamos dejar por un lado el HTML y responder XML, json, etc. Muchas veces hemos utilizado una página ASPX y el Response.Write para estos fines, sin embargo, existe otra opción… Los <em>ASP.NET Generic Web Handler </em>cuando trabajamos con <em>ASP.NET WebSites</em>.</p>
<p>No es que sea totalmente malo utilizar una ASPX, en realidad el punto es que toda ASPX hereda de System.Web.UI.Page y éste incluye ovehead que no necesitamos para lo que necesitamos.</p>
<p>Primero agregamos al proyecto nuestro Handler</p>
<p><a href="http://www.fboiton.com/images/ASP.NETCustomWebHandlerGenericHandlers_7E5D/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="294" alt="image" src="http://www.fboiton.com/images/ASP.NETCustomWebHandlerGenericHandlers_7E5D/image_thumb.png" width="547" border="0" /></a> </p>
<p>Una vez creado, obtendremos el código definido por el template</p>
<p><a href="http://www.fboiton.com/images/ASP.NETCustomWebHandlerGenericHandlers_7E5D/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="280" alt="image" src="http://www.fboiton.com/images/ASP.NETCustomWebHandlerGenericHandlers_7E5D/image_thumb_3.png" width="412" border="0" /></a> </p>
<p>Quien hace acá la magia es esta directiva:</p>
<p><a href="http://www.fboiton.com/images/ASP.NETCustomWebHandlerGenericHandlers_7E5D/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="26" alt="image" src="http://www.fboiton.com/images/ASP.NETCustomWebHandlerGenericHandlers_7E5D/image_thumb_4.png" width="478" border="0" /></a> </p>
<p>Básicamente, define que la Clase “Handler” se debe instanciar para manejar la respuesta al llamar a dicho archivo.</p>
<p>Recordemos definir siempre el content type, el cual en este ejemplo definiré para javascript “<em>application/x-javascript</em>” y la respuesta (que para efectos de este post lo dejaré con un Response.Write) la modificaré para retornar un array en formato json, lo que nos lleva a una clase así:</p>
<p> <code>public class Handler : IHttpHandler {    <br />&#160;&#160;&#160; public void ProcessRequest (HttpContext context) {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; context.Response.ContentType = &quot;application/x-javascript&quot;;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; context.Response.Write(&quot;{testlist:['value 1','value 2', 'value 3']}&quot;);     <br />&#160;&#160;&#160; }     <br />&#160;&#160;&#160; public bool IsReusable {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; get {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return false;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160; }
</p>
<p>}</p>
<p> </code>
</p>
<p>Al correr el scritp este es el resultado:</p>
<p><a href="http://www.fboiton.com/images/ASP.NETCustomWebHandlerGenericHandlers_7E5D/image_5.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="80" alt="image" src="http://www.fboiton.com/images/ASP.NETCustomWebHandlerGenericHandlers_7E5D/image_thumb_5.png" width="506" border="0" /></a> </p>
<p>Aclaro… Existen formas para serializara diferentes formatos, para relacionarlo con el ejemplo pueden ver la documentación en msdn de <a href="http://msdn.microsoft.com/en-us/library/system.web.script.serialization.aspx">Script Serialization</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fboiton.com/aspnet-website-generic-handlers/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IIS 7 + WebGarden + Session State + SQL Server</title>
		<link>http://www.fboiton.com/iis-7-webgarden-session-state-sql-server</link>
		<comments>http://www.fboiton.com/iis-7-webgarden-session-state-sql-server#comments</comments>
		<pubDate>Fri, 11 Jun 2010 23:42:09 +0000</pubDate>
		<dc:creator>fboiton</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[iis]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sessionstate]]></category>
		<category><![CDATA[sql server]]></category>
		<category><![CDATA[webgarden]]></category>
		<category><![CDATA[wincache]]></category>

		<guid isPermaLink="false">http://www.fboiton.com/?p=31</guid>
		<description><![CDATA[Hoy en el trabajo observamos un comportamiento un poco extraño relacionado con la información que almacenamos en Sesión y que utilizamos en una Web Application corriendo en un pequeño WebGarden teniendo configurado como Session State Server la opción de SQL &#8230; <a href="http://www.fboiton.com/iis-7-webgarden-session-state-sql-server">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hoy en el trabajo observamos un comportamiento un poco extraño relacionado con la información que almacenamos en Sesión y que utilizamos en una Web Application corriendo en un pequeño WebGarden teniendo configurado como Session State Server la opción de SQL Server. </p>
<p>Algunos links sobre Session State y la opción de SQL Server Session Mode</p>
<p><a href="http://www.codeproject.com/KB/aspnet/ExploringSession.aspx#21">Overview en CodePoject</a></p>
<p><a href="http://support.microsoft.com/kb/317604">How-To de Microsoft Support</a></p>
<p><a href="http://msdn.microsoft.com/en-us/magazine/cc163730.aspx">Fast, Scalable, and Secure Session State Management for Your Web Applications</a></p>
<p>En ocasiones, al cambiar de servidor dado a la distribución que realiza un load balancer, la aplicación parecía no poder obtener la información almacenada en sesión y por ende no poder continuar con el proceso que debía desarrollar. Al momento de revisar la base de datos de sesión pudimos percatarnos que habían 2 tuplas para una misma ASP.NetSessionId</p>
<p><a href="http://www.fboiton.com/images/IIS7WebGardenSessionStateSQLServer_EA2C/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="73" alt="image" src="http://www.fboiton.com/images/IIS7WebGardenSessionStateSQLServer_EA2C/image_thumb.png" width="384" border="0" /></a> </p>
<p>Query:<code> select * from ASPStateTempSessions where SessionId like '%piltae45debwl355ek3v0545%'</code></p>
<p>Y cómo es esto? Ok, resulta que el SessionId que utilizamos en nuestra aplicación no es lo único que se utiliza como llave en la tabla de SQL ya que está formada por:</p>
<p>Session Id + Application Id</p>
<p>(ver mas info acá: <a href="http://msdn.microsoft.com/en-us/library/aa478952.aspx">Session State Providers</a>)</p>
<p>Resultó entonces que por cada servidor nos estaba generando una tupla en nuestro storage de sesión, la primera con la información que habíamos almacenado y la segunda como una nueva sesión totalmente vacía. Esto debido a que a cada webserver le estaba asignando un diferente Application Id.</p>
<p>Me dirán por ahí que esto no debía suceder… también hay un trasfondo relacionado con la aplicación que casualmente permite esto, sin embargo esto lo dejamos para otro post <img src='http://www.fboiton.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Solución:</p>
<p>Debemos irnos a cada uno de los webservers del WebGarden y en cada uno debemos definir el “ID” del website. Para ello debemos colocarnos en “Sites”</p>
<p><a href="http://www.fboiton.com/images/IIS7WebGardenSessionStateSQLServer_EA2C/image_3.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="45" alt="image" src="http://www.fboiton.com/images/IIS7WebGardenSessionStateSQLServer_EA2C/image_thumb_3.png" width="462" border="0" /></a> </p>
<p>Dar click derecho y en “Manage Web Site” seleccionamos la opción “Advanced Settings”</p>
<p><a href="http://www.fboiton.com/images/IIS7WebGardenSessionStateSQLServer_EA2C/image_4.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="161" alt="image" src="http://www.fboiton.com/images/IIS7WebGardenSessionStateSQLServer_EA2C/image_thumb_4.png" width="470" border="0" /></a> </p>
<p>y finalmente nos aseguramos que el Website en cada uno de los Web Servers de nuestro WebGarden tenga el mismo ID</p>
<p><a href="http://www.fboiton.com/images/IIS7WebGardenSessionStateSQLServer_EA2C/image_5.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="86" alt="image" src="http://www.fboiton.com/images/IIS7WebGardenSessionStateSQLServer_EA2C/image_thumb_5.png" width="436" border="0" /></a> </p>
<p>Reiniciamos los IIS para que todo camine en orden y voila! <img src='http://www.fboiton.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.fboiton.com/iis-7-webgarden-session-state-sql-server/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>Response.Redirect y Server.Transfer</title>
		<link>http://www.fboiton.com/responseredirect-y-servertransfer</link>
		<comments>http://www.fboiton.com/responseredirect-y-servertransfer#comments</comments>
		<pubDate>Wed, 09 Jun 2010 17:28:11 +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>

		<guid isPermaLink="false">http://www.fboiton.com/?p=29</guid>
		<description><![CDATA[En estos dias recordé estas dos opciones que .Net nos ofrece en cuanto a un website se refiere y pues me dí cuenta que no las tenía claras. Luego de investigar un poco creo que ya toca un siguiente post. &#8230; <a href="http://www.fboiton.com/responseredirect-y-servertransfer">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>En estos dias recordé estas dos opciones que .Net nos ofrece en cuanto a un website se refiere y pues me dí cuenta que no las tenía claras. Luego de investigar un poco creo que ya toca un siguiente post. </p>
<p>Generalizando ambas realizan un redireccionamiento, sin embargo existen varias diferencias las cuales nos aclaran que cada una de las “opciones de redireccionamiento” tienen objetivos diferentes.</p>
<h4>Response.Redirect</h4>
<p>Basicamente envia al navegador una respuesta con headers de redireccionamiento a la nueva ubicación, la cual puede ser otra página en el mismo sitio, otro sitio en el mismo servidor u otro sitio externo. </p>
<p>Ejemplos:</p>
<p><code>Response.Redirect(“OtherPage.aspx”);&#160; //Para otra página en el mismo servidor.</code></p>
<p><code>Response.Redirect(“http://www.google.com/”); // Para otro sitio, no necesariamente en el mismo servidor</code></p>
<p>Ojo, con un Response.Redirect estamos haciendo notorio al usuario que se le está cambiando de ubicación y por ende ve la nueva dirección en el navegador, en resúmen, el usuario realiza un nuevo Request.</p>
<h4>Server.Transfer</h4>
<p>La similitud con Response.Redirect es que también envía al usuario hacia otra página, sin embargo, existen varias características que enumero a continuación:</p>
<ul>
<li>Se conservan los recursos del servidor ya que solamente se hace un “focus” </li>
<li>No se realiza ningún nuevo http request. </li>
<li>Se mantiene el mismo URL en el browser del usuario. </li>
<li>Tiene opción a mantener las colecciones del Formulario y QueryString. </li>
</ul>
<p>Server.Transfer solamente funciona entre sitios corriendo en el mismo server </p>
<p>Ejemplo de uso:</p>
<p><code>Server.Transfer(“otherPage.aspx”);</code></p>
<p><code>Server.Transfer(“otherPage.aspx”,true); // si queremos mantener las colecciones QueryString y Form</code></p>
<p>Para mas detalles pueden avocarse al MSDN </p>
<blockquote><p><a href="http://msdn.microsoft.com/en-us/library/08za4s98(v=VS.100).aspx">HttpResponse.Redirect Method</a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/caxa892w.aspx">HttpServerUtility.Transfer Method</a></p>
</blockquote>
<p>Espero les sea útil este post <img src='http://www.fboiton.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.fboiton.com/responseredirect-y-servertransfer/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>
	</channel>
</rss>
