<?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</title>
	<atom:link href="http://www.marcioalthmann.net/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>JQuery &#8211; Upload simples com o PlUpload</title>
		<link>http://www.marcioalthmann.net/2012/01/jquery-upload-simples-com-o-plupload/</link>
		<comments>http://www.marcioalthmann.net/2012/01/jquery-upload-simples-com-o-plupload/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 00:16:59 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[Java Script]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=870</guid>
		<description><![CDATA[Mais uma dica de um ótimo plugin para utilizarmos nos nossos projetos. Sempre precisamos fazer upload de arquivos, fotos, documentos e é interessante disponibilizar para o usuário uma interface rica, com suporte a drag and drop, progresso do upload, upload de multiplos arquivos entre outras opções, e nisso o PlUpload é um ótimo plugin, apesar...<p><a href="http://www.marcioalthmann.net/2012/01/jquery-upload-simples-com-o-plupload/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Mais uma dica de um ótimo plugin para utilizarmos nos nossos projetos.</p>
<p>Sempre precisamos fazer upload de arquivos, fotos, documentos e é interessante disponibilizar para o usuário uma interface rica, com suporte a drag and drop, progresso do upload, upload de multiplos arquivos entre outras opções, e nisso o PlUpload é um ótimo plugin, apesar de não funcionar somente com JQuery, ele possui runtimes de Flash, Silverlight e alguns outros, mas hoje vou utilizar o <em>Jquery queue widget </em>para fazer uploads.</p>
<p>Para fazer download é só <a href="http://www.plupload.com/download.php" target="_blank">clicar aqui</a>, existe uma versão gratuita, ou se alguém quiser pode também licenciar o plugin de upload, o que muda é suporte e ajuda os caras a ganhar um merecido dinheiro :).</p>
<p>Existem várias opções de runtime, e diversos arquivos no arquivo de download, segue os arquivos que utilizei no exemplo.</p>
<p>[sourcecode language="html"]<br />
&lt;script src=&quot;@Url.Content(&quot;~/Scripts/plupload.js&quot;)&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;<br />
&lt;script src=&quot;@Url.Content(&quot;~/Scripts/plupload.html4.js&quot;)&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;<br />
&lt;script src=&quot;@Url.Content(&quot;~/Scripts/plupload.html5.js&quot;)&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;<br />
&lt;script src=&quot;@Url.Content(&quot;~/Scripts/jquery.plupload.queue.js&quot;)&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;<br />
&lt;link href=&quot;@Url.Content(&quot;~/Content/plupload/jquery.plupload.queue.css&quot;)&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;<br />
[/sourcecode]</p>
<p>Um detalhe é que para funcionar corretamente, também adicione as imagens disponibilizadas no arquivo de download, e preste atenção no arquivo de .css para ver o diretório de colocar as imagens, ou altere o <em>jquery.upload.queue.css<em> para apontar para sua pasta de imagens.</em></em></p>
<p>Feito isso eu criei um método <em>upload</em> no meu controller <em>plupload</em>, segue o código que não é foco do artigo fazer o armazenamento dos arquivos :), e também repare no parâmetro do método que tem que ser <em>HttpPostedFileBase</em>.</p>
<p>[sourcecode language="csharp"]<br />
[HttpPost]<br />
public void Upload(HttpPostedFileBase file)<br />
{<br />
    // Lógica para salvar a foto<br />
}<br />
[/sourcecode]</p>
<p>Feito isso precisamos configurar nosso HTML, que só vai ter uma div com um id específico, bem difícil assim mesmo :), é nessa div que o plugin de upload será montado.</p>
<p>[sourcecode language="html"]<br />
&lt;div id=&quot;upload&quot;&gt;&lt;/div&gt;<br />
[/sourcecode]</p>
<p>E para finalizar, temos o JQuery que configura o plugin na div que criamos, detalhe para algumas configurações básicas do plugin, onde informo os runtimes que vamos utilizar, tamanho máximo de cada arquivo, a URL que ele vai enviar as fotos, e as extensões suportadas. Mais configurações podem ser encontradas na documentação do plugin.</p>
<p>[sourcecode language="javascript"]<br />
&lt;script type=&quot;text/javascript&quot;&gt;<br />
    $(function () {</p>
<p>        $(&quot;#upload&quot;).pluploadQueue({<br />
           runtimes : &quot;html5,html4&quot;,<br />
           url : &quot;/plupload/upload&quot;,<br />
           max_file_size : &quot;4mb&quot;,<br />
           filters: [<br />
                {title : &quot;Imagens&quot;, extensions : &quot;jpg,png&quot;}<br />
           ]<br />
        });</p>
<p>    });<br />
&lt;/script&gt;<br />
[/sourcecode]</p>
<p>Feito isso é só testar e ver o upload funcionando, com progresso, opção para exclusão de itens antes de iniciar o upload, muito bom!</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2012/01/plupload.jpg" rel="lightbox[870]" title="plupload"><img src="http://www.marcioalthmann.net/wp-content/uploads/2012/01/plupload-300x168.jpg" alt="" title="plupload" width="300" height="168" class="aligncenter size-medium wp-image-871" /></a></p>
<p>Código fonte no <a href="https://github.com/marcioalthmann/Artigos/tree/master/JQuery/JQuery" target="_blank">GitHub</a>.</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/2012/01/jquery-upload-simples-com-o-plupload/&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/jquery-upload-simples-com-o-plupload/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JQuery &#8211; Tooltips com o Tipsy</title>
		<link>http://www.marcioalthmann.net/2012/01/jquery-tooltips-com-o-tipsy/</link>
		<comments>http://www.marcioalthmann.net/2012/01/jquery-tooltips-com-o-tipsy/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 22:44:07 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[Java Script]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[tooltip]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=862</guid>
		<description><![CDATA[Sempre falo sobre JQuery nos posts sobre MVC, e existem ótimos plugins para JQuery, desde validações, tooltips, máscaras, efeitos entre muitos outros, começarei a catalogar aqui no site plugins legais que utilizei, serão posts mais simples mas ao mesmo tempo pode ajudar alguém :). Vou começar com um plugin simples para criar tooltips. Existem vários...<p><a href="http://www.marcioalthmann.net/2012/01/jquery-tooltips-com-o-tipsy/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Sempre falo sobre <a href="http://www.jquery.com" target="_blank">JQuery</a> nos posts sobre MVC, e existem ótimos plugins para JQuery, desde validações, tooltips, máscaras, efeitos entre muitos outros, começarei a catalogar aqui no site plugins legais que utilizei, serão posts mais simples mas ao mesmo tempo pode ajudar alguém :).</p>
<p>Vou começar com um plugin simples para criar tooltips.</p>
<p>Existem vários plugins de tooltip por ai, mas o que gostei no <a href="http://onehackoranother.com/projects/jquery/tipsy/" target="_blank">Tipsy</a> é que ele é simples, existem algumas opções de configuração, mas no geral é extremamente simples de configurar e utilizar.</p>
<p>Os fontes do Tipsy estão no <a href="https://github.com/jaz303/tipsy" target="_blank">Github</a>, então também é uma boa fonte de estudo, e merece qualquer contribuição ao projeto!</p>
<p>Para utilizar o Tipsy é necessário adicionar ao projeto os arquivos de css e javascript.</p>
<p>[sourcecode language="html"]<br />
&lt;script src=&quot;@Url.Content(&quot;~/Scripts/jquery.tipsy.js&quot;)&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;<br />
&lt;link href=&quot;@Url.Content(&quot;~/Content/tipsy.css&quot;)&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;<br />
[/sourcecode]</p>
<p>Feito isso podemos começar a adicionar tooltip nos elementos da nossa aplicação, o jeito mais simples é chamar o método tipsy() em algum elemento quando a página é carregada, no primeiro exemplo estou mostrando um tooltip em um link, o método tipsy sem configuração extra vai mostrar um tooltip centralizado abaixo do elemento escolhido.</p>
<p>HTML</p>
<p>[sourcecode language="html"]<br />
&lt;p&gt;<br />
    &lt;a href=&quot;#&quot; id=&quot;link&quot; title=&quot;Tooltip do link&quot;&gt;Link com tooltip&lt;/a&gt;<br />
&lt;/p&gt;<br />
[/sourcecode]</p>
<p>Script</p>
<p>[sourcecode language="javascript"]<br />
&lt;script type=&quot;text/javascript&quot;&gt;<br />
    $(function () {<br />
        $(&quot;#link&quot;).tipsy();<br />
    });<br />
&lt;/script&gt;<br />
[/sourcecode]</p>
<p>E o resultado:.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2012/01/tipsy01.jpg" rel="lightbox[862]" title="tipsy01"><img class="aligncenter size-medium wp-image-864" title="tipsy01" src="http://www.marcioalthmann.net/wp-content/uploads/2012/01/tipsy01-300x162.jpg" alt="" width="300" height="162" /></a></p>
<p>Para posicionar o tooltip em alguma das direções do elemento escolhido, devemos usar a propriedade <em>gravity</em>, informando um dos seguintes valores: <em>n, s, e, w, nw, ne, sw, se.</em></p>
<p>HTML</p>
<p>[sourcecode language="html"]<br />
&lt;p&gt;<br />
&lt;button id=&quot;tooltipEmCima&quot; title=&quot;Tooltip aparecendo em cima&quot;&gt;Em cima&lt;/button&gt;<br />
    &lt;button id=&quot;tooltipDireita&quot; title=&quot;Tooltip aparecendo do lado direito&quot;&gt;Direita&lt;/button&gt;<br />
&lt;/p&gt;<br />
[/sourcecode]</p>
<p>Script</p>
<p>[sourcecode language="javascript"]<br />
&lt;script type=&quot;text/javascript&quot;&gt;<br />
    $(function () {<br />
        $(&quot;#tooltipDireita&quot;).tipsy({ gravity: &#8216;w&#8217; });<br />
        $(&quot;#tooltipEmCima&quot;).tipsy({ gravity: &#8216;s&#8217; });<br />
    });<br />
&lt;/script&gt;<br />
[/sourcecode]</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2012/01/tipsy02.jpg" rel="lightbox[862]" title="tipsy02"><img class="aligncenter size-medium wp-image-865" title="tipsy02" src="http://www.marcioalthmann.net/wp-content/uploads/2012/01/tipsy02-300x158.jpg" alt="" width="300" height="158" /></a></p>
<p>Para finalizar um outro exemplo interessante, que é mostrando o tooltip quando um elemento ganha foco do cursor, gosto desse para formulários, é só utilizar a propriedade <em>trigger.</em></p>
<p>HTML</p>
<p>[sourcecode language="html"]<br />
&lt;form id=&quot;formulario&quot;&gt;<br />
    &lt;p&gt;<br />
        &lt;input type=&quot;text&quot; title=&quot;Informe seu nome&quot;/&gt;<br />
    &lt;/p&gt;<br />
    &lt;p&gt;<br />
        &lt;input type=&quot;text&quot;  title=&quot;Telefone (somente números)&quot; /&gt;<br />
    &lt;/p&gt;<br />
&lt;/form&gt;<br />
[/sourcecode]</p>
<p>Script</p>
<p>[sourcecode language="javascript"]<br />
&lt;script type=&quot;text/javascript&quot;&gt;<br />
    $(function () {<br />
        $(&quot;#formulario [title]&quot;).tipsy({ trigger: &quot;focus&quot;, gravity: &quot;w&quot; });<br />
    });<br />
&lt;/script&gt;<br />
[/sourcecode]</p>
<p>Mais exemplos e documentação podem ser encontrados no <a href="http://onehackoranother.com/projects/jquery/tipsy/" target="_blank">site do plugin</a>. E o código fonte do artigo está no <a href="https://github.com/marcioalthmann/Artigos/tree/master/JQuery" target="_blank">GitHub.</a></p>
<p>Até o próximo post.</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/jquery-tooltips-com-o-tipsy/&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/jquery-tooltips-com-o-tipsy/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>De Webforms para MVC &#8211; DropDownList em cascata</title>
		<link>http://www.marcioalthmann.net/2012/01/de-webforms-para-mvc-dropdownlist-em-cascata/</link>
		<comments>http://www.marcioalthmann.net/2012/01/de-webforms-para-mvc-dropdownlist-em-cascata/#comments</comments>
		<pubDate>Sun, 08 Jan 2012 23:55:05 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[asp.net mvc]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=858</guid>
		<description><![CDATA[Continuando o artigo sobre como criar DropDownList com MVC, hoje vou finalizar mostrando como criar um DropDownList em cascata, ou seja ao selecionar um item de um DropDownList, um segundo DropDownList deve ser carregado. No exemplo, ao selecionar um determinado Autor os livros desse autor devem ser carregados. Antes de começar algumas informações importantes, se você...<p><a href="http://www.marcioalthmann.net/2012/01/de-webforms-para-mvc-dropdownlist-em-cascata/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Continuando o <a href="http://www.marcioalthmann.net/2012/01/de-webforms-para-mvc-dropdownlist/" target="_blank">artigo</a> sobre como criar DropDownList com MVC, hoje vou finalizar mostrando como criar um DropDownList em cascata, ou seja ao selecionar um item de um DropDownList, um segundo DropDownList deve ser carregado.</p>
<p>No exemplo, ao selecionar um determinado <em>Autor</em> os livros desse autor devem ser carregados.</p>
<p>Antes de começar algumas informações importantes, se você não conhece <a href="http://www.jquery.com/" target="_blank">JQuery</a> considero obrigatório conhecer, na verdade não da para ficar mais sem saber JavaScript, e para os que tem algum &#8220;trauma&#8221; de JavaScript o JQuery facilita e muito a nossa vida, e falando em JQuery recomendo essa <a href="http://fabriciosanchez.com.br/site/?page_id=1476" target="_blank">série</a> de posts do <a href="http://fabriciosanchez.com.br/" target="_blank">Fabrício Sanchez </a>sobre JQuery, leitura obrigatória!</p>
<p>Para começar eu criei um classe para representar os <em>Livros.</em></p>
<p>[sourcecode language="csharp"]<br />
public class Livro<br />
{<br />
    public int IdLivro { get; set; }<br />
    public int IdAutor { get; set; }<br />
    public string Titulo { get; set; }<br />
}<br />
[/sourcecode]</p>
<p>E no <em>Controller</em> criei um método que vai receber o <em>id </em>do <em>Autor</em>, e fazer uma busca pelos livros, para representar os livros criei uma lista de Livros no método do <em>Controller</em> mesmo, só para criar o exemplo. Vamos ao código.</p>
<p>[sourcecode language="csharp"]<br />
public JsonResult ObterLivrosDoAutor(int id)<br />
{<br />
     var livros = new List&lt;Livro&gt;<br />
                      {<br />
                          new Livro{IdAutor = 2, IdLivro = 1, Titulo = &quot;O Anticristo&quot;},<br />
                          new Livro{IdAutor = 2, IdLivro = 2, Titulo = &quot;Assim Falou Zaratustra&quot;},<br />
                          new Livro{IdAutor = 2, IdLivro = 3, Titulo = &quot;Para Além do Bem e do Mal&quot;},<br />
                          new Livro{IdAutor = 1, IdLivro = 4, Titulo = &quot;Os Irmãos Karamazov&quot;},<br />
                          new Livro{IdAutor = 1, IdLivro = 5, Titulo = &quot;O Jogador&quot;},<br />
                          new Livro{IdAutor = 1, IdLivro = 6, Titulo = &quot;Recordações da Casa dos Mortos&quot;}<br />
                       };</p>
<p>      return Json(livros.Where(l =&gt; l.IdAutor == id), JsonRequestBehavior.AllowGet);<br />
}<br />
[/sourcecode]</p>
<p>Alguns detalhes sobre esse código, o retorno do método é um <em>JsonResult</em>, para quem não conhece <a href="http://en.wikipedia.org/wiki/JSON" target="_blank">JSON (JavaScript Object Notation) veja alguns exemplos e informações.</a> O MVC já possui algumas funcionalidades para pegar nossos objetos e &#8220;converter&#8221; para a notação dos objetos em JSON, é isso que acontece no <em>return Json(), </em>outro detalhe é nesse método autorizar o GET, o que informamos no segundo parâmetro do método <em>JsonRequestBehavior.AllowGet.</em></p>
<p>Isso tudo porque vamos fazer tudo por AJAX, não vamos recarregar a página toda quando o usuário selecionar um <em>Autor</em>, vamos pedir a lista de <em>Livros</em> e carregar só o DropDownList dos Livros.</p>
<p>Voltando a <em>View</em>, vamos as alterações, primeiro adicionei um item <em>Selecione&#8230;</em>, no DropDownList de Autor, e criei um para os Livros.</p>
<p>[sourcecode language="html"]<br />
&lt;p&gt;<br />
    &lt;select id=&quot;autor&quot;&gt;<br />
        &lt;option value=&quot;0&quot;&gt;Selecione&#8230;&lt;/option&gt;<br />
        @foreach (var autor in Model.Autores)<br />
        {<br />
            &lt;option value=&quot;@autor.IdAutor&quot;&gt;@autor.Nome&lt;/option&gt;<br />
        }<br />
    &lt;/select&gt;<br />
&lt;/p&gt;<br />
&lt;p&gt;<br />
    &lt;select id=&quot;livro&quot;&gt;</p>
<p>    &lt;/select&gt;<br />
&lt;/p&gt;<br />
[/sourcecode]</p>
<p>E agora a parte divertida, um pouco de JavaScript/JQuery para fazer toda a lógica de descobrir se existe algum <em>Autor</em> selecionado, se existir chamar o método no servidor que devolve a lista de Livros, e com a lista obtida escrevemos HTML na página já carregada, caso nenhum <em>Autor</em> for selecionado limpamos a lista de <em>Livros </em> já carregados.</p>
<p>[sourcecode language="javascript"]<br />
&lt;script type=&quot;text/javascript&quot; language=&quot;javascript&quot;&gt;<br />
    $(function () {<br />
        $(&quot;#autor&quot;).change(function () {<br />
            if (possuiAutorSelecionado()) {<br />
                carregarLivrosDoAutor();<br />
            } else {<br />
                limparLivrosCarregados();<br />
            }<br />
        });<br />
    });</p>
<p>    function possuiAutorSelecionado() {<br />
        return $(&quot;#autor&quot;).val() != &quot;0&quot;;<br />
    }</p>
<p>    function carregarLivrosDoAutor() {<br />
        var url = &quot;dropdown/obterlivrosdoautor/&quot; + $(&quot;#autor&quot;).val();<br />
        $.getJSON(url, null, function (data) {<br />
            limparLivrosCarregados();<br />
            $.each(data, function (indice, livro) {<br />
                $(&quot;#livro&quot;).append(&quot;&lt;option value=&#8217;&quot; + livro.IdLivro +&quot;&#8217;&gt;&quot; + livro.Titulo + &quot;&lt;/option&gt;&quot;);<br />
            });<br />
        });<br />
    }</p>
<p>    function limparLivrosCarregados() {<br />
        $(&quot;#livro&quot;).empty();<br />
    }<br />
&lt;/script&gt;<br />
[/sourcecode]</p>
<p>Bom com isso temos o DropDownList em cascata, usando alguns recursos interessantes, JQuery, Ajax, e tudo que temos direito. Para quem vei odo WebForms não temos mais AjaxToolkit, nada de UpdatePanel, nada disso para atrapalhar nossa vida \o/, então estude JQuery ;).</p>
<p>Outro ótimo artigo sobre o assunto com MVC, é o artigo do <a href="http://joselino.net/2011/08/05/selectlist-asp-net-mvc/" target="_blank">José Lino Neto</a>, vale a leitura!</p>
<p>Código no <a href="https://github.com/marcioalthmann/Artigos/tree/master/DeWebFormsParaMvc" 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/2012/01/de-webforms-para-mvc-dropdownlist-em-cascata/&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/de-webforms-para-mvc-dropdownlist-em-cascata/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>De Webforms para MVC &#8211; DropDownList</title>
		<link>http://www.marcioalthmann.net/2012/01/de-webforms-para-mvc-dropdownlist/</link>
		<comments>http://www.marcioalthmann.net/2012/01/de-webforms-para-mvc-dropdownlist/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 02:13:39 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[asp.net mvc]]></category>
		<category><![CDATA[dropdownlist]]></category>
		<category><![CDATA[select]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=852</guid>
		<description><![CDATA[Continuando a séria para quem está interessado em MVC, mas ainda está no mundo dos Webforms, hoje vou mostrar como fazer um DropDownList, o artigo vai ser simples, no próximo vou mostrar um DropDownList em cascata, simulando o autopostback disponível no WebForms e carregando um segundo DropDownList, abaixo os primeiros artigos da série de WebForms para...<p><a href="http://www.marcioalthmann.net/2012/01/de-webforms-para-mvc-dropdownlist/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Continuando a séria para quem está interessado em MVC, mas ainda está no mundo dos Webforms, hoje vou mostrar como fazer um DropDownList, o artigo vai ser simples, no próximo vou mostrar um DropDownList em cascata, simulando o <em>autopostback</em> disponível no WebForms e carregando um segundo DropDownList, abaixo os primeiros artigos da série de WebForms para MVC:</p>
<ul>
<li><a href="http://www.marcioalthmann.net/2011/03/de-webforms-para-mvcparte-01/" target="_blank">De Webforms para MVC &#8211; Parte 01</a></li>
<li><a href="http://www.marcioalthmann.net/2011/03/de-webforms-para-mvcparte-02/" target="_blank">De WebForms para MVC &#8211; Parte 02</a></li>
<li><a href="http://www.marcioalthmann.net/2011/04/webformsmvcgrid/" target="_blank">De WebForms para MVC &#8211; Grid</a></li>
</ul>
<p>Antes de começar, abaixo a imagem do DropDownList do WebForms.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2012/01/dropdownlist.jpg" rel="lightbox[852]" title="dropdownlist"><img class="aligncenter size-medium wp-image-854" title="dropdownlist" src="http://www.marcioalthmann.net/wp-content/uploads/2012/01/dropdownlist-300x100.jpg" alt="" width="300" height="100" /></a></p>
<p>Para quem saiu do mundo WinForms e foi para o WebForms, o ComboBox virou DropDownList, agora quando trabalhamos com HTML puro no MVC e não temos os Server Controls do WebForms, o DropDownList deve ser feito utilizando a tag <em>select </em> do HTML, essa mesma tag é gerada pelo Server Control DropDownList quando é renderizado no WebForms, mas no MVC nós temos que fazer isso, pelo menos do jeito mais &#8220;manual&#8221;.</p>
<p>Bom para começar com os códigos das classes utilizadas, existe uma classe <em>Livraria</em> com uma lista de <em>Autores.</em></p>
<p>[sourcecode language="csharp"]<br />
public class Autor<br />
{<br />
    public int IdAutor { get; set; }<br />
    public string Nome { get; set; }<br />
}</p>
<p>public class Livraria<br />
{<br />
    public List&lt;Autor&gt; Autores { get; set; }<br />
}<br />
[/sourcecode]</p>
<p>Feito isso eu criei um <em>Controller</em> e passo para a <em>View</em> o <em>Model </em> já com alguns autores.</p>
<p>[sourcecode language="csharp"]<br />
public ActionResult Index()<br />
{<br />
    var autores = new List&lt;Autor&gt;<br />
                      {<br />
                          new Autor {IdAutor = 1, Nome = &quot;Fiódor Dostoiévski&quot;},<br />
                          new Autor {IdAutor = 1, Nome = &quot;Friedrich Nietzsche&quot;}<br />
                      };</p>
<p>    return View(new Livraria{Autores = autores});<br />
}<br />
[/sourcecode]</p>
<p>Agora na <em>View</em> precisamos mostrar os autores para o usuário selecionar algum deles, vamos para a primeira forma de construir o <em>select</em> que é utilizando HTML com um pouco de Razor.</p>
<p>[sourcecode language="html"]<br />
&lt;p&gt;<br />
    &lt;select&gt;<br />
        @foreach (var autor in Model.Autores)<br />
        {<br />
            &lt;option value=&quot;@autor.IdAutor&quot;&gt;@autor.Nome&lt;/option&gt;<br />
        }<br />
    &lt;/select&gt;<br />
&lt;/p&gt;<br />
[/sourcecode]</p>
<p>O código é simples, eu crio um elemento <em>select</em> e dentro dele preciso criar as opções de seleção, pra isso crio uma tag <em>option </em>para cada item que veio no meu <em>Model</em> na coleção de <em>Autores. </em>No <em>DropDownList</em> do WebForms temos duas propriedades que são <em>DataTextField </em>e <em>DataValueField</em>, onde informo o campo que vou mostrar para o usuário e qual o campo de valor que vou obter da seleção feita, aqui o campo de valor vai para a propriedadee <em>value </em>da tag <em>option</em> e o campo que será mostrado vai entre as tags <em>&lt;option&gt;&lt;/option&gt;.</em></p>
<p>Por mais básico que seja, tem quem não gosta de escrever HTML ou acha muito trabalhoso fazer isso, então existem alguns Helpers de HTML no MVC para facilitar esse trabalho, abaixo a segunda forma de criar esse código, utilizando o Helper <em>DropDownListFor.</em></p>
<p>[sourcecode language="html"]<br />
&lt;p&gt;<br />
    @Html.DropDownListFor(m =&gt; m.Autores, new SelectList(Model.Autores, &quot;IdAutor&quot;, &quot;Nome&quot;))<br />
&lt;/p&gt;<br />
[/sourcecode]</p>
<p>Um detalhe desse Helper, é que no segundo parâmetro onde é criado o SelectList, estou informando o que será mostrado e qual será o valor de cada item.</p>
<p>E para finalizar a página exibindo os dois Selects.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2012/01/resultado.jpg" rel="lightbox[852]" title="resultado"><img class="aligncenter size-medium wp-image-855" title="resultado" src="http://www.marcioalthmann.net/wp-content/uploads/2012/01/resultado-300x178.jpg" alt="" width="300" height="178" /></a></p>
<p>Até o próximo artigo, e se alguém quiser ver algo específico em MVC entre em contato.</p>
<p>O código está no <a href="https://github.com/marcioalthmann/Artigos/tree/master/DeWebFormsParaMvc" 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/de-webforms-para-mvc-dropdownlist/&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/de-webforms-para-mvc-dropdownlist/feed/</wfw:commentRss>
		<slash:comments>1</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>Pare de sofrer com as mensagens de erro em pt-br do Framework</title>
		<link>http://www.marcioalthmann.net/2011/12/pare-de-sofrer-com-as-mensagens-de-erro-em-pt-br-do-framework/</link>
		<comments>http://www.marcioalthmann.net/2011/12/pare-de-sofrer-com-as-mensagens-de-erro-em-pt-br-do-framework/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 00:06:30 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[mensagens de erro]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=835</guid>
		<description><![CDATA[Essa dica meu amigo de trabalho Carlos Neto quem passou por e-mail hoje,  e quero compartilhar. Não sei se já perceberam que a tradução das mensagens do .NET Framework para pt-br não é muito confiável, para não falar horrível :), geralmente não querem dizer muita coisa, e hoje fiquei sabendo do site Unlocalize. A idéia...<p><a href="http://www.marcioalthmann.net/2011/12/pare-de-sofrer-com-as-mensagens-de-erro-em-pt-br-do-framework/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Essa dica meu amigo de trabalho Carlos Neto quem passou por e-mail hoje,  e quero compartilhar.</p>
<p>Não sei se já perceberam que a tradução das mensagens do .NET Framework para pt-br não é muito confiável, para não falar horrível :), geralmente não querem dizer muita coisa, e hoje fiquei sabendo do site <a href="http://www.unlocalize.com" target="_blank">Unlocalize</a>.</p>
<p>A idéia do site é simples, pegue uma mensagem de erro do .NET em qualquer idioma, e ele mostra essa mensagem em outros idiomas, então segue abaixo a imagem do texto do erro em pt-br e o texto em en-us marcado, site favoritado já :D.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/12/Unlocalize.jpg" rel="lightbox[835]" title="Unlocalize"><img class="aligncenter size-medium wp-image-836" title="Unlocalize" src="http://www.marcioalthmann.net/wp-content/uploads/2011/12/Unlocalize-300x168.jpg" alt="" width="300" height="168" /></a></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/12/pare-de-sofrer-com-as-mensagens-de-erro-em-pt-br-do-framework/&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/12/pare-de-sofrer-com-as-mensagens-de-erro-em-pt-br-do-framework/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>
	</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! -->
