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

<channel>
	<title>Marcio Althmann &#187; C#</title>
	<atom:link href="http://www.marcioalthmann.net/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marcioalthmann.net</link>
	<description></description>
	<lastBuildDate>Tue, 24 Jan 2012 15:12:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Descobrindo se o SO ou Processo em execução é 64 bits</title>
		<link>http://www.marcioalthmann.net/2012/01/descobrindo-se-o-so-ou-processo-em-execucao-e-64-bits/</link>
		<comments>http://www.marcioalthmann.net/2012/01/descobrindo-se-o-so-ou-processo-em-execucao-e-64-bits/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 15:12:48 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[64bits]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=889</guid>
		<description><![CDATA[E ai pessoal, beleza? Mais uma dica simples, utilizando um recurso adicionado no .NET 4.0, para saber se o Sistema Operacional é 64 bits, ou o processo que está executando nossa lógica é 64 bits temos jeitos simples para fazer isso. Para descobrir se o sistema operacional é 64 bits é só fazer: Environment.Is64BitOperatingSystem E...<p><a href="http://www.marcioalthmann.net/2012/01/descobrindo-se-o-so-ou-processo-em-execucao-e-64-bits/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>E ai pessoal, beleza?</p>
<p>Mais uma dica simples, utilizando um recurso adicionado no .NET 4.0, para saber se o Sistema Operacional é 64 bits, ou o processo que está executando nossa lógica é 64 bits temos jeitos simples para fazer isso.</p>
<p>Para descobrir se o sistema operacional é 64 bits é só fazer:</p>
<pre class="brush: csharp">
Environment.Is64BitOperatingSystem
</pre>
<p>E para saber se o processo é 64 bits:</p>
<pre class="brush: csharp">
Environment.Is64BitProcess
</pre>
<p>Ambas as propriedades retornam um booleano.</p>
<p>Por enquanto é isso.</p>
<p>Abraços.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2012/01/descobrindo-se-o-so-ou-processo-em-execucao-e-64-bits/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2012/01/descobrindo-se-o-so-ou-processo-em-execucao-e-64-bits/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utilizando o atributo ObsoleteAttribute</title>
		<link>http://www.marcioalthmann.net/2012/01/utilizando-o-atributo-obsoleteattribute/</link>
		<comments>http://www.marcioalthmann.net/2012/01/utilizando-o-atributo-obsoleteattribute/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 00:37:27 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[obsolete]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=881</guid>
		<description><![CDATA[As vezes quando utilizamos alguns objetos ou métodos do .Net, o Intellisense mostra o método riscado, e nos avisa que o mesmo está obsoleto, e devemos utilizar outra classe ou método no lugar, e podemos utilizar esse recurso nos nossos códigos! Trabalho criando ferramentas e frameworks pra outros desenvolvedores, e nem sempre quando disponibilizamos alguma...<p><a href="http://www.marcioalthmann.net/2012/01/utilizando-o-atributo-obsoleteattribute/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>As vezes quando utilizamos alguns objetos ou métodos do .Net, o Intellisense mostra o método riscado, e nos avisa que o mesmo está obsoleto, e devemos utilizar outra classe ou método no lugar, e podemos utilizar esse recurso nos nossos códigos!</p>
<p>Trabalho criando ferramentas e frameworks pra outros desenvolvedores, e nem sempre quando disponibilizamos alguma API para utilização, podemos sair removendo métodos por exemplo, não sabemos quem utilizou, e se em alguma possível atualização o software vai parar de funcionar ou não, e o atributo Obsolete pode nos ajudar nesse cenário, informando o que está obsoleto na API e será descartado em breve, ou simplesmente recomendando uma alternativa melhor!</p>
<p>A utilização do atributo é simples, vou pegar o código do <a href="https://github.com/marcioalthmann/BasicIoC" target="_blank">BasicIoC </a>e criar um método obsoleto de propósito, só preciso informar a mensagem que será mostrada para quem for utilizar o método.</p>
<pre class="brush: csharp">
[Obsolete(&quot;This method is obsolete; use method Register instead.&quot;)]
public Container Map&lt;T&gt;()
{
    _baseType = typeof (T);
    return this;
}
</pre>
<p>E o interessante é que o Intellisense já ajuda o desenvolvedor mostrando que o método é obsoleto.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2012/01/obsolete01.jpg" rel="lightbox[881]" title="obsolete01"><img class="aligncenter size-medium wp-image-882" title="obsolete01" src="http://www.marcioalthmann.net/wp-content/uploads/2012/01/obsolete01-300x92.jpg" alt="" width="300" height="92" /></a></p>
<p>Isso não impede a utilização do método, mas mostra avisos quando compilamos que utilizamos um método obsoleto.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2012/01/obsolete02.jpg" rel="lightbox[881]" title="obsolete02"><img class="aligncenter size-medium wp-image-883" title="obsolete02" src="http://www.marcioalthmann.net/wp-content/uploads/2012/01/obsolete02-300x51.jpg" alt="" width="300" height="51" /></a></p>
<p>Mas podemos adicionar um segundo parâmetra booleano quando configuramos o atributo, forçando um erro de compilação caso existe algum código utilizando um método ou classe obsoleta.</p>
<pre class="brush: csharp">
[Obsolete(&quot;This method is obsolete; use method Register instead.&quot;, true)]
public Container Map&lt;T&gt;()
{
    _baseType = typeof (T);
    return this;
}
</pre>
<p>Agora o código não compila mais, no lugar de um aviso um erro de compilação é mostrado, mostrando que estamos utilizando um método obsoleto.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2012/01/obsolete03.jpg" rel="lightbox[881]" title="obsolete03"><img class="aligncenter size-medium wp-image-884" title="obsolete03" src="http://www.marcioalthmann.net/wp-content/uploads/2012/01/obsolete03-300x50.jpg" alt="" width="300" height="50" /></a></p>
<p>Por hoje é isso.</p>
<p>Até o próximo post.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2012/01/utilizando-o-atributo-obsoleteattribute/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2012/01/utilizando-o-atributo-obsoleteattribute/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Loops inspirados em Ruby no C#</title>
		<link>http://www.marcioalthmann.net/2012/01/loops-inspirados-em-ruby-no-c/</link>
		<comments>http://www.marcioalthmann.net/2012/01/loops-inspirados-em-ruby-no-c/#comments</comments>
		<pubDate>Sat, 14 Jan 2012 03:24:40 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[extension methods]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=876</guid>
		<description><![CDATA[Existem algumas formas interessantes de fazer loops em Ruby, que são times, upto e downto, que estão disponiveis em algum número, veja documentação completa. A idéia é simples, .times vai executar o códido o número de vezes informado, upto vai executar o código o número de vezes incrementando do valor inicial até o final, e...<p><a href="http://www.marcioalthmann.net/2012/01/loops-inspirados-em-ruby-no-c/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Existem algumas formas interessantes de fazer loops em Ruby, que são <em>times, upto </em>e <em>downto, </em>que estão disponiveis em algum número, <a href="http://en.wikibooks.org/wiki/Ruby_Programming/Reference/Objects/Numeric/Integer" target="_blank">veja documentação completa</a>.</p>
<p>A idéia é simples, <em>.times</em> vai executar o códido o número de vezes informado, <em>upto</em> vai executar o código o número de vezes incrementando do valor inicial até o final, e <em>downto</em> vai executar o código o número de vezes decrementando do valor inicial até o final.</p>
<p>Veja o código:</p>
<p>[sourcecode language="ruby"]<br />
puts &quot;testando times&quot;<br />
2.times {|i| print i, &quot; &quot;}<br />
puts<br />
puts &quot;testando upto&quot;<br />
1.upto(5) {|i| print i, &quot; &quot;}<br />
puts<br />
puts &quot;testando downto&quot;<br />
10.downto(5) {|i| print i, &quot; &quot;}<br />
[/sourcecode]</p>
<p>Resultado:</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2012/01/ruby1.jpg" rel="lightbox[876]" title="ruby1"><img class="aligncenter size-medium wp-image-877" title="ruby1" src="http://www.marcioalthmann.net/wp-content/uploads/2012/01/ruby1-300x131.jpg" alt="" width="300" height="131" /></a></p>
<p>Simples e interessante, no C# não temos nada disso, mas podemos criar algo parecido utilizando um pouco de <a href="http://www.marcioalthmann.net/2009/09/metodos-de-extensao/" target="_blank">Métodos de Extensão</a>, não vou explicar nesse post o que são e como criar as extensões, vejam no post linkado.</p>
<p>Segue os códigos das Extensões e do aplicativo de teste:</p>
<p>[sourcecode language="csharp"]<br />
    public static class Extensions<br />
    {<br />
        public static void Times(this int value, Action&lt;int&gt; action)<br />
        {<br />
            for (int i = 0; i &lt; value; i++)<br />
            {<br />
                action(i);<br />
            }<br />
        }</p>
<p>        public static IEnumerable&lt;int&gt; UpTo(this int start, int end)<br />
        {<br />
            for (int i = start; i &lt;= end; i++)<br />
            {<br />
                yield return i;<br />
            }<br />
        }</p>
<p>        public static IEnumerable&lt;int&gt; DownTo(this int start, int end)<br />
        {<br />
            for (int i = start; i &gt;= end; i&#8211;)<br />
            {<br />
                yield return i;<br />
            }<br />
        }</p>
<p>        public static void Each&lt;T&gt;(this IEnumerable&lt;T&gt; enumerable, Action&lt;T&gt; action)<br />
        {<br />
            foreach (var value in enumerable)<br />
            {<br />
                action(value);<br />
            }<br />
        }<br />
    }</p>
<p>    class Program<br />
    {<br />
        static void Main(string[] args)<br />
        {<br />
            Console.WriteLine(&quot;testando times&quot;);<br />
            3.Times(x =&gt; Console.Write(&quot;{0} &quot;, x));<br />
            Console.WriteLine();<br />
            Console.WriteLine(&quot;testando upto&quot;);<br />
            5.UpTo(10).Each(x =&gt; Console.Write(&quot;{0} &quot;, x));<br />
            Console.WriteLine();<br />
            Console.WriteLine(&quot;testando downto&quot;);<br />
            10.DownTo(5).Each(x =&gt; Console.Write(&quot;{0} &quot;, x));</p>
<p>            Console.ReadLine();<br />
        }<br />
    }<br />
[/sourcecode]</p>
<p>E o resultado:</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2012/01/csharp1.jpg" rel="lightbox[876]" title="csharp1"><img class="aligncenter size-medium wp-image-878" title="csharp1" src="http://www.marcioalthmann.net/wp-content/uploads/2012/01/csharp1-300x195.jpg" alt="" width="300" height="195" /></a></p>
<p>Bom é isso, o código é simples mas foi divertido e gostei do resultado final, apesar de achar que em Ruby fica muito melhor gostei do resultado final em C#, e para quem não conhece Ruby recomendo estudar, não precisa trabalhar com Ruby, mas é muito interessante conhecer novas tecnologias, mais sobre o que penso sobre isso <a href="http://www.marcioalthmann.net/2011/04/por-que-no-estudar-novas-tecnologias/" target="_blank">nesse post.</a>.</p>
<p>Por enquanto é só, código no <a href="https://github.com/marcioalthmann/Artigos/tree/master/Extensions" target="_blank">GitHub</a>.</p>
<p>Abraços.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2012/01/loops-inspirados-em-ruby-no-c/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2012/01/loops-inspirados-em-ruby-no-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Publish &#8211; Subscribe com MassTransit</title>
		<link>http://www.marcioalthmann.net/2012/01/publish-subscribe-com-masstransit/</link>
		<comments>http://www.marcioalthmann.net/2012/01/publish-subscribe-com-masstransit/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 14:14:32 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[masstransit]]></category>
		<category><![CDATA[mensageria]]></category>
		<category><![CDATA[publish-subscribe]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=838</guid>
		<description><![CDATA[Primeiro feliz 2012 para todos :) Ano novo, nova atenção para o blog, depois de um ano complicado com trabalho novo, casa nova, cidade nova, o blog ficou meio abandonado, mas agora tudo está tranquilo e pretendo postar com mais frequência! Para quem não acompanhou as outras publicações segue os links. Mensageria o Início Frameworks...<p><a href="http://www.marcioalthmann.net/2012/01/publish-subscribe-com-masstransit/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Primeiro feliz 2012 para todos :)</p>
<p>Ano novo, nova atenção para o blog, depois de um ano complicado com trabalho novo, casa nova, cidade nova, o blog ficou meio abandonado, mas agora tudo está tranquilo e pretendo postar com mais frequência!</p>
<p>Para quem não acompanhou as outras publicações segue os links.</p>
<ul>
<li><a href="http://www.marcioalthmann.net/2011/07/mensageria-o-inicio/" target="_blank">Mensageria o Início</a></li>
<li><a href="http://www.marcioalthmann.net/2011/07/frameworks-para-mensageria/" target="_blank">Frameworks para Mensageria</a></li>
<li><a href="http://www.marcioalthmann.net/2011/08/compilando-masstransit/" target="_blank">Compilando o MassTransit</a></li>
<li><a href="http://www.marcioalthmann.net/2011/08/request-reply-com-masstransit/" target="_blank">Request-Reply com MassTransit</a></li>
</ul>
<p>Eu inverti um pouco a ordem dos posts, deveria ter começado com os conceitos do MassTransit, mas após esse post vou começar a postar os conceitos, estou traduzindo a documentação para pt-br também, isso vai ajudar os interessados, e vale lembrar que o projeto é Open Source e está no GitHub, então quem quiser ajudar toda ajuda é bem vinda, é só fazer um fork lá no <a href="https://github.com/MassTransit/MassTransit" target="_blank">MassTransit </a>e começar a programar :).</p>
<p>Então voltando a falar dos <a href="http://eaipatterns.com" target="_blank">Enterprise Integration Patterns</a>, hoje vou mostrar como construir o patter <a href="http://eaipatterns.com/PublishSubscribeChannel.html" target="_blank">Publish-Subscribe</a> utilizando o MassTransit.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2012/01/PublishSubscribeSolution.jpg" rel="lightbox[838]" title="PublishSubscribeSolution"><img class="aligncenter size-medium wp-image-842" title="PublishSubscribeSolution" src="http://www.marcioalthmann.net/wp-content/uploads/2012/01/PublishSubscribeSolution-300x196.jpg" alt="" width="300" height="196" /></a></p>
<p>Explicando de uma forma simples, teremos alguém que publica algum tipo de mensagem, e um ou mais interessados podem se inscrever para receber as mensagens publicadas, cada consumidor inscrito vai receber uma cópia da mensagem publicada.</p>
<p>Pensando em um cenário mais interessante, imagine um sistema que consulta preços de viagens, esse sistema poderia publicar uma mensagem perguntando o valor de uma viagem qualquer, do outro lado vários consumidores um para cada operadora receberia uma cópia da mensagem e faria suas consultas, podendo ainda retornar uma mensagem para quem publicou com as informações solicitadas. E nenhum desses sistemas se conhecem, o único ponto em comum é o contrato ou seja as mensagens trocadas que cada um tem interesse.</p>
<p>Bom vamos para o exemplo.</p>
<p>O primeiro projeto que temos é o projeto com as mensagens, nesse exemplo tanto o Publisher quanto o Subscriber estão interessados em algum tipo de mensagem, então quando o Subscriber receber uma mensagem de interesse dele, vai responder outra que será de interesse do Publisher.</p>
<p>Segue as mensagens, que são POCO´s normais.</p>
<p>[sourcecode language="csharp"]<br />
public class SampleRequest<br />
{<br />
    public SampleRequest()<br />
    {<br />
        CorrelationId = Guid.NewGuid();<br />
    }</p>
<p>    public Guid CorrelationId { get; private set; }<br />
    public string Message { get; set; }<br />
}</p>
<p>public class SampleResponse<br />
{<br />
    public Guid CorrelationId { get; set; }<br />
    public string Subscriber { get; set; }<br />
    public string Message { get; set; }<br />
}<br />
[/sourcecode]</p>
<p>Agora com as mensagens criadas vou criar um Console App para ser um Publisher, o código é simples então vou mostrar todo o código e as explicações vem depois, e o código dos Subscribers são parecidos.</p>
<p>[sourcecode language="csharp"]<br />
class Program<br />
    {<br />
        static void Main(string[] args)<br />
        {<br />
            Bus.Initialize(bus =&gt;<br />
                               {<br />
                                   bus.UseMsmq();<br />
                                   bus.ReceiveFrom(<br />
                                       &quot;msmq://localhost/publisher&quot;);<br />
                                   bus.UseMulticastSubscriptionClient();<br />
                               });</p>
<p>            new Service().Start(Bus.Instance);</p>
<p>            Console.ReadLine();<br />
        }</p>
<p>    }</p>
<p>    public class Service : Consumes.All<br />
    {<br />
        private IServiceBus _serviceBus;<br />
        private UnsubscribeAction _unsubscribeToken;</p>
<p>        public void Dispose()<br />
        {<br />
            _serviceBus.Dispose();<br />
        }</p>
<p>        public void Start(IServiceBus serviceBus)<br />
        {<br />
            _serviceBus = serviceBus;<br />
            _unsubscribeToken = _serviceBus.SubscribeInstance(this);</p>
<p>            while (true)<br />
            {<br />
                Console.WriteLine(&quot;Escreva uma mensagem: &quot;);<br />
                var message = Console.ReadLine();<br />
                if (message == &quot;exit&quot;)<br />
                    break;</p>
<p>                var sampleMessage = new SampleRequest<br />
                                        {<br />
                                            Message = message<br />
                                        };<br />
                _serviceBus.Publish(sampleMessage);<br />
            }<br />
        }</p>
<p>        public void Stop()<br />
        {<br />
            _unsubscribeToken();<br />
        }</p>
<p>        public void Consume(SampleResponse message)<br />
        {<br />
            Console.WriteLine(&quot;Resposta do da mensagem com ID {0} recebida:&quot;, message.CorrelationId);<br />
            Console.WriteLine(&quot;Quem respondeu: {0}&quot;, message.Subscriber);<br />
            Console.WriteLine(&quot;Mensagem de resposta: {0}&quot;, message.Message);<br />
        }<br />
    }<br />
[/sourcecode]</p>
<p>A primeira parte do configuramos o MassTransit, onde informo que vou utilizar o MSMQ <em>bus.UseMsmq(), </em>lembrando que com o MassTransit também temos a opção de utilizar o RabbitMQ, além de implementar outros transportes para outras ferramentas.</p>
<p>O segundo passo é a configuração de qual fila do MSMQ o publisher vai receber as mensagens de interesse dele <em>bus.ReceiveFrom(), </em>e o terceiro passo é utilizar Multicast Subscription, isso não é tão simples para explicar aqui mas vai ter um post só sobre isso, mas é assim que internamente por troca de mensagens o MassTransit fica sabendo quem tem interesse em que tipo de mensagem quando ele está funcionando.</p>
<p>E por último instancio a classe <em>Service</em> chamando o método <em>Start</em> passando a instância do ServiceBus.</p>
<p>A classe <em>Service</em> é mais interessante, ela implementa a Interface <em>Consumes&lt;T&gt;.All</em> do MassTransit, aqui eu estou falando que o Publisher está interessado em consumir <em>todas</em> as mensagens to dipo <em>SampleResponse.</em> O MassTransit disponibiliza outras Interfaces para consumo de mensagens, onde temos mais poder para decidir que tipo de mensagem ou se podemos ou não consumir uma mensagem, mas fica para depois isso tudo :).</p>
<p>Detalhe para o método <em>Consume</em> que deve ser implementado por causa da Interface, é ali que será recebido por parâmetro o tipo da mensagem de interesse, no método mostro alguns detalhes de quem enviou a mensagem, e no método <em>Start</em> tenho uma lógica simples para ficar sempre perguntando uma mensagem no Console, além do método <em>_serviceBus.Publish()</em> que vai fazer todo o trabalho de pegar a classe, serializar, enviar para o MSMQ e distribuir para as filas dos Subscribers interessados.</p>
<p>O código dos Subscribers é bem parecido, com a diferença do método <em>Consume </em>deles que além de consumir a mensagem, publica uma mensagem de retorno que é de interesse do Publisher. Segue o código de um dos Subscribers.</p>
<p>[sourcecode language="csharp"]<br />
class Program<br />
    {<br />
        static void Main(string[] args)<br />
        {</p>
<p>            Bus.Initialize(bus =&gt;<br />
                               {<br />
                                   bus.UseMsmq();<br />
                                   bus.ReceiveFrom(<br />
                                       &quot;msmq://localhost/firstsubscriber&quot;);<br />
                                   bus.UseMulticastSubscriptionClient();<br />
                               });</p>
<p>            new Service().Start(Bus.Instance);</p>
<p>            Console.ReadLine();<br />
        }</p>
<p>    }</p>
<p>    public class Service : Consumes.All<br />
    {<br />
        private IServiceBus _serviceBus;<br />
        private UnsubscribeAction _unsubscribeToken;</p>
<p>        public Service()<br />
        {</p>
<p>        }</p>
<p>        public void Dispose()<br />
        {<br />
            _serviceBus.Dispose();<br />
        }</p>
<p>        public void Start(IServiceBus serviceBus)<br />
        {<br />
            _serviceBus = serviceBus;<br />
            _unsubscribeToken = _serviceBus.SubscribeInstance(this);<br />
        }</p>
<p>        public void Stop()<br />
        {<br />
            _unsubscribeToken();<br />
        }</p>
<p>        public void Consume(SampleRequest message)<br />
        {<br />
            Console.WriteLine(&quot;Mensagem com ID {0} recebida.&quot;, message.CorrelationId);<br />
            Console.WriteLine(&quot;Enviando resposta&#8230;&quot;);<br />
            var sampleResponse = new SampleResponse<br />
            {<br />
                CorrelationId= message.CorrelationId,<br />
                Subscriber = &quot;First Subscriber&quot;,<br />
                Message =<br />
                    string.Format(<br />
                        &quot;Resposta da mensagem {0}&quot;,<br />
                        message.CorrelationId)<br />
            };<br />
            _serviceBus.Publish(sampleResponse);<br />
            Console.WriteLine(&quot;Resposta enviada!&quot;);<br />
        }<br />
    }<br />
[/sourcecode]</p>
<p>É importante lembrar que cada Subscriber tem sua própria fila. Agora uma imagem do funcionamento do envio e recebimento das mensagens.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2012/01/pubsub.jpg" rel="lightbox[838]" title="pubsub"><img class="aligncenter size-medium wp-image-847" title="pubsub" src="http://www.marcioalthmann.net/wp-content/uploads/2012/01/pubsub-300x168.jpg" alt="" width="300" height="168" /></a></p>
<p>Bom por hoje é só, o código fonte está no <a href="https://github.com/marcioalthmann/Artigos/tree/master/PublishSubscribe" target="_blank">GitHub</a>.</p>
<p>Abraços.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2012/01/publish-subscribe-com-masstransit/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2012/01/publish-subscribe-com-masstransit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quantos objetos são criados em 1 segundo?</title>
		<link>http://www.marcioalthmann.net/2011/11/quantos-objetos-sao-criados-em-1-segundo/</link>
		<comments>http://www.marcioalthmann.net/2011/11/quantos-objetos-sao-criados-em-1-segundo/#comments</comments>
		<pubDate>Sun, 13 Nov 2011 23:54:24 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Desempenho]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[desempenho]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=816</guid>
		<description><![CDATA[Navegando pelo blog do Ayende, encontrei um post curioso, onde ele fez um teste para saber quantos objetos em 1 segundo o .NET consegue criar. Nunca tinha pensado no assunto, e resolvi testar utilizando meu notebook, mas também comparar com outras linguagens, hoje posto a comparação entre .NET e Java. São apenas curiosidades, não acredito...<p><a href="http://www.marcioalthmann.net/2011/11/quantos-objetos-sao-criados-em-1-segundo/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Navegando pelo blog do <a href="http://ayende.com/blog">Ayende</a>, encontrei um <a href="http://ayende.com/blog/4811/performance-numbers-in-the-pub">post</a> curioso, onde ele fez um teste para saber quantos objetos em 1 segundo o .NET consegue criar. Nunca tinha pensado no assunto, e resolvi testar utilizando meu notebook, mas também comparar com outras linguagens, hoje posto a comparação entre .NET e Java.</p>
<p>São apenas curiosidades, não acredito que esses valores vão dizer que uma linguagem é melhor que outra, mas os resultados são curiosos.</p>
<p>Primeiro vamos as configurações de Hardware dos meus testes:</p>
<p>HP Pavilion dv4-1150br (uma droga de notebook)</p>
<ul>
<li> Core2Duo T5800 2Ghz</li>
<li>3GB de memória DDR2</li>
<li>HD de 5400 RPM</li>
</ul>
<p>E estou utilizando Windows 7 x64.</p>
<p>O código em C# é o mesmo utilizado pelo Ayende, só alterei a classe que será criada <em>n </em>vezes, e converti o código para Java, falando nisso qualquer absurdo escrito em Java por favor avisem, não é meu forte :).</p>
<p>Primeiro vamos as classes que serão criadas em C# e Java.</p>
<p><span class="Apple-style-span" style="font-family: Consolas, Monaco, monospace; font-size: 12px; line-height: 18px; white-space: pre;"><strong>C#</strong><br />
</span></p>
<p>[sourcecode language="csharp"]<br />
public class Album<br />
{<br />
    public string Nome { get; set; }<br />
    public int NumeroDeMusicas { get; set; }<br />
    public DateTime DataDeLancamento { get; set; }<br />
}<br />
[/sourcecode]</p>
<p><span class="Apple-style-span" style="font-family: Consolas, Monaco, monospace; font-size: 12px; line-height: 18px; white-space: pre;"><br />
<strong>Java</strong><br />
</span></p>
<p>[sourcecode language="java"]<br />
public class Album{<br />
    private String _nome;<br />
    private int _numeroDeMusicas;<br />
    private Date _dataDeLancamento;</p>
<p>    public String getNome(){<br />
        return _nome;<br />
    }</p>
<p>    public void setNome(String nome){<br />
        _nome = nome;<br />
    }</p>
<p>    public int getNumeroDeMusicas(){<br />
        return _numeroDeMusicas;<br />
    }</p>
<p>    public void setNumeroDeMusicas(int numeroDeMusicas){<br />
        _numeroDeMusicas = numeroDeMusicas;<br />
    }</p>
<p>    public Date getDataDeLancamento(){<br />
        return _dataDeLancamento;<br />
    }</p>
<p>    public void setDataDeLancamento(Date dataDeLancamento){<br />
        _dataDeLancamento = dataDeLancamento;<br />
    }<br />
}<br />
[/sourcecode]</p>
<p>O código para testar é simples, durante 1 segundo <em>n</em> instâncias da classe Album serão criadas, códigos de teste.</p>
<p><strong>C#<br />
</strong></p>
<p>[sourcecode language="csharp"]<br />
class Program<br />
    {<br />
        static void Main(string[] args)<br />
        {<br />
            var cronometro = Stopwatch.StartNew();</p>
<p>            var total = 0;</p>
<p>            while (cronometro.ElapsedMilliseconds &lt; 1000)<br />
            {<br />
                Album album = new Album();<br />
                total++;<br />
            }</p>
<p>            cronometro.Stop();<br />
            Console.WriteLine(total);<br />
        }<br />
    }<br />
[/sourcecode]</p>
<p><strong>Java<br />
</strong></p>
<p>[sourcecode language="java"]<br />
public class JavaTeste {</p>
<p>    public static void main(String[] args) {<br />
        long time = System.currentTimeMillis();<br />
        long endTime = time + 1000;</p>
<p>        int total = 0;</p>
<p>        while(System.currentTimeMillis() &lt; endTime){<br />
            Album album = new Album();<br />
            total++;<br />
        }</p>
<p>        System.out.println(total);<br />
    }<br />
}<br />
[/sourcecode]</p>
<p>E os resultados&#8230;</p>
<p>C#: 629475<br />
Java:  41518639</p>
<p>Resumindo, o Java criou o infinito e além mais objetos que o C#,  ahh então Java é mais rápido? Depende, foi só um teste de um cara curioso :)</p>
<p>Abaixo imagens dos testes.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/11/csharpresultados.png" rel="lightbox[816]" title="csharpresultados"><img class="aligncenter size-medium wp-image-822" title="csharpresultados" src="http://www.marcioalthmann.net/wp-content/uploads/2011/11/csharpresultados-300x187.png" alt="" width="300" height="187" /><br />
</a><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/11/javaresultados.png" rel="lightbox[816]" title="javaresultados"><img class="aligncenter size-medium wp-image-823" title="javaresultados" src="http://www.marcioalthmann.net/wp-content/uploads/2011/11/javaresultados-300x187.png" alt="" width="300" height="187" /></a></p>
<p>Abraços.</p>
<p><strong>Update 01</strong></p>
<p>Confesso que fiquei impressionado com o resultado, e resolvi verificar o teste novamente, e valeu pela idéia também Alexandre Tarifa :), o vilão da história é o Stopwatch, modifiquei o teste em C# para não utilizar o Stopwatch, e sim o Enviromenti.TickCount.</p>
<p>Segue o código:</p>
<p>[sourcecode language="csharp"]<br />
static void Main(string[] args)<br />
        {<br />
            var final = Environment.TickCount + 1000;</p>
<p>            var total = 0;</p>
<p>            while (Environment.TickCount &lt; final)<br />
            {<br />
                Album album = new Album();<br />
                total++;<br />
            }</p>
<p>            Console.WriteLine(total);<br />
        }<br />
[/sourcecode]</p>
<p>O resultados mudam para cada execução, na última ficaram assim, bem melhor:</p>
<p>C#: 40166858<br />
Java:  42875611</p>
<p>Segue imagem do teste em C#:</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/11/csharpresultados2.png" rel="lightbox[816]" title="csharpresultados2"><img class="aligncenter size-medium wp-image-826" title="csharpresultados2" src="http://www.marcioalthmann.net/wp-content/uploads/2011/11/csharpresultados2-300x187.png" alt="" width="300" height="187" /></a></p>
<p>Estou curioso para ver esse teste em outras linguagens, se a fadiga deixar faço mais testes :).</p>
<p>Abraços</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2011/11/quantos-objetos-sao-criados-em-1-segundo/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2011/11/quantos-objetos-sao-criados-em-1-segundo/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Abrir só uma instância da aplicação &#8211; Mutex</title>
		<link>http://www.marcioalthmann.net/2011/10/abrir-so-uma-instancia-da-aplicacao-mutex/</link>
		<comments>http://www.marcioalthmann.net/2011/10/abrir-so-uma-instancia-da-aplicacao-mutex/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 22:58:08 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[mutex]]></category>
		<category><![CDATA[threading]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=806</guid>
		<description><![CDATA[Pela falta de tempo de posts mais complexos, vou postar várias dicas rápidas que sempre me perguntam, então qualquer dúvida é só entrar em contato. Dependendo da forma de comercialização do software, é interessante permitir somente uma instância da aplicação rodando no computador, é fácil fazer isso utilizando a classe Mutex. Abaixo o código da...<p><a href="http://www.marcioalthmann.net/2011/10/abrir-so-uma-instancia-da-aplicacao-mutex/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Pela falta de tempo de posts mais complexos, vou postar várias dicas rápidas que sempre me perguntam, então qualquer dúvida é só entrar em contato.</p>
<p>Dependendo da forma de comercialização do software, é interessante permitir somente uma instância da aplicação rodando no computador, é fácil fazer isso utilizando a classe <a href="http://msdn.microsoft.com/pt-br/library/system.threading.mutex.aspx" target="_blank">Mutex</a>.</p>
<p>Abaixo o código da valiação em uma aplicação WinForms, mas a lógica é a mesma para todas as aplicações.<br />
[sourcecode language="csharp"] namespace Mutex<br />
{<br />
    static class Program<br />
    {<br />
        [STAThread]<br />
        static void Main()<br />
        {<br />
            bool criarNovaAplicacao;<br />
            using (System.Threading.Mutex mutex = new System.Threading.Mutex(true, &#8220;AplicacaoDeTeste&#8221;, out criarNovaAplicacao))<br />
            {<br />
                if(criarNovaAplicacao)<br />
                {<br />
                    Application.EnableVisualStyles();<br />
                    Application.SetCompatibleTextRenderingDefault(false);<br />
                    Application.Run(new Form1());<br />
                }<br />
            }<br />
        }<br />
    }<br />
}[/sourcecode]<br />
Até o próximo post.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2011/10/abrir-so-uma-instancia-da-aplicacao-mutex/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2011/10/abrir-so-uma-instancia-da-aplicacao-mutex/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Simplificando o acesso a dados &#8211; Simple.Data</title>
		<link>http://www.marcioalthmann.net/2011/09/simplificando-o-acesso-a-dados-simple-data/</link>
		<comments>http://www.marcioalthmann.net/2011/09/simplificando-o-acesso-a-dados-simple-data/#comments</comments>
		<pubDate>Wed, 07 Sep 2011 00:51:46 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[SimpleData]]></category>
		<category><![CDATA[acesso a dados]]></category>
		<category><![CDATA[simpledata]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=745</guid>
		<description><![CDATA[Acesso a dados, sempre voltamos a falar sobre o assunto, afinal vivemos isso todo dia, desde que testei o MongoDB fiquei feliz com as possibilidades fora do mundo relacional, mas essa ainda não é uma realidade vivida diariamente, então vamos simplificar a vida com os bancos relacionais! Existem ótimos frameworks de mapeamento objeto relacional, no...<p><a href="http://www.marcioalthmann.net/2011/09/simplificando-o-acesso-a-dados-simple-data/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Acesso a dados, sempre voltamos a falar sobre o assunto, afinal vivemos isso todo dia, desde que testei o MongoDB fiquei feliz com as possibilidades fora do mundo relacional, mas essa ainda não é uma realidade vivida diariamente, então vamos simplificar a vida com os bancos relacionais!</p>
<p>Existem ótimos frameworks de mapeamento objeto relacional, no mundo .Net o mais famoso é o NHibernate, seguido de perto, ou não :), pelo Entity Framework, cada um com suas vantagens e desvantagens que não cabe especificar nesse artigo.</p>
<p>Agora vamos pensar em um mundo onde não quero ficar mapeando tabela com classe, mas também não quero ficar escrevendo códigos e mais códigos usando ADO.NET puro, é ai que o <a href="https://github.com/markrendle/Simple.Data" target="_blank">Simple.Data</a> faz o seu trabalho, e faz muito bem!</p>
<p>O <a href="https://github.com/markrendle/Simple.Data" target="_blank">Simple.Data</a> é um projeto OpenSource e está disponível no <a href="http://www.github.com" target="_blank">GitHub</a>, e foi inspirado no ActiveRecord e DataMapper do Ruby, e atualmente possui providers para os seguintes bancos de dados:</p>
<ul>
<li>SQL Server 2005 ou superior</li>
<li>SQL Server Compact Edition 4.0</li>
<li>Oracle</li>
<li>MySQL 4.0 ou superior</li>
<li>SQLite</li>
<li>MongoDB</li>
</ul>
<p>Na documentação do projeto, estão informando que o suporte a PostgreSQL e Azure Table Storage está em progresso, então em breve mais novidades serão disponibilizadas!</p>
<p>Nesse artigo, estou utilizando o SQL Compact, e o Simple.Data está disponível para instalação pelo <a href="http://nuget.org/List/Search?packageType=Packages&amp;searchCategory=All+Categories&amp;searchTerm=simple.data&amp;sortOrder=package-download-count&amp;pageSize=10" target="_blank">Nuget</a>, o comando para instalação da versão para SQL Compact.</p>
<p><em>Install-Package Simple.Data.SqlCompact40</em></p>
<p>Antes de começar a mostrar os códigos, vale citar que o Simple.Data utiliza os recursos de linguagem dinâmica do C#, ou seja a keywork <em>dynamic </em>é utilizada o tempo todo, quando definimos uma conexão com o banco de dados o objeto de retorno já é um <em>dynamic.</em></p>
<p>Não pretendo explicar <em>dynamic </em>aqui nesse post, para entender mais sobre o assunto eu recomendo o blog do <a href="http://elemarjr.net/?s=dynamic" target="_blank">Elemar Jr</a>.</p>
<p>Vamos para o primeiro código, onde estabelecemos a conexão com o banco de dados, lembrando que esse é o formato para SQL CE.</p>
<pre class="brush: csharp;">private static dynamic _db;

static void Main(string[] args)
{
    _db = Database.OpenFile("SimpleData.sdf");
    Console.Read();
}</pre>
<p>Já que <em>_db</em> é um objeto dinâmico, não temos intellisense para nos ajudar com os objetos do banco de dados, e não existe verificações na hora da compilação :), se der algum problema só vamos descobrir com o software funcionando, mas nada que inviabilize a utilização de objetos dinâmicos ;).</p>
<p>Quando estamos trabalhando com o Simple.Data, não é obrigatório a utilização de POCO´s, ou seja não preciso ter uma classe que representa um tabela, eu faço isso por costume e por facilidades na hora de programar, então eu criei uma classe <em>EstiloMusical</em> que representa minha tabela.</p>
<pre class="brush: csharp;">public class EstiloMusical
{
    public int IdEstiloMusical { get; set; }
    public string Nome { get; set; }
}</pre>
<p>Então no Simple.Data temos duas opções para as operações básicas, ou seja o famoso CRUD, ou trabalhamos com objetos, nossos POCO´s, ou com parâmetros nomeados.</p>
<p>Toda a geração de SQL é feita pelo Simple.Data, então temos que informar corretamente o nome das tabelas ou campos nas operações, segue dois exemplos de inclusão de dados, a primeira utilizando POCO e a segunda utilizando os parâmetros nomeados.</p>
<pre class="brush: csharp;">var estiloMusical = new EstiloMusical
    {
        Nome = "Death Metal"
    };

_db.EstiloMusical.Insert(estiloMusical);

_db.EstiloMusical.Insert(Nome: "Jazz");</pre>
<p>Quando precisamos alterar um registro, também temos a opção de fazer utilizando POCO ou os parâmetros nomeados, e ai entra algo muito interessante do Simple.Data, vamos montar o nome do método passando o campo chave que deverá ser utilizado, no caso da minha tabela o nome do campo chave é <em>IdEstiloMusical </em>então o método chamado será <em>UpdateByIdEstiloMusical</em>, segue os códigos:</p>
<pre class="brush: csharp;">var estiloMusical = new EstiloMusical
    {
        IdEstiloMusical = 2,
        Nome = "Blues"
    };

_db.EstiloMusical.UpdateByIdEstiloMusical(estiloMusical);

_db.EstiloMusical.UpdateByIdEstiloMusical(IdEstiloMusical: 1, Nome: "Black Metal");</pre>
<p>Não vou mostrar toda a API do Simple.Data aqui já que ela é simples e possui uma <a href="http://simplefx.org/simpledata/docs/" target="_blank">documentação</a> simples de entender, apesar de tomar alguns cuidados com o <em>dynamic</em> já que não teremos nunhuma checagem em tempo de compilação, o <em>Simple.Data</em> é uma ótima alternativa para acesso a dados, não notei problemas de desempenho, vou criar alguns testes de desempenho depois coloco aqui o resultado.</p>
<p>A solução apresentada aqui está no <a href="https://github.com/marcioalthmann/Artigos/tree/master/EstudosSimpleData" target="_blank">Github</a>.</p>
<p>Por hoje é isso!</p>
<p>Abraços.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2011/09/simplificando-o-acesso-a-dados-simple-data/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2011/09/simplificando-o-acesso-a-dados-simple-data/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Request &#8211; Reply com MassTransit</title>
		<link>http://www.marcioalthmann.net/2011/08/request-reply-com-masstransit/</link>
		<comments>http://www.marcioalthmann.net/2011/08/request-reply-com-masstransit/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 01:54:56 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[masstransit]]></category>
		<category><![CDATA[messaging]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=709</guid>
		<description><![CDATA[Estamos acostumados com alguns padrões para desenvolvimento, a sopa de letras é enorme, vamos de MVC, MVVM, passamos por SOLID, e temos o famoso livro do GOF, no mundo da integração de sistemas existem os Enterprise Integration Patterns. Vou mostrar aqui no blog 2 desses padrões, e começarei pelo mais simples que é o Request/Reply....<p><a href="http://www.marcioalthmann.net/2011/08/request-reply-com-masstransit/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Estamos acostumados com alguns padrões para desenvolvimento, a sopa de letras é enorme, vamos de MVC, MVVM, passamos por SOLID, e temos o famoso livro do GOF, no mundo da integração de sistemas existem os <a href="http://eaipatterns.com" target="_blank">Enterprise Integration Patterns</a>. Vou mostrar aqui no blog 2 desses padrões, e começarei pelo mais simples que é o <a href="http://eaipatterns.com/RequestReplyJmsExample.html" target="_blank">Request/Reply</a>.</p>
<p>Porém, antes de continuar, recomendo a leitura dos 3 primeiros artigos que escrevi sobre mensageria.<br />
Agora vou direto para a prática, assim ficará mais fácil definir e mostrar alguns conceitos.</p>
<ul>
<li><a href="http://www.marcioalthmann.net/2011/07/mensageria-o-inicio/" target="_blank">Mensageria o Início</a></li>
<li><a href="http://www.marcioalthmann.net/2011/07/frameworks-para-mensageria/" target="_blank">Frameworks para Mensageria</a></li>
<li><a href="http://www.marcioalthmann.net/2011/08/compilando-masstransit/" target="_blank">Compilando o MassTransit</a></li>
</ul>
<p>Nos exemplos vou utilizar o framework MassTransit, e o MSMQ da Microsoft, já que é gratuito e está disponível no Windows. É só habilitar nos recursos do Windows.</p>
<p>&nbsp;</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/08/RequestReply-.gif" rel="lightbox[709]" title="RequestReply"><img class="aligncenter size-full wp-image-713" title="RequestReply" src="http://www.marcioalthmann.net/wp-content/uploads/2011/08/RequestReply-.gif" alt="" width="419" height="134" /></a><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/08/RequestReply.gif"><br />
</a></p>
<p>O nome do padrão é auto explicativo, teremos uma aplicação que envia uma mensagem, e aguarda uma mensagem de retorno,  é por isso que utilizamos o MSMQ ou no caso do MassTransit temos também a opção de utilizar o RabbitMQ. Mas vamos com calma, vamos entender nossas mensagens.</p>
<p>No exemplo teremos duas mensagens <em>RequisitarCalculoSalario </em>e <em>RespostaCalculoSalario</em>, as mensagens não serão utilizadas para trafegar dados. Vou utilizá-las apenas para passar o identificador do funcionário que desejo saber o salário.  Então podemos falar que nossas mensagens seriam <em>POCO´s</em> simples, ou melhor o contrato que uma aplicação conhece, não importa quem solitica ou quem responde a mensagem, o que importa é receber a mensagem que estou interessado. Segue a implementação das mensagens.</p>
<div class="tabs_container"><ul class="tabs"><li><a href="#">SolicitarCalculosalario</a></li><li><a href="#">RespostaCalculoSalario</a></li></ul><div class="panes"><div class="pane"></p>
<pre class="brush: csharp;">public class SolicitarCalculoSalario : CorrelatedBy&lt;Guid&gt;
{
    public Guid CorrelationId { get; set; }
    public int IdFuncionario { get; set; }

    public SolicitarCalculoSalario()
    {
        CorrelationId = Guid.NewGuid();
    }
}</pre>
<p></div><div class="pane"></p>
<pre class="brush: csharp;">public class RespostaCalculoSalario : CorrelatedBy
{
    public Guid CorrelationId { get; set; }
    public decimal Salario { get; set; }
}</pre>
<p></div></div></div>
<p>O primeiro ponto que precisamos entender sobre o MassTransit, é que as mensagens devem implementar a Interface <em>CorrelatedBy&lt;TKey&gt;, </em>o <em>CorrelationId</em> pode ser entendido como um identificador entre as transações, e pensando em larga escala, é recomendado utilizar Guid para a implementação.
</p>
<p>Então atenção para a primeira regra, <em>toda mensagem utilizando o MassTransit deve implementar a Interface CorrelatedBy&lt;TKey&gt;.</em>
</p>
<p>Com as mensagens criadas, o próximo passo é implementar o <em>Requester</em>, nesse exemplo será um ConsoleApp. Um detalhe é que ao criar um projeto com .NET 4.0, o target framework nas configurações do projeto por padrão assume o valor <em>.Net Framework 4 Client Profile, </em>com o <em>Client Profile</em> o projeto não vai compilar, então é necessário alterar para .<em>Net Framework 4, </em>lembrando que o MassTransit também gera as .dlls para .Net 3.5.
</p>
<p>Abaixo o código está separado em 3 partes: a configuração do ServiceBus, a publicação da requisição e o código completo do funcionamento do Requester.
</p>
<div class="tabs_container"><ul class="tabs"><li><a href="#">ServiceBus</a></li><li><a href="#">publishrequest</a></li><li><a href="#">requester</a></li></ul><div class="panes"><div class="pane"></p>
<pre class="brush: csharp;">Bus.Initialize(sbc =&gt;
   {
        sbc.UseMsmq();
        sbc.VerifyMsmqConfiguration();
        sbc.UseMulticastSubscriptionClient();
        sbc.ReceiveFrom("msmq://localhost/requester");
    });</pre>
<p></div><div class="pane"></p>
<pre class="brush: csharp;">Bus.Instance.PublishRequest(
    new SolicitarCalculoSalario { IdFuncionario = idFuncionario },
    callBack =&gt;
        {
            callBack.Handle&lt;RespostaCalculoSalario&gt;(message =&gt;
                {
                    Console.WriteLine("Resposta da Mensagem {0} recebida", message.CorrelationId);
                    Console.WriteLine("Salario: {0}", message.Salario);
                });
             callBack.SetTimeout(10.Seconds());
         });</pre>
<p></div><div class="pane"></p>
<pre class="brush: csharp;">static void Main(string[] args)
{
    Bus.Initialize(sbc =&gt;
        {
            sbc.UseMsmq();
            sbc.VerifyMsmqConfiguration();
            sbc.UseMulticastSubscriptionClient();
            sbc.ReceiveFrom("msmq://localhost/requester");
        });

    Console.WriteLine("Informe o ID do funcionário para calcular o salário:");
    var idFuncionario = 0;
    int.TryParse(Console.ReadLine(), out idFuncionario);

    while (idFuncionario != -1)
    {
        Bus.Instance.PublishRequest(
            new SolicitarCalculoSalario { IdFuncionario = idFuncionario },
                callBack =&gt;
                {
                    callBack.Handle&lt;RespostaCalculoSalario&gt;(message =&gt;
                        {
                            Console.WriteLine("Resposta da Mensagem {0} recebida", message.CorrelationId);
                            Console.WriteLine("Salario: {0}", message.Salario);
                        });
                    callBack.SetTimeout(10.Seconds());
                });

                int.TryParse(Console.ReadLine(), out idFuncionario);
     }
}</pre>
<p></div></div></div>
<p>Agora uma explicação detalhada sobre a configuração do <em>ServiceBus.</em></p>
<ul>
<li> <strong>sbc.UseMsmq(): </strong><em>A primeira escolha que precisamos fazer qual &#8220;transporte&#8221; vamos utilizar para as mensagens, assim nós configuramos que estamos utilizando o MSMQ.</em></li>
<li><strong>sbc.VerifyMsmqConfiguration(): </strong><em>Já que estamos utilizando o MSMQ, com esse método validamos se a instalação do MSMQ está correta.</em></li>
<li><strong>sbc.UseMulticastSubscriptionClient(): </strong><em>Aqui nós estamos habilitando a possibilidade do Bus &#8220;conversar&#8221; com outras instâncias de ServiceBus na rede, com isso não precisamos ter um ponto central de controle das instâncias existentes.</em></li>
<li><strong>sbc.ReceiveFrom(&#8220;msmq://localhost/requester&#8221;): </strong><em>Configuração de a fila que o Requester vai receber as mensagens, o interessante é que se a fila não está criada ainda, o MassTransit faz todo o processo de criação da fila.</em></li>
</ul>
<p>Outras opções são disponibilizadas na configuração do ServiceBus, mas para o exemplo de hoje está bom!
</p>
<p>Depois que configuramos o ServiceBus, vamos publicar uma mensagem, no caso será publicada uma mensagem do tipo <em>SolicitarCalculoSalario</em>, passando o Id do Funcionário, para isso utilizamos o método <em>PublishRequest.</em>
</p>
<p>No primeiro parâmetro do <em>PublishRequest</em> informamos a mensagem que vamos publicar, e no segundo parâmetro informamos o callBack, um detalhe para a configuração do callBack é para o método <em>Handle&lt;&gt;</em>, aqui estamos falando que o <em>Requester </em>está esperando mensagens do tipo <em>RespostaCalculoSalario</em> de retorno, e quando uma dessas mensagens for recebida temos a lógica de escrever na tela as informações da mensagem.
</p>
<p>Logo após o método <em>Handle&lt;&gt; </em>precisamos definir um Timeout para o callBack, ou seja a thread que publicou a solicitação ficará bloqueada até receber a mensagem de retorno, ou até acabar o tempo configurado no timeout, se o tempo acabar uma Exception é disparada, vale ressaltar que não precisamos bloquear a thread, temos recursos de async no .Net que podemos utilizar, mas isso fica para outro artigo.</p>
<p>No código acima veja a aba <em>Requester </em>para ver toda a lógica do programa.
</p>
<p>Agora que as mensagens e o <em>Requester</em> estão prontos, vamos ao código do <em>Responser</em>, o código é muito parecido com  o do <em>Requester, </em>então segue o código completo, logo abaixo tem a explicação dos detalhes diferentes.
</p>
<div class="tabs_container"><ul class="tabs"><li><a href="#">Responser</a></li></ul><div class="panes"><div class="pane"></p>
<pre>static void Main(string[] args)
{
    Bus.Initialize(sbc =&gt;
        {
            sbc.UseMsmq();
            sbc.VerifyMsmqConfiguration();
            sbc.UseMulticastSubscriptionClient();
            sbc.ReceiveFrom("msmq://localhost/responser");
            sbc.Subscribe(subs =&gt; subs.Handler&lt;SolicitarCalculoSalario&gt;(
                msg =&gt;
                {
                    Console.WriteLine("Solicitação {0} recebida, iniciando calculo do funcionário {1}",
                                       msg.CorrelationId, msg.IdFuncionario);

                    var resposta = new RespostaCalculoSalario
                        {
                            CorrelationId = msg.CorrelationId,
                            Salario = (decimal) (msg.IdFuncionario*DateTime.Now.Millisecond * 3.14)
                        };

                        Console.WriteLine("Enviando resposta");
                        Bus.Instance.MessageContext().Respond(resposta);
                 }));
            });

        Console.WriteLine("Aguardando mensagens");
        Console.Read();
    }</pre>
<p></div></div></div>
<p>A principal diferença do <em>Responser</em> é que é utilizado o método <em>Subscribe</em> do <em>ServiceBus</em> para inscrever o <em>Responser </em>para receber mensagens do tipo <em>SolicitarCalculoSalario,</em> quando uma mensagem chega, é criada uma mensagem do tipo <em>RespostaCalculoSalario</em>, e é definido o <em>CorrelationId</em> da nova mensagem igual o da mensagem recebida, e ai faço uma lógica qualquer para descobrir o salário do Funcionário.
</p>
<p>Feito isso através do método<em> MessageContext() </em>do <em>ServiceBus</em>, eu consigo informações sobre quem fez a requisição, e envio uma mensagem de resposta utilizando o método <em>Respond().</em>
</p>
<p>Abaixo uma imagem dos programas funcionando e conversando utilizando as mensages.
</p>
<p>&nbsp;</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/08/requestreplyresultado.jpg" rel="lightbox[709]" title="requestreplyresultado"><img class="aligncenter size-medium wp-image-734" title="requestreplyresultado" src="http://www.marcioalthmann.net/wp-content/uploads/2011/08/requestreplyresultado-300x187.jpg" alt="" width="300" height="187" /></a>
</p>
<p>O assunto não é dos mais simples, mas é muito interessante. Entre os benefícios posso destacar alto desacoplamento, a possibilidade de distribuir processamento, alta escalabilidade, esses itens vamos ver com mais detalhes quando implementarmos o exemplo de <em>Grid/Distributor, </em>mas ai já é avançar muito por enquanto!
</p>
<p>Pegue o código fonte no <a href="https://github.com/marcioalthmann/Artigos/tree/master/MassTransit" target="_blank">Github </a>e boa diversão!
</p>
<p>Abraços.</p>
<p>&nbsp;</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2011/08/request-reply-com-masstransit/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2011/08/request-reply-com-masstransit/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Servidor próprio de pacotes do NuGet</title>
		<link>http://www.marcioalthmann.net/2011/07/servidor-proprio-de-pacotes-do-nuget/</link>
		<comments>http://www.marcioalthmann.net/2011/07/servidor-proprio-de-pacotes-do-nuget/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 00:40:03 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Visual Studio .NET]]></category>
		<category><![CDATA[nuget]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=682</guid>
		<description><![CDATA[Nesse post não vou mostrar o básico do NuGet, até porque para quem não conhece recomendo o blog do Vinicius Quaiato. Instalar e atualizar frameworks em nossos projetos ficou simples com o NuGet, mas quando estamos em um cenário empresarial, as vezes precisamos compartilhar frameworks entre as equipes, e criar um servidor de distribuição de pacotes utilizando...<p><a href="http://www.marcioalthmann.net/2011/07/servidor-proprio-de-pacotes-do-nuget/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/07/nuget.png" rel="lightbox[682]" title="nuget"><img class="alignleft size-full wp-image-674" title="nuget" src="http://www.marcioalthmann.net/wp-content/uploads/2011/07/nuget.png" alt="" width="164" height="164" /></a>Nesse post não vou mostrar o básico do <a href="http://www.nuget.org/" target="_blank">NuGet</a>, até porque para quem não conhece recomendo o blog do <a href="http://viniciusquaiato.com/blog/tag/nuget/" target="_blank">Vinicius Quaiato</a>. Instalar e atualizar frameworks em nossos projetos ficou simples com o NuGet, mas quando estamos em um cenário empresarial, as vezes precisamos compartilhar frameworks entre as equipes, e criar um servidor de distribuição de pacotes utilizando NuGet pode ser uma ótima idéia :).</p>
<p>O primeiro passo para criar o nosso repositório de pacotes, é criar um WebApplication vazio, lembre-se de criar vazio, porque vamos utilizar o NuGet para criar o servidor :), e ele vai tentar escrever uma Default.aspx, e não precisamos de toda aquela estrutura padrão de um site criado pelo VS.NET.</p>
<p style="text-align: center;"><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/07/nuget01.png" rel="lightbox[682]" title="nuget01"><img class="aligncenter" title="nuget01" src="http://www.marcioalthmann.net/wp-content/uploads/2011/07/nuget01-300x190.png" alt="" width="300" height="190" /></a></p>
<p>Feito isso, vamos ter o enorme trabalho instalar um pacote do NuGet, que prepara o site para ser o servidor de pacotes :D, então na janela de gerenciamento do NuGet vamos escrever <em>Install-Package NuGet.Server</em>, feito isso todas as referências necessárias serão adicionadas ao projeto, e uma estrutura de pasta será criada dentro do projeto.</p>
<p style="text-align: center;"><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/07/nuget02.png" rel="lightbox[682]" title="nuget02"><img class="aligncenter" title="nuget02" src="http://www.marcioalthmann.net/wp-content/uploads/2011/07/nuget02-300x255.png" alt="" width="300" height="255" /></a></p>
<p style="text-align: center;"><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/07/nuget03.png" rel="lightbox[682]" title="nuget03"><img class="aligncenter" title="nuget03" src="http://www.marcioalthmann.net/wp-content/uploads/2011/07/nuget03.png" alt="" width="273" height="299" /></a></p>
<p>Feito isso, é só adicionar o site ao IIS, e o servidor estará pronto. Na pasta <em>Packages </em>do site, nós vamos jogar os pacotes disponíveis no nosso servidor, sempre que quiser disponibilizar um novo pacote, ou atualizar é só jogar o arquivo .<em>nupkg</em> nessa pasta.</p>
<p>Ao acessar o site criado vemos uma página inicial, que mostra qual é URL onde listaremos os pacotes disponíveis. Na segunda imagem abaixo, já está mostrando o pacote do BasicIoC que adicionei no servidor.</p>
<p style="text-align: center;"><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/07/nuget04.png" rel="lightbox[682]" title="nuget04"><img class="aligncenter" title="nuget04" src="http://www.marcioalthmann.net/wp-content/uploads/2011/07/nuget04-300x110.png" alt="" width="300" height="110" /></a></p>
<p style="text-align: center;"><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/07/nuget05.png" rel="lightbox[682]" title="nuget05"><img class="aligncenter" title="nuget05" src="http://www.marcioalthmann.net/wp-content/uploads/2011/07/nuget05-300x158.png" alt="" width="300" height="158" /></a></p>
<p>Agora o próximo passo é adicionar o link do nosso servidor nas configurações do NuGet, na janela de opções do Visual Studio.</p>
<p style="text-align: center;"><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/07/nuget06.png" rel="lightbox[682]" title="nuget06"><img class="aligncenter" title="nuget06" src="http://www.marcioalthmann.net/wp-content/uploads/2011/07/nuget06-300x174.png" alt="" width="300" height="174" /></a></p>
<p>Agora na janela do NuGet no Visual Studio, podemos escolher em qual servidor vamos utilizar, podemos escolher todos, ou um dos cadastrados, depois listo os pacotes instalados no servidor e é listado o BasicIoC, e já consigo instalar o BasicIoC no projeto.</p>
<p style="text-align: center;"><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/07/nuget07.png" rel="lightbox[682]" title="nuget07"><img class="aligncenter" title="nuget07" src="http://www.marcioalthmann.net/wp-content/uploads/2011/07/nuget07-300x112.png" alt="" width="300" height="112" /></a></p>
<p>Bom de uma forma simples, podemos criar um repositório de frameworks, em grandes empresas é comum existir frameworks corporativos (assunto bem explorado pelo pessoal do <a href="http://www.voidpodcast.com" target="_blank">VoidPodCast</a>), e o NuGet é a melhor escolha para criar esse repositório.</p>
<p>Abraços e até o próximo post.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2011/07/servidor-proprio-de-pacotes-do-nuget/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2011/07/servidor-proprio-de-pacotes-do-nuget/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Conjectura de Collatz</title>
		<link>http://www.marcioalthmann.net/2011/06/conjectura-de-collatz/</link>
		<comments>http://www.marcioalthmann.net/2011/06/conjectura-de-collatz/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 02:14:55 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[collatz conjecture]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=619</guid>
		<description><![CDATA[Antes de começar o post, uma novidade é que tentarei postar tudo a partir de hoje em C#, Ruby e Python, assim consigo estudar mais Ruby e Python, e quem tem interesse pode aprender algo também, e por favor aceito críticas e dicas sobre os códigos! Também vou começar a resolver os problemas do Projeto...<p><a href="http://www.marcioalthmann.net/2011/06/conjectura-de-collatz/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Antes de começar o post, uma novidade é que tentarei postar tudo a partir de hoje em C#, Ruby e Python, assim consigo estudar mais Ruby e Python, e quem tem interesse pode aprender algo também, e por favor aceito críticas e dicas sobre os códigos! Também vou começar a resolver os problemas do <a href="http://projecteuler.net/index.php?section=problems" target="_blank">Projeto Euler</a>, nas 3 linguagens então acho que todo mundo pode aprender um pouco!</p>
<p>Ano passado eu fiz alguns testes, utilizando alguns gráficos em Silverlight, e utilizei a Conjectura de Collatz para a geração dos gráficos, segue a definição da conjectura de Collatz que está na Wikipedia.<br />
<div class="info_box"><br />
A conjectura de Collatz é devida ao matemático alemão Lothar Collatz. A conjectura estabelece uma seqüência de números, ou trajetória, que a partir de um número natural inicial obedece aos seguintes critérios: se o número for par seu sucessor na seqüência será sua metade e se o número for ímpar seu sucessor será uma unidade superior ao seu triplo. Desta forma, por exemplo, se a seqüência iniciar com o número 5 ter-se-á: 5; 16; 8; 4; 2; 1. Interrompendo o procedimento no número 1 a pergunta que se faz é: qualquer que seja o número natural inicial a seqüência findará em 1?<br />
A conjectura de Collatz também é chamada de problema 3n + 1.<br />
</div></p>
<p>Eu realmente achei interessante, no final do post terá um gráfico em Silverlight onde poderá informar um número e ver que sempre chegará a 1 mesmo, independente do número informado. Fiz o código o mais simples possível, até porque o problema é simples de resolver, segue os códigos em C#, Python e Ruby.</p>
<div class="tabs_container"><ul class="tabs"><li><a href="#">C#</a></li><li><a href="#">Python</a></li><li><a href="#">Ruby</a></li></ul><div class="panes"><div class="pane"></p>
<pre class="brush: csharp;">class Program
{
    static void Main(string[] args)
    {
        Collatz(50);
        Console.Read();
    }

    static void Collatz(int numero)
    {
        Console.WriteLine(numero);

        if(numero == 1)
            return;

        if(numero % 2 == 0)
            Collatz(numero / 2);
        else
            Collatz(3 * numero + 1);
    }
}</pre>
<p></div><div class="pane"></p>
<pre class="brush: python;">def collatz(numero):
    print(numero)
    if numero == 1:
        return
    if numero % 2 == 0:
        collatz(numero / 2)
    else:
        collatz(3 * numero + 1)

collatz(50)</pre>
<p></div><div class="pane"></p>
<pre class="brush: ruby;">def collatz(numero)
  puts numero

  if numero == 1
    return
  end

  if numero % 2 == 0
    collatz(numero / 2)
  else
    collatz(3 * numero + 1)
  end
end

collatz(50)</pre>
<p></div></div></div>
<p>Já que disse anteriormente, o algoritmo é simples, em todas as linguages utilizei um método recursivo, e mesmo sem experiência em Ruby ou Python da para entender o que o código faz, então não explicarei detalhes do código, mas confesso que Python tem me agradado muito!</p>
<p>Agora para quem quiser testar a Conjectura de Collatz, abaixo tem o gráfico em Silverlight, só escolher um número e clicar no botão Collatz, o número 50 fica legal, não geram muitos resultados e fica legal analisar o gráfico, já que o mesmo é pequeno!</p>
<p><object width="500" height="300" data="data:application/x-silverlight-2," type="application/x-silverlight-2"><param name="source" value="/CollatzSilverlight.xap" /><param name="background" value="white" /><param name="minRuntimeVersion" value="3.0.40723.0" /><param name="autoupgrade" value="true" /><param name="enableHtmlAccess" value="true" /><a style="text-decoration: none;" href="http://go.microsoft.com/fwlink/?LinkID=149156"><img style="border-style: none; width: 400px; height: 200px;" src="http://storage.timheuer.com/sl4wp-ph.png" alt="Install Microsoft Silverlight" /></a></object></p>
<p>O código fonte do projeto está no <a href="https://github.com/marcioalthmann/Artigos/tree/master/CollatzConjecture" target="_blank">GitHub</a>.</p>
<p>Abraços e até o próximo artigo.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2011/06/conjectura-de-collatz/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2011/06/conjectura-de-collatz/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
