<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>IGINC</title>
	<atom:link href="http://iguessimnotcrazy.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://iguessimnotcrazy.wordpress.com</link>
	<description>pra quem gosta de sopa de letrinhas</description>
	<lastBuildDate>Sun, 22 Jan 2012 04:16:09 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='iguessimnotcrazy.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>IGINC</title>
		<link>http://iguessimnotcrazy.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://iguessimnotcrazy.wordpress.com/osd.xml" title="IGINC" />
	<atom:link rel='hub' href='http://iguessimnotcrazy.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Extension Methods e interfaces</title>
		<link>http://iguessimnotcrazy.wordpress.com/2011/06/02/extension-methods/</link>
		<comments>http://iguessimnotcrazy.wordpress.com/2011/06/02/extension-methods/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 00:36:54 +0000</pubDate>
		<dc:creator>Felipe</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[.Net 3.5]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[IL]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://iguessimnotcrazy.wordpress.com/?p=813</guid>
		<description><![CDATA[Com certeza não colocaria a implementação de uma rotina de comparação de propriedades entre duas instâncias distintas de um dado objeto (que possam retornar um dicionário contento apenas o que existe de diferente entre elas) como sendo algo complexo, na &#8230; <a href="http://iguessimnotcrazy.wordpress.com/2011/06/02/extension-methods/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=813&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Com certeza não colocaria a implementação de uma rotina de comparação de propriedades entre duas instâncias distintas de um dado objeto (que possam retornar um dicionário contento apenas o que existe de diferente entre elas) como sendo algo complexo, na verdade existem diversas maneiras de implementar esta solução. A título ilustrativo poderíamos elencar algumas idéias como, por exemplo escrever um de/para manual diretamente nos objetos², o uso de <em>reflection </em>para varrer as propriedades de escopo público de qualquer objeto da aplicação, ou até mesmo se formos pensar completamente out <em>of the box</em>, trabalhar com o compare entre as strings XML serializadas dos objetos em questão.</p>
<p>Mas vamos adicionar ao requisito principal ( comparar objetos) um outro requisito que diz respeito a impossibilidade de alterarmos a implementação atual dos objetos em questão (ex: estes objetos estão ‘trancados’ em um assembly que não temos acesso / não são de nossa responsabilidade) e, existe também a necessidade de obtermos o máximo de performance desta rotina. Um detalhe importante relativo ao lado da performance é que, eventualmente, poderemos trabalhar com objetos muito grandes e complexos (propriedades com lista / dicionários de outros tipos do sistema) que mudam com o tempo sem que todos os envolvidos no projeto sejam notificados. Agora ficou divertido!</p>
<p>Pra que toda a solução proposta aqui no post fique bem clara (e ninguém queira me queimar sob acusação de magia negra), vamos começar bem do começo.</p>
<p><span id="more-813"></span></p>
<h1>Extension Methods – Parte Zero</h1>
<p><em>Extension Methods</em> apareceram no universo .Net na versão 3.5 do framework como forma de permitir aos desenvolvedores realizar alterações (extensões, pra ser mais preciso e fazer jus ao nome da parada) em objetos existentes (sejam eles nativos ou não), provendo um nível gigantesco de maleabilidade / flexibilidade ao desenvolvedor.</p>
<p>A MSDN diz o seguinte:</p>
<blockquote><p>“Extension methods enable you to &#8220;add&#8221; methods to existing types without creating a new derived type, recompiling, or otherwise modifying the original type.”</p>
</blockquote>
<p>Os exemplos comumente vistos em posts sobre EM mostram um cenário onde você quer por exemplo adicionar um método &#8211; digamos <strong>- ConcatTo(“bola”)</strong> pra todas as strings do seu sistema. Muito simples e sem nenhuma confusão até aí e, sem dúvidas é no que mais se vê EM aplicados. Mas claro, não é o único motivo!</p>
<h1>Extension Methods – Parte 101</h1>
<p>Dado o <em>snippet</em> abaixo, me diga, o que você acha que aconteceria quando eu apertasse F5 no meu VisualStudio?</p>
<p><pre class="brush: csharp; wrap-lines: false;">
public interface IInterface { }
public class MinhaClasse
{
  public MinhaClasse()
  {
    IInterface qualquerCoisa = null;
    qualquerCoisa.Do();
  }
}
public static class IInterfaceExtensions
{
   public static void Do(this IInterface @this) { Console.Write(&quot;Opa!&quot;); }
}
</pre></p>
<p>Ok. Compilar faz sentido, certo? Um sentido meio estranho, mas faz! Agora, se você rodou o código, provavelmente viu algo como a imagem a seguir:</p>
<div id="attachment_830" class="wp-caption aligncenter" style="width: 470px"><a href="http://iguessimnotcrazy.files.wordpress.com/2011/06/image0021.jpg" target="_blank"><img class="size-full wp-image-830 " title="Opa!" src="http://iguessimnotcrazy.files.wordpress.com/2011/06/image0021.jpg?w=584" alt="Opa!"   /></a><p class="wp-caption-text">Opa!</p></div>
<div id="attachment_825" class="wp-caption aligncenter" style="width: 283px"><a href="http://iguessimnotcrazy.files.wordpress.com/2011/06/tumblr_likjdmklso1qzaxefo1_500.jpg" target="_blank"><img class="size-medium wp-image-825 " title="OOOOPA!!" src="http://iguessimnotcrazy.files.wordpress.com/2011/06/tumblr_likjdmklso1qzaxefo1_500.jpg?w=273&#038;h=300" alt="OOOOPA!!" width="273" height="300" /></a><p class="wp-caption-text">OOOOPA!!</p></div>
<p>Agora é que vem a pergunta que não quer calar (pode perguntar, não tem problema)! – Como diabos uma interface, com uma referência nula, pode ter comportamento?!</p>
<p>Pois é, na verdade esta característica do <strong>Extension Methods</strong> já é conhecida de alguns artigos anteriores a este¹ e, é realmente algo interessante de se ver funcionando. Em uma explicação resumida, eis o que está acontecendo por trás das cortinas do framework: Durante o processo de compilação (na verdade, se você está usando o VisualStudio isto deve acontecer durante a escrita do código sem que você tenha que pedir explicitamente),  o compilador procura por uma assinatura que faça sentido para a chamada que você está pretendendo realizar e, na geração da IL ele simplesmente substitui a chamada que você está realizando para um dado tipo e a coloca como uma referência direta para o EM passando seu tipo como primeiro parâmetro.</p>
<p>Acho que com exemplos tudo fica mais fácil de entender&#8230; Digamos que definindo nossa interface, temos o seguinte código:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
public interface IInterface { void Do(); }
public class MinhaClasse
{
  public MinhaClasse()
  {
    IInterface qualquerCoisa = null;
    qualquerCoisa.Do();
  }
}
public static class IInterfaceExtensions
{
   public static void Do(this IInterface @this) { Console.Write(&quot;Opa!&quot;); }
}
</pre></p>
<p>Repare que ao contrário do código anterior, agora nossa interface realmente tem um método chamado “<em>Do</em>” em sua definição! Se compilarmos este código veremos que a IL da chamada ao “<em>Do</em>” ficou da seguinte forma:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
IL_000b:  callvirt   instance void Diffy.IInterface::Do()
</pre></p>
<p>Claramente, a chamada está sendo realizada utilizando o que quer que esteja referenciado pela interface, diretamente e sem rodeios. Agora, tente rodar a aplicação e você verá a boa e velha mensagem “<em>Object reference not set to an instance of an object.</em>”. Agora vamos voltar ao primeiro código onde nossa interface era a coisa mais feia do mundo e simplesmente não definia método algum e, após compilar o código veremos que a <em>IL</em> da chamado ao “<em>Do</em>” agora é a seguinte:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
IL_000b:  call       void Diffy.IInterfaceExtensions::Do(class Diffy.IInterface)
</pre></p>
<p>Wow, right?! Sim, caro companheiro, o compilador agora, na falta de uma correspondência adequada (na verdade baseado nas prioridades de execução relacionadas aos EM¹) trocou a referência do método que deve ser executado e está apontando diretamente para o “<em>Do</em>” definido dentro da classe de extensões. De uma forma mais clara, a chamada se tornou isto (equivalente em C#):</p>
<p><pre class="brush: csharp; wrap-lines: false;">
   IInterfaceExtensions.Do(qualquerCoisa);
</pre></p>
<h1>De volta ao problema</h1>
<p>Agora que sabemos um pouco mais sobre o que pode ser feito com EM, podemos prosseguir com tranqüilidade em busca de uma solução que além de nos permitir adicionar comportamento a objetos que não nos pertencem de uma forma que certamente não irá afeta-los de forma negativa. Pensando de uma forma simplista podemos dizer que o problema está praticamente resolvido visto que, independentemente do objeto podemos enxertar comportamento no mesmo, permitindo que a feature de comparação seja implementada (seja usando <em>reflection </em>ou com implementações manuais), certo? Bem&#8230; Certo até um dado ponto. A questão é que conforme disse no começo do post, não conheço todos os objetos que terei que implementar esta <em>feature </em>e, pior que isto, mesmo que consiga uma lista com todos os tipos, estes tipos estão em constante mudança e novos tipos são criados com uma certa freqüência então preciso de algo que sirva para ambos os casos: tipos conhecidos e “desconhecidos”.</p>
<p>É aí que podemos fazer uso da inteligência do compilador e da força que as extensões de interface nos permitem (mesmo eu ainda tendo muito medo disto).</p>
<p>Imagine que o responsável por manter os objetos que serão comparados tenha muito receito (por uma série de motivos que você concorda e não tem como discutir) em realizar alterações nos mesmos, logo, não existe chances de adicionar qualquer comportamento extra a estes objetos para cumprir sua tarefa. É importante mencionar isto pois, dada esta realidade estamos impossibilitados de, por exemplo, fazer uso de uma interface com métodos de comparação em sua definição e, tão pouco, de uma classe abstrata (base) onde nós mesmo realizamos uma implementação de comparação genérica (por <em>reflection,</em> por exemplo) por conta da limitação do framework frente à herança múltipla (o que poderia criar um conflito com o ecossistema de classes atual). Esta última opção também esbarraria em nosso requisito de performance <span style="text-decoration:underline;">extrema</span>. Por sorte, no nosso caso, nossa prancheta já tem um projeto pronto para ser colocado em prática.</p>
<p>Imagine você que poderíamos propor então a adição de uma interface vazia em todas suas entidades (leia-se <i>marker interefaces</i>°). Ok, deixando o purismo de lado de que uma interface vazia não representa absolutamente nada, não existe nenhum problema e/ou risco em fazer esta alteração, certo? Sei que você já entendeu aonde quero chegar com esta história toda.</p>
<p>Ao conseguirmos estabelecer uma base para indicar ao compilador quais aos objetos que poderão ser comparados por meio de um EM, já estamos com mais de 50% do caminho andado. Apenas com esta solução já poderíamos fazer implementar uma função genérica de comparação usando <em>reflection</em> porém, neste caso estamos pensando muito em performance, precisariamos de algo um pouco mais assertivo.</p>
<h1>Prototipando a solução</h1>
<p>Digamos que definimos a seguinte interface como sendo nosso ponto de liga entre os objetos do sistema que serão comparados e nossas EM:</p>
<p><pre class="brush: csharp;">
   public interface ICanCompare { }
</pre></p>
<p>Baseado neste cara, escrevemos a seguinte EM:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
public static class ExtensionsFor_ICanCompare
      {
            public static Dictionary&lt;string, object&gt;CompareTo(this ICanCompare @this, ICanCompare to)
            {
                  /// Implementação de Reflection
                  return null; /// Retorna o dicionário com as diferenças
            }
      }
</pre></p>
<p>Ok, mas imagine que sabemos que um dado objeto chamado “<em>ObjetoA</em>” é bem simples e não faria sentido pagar o preço (em termos de tempo de execução) de um reflection para ler seus membros. Neste caso, podemos fazer uso do poder do compilador para escrever um <em>overload </em>para a interface “<em>ICanCompare</em>” permitindo que para chamadas de comparação do objeto “<em>ObjetoA</em>”, outro modo de comparação seja utilizado, como podemos ver no <em>snippet</em> a seguir:</p>
<p><pre class="brush: csharp; wrap-lines: false;">public static Dictionary&lt;string, object&gt; CompareTo(this ICanCompare @this, ObjetoA to)
{
/// Implementação das comparações.. EX:
/// Dictionary&lt;string, object&gt; dic = new Dictionary&lt;string, object&gt;();
/// if(!@this.Propriedade == to.Propriedade){ dic.Add(“Propriedade”, to.Propriedade); }
return null; /// dic;
}</pre></p>
<p>Fácil, certo?! Agora você pode incrementar a brincadeira com coisas mais elegantes como por exemplo utilizar um esquema de mapeamento das propriedades para evitar que uma eventual mudança na nomenclatura dos objetos quebre seu código (o que certamente acontecerá se você fizer uso de strings no seu dicionário). Apenas a título de bônus, segue um esquema bem simples de mapeamento que você poderia utilizar para realizar este processo:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
public class ComparableContainerFor&lt;TObject&gt; where TObject : ICanCompare
      {
            public TObject PreviousState { get; private set; }
            public Dictionary&lt;string, object&gt; FinalState { get; private set; }
            private ComparableContainerFor(TObject previousState)
            {
                  this.PreviousState = previousState;
                  this.FinalState = new Dictionary&lt;string, object&gt;();
            }
            public static ComparableContainerFor&lt;TObject&gt; Compare(TObject previousState)
            {
                  return new ComparableContainerFor&lt;TObject&gt;(previousState);
            }
            internal ComparableContainerFor&lt;TReal&gt; CastTo&lt;TReal&gt;() where TReal : TObject
            {
                  return new ComparableContainerFor&lt;TReal&gt;((TReal)this.PreviousState);
            }
            internal ComparableContainerFor&lt;TObject&gt; CompareFieldValue&lt;TProperty&gt;(Expression&lt;Func&lt;TObject, TProperty&gt;&gt; oldValueExpression, TProperty currentValue)
            {
                  if (currentValue != null)
                  {
                        TProperty oldValue = oldValueExpression.Compile()(this.PreviousState);
                        if (!object.Equals(oldValue, currentValue))
                        {
                              this.FinalState.Add(GetMemberExpression(oldValueExpression).Member.Name, currentValue);
                        }
                  }
                  return this;
            }
private MemberExpression GetMemberExpression&lt;TPropertyFrom&gt;(Expression&lt;Func&lt;TObject, TPropertyFrom&gt;&gt; expression)&lt;
            {
                  MemberExpression memberExpression = null;
                  if (expression.Body.NodeType == ExpressionType.Convert)
                  {
                        var body = (UnaryExpression)expression.Body;
                        memberExpression = body.Operand as MemberExpression;
                  }
                  else if (expression.Body.NodeType == ExpressionType.MemberAccess)
                  {
                        memberExpression = expression.Body as MemberExpression;
                  }
                  if (memberExpression == null) { throw new ArgumentException(&quot;Not a member access&quot;, &quot;expressio&quot;); }
                  return memberExpression;
            }
      }
</pre></p>
<p>O uso deste cara mudaria um pouco a cara dos nossos EM para algo parecido com o seguinte:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
      public static ComparableContainerFor&lt;ObjetoB&gt; To (this ComparableContainerFor&lt;ICanCompare&gt; @this, ObjetoB currentState)
      {
            return @this
                  .CastTo&lt;ObjetoB&gt;()
                  .CompareFieldValue(old =&gt; old.MyProperty, currentState.MyProperty)
                  .CompareFieldValue(old =&gt; old.MyProperty1, currentState.MyProperty1);
      }
</pre></p>
<p>E o uso do comparador seria algo como:</p>
<p><pre class="brush: csharp;">
      ObjetoA objetoABase = new ObjetoA { MyProperty = 1 };
      ObjetoA objetoANew = new ObjetoA { MyProperty = 3 };
      var containerA = ComparableContainerFor&lt;ICanCompare&gt;.Compare(objetoABase).To(objetoANew);
</pre></p>
<p>¹ &#8211; Alguns bons exemplos de interfaces e EM, além da definição da ordem de priorização de uso de uma EM sobre os membros do objeto em questão &#8211; <a href="http://msdn.microsoft.com/en-us/library/bb383977.aspx" target="_blank">Mais informações</a></p>
<p>² &#8211; Infelizmente sobrescrever o método <em>Equals</em> não serviria para o nosso caso pois precisamos saber exatamente quais foram as diferenças encontradas durante a comparação das entidades. Idealmente a implementação de um <em>override </em>de <em>Equals </em>pode interromper a comparação (com <em>short-circuit</em>) já na primeira divergência e não precisa anotar nada que eventualmente tenha sido discrepante entre as instâncias (que inclusive, segundo a definição do método, podem ser de objetos com tipos distintos).</p>
<p>° &#8211; Mais sobre marker interfaces <a href="http://msdn.microsoft.com/en-us/library/ms229022.aspx" target="_blank">aqui</a> e <a href="http://stackoverflow.com/questions/1023068/what-is-the-purpose-of-a-marker-interface" target="_blank">aqui</a>.</p>
<br />Filed under: <a href='http://iguessimnotcrazy.wordpress.com/category/programacao/net/'>.Net</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/net-3-5/'>.Net 3.5</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/programacao/net/c/'>C#</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/diy/'>DIY</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/il/'>IL</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/programacao/'>Programação</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/iguessimnotcrazy.wordpress.com/813/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/iguessimnotcrazy.wordpress.com/813/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/iguessimnotcrazy.wordpress.com/813/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/iguessimnotcrazy.wordpress.com/813/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/iguessimnotcrazy.wordpress.com/813/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/iguessimnotcrazy.wordpress.com/813/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/iguessimnotcrazy.wordpress.com/813/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/iguessimnotcrazy.wordpress.com/813/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/iguessimnotcrazy.wordpress.com/813/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/iguessimnotcrazy.wordpress.com/813/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/iguessimnotcrazy.wordpress.com/813/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/iguessimnotcrazy.wordpress.com/813/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/iguessimnotcrazy.wordpress.com/813/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/iguessimnotcrazy.wordpress.com/813/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=813&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://iguessimnotcrazy.wordpress.com/2011/06/02/extension-methods/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f46ba8c5ca3a6c9c2b9e1f4aa8dfecc0?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">iguessimnotcrazy</media:title>
		</media:content>

		<media:content url="http://iguessimnotcrazy.files.wordpress.com/2011/06/image0021.jpg" medium="image">
			<media:title type="html">Opa!</media:title>
		</media:content>

		<media:content url="http://iguessimnotcrazy.files.wordpress.com/2011/06/tumblr_likjdmklso1qzaxefo1_500.jpg?w=273" medium="image">
			<media:title type="html">OOOOPA!!</media:title>
		</media:content>
	</item>
		<item>
		<title>Anonymous type para todos!</title>
		<link>http://iguessimnotcrazy.wordpress.com/2010/11/22/anonymous-type-para-todos/</link>
		<comments>http://iguessimnotcrazy.wordpress.com/2010/11/22/anonymous-type-para-todos/#comments</comments>
		<pubDate>Tue, 23 Nov 2010 01:15:08 +0000</pubDate>
		<dc:creator>Felipe</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[.Net 3.5]]></category>
		<category><![CDATA[.Net 4.0]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[C# 4]]></category>
		<category><![CDATA[Visual Studio 2010]]></category>
		<category><![CDATA[Anonymous Type como parâmetros]]></category>
		<category><![CDATA[Anonymous Types as parameter]]></category>
		<category><![CDATA[Anti If]]></category>
		<category><![CDATA[Tipos anonimos como parâmetros]]></category>

		<guid isPermaLink="false">http://iguessimnotcrazy.wordpress.com/?p=776</guid>
		<description><![CDATA[É, como previsto, demorou um tempo entre meu último post e este. Neste post, abordarei uma situação que aconteceu comigo hoje e achei por bem compartilhar o caso e o desfecho. Fato é que acho que encontrei uma forma de &#8230; <a href="http://iguessimnotcrazy.wordpress.com/2010/11/22/anonymous-type-para-todos/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=776&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>É, como previsto, demorou um tempo entre meu último post e este. Neste post, abordarei uma situação que aconteceu comigo hoje e achei por bem compartilhar o caso e o desfecho. Fato é que acho que encontrei uma forma de passar Anonymous Types por parâmetros e consumi-los futuramente sem precisar fazer a <a href="http://msdn.microsoft.com/en-us/library/bb397696.aspx" target="_blank">gambiarra sugerida no MSDN</a>. Calma que eu explico&#8230;<br />
<span id="more-776"></span></p>
<h1>Se sim, sim. Se não&#8230; Talvez?</h1>
<p>Não é de hoje que tenho uma extrema aversão pelo uso de IF&#8217;s. Diria até que um dos primeiros pontos que indicariam a necessidade de <em>refactoring </em>em um código é quando existe uma classe ou método gigante. Normalmente, boa parte de seu corpo está tomado por blocos condicionais que escondem comportamentos que não o que a classe / método deveria se ater.</p>
<p>Vamos ao primeiro exemplo de &#8220;não faça isto em casa&#8221;:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
  public static class ParentalControl
    {
        public static void Enter(User user)
        {
            if (user.Age &lt; 18)
            {
                throw new Exception(string.Concat(&quot;Dear user &quot;, user.Name, &quot;, you must be over 18 to view this site&quot;));
            }
            else
            {
                /// Redirects to next page...
            }
        }
    }
    public class User
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
</pre></p>
<p>A primeira vista, você pode não achar que temos um problema com o código acima. O código é relativamente simples e não apresenta dificuldade de entendimento, certo?</p>
<p>Ok. Mas todos sabemos que código algum tem garantia de ser o mesmo pra sempre e, fatalmente este modelo de código ditará a forma com que as próximas implementações serão realizadas nesta classe, concorda? Imaginemos que por uma mudança de escopo, o código seja alterado para o seguinte:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
public static class ParentalControl
    {
        public static void Enter(User user)
        {
            if (user.Age &lt; 18)
            {
                throw new Exception(string.Concat(&quot;Dear user &quot;, user.Name, &quot;, you must be over 18 to view this site&quot;));
            }
            else if (user.LastPayment &lt; DateTime.Now.AddMonths(-1))
            {
                throw new Exception(string.Concat(&quot;Dear user &quot;, user.Name, &quot;, you have to pay to continue.&quot;));
            }
            else if (!string.IsNullOrEmpty(user.NickName))
            {
                throw new Exception(string.Concat(&quot;Dear user &quot;, user.Name, &quot;, please choose a nickname to continue.&quot;));
            }
            else
            {
                /// Redirects to next page...
            }
        }
    }
</pre></p>
<p>É, acredito que este não é o tipo de código que você diria pra sua mãe que foi você que escreveu. Agora que demonstrei o problema, vamos tentar arrumar a casa.</p>
<p>Talvez a forma mais simples de higienizar o código que temos em mãos seria separar a porção de validação dos dados do usuário do método responsável por levar o usuário à próxima página. Uma forma simples de fazer isto seria com o seguinte código:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
public static class ParentalControl
    {
        private static bool UserCanProceed(User user)
        {
            if (user.Age &lt; 18)
            {
                throw new Exception(string.Concat(&quot;Dear user &quot;, user.Name, &quot;, you must be over 18 to view this site&quot;));
            }
            else if (user.LastPayment &lt; DateTime.Now.AddMonths(-1))
            {
                throw new Exception(string.Concat(&quot;Dear user &quot;, user.Name, &quot;, you have to pay to continue.&quot;));
            }
            else if (!string.IsNullOrEmpty(user.NickName))
            {
                throw new Exception(string.Concat(&quot;Dear user &quot;, user.Name, &quot;, please choose a nickname to continue.&quot;));
            }
            return true;
        }

        public static void Enter(User user)
        {
            if (ParentalControl.UserCanProceed(user))
            {
                /// Redirects to next page...
            }
        }
    }
</pre></p>
<p>Gosto da idéia de usar um retorno boleano para encapsular a ação de redirecionamento pois, desta forma, só de olhar o código você tem a visão de que para aquele bloco de código ser executado ele depende do resultado do método que o precede.</p>
<p>Uma pessoa normal talvez se dê por satisfeita com esta separação, mas este blog não faria jus ao nome se não tentasse algo &#8220;louco&#8221;.</p>
<p><em>PS: Idealmente, você migraria o método &#8220;UserCanProceed&#8221; para uma classe que contenha os métodos de validação necessários para se executar quando interagindo com a classe &#8220;ParentalControl&#8221; (algo como uma &#8220;ParentalControlRules&#8221;), mas para simplificar o artigo e os exemplos, vamos com esta solução mais simples.</em></p>
<h1>Go IGINC</h1>
<p>E se pudéssemos fazer algo do tipo:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
private static bool UserCanProceed(User user)
        {
            return GenericRules
           .ForParameter(user)

           /// Verifica idade mínima
           .WithContext(new { MinAge = 18 })
           .ThrowingExceptionAs((context) =&gt; { return string.Concat(&quot;Dear user &quot;, user.Name, &quot;, you must be over 18 to view this site&quot;); })
           .Check((parameter, context) =&gt; { return user.Age &gt; context.MinAge; })

           /// Verifica data último pagamento
           .WithContext(new { BasePaymentDate = DateTime.Now.AddMonths(-1) })
           .ThrowingExceptionAs((context) =&gt; { return string.Concat(&quot;Dear user &quot;, user.Name, &quot;, you have to pay to continue.&quot;); })
           .Check((parameter, context) =&gt; { return user.LastPayment &gt; context.BasePaymentDate; })

           /// Verifica se o nickname foi escolhido
           .ThrowingExceptionAs((context) =&gt; { return string.Concat(&quot;Dear user &quot;, context.Name, &quot;, you have to pay to continue.&quot;); })
           .Check((parameter, context) =&gt; { return !string.IsNullOrEmpty(user.NickName); })

            /// Executa todas as validações
           .ValidateRules();
        }
</pre></p>
<p>Com este código nós seriamos capazes de não só mapear as validações que precisamos executar como também de transformar estas regras em uma historinha para as gerações futuras de programadores que passarem por ali, fazendo com que você seja lembrado por toda a eternidade como alguém que tem muito amor ao próximo. :)</p>
<p>Tá, mas como faremos isto?</p>
<p>Segundo a MSDN, <em>Anonymous Type</em> são definidos da seguinte forma:</p>
<blockquote><p><em>An anonymous type has method scope. To pass an anonymous type, or a collection that contains anonymous types, outside a method boundary, you must first cast the type to object. However, this defeats the strong typing of the anonymous type. If you must store your query results or pass them outside the method boundary, consider using an ordinary named struct or class instead of an anonymous type.</em></p></blockquote>
<p>Ou seja, AT tem uma vida chata, limitada ao método onde é criada. Pelo que lemos ali, pra passar o AT adiante você precisaria fazer um cast dele para <em>Object</em> (sic), aniquilando assim com a beleza da tipagem. Não queremos isto, queremos?</p>
<p>Bom, para resolver 0 problema de passar o AT como parâmetro, existe uma série de posts na web sobre o assunto &#8220;<a href="http://www.google.com.br/search?sourceid=chrome&amp;ie=UTF-8&amp;q=anonymous+type+as+parameters" target="_blank">anonymous type as parameters</a>&#8220;, dentre eles, <a href="http://imasters.com.br/artigo/12779/csharp/usando_tipos_anonimos_como_parametro/" target="_blank">um em Português com uma solução &#8220;diferente&#8221;</a> mas que parece funcionar. Entretanto, nenhum deles me deixou muito satisfeito.</p>
<p>No final das contas, as soluções mundo afora se resumem a de uma forma ou de outra realizarem o cast para <em>Object</em> e extrair por inferência o tipo real do objeto anônimo. Bom, o que fazer para evitar o <em>Cast</em> então?</p>
<p><em><strong>Antes de continuar:</strong> Não estou dizendo aqui que ninguém pensou nesta solução antes, estou sim dizendo que não encontrei uma fonte que estivesse fazendo uso do mesmo formato que vou demonstrar abaixo. Sem mais delongas, vamos voltar ao código:</em></p>
<p><pre class="brush: csharp; wrap-lines: false;">

public GenericRuleContext WithContext&lt;contextType&gt;(contextType context)
{
...
}

</pre></p>
<p>Acredite ou não, a solução é basicamente esta. O segredo todo está em trabalhar com um <strong>método genérico</strong> que recebe um parâmetro tipado para este <strong>tipo dinâmico</strong>. O que acontecerá é que teremos uma inferência do tipo fornecido pelo tipo anônimo gerado e, conseqüentemente, poderemos trabalhar com ele, dali por diante, como qualquer outro tipo do sistema, sem diferenciação ou limitações (seja de escopo de método, classe, ou dll).</p>
<p>E, o mais legal disto tudo ainda está por vir (pelo menos eu achei)! Ver o Intellisense do VS reconhecendo este objeto que a documentação disse que não conseguiria é poesia para meus olhos!</p>
<div id="attachment_786" class="wp-caption aligncenter" style="width: 470px"><a href="http://iguessimnotcrazy.files.wordpress.com/2010/11/screenshot001.gif" target="_blank"><img class="size-full wp-image-786" title="Visual Studio - AT Intellisense" src="http://iguessimnotcrazy.files.wordpress.com/2010/11/screenshot001.gif?w=584" alt="Visual Studio - AT Intellisense"   /></a><p class="wp-caption-text">Visual Studio - AT Intellisense</p></div>
<p>Agora que passei pela parte mais estranha, segue o <a href="http://ifile.it/dkp9wnc" target="_blank">link para download do código</a> da biblioteca que permite a sintaxe fluente de validação de dados.</p>
<p><em><strong>PS:</strong> O código da infraestrutura fluente que expliquei neste artigo acabou ficando muito complexo para ser utilizado em produção. O ponto do código vinculado ao artigo é demonstrar algumas técnicas de desenvolvimento de interfaces fluentes e claro, a utilização de anonymous types como parâmetros.</em></p>
<p><strong>Leia também: <a href="http://blogs.msdn.com/b/ericlippert/archive/2010/12/20/why-are-anonymous-types-generic.asp">Why are anonymous types generic?</a></strong></p>
<br />Filed under: <a href='http://iguessimnotcrazy.wordpress.com/category/programacao/net/'>.Net</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/net-3-5/'>.Net 3.5</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/net-4-0/'>.Net 4.0</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/arquitetura/'>Arquitetura</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/programacao/net/c/'>C#</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/programacao/net/c-4/'>C# 4</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/visual-studio-2010/'>Visual Studio 2010</a> Tagged: <a href='http://iguessimnotcrazy.wordpress.com/tag/anonymous-type-como-parametros/'>Anonymous Type como parâmetros</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/anonymous-types-as-parameter/'>Anonymous Types as parameter</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/anti-if/'>Anti If</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/tipos-anonimos-como-parametros/'>Tipos anonimos como parâmetros</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/iguessimnotcrazy.wordpress.com/776/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/iguessimnotcrazy.wordpress.com/776/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/iguessimnotcrazy.wordpress.com/776/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/iguessimnotcrazy.wordpress.com/776/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/iguessimnotcrazy.wordpress.com/776/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/iguessimnotcrazy.wordpress.com/776/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/iguessimnotcrazy.wordpress.com/776/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/iguessimnotcrazy.wordpress.com/776/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/iguessimnotcrazy.wordpress.com/776/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/iguessimnotcrazy.wordpress.com/776/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/iguessimnotcrazy.wordpress.com/776/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/iguessimnotcrazy.wordpress.com/776/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/iguessimnotcrazy.wordpress.com/776/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/iguessimnotcrazy.wordpress.com/776/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=776&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://iguessimnotcrazy.wordpress.com/2010/11/22/anonymous-type-para-todos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f46ba8c5ca3a6c9c2b9e1f4aa8dfecc0?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">iguessimnotcrazy</media:title>
		</media:content>

		<media:content url="http://iguessimnotcrazy.files.wordpress.com/2010/11/screenshot001.gif" medium="image">
			<media:title type="html">Visual Studio - AT Intellisense</media:title>
		</media:content>
	</item>
		<item>
		<title>Lista para leitura &#8211; Microsoft Research</title>
		<link>http://iguessimnotcrazy.wordpress.com/2010/10/01/lista-para-leitura-microsoft-research/</link>
		<comments>http://iguessimnotcrazy.wordpress.com/2010/10/01/lista-para-leitura-microsoft-research/#comments</comments>
		<pubDate>Fri, 01 Oct 2010 16:35:38 +0000</pubDate>
		<dc:creator>Felipe</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Redes Neurais]]></category>
		<category><![CDATA[Infer.Net]]></category>
		<category><![CDATA[Kodu]]></category>
		<category><![CDATA[Microsoft Research]]></category>
		<category><![CDATA[RADAR]]></category>
		<category><![CDATA[Rex]]></category>
		<category><![CDATA[Ripley]]></category>
		<category><![CDATA[RobusHeap]]></category>
		<category><![CDATA[Spectator]]></category>

		<guid isPermaLink="false">http://iguessimnotcrazy.wordpress.com/?p=761</guid>
		<description><![CDATA[Na tentativa de manter posts fresquinhos por aqui, segue uma pequena lista dos tópicos, textos e ferramentas que mais me chamaram a atenção nos últimos dias (todos parte da Microsoft Research): Kodu (parece bem divertido!) RADAR (tem que abrir no &#8230; <a href="http://iguessimnotcrazy.wordpress.com/2010/10/01/lista-para-leitura-microsoft-research/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=761&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Na tentativa de manter posts fresquinhos por aqui, segue uma pequena lista dos tópicos, textos e ferramentas que mais me chamaram a atenção nos últimos dias (todos parte da Microsoft Research):</p>
<ul>
<li><a href="http://fuse.microsoft.com/project/kodu.aspx" target="_blank">Kodu</a> (parece bem divertido!)</li>
<li><a href="http://research.microsoft.com/en-us/um/people/bahl/MS_Projects/RadarDemo/demo.htm">RADAR</a> (tem que abrir no IE)</li>
<li><a href="http://research.microsoft.com/en-us/projects/rex/">Rex</a> (pra quem não acha que expressão regular é coisa do diabo)</li>
<li><a href="http://research.microsoft.com/en-us/projects/ripley/" target="_blank">Ripley</a> (bem interessante pra quem usa AJAX to the core)</li>
<li><a href="http://research.microsoft.com/en-us/projects/robustheap/" target="_blank">RobusHeap</a> (tipica coisa que você olha e imagina: PQ nunca pensei nisto?)</li>
<li><a href="http://research.microsoft.com/en-us/projects/spectator/" target="_blank">Spectator</a> (tem alguns sites grandes precisando conhecer esta ferramenta! lol)</li>
<li><a href="http://research.microsoft.com/en-us/projects/faceannotation/" target="_blank">Automated Annotation of Human Faces in Family Albums</a> (paper)</li>
</ul>
<p>e, meu predileto: <a href="http://research.microsoft.com/en-us/um/cambridge/projects/infernet/" target="_blank">Infer.Net</a></p>
<br />Filed under: <a href='http://iguessimnotcrazy.wordpress.com/category/programacao/net/'>.Net</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/arquitetura/'>Arquitetura</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/redes-neurais/'>Redes Neurais</a> Tagged: <a href='http://iguessimnotcrazy.wordpress.com/tag/infer-net/'>Infer.Net</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/kodu/'>Kodu</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/microsoft-research/'>Microsoft Research</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/radar/'>RADAR</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/rex/'>Rex</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/ripley/'>Ripley</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/robusheap/'>RobusHeap</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/spectator/'>Spectator</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/iguessimnotcrazy.wordpress.com/761/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/iguessimnotcrazy.wordpress.com/761/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/iguessimnotcrazy.wordpress.com/761/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/iguessimnotcrazy.wordpress.com/761/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/iguessimnotcrazy.wordpress.com/761/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/iguessimnotcrazy.wordpress.com/761/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/iguessimnotcrazy.wordpress.com/761/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/iguessimnotcrazy.wordpress.com/761/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/iguessimnotcrazy.wordpress.com/761/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/iguessimnotcrazy.wordpress.com/761/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/iguessimnotcrazy.wordpress.com/761/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/iguessimnotcrazy.wordpress.com/761/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/iguessimnotcrazy.wordpress.com/761/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/iguessimnotcrazy.wordpress.com/761/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=761&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://iguessimnotcrazy.wordpress.com/2010/10/01/lista-para-leitura-microsoft-research/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f46ba8c5ca3a6c9c2b9e1f4aa8dfecc0?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">iguessimnotcrazy</media:title>
		</media:content>
	</item>
		<item>
		<title>Escopo no window.setTimeout</title>
		<link>http://iguessimnotcrazy.wordpress.com/2010/09/29/escopo-no-window-settimeout/</link>
		<comments>http://iguessimnotcrazy.wordpress.com/2010/09/29/escopo-no-window-settimeout/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 15:24:23 +0000</pubDate>
		<dc:creator>Felipe</dc:creator>
				<category><![CDATA[Blá blá blá]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Visual Studio 2010]]></category>
		<category><![CDATA[Visual Studio 2010 [Beta]]]></category>
		<category><![CDATA[Micropost]]></category>

		<guid isPermaLink="false">http://iguessimnotcrazy.wordpress.com/?p=753</guid>
		<description><![CDATA[Sim, mais um micropost. Agora para falar de um detalhe relacionado a esta função do JavaScript que vez ou outra causa uma dor de cabeça na hora de usar. O problema Imagine que você tem o seguinte código: Ao que &#8230; <a href="http://iguessimnotcrazy.wordpress.com/2010/09/29/escopo-no-window-settimeout/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=753&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Sim, mais um micropost. Agora para falar de um detalhe relacionado a esta função do JavaScript que vez ou outra causa uma dor de cabeça na hora de usar.</p>
<h1>O problema</h1>
<p>Imagine que você tem o seguinte código:</p>
<p><pre class="brush: jscript; wrap-lines: false;">
var MeuObjeto = function () {
            var _intervalo = 1000;
            this.Rodar = function () {
                alert(&quot;rodou!&quot;);
                window.setTimeout(function () { this.Rodar() }, _intervalo);
            }
        }
</pre></p>
<p>Ao que parece, tudo certo, certo? Errado!<span id="more-753"></span></p>
<p>Quando chamarmos</p>
<p><pre class="brush: jscript; wrap-lines: false;">
new MeuObjeto().Rodar();
</pre></p>
<p>você perceberá que após a primeira execução, as demais chamadas que deveriam ocorrer a cada 1 segundo não acontecerão e, dependendo do navegador, você verá uma mensagem de erro.</p>
<h1>Causa</h1>
<p>Durante a utilização do<em> window.setTimeout</em>, o escopo interno do método em questão é o do objeto <em>window</em> e não <em>MeuObjeto</em> como você (e o intellisense do Visual Studio 2010) poderia imaginar.</p>
<h1>Solução</h1>
<p>Ponteiro. (oh yeah!)</p>
<p><pre class="brush: jscript; highlight: [3,6]; wrap-lines: false;">
var MeuObjeto = function () {
            var _intervalo = 1000;
            var _eu = this;
            this.Rodar = function () {
                alert(&quot;rodou!&quot;);
                window.setTimeout(function () { _eu.Rodar() }, _intervalo);
            }
        }
</pre></p>
<p>Note que adicionamos uma variável nova no escopo do objeto <em>MeuObjeto </em>a qual contém uma referência para o objeto em si. Esta variável se torna visivel para o método que será chamado no <em>window.setTimeout</em> permitindo o acesso direto ao escopo desejado.</p>
<br />Filed under: <a href='http://iguessimnotcrazy.wordpress.com/category/bla-bla-bla/'>Blá blá blá</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/programacao/javascript-programacao/'>JavaScript</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/visual-studio-2010/'>Visual Studio 2010</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/visual-studio-2010-beta/'>Visual Studio 2010 [Beta]</a> Tagged: <a href='http://iguessimnotcrazy.wordpress.com/tag/javascript/'>JavaScript</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/micropost/'>Micropost</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/iguessimnotcrazy.wordpress.com/753/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/iguessimnotcrazy.wordpress.com/753/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/iguessimnotcrazy.wordpress.com/753/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/iguessimnotcrazy.wordpress.com/753/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/iguessimnotcrazy.wordpress.com/753/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/iguessimnotcrazy.wordpress.com/753/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/iguessimnotcrazy.wordpress.com/753/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/iguessimnotcrazy.wordpress.com/753/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/iguessimnotcrazy.wordpress.com/753/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/iguessimnotcrazy.wordpress.com/753/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/iguessimnotcrazy.wordpress.com/753/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/iguessimnotcrazy.wordpress.com/753/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/iguessimnotcrazy.wordpress.com/753/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/iguessimnotcrazy.wordpress.com/753/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=753&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://iguessimnotcrazy.wordpress.com/2010/09/29/escopo-no-window-settimeout/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f46ba8c5ca3a6c9c2b9e1f4aa8dfecc0?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">iguessimnotcrazy</media:title>
		</media:content>
	</item>
		<item>
		<title>DIY &#8211; Faça sua parte!</title>
		<link>http://iguessimnotcrazy.wordpress.com/2010/09/02/diy-faca-sua-parte/</link>
		<comments>http://iguessimnotcrazy.wordpress.com/2010/09/02/diy-faca-sua-parte/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 17:11:29 +0000</pubDate>
		<dc:creator>Felipe</dc:creator>
				<category><![CDATA[DIY]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[7COMm]]></category>
		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://iguessimnotcrazy.wordpress.com/?p=745</guid>
		<description><![CDATA[Quem me conhece sabe que por questões de criação (graças a Dna. Mãe! :D) eu to sempre tentando me envolver em projetos que visam difundir o conhecimento que acumulei durante os anos que trabalho na área. Faz coisa de dois &#8230; <a href="http://iguessimnotcrazy.wordpress.com/2010/09/02/diy-faca-sua-parte/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=745&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Quem me conhece sabe que por questões de criação (graças a Dna. Mãe! :D) eu to sempre tentando me envolver em projetos que visam difundir o conhecimento que acumulei durante os anos que trabalho na área. Faz coisa de dois anos dei o primeiro passo neste sentido (que infelizmente não foi muito feliz) e, agora estou tentando uma nova empreitada.<span id="more-745"></span></p>
<p>Sempre fui defensor de uma popularização do conhecimento como um todo. Sou entusiasta das discussões e poderia passar dias em um mesmo assunto se achar que me fará mais adaptativo ou me fará evoluir de alguma forma.</p>
<p>Fato é que a comunidade em geral, não só a comunidade de desenvolvedores / técnica, poderia ter mais disto. Conheço muita gente que já faz sua parte mas acho que duas horas por semana não mata ninguém! É uma questão de civilidade.</p>
<p>É claro que não estou aqui defendendo que um médico junte um grupo de donas de casa para ensiná-las como remover tumores ou coisa do tipo, porém, estes médicos poderiam por exemplo dedicar algumas horas do dia / semana / mês / ano a alguma entidade beneficente em que confie. É aquela história de que quando tivermos cada um fazendo um pouco, todos terão mais exemplos para se basear e seguir, fontes para construir uma rede de conhecimento descentralizada e desburocratizada e/ou,  ao menos esta sensação ótima de que você está ajudando.</p>
<p>Estou muito contente de, por meio do instituto 7COMm, poder colocar em prática esta minha visão. Ontem ministrei a primeira aula de programação (HTML e JavaScript) para uma turma de 8 alunos que me brindaram com duas horas e meia de perguntas interessantes e belas demonstrações de interesse e gana por conhecimento.</p>
<p>Ainda na pegada de compartilhar, abaixo os slides que usei na primeira aula:</p>
<iframe src='http://www.slideshare.net/slideshow/embed_code/5113340' width='584' height='479'></iframe>
<p>Agora é torcer pra que a turma aguente e mantenha a pegada até o final e, se tudo der certo, continue procurando por algo a mais.</p>
<p>PS: Faça sua parte e seja feliz!</p>
<br />Filed under: <a href='http://iguessimnotcrazy.wordpress.com/category/diy/'>DIY</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/html5/'>HTML5</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/programacao/javascript-programacao/'>JavaScript</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/programacao/'>Programação</a> Tagged: <a href='http://iguessimnotcrazy.wordpress.com/tag/7comm/'>7COMm</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/diy/'>DIY</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/html/'>HTML</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/javascript/'>JavaScript</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/iguessimnotcrazy.wordpress.com/745/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/iguessimnotcrazy.wordpress.com/745/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/iguessimnotcrazy.wordpress.com/745/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/iguessimnotcrazy.wordpress.com/745/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/iguessimnotcrazy.wordpress.com/745/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/iguessimnotcrazy.wordpress.com/745/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/iguessimnotcrazy.wordpress.com/745/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/iguessimnotcrazy.wordpress.com/745/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/iguessimnotcrazy.wordpress.com/745/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/iguessimnotcrazy.wordpress.com/745/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/iguessimnotcrazy.wordpress.com/745/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/iguessimnotcrazy.wordpress.com/745/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/iguessimnotcrazy.wordpress.com/745/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/iguessimnotcrazy.wordpress.com/745/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=745&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://iguessimnotcrazy.wordpress.com/2010/09/02/diy-faca-sua-parte/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f46ba8c5ca3a6c9c2b9e1f4aa8dfecc0?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">iguessimnotcrazy</media:title>
		</media:content>
	</item>
		<item>
		<title>(To.Double() &#124;&#124; !To.double()) { return &#8220;That&#8217;s the question&#8221;; }</title>
		<link>http://iguessimnotcrazy.wordpress.com/2010/08/18/to-double-to-double-return-thats-the-question/</link>
		<comments>http://iguessimnotcrazy.wordpress.com/2010/08/18/to-double-to-double-return-thats-the-question/#comments</comments>
		<pubDate>Wed, 18 Aug 2010 21:15:40 +0000</pubDate>
		<dc:creator>Felipe</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Blá blá blá]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[C# 4]]></category>
		<category><![CDATA[IL]]></category>
		<category><![CDATA[Boxing]]></category>
		<category><![CDATA[Double]]></category>
		<category><![CDATA[ildasm]]></category>
		<category><![CDATA[Unboxing]]></category>

		<guid isPermaLink="false">http://iguessimnotcrazy.wordpress.com/?p=728</guid>
		<description><![CDATA[Aconteceu hoje de um cliente me questionar sobre a existência de um eventual overhead gerado por boxing e unboxing de variáveis do tipo Double (big D) contra a utilização de double (small d). Após explicar a ele que isto não existe pois &#8230; <a href="http://iguessimnotcrazy.wordpress.com/2010/08/18/to-double-to-double-return-thats-the-question/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=728&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Aconteceu hoje de um cliente me questionar sobre a existência de um eventual <em>overhead</em> gerado por <em>boxing </em>e <em>unboxing </em>de variáveis do tipo <a href="http://msdn.microsoft.com/en-us/library/system.double.aspx" target="_blank">Double</a> (<em>big D</em>) contra a utilização de <a href="http://msdn.microsoft.com/en-us/library/678hzkk9.aspx" target="_blank">double</a> (<em>small d</em>). Após explicar a ele que isto não existe pois ambas as variáveis são armazenadas no stack, notei que havia ficado aquela pitada de desconfiança e, para fechar o assunto de forma adequada, preparei um pequeno exemplo, segue:</p>
<p><span id="more-728"></span></p>
<p><pre class="brush: csharp; wrap-lines: false;">
public static double Testa_d()
{
double a = double.MinValue;
double b = (double)a + 3000.0;
return b + 1.0;
}
public static Double Testa_D()
{
Double a = Double.MinValue;
Double b = (Double)a + 3000.0;
return b + 1.0;
}
public static double Testa_dDMix()
{
double a = Double.MinValue;
Double b = (double)a + 3000.0;
return b + 1.0;
}
</pre></p>
<p>Neste código temos três métodos onde, em dois deles (<em>Testa_d </em>e <em>Testa_D</em>) trabalhamos com uma declaração unica dos tipos das variáveis <em>a</em> e <em>b</em>. Já no método<em> Testa_dDMix</em>, trabalhamos de forma &#8220;mista&#8221;.</p>
<p>Finalizando, para poder provar minha declaração recorri a um simples recurso prático:  <em><a href="http://msdn.microsoft.com/en-us/library/f7dy01k1(VS.80).aspx" target="_blank">ildasm</a></em>.</p>
<p>Uma vez de posse do código IL gerado pelo compilador, foi só abrir e mostrar que todos os três métodos geraram uma representação idêntica e, não possuem qualquer instrução de boxing e/ou unboxing. Segue:</p>
<p><pre class="brush: csharp; highlight: [4,5,9]; wrap-lines: false;">
{
  // Code size       35 (0x23)
  .maxstack  2
  .locals init ([0] float64 a,
           [1] float64 b)
  IL_0000:  ldc.r8     -1.7976931348623157e+308
  IL_0009:  stloc.0
  IL_000a:  ldloc.0
  IL_000b:  conv.r8
  IL_000c:  ldc.r8     3000.
  IL_0015:  add
  IL_0016:  stloc.1
  IL_0017:  ldloc.1
  IL_0018:  ldc.r8     1.
  IL_0021:  add
  IL_0022:  ret
}
</pre></p>
<p>Note que ambas as variáveis são declaradas exatamente da mesma forma (linhas 4 e 5) e, apenas para sair um pouco do feijão com arroz e a título de curiosidade, note que na linha 9 existe uma chamada para <em>conv.r8.</em></p>
<p>Em poucas palavras, isto ocorre pois no código C# nós escrevemos este fragmento utilizando conversão explicita e, mesmo sendo uma conversão para o mesmo tipo (o que em outro momento seria um óbvio erro de programação), o compilador parece não se importar em colocar esta diretiva extra. Pessoalmente tenho um apresso muito grande para com o compilador .Net, acho ele realmente <strong>phoda</strong>, mas neste caso ele meio que faz gordisse&#8230; Se alguém tiver uma boa explicação ou motivo que justifique esta diretiva neste caso, ficarei feliz em receber um feedback.</p>
<p>Abraço e até a próxima!</p>
<p><strong>Update:</strong> Algumas pessoas me responderam falando pra tentar usar o sufixo D no valor da variável, porém, isto não muda em nada quanto a adição ou não da diretiva <em>conv.r8</em> ao código.</p>
<p><strong>Update 1 / Complemento: </strong>Uma referência legal pra quem quer saber um pouco mais sobre boxing e unboxing: <a href="http://elemarjr.wordpress.com/2010/08/25/il-101parte-9-boxing-e-unboxing/" target="_blank">IL 101–Parte 9 (Boxing e Unboxing)</a></p>
<br />Filed under: <a href='http://iguessimnotcrazy.wordpress.com/category/programacao/net/'>.Net</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/bla-bla-bla/'>Blá blá blá</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/programacao/net/c/'>C#</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/programacao/net/c-4/'>C# 4</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/il/'>IL</a> Tagged: <a href='http://iguessimnotcrazy.wordpress.com/tag/net/'>.Net</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/boxing/'>Boxing</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/c/'>C#</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/double/'>Double</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/il/'>IL</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/ildasm/'>ildasm</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/unboxing/'>Unboxing</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/iguessimnotcrazy.wordpress.com/728/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/iguessimnotcrazy.wordpress.com/728/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/iguessimnotcrazy.wordpress.com/728/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/iguessimnotcrazy.wordpress.com/728/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/iguessimnotcrazy.wordpress.com/728/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/iguessimnotcrazy.wordpress.com/728/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/iguessimnotcrazy.wordpress.com/728/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/iguessimnotcrazy.wordpress.com/728/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/iguessimnotcrazy.wordpress.com/728/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/iguessimnotcrazy.wordpress.com/728/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/iguessimnotcrazy.wordpress.com/728/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/iguessimnotcrazy.wordpress.com/728/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/iguessimnotcrazy.wordpress.com/728/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/iguessimnotcrazy.wordpress.com/728/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=728&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://iguessimnotcrazy.wordpress.com/2010/08/18/to-double-to-double-return-thats-the-question/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f46ba8c5ca3a6c9c2b9e1f4aa8dfecc0?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">iguessimnotcrazy</media:title>
		</media:content>
	</item>
		<item>
		<title>DSL usando M</title>
		<link>http://iguessimnotcrazy.wordpress.com/2010/08/13/m/</link>
		<comments>http://iguessimnotcrazy.wordpress.com/2010/08/13/m/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 16:00:21 +0000</pubDate>
		<dc:creator>Felipe</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Beta]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[Linguagem M]]></category>
		<category><![CDATA[OSLO]]></category>
		<category><![CDATA[.Net Future]]></category>

		<guid isPermaLink="false">http://iguessimnotcrazy.wordpress.com/?p=634</guid>
		<description><![CDATA[Como todas as outras coisas da minha lista de &#8220;TODOs&#8221;, a linguagem M é uma das que mais tinha destaque e finalmente consegui um tempo para enfrentar o processo de aprendizado a fim de tirar o melhor proveito do que &#8230; <a href="http://iguessimnotcrazy.wordpress.com/2010/08/13/m/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=634&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Como todas as outras coisas da minha lista de &#8220;TODOs&#8221;, a <a href="http://msdn.microsoft.com/en-us/library/dd129519(VS.85).aspx" target="_blank">linguagem M</a> é uma das que mais tinha destaque e finalmente consegui um tempo para enfrentar o processo de aprendizado a fim de tirar o melhor proveito do que ela se propõe a resolver.</p>
<p>Conceitualmente, a linguagem M se baseia em quatro pilares: Linguagem, dados, <em>constraints</em> e transformação. Vamos a eles.<span id="more-634"></span></p>
<h1>Linguagem M</h1>
<p>Por definição, escrever nesta linguagem consiste em unir uma ou mais regra sintática tokenizada, cada qual contendo fragmentos ou o todo (no caso do padrão <em>Main</em>) da forma possível de escrita do texto (código). Abaixo o que poderia ser a definição para uma linguagem chamada <em>HelloWorld</em>:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
mudule Simples
{
   language HelloLanguage {
     syntax Main = &quot;Hello, World&quot;;
   }
}
</pre></p>
<p>Basicamente, na grande maioria dos casos, a construção de uma estrutura de linguagem utilizando M considera a necessidade de <em>Tokens </em>(equivalente as palavras conhecidas)  e <em>syntaxes </em>(equivalente a estrutura fraseal).</p>
<p>Na realidade, ao contrário do que eu escrevi poucas linhas acima, o nome real (<em>full name</em>) da linguagem que criamos a pouco seria <em>Simples.HelloLanguage</em>, uma estrutura que remete ao sistema de Namespaces que estamos acostumados nas linguagens formais da plataforma .Net.</p>
<p>Nas linhas escritas acima existe uma declaração de sintaxe bem simples onde permitimos (e reconhecemos) a utilização da forma &#8220;Hello, World&#8221; como sendo uma declaração válida e coesa. As informações definidas em forma de sintaxe podem ser entendidas como sendo as regras da linguagem, logo, com a regra que definimos até o momento apenas um texto exatamente igual a &#8220;Hello, World&#8221; seria interpretada como uma sintaxe válida. Qualquer outro texto/padrão será definido pelo processador como inválido.</p>
<p>Como você pode imaginar, uma linguagem que contém apenas uma regra é tão útil quanto um saco de areia no deserto. Geralmente teremos formas sintáticas contendo múltiplos padrões, como pode exemplo:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
mudule Simples
{
   language CoresPrimarias {
      syntax Main = &quot;Vermelho&quot; | &quot;Amarelo&quot; | &quot;Azul&quot;;
   }
}
</pre></p>
<p>Facilmente identificamos que em termos de cores primárias, de acordo com nossa definição acima, tanto &#8220;Vermelho&#8221;, quanto &#8220;Amarelo&#8221; ou &#8220;Azul&#8221; são informações que fazem sentido neste contexto, porém, &#8220;Roxo&#8221; não se aplica.</p>
<h1>Intellipad</h1>
<p>Este foi talvez um dos artigos mais difíceis de escrever dada a enorme falta de informação e diria até de suporte da Microsoft para a comunidade que quer começar a fazer alguma coisa com a ferramenta. Dentre outras dificuldades, não conseguia de forma alguma entender como fazer a compilação da gramática por meio do release mais recente do pacote SQL Server Modeling CTP Nov R3, mas depois de abrir <a href="http://social.msdn.microsoft.com/Forums/en/oslo/thread/1d5a896f-6476-4991-a534-d0c7f0d7e9f4?prof=required" target="_blank">um tópico (aparentemente no lugar errado)</a> perguntando sobre o assunto, pude dar continuidade ao artigo.</p>
<p>Como sairemos da parte conceitual, é interessante que você tenha instalado em sua máquina as ferramentas para escrever e testar suas sintaxes localmente. Segue o link para o pacote necessário para o resto do artigo:</p>
<blockquote><p><a href="http://www.microsoft.com/downloads/en/confirmation.aspx?familyId=29e4ead0-fd81-42ba-862b-f3589378466a&amp;displayLang=en" target="_blank">SQL Server Modeling CTP &#8211; Nov 2009 Release 3 (formerly “Oslo”)</a></p></blockquote>
<p>Após a instalação você verá no menu iniciar, dentro da opção &#8220;<em>Microsoft Oslo</em>&#8220;, um atalho para o Intellipad.</p>
<p>A título de exemplo, vamos trabalhar com a necessidade de definir uma linguagem para especificar formas de pagamento de maneira <em>inteligível</em>. Digamos que:</p>
<ul>
<li>Existem diversas formas de pagamento, cada qual com suas características e peculiaridades; Para cada forma de pagamento:
<ul>
<li>Poderão ocorrer  ações (Pagar, Agendar, etc);</li>
<li>Poderemos definir a fonte dos recursos;</li>
</ul>
</li>
</ul>
<p>Com estes dois casos simples, trabalharemos a seguir de forma a normatizar uma DSL usando M e permitir a escrita de instruções simples e diretas porém, que englobem o todo do negócio em questão. Para começar, vamos definir uma história simples:</p>
<blockquote>
<div id="_mcePaste">Pagamento &#8220;Boleto&#8221;</div>
<div id="_mcePaste" style="padding-left:30px;">Banco &#8220;Itau&#8221;</div>
<div id="_mcePaste" style="padding-left:30px;">Moeda &#8220;Real&#8221;</div>
<div id="_mcePaste" style="padding-left:30px;">Valor &#8220;R$300,00&#8243;</div>
<div id="_mcePaste" style="padding-left:30px;">Pagar!</div>
<div id="_mcePaste">Fim Pagamento</div>
</blockquote>
<div>Vamos começar a escrever nossa linguagem, inicialmente, validando a história em questão e transformando as informações e palavras chaves existentes nela em estruturas diretamente relacionadas ao que pretendemos ter como produto final.</div>
<p>Como todo bom inicio de desenvolvimento, teremos um código visivelmente estranho e &#8220;melhorável&#8221;, porém, até o momento ele atende nossas necessidades e cria abertura para aprendermos mais algumas coisas. Veja o código a seguir:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
module Felipe
{
    language Financas
    {
       /// Sintaxe base
        syntax Main =&quot;Pagamento&quot;
            valorLiteral
            Banco
            Moeda
            Valor
            Pagar
            &quot;Fim Pagamento&quot;;

        /// Declaração das variáveis globais conhecidas
        syntax Banco = &quot;Banco&quot; valorLiteral;
        syntax Moeda = &quot;Moeda&quot; valorLiteral;
        syntax Valor = &quot;Valor&quot; valorLiteral;

        /// Declaração das ações possíveis
        syntax Pagar = &quot;Pagar!&quot;;

        /// Interleaves permitidos
        interleave whitespace = (&quot; &quot; | &quot;\r&quot; | &quot;\n&quot; | &quot;\t&quot;)+;

        /// Tokens
        token valorLiteral = '&quot;' !('\r' | '\n' | '&quot;')+ '&quot;';
   }
}
</pre></p>
<blockquote><p><em>Para acompanhar os próximos passos e se familiarizar com a interface do Intellipad, faça o seguinte:</em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em></p>
<ol>
<li><span style="font-style:normal;"><em> Abra o Intellipad e cole o código acima (e os demais que serão disponibilizados ao longo do artigo) salvando o arquivo com extensão .mg (recomendo salvar como &#8220;MinhaLinguagem.mg&#8221; para facilitar o acompanhamento do artigo). Isto dirá ao Intellipad que ele deve tratar esta janela em modo &#8220;DSL Grammar Mode&#8221;, ajudando e facilitando o desenvolvimento;</em></span></li>
<li><span style="font-style:normal;"><em>No caso da história, salve-a em um arquivo separado (preferencialmente com a extensão .dsl, melhor ainda se com o nome &#8220;Historia.dsl&#8221;, também para facilitar o acompanhamento)e carregue este arquivo por meio do caminho: &#8220;DSL&#8221; &gt; &#8220;Open File as Input and Show Output&#8230;&#8221;. Desta forma você terá a visão completa em tempo real da aderência de sua DSL frente a história.</em></span></li>
</ol>
<p></em></p></blockquote>
<p>Nota-se no código acima a adição de mais dois padrões sendo: <em>interleave</em> e <em>token</em>. Abaixo, a explicação para cada um:</p>
<ul>
<li><strong>Interleave:</strong> Quando criamos um padrão deste tipo estamos dizendo ao processador <em>M </em>que estes fragmentos de texto não devem ser considerados como parte do fluxo primário, ou seja, devem ser desconsiderados; Durante o processamento do texto (<em>input</em>), o processador automaticamente injeta estes padrões entre os termos de padrões do <span style="text-decoration:underline;">tipo </span><em><span style="text-decoration:underline;">syntax</span></em><em>.</em></li>
<li><strong>Token:</strong> Por meio deste padrão, dizemos ao processador quais são as formas de acessar informações literais em nossa linguagem criando uma espécie de filtro. No caso acima, estamos considerando qualquer coisa que comece e termine com aspas duplas, exceto por novas linhas, saltos de linha e aspas duplas entrelaçadas no escopo principal;</li>
</ul>
<p>O código acima juntamente com a história que definimos inicialmente permite  que o <em>Intellipad</em> consiga identificar alguns padrões:</p>
<div id="attachment_654" class="wp-caption aligncenter" style="width: 272px"><a href="http://iguessimnotcrazy.files.wordpress.com/2010/10/graph.jpg"><img class="size-full wp-image-654" title="M Graph Mode" src="http://iguessimnotcrazy.files.wordpress.com/2010/10/graph.jpg?w=584" alt="M Graph Mode"   /></a><p class="wp-caption-text">M Graph Mode</p></div>
<p>Legal, certo?! Que tal melhorar um pouco este código?</p>
<p>Primeiro, vamos tentar diminuir um pouco a redundância existente nas declarações de algumas estruturas; Para tanto, vamos realizar as seguintes alterações:</p>
<ul>
<li>Utilizar uma forma de declaração de <em>syntax</em> que permite um comportamento similar ao das funções (em linguagens de programação tradicional) para maximizar a reutilização dos formatos;
<ul>
<li>Chamarei esta &#8220;função&#8221; de variavel, uma vez que para o negócio, ela representa as variáveis com as quais trabalharemos. O funcionamento dela é bem auto-explicativo, você ao definir uma estrutura sintática composta só precisa seguir a sintaxe definida para a linguagem M e, consumir esta sintaxe não é mais difícil do que realizar uma chamada a um método qualquer.</li>
</ul>
</li>
<li>Melhorar a sintaxe principal para permitir o uso opcional de algumas variáveis, de acordo com a necessidade;</li>
</ul>
<p><pre class="brush: csharp; wrap-lines: false;">
module Felipe
{
    language Financas
    {
        /// Regra para variáveis globais
        syntax variavel(nomeToken) = nomeToken valorLiteral;

        /// Sintaxe base
        syntax Main =&quot;Pagamento&quot;
            valorLiteral
            Banco
            &quot;Fim Pagamento&quot;;

        /// Declaração das variáveis globais conhecidas
        syntax Banco = &quot;Banco&quot; valorLiteral (Moeda | Valor)* Executar;
        syntax Moeda = variavel(&quot;Moeda&quot;);
        syntax Valor = variavel(&quot;Valor&quot;);
        token Pagar = &quot;Pagar!&quot;;
        token Agendar = &quot;Agendar!&quot;;

        /// Declaração das ações possíveis
        syntax Executar = (Pagar | Agendar);

        /// Interleaves permitidos
        interleave whitespace = (&quot; &quot; | &quot;\r&quot; | &quot;\n&quot; | &quot;\t&quot;)+;

        /// Tokens
        token valorLiteral = '&quot;' !('\r' | '\n' | '&quot;')+ '&quot;';
    }
}
</pre></p>
<p>Bom, neste ponto, nossa sintaxe está poderosa o suficiente para validar diversas formas diferentes de se contar a história inicial porém, sem perder a aderência ao escopo desejado.</p>
<blockquote><p><strong>Syntax + Token = OK:<br />
</strong>Um detalhe muito importante de se ressaltar sobre o código acima é o uso de padrões <em>syntax </em>consumindo padrões de <em>token</em>, <strong>neste caso</strong> o interpretador permite a utilização, porém, no caso oposto (<em>token</em> consumindo <em>syntax</em>) um erro ocorre e (pelo menos na minha máquina) o Intellipad trava e fecha com a mensagem abaixo!</p>
<div id="attachment_659" class="wp-caption aligncenter" style="width: 424px"><a href="http://iguessimnotcrazy.files.wordpress.com/2010/10/erro.jpg" target="_blank"><img class="size-full wp-image-659 " title="BUM!!" src="http://iguessimnotcrazy.files.wordpress.com/2010/10/erro.jpg?w=584" alt="BUM!!"   /></a><p class="wp-caption-text">Intellipad error - BUM!!</p></div></blockquote>
<p>Uma outra funcionalidade interessante é a possibilidade de decorar nossos padrões do tipo <em>token</em> com atributos para permitir uma espécie de <em>syntax highlight</em>. Veja o código abaixo:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
module Felipe
{
    language Financas
    {
        /// Regra para variáveis globais
        syntax variavel(nomeToken) = nomeToken tValorLiteral;

        /// Sintaxe base
        syntax Main =tPagamento
            tValorLiteral
            sBanco
            tFimPagamento;

        /// Tokens conhecidos
        @{Classification[&quot;Literal&quot;]}
        token tValorLiteral = '&quot;' !('\r' | '\n' | '&quot;')+ '&quot;';

        @{Classification[&quot;Keyword&quot;]}
        token tPagar = &quot;Pagar!&quot;;

        @{Classification[&quot;Keyword&quot;]}
        token tAgendar = &quot;Agendar!&quot;;

        @{Classification[&quot;Keyword&quot;]}
        token tPagamento = &quot;Pagamento&quot;;

        @{Classification[&quot;Keyword&quot;]}
        token tFimPagamento = &quot;Fim Pagamento&quot;;

        @{Classification[&quot;Keyword&quot;]}
        token tBanco = &quot;Banco&quot;;

        @{Classification[&quot;Keyword&quot;]}
        token tMoeda = &quot;Moeda&quot;;

        @{Classification[&quot;Keyword&quot;]}
        token tValor = &quot;Valor&quot;;

        /// Declaração das ações possíveis
        /// Sintaxes permitidas
        syntax sExecutar = (tPagar | tAgendar);
        syntax sBanco = tBanco tValorLiteral (sMoeda | sValor)* sExecutar;
        syntax sMoeda = variavel(tMoeda);
        syntax sValor = variavel(tValor);

        /// Interleaves permitidos
        interleave whitespace = (&quot; &quot; | &quot;\r&quot; | &quot;\n&quot; | &quot;\t&quot;)+;
    }
}
</pre></p>
<p>O resultado é interessante:</p>
<div id="attachment_662" class="wp-caption aligncenter" style="width: 397px"><a href="http://iguessimnotcrazy.files.wordpress.com/2010/10/high.jpg" target="_blank"><img class="size-full wp-image-662 " title="Borat said - Nice!" src="http://iguessimnotcrazy.files.wordpress.com/2010/10/high.jpg?w=584" alt="Borat said - Nice!"   /></a><p class="wp-caption-text">Borat said: Nice!</p></div>
<h1><strong>Productions</strong></h1>
<p>Por fim, vamos ao conceito de <em>Productions</em> que, a grosso modo, podemos definir como a forma em que o resultado da interpretação de um dado texto frente à linguagem deverá ser apresentado. Para facilitar, vamos alterar um pouco o nosso código para deixá-lo mais amigável:</p>
<blockquote><p>Pagamento &#8220;Boleto&#8221;</p>
<p style="padding-left:30px;">Moeda: Dólar</p>
<p style="padding-left:30px;">Banco: Itau</p>
<p>Fim Pagamento</p></blockquote>
<p>Esta alteração não tem influência direta no resultado quando utilizando <em>Productions, </em>alterei apenas para deixar a explicação mais simples.</p>
<p>Obviamente que neste ponto a janela &#8220;M Graph Mode&#8221; já não exibe nada pois o interpretador já não consegue fazer o <em>match</em> entre a história e a definição da linguagem. Para resolver isto, vamos alterar a definição da seguinte maneira:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
module Felipe
{
    language Financas
    {
        /// Sintaxe base
        syntax Main = tPagamento
            tValorLiteral
            (sMoeda | sBanco)*
            tFimPagamento;

        /// Tokens conhecidos
        @{Classification[&quot;Literal&quot;]}
        token tValorLiteral = '&quot;' !('\r' | '\n' | '&quot;')+ '&quot;';

        @{Classification[&quot;Keyword&quot;]}
        token tPagamento = &quot;Pagamento&quot;;

        @{Classification[&quot;Keyword&quot;]}
        token tFimPagamento = &quot;Fim Pagamento&quot;;

        @{Classification[&quot;Identifier&quot;]}
        token tTipoMoeda = &quot;Real&quot; | &quot;Dólar&quot;;

        @{Classification[&quot;Keyword&quot;]}
        token tMoeda = &quot;Moeda&quot;;

        @{Classification[&quot;Keyword&quot;]}
        token tBanco = &quot;Banco&quot;;

        @{Classification[&quot;Identifier&quot;]}
        token tTipoBanco = &quot;Itau&quot; | &quot;Real&quot;;

        /// Sintaxes auxiliares
        syntax sMoeda = tMoeda ':' tTipoMoeda;
        /// Production
        syntax sBanco = bk:tBanco ':' nome:tTipoBanco =&gt; id(&quot;O banco de destino é:&quot;){nome};

        /// Interleaves permitidos
        interleave whitespace = (&quot; &quot; | &quot;\r&quot; | &quot;\n&quot; | &quot;\t&quot;)+;
    }
}
</pre></p>
<p>Em suma, a idéia por traz dos padrões <em>Production</em> é o de você ser capaz de manipular a forma com que o resultado da análise do código é produzido.</p>
<p>No código acima pode-se observar que no momento da definição da sintaxe <em>sBanco, </em>existe um identificador para o token <em>tTipoBanco</em> que permite a utilização desta informação em uma customização do resultado exibido na janela &#8220;M Graph Mode&#8221;. Complementando a análise da linha, é possível notar que existe uma chamada à expressão <em>id( )</em>, esta expressão é responsável por definir o nome do nó pai em que aquele resultado será exibido.</p>
<p>Podemos adicionar mais alguma perfumaria ao código anterior, permitindo coisas como comentários in-line e em bloco, porém não vou me ater muito a estes detalhes visto que o conhecimento necessário para tanto já foi exposto. Vamos então para o próximo e derradeiro tópico: Output.</p>
<h1>CommandLine.exe</h1>
<p>Junto com o pacote <em>Oslo PDC e SDK</em> você encontra algumas outras ferramentas para dar suporte ao desenvolvimento em M, das quais duas se destacam:</p>
<ul>
<li><strong>m.exe:</strong> Ferramenta para compilar sua gramática de forma a permitir a validação da DSL; Você deve fornecer a ela o arquivo em que você descreveu sua gramática (<em>nosso arquivo .mg</em>) e esperar que um arquivo compilado seja gerado (<em>arquivo .mx</em>);<br />
<span style="font-family:Consolas, Courier, monospace;line-height:18px;font-size:12px;white-space:pre;">m.exe MinhaLinguagem.mg</span></li>
<li><strong>mx.exe: <span style="font-weight:normal;">Por meio do seu arquivo gramatical compilado (<em>.mx</em>), juntamente com a história (a DSL) ele consegue gerar uma saída em formato &#8220;M&#8221; ou XAML. A sintaxe de execução é a seguinte:</span><br />
</strong><span style="font-family:Consolas, Courier, monospace;line-height:18px;font-size:12px;white-space:pre;">mx.exe Historia.<em>dsl</em> /r:MinhaLinguagem.mx</span></li>
<li><strong>mg.exe: </strong> <span style="font-weight:normal;">Apenas a título de menção honrosa, esta era a ferramenta para realizar a compilação da gramática até o CTP Nov R3.</span></li>
</ul>
<p>Após a geração do nosso arquivo .M, teremos algo muito parecido com isto:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
module Historia {
    Main {
        @[0] =&gt; &quot;Pagamento&quot;,
        @[1] =&gt; &quot;\&quot;Boleto\&quot;&quot;,
        @[2] =&gt;  {
            @[0] {
                 {
                    @[0] {
                        sMoeda {
                            @[0] =&gt; &quot;Moeda&quot;,
                            @[1] =&gt; &quot;:&quot;,
                            @[2] =&gt; &quot;Real&quot;
                        }
                    }
                }
            },
            @[1] {
                 {
                    @[0] {
                        @[O banco de destino é:] =&gt; &quot;Itau&quot;
                    }
                }
            }
        },
        @[3] =&gt; &quot;Fim Pagamento&quot;
    }
}
</pre></p>
<p>Agora, finalmente podemos chegar a um modelo mais prático de como ler e parsear nossa DSL de dentro de um código C#, por exemplo:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
public static void Compilar()
        {
            /// Compilamos a gramática em tempo de execução de modo a permitir que eventuais alterações
            /// em sua estrutura sejam imediatamente replicadas por aqui. Isto também pode ser feito manualmente
            /// por meio da ferramenta &quot;m.exe&quot; que acompanha o Oslo
            CompilationResults results = Compiler.Compile(
              new CompilerOptions
              {
                  Sources =
                  {
                        new TextItem
                        {
                            /// Endereço para o arquivo contendo as definições da linguagem
                            Reader = new StreamReader(@&quot;C:\Financas.mg&quot;),
                            Name=&quot;MeuItem&quot;,
                            ContentType = TextItemType.MGrammar
                        }
                    }
            });

            /// Na linha abaixo temos efetivamente o resultado do parse de nossa DSL contra as regras
            /// que definimos em nossa linguagem. Daqui em diante você pode iterar entre os nodes oriundos
            /// da operação e realizar qualquer que seja a tarefa em mente para o processo, seja: criar e
            /// popular um DTO, instruir o código em algum Path específico, etc...
            var resultados = results.ParserFactories[&quot;Felipe.Financas&quot;].Create().Parse(@&quot;c:\Historia.dsl&quot;, null);
        }
</pre></p>
<p>Conforme explicado no <em>snippet</em> acima, a manipulação do resultado do parse é bem intuitiva e, varia de acordo com a necessidade para qual sua DSL foi desenhada. Você pode também utilizar seu aquivo <em>.mx</em> compilado manualmente seguindo os passos descritos <a href="http://msdn.microsoft.com/en-us/library/dd789404.aspx" target="_blank">aqui</a>.</p>
<div id="attachment_705" class="wp-caption aligncenter" style="width: 470px"><a href="http://iguessimnotcrazy.files.wordpress.com/2010/10/flow.jpg" target="_blank"><img class="size-full wp-image-705 " title="Flow" src="http://iguessimnotcrazy.files.wordpress.com/2010/10/flow.jpg?w=584" alt="Flow"   /></a><p class="wp-caption-text">Flow</p></div>
<p style="text-align:center;">
<p><span style="font-size:13px;"><strong>Importante:</strong> <span style="font-weight:normal;"> Se quando estiver compilando seu projeto você receber a mensagem &#8220;<em>The type or namespace name &#8216;M&#8217; does not exist in the namespace &#8216;Microsoft&#8217; (are you missing an assembly reference?)</em>&#8220;, a solução no meu caso foi ir até as propriedades do projeto e alterar o <em>Target Framework </em>de &#8220;<em>.NET Framework 4-Client Profile</em>&#8221; para &#8220;<em>.NET Framework 4</em>&#8221; (<a href="http://social.msdn.microsoft.com/Forums/en-US/oslo/thread/1df4be4a-5417-456d-9d00-20becb307b31" target="_blank">Mais info aqui</a>).</span></span></p>
<h1>Outras leituras:</h1>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/dd129654(VS.85).aspx" target="_blank">Mx.exe</a></li>
<li><a href="http://social.msdn.microsoft.com/Forums/en/oslo/threads" target="_blank">SQL Server Modeling</a></li>
<li><a href="http://en.wikipedia.org/wiki/Domain-specific_language" target="_blank">DSL &#8211; Domain-Specific languages</a></li>
<li><a href="http://elemarjr.wordpress.com/2010/08/27/domain-specific-languages-no-dia-a-dia/" target="_blank">Domain-Specific Languages no dia-a-dia</a></li>
</ul>
<br />Filed under: <a href='http://iguessimnotcrazy.wordpress.com/category/programacao/net/'>.Net</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/arquitetura/'>Arquitetura</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/beta/'>Beta</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/dsl/'>DSL</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/programacao/linguagem-m/'>Linguagem M</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/oslo/'>OSLO</a> Tagged: <a href='http://iguessimnotcrazy.wordpress.com/tag/net-future/'>.Net Future</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/beta/'>Beta</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/linguagem-m/'>Linguagem M</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/iguessimnotcrazy.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/iguessimnotcrazy.wordpress.com/634/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/iguessimnotcrazy.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/iguessimnotcrazy.wordpress.com/634/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/iguessimnotcrazy.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/iguessimnotcrazy.wordpress.com/634/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/iguessimnotcrazy.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/iguessimnotcrazy.wordpress.com/634/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/iguessimnotcrazy.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/iguessimnotcrazy.wordpress.com/634/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/iguessimnotcrazy.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/iguessimnotcrazy.wordpress.com/634/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/iguessimnotcrazy.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/iguessimnotcrazy.wordpress.com/634/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=634&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://iguessimnotcrazy.wordpress.com/2010/08/13/m/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f46ba8c5ca3a6c9c2b9e1f4aa8dfecc0?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">iguessimnotcrazy</media:title>
		</media:content>

		<media:content url="http://iguessimnotcrazy.files.wordpress.com/2010/10/graph.jpg" medium="image">
			<media:title type="html">M Graph Mode</media:title>
		</media:content>

		<media:content url="http://iguessimnotcrazy.files.wordpress.com/2010/10/erro.jpg" medium="image">
			<media:title type="html">BUM!!</media:title>
		</media:content>

		<media:content url="http://iguessimnotcrazy.files.wordpress.com/2010/10/high.jpg" medium="image">
			<media:title type="html">Borat said - Nice!</media:title>
		</media:content>

		<media:content url="http://iguessimnotcrazy.files.wordpress.com/2010/10/flow.jpg" medium="image">
			<media:title type="html">Flow</media:title>
		</media:content>
	</item>
		<item>
		<title>Quick Update: Layer Validation</title>
		<link>http://iguessimnotcrazy.wordpress.com/2010/07/16/quick-update-layer-validation/</link>
		<comments>http://iguessimnotcrazy.wordpress.com/2010/07/16/quick-update-layer-validation/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 13:16:19 +0000</pubDate>
		<dc:creator>Felipe</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Visual Studio 2010]]></category>

		<guid isPermaLink="false">http://iguessimnotcrazy.wordpress.com/?p=627</guid>
		<description><![CDATA[Eu sempre me perguntei: Quando será que farão (Microsoft) uma ferramenta que possa ser usada pra impedir que aquele programador preguiçoso atrapalhe todo o planejamento arquitetural do projeto. A resposta aparentemente chegou em forma de uma Feature do VS2010. Para &#8230; <a href="http://iguessimnotcrazy.wordpress.com/2010/07/16/quick-update-layer-validation/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=627&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Eu sempre me perguntei: Quando será que farão (Microsoft) uma ferramenta que possa ser usada pra impedir que aquele programador preguiçoso atrapalhe todo o planejamento arquitetural do projeto. A resposta aparentemente chegou em forma de uma Feature do VS2010.<span id="more-627"></span></p>
<p>Para maiores detalhes, segue o link para o blog do Sr. Jason Zanders (em inglês):<br />
<a href="http://blogs.msdn.com/b/jasonz/archive/2010/02/18/favorite-vs2010-features-layer-validation.aspx" target="_blank">http://blogs.msdn.com/b/jasonz/archive/2010/02/18/favorite-vs2010-features-layer-validation.aspx</a></p>
<br />Filed under: <a href='http://iguessimnotcrazy.wordpress.com/category/arquitetura/'>Arquitetura</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/visual-studio-2010/'>Visual Studio 2010</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/iguessimnotcrazy.wordpress.com/627/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/iguessimnotcrazy.wordpress.com/627/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/iguessimnotcrazy.wordpress.com/627/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/iguessimnotcrazy.wordpress.com/627/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/iguessimnotcrazy.wordpress.com/627/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/iguessimnotcrazy.wordpress.com/627/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/iguessimnotcrazy.wordpress.com/627/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/iguessimnotcrazy.wordpress.com/627/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/iguessimnotcrazy.wordpress.com/627/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/iguessimnotcrazy.wordpress.com/627/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/iguessimnotcrazy.wordpress.com/627/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/iguessimnotcrazy.wordpress.com/627/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/iguessimnotcrazy.wordpress.com/627/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/iguessimnotcrazy.wordpress.com/627/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=627&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://iguessimnotcrazy.wordpress.com/2010/07/16/quick-update-layer-validation/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f46ba8c5ca3a6c9c2b9e1f4aa8dfecc0?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">iguessimnotcrazy</media:title>
		</media:content>
	</item>
		<item>
		<title>O tempo passa, o tempo voa, mas o EntityFramework continua estranho!</title>
		<link>http://iguessimnotcrazy.wordpress.com/2010/06/24/o-tempo-passa-o-tempo-voa-mas-o-entityframework-continua-estranho/</link>
		<comments>http://iguessimnotcrazy.wordpress.com/2010/06/24/o-tempo-passa-o-tempo-voa-mas-o-entityframework-continua-estranho/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 03:28:40 +0000</pubDate>
		<dc:creator>Felipe</dc:creator>
				<category><![CDATA[.Net 3.5]]></category>
		<category><![CDATA[.Net MVC]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Blá blá blá]]></category>
		<category><![CDATA[.Net Framework 4.0]]></category>

		<guid isPermaLink="false">http://iguessimnotcrazy.wordpress.com/?p=617</guid>
		<description><![CDATA[Não rima, mas é verdade. Faz mais de um ano eu escrevi um post em meu outro blog (agora migrado pra cá) sobre minhas primeiras impressões quanto a ferramenta de dados lançada junto ao .Net framework 3.5 (SP1),  conhecida popularmente &#8230; <a href="http://iguessimnotcrazy.wordpress.com/2010/06/24/o-tempo-passa-o-tempo-voa-mas-o-entityframework-continua-estranho/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=617&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Não rima, mas é verdade.</p>
<p>Faz mais de um ano eu escrevi um post em meu outro blog (<strong><a href="http://iguessimnotcrazy.wordpress.com/2009/05/20/c-entity-converter-sort-of/" target="_blank">agora migrado pra cá</a></strong>) sobre minhas primeiras impressões quanto a ferramenta de dados lançada junto ao .Net framework 3.5 (SP1),  conhecida popularmente como Entity Framework e, para minha surpresa, o motivo que me fez não usar a solução em NADA no passado deve ser a mesma que me prevenirá de usá-la na versão atual.</p>
<p><span id="more-617"></span></p>
<p>Resumindo, este post serve para duas coisas:</p>
<ol>
<li>Mostrar que, apesar de estar sumido, estou vivo! <em>Yey!</em></li>
<li>Demonstrar minha indignação frente ao fato de que mesmo as <a href="http://www.asp.net/mvc/tutorials/mvc-music-store-part-5" target="_blank">referências mais recentes do EF2 (ref: Dynamic Data) relatam a solução (na minha opinião) porca de </a><em><a href="http://www.asp.net/mvc/tutorials/mvc-music-store-part-5" target="_blank">Metadata decoration</a></em><a href="http://www.asp.net/mvc/tutorials/mvc-music-store-part-5" target="_blank"> como sendo a solução &#8220;oficial&#8221;</a>&#8230;</li>
</ol>
<p>É, parece que ainda não tá na hora de trocar meu NHibernate.</p>
<p>PS&gt; Estou mudando de emprego o que indica que meu próximo post (continuação do último sobre Hopfield) pode demorar um pouco mais do que o imaginado, mas não se engane: ELE VIRÁ!</p>
<br />Filed under: <a href='http://iguessimnotcrazy.wordpress.com/category/net-3-5/'>.Net 3.5</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/net-mvc/'>.Net MVC</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/arquitetura/'>Arquitetura</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/bla-bla-bla/'>Blá blá blá</a> Tagged: <a href='http://iguessimnotcrazy.wordpress.com/tag/net-framework-4-0/'>.Net Framework 4.0</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/iguessimnotcrazy.wordpress.com/617/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/iguessimnotcrazy.wordpress.com/617/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/iguessimnotcrazy.wordpress.com/617/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/iguessimnotcrazy.wordpress.com/617/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/iguessimnotcrazy.wordpress.com/617/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/iguessimnotcrazy.wordpress.com/617/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/iguessimnotcrazy.wordpress.com/617/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/iguessimnotcrazy.wordpress.com/617/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/iguessimnotcrazy.wordpress.com/617/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/iguessimnotcrazy.wordpress.com/617/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/iguessimnotcrazy.wordpress.com/617/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/iguessimnotcrazy.wordpress.com/617/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/iguessimnotcrazy.wordpress.com/617/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/iguessimnotcrazy.wordpress.com/617/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=617&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://iguessimnotcrazy.wordpress.com/2010/06/24/o-tempo-passa-o-tempo-voa-mas-o-entityframework-continua-estranho/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f46ba8c5ca3a6c9c2b9e1f4aa8dfecc0?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">iguessimnotcrazy</media:title>
		</media:content>
	</item>
		<item>
		<title>Redes Neurais – C# &#8211; Hopfield</title>
		<link>http://iguessimnotcrazy.wordpress.com/2010/05/28/redes-neurais-%e2%80%93-c-hopfield/</link>
		<comments>http://iguessimnotcrazy.wordpress.com/2010/05/28/redes-neurais-%e2%80%93-c-hopfield/#comments</comments>
		<pubDate>Sat, 29 May 2010 00:41:19 +0000</pubDate>
		<dc:creator>Felipe</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Redes Neurais]]></category>
		<category><![CDATA[Hopfield]]></category>

		<guid isPermaLink="false">http://iguessimnotcrazy.wordpress.com/?p=524</guid>
		<description><![CDATA[Continuando o artigo anterior de Redes Neurais para C#, vamos agora entrar no glorioso mundo das redes neurais de Hopfield, esta que é muito provavelmente o tipo mais simples de implementação para ANN. Em uma definição resumida do formato em &#8230; <a href="http://iguessimnotcrazy.wordpress.com/2010/05/28/redes-neurais-%e2%80%93-c-hopfield/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=524&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Continuando o <a href="http://iguessimnotcrazy.wordpress.com/2010/05/26/redes-neurais-c/" target="_blank">artigo anterior de Redes Neurais para C#</a>, vamos agora entrar no glorioso mundo das redes neurais de Hopfield, esta que é muito provavelmente o tipo mais simples de implementação para ANN. Em uma definição resumida do formato em questão, direi que trata-se de uma rede que contem uma única camada, completamente conectada e auto associativa, onde, por auto associativa quero dizer que uma vez que um padrão seja identificado, o mesmo será retornado.<span id="more-524"></span></p>
<h1>Oh Yeah, bring it on!</h1>
<p>Diminuindo o ritmo no blá-blá-blá, que tal um exemplo funcional de com o que a tal da rede neural se parece? Para facilitar o entendimento eu vou simplificar o exemplo ao máximo, logo não me culpe se você em seguida sentir que é o novo gênio da AI e resolver criar seu próprio andróid-escravo-lavador de carros.</p>
<p>Abaixo, um diagrama simples dos relacionamentos de uma rede contendo quatro neurônios:</p>
<div id="attachment_526" class="wp-caption aligncenter" style="width: 242px"><a href="http://iguessimnotcrazy.files.wordpress.com/2010/05/neuronios1.jpg"><img class="size-full wp-image-526" title="Imagem 1 - Rede Neural básica" src="http://iguessimnotcrazy.files.wordpress.com/2010/05/neuronios1.jpg?w=584" alt="Imagem 1 - Rede Neural básica"   /></a><p class="wp-caption-text">Imagem 1 - Rede Neural básica</p></div>
<p>Na rede neural representada pela <em>Imagem 1</em>, vê-se claramente que todos os neurônios estão interligados uns aos outros. Para facilitar o entendimento, podemos representar esta visão na matriz abaixo. Note que os pontos de intersecção ocorrem em todos os pontos exceto de  forma recursiva¹. Isto será explicado com maiores detalhes mais a frente.</p>
<table style="height:104px;" border="1" width="403" align="center">
<tbody>
<tr>
<td><strong>Neurônio</strong></td>
<td>N1</td>
<td>N2</td>
<td>N3</td>
<td>N4</td>
</tr>
<tr>
<td>N1</td>
<td></td>
<td>x</td>
<td>x</td>
<td>x</td>
</tr>
<tr>
<td>N2</td>
<td>x</td>
<td></td>
<td>x</td>
<td>x</td>
</tr>
<tr>
<td>N3</td>
<td>x</td>
<td>x</td>
<td></td>
<td>x</td>
</tr>
<tr>
<td>N4</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td></td>
</tr>
</tbody>
</table>
<h1>Weight Matrix</h1>
<p>Antes de ser crucificado pelo que estou prestes a fazer, para fins de entendimento mais claro do conteúdo, vou deliberadamente traduzir este termo técnico para algo mais fácil de assimilar. De agora em diante, eu declaro que em meus tópicos, <em>weight matrix </em>se chamará matriz de pesagem. Pronto!</p>
<p>Ok, mas você pode (e deveria) se perguntar: WTF matriz de pesagem?!</p>
<p>Imagine por um instante o que estamos tentando realizar aqui: Através da criação de redes neurais artificiais, estamos a grosso modo tentando de alguma forma replicar o que acontece naturalmente em um animal com capacidade de aprendizado, logo, como acontece na natureza nossas redes neurais artificiais nascem burras e precisam passar por um processo para que organizem um dado conjnto de dados e informações de forma coesa, formando então uma estrutura que contém conhecimento.</p>
<p>Existem algumas formas de se ministrar este aprendizado das quais posso citar três (geralmente consideradas como apenas duas) e, desta vez não me atreverei a traduzir nomes:</p>
<ul>
<li>Supervised learning:  Por este método, o processo de aprendizagem e calibragem do algoritmo é acompanhado por um processo externo, seja um sistema ou um humano;</li>
<li>Unsupervised learning:  O sistema descobre a melhor solução por meio de estatísticas, sem intervenção externa;</li>
<li>Reinforcement Learning: Um processo que mistura ambos os modelos acima e, por este motivo, não é considerado como um processo independente em algumas literaturas.</li>
</ul>
<p>A matriz de pesagem é o mecanismo pelo qual as redes neurais que trabalharemos serão ajustadas. Abaixo o exemplo mais comum de uma matriz de pesagem para uma rede Hopfield de quatro neurônios que identifica o padrão <strong>0101</strong> e <strong>1010</strong>, note porém que estou passando a solução do problema antes de descrever o problema em si. Mais adiante veremos como esta matriz foi formada:</p>
<table style="height:104px;" border="1" width="403" align="center">
<tbody>
<tr>
<td><strong>Neurônio</strong></td>
<td>N1</td>
<td>N2</td>
<td>N3</td>
<td>N4</td>
</tr>
<tr>
<td>N1</td>
<td>0</td>
<td>-1</td>
<td>1</td>
<td>-1</td>
</tr>
<tr>
<td>N2</td>
<td>-1</td>
<td>0</td>
<td>-1</td>
<td>1</td>
</tr>
<tr>
<td>N3</td>
<td>1</td>
<td>-1</td>
<td>0</td>
<td>-1</td>
</tr>
<tr>
<td>N4</td>
<td>-1</td>
<td>1</td>
<td>-1</td>
<td>0</td>
</tr>
</tbody>
</table>
<p>Você só está tendo contato com estes dados agora pois acredito ser mais fácil de explicar os próximos passos com uma representação visual do que buscamos com toda a parafernália que será explicada / montada.</p>
<h1>Matematica.Apply();</h1>
<p>Um dos principais pontos que utilizaremos em Hopfield é a manipulação de vetores, como a idéia aqui é passar a parte prática, não vou me ater à explicações da parte matemática da operação, porém, é muito fácil encontrar referências on-line sobre o assunto².</p>
<p>Para explicar a montagem da matriz de pesagem, vamos iniciar com uma matriz vazia, como a seguinte:</p>
<table style="height:104px;" border="1" width="403" align="center">
<tbody>
<tr>
<td><strong>Neurônio</strong></td>
<td>N1</td>
<td>N2</td>
<td>N3</td>
<td>N4</td>
</tr>
<tr>
<td>N1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>N2</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>N3</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>N4</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
</tbody>
</table>
<p>Para começar, vamos fornecer o valor <strong>0101 </strong>para a matriz acima de forma a respeitar as já mencionadas regras básicas da estrutura¹. Esta matriz derivada é chamada de <strong>matriz de contribuição</strong>.</p>
<p>No calculo desta matriz, existem algumas necessidades que devem ser supridas, sendo:</p>
<ul>
<li>Cálculo dos valores bipolares do input (no caso, baseado em <strong>0101</strong>). Calcular os valores bipolares significa que representaremos os valores binários por meio de -1 e 1 e não por 0 e 1; A função que representa este requisito é:<img title="bipolar" src="http://iguessimnotcrazy.files.wordpress.com/2010/05/bipolar.jpg?w=183&#038;h=84" alt="" width="183" height="84" /><br />
A função que realiza a conversão dos valores <strong>para bipolar </strong>é a seguinte:<img class="aligncenter size-full wp-image-553" title="binarioParaBipolar" src="http://iguessimnotcrazy.files.wordpress.com/2010/05/binarioparabipolar.jpg?w=584" alt=""   />Podemos representá-la em C# da seguinte forma: <pre class="brush: csharp; wrap-lines: false;">(2 * valor) - 1;</pre></p>
<p>Já para conversão inversa, de bipolar <strong>para binário</strong>:<img class="aligncenter size-full wp-image-554" title="bipolarParaBinario" src="http://iguessimnotcrazy.files.wordpress.com/2010/05/bipolarparabinario.jpg?w=584" alt=""   />E em C#:</p>
<p><pre class="brush: csharp; wrap-lines: false;">(valor + 1) / 2.0;</pre></li>
</ul>
<ul>
<li>Como segundo passo, nós vamos transpor e multiplicar os valores bipolares de <strong>0101</strong> por eles mesmos;</li>
<li>Como terceiro e último passo nós precisamos zerar todas as ocorrências onde os neurônios eventualmente poderia se comunicar consigo mesmo¹;</li>
</ul>
<p>Para realizarmos o processamento utilizando os valores bipolares utilizamos a <strong>função Signum:</strong></p>
<p style="text-align:center;"><strong><img class="aligncenter size-full wp-image-547" title="fomulaSignun" src="http://iguessimnotcrazy.files.wordpress.com/2010/05/fomulasignun.gif?w=584" alt=""   /></strong></p>
<p>Onde:</p>
<blockquote><p>b são os  limites            inferiores e superiores;<br />
v é o valor de ativação            da unidade.</p></blockquote>
<h1>0101, põe na conta do Papa!</h1>
<p>Ok, agora com as devidas explicações e notações em mãos, vamos para a execução dos três passos descritos acima:</p>
<ol>
<li><strong>Converter para bipolar:</strong> A conversão de cada um dos dígitos de nosso input <strong>0,1,0 </strong>e<strong> 1</strong> para um valor bipolar, resulta em -<strong>1,1, -1 </strong>e <strong>1</strong>. Esta nova sequência numérica é a nossa base para construção da matriz de contribuição, logo, neste ponto possuímos uma matriz com quatro linhas e uma coluna, que pode ser representada em C# da seguinte forma:<br />
<pre class="brush: csharp; wrap-lines: false;">///
 /// Matriz com quatro linhas e uma coluna
 /// &lt;/summary&gt;
 double[] matrizLinha = new double[] { -1, 1, -1, 1 };</pre></li>
<li><strong>Multiplicação das matrizes:<br />
</strong></p>
<ol>
<li>Agora que possuímos uma matriz com os valores de entrada já convertidos para bipolar, podemos dar o segundo passo que é onde invertemos a matriz existente, neste ponto a matriz se tornará algo equivalente à:<br />
<pre class="brush: csharp; wrap-lines: false;">///
 /// Matriz com uma linha e quatro colunas
 /// &lt;/summary&gt;
 double[,] matrizColuna = new double[1, 4] { { -1, 1, -1, 1} };</pre></p>
<p>Note que basicamente o que fizemos foi reorganizar a estrutura da matriz de forma a transformar colunas em linhas (o oposto também é valido);</li>
<li>O passo anterior nos forneceu uma nova matriz, a qual, utilizaremos para realizar uma multiplicação entre a matriz descrita no <em>Item 1</em> e a nova, descrita no <em>Item 2.1</em>. Se você, apesar de ter sido direcionado, ainda não como realizar multiplicação de matrizes, ainda há tempo, <a href="http://en.wikipedia.org/wiki/Matrix_multiplication" target="_blank">clique aqui</a>.O Resultado desta multiplicação será a estrutura abaixo: <pre class="brush: csharp; wrap-lines: false;">
/// &lt;summary&gt;
 /// Matriz correspondente a multiplicação das matrizes anteriores
 /// &lt;/summary&gt;
 double[,] matriz = {
 { 1, -1, 1, -1 }, /// Primeira coluna
 {-1,1,-1,1},     /// Segunda coluna
 {1,-1,1,-1},     /// Terceira coluna
 {-1,1,-1,1}      /// Quarta coluna
 };</pre></li>
</ol>
</li>
<li><strong>Limpar as referências recursivas:</strong> Agora que possuímos o produto da multiplicação das matrizes de contribuição, devemos remover os valores que denotem recursividade. Para isto, o procedimento não poderia ser mais simples, bastando definir o valor <strong>0</strong> a todas as posições da matriz onde o valor do índice da coluna é igual ao da linha ou seja <em>[x,x] = 0</em>.<br />
<pre class="brush: csharp; wrap-lines: false;">
/// Para uma matriz de 4 posições
for (int i = 0; i &lt; 4; i++) {
matriz[i, i] = 0;
}</pre></li>
</ol>
<p>Neste ponto possuímos uma matriz com a seguinte representação em memória:</p>
<p><pre class="brush: csharp; wrap-lines: false;">
/// &lt;summary&gt;
 /// Matriz correspondente a multiplicação das matrizes anteriores
 /// &lt;/summary&gt;
 double[,] matriz = {
 { 0, -1, 1, -1 }, /// Primeira coluna
 {-1,0,-1,1},     /// Segunda coluna
 {1,-1,0,-1},     /// Terceira coluna
 {-1,1,-1,0}      /// Quarta coluna
 };</pre></p>
<p>Esta matriz sim tem uma utilidade para o algoritmo como um todo. Ela agora poderá ser adicionada à matriz de pesagem. <strong>Se nós esperamos que esta rede neural reconheça o padrão 0101 então esta </strong><strong>será a matriz de pesagem</strong>. Na verdade, por meio desta exata mesma matriz de pesagem também é possível reconhecer o padrão <strong>1010, que é considerado o oposto do padrão inicial</strong>. Quando trabalhando com padrões binários, <strong>uma mesma matriz de  pesagem é compartilhada para padrões inversos</strong>.</p>
<p>Porém, se esperamos ser capazes de reconhecer outros padrões de input (como, por exemplo <strong>0110</strong> ou <strong>1001</strong>), então precisamos calcular a matriz de contribuição para ambos os inputs e compilar seus resultados em uma matriz de pesagem.</p>
<p>No próximo post, uma aplicação de reconhecimento de padrões utilizando o que vimos hoje.</p>
<h1>Mais info</h1>
<p>¹As premissas básicas das redes Hopfield são as seguintes: <img src="http://upload.wikimedia.org/math/0/7/6/07694907cd305009362a2a30f9c18d5d.png" alt="" width="86" height="18" /> e <img class="alignnone" src="http://upload.wikimedia.org/math/8/9/c/89c5cb3c56c4a40f5781bb380b767494.png" alt="" width="122" height="20" />, onde somos impedidos de recorrência e guiados a uma simetria de pesos.</p>
<p>²<a href="http://www.gseis.ucla.edu/courses/ed231a1/notes/mat11.html" target="_blank">Operações matemáticas com vetores</a>.</p>
<h1>Referências</h1>
<ul>
<li><a href="http://hdl.handle.net/10183/4433" target="_blank">Categorização no modelo de Hopfield : efeitos de ruído sináptico e de diluição simétrica</a></li>
<li><a href="http://en.wikipedia.org/wiki/Dot_product" target="_blank">Dot Product</a></li>
<li><a href="http://www.lncc.br/~labinfo/tutorialRN/" target="_blank">Tutorial RN</a></li>
</ul>
<br />Filed under: <a href='http://iguessimnotcrazy.wordpress.com/category/arquitetura/'>Arquitetura</a>, <a href='http://iguessimnotcrazy.wordpress.com/category/redes-neurais/'>Redes Neurais</a> Tagged: <a href='http://iguessimnotcrazy.wordpress.com/tag/hopfield/'>Hopfield</a>, <a href='http://iguessimnotcrazy.wordpress.com/tag/redes-neurais/'>Redes Neurais</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/iguessimnotcrazy.wordpress.com/524/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/iguessimnotcrazy.wordpress.com/524/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/iguessimnotcrazy.wordpress.com/524/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/iguessimnotcrazy.wordpress.com/524/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/iguessimnotcrazy.wordpress.com/524/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/iguessimnotcrazy.wordpress.com/524/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/iguessimnotcrazy.wordpress.com/524/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/iguessimnotcrazy.wordpress.com/524/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/iguessimnotcrazy.wordpress.com/524/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/iguessimnotcrazy.wordpress.com/524/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/iguessimnotcrazy.wordpress.com/524/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/iguessimnotcrazy.wordpress.com/524/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/iguessimnotcrazy.wordpress.com/524/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/iguessimnotcrazy.wordpress.com/524/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=iguessimnotcrazy.wordpress.com&amp;blog=8872870&amp;post=524&amp;subd=iguessimnotcrazy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://iguessimnotcrazy.wordpress.com/2010/05/28/redes-neurais-%e2%80%93-c-hopfield/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f46ba8c5ca3a6c9c2b9e1f4aa8dfecc0?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">iguessimnotcrazy</media:title>
		</media:content>

		<media:content url="http://iguessimnotcrazy.files.wordpress.com/2010/05/neuronios1.jpg" medium="image">
			<media:title type="html">Imagem 1 - Rede Neural básica</media:title>
		</media:content>

		<media:content url="http://iguessimnotcrazy.files.wordpress.com/2010/05/bipolar.jpg" medium="image">
			<media:title type="html">bipolar</media:title>
		</media:content>

		<media:content url="http://iguessimnotcrazy.files.wordpress.com/2010/05/binarioparabipolar.jpg" medium="image">
			<media:title type="html">binarioParaBipolar</media:title>
		</media:content>

		<media:content url="http://iguessimnotcrazy.files.wordpress.com/2010/05/bipolarparabinario.jpg" medium="image">
			<media:title type="html">bipolarParaBinario</media:title>
		</media:content>

		<media:content url="http://iguessimnotcrazy.files.wordpress.com/2010/05/fomulasignun.gif" medium="image">
			<media:title type="html">fomulaSignun</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/math/0/7/6/07694907cd305009362a2a30f9c18d5d.png" medium="image" />

		<media:content url="http://upload.wikimedia.org/math/8/9/c/89c5cb3c56c4a40f5781bb380b767494.png" medium="image" />
	</item>
	</channel>
</rss>
