<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>NeoMatrix Tech</title>
	
	<link>http://leonelfraga.com/neomatrixtech</link>
	<description>C#, ASP.NET, Programação em Geral, Análises, Hardware, Software, Opinião, Gadgets e muito mais.</description>
	<lastBuildDate>Thu, 12 Jan 2012 00:51:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/neomatrixtech" /><feedburner:info uri="neomatrixtech" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>neomatrixtech</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>ILSpy: Ferramenta para “decompilar” Assemblies .NET</title>
		<link>http://feedproxy.google.com/~r/neomatrixtech/~3/JxuoPr6Kb-c/</link>
		<comments>http://leonelfraga.com/neomatrixtech/?p=791#comments</comments>
		<pubDate>Thu, 12 Jan 2012 00:51:46 +0000</pubDate>
		<dc:creator>Leonel Fraga de Oliveira</dc:creator>
				<category><![CDATA[.NET Geral]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Decompilador]]></category>
		<category><![CDATA[Disassembler]]></category>
		<category><![CDATA[Ferramentas]]></category>

		<guid isPermaLink="false">http://leonelfraga.com/neomatrixtech/?p=791</guid>
		<description><![CDATA[Olá meu caro leitor! Faz um (bom) tempo que não posto um artigo aqui, né? Como foi a sua passagem de ano? A minha foi “male mal”&#8230; Quem lê o NM Light vai saber o motivo . Vamos começar 2012 falando sobre uma ferramenta que pode salvar vidas (tá, estou exagerando, mas pode salvar carreiras]]></description>
			<content:encoded><![CDATA[<p>Olá meu caro leitor! Faz um (bom) tempo que não posto um artigo aqui, né? Como foi a sua passagem de ano? A minha foi “male mal”&#8230; Quem lê o NM Light vai saber o motivo <img src='http://leonelfraga.com/neomatrixtech/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Vamos começar 2012 falando sobre uma ferramenta que pode salvar vidas (tá, estou exagerando, mas pode salvar carreiras hehe) de quem desenvolve em .NET. Quando você pega um projeto que usa algumas bibliotecas feitas pelo desenvolvedor anterior, você PRECISA fazer algumas alterações nela ou, no meu caso, compilar o projeto com um componente mais atual porque se for usar a biblioteca original ele OBRIGA A USAR a versão antiga e <strong>que o fonte foi pras cucuias</strong>?</p>
<p>De posse da biblioteca original você poderá ver o código-fonte usando uma ferramenta oferecida pelo próprio Visual Studio:<strong> IL Disassembler</strong>, ou <strong>IL DASM</strong> para os mais chegados. Mas tem um porém: ela apresenta o código na <em>Common</em> <em>Intermediate Language (CIL)</em>, o código que o compilador JIT do .NET Framework traduz para código de máquina e por fim é executado. Bem, não é nada produtivo ficar tentando entender a IL, certo?</p>
<p>Há algum tempo atrás, existia uma ferramenta gratuita chamada <strong>.NET Reflector</strong>. Esta ferramenta traduzia a IL para C# ou outras linguagens da plataforma .NET e exportava para um projeto, prontinho para compilar. Um porém desta ferramenta é que ela forçava os updates automáticos, de forma que se a rotina de atualização fosse cancelada o programa “matava a si próprio”, ou seja, era apagado do disco. E não adiantava reinstalar. No fim, o desenvolvedor vendeu o .NET Reflector para a empresa <strong>Red Gate</strong>, que continua o seu desenvolvimento porém o aplicativo agora é pago e a versão <em>Standard</em> custa US$ 35,00 (fonte: <a href="http://www.reflector.net/">http://www.reflector.net/</a>).</p>
<p>Dando uma pesquisada por aí, achei um substituto legal e que cumpre ao meu propósito: o <strong><font color="#ff0000">IL Spy</font></strong>. Ele também é um “<em>disassembler</em>” para .NET, que traduz o código em IL para C# e permite salvar o projeto. Só que com um detalhe: é de <strong>código-aberto e grátis</strong><font size="2"> (lembre-se que uma característica não implica em ter a outra <img src='http://leonelfraga.com/neomatrixtech/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> )</font>.</p>
<p><a href="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2012/01/screens-ilspy.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="Captura de tela do IL Spy" border="0" alt="Captura de tela do IL Spy" src="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2012/01/screens-ilspy_thumb.jpg" width="350" height="230" /></a></p>
<p>Com ele, consegui pegar todas as classes que precisava, colar em um novo projeto, referenciar as bibliotecas mais atuais e compilar. Mas nem tudo são flores:<font color="#ff0000"> Ele traduz o código de algumas propriedades, principalmente indexadas, colocando no lugar da propriedade a chamada para seu método ancestral, “<em>getter</em>” ou “<em>setter</em>”</font>, por exemplo:</p>
<pre class="brush:csharp">//Como a propriedade é colocada no código original:
MeuDataSet.Tables[i];
MeuArrayList.Count;
MeuDataRow[&quot;CAMPO&quot;] = valor;

//Como ela é traduzida pelo IL Spy
MeuDataSet.get_Tables(i);
MeuArrayList.get_Count();
MeuDataRow.set_Row(&quot;CAMPO&quot;,valor);</pre>
<p>Quando compilava sem fazer o devido ajuste ocorria um erro de compilação, pois os <em>getters</em> e <em>setters</em> das propriedades exemplificadas acima não são métodos públicos, portanto não poderiam ser acessados de fora da classe onde foram declarados.</p>
<p>Tirando esse pequeno atormento (que dependendo do código se torna um grande atormento&#8230;), repito que a ferramenta atendeu os meus objetivos e a recomendo em casos de emergência ou até mesmo para estudo de fontes (desde que não estejam ofuscados, claro!).</p>
<p>Onde baixar? Aqui: <a href="http://wiki.sharpdevelop.net/ILSpy.ashx">http://wiki.sharpdevelop.net/ILSpy.ashx</a></p>
<div id="crp_related"><h3>Artigos Relacionados:</h3><ul><li><a href="http://leonelfraga.com/neomatrixtech/?p=756" rel="bookmark" class="crp_title">Componentes gr&aacute;tis &eacute; bom, mas&#8230;</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=404" rel="bookmark" class="crp_title">Repercussão do FUD da Symantec</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=751" rel="bookmark" class="crp_title">Atualiza&ccedil;&atilde;o! Compactando e Transmitindo DataSets via XML</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=777" rel="bookmark" class="crp_title">Rapidinha: CustomValidators n&atilde;o disparam o ServerValidate quando est&aacute; vazio? Veja o que pode ser aqui!</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=680" rel="bookmark" class="crp_title">Conversor Atom para RSS</a></li></ul></div><p><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D791&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=recommend&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D791&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=recommend&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D791&amp;counturl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D791&amp;count=horizontal&amp;text=ILSpy%3A%20Ferramenta%20para%20%26ldquo%3Bdecompilar%26rdquo%3B%20Assemblies%20.NET" scrolling="no" style="border:none;overflow:hidden;width:130px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D791&amp;counturl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D791&amp;count=horizontal&amp;text=ILSpy%3A%20Ferramenta%20para%20%26ldquo%3Bdecompilar%26rdquo%3B%20Assemblies%20.NET" scrolling="no" style="border:none;overflow:hidden;width:130px;height:20px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D791&amp;size=medium&amp;count=true" scrolling="no" style="border:none;overflow:hidden;width:90px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D791&amp;size=medium&amp;count=true" scrolling="no" style="border:none;overflow:hidden;width:90px;height:20px"></iframe><!--<![endif]--><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D791&amp;linkname=ILSpy%3A%20Ferramenta%20para%20%26ldquo%3Bdecompilar%26rdquo%3B%20Assemblies%20.NET" title="Delicious" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D791&amp;linkname=ILSpy%3A%20Ferramenta%20para%20%26ldquo%3Bdecompilar%26rdquo%3B%20Assemblies%20.NET" title="Google Reader" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D791&amp;linkname=ILSpy%3A%20Ferramenta%20para%20%26ldquo%3Bdecompilar%26rdquo%3B%20Assemblies%20.NET" title="Orkut" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_live" href="http://www.addtoany.com/add_to/live?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D791&amp;linkname=ILSpy%3A%20Ferramenta%20para%20%26ldquo%3Bdecompilar%26rdquo%3B%20Assemblies%20.NET" title="Messenger" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/live.png" width="16" height="16" alt="Messenger"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D791&amp;title=ILSpy%3A%20Ferramenta%20para%20%26ldquo%3Bdecompilar%26rdquo%3B%20Assemblies%20.NET" id="wpa2a_2"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://leonelfraga.com/neomatrixtech/?feed=rss2&amp;p=791</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://leonelfraga.com/neomatrixtech/?p=791</feedburner:origLink></item>
		<item>
		<title>Votação Bebê Hipoglós Amêndoas 2011 – Analisando o sistema de votação</title>
		<link>http://feedproxy.google.com/~r/neomatrixtech/~3/duhg_R752Fg/</link>
		<comments>http://leonelfraga.com/neomatrixtech/?p=788#comments</comments>
		<pubDate>Thu, 10 Nov 2011 16:11:37 +0000</pubDate>
		<dc:creator>Leonel Fraga de Oliveira</dc:creator>
				<category><![CDATA[Absurdos]]></category>
		<category><![CDATA[Engenharia de Sistemas]]></category>
		<category><![CDATA[Opinião]]></category>
		<category><![CDATA[Bebê Hipoglós]]></category>
		<category><![CDATA[Sistemas de Votação online]]></category>

		<guid isPermaLink="false">http://leonelfraga.com/neomatrixtech/?p=788</guid>
		<description><![CDATA[Olá caro leitor do NM Tech! Você, como desenvolvedor de sistemas, já precisou desenvolver um sistema de votação eletrônica pela Web? Se sim, você já parou para pensar qual seria a carga de acessos deste sistema e uma forma de permitir uma votação segura e confiável? Algumas amigas minhas inscreveram seus filhos para participarem do]]></description>
			<content:encoded><![CDATA[<p><a href="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/11/image.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Hotsite Bebê Hipoglós 2011" border="0" alt="Hotsite Bebê Hipoglós 2011" src="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/11/image_thumb.png" width="324" height="215" /></a></p>
<p>Olá caro leitor do NM Tech! Você, como desenvolvedor de sistemas, já precisou desenvolver um sistema de votação eletrônica pela Web? Se sim, você já parou para pensar qual seria a carga de acessos deste sistema e uma forma de permitir uma votação segura e confiável?</p>
<p>Algumas amigas minhas inscreveram seus filhos para participarem do Concurso “<strong><font color="#ff0000">Bebê Hipoglós 2011</font></strong>”, onde a criança irá ser o “bebê-propaganda” do referido produto. Para votar basta entrar no site <a title="http://bebehipoglos2011.com.br/" href="http://bebehipoglos2011.com.br/">http://bebehipoglos2011.com.br/</a>, escolher o bebê, clicar no ícone “Votar”, preencher um <em>captcha</em> e dar OK. Sim, é só isso mesmo.</p>
<p>Ah, Léo.. você fazendo jabá da promoção aqui no NM Tech? Epa, calma lá, rapá! Agora vou responder as duas perguntas que fiz acima: Sim, eu já desenvolvi um sistema de votação eletrônica que era aberto ao público e que a carga era moderada. E a votação era segura e confiável graças a alguns mecanismos que foram implementados.</p>
<p>Continuando no caso do site <strong><font color="#ff0000">Bebê Hipoglós 2011</font></strong>, a página da campanha no Facebook (<a href="http://www.facebook.com/bebehipoglos">http://www.facebook.com/bebehipoglos</a>) está cheia de<strong> comentários negativos à respeito do <font color="#ff0000">sistema de votação</font></strong>. Muitas pessoas estão reclamando que o site cai toda hora e que em pouco tempo de promoção existem crianças com mais de 10 mil votos.</p>
<p>Sim, constatei por mim mesmo que o sistema está sobrecarregado, e uma das coisas que me chamaram a atenção nos meus comentários foi:</p>
<blockquote><p>“Olá pessoal estou desde as 07:15 da manhã consegui votar 511 x na minha filha mas realmente esta muito complicado votar”</p>
</blockquote>
<p>Isso mesmo, a MESMA pessoa votando várias vezes em seu bebê. Então COMO as pessoas querem que a votação seja confiável e que o sistema não tenha sobrecarga? Não foi só essa pessoa que teve essa <em><strong>ideota</strong></em> de <em><strong><font color="#ff0000">jênio*</font></strong></em>, né?</p>
<p>E para votar, como eu disse anteriormente, o sistema pede para preencher um <em>captcha</em>, muito tosco, facilmente decodificável por ferramentas de <em><abbr title="Reconhecimento Óptico de Caracteres">OCR</abbr></em>, e como sabemos,<strong> já existem robôs que possuem esta funcionalidade</strong>. Com um (um não, vários&#8230; muitas pessoas podem ter tido essa idéia) robô desses fazendo várias requisições ao servidor Web, não há estrutura que aguente.</p>
<p>Nenhuma forma de identificação do votante é requerida.</p>
<p>No sistema de eleição que fiz, antes de votar o usuário tinha que preencher seus dados, confirmá-los no sistema e aí sim escolher seu candidato. Tal sistema NÃO permite que o mesmo usuário vote novamente. E mesmo com o cadastro, o voto era computado de forma totalmente anônima, sendo IMPOSSÍVEL saber quem votou em quem.</p>
<p>Por que não implementar, como disse um comentarista no Facebook, um passo onde o usuário registraria alguns dados pessoais e o CPF (obrigatório) antes de votar e permitisse apenas UM voto por CPF? Aí sim aumentaria e muito a confiabilidade do sistema e a farra dos robôs diminuiria bastante. Bloqueio de voto por IP não resolveria, já que muitas casas hoje em dia já contam com uma pequena rede onde a conexão à Internet é compartilhada.</p>
<p>Quer ver como isso é uma coisa SIMPLES de ser implementada? Vou mostrar um modelo básico, com 2 tabelas e os passos necessários (não código) para realizar a votação:<a href="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/11/image1.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/11/image_thumb1.png" width="198" height="108" /></a></p>
<p>Veja só: apenas duas tabelas, e não há ligação nenhuma entre elas. Para gravar um voto, crie uma <em>StoredProcedure</em> no banco de dados com os parâmetros de entrada do eleitor (Nome, CPF, Email e o ID do candidato que ele votou) Coloque o modo de isolação de transação no modo <em>Repeatable Read</em> (recomendado), abra uma transação, faça um <em>select</em> no eleitor baseando-se no CPF para verificar se ele já já existe na tabela “<em>Eleitor</em>” (se sim, dispare uma exceção informando a interface desta situação), dê um <em>select</em> no candidato baseando-se no ID passado como entrada (para travar o registro, já que isolamos a transação como <em>Repeatable Read</em>), faça um <em>Update</em> no <em>Candidato</em>, incrementando 1 no campo “<em>QtdVotos</em>”, faça o <em>Insert</em> na tabela Eleitor e dê <em>commit</em> na transação.</p>
<p>Simples assim, não? Ah, e antes que venham com o “Ah, mas o DBA ou outra pessoa pode alterar o campo <em>QtdVotos</em> e tal&#8230;”, não estou contando que esta intervenção humana venha a acontecer, por que daí já é caso de Justiça e tal, são outros quinhentos.</p>
<p>Isso vai burocratizar o processo de votação? SIM. E este é o preço a pagar por uma maior confiabilidade no sistema de votação. O que é mais vantajoso para a sua empresa: Um sistema que é um pouco “chato” para votar porém os usuários falam que é confiável ou um totalmente escancarado dando margem para inúmeras reclamações quanto a idoneidade do concurso? Lembrem-se que um comentário negativo viaja milhares de vezes mais rápido que um positivo! E se não fossem pelos comentários negativos (que minhas amigas que inscreveram seus bebês fizeram e fui conferir o sistema), nem escreveria este post!</p>
<p>Eu não me conformo como um sistema que dá uma premiação em dinheiro, mexe com as emoções de milhares de mães/pais que cadastraram seus filhos (sim, porque as crianças ainda não entendem) na expectativa de vê-los em um comercial de TV e se tornarem famosos, ser modelado de uma forma TÃO TOSCA???</p>
<p>Um abraço!!!</p>
<p><em>*com “J” de JUMENTO <img src='http://leonelfraga.com/neomatrixtech/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </em></p>
<div id="crp_related"><h3>Artigos Relacionados:</h3><ul><li><a href="http://leonelfraga.com/neomatrixtech/?p=773" rel="bookmark" class="crp_title">Controle de permiss&otilde;es utilizando opera&ccedil;&atilde;o bit a bit</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=750" rel="bookmark" class="crp_title">Apps do Google nos Galaxy S e 5 da CLARO? CLARO que N&Atilde;O! #CLAROFAIL</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=777" rel="bookmark" class="crp_title">Rapidinha: CustomValidators n&atilde;o disparam o ServerValidate quando est&aacute; vazio? Veja o que pode ser aqui!</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=756" rel="bookmark" class="crp_title">Componentes gr&aacute;tis &eacute; bom, mas&#8230;</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=741" rel="bookmark" class="crp_title">Nokia e Microsoft: O in&iacute;cio de um casamento</a></li></ul></div><p><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D788&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=recommend&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D788&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=recommend&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D788&amp;counturl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D788&amp;count=horizontal&amp;text=Vota%26ccedil%3B%26atilde%3Bo%20Beb%26ecirc%3B%20Hipogl%26oacute%3Bs%20Am%26ecirc%3Bndoas%202011%20%26%238211%3B%20Analisando%20o%20sistema%20de%20vota%26ccedil%3B%26atilde%3Bo" scrolling="no" style="border:none;overflow:hidden;width:130px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D788&amp;counturl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D788&amp;count=horizontal&amp;text=Vota%26ccedil%3B%26atilde%3Bo%20Beb%26ecirc%3B%20Hipogl%26oacute%3Bs%20Am%26ecirc%3Bndoas%202011%20%26%238211%3B%20Analisando%20o%20sistema%20de%20vota%26ccedil%3B%26atilde%3Bo" scrolling="no" style="border:none;overflow:hidden;width:130px;height:20px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D788&amp;size=medium&amp;count=true" scrolling="no" style="border:none;overflow:hidden;width:90px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D788&amp;size=medium&amp;count=true" scrolling="no" style="border:none;overflow:hidden;width:90px;height:20px"></iframe><!--<![endif]--><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D788&amp;linkname=Vota%26ccedil%3B%26atilde%3Bo%20Beb%26ecirc%3B%20Hipogl%26oacute%3Bs%20Am%26ecirc%3Bndoas%202011%20%26%238211%3B%20Analisando%20o%20sistema%20de%20vota%26ccedil%3B%26atilde%3Bo" title="Delicious" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D788&amp;linkname=Vota%26ccedil%3B%26atilde%3Bo%20Beb%26ecirc%3B%20Hipogl%26oacute%3Bs%20Am%26ecirc%3Bndoas%202011%20%26%238211%3B%20Analisando%20o%20sistema%20de%20vota%26ccedil%3B%26atilde%3Bo" title="Google Reader" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D788&amp;linkname=Vota%26ccedil%3B%26atilde%3Bo%20Beb%26ecirc%3B%20Hipogl%26oacute%3Bs%20Am%26ecirc%3Bndoas%202011%20%26%238211%3B%20Analisando%20o%20sistema%20de%20vota%26ccedil%3B%26atilde%3Bo" title="Orkut" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_live" href="http://www.addtoany.com/add_to/live?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D788&amp;linkname=Vota%26ccedil%3B%26atilde%3Bo%20Beb%26ecirc%3B%20Hipogl%26oacute%3Bs%20Am%26ecirc%3Bndoas%202011%20%26%238211%3B%20Analisando%20o%20sistema%20de%20vota%26ccedil%3B%26atilde%3Bo" title="Messenger" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/live.png" width="16" height="16" alt="Messenger"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D788&amp;title=Vota%26ccedil%3B%26atilde%3Bo%20Beb%26ecirc%3B%20Hipogl%26oacute%3Bs%20Am%26ecirc%3Bndoas%202011%20%26%238211%3B%20Analisando%20o%20sistema%20de%20vota%26ccedil%3B%26atilde%3Bo" id="wpa2a_4"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://leonelfraga.com/neomatrixtech/?feed=rss2&amp;p=788</wfw:commentRss>
		<slash:comments>13</slash:comments>
		<feedburner:origLink>http://leonelfraga.com/neomatrixtech/?p=788</feedburner:origLink></item>
		<item>
		<title>Calculando idade via SQL Server (UDF)</title>
		<link>http://feedproxy.google.com/~r/neomatrixtech/~3/4eC9vEfx-f8/</link>
		<comments>http://leonelfraga.com/neomatrixtech/?p=783#comments</comments>
		<pubDate>Sat, 05 Nov 2011 00:19:49 +0000</pubDate>
		<dc:creator>Leonel Fraga de Oliveira</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Cálculo de Idade]]></category>
		<category><![CDATA[UDF]]></category>

		<guid isPermaLink="false">http://leonelfraga.com/neomatrixtech/?p=783</guid>
		<description><![CDATA[Em nossos sistemas muitas vezes precisamos consultar a idade de uma pessoa para as mais diversas finalidades. A conta é simples: diferença de anos entre a data atual e a data de nascimento, certo? Eu diria que em partes, dependendo de como o cálculo é feito. Em se tratando apenas de SQL Server o nosso]]></description>
			<content:encoded><![CDATA[<p>Em nossos sistemas muitas vezes precisamos consultar a idade de uma pessoa para as mais diversas finalidades. A conta é simples: diferença de anos entre a data atual e a data de nascimento, certo?</p>
<p>Eu diria que em partes, dependendo de como o cálculo é feito. Em se tratando apenas de SQL Server o nosso primeiro impulso é calcular essa diferença usando a função datediff(), passando como argumentos que queremos o resultado em anos e as datas envolvidas.</p>
<p>Calcular idade NÃO é apenas uma simples diferença entre o componente ANO das datas, que é o que a função datediff faz se passarmos como primeiro argumento que queremos a diferença em anos. Nesse caso o cálculo da diferença não leva em consideração os dias e os meses, fundamentais para o cálculo de idade. A questão que devemos ter em mente é: “A pessoa já completou determinada idade no dia atual?”</p>
<p>Para facilitar este cálculo montei uma UDF em Transact-SQL, que retorna um valor escalar que é a idade baseada na data de nascimento informada e no dia atual, que leva em consideração que tal data de aniversário foi atingida ou não. Vamos a ela:</p>
<pre class="brush:sql">create function [dbo].[CalculaIdade](@DataNascimento Datetime)
returns int
AS
BEGIN
	declare @idade int;
	--Coloca o dia e mês da data de nascimento no ano atual
	declare @DataNormalizada datetime;
	--Volta a data em 01/01 do ano atual sem utilizar concatenação de strings (evita lembrar usar o SET DATEFORMAT)
	set @DataNormalizada = dateadd(dd,0,datediff(dd,0,dateadd(dd,(-1)*day(getdate()) + 1,dateadd(mm,(-1)*month(getdate()) + 1,getdate()))));
	--Agora sim, calcula a data de aniversário no ano atual
	set @DataNormalizada = dateadd(dd,day(@DataNascimento) -1,dateadd(mm,month(@DataNascimento) -1,@DataNormalizada));

	--Calcula a idade em anos (o SQL Server irá apenas subtrair o componente ANO, sem considerar os dias)
	set @idade = datediff(yy,@DataNascimento,getdate());

	--se ainda não chegou no dia de nascimento, subtrai 1 da idade, já que ainda não estará completa.
	--O cálculo acima com datediff não leva isto em consideração.
	if( @DataNormalizada &gt; getdate())
	begin
		set @idade = @idade - 1;
	end
	return @idade;
END
GO</pre>
<p>Primeiramente declaramos uma variável @DataNormalizada, que nada mais é que a data de aniversário no ano corrente e para calculá-la sem concatenar strings (para não nos preocuparmos com formatação de data) “voltamos” o ano atual para 01/01 e em seguida acrescentamos o mês e o dia da data de aniversário. Nessa adição, necessitamos subtrair 1 do dia e do mês porque como começamos o valor em “1” e não em “0”, necessitamos compensar essa diferença.</p>
<p>Em seguida fazemos o que o nosso impulso manda: calculamos a diferença em anos utilizando a função datediff().</p>
<p>Agora que vem o pulo do gato: Lembra que calculamos a data de aniversário da pessoa no ano corrente? Pois bem: Verificamos se a data de aniversário é maior que a data atual. Se sim, significa que a pessoa ainda não fez aniversário e que a idade em anos calculada acima está incompleta, portanto, temos que subtrair 1 ano da idade.</p>
<p>Esse pequeno detalhe do cálculo da idade é crucial (sim, dependendo da área de negócio, exemplos como sistemas de gestão de saúde, a idade correta de uma pessoa é muito importante e é um dado dinâmico sempre calculado a partir da data de nascimento), portanto, preste MUITA atenção e bora utilizar a função acima para calcular!</p>
<div id="crp_related"><h3>Artigos Relacionados:</h3><ul><li><a href="http://leonelfraga.com/neomatrixtech/?p=716" rel="bookmark" class="crp_title">Cuidado com convers&atilde;o de dados no SQL Server</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=731" rel="bookmark" class="crp_title">Auditando alterações de dados no SQL Server de forma simples</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=687" rel="bookmark" class="crp_title">Modelagem b&aacute;sica de Webservices</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=484" rel="bookmark" class="crp_title">Configurações Regionais: Parece algo sem importância, mas…</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=464" rel="bookmark" class="crp_title">Uma situação não prevista: #FAIL</a></li></ul></div><p><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D783&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=recommend&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D783&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=recommend&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D783&amp;counturl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D783&amp;count=horizontal&amp;text=Calculando%20idade%20via%20SQL%20Server%20%28UDF%29" scrolling="no" style="border:none;overflow:hidden;width:130px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D783&amp;counturl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D783&amp;count=horizontal&amp;text=Calculando%20idade%20via%20SQL%20Server%20%28UDF%29" scrolling="no" style="border:none;overflow:hidden;width:130px;height:20px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D783&amp;size=medium&amp;count=true" scrolling="no" style="border:none;overflow:hidden;width:90px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D783&amp;size=medium&amp;count=true" scrolling="no" style="border:none;overflow:hidden;width:90px;height:20px"></iframe><!--<![endif]--><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D783&amp;linkname=Calculando%20idade%20via%20SQL%20Server%20%28UDF%29" title="Delicious" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D783&amp;linkname=Calculando%20idade%20via%20SQL%20Server%20%28UDF%29" title="Google Reader" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D783&amp;linkname=Calculando%20idade%20via%20SQL%20Server%20%28UDF%29" title="Orkut" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_live" href="http://www.addtoany.com/add_to/live?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D783&amp;linkname=Calculando%20idade%20via%20SQL%20Server%20%28UDF%29" title="Messenger" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/live.png" width="16" height="16" alt="Messenger"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D783&amp;title=Calculando%20idade%20via%20SQL%20Server%20%28UDF%29" id="wpa2a_6"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://leonelfraga.com/neomatrixtech/?feed=rss2&amp;p=783</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://leonelfraga.com/neomatrixtech/?p=783</feedburner:origLink></item>
		<item>
		<title>DateTime, Serialização de DataSets em WCF, Horário de Verão… uma combinação com muitas surpresas!</title>
		<link>http://feedproxy.google.com/~r/neomatrixtech/~3/89-ycahQ2g8/</link>
		<comments>http://leonelfraga.com/neomatrixtech/?p=780#comments</comments>
		<pubDate>Thu, 18 Aug 2011 01:48:45 +0000</pubDate>
		<dc:creator>Leonel Fraga de Oliveira</dc:creator>
				<category><![CDATA[.NET Geral]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[DateTime]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://leonelfraga.com/neomatrixtech/?p=780</guid>
		<description><![CDATA[Veja a seguinte situação: Você possui um serviço WCF que está hospedado em um servidor e vários clientes que acessam este serviço. Este serviço possui um método que retorna um DataSet, serializando-o através do WCF e a classe cliente exibe o resultado em tela. Pois bem, você possui neste DataSet uma (ou mais) tabela com]]></description>
			<content:encoded><![CDATA[<p>Veja a seguinte situação: Você possui um serviço WCF que está hospedado em um servidor e vários clientes que acessam este serviço. Este serviço possui um método que retorna um DataSet, serializando-o através do WCF e a classe cliente exibe o resultado em tela.</p>
<p>Pois bem, você possui neste DataSet uma (ou mais) tabela com um campo DateTime, e no seu banco de dados está gravado o valor, por exemplo, 17/10/2011 08:00, mas a sua aplicação exibe o valor 17/10/2011 09:00.</p>
<p>O que!!! Quer dizer que a aplicação está exibindo este valor uma hora ADIANTADA? Exatamente isso, meu querido! Se fomos extrair este campo para uma variável DateTime e verificarmos o resultado do método IsDayLightSavingTime(), o mesmo retornará True, indicando que a data em questão cai no horário de verão.</p>
<p>Se fomos olhar isso mais a fundo na aplicação cliente, veremos que o valor já considerando o horário de verão (no nosso caso, 1 hora adiantada) já vem do próprio DataSet que recuperamos via WCF do servidor. Se a aplicação cliente extraísse esse valor diretamente do banco de dados ele seria exibido corretamente. E se quisermos exibir o valor do banco de dados, como faz?</p>
<p>Na máquina que executa a aplicação cliente, caso você esteja utilizando o Windows XP, dê um duplo clique no relógio, acesse a guia “Fuso Horário” e desmarque a opção “Ajustar automaticamente para o horário de verão” e o seu problema estará resolvido e a aplicação passará a exibir as horas conforme estão gravadas no banco de dados.</p>
<p>Maaaaaaaas&#8230; tem um pequeno grande porém nesta “solução”: E se este flag do horário de verão não puder ser desabilitado pelo usuário (permissões no sistema, entre outros) e não acho um meio na aplicação cliente de fazer as horas serem exibidas corretamente, sento e choro?</p>
<p>Sentar e chorar é uma hipótese dependendo de como você modelou a parte servidora do seu sistema. Mas a solução definitiva é a seguinte: Ao obter um DataSet do banco de dados, devemos modificar uma propriedade chamada DateTimeMode das colunas DateTime das tabelas deste DataSet para DataSetDateTime.Unespecified, que informa para o WCF não recalcular as datas para a zona de horário das aplicações clientes na hora da serialização.</p>
<p>Vamos ao código!</p>
<pre class="brush:csharp">public DataSet RetornaDataSet()
{
	DataSet ds = new DataSet();
	//Preencher o DataSet com os valores do banco de dados aqui

	//Agora, iremos modidicar as colunas DateTime das tabelas para ignorarem o recálculo de data/hora no momento da serialização WCF
	foreach (DataTable tabela in ds.Tables)
	{
		foreach (DataColumn coluna in tabela.Columns)
		{
			if ((coluna.DataType == typeof(DateTime)) || (coluna.DataType == typeof(DateTime?)))
			{
				coluna.DateTimeMode = DataSetDateTime.Unspecified;
			}
		}
	}
	return ds;
}</pre>
<p>Com este código modificamos todas as colunas com o tipo DateTime para que quando o DataSet for serializado via WCF, as datas não sejam recalculadas conforme a zona de tempo do usuário cliente (horário de verão, fuso-horáro, etc.).</p>
<p>É isso aí!</p>
<div id="crp_related"><h3>Artigos Relacionados:</h3><ul><li><a href="http://leonelfraga.com/neomatrixtech/?p=484" rel="bookmark" class="crp_title">Configurações Regionais: Parece algo sem importância, mas…</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=744" rel="bookmark" class="crp_title">Fazendo algo incomum: Zipando e Transmitindo DataSets grandes via XML (WebServices, WCF, outros).</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=716" rel="bookmark" class="crp_title">Cuidado com convers&atilde;o de dados no SQL Server</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=731" rel="bookmark" class="crp_title">Auditando alterações de dados no SQL Server de forma simples</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=783" rel="bookmark" class="crp_title">Calculando idade via SQL Server (UDF)</a></li></ul></div><p><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D780&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=recommend&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D780&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=recommend&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D780&amp;counturl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D780&amp;count=horizontal&amp;text=DateTime%2C%20Serializa%26ccedil%3B%26atilde%3Bo%20de%20DataSets%20em%20WCF%2C%20Hor%26aacute%3Brio%20de%20Ver%26atilde%3Bo%26%238230%3B%20uma%20combina%26ccedil%3B%26atilde%3Bo%20com%20muitas%20surpresas%21" scrolling="no" style="border:none;overflow:hidden;width:130px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D780&amp;counturl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D780&amp;count=horizontal&amp;text=DateTime%2C%20Serializa%26ccedil%3B%26atilde%3Bo%20de%20DataSets%20em%20WCF%2C%20Hor%26aacute%3Brio%20de%20Ver%26atilde%3Bo%26%238230%3B%20uma%20combina%26ccedil%3B%26atilde%3Bo%20com%20muitas%20surpresas%21" scrolling="no" style="border:none;overflow:hidden;width:130px;height:20px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D780&amp;size=medium&amp;count=true" scrolling="no" style="border:none;overflow:hidden;width:90px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D780&amp;size=medium&amp;count=true" scrolling="no" style="border:none;overflow:hidden;width:90px;height:20px"></iframe><!--<![endif]--><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D780&amp;linkname=DateTime%2C%20Serializa%26ccedil%3B%26atilde%3Bo%20de%20DataSets%20em%20WCF%2C%20Hor%26aacute%3Brio%20de%20Ver%26atilde%3Bo%26%238230%3B%20uma%20combina%26ccedil%3B%26atilde%3Bo%20com%20muitas%20surpresas%21" title="Delicious" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D780&amp;linkname=DateTime%2C%20Serializa%26ccedil%3B%26atilde%3Bo%20de%20DataSets%20em%20WCF%2C%20Hor%26aacute%3Brio%20de%20Ver%26atilde%3Bo%26%238230%3B%20uma%20combina%26ccedil%3B%26atilde%3Bo%20com%20muitas%20surpresas%21" title="Google Reader" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D780&amp;linkname=DateTime%2C%20Serializa%26ccedil%3B%26atilde%3Bo%20de%20DataSets%20em%20WCF%2C%20Hor%26aacute%3Brio%20de%20Ver%26atilde%3Bo%26%238230%3B%20uma%20combina%26ccedil%3B%26atilde%3Bo%20com%20muitas%20surpresas%21" title="Orkut" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_live" href="http://www.addtoany.com/add_to/live?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D780&amp;linkname=DateTime%2C%20Serializa%26ccedil%3B%26atilde%3Bo%20de%20DataSets%20em%20WCF%2C%20Hor%26aacute%3Brio%20de%20Ver%26atilde%3Bo%26%238230%3B%20uma%20combina%26ccedil%3B%26atilde%3Bo%20com%20muitas%20surpresas%21" title="Messenger" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/live.png" width="16" height="16" alt="Messenger"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D780&amp;title=DateTime%2C%20Serializa%26ccedil%3B%26atilde%3Bo%20de%20DataSets%20em%20WCF%2C%20Hor%26aacute%3Brio%20de%20Ver%26atilde%3Bo%26%238230%3B%20uma%20combina%26ccedil%3B%26atilde%3Bo%20com%20muitas%20surpresas%21" id="wpa2a_8"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://leonelfraga.com/neomatrixtech/?feed=rss2&amp;p=780</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://leonelfraga.com/neomatrixtech/?p=780</feedburner:origLink></item>
		<item>
		<title>Rapidinha: CustomValidators não disparam o ServerValidate quando está vazio? Veja o que pode ser aqui!</title>
		<link>http://feedproxy.google.com/~r/neomatrixtech/~3/G441eeOwBnw/</link>
		<comments>http://leonelfraga.com/neomatrixtech/?p=777#comments</comments>
		<pubDate>Sat, 13 Aug 2011 02:08:47 +0000</pubDate>
		<dc:creator>Leonel Fraga de Oliveira</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[CustomValidator]]></category>
		<category><![CDATA[Validação]]></category>

		<guid isPermaLink="false">http://leonelfraga.com/neomatrixtech/?p=777</guid>
		<description><![CDATA[Veja a seguinte situação: Você tem um campo em um WebForm que é obrigatório apenas em uma determinada condição. O mesmo campo, em outra condição NÃO é de preenchimento obrigatório. Você poderia usar um RequiredFieldValidator nele, certo? Errado! Um RequiredFieldValidator apenas irá disparar se o campo NÃO estiver preenchido. O que queremos é que numa]]></description>
			<content:encoded><![CDATA[<p>Veja a seguinte situação: Você tem um campo em um <em>WebForm</em> que é obrigatório apenas em uma determinada condição. O mesmo campo, em outra condição NÃO é de preenchimento obrigatório. Você poderia usar um <strong><em>RequiredFieldValidator</em></strong> nele, certo?</p>
<p>Errado! Um <em>RequiredFieldValidator</em> apenas irá disparar se o campo NÃO estiver preenchido. O que queremos é que numa condição X em que um textbox esteja vazio, o validator execute, e em outra não.</p>
<p>Para isso podemos utilizar um <em><strong>CustomValidator</strong></em> e atribuir a propriedade de argumento de evento <em>IsValid</em> no evento <em>ServerValidate</em> para que seja <em>True</em> se as nossas condições forem obedecidas.</p>
<p>Porém (sempre tem um porém!) justamente quando você quer validar quando o&#160; campo está vazio utilizando um <em>CustomValidator</em> o evento <em><strong>ServerValidate</strong></em> não dispara nem a pau, mesmo você chamando diretamente o método<em> Validate()</em> do mesmo. E você não pode usar um <em>RequiredFieldValidator</em>. O que você faz, ajoelha e chora?</p>
<p>Com exceção do <em>RequiredFieldValidator</em>, TODOS os demais <em>validators</em> não executam quando um <em>textbox</em> na propriedade <em>ControlToValidate</em> está vazio. Este é um comportamento padrão. Vamos dar uma olhada na caixa de propriedades de um CompareValidator e um CustomValidator:</p>
<p><a href="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/08/image.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Caixa de Propriedades de um CustomValidator x CompareValidator" border="0" alt="Caixa de Propriedades de um CustomValidator x CompareValidator" src="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/08/image_thumb.png" width="573" height="315" /></a></p>
<p>Além das propriedades inerentes a cada tipo de <em>Validator</em>, temos uma propriedade curiosa no <em>CustomValidator</em>: <strong><em><font color="#ff0000">ValidateEmptyText</font></em></strong>. Se colocarmos ela em <em>True</em>, o evento <em>ServerValidate</em> irá ser executado ao verificar a propriedade <em>IsValid</em> da página ou outra rotina de validação. Os outros tipos de <em>validator</em> não validam quando o texto está vazio. Com isso podemos testar, por exemplo, a obrigatoriedade de um campo em determinada condição em nosso sistema.</p>
<p>Dica fácil essa, né? Quando pesquisei sobre o assunto, vi uma sugestão em que era necessário derivar uma classe do “pai” dos <em>validators</em>!</p>
<p>Espero que esta dica seja de bom proveito <img src='http://leonelfraga.com/neomatrixtech/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div id="crp_related"><h3>Artigos Relacionados:</h3><ul><li><a href="http://leonelfraga.com/neomatrixtech/?p=325" rel="bookmark" class="crp_title">Conciliando Janelas Modais e ASP.NET Validators</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=773" rel="bookmark" class="crp_title">Controle de permiss&otilde;es utilizando opera&ccedil;&atilde;o bit a bit</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=708" rel="bookmark" class="crp_title">Fechando uma janela antes de carreg&aacute;-la (Windows Forms)</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=444" rel="bookmark" class="crp_title">Momento POG: Submetendo Textboxes Readonly alterados via JavaScript</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=788" rel="bookmark" class="crp_title">Vota&ccedil;&atilde;o Beb&ecirc; Hipogl&oacute;s Am&ecirc;ndoas 2011 &#8211; Analisando o sistema de vota&ccedil;&atilde;o</a></li></ul></div><p><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D777&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=recommend&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D777&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=recommend&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D777&amp;counturl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D777&amp;count=horizontal&amp;text=Rapidinha%3A%20CustomValidators%20n%26atilde%3Bo%20disparam%20o%20ServerValidate%20quando%20est%26aacute%3B%20vazio%3F%20Veja%20o%20que%20pode%20ser%20aqui%21" scrolling="no" style="border:none;overflow:hidden;width:130px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D777&amp;counturl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D777&amp;count=horizontal&amp;text=Rapidinha%3A%20CustomValidators%20n%26atilde%3Bo%20disparam%20o%20ServerValidate%20quando%20est%26aacute%3B%20vazio%3F%20Veja%20o%20que%20pode%20ser%20aqui%21" scrolling="no" style="border:none;overflow:hidden;width:130px;height:20px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D777&amp;size=medium&amp;count=true" scrolling="no" style="border:none;overflow:hidden;width:90px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D777&amp;size=medium&amp;count=true" scrolling="no" style="border:none;overflow:hidden;width:90px;height:20px"></iframe><!--<![endif]--><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D777&amp;linkname=Rapidinha%3A%20CustomValidators%20n%26atilde%3Bo%20disparam%20o%20ServerValidate%20quando%20est%26aacute%3B%20vazio%3F%20Veja%20o%20que%20pode%20ser%20aqui%21" title="Delicious" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D777&amp;linkname=Rapidinha%3A%20CustomValidators%20n%26atilde%3Bo%20disparam%20o%20ServerValidate%20quando%20est%26aacute%3B%20vazio%3F%20Veja%20o%20que%20pode%20ser%20aqui%21" title="Google Reader" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D777&amp;linkname=Rapidinha%3A%20CustomValidators%20n%26atilde%3Bo%20disparam%20o%20ServerValidate%20quando%20est%26aacute%3B%20vazio%3F%20Veja%20o%20que%20pode%20ser%20aqui%21" title="Orkut" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_live" href="http://www.addtoany.com/add_to/live?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D777&amp;linkname=Rapidinha%3A%20CustomValidators%20n%26atilde%3Bo%20disparam%20o%20ServerValidate%20quando%20est%26aacute%3B%20vazio%3F%20Veja%20o%20que%20pode%20ser%20aqui%21" title="Messenger" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/live.png" width="16" height="16" alt="Messenger"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D777&amp;title=Rapidinha%3A%20CustomValidators%20n%26atilde%3Bo%20disparam%20o%20ServerValidate%20quando%20est%26aacute%3B%20vazio%3F%20Veja%20o%20que%20pode%20ser%20aqui%21" id="wpa2a_10"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://leonelfraga.com/neomatrixtech/?feed=rss2&amp;p=777</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://leonelfraga.com/neomatrixtech/?p=777</feedburner:origLink></item>
		<item>
		<title>Vídeo Demonstração: Phalanger – Compilador PHP para .NET Framework 4.0</title>
		<link>http://feedproxy.google.com/~r/neomatrixtech/~3/kFMbs6ntqIY/</link>
		<comments>http://leonelfraga.com/neomatrixtech/?p=774#comments</comments>
		<pubDate>Sat, 06 Aug 2011 02:26:00 +0000</pubDate>
		<dc:creator>Leonel Fraga de Oliveira</dc:creator>
				<category><![CDATA[.NET Geral]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://leonelfraga.com/neomatrixtech/?p=774</guid>
		<description><![CDATA[Quem diria&#8230; pensei que algo assim não existiria: um compilador da linguagem PHP para a plataforma .NET! Assistam ao vídeo contendo uma pequena demonstração deste compilador. Vídeo com uma pequena demonstração do Phalanger Caso queiram testá-lo por si mesmos, visitem o site http://phalanger.codeplex.com/ Artigos Relacionados:V&#237;deo Tutorial: Gravando um set no Traktor 2 + Audio 8]]></description>
			<content:encoded><![CDATA[<p>Quem diria&#8230; pensei que algo assim não existiria: um compilador da linguagem PHP para a plataforma .NET!</p>
<p>Assistam ao vídeo contendo uma pequena demonstração deste compilador.</p>
<div style="padding-bottom: 0px; margin: 0px auto; padding-left: 0px; width: 448px; padding-right: 0px; display: block; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:a6efc9a8-9976-4200-a100-38684290b45d" class="wlWriterEditableSmartContent">
<div><object width="448" height="252"><param name="movie" value="http://www.youtube.com/v/xhkUGIIOR04?hl=en&amp;hd=1"></param><embed src="http://www.youtube.com/v/xhkUGIIOR04?hl=en&amp;hd=1" type="application/x-shockwave-flash" width="448" height="252"></embed></object></div>
<div style="width:448px;clear:both;font-size:.8em">Vídeo com uma pequena demonstração do Phalanger</div>
</div>
<p>Caso queiram testá-lo por si mesmos, visitem o site <a href="http://phalanger.codeplex.com/">http://phalanger.codeplex.com/</a></p>
<div id="crp_related"><h3>Artigos Relacionados:</h3><ul><li><a href="http://leonelfraga.com/neomatrixtech/?p=753" rel="bookmark" class="crp_title">V&iacute;deo Tutorial: Gravando um set no Traktor 2 + Audio 8 DJ utilizando Mixer Externo</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=341" rel="bookmark" class="crp_title">Screencast: Clonando HD&#8217;s via rede com o UDPCast</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=468" rel="bookmark" class="crp_title">Este é o iPhone Killer</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=304" rel="bookmark" class="crp_title">Upload em ASP.NET com jqModal e Efeitos Ajax Pt. 2 &#8211; Gravando os arquivos em Banco de Dados</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=274" rel="bookmark" class="crp_title">jQuery (jqModal) e ASP.NET + AJAX: Resolvendo alguns probleminhas</a></li></ul></div><p><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D774&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=recommend&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D774&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=recommend&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D774&amp;counturl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D774&amp;count=horizontal&amp;text=V%26iacute%3Bdeo%20Demonstra%26ccedil%3B%26atilde%3Bo%3A%20Phalanger%20%26%238211%3B%20Compilador%20PHP%20para%20.NET%20Framework%204.0" scrolling="no" style="border:none;overflow:hidden;width:130px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D774&amp;counturl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D774&amp;count=horizontal&amp;text=V%26iacute%3Bdeo%20Demonstra%26ccedil%3B%26atilde%3Bo%3A%20Phalanger%20%26%238211%3B%20Compilador%20PHP%20para%20.NET%20Framework%204.0" scrolling="no" style="border:none;overflow:hidden;width:130px;height:20px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D774&amp;size=medium&amp;count=true" scrolling="no" style="border:none;overflow:hidden;width:90px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D774&amp;size=medium&amp;count=true" scrolling="no" style="border:none;overflow:hidden;width:90px;height:20px"></iframe><!--<![endif]--><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D774&amp;linkname=V%26iacute%3Bdeo%20Demonstra%26ccedil%3B%26atilde%3Bo%3A%20Phalanger%20%26%238211%3B%20Compilador%20PHP%20para%20.NET%20Framework%204.0" title="Delicious" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D774&amp;linkname=V%26iacute%3Bdeo%20Demonstra%26ccedil%3B%26atilde%3Bo%3A%20Phalanger%20%26%238211%3B%20Compilador%20PHP%20para%20.NET%20Framework%204.0" title="Google Reader" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D774&amp;linkname=V%26iacute%3Bdeo%20Demonstra%26ccedil%3B%26atilde%3Bo%3A%20Phalanger%20%26%238211%3B%20Compilador%20PHP%20para%20.NET%20Framework%204.0" title="Orkut" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_live" href="http://www.addtoany.com/add_to/live?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D774&amp;linkname=V%26iacute%3Bdeo%20Demonstra%26ccedil%3B%26atilde%3Bo%3A%20Phalanger%20%26%238211%3B%20Compilador%20PHP%20para%20.NET%20Framework%204.0" title="Messenger" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/live.png" width="16" height="16" alt="Messenger"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D774&amp;title=V%26iacute%3Bdeo%20Demonstra%26ccedil%3B%26atilde%3Bo%3A%20Phalanger%20%26%238211%3B%20Compilador%20PHP%20para%20.NET%20Framework%204.0" id="wpa2a_12"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://leonelfraga.com/neomatrixtech/?feed=rss2&amp;p=774</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://leonelfraga.com/neomatrixtech/?p=774</feedburner:origLink></item>
		<item>
		<title>Controle de permissões utilizando operação bit a bit</title>
		<link>http://feedproxy.google.com/~r/neomatrixtech/~3/n1NURN8firs/</link>
		<comments>http://leonelfraga.com/neomatrixtech/?p=773#comments</comments>
		<pubDate>Fri, 29 Jul 2011 03:29:54 +0000</pubDate>
		<dc:creator>Leonel Fraga de Oliveira</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Operações Bit a Bit]]></category>
		<category><![CDATA[Permissões]]></category>

		<guid isPermaLink="false">http://leonelfraga.com/neomatrixtech/?p=773</guid>
		<description><![CDATA[Olá meu querido! Os posts por aqui estão escassos, sei. Mas, agora que tal uma coisa interessante do ponto de vista técnico, hein!? Para fazer um controle de permissões básico com as quatro permissões fundamentais em um sistema (Visualização, Inclusão, Alteração e Exclusão) quantos campos são necessários em uma tabela de banco de dados? No]]></description>
			<content:encoded><![CDATA[<p>Olá meu querido! Os posts por aqui estão escassos, sei. Mas, agora que tal uma coisa interessante do ponto de vista técnico, hein!?</p>
<p>Para fazer um <strong>controle de permissões básico</strong> com as <strong>quatro permissões fundamentais</strong> em um sistema (<font color="#ff0000">Visualização, Inclusão, Alteração e Exclusão</font>) quantos campos são necessários em uma tabela de banco de dados? No mínimo quatro, você poderia dizer.</p>
<p>Vamos fazer uma modelagem de uma tabela que armazena a relação entre perfis de usuários e módulos de um sistema:</p>
<p><a href="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/07/image.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/07/image_thumb.png" width="492" height="145" /></a></p>
<p>Basicamente criamos um campo <em>booleano</em> para cada permissão básica. Para verificar se um usuário de determinado perfil tem permissão em um módulo, basta puxarmos o ID do módulo, o ID do perfil do usuário, fazer uma consulta à base de dados (ou em algum local onde estas permissões são guardadas em cache &#8211; o que melhora o desempenho) e verificarmos se a permissão adequada tem valor Verdadeiro ou Falso.</p>
<p>Agora pensa uma coisa comigo: Não é fácil para um usuário qualquer entrar no banco de dados e alterar a permissão? Sim sim, isso é possível e existe uma forma de “ofuscar” as permissões armazenadas em banco de dados:<font color="#ff0000"> gravar TODO o conjunto de permissões como um único campo do tipo Integer e extrair dele as permissões utilizando operações bit a bit dentro da aplicação</font>. Como faz, com mágica?</p>
<p>Mágica não, meu querido! Faz-se com Matemática! Que tal pegarmos aquelas aulinhas no começo da faculdade sobre operações booleanas e aplicá-las em algo mais “palpável”?</p>
<p>Primeiro vamos remodelar a nossa base de dados, onde no lugar de quatro campos booleanos de permissões teremos apenas um inteiro que gravará todo o conjunto (vamos utilizar apenas as quatro permissões fundamentais para ficar mais didático <img src='http://leonelfraga.com/neomatrixtech/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ).</p>
<p><a href="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/07/export.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="export" border="0" alt="export" src="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/07/export_thumb.jpg" width="488" height="98" /></a></p>
<p>Ah, já sei! Vamos atribuir “1” para Visualização, “2” para Inclusão, “3” para Alteração e “4” para Exclusão, né safadinho! Na na ni nã NÃO! Isto é muito feio! hehe.</p>
<p>Não vamos pensar no campo <em>ConjuntoPermissões</em> como um mero inteiro. Dependendo do banco de dados (e da linguagem que iremos utilizar, que no nosso caso é &#8211; adivinha &#8211; o C#), o tamanho físico de um campo do tipo Integer é de 4 bytes, 32 bits. <strong>Com isso podemos guardar até 32 permissões em um único campo</strong>!</p>
<p>Vamos ver a matemática da coisa agora:</p>
<p>Iremos utilizar 4 bits para guardar o nosso conjunto de permissões. Para ficar mais fácil de entender, vamos desenhar:</p>
<p><a href="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/07/image1.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/07/image_thumb1.png" width="184" height="167" /></a></p>
<p>No esquema acima temos o número 15 representado no sistema binário. Cada bit representa uma permissão. Um bit ligado significa permissão concedida. Para revogá-la, basta desligarmos o bit correspondente. Note que cada bit tem um “peso”, e que da direita para a esquerda esse peso corresponde a uma potência de 2. Dois elevado a zero até dois elevado a três.</p>
<p>Vamos representar neste esquema um usuário apenas com permissões de Inclusão e Alteração:</p>
<p><a href="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/07/image2.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/07/image_thumb2.png" width="184" height="166" /></a></p>
<p>Neste conjunto de permissões apenas o segundo e o terceiro bit (contando da direita para a esquerda) estão ligados. Vamos saber agora como extrair as permissões de um usuário neste esquema.</p>
<p>Como eu disse acima, cada bit tem o seu peso representado por uma potência de 2. Vamos representar cada uma das permissões seguido o mesmo modelo que fizemos acima:</p>
<p><a href="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/07/image3.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/07/image_thumb3.png" width="227" height="112" /></a></p>
<p>Para descobrir se um usuário tem determinada permissão, fazemos uma<strong><font color="#ff0000"> operação <em>“AND” bit a bit</em></font></strong> entre o conjunto de permissões e o valor da permissão desejada e verificar se o resultado desta operação é <strong>MAIOR que zero</strong>. Vamos verificar a permissão de Alteração fazendo um “AND” bit a bit utilizando os dois esquemas acima:</p>
<p><a href="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/07/image4.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/07/image_thumb4.png" width="240" height="62" /></a></p>
<p>Fazendo essa operação (o “AND” equivale a uma multiplicação, mas fique atento que fizemos a multiplicação entre os bits e não com o inteiro) vemos que o resultado é exatamente aquele bit que coincide com o que queremos procurar, e que o resultado final é maior do que zero. Com isso verificamos que o usuário tem a permissão adequada. Que tal vermos a permissão de Exclusão?</p>
<p><a href="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/07/image5.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/07/image_thumb5.png" width="240" height="58" /></a></p>
<p>Como vimos no esquema, o resultado do “AND” bit a bit deu zero, ou seja, o usuário NÃO tem a permissão adequada.</p>
<p>Beleza, agora sei como extrair as permissões. E agora, como faço para montar o conjunto de permissões? Essa parte é bem simples: basta fazermos uma <font color="#ff0000"><strong><em>operação “OR” bit a bit</em></strong></font> entre as permissões que você quer dar para o usuário. Vamos dar as permissões de visualização, inclusão e alteração?</p>
<p><a href="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/07/image6.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/07/image_thumb6.png" width="240" height="112" /></a></p>
<p>A operação OR é equivalente a uma soma. Note que embora o resultado no sistema decimal seja equivalente (o que não é no caso do AND) fizemos esta conta bit a bit.</p>
<p>Depois dessa demonstração matemática, que tal aplicarmos este conceito em um programa C#? Serve qualquer banco de dados, então os detalhes de conexão fogem do escopo deste artigo.</p>
<p>Para representar as permissões você pode pensar em atribuir&#160; números igual ao que fizemos na demonstração matemática. 1 para Visualização, 2 para Inclusão e assim por diante, sempre crescendo em potência de 2. Vamos fazer isso, porém iremos representar as permissões através de uma <strong>enumeração</strong>. Além de ser uma boa prática de programação, o código ficará muito mais legível para os mantenedores. Assim:</p>
<pre class="brush:csharp">public enum PermissoesAcesso
{
	Visualizar = 1,
	Inserir = 2,
	Alterar = 4,
	Excluir = 8
}</pre>
<p>Note que encapsulamos os valores inteiros (números “mágicos”, em linguagem mais acadêmica) na enumeração <em>PermissoesAcesso</em>, muito mais legível.</p>
<p>Vamos criar um método que verifica se um determinado perfil passado como parâmetro tem a permissão que iremos indicar em outro parâmetro, para um módulo indicado em um terceiro parâmetro:</p>
<pre class="brush:csharp">public bool VerificaPermissao(int IdPerfil, PermissoesAcesso Permissao, int IdModulo)
{
	//...conecte com o BD aqui e crie os parâmetros...
	int ConjuntoPermissoes = (int)MeuCommand.getScalar(&quot;select ConjuntoPermissoes where IdPerfil = @PERFIL and IdModulo = @MODULO&quot;);
	//...feche a conexão...
	return (ConjuntoPermissoes &amp; (int)Permissao) &gt; 0;
}</pre>
<p>Para podermos fazer o “AND” bit a bit do conjunto de permissões (que é um Integer) com o valor inteiro da enumeração PermissoesAcesso, devemos fazer um cast da variável Permissao para inteiro.</p>
<p>Agora vamos criar um outro método, que recebe um <em>array</em> com as permissões que serão atribuidas a um perfil, o perfil e o módulo, monta o inteiro correspondente ao conjunto de permissões e salva na base de dados:</p>
<pre class="brush:csharp">public void SalvaPermissoes(int IdPerfil, int IdModulo, PermissoesAcesso[] Permissoes)
{
	int ConjuntoPermissoes = 0;
	foreach(PermissoesAcesso perm in Permissoes)
	{
		ConjuntoPermissoes |= (int)perm;
	}
	StringBuilder sql = new StringBuilder(&quot;update Permissoes set ConjuntoPermissoes = @PERM where IdPerfil = @PERFIL and IdModulo = @MODULO&quot;);
	//...Crie os parâmetros e execute o SQL.
}</pre>
<p>O laço foreach do código acima vai somando (vale a pena lembrar que um OR bit a bit é uma operação de soma), bit a bit, cada permissão do <em>array</em> e acumulando na variável <em>ConjuntoPermissoes</em>. Para fazer o OR bit a bit de um inteiro (variável <em>ConjuntoPermissoes</em>) com o inteiro da enumeração Permissoes, precisamos fazer um cast da segunda para inteiro. Exatamente como fizemos na demonstração matemática.</p>
<p>Para atribuir duas (ou mais) permissões de forma isolada, basta fazer o OR bit a bit entre elas:</p>
<pre class="brush:csharp">int Permissoes = (int)PermissoesAcesso.Visualizar | (int)PermissoesAcesso.Inserir;</pre>
<p>Com isso, vimos como melhorar o nosso sistema de armazenamento de permissões de forma eficiente e eficaz. Este recurso de operação bit a bit é utilizado, por exemplo, na API do Windows, ou até mesmo no C#, onde temos funções em que um parâmetro admite vários flags (representado por enumerações ou até mesmo constantes inteiras) concatenados. E essa concatenação dos flags é feita justamente com o operador OR bit a bit.</p>
<p>Um abraço!</p>
<div id="crp_related"><h3>Artigos Relacionados:</h3><ul><li><a href="http://leonelfraga.com/neomatrixtech/?p=777" rel="bookmark" class="crp_title">Rapidinha: CustomValidators n&atilde;o disparam o ServerValidate quando est&aacute; vazio? Veja o que pode ser aqui!</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=788" rel="bookmark" class="crp_title">Vota&ccedil;&atilde;o Beb&ecirc; Hipogl&oacute;s Am&ecirc;ndoas 2011 &#8211; Analisando o sistema de vota&ccedil;&atilde;o</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=780" rel="bookmark" class="crp_title">DateTime, Serializa&ccedil;&atilde;o de DataSets em WCF, Hor&aacute;rio de Ver&atilde;o&#8230; uma combina&ccedil;&atilde;o com muitas surpresas!</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=687" rel="bookmark" class="crp_title">Modelagem b&aacute;sica de Webservices</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=297" rel="bookmark" class="crp_title">Controle de Usuários para sistemas ASP.NET &#8211; Parte 2 &#8211; Classe de Perfis de Usuário</a></li></ul></div><p><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D773&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=recommend&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D773&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=recommend&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D773&amp;counturl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D773&amp;count=horizontal&amp;text=Controle%20de%20permiss%26otilde%3Bes%20utilizando%20opera%26ccedil%3B%26atilde%3Bo%20bit%20a%20bit" scrolling="no" style="border:none;overflow:hidden;width:130px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D773&amp;counturl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D773&amp;count=horizontal&amp;text=Controle%20de%20permiss%26otilde%3Bes%20utilizando%20opera%26ccedil%3B%26atilde%3Bo%20bit%20a%20bit" scrolling="no" style="border:none;overflow:hidden;width:130px;height:20px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D773&amp;size=medium&amp;count=true" scrolling="no" style="border:none;overflow:hidden;width:90px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D773&amp;size=medium&amp;count=true" scrolling="no" style="border:none;overflow:hidden;width:90px;height:20px"></iframe><!--<![endif]--><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D773&amp;linkname=Controle%20de%20permiss%26otilde%3Bes%20utilizando%20opera%26ccedil%3B%26atilde%3Bo%20bit%20a%20bit" title="Delicious" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D773&amp;linkname=Controle%20de%20permiss%26otilde%3Bes%20utilizando%20opera%26ccedil%3B%26atilde%3Bo%20bit%20a%20bit" title="Google Reader" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D773&amp;linkname=Controle%20de%20permiss%26otilde%3Bes%20utilizando%20opera%26ccedil%3B%26atilde%3Bo%20bit%20a%20bit" title="Orkut" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_live" href="http://www.addtoany.com/add_to/live?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D773&amp;linkname=Controle%20de%20permiss%26otilde%3Bes%20utilizando%20opera%26ccedil%3B%26atilde%3Bo%20bit%20a%20bit" title="Messenger" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/live.png" width="16" height="16" alt="Messenger"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D773&amp;title=Controle%20de%20permiss%26otilde%3Bes%20utilizando%20opera%26ccedil%3B%26atilde%3Bo%20bit%20a%20bit" id="wpa2a_14"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://leonelfraga.com/neomatrixtech/?feed=rss2&amp;p=773</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://leonelfraga.com/neomatrixtech/?p=773</feedburner:origLink></item>
		<item>
		<title>Componentes grátis é bom, mas…</title>
		<link>http://feedproxy.google.com/~r/neomatrixtech/~3/TXYfEjEGZZw/</link>
		<comments>http://leonelfraga.com/neomatrixtech/?p=756#comments</comments>
		<pubDate>Tue, 07 Jun 2011 01:49:00 +0000</pubDate>
		<dc:creator>Leonel Fraga de Oliveira</dc:creator>
				<category><![CDATA[Engenharia de Sistemas]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[boleto bancário]]></category>
		<category><![CDATA[componentes]]></category>

		<guid isPermaLink="false">http://leonelfraga.com/neomatrixtech/?p=756</guid>
		<description><![CDATA[Uma das vantagens que ninguém discute da componentização de programas é “não reinventar a roda”. Um pedaço de código que faz deste as coisas mais simples até as mais complexas. Há um tempo atrás, li na revista .NET Magazine nº 42 (de 2007!) uma resenha sobre diversos componentes para ASP.NET e um dizer logo no]]></description>
			<content:encoded><![CDATA[<p>Uma das vantagens que ninguém discute da <strong>componentização</strong> de programas é “<em>não reinventar a roda</em>”. Um pedaço de código que faz deste as coisas mais simples até as mais complexas.</p>
<p><a href="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/06/image.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Boleto.Net" border="0" alt="Boleto.Net" src="http://leonelfraga.com/neomatrixtech/wp-content/uploads/2011/06/image_thumb.png" width="280" height="169" /></a></p>
<p>Há um tempo atrás, li na revista .NET Magazine nº 42 (de 2007!) uma resenha sobre diversos componentes para ASP.NET e um dizer logo no penúltimo parágrafo do artigo me chamou a atenção:</p>
<blockquote><p>Tome cuidado com componentes gratuitos, podem ser um problema, principalmente se não vierem acompanhados do código-fonte.</p>
</blockquote>
<p>Em princípío achei que esse dizer representava um <strong>preconceito</strong> do articulista com <em>componentes grátis</em>, que ele poderia estar “levando um por fora” para desmerecer o trabalho de várias pessoas que disponibilizam seu tempo na confecção destes componentes. Mas foi só eu sentir na pele o que um erro bem simples que um componente grátis causou em um sistema que percebi que a afirmação tem fundamento.</p>
<p>Recentemente necessitei fazer uma aplicação web que gerasse <strong>boletos bancários</strong> que deveriam ser pagos em um banco de origem espanhola famoso, com o pequeno detalhe que isto deveria ser feito “pra ontem”, ou seja, o tempo era BEM curto. Quando recebi a especificação do banco, dei uma tremida nas bases. Tinha que calcular digitos verificadores, fator de vencimento, código de barras, <strong>linha digitável</strong> e o escambau, e além disso tinha que fazer o layout do boleto em HTML!</p>
<p>Como não sou um às do HTML, pensei: F*DEU! Não vou conseguir entregar isso nem a pau&#8230;</p>
<p>Dei uma pesquisada na net e achei um componente em C# chamado “<a title="Site do Boleto.Net, componente de geração de boletos bancários para ASP.NET" href="http://boletonet.codeplex.com/" rel="nofollow" target="_blank">Boleto.Net</a>” no Codeplex. Pensei: Me salvou a pátria! Baixei o danado, vi os exemplos e implementei-o na minha aplicação.</p>
<p>Daí tinha que <strong>homologar</strong> os boletos no banco, né? Até aí continua tudo bem, gerei os boletos e mandei para a homologação. Recebi a resposta do banco e os boletos estavam homologados, já poderiam entrar em produção.</p>
<p>O sistema entra em produção, e uma pessoa que gerou um boleto e foi pagá-lo no <em>homebanking</em> não conseguiu, pois estava dando “<strong>código de barras inválido</strong>”. WTF? O banco não disse que tava certo?</p>
<p>Aí fui “depurar” o boleto com uma app para iPhone (<a title="Aplicação para iPhone que lê código de barras de boletos bancários e contas." href="http://www.ttrix.com/apple/iphone/boletoscan/boletoscan.html" rel="nofollow" target="_blank">BoletoScanner</a>): O código de barras era lido normalmente, porém&#160; <strong>um bloco da linha digitável não estava batendo com o do boleto impresso</strong>, aquele número que fica sozinho e que corresponde ao DV do código de barras.</p>
<p>Mas pô, o <strong>cara do banco disse que estava certo</strong>, ou seja, ele HOMOLOGOU os boletos com esse erro na linha digitável! Daí foi uma correria para o cara do banco falar que realmente estava errado, baixar o código-fonte do componente, fazê-lo compilar no Visual Studio 2010, depurar, e finalmente corrigir o erro na linha digitável.</p>
<p>Com esse erro grave corrigido (e olha que o sistema já estava em plena produção!) novamente levamos os boletos para homologar no banco, e eu também estava fazendo testes paralelos com a app do iPhone, e finalmente atualizei a aplicação no servidor com os boletos corrigidos.</p>
<p>E quem já tinha gerado o boleto com erro (o sistema era aberto ao público), como que fica? Ainda bem que eu tive a idéia de fazer uma função de reimpressão, bastando informar um documento. Era só a pessoa gerar novamente o boleto e ir pagar (sem refazer todo o processo que culmina na geração do boleto), simples assim.</p>
<p>E isso tudo que eu contei foi causado por um erro em um componente grátis em que a última versão é de 14/06/2010 (quase um ano já), e na descrição fala que ele está homologado para trabalhar com o banco espanhol que falei acima.</p>
<p>Já pensou se ele não tivesse o fonte para eu alterar e gerar a linha digitável correta? Só por UM dígito? Eu estaria f**ido!</p>
<p>Então, devemos testar bem os componentes que utilizamos, sejam gratuitos ou pagos, para podemos aproveitar melhor os seus recursos.</p>
<p>Um abraço!</p>
<div id="crp_related"><h3>Artigos Relacionados:</h3><ul><li><a href="http://leonelfraga.com/neomatrixtech/?p=691" rel="bookmark" class="crp_title">A Symantec ainda N&Atilde;O aprendeu&hellip; Ou volta a insistir no erro.</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=684" rel="bookmark" class="crp_title">O dia que me rendi &agrave; Ma&ccedil;&atilde;</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=704" rel="bookmark" class="crp_title">Minhas impress&otilde;es sobre o iOS 4</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=741" rel="bookmark" class="crp_title">Nokia e Microsoft: O in&iacute;cio de um casamento</a></li><li><a href="http://leonelfraga.com/neomatrixtech/?p=750" rel="bookmark" class="crp_title">Apps do Google nos Galaxy S e 5 da CLARO? CLARO que N&Atilde;O! #CLAROFAIL</a></li></ul></div><p><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D756&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=recommend&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D756&amp;layout=button_count&amp;show_faces=false&amp;width=75&amp;action=recommend&amp;colorscheme=light&amp;height=20&amp;ref=addtoany" scrolling="no" style="border:none;overflow:hidden;width:90px;height:21px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D756&amp;counturl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D756&amp;count=horizontal&amp;text=Componentes%20gr%26aacute%3Btis%20%26eacute%3B%20bom%2C%20mas%26%238230%3B" scrolling="no" style="border:none;overflow:hidden;width:130px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D756&amp;counturl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D756&amp;count=horizontal&amp;text=Componentes%20gr%26aacute%3Btis%20%26eacute%3B%20bom%2C%20mas%26%238230%3B" scrolling="no" style="border:none;overflow:hidden;width:130px;height:20px"></iframe><!--<![endif]--><!--[if IE]><iframe frameborder="0" allowTransparency="true" class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D756&amp;size=medium&amp;count=true" scrolling="no" style="border:none;overflow:hidden;width:90px;height:20px"></iframe><![endif]--><!--[if !IE]><!--><iframe class="addtoany_special_service google_plusone" src="https://plusone.google.com/u/0/_/%2B1/fastbutton?url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D756&amp;size=medium&amp;count=true" scrolling="no" style="border:none;overflow:hidden;width:90px;height:20px"></iframe><!--<![endif]--><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D756&amp;linkname=Componentes%20gr%26aacute%3Btis%20%26eacute%3B%20bom%2C%20mas%26%238230%3B" title="Delicious" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D756&amp;linkname=Componentes%20gr%26aacute%3Btis%20%26eacute%3B%20bom%2C%20mas%26%238230%3B" title="Google Reader" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D756&amp;linkname=Componentes%20gr%26aacute%3Btis%20%26eacute%3B%20bom%2C%20mas%26%238230%3B" title="Orkut" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_live" href="http://www.addtoany.com/add_to/live?linkurl=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D756&amp;linkname=Componentes%20gr%26aacute%3Btis%20%26eacute%3B%20bom%2C%20mas%26%238230%3B" title="Messenger" rel="nofollow" target="_blank"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/icons/live.png" width="16" height="16" alt="Messenger"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fleonelfraga.com%2Fneomatrixtech%2F%3Fp%3D756&amp;title=Componentes%20gr%26aacute%3Btis%20%26eacute%3B%20bom%2C%20mas%26%238230%3B" id="wpa2a_16"><img src="http://leonelfraga.com/neomatrixtech/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://leonelfraga.com/neomatrixtech/?feed=rss2&amp;p=756</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://leonelfraga.com/neomatrixtech/?p=756</feedburner:origLink></item>
	</channel>
</rss>

