<?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>Kinetica Solutions Blogs</title>
	<atom:link href="http://blogs.kinetica-solutions.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.kinetica-solutions.com</link>
	<description>Notas y apuntes sobre las cosas que nos interesan</description>
	<lastBuildDate>Mon, 20 May 2013 19:48:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>HTML, Razor y JS</title>
		<link>http://blogs.kinetica-solutions.com/blog/2013/05/20/html-razor-y-js/</link>
		<comments>http://blogs.kinetica-solutions.com/blog/2013/05/20/html-razor-y-js/#comments</comments>
		<pubDate>Mon, 20 May 2013 19:48:19 +0000</pubDate>
		<dc:creator>Diego Sisto</dc:creator>
				<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[MVC3]]></category>
		<category><![CDATA[Razor]]></category>
		<category><![CDATA[text tag]]></category>

		<guid isPermaLink="false">http://blogs.kinetica-solutions.com/blog/2013/05/20/html-razor-y-js/</guid>
		<description><![CDATA[Quizás conozcan Razor y ya sean fanáticos de los @variable, @foreach, @if, etc. A continuación algunos tips para no volvernos locos. Este es el caso más simple: @if (lista.Count == 0) { &#60;div&#62;No se encontraron resultados&#60;/div&#62; } Pero si quisiéramos &#8230; <a href="http://blogs.kinetica-solutions.com/blog/2013/05/20/html-razor-y-js/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Quizás conozcan <font face="Courier New">Razor</font> y ya sean fanáticos de los <font face="Courier New">@variable</font>, <font face="Courier New">@foreach</font>, <font face="Courier New">@if</font>, etc. A continuación algunos tips para no volvernos locos.</p>
<p>Este es el caso más simple:</p>
<pre>@if (lista.Count == 0)
{
	&lt;div&gt;No se encontraron resultados&lt;/div&gt;
}
</pre>
<p>Pero si quisiéramos hacer algo así:</p>
<pre>@if (lista.Count == 0)
{
	No se encontraron resultados
}
</pre>
<p>Nos encontraríamos con un problema. <font face="Courier New">Razor</font> trata de seguir interpretando el texto como código <font face="Courier New">C#</font> y nos lanza un error de compilación.</p>
<p>En realidad la solución es bastante simple, usar el <em>tag</em> &#8220;falso&#8221; <font face="Courier New">text</font>:</p>
<pre>@if (lista.Count == 0)
{
	&lt;text&gt;No se encontraron resultados&lt;/text&gt;
}
</pre>
<p>De esta forma <font face="Courier New">Razor</font> interpreta esa parte como <font face="Courier New">HTML</font> en lugar de <font face="Courier New">C#.</font></p>
<p>Este caso es bastante sencillo pero se complica un poco más cuando uno se encuentra generando código <font face="Courier New">JS</font> con código <font face="Courier New">C#</font>. Hay que tener este concepto bien claro para entender un código como el que sigue:</p>
<pre>&lt;script&gt;
var arrayDeJs = [];
@foreach (var resultado in Model)
{
	&lt;text&gt;arrayDeJs.push({ nombre: @resultado.Nombre });&lt;/text&gt;
}
&lt;/script&gt;
</pre>
<p>¡Saludos!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.kinetica-solutions.com/blog/2013/05/20/html-razor-y-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un poco de TDD en aplicaciones Windows 8 Modern UI</title>
		<link>http://blogs.kinetica-solutions.com/blog/2013/05/15/un-poco-de-tdd-en-aplicaciones-windows-8-modern-ui/</link>
		<comments>http://blogs.kinetica-solutions.com/blog/2013/05/15/un-poco-de-tdd-en-aplicaciones-windows-8-modern-ui/#comments</comments>
		<pubDate>Wed, 15 May 2013 19:15:07 +0000</pubDate>
		<dc:creator>Fernando Claverino</dc:creator>
				<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">http://blogs.kinetica-solutions.com/?p=904</guid>
		<description><![CDATA[En una aplicación que estamos haciendo, necesitamos clasificar un texto según 3 tipos de promociones: %, cuotas u otro. En este caso usamos qunit como framework de test unitario para javascript. Estos son los test: https://gist.github.com/ferclaverino/5594014#file-test-js Y el código que &#8230; <a href="http://blogs.kinetica-solutions.com/blog/2013/05/15/un-poco-de-tdd-en-aplicaciones-windows-8-modern-ui/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>En una aplicación que estamos haciendo, necesitamos clasificar un texto según 3 tipos de promociones: %, cuotas u otro. En este caso usamos <a href="http://qunitjs.com/" target="_blank">qunit</a> como framework de test unitario para javascript.</p>
<p>Estos son los test:<br />
<a href="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/05/test.png"><img src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/05/test.png" alt="" width="824" height="545" class="alignnone size-full wp-image-908" /></a><br />
<a href="https://gist.github.com/ferclaverino/5594014#file-test-js" target="_blank">https://gist.github.com/ferclaverino/5594014#file-test-js</a></p>
<p>Y el código que pasa los test:<br />
<a href="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/05/benefit.png"><img src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/05/benefit.png" alt="" width="804" height="492" class="alignnone size-full wp-image-907" /></a><br />
<a href="https://gist.github.com/ferclaverino/5594014#file-benefit-js" target="_blank">https://gist.github.com/ferclaverino/5594014#file-benefit-js</a></p>
<p>Para mantener el código organizado (ya que en las aplicaciones Windows 8 suele haber mucho código javascript), necesitamos definir un <a href="http://www.leomicheloni.com/post/2012/03/20/Namespaces-en-aplicaciones-Metro-Javascript-con-la-ayuda-de-WinJS.aspx" target="_blank">namespace</a> usando WinJS:<br />
<code><br />
WinJS.Namespace.define("Benefit", {<br />
&nbsp;&nbsp;parseBenefit: parseBenefit<br />
});<br />
</code><br />
Gracias a la magia de javascript, podemos crear en los test un arnés para definir un namespace fuera de una aplicación windows 8 y ejecutar los test en una aplicación html + javascript estándar.<br />
<code><br />
var Benefit;<br />
var WinJS = {};<br />
WinJS.Namespace = {};<br />
WinJS.Namespace.define = function(name, object) {<br />
&nbsp;&nbsp;if (name == "Benefit") {<br />
&nbsp;&nbsp;&nbsp;&nbsp;Benefit = object;<br />
&nbsp;&nbsp;}<br />
}<br />
</code><br />
De esta forma, y separado las responsabilidades, podemos fácilmente hacer TDD en aplicaciones Windows 8 Modern UI.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.kinetica-solutions.com/blog/2013/05/15/un-poco-de-tdd-en-aplicaciones-windows-8-modern-ui/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo renderizar imágenes obteniéndolas de BD y cachearlas a nivel navegador con MVC3?</title>
		<link>http://blogs.kinetica-solutions.com/blog/2013/05/15/como-renderizar-imagenes-obteniendolas-de-bd-y-cachearlas-a-nivel-navegador-con-mvc3/</link>
		<comments>http://blogs.kinetica-solutions.com/blog/2013/05/15/como-renderizar-imagenes-obteniendolas-de-bd-y-cachearlas-a-nivel-navegador-con-mvc3/#comments</comments>
		<pubDate>Wed, 15 May 2013 15:10:25 +0000</pubDate>
		<dc:creator>acavallero</dc:creator>
				<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blogs.kinetica-solutions.com/?p=892</guid>
		<description><![CDATA[Muy buenas a todos! Este post se podría dividir en dos partes: la primera sería, tal como el título indica, cómo mostrar en una vista una imagen que no se encuentra alojada en el servidor como archivo de formato jpg/png/etc. sino que &#8230; <a href="http://blogs.kinetica-solutions.com/blog/2013/05/15/como-renderizar-imagenes-obteniendolas-de-bd-y-cachearlas-a-nivel-navegador-con-mvc3/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Muy buenas a todos!</p>
<p>Este post se podría dividir en dos partes: la primera sería, tal como el título indica, cómo mostrar en una vista una imagen que no se encuentra alojada en el servidor como archivo de formato jpg/png/etc. sino que está almacenada en una base de datos como array de bytes. Lo anterior, si bien no deja de ser &#8220;piola&#8221;, es algo dentro de todo sencillo. La segunda parte es una vuelta de tuerca más de la primera: &#8220;okey, ya puedo ver la imagen&#8230; cómo hago para que el navegador no la trafique cada vez que recargo la página?&#8221;.</p>
<p>1) Partimos de código HTML en el cual aparece una imagen:</p>
<pre>&lt;img src="../content/img/categories/5.png" alt="Una foto"&gt;</pre>
<p>2) Editamos el archivo Global.asax.cs. Lo que vamos a hacer es agregarle una ruta para que justamente rutee las direcciones del tipo &#8220;content/img/categories&#8221; a una acción de un controlador nuestro:</p>
<pre>public static void RegisterRoutes(RouteCollection routes)
{
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

   routes.MapRoute(
      "Default", // Route name
      "{controller}/{action}/{id}", // URL with parameters
      new { controller = "Account",
            action = "LogOn",
            id = UrlParameter.Optional });

   //Ruta que agrego
   routes.MapRoute(
      "ImagenCategory",
      "content/img/Categories/{filename}",
      new { controller = "Image",
            action = "LoadCategory" });
}</pre>
<p>Notar que pusimos un parámetro en la ruta llamado &#8220;filename&#8221;. Este parámetro va a ser el id de la imagen en la base de datos.</p>
<p>3) También agregamos nuestro controlador (llamado &#8220;ImageController&#8221;) y nuestra acción (&#8220;LoadCategory&#8221;), que son estos:</p>
<pre style="width: 600px">namespace Ejemplo
{
    using System.IO;
    using System.Web.Mvc;

    public class ImageController : Controller
    {
        public ActionResult LoadCategory(string filename)
        {
            //El catálogo me devuelve un objeto que tiene dos
            //atributos: el byte[] de la imagen y la fecha de modificación
            ImageAssociation image = new CategoryRepository().GetImage(filename);

            return this.File(new MemoryStream(image.Image), "image/jpg");
        }
     }
}</pre>
<p>Es importante como devolvemos el resultado!</p>
<p>Entonces, a partir de ahora, cada vez  que aparezca una referencia con ese formato en el html, se va a invocar a esta acción en vez de buscar la imagen en el path virtual del servidor. Y con esto cubrimos la primera parte!</p>
<p>Ahora vamos a enfocarnos en el manejo del cacheo de la imagen&#8230;</p>
<p>Si vamos a Fiddler o a la solapa red del Firebug, tal como estamos hasta el momento y cada vez que recarguemos la página, vamos a ver que la llamada correspondiente a la imagen devuelve un código 200 y que trafica preciosos KB. Lo que queremos es que si la imagen ya la descargamos previamente y no se modificó devuelva un código 304 y la obtenga de la caché del navegador sin traficar nada más.</p>
<p>Para esto vamos a modificar la acción de esta manera:</p>
<pre style="width: 600px">public ActionResult LoadCategory(string filename)
{
   ImageAssociation image = new CategoryRepository().GetImage(filename);

   var headerValue = Request.Headers["If-Modified-Since"];
   if (headerValue != null)
   {
      var modifiedSince = DateTime.Parse(headerValue).ToUniversalTime();
      if (Math.Abs(modifiedSince.Subtract(image.Date).TotalMinutes) &lt; 1)
      {
         Response.SuppressContent = true;
         Response.StatusCode = 304;
         Response.StatusDescription = "Not Modified";
         Response.AddHeader("Content-Length", "0");

         return new EmptyResult();
      }
   }

   Response.AddHeader("Last-Modified", image.Date.ToString("R"));

   return File(new MemoryStream(image.Image), "image/png");
}
</pre>
<p>Las claves de esto son los headers &#8220;If-Modified-Since&#8221; y &#8220;Last-Modified&#8221; que nos permiten comparar si la versión de la imagen cacheada en el navegador cambió o no (para esto es que teníamos la clase ImageAssociation con el byte[] y la fecha de modificación) respecto a la que está en base de datos. Si bien estamos yendo a la base para obtener la imagen y su fecha de modificación (mismo se podría separar estos datos para que la consulta sea más liviana), esto es una operación mucho menos costosa -despreciable- en tiempo que traficar la imagen por la red.<br />
Finalmente, si la imagen no cambió devolvemos un EmptyResult con el código 304 y conseguimos lo que buscábamos!</p>
<p>Espero que les sirva!<br />
Saludos</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.kinetica-solutions.com/blog/2013/05/15/como-renderizar-imagenes-obteniendolas-de-bd-y-cachearlas-a-nivel-navegador-con-mvc3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C&#243;mo ocultar una tag img cuando la imagen no existe</title>
		<link>http://blogs.kinetica-solutions.com/blog/2013/05/06/cmo-ocultar-una-tag-img-cuando-no-la-imagen-no-existe/</link>
		<comments>http://blogs.kinetica-solutions.com/blog/2013/05/06/cmo-ocultar-una-tag-img-cuando-no-la-imagen-no-existe/#comments</comments>
		<pubDate>Mon, 06 May 2013 13:02:45 +0000</pubDate>
		<dc:creator>Adrián Eidelman</dc:creator>
				<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://blogs.kinetica-solutions.com/?p=885</guid>
		<description><![CDATA[Creo que no hace falta demasiada explicación: &#60;img src="http://miserver.com/img.png" onerror="javascript:this.style.display = 'none'" /&#62; La otra alternativa comúnmente utilizada es la de establecer una imagen default: &#60;img src="http://miserver.com/img.png" onerror="javascript:this.src = '/images/imgdefault.png'" /&#62;]]></description>
			<content:encoded><![CDATA[<p>Creo que no hace falta demasiada explicación:</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">&lt;img src="http://miserver.com/img.png" onerror="javascript:this.style.display = 'none'" /&gt;</pre>
<p>La otra alternativa comúnmente utilizada es la de establecer una imagen default:</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">&lt;img src="http://miserver.com/img.png" onerror="javascript:this.src = '/images/imgdefault.png'" /&gt;</pre>
<p><img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Smile" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/05/wlEmoticon-smile.png"></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.kinetica-solutions.com/blog/2013/05/06/cmo-ocultar-una-tag-img-cuando-no-la-imagen-no-existe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desarrollo de videojuegos con HTML5 &#8211; Parte 7</title>
		<link>http://blogs.kinetica-solutions.com/blog/2013/05/03/desarrollo-de-videojuegos-con-html5-parte-7/</link>
		<comments>http://blogs.kinetica-solutions.com/blog/2013/05/03/desarrollo-de-videojuegos-con-html5-parte-7/#comments</comments>
		<pubDate>Fri, 03 May 2013 20:12:47 +0000</pubDate>
		<dc:creator>miacono</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Videojuegos]]></category>

		<guid isPermaLink="false">http://blogs.kinetica-solutions.com/?p=876</guid>
		<description><![CDATA[Después de un tiempo de descanso, es hora de retomar este paso a paso para realizar nuestros juegos con HTML5 y JavaScript. En esta oportunidad hablaremos sobre una de las características básicas de todo juego, las colisiones. Detectar colisiones en &#8230; <a href="http://blogs.kinetica-solutions.com/blog/2013/05/03/desarrollo-de-videojuegos-con-html5-parte-7/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/02/HTML5_sticker_0.png"><img class="aligncenter size-full wp-image-739" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/02/HTML5_sticker_0.png" alt="" width="504" height="252" /></a></p>
<p>Después de un tiempo de descanso, es hora de retomar este paso a paso para realizar nuestros juegos con HTML5 y JavaScript.</p>
<p>En esta oportunidad hablaremos sobre una de las características básicas de todo juego, las colisiones.</p>
<p>Detectar colisiones en un videojuego es una tarea común, no solo para poder saber si dos objetos del juego se tocan, como por ejemplo, una bala disparada por nuestro personaje impactando contra un enemigo, sino que además, la interacción con el puntero del ratón, o los dedos en una pantalla táctil para acceder a un determinado menú del juego también representa una colisión.</p>
<p>Existen muchos métodos para detectar que dos objetos se están tocando, cada uno de estos más eficientes que los otros en determinados casos. Podemos encontrar colisiones en forma de caja (<em>La que usaremos para el ejemplo</em>), por píxeles, verificando que solo píxeles de color de un objeto estéen tocando los píxeles del otro objeto, mediante proyección de líneas (<em>Ray Casting</em>), y muchos otros métodos.</p>
<p>La colisión por cajas, entonces, es una de las más simples y puede resultar efectiva si nuestro juego no cuenta con gran cantidad de elementos para detectar si están en colisión o no, ya que si bien no es dependiente de este tipo de colisión, se suele hacer un escaneo por todos los elementos del juego y verificar, uno a uno, si nuestro objeto están en contacto con otro.</p>
<p>Para entender la mecánica de esta forma de detectar colisiones, pensemos en nuestro objeto de juego al cual le dibujamos una caja que lo contenga. Esta caja poseerá tanto las coordenadas X e Y donde se sitúa, además de las dimensiones de ancho y alto. Luego, teniendo el objeto contra el cual probar la colisión, dibujaremos otra caja con datos similares. Cuando ambas cajas entran en contacto, entonces entendemos que existe una colisión.</p>
<p><a href="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/05/gameCollision.png"><img class="aligncenter size-full wp-image-877" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/05/gameCollision.png" alt="" width="350" height="400" /></a></p>
<p style="text-align: center"><em><strong>Este tipo de colisiones no promete detectar correctamente la misma si las formas son irregulares.</strong></em></p>
<p>Como vemos en la imagen, si las formas (<em>Gráficos</em>) son irregulares, al crearse una caja para contenerlo, puede quedar mucho espacio sin uso, pero que será tomado como válido para la colisión. Para mejorar este comportamiento, una colisión por píxel sería más adecuada, ya que la misma detectará solo aquellos píxeles de color y no los transparentes en nuestro sprite, por supuesto, realizar el cálculo para dicha detección resulta algo más costosa en cálculos computacionales.</p>
<p>Entonces, para detectar mediante la colisión por cajas necesitamos saber las coordenadas de los dos objetos además de sus dimensiones. Una excelente solución es la que nos propone <em>Matthew Casperson</em> con su clase <strong>Rectangle</strong> en JavaScript.</p>
<pre>function Rectangle()
{
    this.left = 0;
    this.top = 0;
    this.width = 0;
    this.height = 0;

    this.startupRectangle = function(left, top, width, height)
    {
        this.left = left;
        this.top = top;
        this.width = width;
        this.height = height;
        return this;
    }

    this.intersects = function(other)
    {
        if (this.left + this.width &lt; other.left)
            return false;
        if (this.top + this.height &lt; other.top)
            return false;
        if (this.left &gt; other.left + other.width)
            return false;
        if (this.top &gt; other.top + other.height)
            return false;

        return true;
    }
}</pre>
<p>La sección más importante está dentro de la función <strong>intersects</strong>, la cual toma los dos rectángulos y compara los mismos para saber que una parte del primero se encuentre en alguna parte del segundo.</p>
<p>Para este ejemplo, dibujaremos un rectángulo en el trayecto de nuestro personaje. Cuando el mismo toque dicho rectángulo, este dejará de avanzar.</p>
<pre>contextBuffer.save();
	contextBuffer.fillStyle = "black";
	contextBuffer.fillRect(300, 10, 30, 40);
contextBuffer.restore();</pre>
<p>A continuación del dibujado de nuestro personaje, dibujamos un rectángulo de color negro. Podemos notar en el código que estamos utilizado dos funciones, <strong>save</strong> y <strong>restore</strong>. Estas funciones sirven para guardar el estado del lienzo de dibujo en ese momento, poder realizar cualquier modificación, agregar elementos, y luego retornar el lienzo al estado anterior. De esta forma, el cambio de color mediante <strong>fillStyle</strong> no afectará otras funciones que usen este color para rellenar formas.</p>
<p><a href="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/05/yodaBlock1.png"><img class="aligncenter size-medium wp-image-880" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/05/yodaBlock1-300x235.png" alt="" width="300" height="235" /></a></p>
<p style="text-align: center"><strong><em>El bloque negro se interpone en el camino de nuestro personaje.</em></strong></p>
<p>El siguiente paso, para detectar la colisión será verificar el estado de los dos objetos tras cada actualización del juego.</p>
<pre>var boxBlock = new Rectangle();
boxBlock.startupRectangle(300, 10, 30, 40);
var boxYoda = new Rectangle();</pre>
<p>Debido a que sabemos de antemano la posición del rectángulo negro, no es necesario actualizarlo cada vez que el juego se modifica, por lo que escribiremos el código anterior fuera del bucle principal del juego. Finalmente, en el bucle, comprobaremos la posición actual del personaje y su intersección con el bloque.</p>
<pre>boxYoda.startupRectangle(x, 10, 42, 39);
if (!boxYoda.intersects(boxBlock)) {
	x++;
}</pre>
<p>Solo si el personaje no está en colisión con el bloque, podrá avanzar un píxel.</p>
<p><a href="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/05/yodaBloqued.png"><img class="aligncenter size-medium wp-image-882" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/05/yodaBloqued-300x235.png" alt="" width="300" height="235" /></a>Como decíamos, este tipo de comprobación suele ser costosa, pero eficiente para darnos una solución rápida para nuestros juegos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.kinetica-solutions.com/blog/2013/05/03/desarrollo-de-videojuegos-con-html5-parte-7/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Manejo de excepciones</title>
		<link>http://blogs.kinetica-solutions.com/blog/2013/05/02/manejo-de-excepciones/</link>
		<comments>http://blogs.kinetica-solutions.com/blog/2013/05/02/manejo-de-excepciones/#comments</comments>
		<pubDate>Thu, 02 May 2013 15:33:41 +0000</pubDate>
		<dc:creator>ibarcia</dc:creator>
				<category><![CDATA[ASP.NET MVC]]></category>

		<guid isPermaLink="false">http://blogs.kinetica-solutions.com/blog/2013/05/02/manejo-de-excepciones/</guid>
		<description><![CDATA[En una aplicación MVC en la cual estaba trabajando tenia que loguear en la base de datos toda excepción que se dispare de un controller en especial. Para esto, cree un nuevo controller, que llame BaseController, el cual será donde &#8230; <a href="http://blogs.kinetica-solutions.com/blog/2013/05/02/manejo-de-excepciones/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>En una aplicación MVC en la cual estaba trabajando tenia que loguear en la base de datos toda excepción que se dispare de un controller en especial.
<p>Para esto, cree un nuevo controller, que llame <em>BaseController</em>, el cual será donde logueare en la base de datos la excepción obtenida.</p>
<div style="overflow: auto;cursor: text;font-size: 8pt;border-top: silver 1px solid;font-family: 'Courier New', courier, monospace;border-right: silver 1px solid;border-bottom: silver 1px solid;padding-bottom: 4px;direction: ltr;text-align: left;padding-top: 4px;padding-left: 4px;margin: 20px 0px 10px;border-left: silver 1px solid;line-height: 12pt;padding-right: 4px;width: 97.5%;background-color: #f4f4f4">
<div style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;line-height: 12pt;padding-right: 0px;width: 100%;background-color: #f4f4f4">
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: white"><span style="color: #606060">   1:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> BaseController : Controller</pre>
<p><!--CRLF-->
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: #f4f4f4"><span style="color: #606060">   2:</span> {</pre>
<p><!--CRLF-->
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: white"><span style="color: #606060">   3:</span>     </pre>
<p><!--CRLF-->
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: #f4f4f4"><span style="color: #606060">   4:</span> }</pre>
<p><!--CRLF--></div>
</div>
<p>&nbsp;</p>
<p>Como se puede ver, cuando se crea un controller, empieza heredando de <em>Controller</em>. Esto es importante ya que dicho <em>Controller</em> es el que posee el método <em>OnException</em> del cual queremos sobrescribir. </p>
<p>Por tal motivo, sobrescribimos el método <em>OnException</em> para poder loguear la excepción obtenida y poder setearle un mensaje default ante cualquier falla en la aplicación.</p>
<div style="overflow: auto;cursor: text;font-size: 8pt;border-top: silver 1px solid;font-family: 'Courier New', courier, monospace;border-right: silver 1px solid;border-bottom: silver 1px solid;padding-bottom: 4px;direction: ltr;text-align: left;padding-top: 4px;padding-left: 4px;margin: 20px 0px 10px;border-left: silver 1px solid;line-height: 12pt;padding-right: 4px;width: 97.5%;background-color: #f4f4f4">
<div style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;line-height: 12pt;padding-right: 0px;width: 100%;background-color: #f4f4f4">
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: white"><span style="color: #606060">   1:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> BaseController : Controller</pre>
<p><!--CRLF-->
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: #f4f4f4"><span style="color: #606060">   2:</span> {</pre>
<p><!--CRLF-->
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: white"><span style="color: #606060">   3:</span>     <span style="color: #0000ff">private</span> LogService logService = <span style="color: #0000ff">new</span> LogService();</pre>
<p><!--CRLF-->
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: #f4f4f4"><span style="color: #606060">   4:</span>&nbsp; </pre>
<p><!--CRLF-->
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: white"><span style="color: #606060">   5:</span>     <span style="color: #0000ff">protected</span> <span style="color: #0000ff">override</span> <span style="color: #0000ff">void</span> OnException(ExceptionContext filterContext)</pre>
<p><!--CRLF-->
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: #f4f4f4"><span style="color: #606060">   6:</span>     {</pre>
<p><!--CRLF-->
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: white"><span style="color: #606060">   7:</span>         <span style="color: #0000ff">this</span>.logService.LogError(<span style="color: #006080">"Se ha producido un error"</span>, filterContext.Exception.Message, filterContext.Exception.StackTrace);</pre>
<p><!--CRLF-->
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: #f4f4f4"><span style="color: #606060">   8:</span>&nbsp; </pre>
<p><!--CRLF-->
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: white"><span style="color: #606060">   9:</span>         <span style="color: #0000ff">base</span>.OnException(filterContext);</pre>
<p><!--CRLF-->
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: #f4f4f4"><span style="color: #606060">  10:</span>     }</pre>
<p><!--CRLF-->
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: white"><span style="color: #606060">  11:</span> }</pre>
<p><!--CRLF--></div>
</div>
<p>&nbsp;</p>
<p>Utilice una clase que la llame <em>LogService</em> en la cual tengo el método para poder loguear en la base de datos. </p>
<p>Luego, al controller que quiero loguear sus excepciones, en este caso el <em>HomeController</em>, hice que herede del <em>BaseController</em> reemplazando la herencia que tenia con Controller. </p>
<div style="overflow: auto;cursor: text;font-size: 8pt;border-top: silver 1px solid;font-family: 'Courier New', courier, monospace;border-right: silver 1px solid;border-bottom: silver 1px solid;padding-bottom: 4px;direction: ltr;text-align: left;padding-top: 4px;padding-left: 4px;margin: 20px 0px 10px;border-left: silver 1px solid;line-height: 12pt;padding-right: 4px;width: 97.5%;background-color: #f4f4f4">
<div style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;line-height: 12pt;padding-right: 0px;width: 100%;background-color: #f4f4f4">
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: white"><span style="color: #606060">   1:</span> <span style="color: #0000ff">public</span> HomeController : BaseController</pre>
<p><!--CRLF-->
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: #f4f4f4"><span style="color: #606060">   2:</span> {</pre>
<p><!--CRLF-->
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: white"><span style="color: #606060">   3:</span>     <span style="color: #008000">// Code...</span></pre>
<p><!--CRLF-->
<pre style="border-top-style: none;overflow: visible;font-size: 8pt;border-left-style: none;font-family: 'Courier New', courier, monospace;border-bottom-style: none;color: black;padding-bottom: 0px;direction: ltr;text-align: left;padding-top: 0px;border-right-style: none;padding-left: 0px;margin: 0em;line-height: 12pt;padding-right: 0px;width: 100%;background-color: #f4f4f4"><span style="color: #606060">   4:</span> }</pre>
<p><!--CRLF--></div>
</div>
<p>&nbsp;</p>
<p>De esta forma pude manejar la excepción independientemente de donde se este disparando y asi hacer una misma funcionalidad para todos los casos.</p>
<p>Espero que les haya gustado…chau!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.kinetica-solutions.com/blog/2013/05/02/manejo-de-excepciones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Escribiendo HTML Helper propios</title>
		<link>http://blogs.kinetica-solutions.com/blog/2013/05/01/escribiendo-html-helper-propios/</link>
		<comments>http://blogs.kinetica-solutions.com/blog/2013/05/01/escribiendo-html-helper-propios/#comments</comments>
		<pubDate>Wed, 01 May 2013 14:01:32 +0000</pubDate>
		<dc:creator>Diego Sisto</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.kinetica-solutions.com/blog/2013/05/01/escribiendo-html-helper-propios/</guid>
		<description><![CDATA[Estaba desarrollando una aplicación con jQuery Mobile que tenía formularios extensos. Me di cuenta que perdía mucho tiempo escribiendo el HTML, aun con Razor porque los controles de jQuery Mobile tienen características particulares. Entonces decidí escribirme unos HTML Helpers que &#8230; <a href="http://blogs.kinetica-solutions.com/blog/2013/05/01/escribiendo-html-helper-propios/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Estaba desarrollando una aplicación con <a href="http://jquerymobile.com/">jQuery Mobile</a> que tenía formularios extensos. Me di cuenta que perdía mucho tiempo escribiendo el <font face="Courier New">HTML</font>, aun con <a href="http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx">Razor</a> porque los controles de<em> jQuery Mobile</em> tienen características particulares. Entonces decidí escribirme unos<font face="Courier New"> HTML Helpers</font> que me hicieran la tarea más fácil.</p>
<p>Los <font face="Courier New">helpers</font> de HTML son simples extensiones a la clase <font face="Courier New">HtmlHelper</font>. Se definen creando una clase más o menos así:<a href="https://gist.github.com/suelopoder/5502025"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Ejempo simple de extensiones a HTML" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/05/Ejempo-simple-de-extensiones-a-HTML.png" width="521" height="269"></a></p>
<p>La parte con el comentario “Uso” debería ser en una vista.</p>
<p>Ahora bien, mis <font face="Courier New">helpers</font> son muy cómodos para crear <font face="Courier New">HTML</font> sin parámetros, pero yo quería usarlo como los que vienen con <font face="Courier New">MVC3</font>. La idea era usarlos de la siguiente forma:</p>
<pre>@Html.MobileYesOrNo(m =&gt; m.UnaProperty)
</pre>
<p>Les dejo la implementación del método <font face="Courier New">MobileYesOrNo</font>:</p>
<p><a href="https://gist.github.com/suelopoder/5502220"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="Ejemplo de control mobile con HTML Helpers 1" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/05/Ejemplo-de-control-mobile-con-HTML-Helpers-1.png" width="568" height="296"></a></p>
<p>Como ven, el método escribe varias líneas en <font face="Courier New">HTML</font>. Eso me simplifica bastante las vistas y reduce mi esfuerzo.</p>
<p>Otra ventaja es que lo puedo testear, ya que el resultado es un <font face="Courier New">string:</font></p>
<p><a href="https://gist.github.com/suelopoder/5502344"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="Test del Mobile YesOrNo" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/05/Test-del-Mobile-YesOrNo.png" width="565" height="214"></a></p>
<p>Para el manejo de la <font face="Courier New">property</font> que se pasa por parámetro me valgo de algunos métodos que no se ven en la imagen. Si lo desean, pueden hacer click en ella para ver el código.</p>
<p>Espero que les sirva. Saludos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.kinetica-solutions.com/blog/2013/05/01/escribiendo-html-helper-propios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C&#243;mo conectarse a un servicio WCF sin agregarlo como service reference</title>
		<link>http://blogs.kinetica-solutions.com/blog/2013/04/23/como-conectarse-a-un-servicio-wcf-sin-agregarlo-como-service-reference/</link>
		<comments>http://blogs.kinetica-solutions.com/blog/2013/04/23/como-conectarse-a-un-servicio-wcf-sin-agregarlo-como-service-reference/#comments</comments>
		<pubDate>Tue, 23 Apr 2013 20:41:43 +0000</pubDate>
		<dc:creator>leangoldin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.kinetica-solutions.com/blog/2013/04/23/cmo-conectarse-a-un-servicio-wcf-sin-agregarlo-como-service-reference/</guid>
		<description><![CDATA[En distintos proyectos tuvimos que generar conexiones a servicios wcf. La manera práctica de hacer esto es agregar el servicio como service reference y automaticamente tendríamos todo lo necesario para poder invocar al servicio externo. En este post nos gustaría &#8230; <a href="http://blogs.kinetica-solutions.com/blog/2013/04/23/como-conectarse-a-un-servicio-wcf-sin-agregarlo-como-service-reference/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>En distintos proyectos tuvimos que generar conexiones a servicios wcf. La manera práctica de hacer esto es agregar el servicio como service reference y automaticamente tendríamos todo lo necesario para poder invocar al servicio externo.<br />
En este post nos gustaría mostrarles como realizar una conexión a cualquier servicio wcf sin necesidad de agregarlo como service reference. También se podrá ver como generar un dummy del servicio y como resolver dependencias con spring.<br />
Para realizar este procedimiento necesitamos contar con la interfaz del servicio.</p>
<p>Comencemos…</p>
<p>Interfaz del servicio wcf<br />
<a href="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/Interfaz.png"><img style="padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/Interfaz_thumb.png" alt="Interfaz" width="367" height="173" border="0" /></a></p>
<p>El servicio wcf expone una interfaz que contiene un método: <strong>IsValid</strong>.</p>
<p>El siguiente paso es definir una clase abstracta ServiceResolver, que expondrá un método <em>ResolverWcfService</em> y tendrá una propiedad <em>ServiceAddress</em>:<br />
<a href="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/ServiceResolver.png"><img style="padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/ServiceResolver_thumb.png" alt="ServiceResolver" width="476" height="170" border="0" /></a></p>
<p>Como comentamos anteriormente, la idea es realizar una conexión real y una dummy, por lo tanto vamos a tener dos clases que van a heredar de <strong>ServiceResolver </strong>(<em>WCFServiceResolver y DummyServiceResolver):</em></p>
<p><strong>WCFServiceResolver:<br />
<a href="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/WCFServiceResolver.png"><img style="padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/WCFServiceResolver_thumb.png" alt="WCFServiceResolver" width="564" height="325" border="0" /></a></strong><br />
Esta clase realiza la conexión real, mediante una url real (Address), que más tarde explicaremos como setearla y un binding que deberá estar especificado en la configuración de nuestro cliente de la siguiente manera:<br />
<a href="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/config.png"><img style="padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/config_thumb.png" alt="config" width="565" height="285" border="0" /></a></p>
<p><strong>DummyServiceResolver:</strong><br />
<a href="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/DummyServiceResolver.png"><img style="padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/DummyServiceResolver_thumb.png" alt="DummyServiceResolver" width="510" height="166" border="0" /></a><br />
Esta clase simula la conexión real mediante una clase <em>DummyServiceImplementation</em> que esta definida de la siguiente manera:<br />
<a href="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/DummyServiceImplementation.png"><img style="padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/DummyServiceImplementation_thumb.png" alt="DummyServiceImplementation" width="521" height="172" border="0" /></a><br />
Esta clase implementa la interfaz del servicio WCF (<em>WCFServiceInterface</em>) y siempre que se invoque al método <em>IsValid</em> va a devolver <em>true</em>.</p>
<p>Ahora sí, estamos en condiciones de implementar el cliente:<a href="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/Client.png"><img style="padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/Client_thumb.png" alt="Client" width="569" height="299" border="0" /></a></p>
<p>Vayamos por partes…<br />
El cliente tiene una propiedad del tipo ServiceResolver y un método <em>ClientMethod.<br />
</em>En el método, el cliente se genera un objeto de tipo WCFServiceInterface (la interfaz del servicio WCF), utilizando el método <em>ResolveWcfService </em>del objeto ServiceResolver y luego invoca al método <em>IsValid</em> del mismo, obteniendo el resultado.<br />
La pregunta es, ¿Cómo se instancia el objeto ServiceResolver?<br />
La respuesta es simple. Utilizando <strong>Spring</strong>. Por configuración especificamos de qué manera se va a instanciar esa propiedad.</p>
<p>Primero deberiamos generar un archivo spring.config:<br />
<a href="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/springConfigWCF.png"><img style="padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/springConfigWCF_thumb.png" alt="springConfigWCF" width="565" height="73" border="0" /></a><br />
De esta manera especificamos que la propiedad ServiceResolver se va a instanciar con un objeto WCFServiceResolver (conexión real) y la url del servicio sería “http://wcfserviceurl.com”.<br />
Si quisieramos realizar una conexión dummy, el spring.config debería ser:<br />
<a href="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/springConfig.png"><img style="padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/springConfig_thumb.png" alt="springConfig" width="565" height="78" border="0" /></a><br />
En este caso, configurar la service address no tiene sentido, dado que el DummyServiceResolver no utiliza esta propiedad para nada.</p>
<p>Para finalizar, habría que actualizar el archivo de configuración de nuestro cliente de la siguiente manera:<br />
<a href="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/finalconfig.png"><img style="padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px" src="http://blogs.kinetica-solutions.com/wp-content/uploads/2013/04/finalconfig_thumb.png" alt="finalconfig" width="565" height="457" border="0" /></a></p>
<p>En conclusión, solamente teniendo la interfaz del servicio wcf, generamos una conexión real al mismo, una simulación de la conexión y una implementación dummy del mismo, y mediante spring configuramos la alternativa que nos conviene utilizar.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.kinetica-solutions.com/blog/2013/04/23/como-conectarse-a-un-servicio-wcf-sin-agregarlo-como-service-reference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hardcodear es bueno</title>
		<link>http://blogs.kinetica-solutions.com/blog/2013/04/03/hardcodear-es-bueno/</link>
		<comments>http://blogs.kinetica-solutions.com/blog/2013/04/03/hardcodear-es-bueno/#comments</comments>
		<pubDate>Wed, 03 Apr 2013 18:27:42 +0000</pubDate>
		<dc:creator>Diego Sisto</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.kinetica-solutions.com/blog/2013/04/03/hardcodear-es-bueno/</guid>
		<description><![CDATA[Título chocante para que la gente lea, de todas formas lo sostengo. En algunas ocasiones es mejor escribir código harcodeado. Y arranco con el que para mí, es el caso más claro: los tests unitarios. [Test] public void CryptTest1() { &#8230; <a href="http://blogs.kinetica-solutions.com/blog/2013/04/03/hardcodear-es-bueno/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Título chocante para que la gente lea, de todas formas lo sostengo. En algunas ocasiones es mejor escribir código <em>harcodeado</em>. Y arranco con el que para mí, es el caso más claro: los <em>tests</em> unitarios.</p>
<pre>[Test]
public void CryptTest1()
{
    Assert.AreEqual("qKdUrarYfJg=", new Cryptographer().Crypt("test", "012345678901234567890123"));
}

[Test]
public void CryptTest2()
{
    var crypted = new CryptLibrary.TripleDESCrypter("test", "012345678901234567890123");
    Assert.AreEqual(crypted, new Cryptographer().Crypt("test", "012345678901234567890123"));
}
</pre>
<p><font face="Courier New">CryptTest1</font> y <font face="Courier New">CryptTest2</font> prueban exactamente el mismo código. En este ejemplo <font face="Courier New">Cryptographer</font> es una clase de mi aplicación que internamente usa el <font face="Courier New">TripleDESCrypter</font> (de una biblioteca externa).</p>
<p>Hay 2 grandes ventajas del primer test sobre el segundo:</p>
<ol>
<li>Es más claro.
<li>No depende de una implementación externa.</li>
</ol>
<h2>Es más claro</h2>
<p>Para mí es muy claro que el primer test espera que la encriptación de como resultado el <font face="Courier New">string</font> <font face="Courier New">&#8220;qKdUrarYfJg=&#8221;</font>. En cambio, en el segundo <em>test</em>, parece que compara 2 funciones distintas de alguna forma.</p>
<p>En general un <em>test</em> debe ser <strong>simple</strong> y agregar esa llamada a una biblioteca externa lo hace más complejo.</p>
<h2>No depende de una implementación externa</h2>
<p>Supongamos que la biblioteca que yo estoy usando tiene un bug, en lugar del <font face="Courier New">string</font> <font face="Courier New">&#8220;qKdUrarYfJg=&#8221;</font>, retorna <font face="Courier New">&#8220;error&#8221;</font>. En este ejemplo nuestro test continuará pasando ya que el <font face="Courier New">Cryptographer</font> internamente usa este método.</p>
<p>¿Por qué pasa esto? Porque nuestro test prueba que nuestra implementación devuelva lo mismo que una implementación externa cuando debería probar un caso concreto. </p>
<p>Este problema se evita escribiendo <em>tests</em> <em>hardcodeados</em>. Al escribir el <font face="Courier New">string</font> que debe devolver estamos <strong>definiendo empíricamente el caso correcto</strong>. No dependemos de lo que otra librería define como correcto. Además si por alguna razón nuestra implementación debe devolver otra cosas, o un caso particular, basta con modificar el <font face="Courier New">string</font>.</p>
<p>Saludos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.kinetica-solutions.com/blog/2013/04/03/hardcodear-es-bueno/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML5: Local Storage</title>
		<link>http://blogs.kinetica-solutions.com/blog/2013/03/19/html5-local-storage/</link>
		<comments>http://blogs.kinetica-solutions.com/blog/2013/03/19/html5-local-storage/#comments</comments>
		<pubDate>Tue, 19 Mar 2013 13:44:57 +0000</pubDate>
		<dc:creator>Diego Sisto</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.kinetica-solutions.com/blog/2013/03/19/html5-local-storage/</guid>
		<description><![CDATA[Una gran feature que presenta HTML5 es local storage. Esto nos permite guardar datos client-side en forma clave/valor usando JS. Un ejemplo muy sencillo puede ser: localStorage.setItem('nombre', 'pedro'); // ... alert(localStorage.getItem('nombre')) Lo interesante es que podemos ejecutar la primer línea &#8230; <a href="http://blogs.kinetica-solutions.com/blog/2013/03/19/html5-local-storage/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Una gran feature que presenta HTML5 es local storage. Esto nos permite guardar datos <em>client-side</em> en forma clave/valor usando <em>JS</em>. </p>
<p>Un ejemplo muy sencillo puede ser:</p>
<pre>localStorage.setItem('nombre', 'pedro');
// ...
alert(localStorage.getItem('nombre'))
</pre>
<p>Lo interesante es que podemos ejecutar la primer línea en una página y la segunda en todas las subsiguientes.</p>
<h1>¿Por qué es tan bueno?</h1>
<p>Como siempre que agregamos funcionalidad del lado del cliente, se libera carga al servidor. Lo novedoso es que nos permite llevar adelante trabajos que antes no se podían hacer: ahora podemos guardar en cualquier parte (o tiempo) de la aplicación y utilizarlo en otro. </p>
<ul>
<li>Podemos recuperar un estado si guardamos periódicamente.</li>
<li>Podemos hacer que no se pierdan los datos si se pierde la conexión a internet.</li>
<li>Podemos persistir <em>menus</em> desplegados/contraidos por el usuario.</li>
</ul>
<p>Los usos para <em>local storage</em> son múltiples y limitados por nuestro ingenio. La interfaz es muy simple y está soportado por [casi] todos los browsers modernos.</p>
<p>Lectura recomendada: <a href="http://diveintohtml5.info/storage.html">HTML5 local storage</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.kinetica-solutions.com/blog/2013/03/19/html5-local-storage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
