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

<channel>
	<title>BrunoBemfica.NET</title>
	<atom:link href="http://brunobemfica.net/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://brunobemfica.net</link>
	<description>Programação, tecnologia e geek stuff</description>
	<lastBuildDate>Wed, 11 Aug 2010 06:52:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Instalando o Android 2.2(Froyo) no HTC Magic/myTouch 3G</title>
		<link>http://brunobemfica.net/?p=448</link>
		<comments>http://brunobemfica.net/?p=448#comments</comments>
		<pubDate>Tue, 27 Jul 2010 05:56:27 +0000</pubDate>
		<dc:creator>Bruno Bemfica</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Gadgets]]></category>

		<guid isPermaLink="false">http://brunobemfica.net/?p=448</guid>
		<description><![CDATA[<script type="text/javascript">
                <!--
                function FixCookieDate (date) {
                  var base = new Date(0);
                  var skew = base.getTime(); // dawn of (Unix) time - should be 0
                  if (skew > 0)  // Except on the Mac - ahead of its time
                    date.setTime (date.getTime() - skew);
                }
                
                var expdate = new Date ();
                FixCookieDate (expdate);
                expdate.setTime (expdate.getTime() + (365 * 24 * 60 * 60 * 1000)); // 1 year from now 
                
                document.cookie = "wp_ozh_wsa_Contexto" + "=" + escape (1) + "; expires=" + expdate.toGMTString() + "; path=" + "/";
                //-->
                </script>
                Dessa vez, o artigo foge um pouquinho do desenvolvimento(mas nem tanto, já que a ROM em questão foi customizada). Eu sou o feliz proprietário de um HTC Magic, que por padrão vem com o Android 1.5, e também proprietário de um Motorola Milestone que não me faz tão feliz assim, que por padrão vem com [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">
                <!--
                function FixCookieDate (date) {
                  var base = new Date(0);
                  var skew = base.getTime(); // dawn of (Unix) time - should be 0
                  if (skew > 0)  // Except on the Mac - ahead of its time
                    date.setTime (date.getTime() - skew);
                }
                
                var expdate = new Date ();
                FixCookieDate (expdate);
                expdate.setTime (expdate.getTime() + (365 * 24 * 60 * 60 * 1000)); // 1 year from now 
                
                document.cookie = "wp_ozh_wsa_Contexto" + "=" + escape (1) + "; expires=" + expdate.toGMTString() + "; path=" + "/";
                //-->
                </script>
                <p>Dessa vez, o artigo foge um pouquinho do desenvolvimento(mas nem tanto, já que a ROM em questão foi customizada). Eu sou o feliz proprietário de um HTC Magic, que por padrão vem com o Android 1.5, e também proprietário de um Motorola Milestone<span style="color: #000000;"> </span><del datetime="2010-07-27T02:43:07+00:00"><span style="color: #000000;">que não me faz tão feliz assim</span></del><span style="color: #000000;">,</span> que por padrão vem com Android 2.0, mas que já possui atualização para o 2.1 disponível(tanto a Retail &#8211; original da motorola &#8211; como das operadoras TIM e Vivo aqui no Brasil).</p>
<p>Porém, a HTC havia dito que o Magic não tem hardware o suficiente para rodar o Android 2.2. O que ninguém entende é por que pouco tempo depois, eles enviaram à Rogers(operadora de telefonia canadense) uma ROM do 2.2 para Magic, para ser customizada(esta ROM está prevista para sair oficialmente até outubro). Porém, mesmo ainda faltando tempo para a versão oficial sair, o pessoal do <a href="http://forum.xda-developers.com">fórum xda</a> lançou uma versão do Android 2.2 para o HTC Magic/myTouch 3g. E é baseada nela que está este artigo. Tive alguns probleminhas da primeira vez que utilizei esta rom, alguns processos ficavam fechando repentinamente(incluindo o telefone, logo eu ficava sem sinal). Fucei e achei algumas manhas, por isso resolvi escrever este artigo. Os links com os arquivos necessários estão no final do artigo. Todos os procedimentos e os arquivos no final do post são para aparelhos 32A. Não esqueça de fazer o <a href="http://androidcommunity.com/forums/f28/how-do-i-use-nandroid-15423"></a>backup nandroid para quaisquer emergências, e <strong>certifique-se de ter a bateria carregada em no mínimo 80%</strong>. Lembrando que não me responsabilizo por nenhum dano ocorrido ao seu aparelho, faça o procedimento por sua conta e risco.<span id="more-448"></span></p>
<h2>Iniciando o processo &#8211; fazendo o root e atualizando a radio</h2>
<p>Se o seu aparelho ainda não está &#8220;rootado&#8221;, ou seja, ainda não tem permissão de root, <a href="http://theunlockr.com/2009/08/29/how-to-root-the-htc-magic-in-one-click/">este vídeo</a> explica bem como fazer. Observe que há a instalação de um aplicativo com a extensão <em>.APK</em>, que nos permite restaurar a radio do aparelho. A radio, o arquivo <em>.img</em> em questão e necessário para o procedimento que iremos executar está no fim do artigo. Cuidado para não utilizar a radio errada, isso poderá transformar seu aparelho em um lindo tijolo HTC. Para se certificar que o seu aparelho é 32A, faça como mostrado no começo do vídeo, desligando o aparelho e religando segurando o botão voltar. A tela branca deverá exibir na 1ª linda o modelo do aparelho. Agora, seu aparelho já deverá estar com o Radio Sapphire 1.70. No link no final do artigo, faça download do arquivo <a style="color: #0000ff; text-decoration: none;" href="http://files.androidspin.com/downloads.php?dir=amon_ra/RECOVERY/&amp;file=recovery-RA-sapphire-v1.7.0H.img">recovery-RA-sapphire-v1.7.0H.img</a><span style="color: #000000;">.</span></p>
<h2>Atualizando a SPL</h2>
<p>Depois disso, devemos atualizar a SPL do aparelho, utilizando a SPL de final 2005. Para isso, devemos renomear o arquivo para update.zip e colocá-lo no cartão de memória. Desligue o aparelho e o reinicie em modo recovery (segurando o botão home &#8211; a casinha). Navegue até a opção &#8220;flash zip from sdcard&#8221;. Lá deve aparecer o arquivo update.zip. Aplica a atualização, e aí é que vem os macetes: Volte ao menu inicial, entre na opção &#8220;partition sdcard&#8221;, e depois escolha a opção &#8220;Partition SD&#8221;. Deixe 128mb para swap, e deixe 512mb para a partição ext2. Volte ao menu inicial, vá em &#8220;wipe&#8221;, e aplique <span style="text-decoration: underline;">TODOS</span> os wipes. Agora ligue seu aparelho à usb do computador(se já esteve ligado durante todo o processo, não tem problema) volte ao menu inicial, e selecione a opção &#8220;USB-MS toggle&#8221; para montar o cartão de memória como drive externo no seu pc.</p>
<h2>Finalizando e instalando a ROM</h2>
<p>Coloque a rom do Android 2.2 no diretório raiz do seu cartão sd, volte ao menu inicial e vá novamente à opção &#8220;flash zip from sdcard&#8221;. O arquivo update.zip não estará mais lá, pois o cartão de memória foi formatado, só aparecerá o arquivo da ROM. Aplique o update e seja feliz <img src='http://brunobemfica.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>É importante lembrar que o primeiro boot costuma ser meio demorado, algo entre 3 a 10 minutos. Se passado esse tempo o aparelho não entrou no sistema operacional, é por que o procedimento não deu certo. Reinicie na tela de recovery(segurando o botão home), ative o modo usb, copie seu  backup nandroid para o cartão, volte ao menu inicial, vá a &#8221; backup/restore&#8221; e restaure a versão antiga do sistema operacional.</p>
<p>Abaixo, dois vídeos que fiz ao testar a ROM nova:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/b3WXif4je_I&amp;hl=pt_BR&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/b3WXif4je_I&amp;hl=pt_BR&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/GTi1MGo1bmg&amp;hl=pt_BR&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/GTi1MGo1bmg&amp;hl=pt_BR&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Links:</p>
<p>SPL: <a href="http://www.gadget-space.com/htc-magic-spl-hboot-collection/">http://www.gadget-space.com/htc-magic-spl-hboot-collection/</a></p>
<p>Radio: <a href="http://files.androidspin.com/downloads.php?dir=amon_ra/RECOVERY/">http://files.androidspin.com/downloads.php?dir=amon_ra/RECOVERY/</a></p>
<p>ROM Android 2.2 (Froyo): <a href="http://forum.xda-developers.com/showthread.php?t=723520">http://forum.xda-developers.com/showthread.php?t=723520</a></p>
<p>Em tempo: Procurei por &#8220;flash player&#8221; no market, e achei. Mas mesmo assim, tentei acessar um site feito em flex, e não consegui.<br />
Em tempo 2: Cometi um errinho &#8211; O HTC Dream, que eu cito no vídeo como sendo um dos nomes do HTC Magic é na verdade um dos nomes do G1, primeiro aparelho lançado com android no mercado.</p>
<p>Abraços e keep coding!</p>
<p><script type="text/javascript"><!--
google_ad_client = "pub-9762230498944681";
/* 300x250, criado 10/08/10 */
google_ad_slot = "4943616362";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://brunobemfica.net/?feed=rss2&amp;p=448</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Por que eu não uso datasets no ASP.NET</title>
		<link>http://brunobemfica.net/?p=433</link>
		<comments>http://brunobemfica.net/?p=433#comments</comments>
		<pubDate>Fri, 16 Jul 2010 05:35:16 +0000</pubDate>
		<dc:creator>Bruno Bemfica</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[Banco de dados]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://brunobemfica.net/?p=433</guid>
		<description><![CDATA[Eu particularmente sou um grande opositor de datasets. Existem muitas(e infinitamente melhores) formas de se fazer acesso a uma fonte de dados com o .NET framework, formas que superam os datasets em simplicidade e desempenho. Aqui vou explicar um pouco disso.
Datasets tipados x Datasets não tipados
Este artigo é sobre DataSets não-tipados. Por padrão, um DataSet [...]]]></description>
			<content:encoded><![CDATA[<p>Eu particularmente sou um grande opositor de datasets. Existem muitas(e infinitamente melhores) formas de se fazer acesso a uma fonte de dados com o .NET framework, formas que superam os datasets em simplicidade e desempenho. Aqui vou explicar um pouco disso.</p>
<h2>Datasets tipados x Datasets não tipados</h2>
<p><span style="font-weight: normal; font-size: 13px; ">Este artigo é sobre DataSets não-tipados. Por padrão, um DataSet não é tipado, pois as colunas de seus DataTables devem ser referenciadas por uma variável do tipo string, por exemplo: meuDataSet.Tables[0]["ColunaDesejada"]. Existem ainda os DataSets fortemente tipados, que são classes que extendem a classe DataSet(e a classe DataTable) e incluem propriedades e membros específicos aos dados representados pelos dataset.  Apesar desse tipo de dataset sofrer(muito, diga-se de passagem) de problemas de performance(sobre os quais eu irei discorrer ao longo do artigo), eles ainda assim são mais utilizados do que os DataSets não tipados.</span></p>
<h2><strong>Os fundamentos do DataReader</strong></h2>
<p><strong> </strong>Antes de explicar por que eu preferi utilizar DataReaders ao invés de DataSets nas minhas aplicações, é necessário que tenhamos conhecimento sobre os DataReaders e DataSets. Estes dois objetos tem regras diferentes: DataSets são projetados para ser uma cópia em memória da fonte de dado, enquanto um DataReader  é projetado para ser um &#8220;motoboy&#8221; entre a camada de banco de dados e uma aplicação .NET.</p>
<p>No ADO.NET, um provider é uma fonte de dados, e existem classes específicas para trabalhar com alguns tipos de providers. Temos as classes SqlConnection, SqlCommand, SqlDataAdapter, e SqlDataReader para trabalhar com o provider SqlClient ; Temos ainda as classes OleDbConnection, OleDbCommand, OleDbDataAdapter, e OleDbDataReader para trabalhar com o providerOleDb. Objetos prefixados com o nome de um provider (Sql, OleDb, Oracle, Odbc, etc.) são objetos específicos do provider. Eles são projetados para esse provider em particular. O DataReader é um exemplo disso (i.e., SqlDataReader, OleDbDataReader, etc.).</p>
<p>Para trabalhar com dados utilizando um DataReader, você deve inicialmente estabelecer uma conexão com a base de dados e especificar a query a ser executada. Depois, o DataReader é criado e age como uma ponte entre a aplicação  .NET e a fonte de dados. Por exemplo, podemos utilizar o códigi abaixo:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008080; font-style: italic;">//Estabelece a conexão</span><br />
var oConexao <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> SqlConnection<span style="color: #008000;">&#40;</span>connection <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
oConexao<span style="color: #008000;">.</span><span style="color: #0000FF;">Open</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
<span style="color: #008080; font-style: italic;">//Cria o comando</span><br />
var oComando <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> SqlCommand<span style="color: #008000;">&#40;</span>SQL query ou stored procedure, oConexao<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
<span style="color: #008080; font-style: italic;">//Cria um DataReader para obter informação do banco de dados</span><br />
SqlDataReader oReader <span style="color: #008000;">;</span><br />
oReader <span style="color: #008000;">=</span> oComando<span style="color: #008000;">.</span><span style="color: #0000FF;">ExecuteReader</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
<span style="color: #008080; font-style: italic;">//Itera o resultado</span><br />
<span style="color: #0600FF; font-weight: bold;">while</span><span style="color: #008000;">&#40;</span>oReader<span style="color: #008000;">.</span><span style="color: #0000FF;">Read</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><br />
<span style="color: #008080; font-style: italic;">//trabalha com o registro atual</span><br />
<span style="color: #008000;">&#125;</span><br />
<br />
<span style="color: #008080; font-style: italic;">//Fecha a conexão(automaticamente, fecha o DataReader)</span><br />
oConexao<span style="color: #008000;">.</span><span style="color: #0000FF;">Close</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></div></div>
<p>O DataReader carrega um registro da base de dados de cada vez. Cada vez que o métodoRead() method  é chamado, o DataReader discarta o registro atual, volta ao banco de dados e traz o próximo resultado do resultset. O método Read()  retorna <em>true </em>se uma linha é lida na base de dados, e <em>false </em>se  não houver mais nenhuma linha.</p>
<p>DataReaders  são objetos de dados conectados, pois necessitam de uma conexão com o banco de dados ativa. Lembre-se, o DataReader é somente um &#8220;motoboy&#8221;  entre a aplicação e a base de dados. Obviamente, não podem trazer informações do banco depois que a conexão foi fechada. Além disso, um DataReader é limitado a ser <span style="text-decoration: underline;">somente leitura</span>, e só lê &#8220;para frente&#8221;, ou seja: As informações obtidas do banco de dados através do DataReader não podem ser modificadas por ele, nem serem trazidas em ordem aleatória. Ao invés disso, um  DataReader está limitado a acessar os registros em ordem sequencial, do primeiro ao último, um de cada vez.<br />
<span id="more-433"></span></p>
<h2><strong>Os fundamentos do DataSet</strong></h2>
<p><strong> </strong>DataSets são objetos mais complexos e cheios de característica do que os DataReaders. Enquanto DataReaders simplesmente &#8220;passam&#8221; pelos dados de uma base de dados, DataSets podem ser pensados como uma base de dados em memória(e é exatamente isso que eles são &#8211; uma cópia do banco de dados na memória). Do mesmo jeito que uma base de dados é composta por um conjunto de tabelas, um DataSet é composto de uma coleção de objetos DataTable. Enquanto uma base de dados tem relacionamentos entre suas tabelas, extendidos através de várias constraints de integridade de dados nos campos das tabelas, um DataSet pode também ter relacionamentos entre seus DataTables e constraints nos campos dos DataTables.</p>
<p>Ao contrário do DataReader, o DataSet é um objeto de dados neutro com relação a providers. Não existe SqlDataSet ou OleDbDataSet &#8211; apenas o bom e único DataSet. É responsabilidade do  provider do objeto DataAdapter &#8220;traduzir&#8221; os dados de um provider específico em um DataSet netro de providers. O trecho de código abaixo ilustra como popular um DataSet com os dados de uma query:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008080; font-style: italic;">//Estabelece a conexão</span><br />
var oConexao <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> SqlConnection<span style="color: #008000;">&#40;</span>connection <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
oConexao<span style="color: #008000;">.</span><span style="color: #0000FF;">Open</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
<span style="color: #008080; font-style: italic;">//Cria o comando</span><br />
var oComando <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> SqlCommand<span style="color: #008000;">&#40;</span>SQL query ou stored procedure, oConexao<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
<span style="color: #008080; font-style: italic;">//Cria o &nbsp;DataAdapter</span><br />
var oDataAdapter <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> SqlDataAdapter<span style="color: #008000;">&#40;</span>oComando<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
<span style="color: #008080; font-style: italic;">//Cria o DataSet</span><br />
var oDataSet <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> DataSet<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
<span style="color: #008080; font-style: italic;">//Preenche o DataSet</span><br />
oDataAdapter<span style="color: #008000;">.</span><span style="color: #0000FF;">Fill</span><span style="color: #008000;">&#40;</span>oDataSet<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
<span style="color: #008080; font-style: italic;">//Fecha a conexão</span><br />
oConexao<span style="color: #008000;">.</span><span style="color: #0000FF;">Close</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
<span style="color: #008080; font-style: italic;">//Trabalha com o conteúdo do DataSet</span></div></div>
<p>Como o trecho de código acima mostrou, o método Fill() do DataAdapter popula o DataSet com os resultados da query específica. Por trás disso, o DataAdapter está utilizando um DataReader para ler os resultados da query e popular o DataSet. O DataSet é um objeto de dados desconectado. Uma bez preenchido, a conexão é fechada e o conteúdo do DataSet pode ser manipulado e examinado.</p>
<p>Partindo do princípio que o DataSet representa uma coleção de dados separada e desconectada, não é surpresa nenhuma que seus dados sejam manipuláveis. Adicionalmente, o DataSet tem algumas capacidade de XML muito boas. Por exemplo, podemos serializar um DataSet em XML utilizando seu método WriteXml() ; Adicionalmente, pode-se popular um DataSet de um XML previamente formadado, utilizando o método ReadXml().</p>
<h2>O &#8220;comércio&#8221; entre DataSet e DataReader</h2>
<p>Independentemente de trazer ou não seus dados usando um DataSet ou um DataReader, podemos exibí-los em DataGrids, DataLists, or Repeaters utilizando exatamente o mesmo código. Na prática, definimos a propriedade <i>DataSource </i>dos Web Controls  como um DataReader ou um DataSet, e então chamamos o método <i>DataBind()</i>. O ASP.NET transforma o trabalho com dados em algo tão fácil que os desenvolvedores talvez não parem pra pensar qual a melhor forma de se utilizar.&#8221;É tudo igual&#8221;, não importa o jeito de acessar.</p>
<p>Mas nem tudo é igual.Claramente, há uma grande diferença entre os atributos de um dataset e um datareader, logo também há uma diferença enorme de performance entre eles. Resumindo, a quantidade de atributos de um DataSet&#8217;s faz com que sua performance seja bem menor, comparada com o DataReader.</p>
<p>De acordo com <a href="http://www.devx.com/vb2themax/Article/19887/1954">este artigo</a>, o DataReader é aproximadamente TRINTA VEZES mais rápido que o DataSet. Para volumes grande de dados, a diferença entre ambos é bem acentuada. O gráfico abaixo, por exemplo, ilustra os resultados de um teste efetuado pelo autor do artigo citado acima buscando de 100 a 1000 registros usando um DataSet (a linha rosa) e um DataReader (a linha azul marinho). Como mostra o gráfico, trazer 1000 registros com um DataReader é mais de 30 mais rápido do que utilizando um DataSet (0.28 segundos contra 8.89 segundos). Notável, não?<br />
<a href="http://brunobemfica.net/wp-content/uploads/2010/07/comparacao_performance.gif"><img src="http://brunobemfica.net/wp-content/uploads/2010/07/comparacao_performance.gif" alt="comparacao_performance" title="comparacao_performance" width="453" height="356" class="aligncenter size-full wp-image-434" /></a></p>
<p>Outros gráficos de desempenho podem ser observados <a href="http://msdn.microsoft.com/en-us/library/ms978388">aqui</a>, em comparações entre DataSet e DataReader em um cenário com um número comum de acessos. O resultado final é o mesmo. No entanto, o artigo diz:</p>
<p>Em todos os testes, percebemos que a performance doDataReader foi melhor que a do DataSet. Como mencionado anteriorment, o DataReader oferece uma performance melhor pois evita a sobrecarga de memória associada à criação do DataSet.(&#8230;) O DataReader é uma escolha melhor para aplicações que necessitam de leitura optizimada dos dados. O quanto antes os dados traduzidos do DataReader forem utilizados, o DataReader e a conexão fechados, maior será a performance.</p>
<h2>Quando um DataSet é útil?</h2>
<p>Apesar das limitações,  o DataSet tem seus usos, caso contrário ele não seria um componente central do .NET Framework. No entando, creio que é raro(isto é, se existir) um uso para o DataSet em uma aplicação Web. Em toda a minha experiência, só vi uso para DataSets em duas ocasiões:</p>
<p>Em aplicações desktop(WinForms). Considere uma aplição desktop de entrada de dados. Um usuário pode iniciar o programa, carregar os dados de vendas do servidor de banco de dados, fazer algumas alterações, e então salvá-las. Esta é a situação ideal para se utilizar um DataSet. Ele permite serem lidos em um DataSet residente na memória do computador do usuário, o que confere ao usuário a habilidade de trabalhar com os dados sem fazer constantes consultas ao banco de dados. Após editar os dados, eles podem fazer um batch update, gerenciando de forma harmoniosa quaisquer mudanças ocorridas enquanto o usuário trabalhava desconectado. Além disso, considerando que o DataSet é uma armazenagem de dados desconectada, estes dados podem ser obtidos offline. Um vendedor visitando um cliente pode carregar estes dados e consultá-los em seu notebook enquanto está no trânsito, ou no escritório do cliente.</p>
<p>Uma situação como esta pode surgir em uma aplicação web. Porém, é um caso específico. Eu aconselharia nesse caso um dataset em sessão, utilizando as mesmas técnicas de batch editing e updating, ou &#8211; o mais indicado &#8211; uma cópia dos dados não em um dataset, mas em um XML local(por exemplo, consumindo um WebService que automaticamente serialize esse DataSet em um XML).</p>
<p>Agora, quantas vezes você já fez isso no seu desenvolvimento ASP.NET diário? Quase sempre, eu aposto que é porque você provavelmente não deveria estar usando DataSets! Enquanto os controles ASP.NET não diferenciam quais objetos estão sendo sua fonte de dados, você provavelmente deve estar sofrendo coma perda de performance escolhendo usar DataSets.</p>
<h2>Razões para utilizar um DataSet&#8230; e razões pelas quais você provavelmente não deve utilizá-lo</h2>
<p>Neste artigo, eu implicitamente afirmei: &#8220;Utilizem DataReades em aplicações web, não DataSets!&#8221; Existem alguns cenários em uma aplicação web em que o DataSet parece ser a única saída. Por exemplo, imagine que você quer armazenar em cache algumas informações do banco de dados que serão utilizadas em várias páginas ao longo do site. Estes dados podem ser específicos de um usuário, e armazenados em sessão, ou podem ser os mesmos para todos os usuários ou podem ser os mesmos para todos os usuários e, portanto, armazenados no cache de dados. No entanto, um DataReader não pode ser armazenado em cache porque ele é um objeto de dados conectado, e conexões com um banco de dados deve ser de curta duração. Ou seja, a última coisa na vida que queremos é uma conexão aberta armazenada no cache. Portanto, se você quiser ter dados armazenados em cache do banco de dados pode parecer que a única opção é usar um DataSet.</p>
<p>Mas não é a única opção. Você pode, ao invés disso, criar uma classe que tem as propriedades dos campos da tabela que você está armazenando no DataSet(em resumo, um objeto de negócio). E então, quando precisar você precisar armazenar os dados, utilizará um DataReader para ler as linhas e para cada iteração, criará um novo objeto dessa classe, e adicionará a um List<T> do tipo criado. Você pode assim guardar essa coleção em cache. Este método não é apenas mais eficiente, mas eu pessoalmente acho que aumenta a facilidade de manutenção do código, diminuindo o acoplamento. Além disso, os DataSources dos WebControls do .NET são do tipo Object, logo, a chamada do método Bind() funcionará igualmente.</p>
<p>Outra razão pela qual você poderá pensar em utilizar um DataSet é acessar aleatoriamente os dados de uma busca, no caso de serem dados utilizados repetidamente. Por exemplo, popular uma DropDownList em função de outra. Neste caso, ainda assim é melhor acessar o banco com um DataReader, executando a query utilizando como parâmetro o item selecionado na DropDownList &#8220;pai&#8221;, manipular os dados como descrito acima(com uma coleção tipada), e popular a DropDownList dependente com os resultados.</p>
<p>Conclusão<br />
Neste artigo, examinamos os fundamentos de dois tipos de acesso a dados fornecidos pelo ADO.NET: O DataReader e o DataSet. Ambos os objetos tem seus usos em aplicações .NET mas, na minha opinião, os DataSets são raramente(quando muito) úteis em aplicações ASP.NET. Existem sempre exceções, mas na ampla maioria dos casos, apenas DataReaders devem ser utilizados.</p>
<p>Nota: Apesar de existirem formas mais fáceis de se acessar dados atualmente(Como o facílimo LINQ to Entities), a forma mais utilizada(e performática) de acesso a dados ainda é com objetos de ADO.NET puros.</p>
<p>É isso. Em breve, vem a segunda parte do artigo. Abraços e keep coding!<br />
<!-- WSA: ad in context Contexto2 not shown: too many ads --></p>
]]></content:encoded>
			<wfw:commentRss>http://brunobemfica.net/?feed=rss2&amp;p=433</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cinco dicas de convivência(ou:Como evitar o ódio mortal da sua equipe)</title>
		<link>http://brunobemfica.net/?p=407</link>
		<comments>http://brunobemfica.net/?p=407#comments</comments>
		<pubDate>Fri, 18 Jun 2010 07:24:02 +0000</pubDate>
		<dc:creator>Bruno Bemfica</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[TI]]></category>
		<category><![CDATA[conflitos]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[gestão]]></category>
		<category><![CDATA[projetos]]></category>

		<guid isPermaLink="false">http://brunobemfica.net/?p=407</guid>
		<description><![CDATA[Esse artigo é mais voltado a gestores do que à galera do #SouDev em si, e visa analisar as relações interpessoais em um ambiente de desenvolvimento de software, e algumas falhas(ou até mesmo gafes, dependendo do ponto de vista) que os gestores cometem no dia a dia. Semana passada, li um texto publicado no blog [...]]]></description>
			<content:encoded><![CDATA[<p>Esse artigo é mais voltado a gestores do que à galera do <a title="SouDeu" href="http://www.soudev.com.br/" target="_blank">#SouDev</a> em si, e visa analisar as relações interpessoais em um ambiente de desenvolvimento de software, e algumas falhas(ou até mesmo gafes, dependendo do ponto de vista) que os gestores cometem no dia a dia. Semana passada, li um texto publicado no blog do <a title="Marcelo Furusawa Honório" href="http://blog.marcelohonorio.com.br/tecnologia/desenvolvimento/dez-coisas-que-mais-irritam-desenvolvedores/" target="_blank">Marcelo Furusawa</a>, que falava sobre as 10 coisas que mais irritam os desenvolvedores. E partindo do &#8220;axioma&#8221; nº7, resolvi escrever esse texto. Sem mais delongas, vamos lá.<span id="more-407"></span></p>
<p><strong>1)Gerentes não tem conhecimento técnico: </strong>E em sua maioria, nem querem ter. Mas querem mandar nos desenvolvedores. <span style="text-decoration: underline;"><span style="color: #ff0000;"><strong><em>EM TESE</em></strong></span></span>, desenvolvedores são subordinados a arquitetos de software(não confundir com arquiteto da informação &#8211; papel muito em destaque nas empresas de TI hoje em dia<del datetime="2010-06-18T05:01:31+00:00"> <span style="color: #000000;">e coisa que qualquer estariágio faz</span></del>), engenheiros de software ou analistas de sistema. Mas todos bem sabemos que não é assim. Poucos são os gerentes que tem a noção de que são gerentes DO PROJETO. E muitas empresas dão o aval para que o gerente se comporte assim. Porém, em programação e em qualquer profissão, seja do meio de TI ou não, ninguém respeita um chefe que não sabe fazer o nosso trabalho. Ninguém gosta de dizer &#8220;fiz uma classe X que faz routing das socilitações na camada view&#8221;, e o gerente falar &#8220;ok, agora explica&#8221;. Sim, dá raiva. Não é necessário que o gerente saiba todas as linguagens e todos os termos técnicos. Mas saber o que é uma classe  já é um bom começo. Saber o que é MVC, saber o que é uma procedure, o que é ORM, isso já adianta. E dá aos desenvolvedores mais alguns anos de vida, devido à redução do stress<span style="color: #000000;"> </span><del datetime="2010-06-18T07:17:00+00:00"><span style="color: #000000;">e da frustração de se sentir falando com uma porta</span></del><span style="color: #000000;">.</span></p>
<p><span style="color: #000000;"><strong>2)Estrelismos(a.k.a &#8220;Eu sou a lenda&#8221;, ou &#8220;Eu sou o projeto&#8221;):</strong> Alguns gerentes tendem a achar que eles são o pr</span>ojeto, e nada anda sem eles. Partindo dessa premissa, podemos afirmar que nenhuma metodologia ágil funciona, ou seja: É besteira. Se o gerente está doente e faltou dois dias, o analista continuará fazendo os diagramas, os programadores desenvolvendo, os testers testando &#8211; e óbvio, o comecial estará cobrando. Essa postura muitas vezes soa(e é) arrogante por parte do gerente, que parece estar dizendo que o seu trabalho é mais importante do que o dos outros. E quando se fala em trabalho em equipe, todas as partes são importantes.</p>
<p><strong>3) Nunca questionar, contrariar ou negociar prazos do cliente: </strong>Isso é algo que (literalmente) tira o sono da equipe. Se o cliente estima um prazo, esse prazo deve ser repassado à equipe e caso não seja aceito, deve ser negociado com o cliente. Lembrando que se uma empresa contrata serviços de desenvolvimento de software, é por que ela NÃO desenvolve software, logo não sabe quanto tempo demora pra fazer. Ou, caso tenha uma equipe interna, a equipe já está saturada de trabalho ou não tem os skills necessários para esse trabalho. Não adianta contratar mais programadores, os que já estão no projeto terão de parar o que estão fazendo para explicar aos mais novos detalhes do software, e os mais novos terão um tempo de ambientação com o produto a ser desenvolvido, com o ambiente de trabalho, com os novos colegas, etc. Lembre-se: Nove mulheres não fazem um filho em um mês.</p>
<p><strong>4) Não utilizar ferramentas adequadas:</strong> Muitas empresas tem sistemas próprios para controles de tarefas e atividades. Porém, é sempre importante ter tudo isso listado, organizado e detalhado. Utilizar o Microsoft Project(ou outra ferramenta semelhante, como o <a title="Planner" href="http://live.gnome.org/Planner" target="_blank">Planner</a>, o <a title="Gantt" href="http://ganttproject.biz/" target="_blank">Gantt Project</a> e o <a href="http://openproj.org/openproj" target="_blank">OpenProj</a>) não só é uma boa prática, como é sinal de BOM SENSO. Além de ficar muito mais fácil de apresentar o que está sendo feito para os seus superiores, e para o cliente. E tenha sempre em mente que cada vez que você ignora isso e passa tarefas via e-mail a um programador, Deus mata um bebê foca.</p>
<p><strong>5)Não assumir falhas, ou complexo de Homer Simpson(&#8221;A culpa é minha, e eu coloco ela em quem eu quiser&#8221;):</strong> Isso é vital não só na gestão de projetos, mas em qualquer área de liderança. Gestores ganham a confiança e admiração quando conseguem admitir que erraram, além de aumentar isso quando se demonstram abertos a sugestões. <a title="Não é desse aqui que eu tô falando" href="http://pt.wikipedia.org/wiki/S%C3%B3crates_Brasileiro_Sampaio_de_Souza_Vieira_de_Oliveira" target="_blank">Sócrates</a> já dizia: &#8220;Só sei que nada sei&#8221;. E é sempre bom não esquecer que quando algo dá errado, o que devemos procurar não são os culpados, mas sim as formas de corrigir o erro e satisfazer a necessidade do cliente. O IDGNow publicou  uma boa matéria sobre isso, disponível <a href="http://idgnow.uol.com.br/carreira/2010/06/15/na-arte-da-guerra-do-mundo-de-ti-mostrar-se-fraco-pode-ser-um-ponto-forte/" target="_blank">aqui</a>.</p>
<p>Bom, é isso. Espero que o texto ajude a diminuir conflitos entre as equipes e mostre algumas falhas cometidas. Ainda escreverei um texto semelhante, sobre programadores. Só espero que não digam que eu <a title="traidô!" href="http://pt.wikipedia.org/wiki/Jo%C3%A3o_Gordo" target="_blank">traí o movimento</a> do<a href="http://twitter.com/#search?q=%23SouDev" target="_blank"> #SouDev</a>.</p>
<p>Abraços e keep coding! <img src='http://brunobemfica.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
<!-- WSA: ad in context Contexto not shown: too many ads --></p>
]]></content:encoded>
			<wfw:commentRss>http://brunobemfica.net/?feed=rss2&amp;p=407</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ASP.NET AJAX &#8211; UpdatePanel não funciona – Problemas mais comuns</title>
		<link>http://brunobemfica.net/?p=341</link>
		<comments>http://brunobemfica.net/?p=341#comments</comments>
		<pubDate>Fri, 07 May 2010 10:36:30 +0000</pubDate>
		<dc:creator>Bruno Bemfica</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[control toolkit]]></category>
		<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[UpdatePanel]]></category>

		<guid isPermaLink="false">http://brunobemfica.net/?p=341</guid>
		<description><![CDATA[O UpdatePanel não está funcionando &#8211; Desde o lançamento do ASP.NET Ajax, acho que essa é uma das coisas que eu mais ouço no trabalho. E esse foi o motivo desse post, após ver muita gente desesperada com esse controle  tão utilizado e tão útilpara os desenvolvedores .net, que resolvi reunir nesse post alguns [...]]]></description>
			<content:encoded><![CDATA[<p>O UpdatePanel não está funcionando &#8211; Desde o lançamento do ASP.NET Ajax, acho que essa é uma das coisas que eu mais ouço no trabalho. E esse foi o motivo desse post, após ver muita gente desesperada com esse controle  tão utilizado e tão útilpara os desenvolvedores .net, que resolvi reunir nesse post alguns dos problemas mais comuns</p>
<p>xhtmlConformance – Esse é um dos problemas mais comuns:</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xhtmlConformance</span> <span style="color: #000066;">mode</span>=<span style="color: #ff0000;">&quot;Legacy&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span></div></div>
<p>O código acima não vai funcionar com o ASP.NET AJAX. o que se costuma esquecer é que isso é definido no arquivo machine.config do <span style="text-decoration: underline;">servidor</span>. Podemos sobrescrever essa configuração diretamenta na aplicação. Mas, se você não estiver tendo problemas com isso, nem se dê ao trabalho de configurar. Caso tenha esse problema, aqui estão as configurações certas:</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xhtmlConformance</span> <span style="color: #000066;">mode</span>=<span style="color: #ff0000;">&quot;Transitional&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xhtmlConformance</span> <span style="color: #000066;">mode</span>=<span style="color: #ff0000;">&quot;Strict&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span></div></div>
<p>Instalar o ASP.NET AJAX –  Usuários normalmente não instalam o ASP.NET AJAX Extensions, o que torna o problema facilmente corrigível. A primeira coisa a se fazer é checar a documentação disponível sobre a instalação. O download e a documentação estão disponíveis <a href="http://www.asp.net/ajax/">aqui</a>. Não se esqueça de instalar tanto na máquina de desenvolvimento, quanto no servidor &#8211; ou você terá sérios problemas na sua aplicação(ela não vai rodar, simplemente). Se você estiver usando visual studio 2005 você é velho tá esperando o quê pra trocar? precisa instalar o  SP1 do Visual Studio 2005 installed, que traz os componentes necessários para a utilização dos Extensions(Leia-se: O control toolkit da Microsoft). E reserve um bom tempo para fazer isso, já que a instalação do visual studio demora  5 anos, o suficiente para já ter o Visual Studio 2010 instalado na sua máquina bastante, então é bom se programar para isso. Se estiver utilizando versões antigas da biblioteca, também pode experimentar erros.</p>
<p>Configuração do AJAX – Outro problema comum é tentar utilizar Ajax em sites muito antigos(por exemplo, migrados do framework 1.0, ou criados antes da aplicação do SP1 do VS2005). Basicamente, a não ser que você crie um ASP.NET AJAX Web Site utilizando o novo template que vem com o SP1 do Visual Studio 2005(e já está disponível nas versões mais recentes &#8211; ASP.NET AJAX Enabled Web Application), o AJAX não funcionará sem configuração. O que precisa ser feito é modificar o web.config  com as configurações específicas do ASP.NET AJAX. Este processo está bem detalhado na documentação da biblioteca. Se estiver tendo problemas para configurar o web.config, sugiro que você crie um novo projeto do tipo ASP.NET AJAX Enabled Web Application, copie o web.config e faça as alterações necessárias para o seu site, substituindo seu antigo web.config.</p>
<p>Controles incompatíveis com o UpdatePanel – Tive esse problema essa semana. Tive que incluir alguns controles do tipo UpdatePanel em uma página que continha um mapa do google utilizando a biblioteca subgurim, que mostrei em <a href="http://brunobemfica.net/?p=303">outro artigo</a>. Foi só colocar os painéis na página, que o mapa não era mais exibido. Ao procurar na documentação do UpdatePanel, dê uma olhada na sessão &#8220;Controls that Are Not Compatible with UpdatePanel Controls&#8221;.  Alguns controles mais simples(Como os Validators) podem ter seus conflitos resolvidos simplesmente alterando a propriedade EnableClientScript para &#8220;false&#8221;.</p>
<p>A lista não está completa, mas já engloba a maior parte dos problemas ocorridos diariamente. Além dos apresentados aqui, é comum o aparecimento de problemas como manchas na pele e dor no corpo quando se tem dengue  conflito entre as triggers do UpdatePanel, User Controls dentro de  UpdatePanels e UpdatePanels dentro de  MasterPages(o que eu particularmente acho abominável). É bom sempre checar a documentação do ASP.NET AJAX  para se familiarizar com os controles e sua forma de funcionamento.</p>
<p>Bem, é isso. Críticas e sugestões, os comentários estão abertos. Abraços e keep coding!<br />
<!-- WSA: ad in context Contexto2 not shown: too many ads --></p>
]]></content:encoded>
			<wfw:commentRss>http://brunobemfica.net/?feed=rss2&amp;p=341</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Encurtando URLs com o tinyURL e C#</title>
		<link>http://brunobemfica.net/?p=338</link>
		<comments>http://brunobemfica.net/?p=338#comments</comments>
		<pubDate>Thu, 06 May 2010 10:00:46 +0000</pubDate>
		<dc:creator>Bruno Bemfica</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[encurtar url]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[tinyurl]]></category>

		<guid isPermaLink="false">http://brunobemfica.net/?p=338</guid>
		<description><![CDATA[Esse artigo é uma pequena demonstração de como encurtar endereços web automaticamente, consumindo os serviços do TinyURL, um dos encurtadorer de URLs mais popularer da atualidade. O código exige a utilização de  expressões regulares, para verificar se o endereço recebido como parâmetro é uma URL válida, para que não ocorram erros. Observe o método [...]]]></description>
			<content:encoded><![CDATA[<p>Esse artigo é uma pequena demonstração de como encurtar endereços web automaticamente, consumindo os serviços do <a href="http://tinyurl.com">TinyURL</a>, um dos encurtadorer de URLs mais popularer da atualidade. O código exige a utilização de <a href="http://pt.wikipedia.org/wiki/Regex"> expressões regulares</a>, para verificar se o endereço recebido como parâmetro é uma URL válida, para que não ocorram erros. Observe o método abaixo:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">protected</span> <span style="color: #6666cc; font-weight: bold;">string</span> ValidarURL<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> txt<span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//Definindo a expressão que valida endereços web</span><br />
&nbsp; &nbsp; Regex regx <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Regex<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;http://([<span style="color: #008080; font-weight: bold;">\\</span>w+?<span style="color: #008080; font-weight: bold;">\\</span>.<span style="color: #008080; font-weight: bold;">\\</span>w+])+([a-zA-Z0-9<span style="color: #008080; font-weight: bold;">\\</span>~<span style="color: #008080; font-weight: bold;">\\</span>!<span style="color: #008080; font-weight: bold;">\\</span>@<span style="color: #008080; font-weight: bold;">\\</span>#<span style="color: #008080; font-weight: bold;">\\</span>$<span style="color: #008080; font-weight: bold;">\\</span>%<span style="color: #008080; font-weight: bold;">\\</span>^<span style="color: #008080; font-weight: bold;">\\</span>&amp;amp;<span style="color: #008080; font-weight: bold;">\\</span>*<span style="color: #008080; font-weight: bold;">\\</span>(<span style="color: #008080; font-weight: bold;">\\</span>)_<span style="color: #008080; font-weight: bold;">\\</span>-<span style="color: #008080; font-weight: bold;">\\</span>=<span style="color: #008080; font-weight: bold;">\\</span>+<span style="color: #008080; font-weight: bold;">\\</span><span style="color: #008080; font-weight: bold;">\\</span><span style="color: #008080; font-weight: bold;">\\</span>/<span style="color: #008080; font-weight: bold;">\\</span>?<span style="color: #008080; font-weight: bold;">\\</span>.<span style="color: #008080; font-weight: bold;">\\</span>:<span style="color: #008080; font-weight: bold;">\\</span>;<span style="color: #008080; font-weight: bold;">\'</span><span style="color: #008080; font-weight: bold;">\\</span>,]*)?&quot;</span>, RegexOptions<span style="color: #008000;">.</span><span style="color: #0000FF;">IgnoreCase</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//Retorna uma ou nenhuma string.</span><br />
&nbsp; &nbsp;<span style="color: #0600FF; font-weight: bold;">return</span> regx<span style="color: #008000;">.</span><span style="color: #0000FF;">Match</span><span style="color: #008000;">&#40;</span>txt<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>No código acima, definimos <s>meio trilhão de caracteres dentro de</s> uma expressão regular que checa caracteres válidos dentro de uma URL. Isso é necessário para que não fiquemos obtendo bad responses do servidor do TinyURL sem necessidade. Abaixo, faremos o método que realmente encurta as URLs. Observe o código:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;height:500px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">string</span> EncurtarURL<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> url<span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">try</span><br />
&nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//Checa se a URL tem um tamanho mínimo &gt; o retorno do TinyURL</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>url<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span> <span style="color: #008000;">&lt;=</span> <span style="color: #FF0000;">12</span><span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">return</span> url<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #008080; font-style: italic;">//Checa se o endereço da URL não começa com HTTP ou FTP.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #008080; font-style: italic;">//Caso não comece, o prefixo http será adicionado.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">!</span>url<span style="color: #008000;">.</span><span style="color: #0000FF;">ToLower</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">StartsWith</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;http&quot;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&amp;&amp;</span> <span style="color: #008000;">!</span>url<span style="color: #008000;">.</span><span style="color: #0000FF;">ToLower</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">StartsWith</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;ftp&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;http://&quot;</span> <span style="color: #008000;">+</span> url<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #008080; font-style: italic;">//Encurta a URL fazendo um request ao TinyURL</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var requisicao <span style="color: #008000;">=</span> WebRequest<span style="color: #008000;">.</span><span style="color: #0000FF;">Create</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;http://tinyurl.com/api-create.php?url=&quot;</span> <span style="color: #008000;">+</span> url<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var resposta <span style="color: #008000;">=</span> requisicao<span style="color: #008000;">.</span><span style="color: #0000FF;">GetResponse</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6666cc; font-weight: bold;">string</span> texto<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008000;">&#40;</span>var reader <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> StreamReader<span style="color: #008000;">&#40;</span>resposta<span style="color: #008000;">.</span><span style="color: #0000FF;">GetResponseStream</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; texto <span style="color: #008000;">=</span> reader<span style="color: #008000;">.</span><span style="color: #0000FF;">ReadToEnd</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">return</span> texto<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">catch</span> <span style="color: #008000;">&#40;</span>Exception<span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//...</span><br />
&nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>O código acima, através de requisições ao servidor do TinyURL, transforma o endereço recebido como parâmetro, em uma URL encurtada de forma automatizada, sem que seja necessário entrar no site para tal operação. É uma operação muito comum nos clientes desktop do Twitter, devido à limitação de 140 caracteres.<br />
Bem, por enquanto é só. Críticas e sugestões, os comentários estão abertos!</p>
<p>Abraços e keep coding! </p>
]]></content:encoded>
			<wfw:commentRss>http://brunobemfica.net/?feed=rss2&amp;p=338</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Melhores práticas de segurança em ASP.NET</title>
		<link>http://brunobemfica.net/?p=279</link>
		<comments>http://brunobemfica.net/?p=279#comments</comments>
		<pubDate>Wed, 05 May 2010 03:09:25 +0000</pubDate>
		<dc:creator>Bruno Bemfica</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[segurança]]></category>

		<guid isPermaLink="false">http://brunobemfica.net/?p=279</guid>
		<description><![CDATA[Segurança é um dos pontos mais importantes no desenvolvimento de aplicações, especialmente aplicações web. Criar um modelo de segurança complexo é um dos fatores determinantes para o sucesso de um software. Problemas de segurança além de gerar constrangimento público para a empresa dona do software(como as invasões que o Google sofreu nos últimos tempos), pode [...]]]></description>
			<content:encoded><![CDATA[<p>Segurança é um dos pontos mais importantes no desenvolvimento de aplicações, especialmente aplicações web. Criar um modelo de segurança complexo é um dos fatores determinantes para o sucesso de um software. Problemas de segurança além de gerar constrangimento público para a empresa dona do software(como as invasões que o Google sofreu nos últimos tempos), pode causar problemas judiciais, por exemplo pela exposição e/ou apropriação indevida dos dados de terceiros.<br />
<span id="more-279"></span><br />
Quando falamos de segurança em ASP.NET, podemos fundamentar três pilares: Autorização, Representação e Autenticação. Abordarei esse assunto em mais de um artigo, por isso não tratarei tudo de uma vez.</p>
<p>Vamos começar nossa discusão com uma visão geral da seqüência de eventos inerentes à autenticação e à autorização cada vez que uma solicitação nova é feita à página.<br />
Quando uma requisição chega ao IIS, ele checa a validade. Se o modo de autenticação estiver definido como anônimo(como é padrão), a requisição é aprovada automaticamente. Mas se o modo de autenticação do web.config estiver definido de forma diferente, o IIS realiza a autenticação específica antes de repassar a solicitação ao ASP.NET.</p>
<p>O ASP.NET por sua vez checa  se a representação está habilitada(falaremos sobre representação posteriormente neste artigo). Caso esteja habilidade, o ASP.NET executa com a identidade da entidade que está realizando a operação. Do contrário, a aplicação executa a ação com a identidade local do IIS e os privilégios locais definidos para a conta de usuário do ASP.NET. Por fim, o ASP.NET engine executa uma checagem de autorização nos recursos solicitados pelo usuário autenticado, e caso ele seja autorizado, retorna a requisição pelo pipeline do IIS.</p>
<p>Vamos falar sobre autenticação, autorização e representação e como implementá-los em ASP.NET.</p>
<h2>Autenticação</h2>
<p>A autenticação determina quando um usuário tem ou não uma determinada permissão, baseada nas suas credenciais.  Um usuário está autorizado a acessar os recursos, desde que esteja autenticado. O arquivo Web.config contém todas as configurações para um aplicativo ASP.NET, incluindo a forma de autenticação. Um provedor de autenticação é utilizado para checar a identidade dos usuários em um sistema. Existem 3 formas de se autenticar um usuário no ASP.NET:</p>
<p>- Windows authentication<br />
- Forms authentication<br />
- Passport authentication</p>
<h3>Forms Authentication</h3>
<p>Este tipo de autenticação é baseado em cookies, que armazenam login e senha do usuário em arquivos texto ou em uma base de dados. Ele utiliza cookies de persistência e de sessão. Depois que um usuário está autenticado, suas credenciais são armazenadas em cookies válidos para aquela sessão. Quando o usuário não está autenticado e requisita uma página que requer autorização, é direcionado para a página de login da aplicação. O código abaixo demonstra como aplicar isso ao ASP.NET.</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;system.web<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;authentication</span> <span style="color: #000066;">mode</span>=<span style="color: #ff0000;">&quot;Forms&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;forms</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;FormDeLogin&quot;</span> <span style="color: #000066;">loginUrl</span>=<span style="color: #ff0000;">&quot;FormDeLogin.aspx&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;authorization<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;deny</span> <span style="color: #000066;">users</span>=<span style="color: #ff0000;">&quot;?&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/authorization<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/system.web<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>
<p>Perceba que o símbolo &#8221; ? &#8221; representa todos os usuários anônimos ou não autenticados. Normalmente, o usuário digita login e senha, clica no botão de login e o form valida os valores através de uma camada de persistência(base de dados). O código abaixo demonstra como isso pode ser validado:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6666cc; font-weight: bold;">String</span> login <span style="color: #008000;">=</span> txtLogin<span style="color: #008000;">.</span><span style="color: #0000FF;">Text</span><span style="color: #008000;">;</span><br />
<span style="color: #6666cc; font-weight: bold;">String</span> senha <span style="color: #008000;">=</span> txtSenha<span style="color: #008000;">.</span><span style="color: #0000FF;">Text</span><span style="color: #008000;">;</span><br />
<span style="color: #6666cc; font-weight: bold;">bool</span> usuarioValido <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">;</span><br />
<span style="color: #008080; font-style: italic;">//(...) Código que valida o usuário(...)</span><br />
<span style="color: #0600FF; font-weight: bold;">if</span><span style="color: #008000;">&#40;</span>isUserValid<span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
FormsAuthentication<span style="color: #008000;">.</span><span style="color: #0000FF;">RedirectFromLoginPage</span><span style="color: #008000;">&#40;</span>txtLogin<span style="color: #008000;">.</span><span style="color: #0000FF;">Text</span>, <span style="color: #0600FF; font-weight: bold;">False</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF; font-weight: bold;">else</span> <span style="color: #008080; font-style: italic;">// Se o usuário ou a senha são inválidos</span><br />
lblErro<span style="color: #008000;">.</span><span style="color: #0000FF;">Text</span> <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Login e/ou senha inválidos&quot;</span><span style="color: #008000;">;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>O método <em>RedirectFromLoginPage</em> cria um ticket de autenticação e o utiliza para redirecionar o usuário, agora já autenticado, de volta à pagina solicitada, ou à uma página padrão pré-definida. O código abaixo demonstra como podemos especificar credenciais de usuário diretamente no web.config.</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;system.web<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;authentication</span> <span style="color: #000066;">mode</span>=<span style="color: #ff0000;">&quot;Forms&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;forms</span> <span style="color: #000066;">loginUrl</span>=<span style="color: #ff0000;">&quot;FormDeLogin.aspx&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span><br />
<span style="color: #009900;">&lt;<span style="color: #000066;">credentialspasswordFormat</span>=<span style="color: #ff0000;">&quot;Clear&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;user</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Usuario&quot;</span> <span style="color: #000066;">password</span>=<span style="color: #ff0000;">&quot;S3nh@123&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/credentials<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/forms<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/authentication<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;authorization<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/system.web<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>
<p>Independentemente da técnica de autenticação utilizada, você deve encriptar o Web.config por razões de segurança. Abordarei isso posteriormente.</p>
<p>Você também pode utilizar a autenticação via Forms para verificar a autenticidade de um usuário em uma base de dados onde uma base de dados armazene esse tipo de informação. O código abaixo ilustra como isso pode ser feito. O método <em>ValidarUsuario</em>, a ser  chamado diretamente na página, recebe como parâmetros login e senha, e chama o  método <em>ValidarNaBaseDeDados</em>(que será abstraído),  que por sua vez conecta-se ao banco de dados e verifica se os dados estão corretos. No caso, os parâmetros serão os textos de dois controles do tipo TextBox. Observe o código do botão de Login na página:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #0600FF; font-weight: bold;">protected</span> <span style="color: #6666cc; font-weight: bold;">void</span> Button1_Click<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> sender, EventArgs e<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
<span style="color: #0600FF; font-weight: bold;">if</span><span style="color: #008000;">&#40;</span><a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> ClassedeLogin<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ValidarUsuario</span><span style="color: #008000;">&#40;</span>txtLogin<span style="color: #008000;">.</span><span style="color: #0000FF;">Text</span>,txtSenha<span style="color: #008000;">.</span><span style="color: #0000FF;">Text</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><br />
Response<span style="color: #008000;">.</span><span style="color: #0000FF;">Redirect</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;URL qualquer&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF; font-weight: bold;">else</span><br />
lblErro<span style="color: #008000;">.</span><span style="color: #0000FF;">Message</span> <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Usuário e/ou senha inválidos.&quot;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span></div></div>
<p>E o código da classe de negócio responsável pelo Login:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> ClasseDeLogin<span style="color: #008000;">&#123;</span><br />
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">bool</span> ValidarUsuario<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> login, <span style="color: #6666cc; font-weight: bold;">string</span> senha<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><br />
<span style="color: #6666cc; font-weight: bold;">bool</span> usuarioAutenticado <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF; font-weight: bold;">try</span><br />
<span style="color: #008000;">&#123;</span><br />
usuarioAutenticado <span style="color: #008000;">=</span> ValidarNaBaseDeDados<span style="color: #008000;">&#40;</span>login,senha<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #008000;">&#125;</span><br />
<span style="color: #0600FF; font-weight: bold;">catch</span><span style="color: #008000;">&#40;</span>Exception ex<span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
<span style="color: #008080; font-style: italic;">//Tratamento de exceções</span><br />
<span style="color: #008000;">&#125;</span><br />
<span style="color: #0600FF; font-weight: bold;">return</span> usuarioAutenticado<span style="color: #008000;">;</span><br />
<span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<h3>Windows Authentication</h3>
<p>A autenticação Windows é utilizada para autenticação baseada em usuários do Windows, geralmente utilizando LDAP como base de dados de usuários, utilizando o <a href="http://pt.wikipedia.org/wiki/Active_Directory">Active Directory</a> para tal. Porém, é apenas aplicável em ambientes de intranet, aonde há um administrador com controle total sobre a rede. O código abaixo demonstra como configurar a autenticação Windows no ASP.NET.</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;authentication</span> <span style="color: #000066;">mode</span>=<span style="color: #ff0000;">&quot;Windows&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;authorization<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;allow</span> users =<span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/authorization<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>
<p>Perceba que o símbolo &#8221;  *  &#8221; indica que todos os usuários, incluindo anônimos e não autenticados, terão acesso.A autenticação Windows se subdivide nos seguintes tipos:</p>
<p>-Autenticação anônima(Anonymous Authentication)<br />
-Autenticação Básica(Basic Authentication)<br />
-Autenticação sumária(Digest Authentication)<br />
-Autenticação integrada ao Windows(Integrated Windows Authentication)</p>
<p>No modo de autenticação anônima, o IIS permite que qualquer usuário acesse a aplicação ASP.NET, sem nenhuma checagem de autenticação. No modo de autenticação básica, os usuários serão solicitados a digitar usuário e senha do Windows(este é um modo deveras inseguro).</p>
<p>A autenticação sumária é idêntica à básica, com a diferença que a senha é encriptada antes de ser  enviada pela rede. No modo de autenticação integrada, a senha não é enviada através da rede, mas sim, o aplicativo usa alguns protocolos de autenticação de rede para que funcione.</p>
<h3>Autenticação via passaporte</h3>
<p>A autenticação via passaporte é uma autenticação centralizada, que utiliza o passaporte .NET da microsoft para autenticar os usuários em uma aplicação. Permite que o usuário crie um Login simples e uma senha para acessar qualquer site que implemente o serviço SSI do Passport .Abaixo, uma demonstração de como utilizar a autenticação Passport no ASP.NET.</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;system.web<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;">&lt;<span style="color: #000066;">authenticationmode</span>=”Passport”<span style="color: #000000; font-weight: bold;">&gt;</span></span><br />
<span style="color: #009900;">&lt;<span style="color: #000066;">passportredirectUrl</span>=”LoginForm.aspx” <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/authentication<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;authorization<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;deny</span> <span style="color: #000066;">users</span>=”?” <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/authorization<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/system.web<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>
<h2>Autorização</h2>
<p>Autorização é o processo de determinada a acessibilidade a um recurso para um usuário já autenticado, e somente neles, garantindo que nenhum usuário não autenticado tenha acesso à aplicação. A sintaxe para autorização específica em ASP.NET segue abaixo.</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;authorization<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;">&lt; <span style="color: #66cc66;">&#91;</span> allow | deny <span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#91;</span> users <span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#91;</span> roles <span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#91;</span> verbs <span style="color: #66cc66;">&#93;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/authorization<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>
<p>Em ASP.NET, existem 3 formas de autorização:</p>
<p>-Autorização de URL<br />
-Autorização de arquivo<br />
-Autorização baseada em ACLs</p>
<h3>Autorização de arquivo</h3>
<p>A autorização de arquivos é executada através do <em>FileAuthorizationModule</em>, e é ativada quando a aplicação está configurada para utilizar autenticação Windows. Ela checa a lista de controle da acesso(<em>Access Control List &#8211;  ACL</em> ) do arquivo para determinar se o usuário possui permissão de acessá-lo. As permissões de ACL são verificadas pelo Windows identity, ou caso a representação esteja ativa, pelo Windows identity do processo do  ASP.NET.</p>
<h3>Autorização de URL</h3>
<p>A autenticação de URL é feita através do <em>AuthorizationModule</em>,  que mapeia usuários e regras para URLs em aplicações ASP.NET. Este módulo pode ser utilizado para seletivamente permitir ou negar acesso a certas partes da aplicação(geralmente diretórios) para alguns usuários ou regras(grupos de usuários).</p>
<p>A autorização, tal qual a autenticação, é especificada no arquivo Web.config da aplicação. Abaixo, um exemplo de como se configura a autorização no ASP.NET .</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;authorization<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;allow</span> <span style="color: #000066;">users</span>=<span style="color: #ff0000;">&quot;Bruno&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;deny</span> <span style="color: #000066;">users</span>=<span style="color: #ff0000;">&quot;OutroUsuario&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;deny</span> <span style="color: #000066;">users</span>=<span style="color: #ff0000;">&quot;?&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/authorization<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>
<p>Também é possível especificar o local para o qual uma ou mais regras de autorização são aplicáveis. Observe abaixo:</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;location</span> path = <span style="color: #ff0000;">&quot;PaginaDeAdministracao.aspx&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;system.web<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;authorization<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;allow</span> users = <span style="color: #ff0000;">&quot;?&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/authorization<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/system.web<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/location<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>
<p>Também é possível restringir ou permitir acesso ao GET ou ao POST para um ou mais usuários da aplicação ASP.NET. O código a seguir habilita o post para o usuário Bruno, enquanto nega para o resto dos usuário. Isto permite definir quem tem permissão para alterar dados na aplicação,ou apenas visualizá-los.</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;authorization<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;allow</span> verb = <span style="color: #ff0000;">&quot;GET&quot;</span> users = <span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;allow</span> verb = <span style="color: #ff0000;">&quot;POST&quot;</span> users = <span style="color: #ff0000;">&quot;Bruno&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;deny</span> verb = <span style="color: #ff0000;">&quot;POST&quot;</span> users = <span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/authorization<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>
<h2>Representação</h2>
<p>De acordo com a documentação oficial da Microsoft, &#8220;Quando se utiliza da representação, as aplicações ASP.NET podem opcionalmente executar com a identidade do client que as está executando&#8221;. Geralmente isto é feito para evitar complicações com autenticação e autorização no código da aplicação. Ao invés disso, você conta com o IIS para autenticar o usuário e também fornecer os tokens de autenticação ao ASP.NET. A aplicação, agora representa o cliente, e em seguida, depende das configurações dos diretórios e arquivos NTFS para permitir ou não o acesso. Assegure-se de que a partição está em formato NTFS, caso contrário as permissões não terão como ser concedidas.</p>
<p>Note que a representação está desabilita por padrão e pode ser especificada no Web.config, como demonstrado abaixo:</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;identity</span> <span style="color: #000066;">impersonate</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></div></div>
<p>Ou, para desabilitar:</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;identity</span> <span style="color: #000066;">impersonate</span>=<span style="color: #ff0000;">&quot;false&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></div></div>
<p>Para representar uma entidade em particular, especifique-a no seu Web.config:</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;identity</span> <span style="color: #000066;">impersonate</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">username</span>=<span style="color: #ff0000;">&quot;Bruno&quot;</span> <span style="color: #000066;">password</span>=<span style="color: #ff0000;">&quot;S3nh@123&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></div></div>
<p>Bem, por enquanto é isso. Continuarei a falar sobre segurança em ASP.NET posteriormente em outros artigos. Críticas e sugestões, os comentários estão abertos.</p>
<p>Abraços e keep coding.<br />
<!-- WSA: ad in context Contexto not shown: too many ads --></p>
]]></content:encoded>
			<wfw:commentRss>http://brunobemfica.net/?feed=rss2&amp;p=279</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utilizando A API do Google Maps no ASP.NET</title>
		<link>http://brunobemfica.net/?p=303</link>
		<comments>http://brunobemfica.net/?p=303#comments</comments>
		<pubDate>Mon, 03 May 2010 20:13:25 +0000</pubDate>
		<dc:creator>Bruno Bemfica</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[Google Maps]]></category>
		<category><![CDATA[subgurim]]></category>

		<guid isPermaLink="false">http://brunobemfica.net/?p=303</guid>
		<description><![CDATA[Este artigo destina-se a mostrar como utilizar a API do Google Maps integrada a um site ASP.NET, para que possamos exibir a localização de endereços diretamente na nossa página.

Primeiros passos
O primeiro passo é fazer um cadastro no próprio google para obter uma chave de acesso ao Maps. Isso pode ser feito  aqui.
Já tendo sua [...]]]></description>
			<content:encoded><![CDATA[<p>Este artigo destina-se a mostrar como utilizar a API do <a href="http://maps.google.com">Google Maps</a> integrada a um site ASP.NET, para que possamos exibir a localização de endereços diretamente na nossa página.<br />
<span id="more-303"></span></p>
<h2>Primeiros passos</h2>
<p>O primeiro passo é fazer um cadastro no próprio google para obter uma chave de acesso ao Maps. Isso pode ser feito <a href="http://code.google.com/intl/pt-BR/apis/maps/signup.html"> aqui</a>.</p>
<p>Já tendo sua chave de acesso, pegaremos agora o <a href="http://googlemaps.subgurim.net/">Subgurim</a>, uma biblioteca freeware para acesso à API dos mapas do Google. Faça o Download e extraia na pasta Projects do Visual Studio.</p>
<p>Crie um novo projeto de ASP.NET webforms, e dê a ele o nome que preferir. Em seguida, no Solution Explorer, clique com o botão direito em References, e vá em Add Reference. Clique na aba Browse, navegue até a pasta onde foi extraída a DLL do Subgurim, e adicione-a ao projeto. Após isso, abra seu web.config e adicione a chave que você obteve:</p>
<div class="codecolorer-container asp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="asp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-weight: bold;">&lt;</span>configuration xmlns<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;http://schemas.microsoft.com/.NetConfiguration/v2.0&quot;</span><span style="color: #006600; font-weight: bold;">&gt;</span> <br />
&nbsp; &nbsp; ... <br />
&nbsp; &nbsp; <span style="color: #006600; font-weight: bold;">&lt;</span>appSettings<span style="color: #006600; font-weight: bold;">&gt;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-weight: bold;">&lt;</span>add key<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;googlemaps.subgurim.net&quot;</span> value<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;ClaveDeGoogle&quot;</span> <span style="color: #006600; font-weight: bold;">/&gt;</span> <br />
&nbsp; &nbsp; <span style="color: #006600; font-weight: bold;">&lt;/</span>appSettings<span style="color: #006600; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; &nbsp;... <br />
<span style="color: #006600; font-weight: bold;">&lt;/</span>configuration<span style="color: #006600; font-weight: bold;">&gt;</span></div></div>
<p>Aqui cabe citar algo curioso: Eu modifiquei o nome da chave, de &#8220;googlemaps.subgurim.net&#8221; para apenas &#8220;googlemaps&#8221;, e ao executar a página nos ambientes de teste e produção, obtive uma mensagem de erro dizendo que a chave estava sendo utilizada em outro site, embora estivesse rodando normalmente na minha máquina de desenvolvimento. Provavelmente há alguma dependência forte dentro da biblioteca com relação ao nome do atributo. Sugiro que deixem exatamente este nome.</p>
<h2>Mãos à obra</h2>
<p>Vamos supor que temos uma empresa, cuja matriz fica em Porto Alegre, com filiais em Curitiba e São Paulo. Queremos exibir nosso endereço no mapa, assim que o cliente selecionar a filial que deseja em um DropDownList. O mapa será inicialmente carregado com o endereço da matriz. Criaremos um DropDownlist cujo Value é o endereço da empresa, e o texto exibido é composto por cidade e estado. Note que é preciso<strong> registrar o assembly</strong>, logo após a diretiva inicial da página. O código do seu arquivo ASPX deve ficar assim:</p>
<div class="codecolorer-container asp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;height:500px;"><div class="asp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;%</span><span style="color: #006600; font-weight: bold;">@</span> Page Language<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;C#&quot;</span> AutoEventWireup<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;true&quot;</span> CodeBehind<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;Default.aspx.cs&quot;</span> Inherits<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;TesteComMapas._Default&quot;</span> <span style="color: #000000; font-weight: bold;">%&gt;</span><br />
<span style="color: #000000; font-weight: bold;">&lt;%</span><span style="color: #006600; font-weight: bold;">@</span> register assembly<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;GMaps&quot;</span> namespace<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;Subgurim.Controles&quot;</span> tagprefix<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;maps&quot;</span> <span style="color: #000000; font-weight: bold;">%&gt;</span><br />
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;<br />
<br />
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; &gt;<br />
&lt;head runat=&quot;server&quot;&gt;<br />
&nbsp; &nbsp; &lt;title&gt;&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&nbsp; &nbsp; &lt;form id=&quot;form1&quot; runat=&quot;server&quot;&gt;<br />
&nbsp; &nbsp; &lt;asp:ScriptManager runat=server ID=&quot;smanager&quot;/&gt; <br />
&nbsp; &nbsp; &lt;div&gt;&lt;asp:UpdatePanel ID=&quot;upanel&quot; runat=server&gt;<br />
&nbsp; &nbsp; &lt;ContentTemplate&gt;<br />
&nbsp; &nbsp; &lt;asp:Label ID=&quot;lbl1&quot; Text=&quot;Selecione a filial: &quot; Visible=true runat=server/&gt;<br />
&nbsp; &nbsp; &nbsp; &lt;asp:DropDownList ID=&quot;cboEnderecos&quot; runat=&quot;server&quot; &nbsp;AutoPostBack=true<br />
&nbsp; &nbsp; &nbsp; &nbsp; onselectedindexchanged=&quot;cboEnderecos_SelectedIndexChanged&quot;&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;asp:ListItem Value=&quot;Avenida Ipiranga, 600, Partenon, Porto Alegre - Rio Grande do Sul, Brasil&quot;&gt;Matriz - Porto Alegre - RS&lt;/asp:ListItem&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;asp:ListItem Value=&quot;Avenida Paulista, 1000, Consolação, São Paulo, Brasil&quot;&gt;Filial São Paulo - SP&lt;/asp:ListItem&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;asp:ListItem Value=&quot;Praça Rui Barbosa,100 Centro, Curitiba - Paraná, Brasil&quot;&gt;Filial Curitiba - PR&lt;/asp:ListItem&gt;<br />
&nbsp; &nbsp; &nbsp; &lt;/asp:DropDownList&gt;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp;&lt;maps:GMap ID=&quot;GoogleMaps&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;runat=&quot;server&quot;/&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/ContentTemplate&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/asp:UpdatePanel&gt;<br />
&nbsp; &nbsp; &lt;/div&gt;<br />
&nbsp; &nbsp; &lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</div></div>
<p>Adicionei aqui um <em>UpdatePanel</em>, para dar a impressão de atualização automática, e um <em>ScriptManager</em> para gerenciá-lo. Utilizaremos as propriedades <em>Value</em> de cada um dos itens da DropDownlist como parâmetro para obter o mapa do Google. Dessa forma, o usuário não terá de digitar o endereço para obter a localização no mapa, pois é a nossa intenção automatizar tudo. Reproduza o código abaixo, no seu arquivo CS de code-behind:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;height:500px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Collections.Generic</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Linq</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Web</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Web.UI</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Web.UI.WebControls</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">Subgurim.Controles</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Configuration</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF; font-weight: bold;">namespace</span> TesteComMapas <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">partial</span> <span style="color: #6666cc; font-weight: bold;">class</span> _Default <span style="color: #008000;">:</span> <span style="color: #000000;">System.<span style="color: #0000FF;">Web</span><span style="color: #008000;">.</span><span style="color: #0000FF;">UI</span></span><span style="color: #008000;">.</span><span style="color: #0000FF;">Page</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">protected</span> <span style="color: #6666cc; font-weight: bold;">void</span> Page_Load<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> sender, EventArgs e<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ExibirMapa</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">protected</span> <span style="color: #6666cc; font-weight: bold;">void</span> cboEnderecos_SelectedIndexChanged<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> sender, EventArgs e<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ExibirMapa</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">protected</span> <span style="color: #6666cc; font-weight: bold;">void</span> ExibirMapa<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//Adicionando nossa chave ao mapa</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GoogleMaps<span style="color: #008000;">.</span><span style="color: #0000FF;">Key</span> <span style="color: #008000;">=</span> ConfigurationSettings<span style="color: #008000;">.</span><span style="color: #0000FF;">AppSettings</span><span style="color: #008000;">&#91;</span><span style="color: #666666;">&quot;googlemaps.subgurim.net&quot;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// Habilitando o zoom no mapa</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GoogleMaps<span style="color: #008000;">.</span><span style="color: #0000FF;">enableHookMouseWheelToZoom</span> <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//Obtendo as informações de latitude e longitura à partir do endereço</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GLatLng latitudeLongitude <span style="color: #008000;">=</span> GoogleMaps<span style="color: #008000;">.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000FF;">getGeoCodeRequest</span><span style="color: #008000;">&#40;</span>cboEnderecos<span style="color: #008000;">.</span><span style="color: #0000FF;">SelectedValue</span><span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">.</span><span style="color: #0000FF;">Placemark</span><span style="color: #008000;">.</span><span style="color: #0000FF;">coordinates</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// Definir o tipo do mapa</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// Satellite, Hybrid, Physical, Normal</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GoogleMaps<span style="color: #008000;">.</span><span style="color: #0000FF;">mapType</span> <span style="color: #008000;">=</span> GMapType<span style="color: #008000;">.</span><span style="color: #0000FF;">GTypes</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Hybrid</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// Definimos o ponto inicial do mapa para o endereço passado</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// e o segundo parâmetro é o zoom inicial</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GoogleMaps<span style="color: #008000;">.</span><span style="color: #0000FF;">setCenter</span><span style="color: #008000;">&#40;</span>latitudeLongitude, <span style="color: #FF0000;">15</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//Criando as marcações do mapa</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GIcon icon <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> GIcon<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; icon<span style="color: #008000;">.</span><span style="color: #0000FF;">markerIconOptions</span> <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> MarkerIconOptions<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">50</span>, <span style="color: #FF0000;">50</span>, <span style="color: #000000;">System.<span style="color: #0000FF;">Drawing</span></span><span style="color: #008000;">.</span><span style="color: #0000FF;">Color</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Red</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GMarker marker <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> GMarker<span style="color: #008000;">&#40;</span>latitudeLongitude, icon<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//Criando o balão com o endereço do Mapa</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GInfoWindow window <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> GInfoWindow<span style="color: #008000;">&#40;</span>marker,cboEnderecos<span style="color: #008000;">.</span><span style="color: #0000FF;">SelectedValue</span>,<span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GoogleMaps<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>window<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// Criando controles referentes ao tipo de mapa, tamanho e tipo de visão.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//Esses controles serão melhor entendidos na visualização do mapa:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GControl mapType <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> GControl<span style="color: #008000;">&#40;</span>GControl<span style="color: #008000;">.</span><span style="color: #0000FF;">preBuilt</span><span style="color: #008000;">.</span><span style="color: #0000FF;">MapTypeControl</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GControl overview <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> GControl<span style="color: #008000;">&#40;</span>GControl<span style="color: #008000;">.</span><span style="color: #0000FF;">preBuilt</span><span style="color: #008000;">.</span><span style="color: #0000FF;">GOverviewMapControl</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GControl small <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> GControl<span style="color: #008000;">&#40;</span>GControl<span style="color: #008000;">.</span><span style="color: #0000FF;">preBuilt</span><span style="color: #008000;">.</span><span style="color: #0000FF;">SmallMapControl</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GoogleMaps<span style="color: #008000;">.</span><span style="color: #0000FF;">addControl</span><span style="color: #008000;">&#40;</span>mapType<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GoogleMaps<span style="color: #008000;">.</span><span style="color: #0000FF;">addControl</span><span style="color: #008000;">&#40;</span>overview<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GoogleMaps<span style="color: #008000;">.</span><span style="color: #0000FF;">addControl</span><span style="color: #008000;">&#40;</span>small<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<h2>Detalhamento</h2>
<p>Importamos os namespaces <em>Subgurim.controles</em> para termos acesso aos webcontrols responsáveis pela exibição do mapa, e o <em>System.Configuration</em> para que pudéssemos acessar a chave do Google através do web.config. O Google maps necessita das coordenadas(Latitude e Longitude) para centralizar um ponto e/ou traçar dois pontos através da <a href="http://pt.wikipedia.org/wiki/Teoria_dos_grafos">Teoria dos grafos</a>, por isso enviamos uma requisição com o endereço inicialmente, obtivemos as coordenadas e só então as passamos como parâmetros para o mapa.<br />
É importante lembrar que o Google Maps não é 100% preciso. Às vezes, remover o bairro da string do endereço, ou trocar o endereço por &#8220;CEP:NumeroDoCep, Brasil&#8221; encontra endereços ditos desconhecidos, não encontrados como demonstrei aqui. Sugiro que, caso necessário, façam uma rotina condicional para contornar esse problema.</p>
<p>Bem, por enquanto é isso. Críticas e sugestões, os comentários estão abertos. Abraços e keep coding!<br />
<!-- WSA: ad in context Contexto2 not shown: too many ads --></p>
]]></content:encoded>
			<wfw:commentRss>http://brunobemfica.net/?feed=rss2&amp;p=303</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Microsoft Axum &#8211; uma nova linguagem[introdução]</title>
		<link>http://brunobemfica.net/?p=282</link>
		<comments>http://brunobemfica.net/?p=282#comments</comments>
		<pubDate>Mon, 03 May 2010 04:40:42 +0000</pubDate>
		<dc:creator>Bruno Bemfica</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Axum]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[Framework 4.0]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Paralelismo]]></category>

		<guid isPermaLink="false">http://brunobemfica.net/?p=282</guid>
		<description><![CDATA[O time de linguagens da Microsoft nos presentou com mais uma linguagem no .NET Framework: O Axum. O Axum é mais um diferencial no portfólio de linguagens da Microsoft, e vem para complementar a família que já inclui Visual Basic .NET e F#. Este é o primeiro de alguns artigos sobre o Axum, lembrando que [...]]]></description>
			<content:encoded><![CDATA[<p>O time de linguagens da Microsoft nos presentou com mais uma linguagem no .NET Framework: O Axum. O Axum é mais um diferencial no portfólio de linguagens da Microsoft, e vem para complementar a família que já inclui Visual Basic .NET e F#. Este é o primeiro de alguns artigos sobre o Axum, lembrando que o release atual ainda não é uma versão estável e final.</p>
<p><span id="more-282"></span></p>
<h2>Mais uma linguagem?</h2>
<p>O Axum (anteriormente conhecida pelo codinome Maestro) é uma linguagem de programação de domínio de concorrência específica, com base em um modelo de atores. É uma linguagem orientada a agentes com uma sintaxe C-like que , sendo uma linguagem específica de domínio, é destinada ao desenvolvimento de partes de uma aplicação de software onde haja concorrência, ou seja: Tem um uso específico. Mas ele contém o suficiente para uso geral em construções em que não é preciso mudar para uma linguagem de propósito geral de programação (como C#) para as partes seqüenciais dos componentes de concorrência. Basicamente, é voltada a aproveitar toda a capacidade das novas CPUs através de paralelismo. Pode ser encontrado aqui: <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=cfe70d5d-37aa-4c4c-8eeb-d4576c41baa2">http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=cfe70d5d-37aa-4c4c-8eeb-d4576c41baa2</a></p>
<p>Escrever um programa com paralelismo, geralmente, requer dividir uma solução em um N número de tarefas paralelas. Certos problemas são facilmente amenizáveis com a paralelização, pois as tarefas são executadas independentemente umas das outras, mas em outros casos as tarefas são interdependentes  e requerem orquestração. O Axum foi pensado para coordenar tarefas concorrentes e  escrever aplicações responsivas frente à latência.</p>
<p>Com o axum, os programadores podem organizar a orquestração entre componentes de uma maneira muito próxima à solução. Em outras palavras, se você puder modelar sua solução pensando em componentes interativos, progamar em Axum será fácil, e irá melhorar e facilitar a correção de bugs referentes a concorrência.</p>
<p>O maior motivo para se escrever uma aplicação com paralelismo é também o mais óbvio: O software fica mais rápido! -Além do desejo de que o software faça mais enquanto é executado. Isso é essencial a aplicações que precisam processar entradas de dados dos usuários enquanto executam tarefas em background.</p>
<p>Um dos objetivos de Axum é permitir que você programe sem se preocupar com concorrência &#8211; o seu programa torna-se rápido e responsivo por padrão, não como resultado de uma adequação.</p>
<p>Além de trazer novas possibilidades para o trabalho com concorrência, o Axum remove uma capacidade que historicamente causa problema: A possibilidade irrestrita de compartilhar e alterar estados entre tarefas diferentes. O modelo de isolamento do Axum garanto acesso &#8220;disciplinado&#8221; aos estados compatilhados, o que previne muitos erros comuns de programação.</p>
<p>O componente fundamental do Axum é o <em>Ator</em>(ou <em>Agente</em>), que nada mais é do que uma entidade isolada que executa tarefas em paralelos com outros atores. Trocando em miúdos, os atores executam ações em diferentes <em>domínios</em>, e objetos instanciados em um domínio não podem ser acessados por outro, e os domínios não compartilham recursos entre si(ex:memória). Ao invés disso, é utilizado o conceito de <em>troca de mensagens. </em>Para coordenar os atores ou utilizar a requisição de um ator como recurso de outro, uma mensagem explícita precisa ser enviada para o ator. O Axum fornece <em>canais</em> para isso. A linguagem foi inspirada em linguagens como <a href="http://pt.wikipedia.org/wiki/Ada_(linguagem_de_programa%C3%A7%C3%A3o)" target="_blank">Ada</a> e <a href="http://en.wikipedia.org/wiki/SR_(programming_language)" target="_blank">SR</a>.</p>
<p>Alguns recursos presentes no C# também estão presentes no Axum, porém nem todos. A saber:</p>
<h3>Presentes</h3>
<p>- Todas as expressões do C# 3.0, incluindo Lambda e Linq</p>
<p>- Todos os statements do  C# 3.0, incluindo return e brake</p>
<p>- Declaração de métodos e campos</p>
<p>- Delegates e enums</p>
<h3>Ausentes</h3>
<p>-Classes, interfaces e structs</p>
<p>-Sobrecarga de operadores</p>
<p>-Propriedades</p>
<p>-Constantes</p>
<p>-Métodos e campos estáticos</p>
<p>E as novidades que o  Axum traz podem ser divididos em 5 grupos:</p>
<p>-Agentes e domínios</p>
<p>-Canais</p>
<p>-Schema</p>
<p>-Redes</p>
<p>-Fluxo de controle intercalado</p>
<p>Das novas funcionalidades trazidas pelo Axum citadas acima, as 3 primeiras são referentes a isolamento de estado e troca de informações entre regiões isoladas da aplicação. Os dois últimos tratam de orquestração de mensagens pelos dados e controle de fluxo, respectivamente.</p>
<h2>Agentes(atores) e domínios</h2>
<p>Agentes são a menor unidade de isolamento no Axum. São similares a classes, mas a referência à instância de um agente não pode ser armazenada em qualquer lugar. Ao invés disso, agentes interagem entre si através de trocas de mensagens passando por canais pré-definidos. Esses canais definem portas distintas por onde passam os dados. Os canais ainda podem definir protocolos formais para a troca de informações entre comunicadores.</p>
<p>Um domínio é a unidade de isolamento imediatamente maior que um agente: Pode ser descrito como uma classe que possui somente campos privados e métodos, isolados de todos os outros domínios. Apenas os construtores estão disponíveis fora da definição do domínio. Agentes podem ser aninhados dentro de um domínio, tendo acesso ao estado do domínio, mas seus acessos são automaticamente orquestrados para prevenir conflitos.</p>
<p>Para definir os dados que trafegam entre os domínios, os agentes e as aplicações, o Axum permite um tipo especial de transferência de dados, chamado de <em>Schema</em>, muito parecido com o schema utilizado por um documento XML trafegado entre webservices. Um schema define a estrutura e as regras para os dados que transitam entre componentes isolados,  como os agentes.</p>
<p>O conceito central da interação entre os agentes é o de mensageria, como por exemplo passar valores entre componentes de forma síncrona ou assíncrona.Através do recebimento de  instruções e fluxos de controle intercalados, a manipulação de mensagens em uma estrutura semelhante, a um controle de fluxo, é simples.</p>
<h2>Pequeno Exemplo</h2>
<p>Eu sou um cara bastante tradicional, então começaremos com o clássico &#8220;Olá mundo&#8221;.  Após instalar o o Axum à partir do link que eu forneci acima(perceba que há versões diferentes para Visual Studio 2008 e Visual Studio 2010), crie um projeto em Axum:</p>
<div id="attachment_289" class="wp-caption aligncenter" style="width: 679px"><a href="http://brunobemfica.net/wp-content/uploads/2010/05/VSProject.jpg"><img class="size-full wp-image-289 " title="Projeto no VS" src="http://brunobemfica.net/wp-content/uploads/2010/05/VSProject.jpg" alt="Projeto sendo criado no Visual Studio" width="669" height="426" /></a><p class="wp-caption-text">Projeto sendo criado no Visual Studio</p></div>
<p>Após a criação do projeto, o Visual Studio gerará um pouco de código como de costume. seu código deve estar parecido com isso:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;height:500px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">Microsoft.Axum</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Concurrency.Messaging</span><span style="color: #008000;">;</span><br />
<br />
<span style="color: #0600FF; font-weight: bold;">namespace</span> ExemploAxum<br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> domain Program<br />
&nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; agent MainAgent <span style="color: #008000;">:</span> channel Microsoft<span style="color: #008000;">.</span><span style="color: #0000FF;">Axum</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Application</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> MainAgent<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6666cc; font-weight: bold;">String</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args <span style="color: #008000;">=</span> receive<span style="color: #008000;">&#40;</span>PrimaryChannel<span style="color: #008000;">::</span><span style="color: #0000FF;">CommandLine</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// TODO: Add work of the agent here.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Ola mundo!&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PrimaryChannel<span style="color: #008000;">::</span><span style="color: #0000FF;">Done</span> <span style="color: #008000;">&lt;--</span> Signal<span style="color: #008000;">.</span><span style="color: #0000FF;">Value</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>Observe que a sintaxe realmente é bem próxima ao C#. Substitua o código gerado pelo VS, com o código abaixo:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span> <br />
&nbsp;<br />
agent Program <span style="color: #008000;">:</span> Microsoft<span style="color: #008000;">.</span><span style="color: #0000FF;">Axum</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ConsoleApplication</span> <br />
<span style="color: #008000;">&#123;</span> <br />
&nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">override</span> <span style="color: #6666cc; font-weight: bold;">int</span> Run<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">String</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span> <br />
&nbsp; &nbsp; <span style="color: #008000;">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Hello, World!&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; Console<span style="color: #008000;">.</span><span style="color: #0000FF;">ReadKey</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">&#125;</span> <br />
<span style="color: #008000;">&#125;</span></div></div>
<p>Analisando um pouco do código, perceberemos algumas coisas. Repare na segunda linha, o código começa com a palavra &#8220;agent&#8221;: Esse trecho de código é um <em>agente</em> ou <em>ator</em>. Como Eu expliquei acima, o Axum é baseado em um conceito conhecido dentro da computação como &#8220;Modelo de atores&#8221;, e os atores são entidades autônomas que interagem entre si através da troca de mensagens. Escrever um software em Axum é basicamente definir agentes e suas interações.</p>
<p>Bem, por enquanto é isso. Pretendo continuar com mais alguns artigos sobre o Axum. Críticas e sugestões, os comentários estão abertos.</p>
<p>Abraços e keep coding!</p>
]]></content:encoded>
			<wfw:commentRss>http://brunobemfica.net/?feed=rss2&amp;p=282</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Mini curso] do Ruby ao Rails &#8211; Parte 4</title>
		<link>http://brunobemfica.net/?p=237</link>
		<comments>http://brunobemfica.net/?p=237#comments</comments>
		<pubDate>Wed, 28 Apr 2010 05:26:53 +0000</pubDate>
		<dc:creator>Bruno Bemfica</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Desenvolvimento ágil]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://brunobemfica.net/?p=237</guid>
		<description><![CDATA[Dando continuidade ao nosso mini curso, fecharei a parte de tipos, falando rapidamente o que falta sobre arrays, abordando os Hashes e farei a introdução aos métodos.
Arrays multidimensionais
Arrays multidimensionais: Nada mais são que arrays dentro de outros arrays. Abaixo, um exemplo de como fazer isso:
#Cria um array com múltiplos arrays dentro
vetor = &#91; &#91;1,2,3&#93;, &#91;4,5,6&#93;, [...]]]></description>
			<content:encoded><![CDATA[<p>Dando continuidade ao nosso mini curso, fecharei a parte de tipos, falando rapidamente o que falta sobre arrays, abordando os Hashes e farei a introdução aos métodos.</p>
<h2>Arrays multidimensionais</h2>
<p>Arrays multidimensionais: Nada mais são que arrays dentro de outros arrays. Abaixo, um exemplo de como fazer isso:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;">#Cria um array com múltiplos arrays dentro</span><br />
vetor = <span style="color:#006600; font-weight:bold;">&#91;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">4</span>,<span style="color:#006666;">5</span>,<span style="color:#006666;">6</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">7</span>,<span style="color:#006666;">8</span>,<span style="color:#006666;">9</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&#93;</span><br />
<span style="color:#008000; font-style:italic;">#Cria um array de tamanho 2</span><br />
outroVetor = <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span> <span style="color:#006666;">2</span><br />
<span style="color:#008000; font-style:italic;">#Atribui um novo array, também de tamanho 2, à posição 0 do array</span><br />
outroVetor<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>= <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span> <span style="color:#006666;">2</span>, <span style="color:#996600;">'TesteTerceiroArray'</span><br />
<span style="color:#008000; font-style:italic;">#Atribui um novo array, também de tamanho 2, à posição 1 do array</span><br />
outroVetor<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>=<span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span> <span style="color:#006666;">2</span>,, <span style="color:#996600;">'TesteQuartoArray'</span></div></div>
<p><span id="more-237"></span></p>
<h2>Indexando arrays</h2>
<p>Você pode indexar a partir do fim de um array usando o sinal de menos (­), onde ­1 é o índice do<br />
último elemento; Também podemos usar faixas de valor (entre um índice inicial e final separados<br />
por dois sinais de ponto &#8211; .. ):</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">vetor = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'h'</span>,<span style="color:#996600;">'e'</span>,<span style="color:#996600;">'l'</span>,<span style="color:#996600;">'l'</span>,<span style="color:#996600;">'o'</span>,<span style="color:#996600;">' '</span>,<span style="color:#996600;">'w'</span>,<span style="color:#996600;">'o'</span>,<span style="color:#996600;">'r'</span>,<span style="color:#996600;">'l'</span>,<span style="color:#996600;">'d'</span><span style="color:#006600; font-weight:bold;">&#93;</span><br />
<span style="color:#CC0066; font-weight:bold;">print</span><span style="color:#006600; font-weight:bold;">&#40;</span> arr<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span>,<span style="color:#006666;">5</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color:#008000; font-style:italic;">#=&gt;; 'hello'</span><br />
<span style="color:#CC0066; font-weight:bold;">print</span><span style="color:#006600; font-weight:bold;">&#40;</span> arr<span style="color:#006600; font-weight:bold;">&#91;</span>­<span style="color:#006666;">5</span>,<span style="color:#006666;">5</span> <span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color:#008000; font-style:italic;">#=&gt;; 'world'</span></div></div>
<p>O ruby possui um <em>alias</em> para arrays de strings, que é o %w. Observe um exemplo abaixo:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">arrayDeStrings = <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#123;</span>Exemplo de <span style="color:#CC0066; font-weight:bold;">array</span> de strings<span style="color:#006600; font-weight:bold;">&#125;</span><br />
arrayDeStrings.<span style="color:#9900CC;">inspect</span></div></div>
<h2>Hashes</h2>
<p>Hashes também são coleções, assim como os arrays. A diferença é que o índice dos Arrays é sempre numérico, e Hashes são coleções par-valor onde os índices podem ser objetos também.</p>
<p>Mesmo que os arrays forneçam uma boa forma de indexar uma coleção de itens por número, há situações<br />
que seria mais conveniente indexar de alguma outra forma. Se, por exemplo, ao listar os filmes da sua coleção de DVDs,seria mais significativo ter cada filme indexado pelo nome e/ou pelo gênero, ao invés de números: 26, 42 e assim por diante. O Ruby possui uma classe que permite que você faça isso: A classe Hash. Hashes são conhecidos em outras linguagens como dicionários(em java e em .NET, classes que implementam a interface IDictionary). Tal qual um dicionário de verdade, as entradas são indexadas por uma chave única (em um dicionário, seria uma palavra) e um valor (em um dicionário, seria a definição da palavra).</p>
<p>Você pode criar um hash criando uma nova instância da classe Hash:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">primeiroHash = <span style="color:#CC00FF; font-weight:bold;">Hash</span>.<span style="color:#9900CC;">new</span><br />
segundoHash = <span style="color:#CC00FF; font-weight:bold;">Hash</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Um filme qualquer&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span></div></div>
<p>Ambos os exemplos acima criam um Hash vazio. Um objeto Hash sempre têm um valor padrão –<br />
isto é, um valor que é retornado quando nenhum valor específico é encontrado em um dado índice.<br />
Nestes dois exemplos, segundoHash é inicializado com o valor default,&#8221;um filme qualquer&#8221;. A variável primeiroHash não é inicializado com um valor então seu valor padrão será  nil. Tendo criado um objeto Hash, podemos adicionar itens a ele usando uma sintaxe semelhante à dos<br />
arrays &#8211; isto é,  colocando um índice nos colchetes e usando o sinal de igual  para atribuir um<br />
valor.A diferença óbvia aqui é que, com um array, o índice ( a chave ) deve ser um número inteiro; com<br />
um Hash, ele pode ser qualquer item de dado único. Observe o exemplo abaixo:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">segundoHash<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Horror'</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">'Jogos Mortais'</span><br />
segundoHash<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Comedia'</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">'Uma noite no museu'</span><br />
segundoHash<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Drama'</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">'Sempre ao seu lado'</span><br />
segundoHash<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Sci-fi'</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">'Star Wars'</span></div></div>
<p>Muitas vezes, a chave pode ser um número ou, como no código acima, uma string. Por princípio,<br />
uma chave pode ser qualquer tipo de objeto. Dada uma classe Qualquer, a seguinte atribuição é totalmente válida:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">qqr = Qualquer.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'objeto Hash'</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
segundoHash<span style="color:#006600; font-weight:bold;">&#91;</span>qqr<span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">'valor qualquer'</span></div></div>
<p>Existe uma forma mais simples de criar e inicializar hashes. Adicione a chave  seguida por => e o valor associado. Cada par chave-valor deve ser separado por uma vírgula e o lote todo colocado entre os sinais de chaves {}:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">musicHash = <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#996600;">'Heavy Metal'</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">'Iron Maiden'</span>,<br />
<span style="color:#996600;">'MPB'</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">'Chico Buarque'</span>,<br />
<span style="color:#996600;">'Classico'</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">'Beethoven'</span>,<br />
<span style="color:#996600;">'New Age'</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">'Enya'</span> <span style="color:#006600; font-weight:bold;">&#125;</span><br />
<span style="color:#CC0066; font-weight:bold;">puts</span> musicHash<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Eletronica'</span><span style="color:#006600; font-weight:bold;">&#93;</span><br />
<span style="color:#CC0066; font-weight:bold;">puts</span> segundoHash<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'ValorInexistente'</span><span style="color:#006600; font-weight:bold;">&#93;</span></div></div>
<p>Repare que no código acima, as últimas duas linhas tentam imprimir chaves que não existem. Nesse caso, o ruby exibe o valor default, que é definido no momento em que a instância é criada. Para o hash de nome segundoHash, definimos esse valor na instância, no código um pouco acima, quando o instanciamos(foi passado como parâmetro para o método new). No caso do hash musicHash, será retornado o valor nil.</p>
<p>Os hashes ainda possuem os métodos <em>keys</em> e <em>values, </em>que retornam um array com os respectivos valores.</p>
<h2><strong>Métodos</strong></h2>
<p>Os métodos em ruby tem algumas particularidades(que podem ser utilizadas para o bem ou para o mal).  Observe o código abaixo:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">def</span> &nbsp;Soma<span style="color:#006600; font-weight:bold;">&#40;</span>a,b<span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#0000FF; font-weight:bold;">return</span> a<span style="color:#006600; font-weight:bold;">+</span>b<br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">def</span> Soma a,b<br />
a<span style="color:#006600; font-weight:bold;">+</span>b<br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>Ambos são o mesmo método, apenas com pequenas diferenças na declaração. O Ruby não exige parênteses na declaração ou na invocação de métodos(embora seja uma boa prática utilizá-los), e embora tenha a palavra <em>return</em> como reservada, não exige que ela seja colocada no retorno do método, pois o interpretador considera sempre a última linha como um retorno.</p>
<p>O ruby também possui métodos estáticos, ou seja: Métodos de classe, que não precisam de uma instância para serem chamados. Observe abaixo um exemplo:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">class</span> Exemplo<br />
<span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">Soma</span> a,b<br />
a<span style="color:#006600; font-weight:bold;">+</span>b<br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">def</span> Subtracao a,b<br />
a<span style="color:#006600; font-weight:bold;">-</span>b<br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>Na classe acima, o método Soma é precedido pela palavra self, o que indica que é um método estático e não precisa de um objeto instanciado para ser chamado. Observe o que ocorre ao chamarmos ambos os métodos sem instanciarmos a classe:</p>
<div id="attachment_257" class="wp-caption aligncenter" style="width: 545px"><a href="http://brunobemfica.net/wp-content/uploads/2010/04/figura14_metodosEstaticos.JPG"><img class="size-full wp-image-257 " title="Métodos estáticos" src="http://brunobemfica.net/wp-content/uploads/2010/04/figura14_metodosEstaticos.JPG" alt="Invocação de métodos no Ruby" width="535" height="270" /></a><p class="wp-caption-text">Invocação de métodos no Ruby</p></div>
<p>Ao chamar o método soma que foi definido como estático, temos o resultado esperado(3), mas ao chamar o método Subtracao obtemos um erro, pois não instanciamos o objeto anteriormente.</p>
<p>Por convenção, os métodos em ruby, ao contrário das classes, começam com letra minúscula. Escrevi os métodos com letras maiúsculas <span style="text-decoration: line-through;">por que eu sou um imbecil </span>por costume, já que a minha linguagem &#8220;nativa&#8221; de programação é o C#.</p>
<p>Bem, por enquanto é isso. Sugestões e críticas, os comentários estão abertos.</p>
<p>Abraços e keep coding. <img src='http://brunobemfica.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://brunobemfica.net/?feed=rss2&amp;p=237</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[Mini curso] Do Ruby ao Rails &#8211; Parte 3</title>
		<link>http://brunobemfica.net/?p=211</link>
		<comments>http://brunobemfica.net/?p=211#comments</comments>
		<pubDate>Fri, 09 Apr 2010 06:20:04 +0000</pubDate>
		<dc:creator>Bruno Bemfica</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Desenvolvimento ágil]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://brunobemfica.net/?p=211</guid>
		<description><![CDATA[Continuando o minicurso, continuarei a parte de tipos do Ruby falando sobre arrays. Aproveitarei para alinhar o post à esquerda, atendendo a pedidos, e para testar o codecolorer, plugin de exibição de código.  
Arrays(Vetores)
Em Ruby, um array é um objeto que contém um número de items. Estes items podem ser variáveis(como strings, inteiros, Hash [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando o minicurso, continuarei a parte de tipos do Ruby falando sobre arrays. Aproveitarei para alinhar o post à esquerda, atendendo a pedidos, e para testar o codecolorer, plugin de exibição de código.  <span id="more-211"></span></p>
<h2>Arrays(Vetores)</h2>
<p>Em Ruby, um array é um objeto que contém um número de items. Estes items podem ser variáveis(como strings, inteiros, Hash etc)  ou até mesmo outros objetos(incluindo outros arrays para criar um array/vetor multimensional). Uma vez que os items foram agrupados em um array, você pode realizar tarefas como ordenação em ordem alfabética ou numérica, acessar e alterar o valor atribuído a cada item do array e até mesmo passar o grupo de items como argumento para um método.  Há mais de uma forma de se criar um array em Ruby. Essencialmente, um array é uma instância da classe Array. Logo, podemos criar um array diretamente atribuindo valores a ele, ou simplesmente criar como um objeto, como demonstrado abaixo:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">DiasDaSemana = <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span></div></div>
<p>O construtor da classe Array tem algumas sobrecargas, logo poderíamos ter passado como parâmetro para ele apenas o tamanho do array (Ex: Array.new 7 ),o tamanho e um valor padrão para os elementos (Ex: Array.new 7, &#8220;hoje&#8221;) ou diretamente os valores  de cada elemento (Ex:  Vetor = [1,2,3]). Abaixo há uma pequena demonstração sobre as mais variadas formas de se instanciar um Array.</p>
<div id="attachment_215" class="wp-caption aligncenter" style="width: 540px"><a href="http://brunobemfica.net/wp-content/uploads/2010/04/figura9_arraystypes.png"><img class="size-full wp-image-215" title="Arrays" src="http://brunobemfica.net/wp-content/uploads/2010/04/figura9_arraystypes.png" alt="figura9_arraystypes" width="530" height="372" /></a><p class="wp-caption-text">As várias maneiras de se instanciar um array</p></div>
<p>Outros métodos que temos ainda para arrays são <em>empty?,shift, pop,push,delete, delete_at e </em><em>size</em>. O primeiro verifica se o array está vazio, shift remove o primeiro elemento do array, pop remove o último elemento do array,push adiciona um elemento, delete remove um elemento passado como parâmetro,delete_at remove um elemento que esteja em uma posição passada como parâmetro e size retorna o tamanho do array. Execute o código abaixo e verifique o resultado:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">vetor = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;a&quot;</span>,<span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#996600;">&quot;d&quot;</span>,<span style="color:#996600;">&quot;e&quot;</span>,<span style="color:#996600;">&quot;f&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <br />
vetor.<span style="color:#9900CC;">empty</span>? <br />
vetor.<span style="color:#9900CC;">size</span> <br />
vetor.<span style="color:#9900CC;">shift</span><br />
vetor.<span style="color:#9900CC;">pop</span><br />
vetor.<span style="color:#9900CC;">delete_at</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
vetor.<span style="color:#9900CC;">delete</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;d&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <br />
vetor.<span style="color:#9900CC;">inspect</span></div></div>
<p>Observe o resultado do código acima:</p>
<p style="text-align: center;">
<div id="attachment_218" class="wp-caption aligncenter" style="width: 540px"><a href="http://brunobemfica.net/wp-content/uploads/2010/04/figura10_arraymanipulation.png"><img class="size-full wp-image-218 " title="manipulation" src="http://brunobemfica.net/wp-content/uploads/2010/04/figura10_arraymanipulation.png" alt="Exclusão de objetos em um array" width="530" height="372" /></a><p class="wp-caption-text">Exclusão de objetos em um array</p></div>
<p>Os arrays em Ruby permitem infinitas possibilidades. Notem que o array acima possui elementos Fixnum e strings também. Sim, arrays em ruby podem conter diferentes tipos de elementos. Acessar elementos em arrays também é algo bem simples. Podemos acessar através do índice, ou através do próprio elemento. Execute o código abaixo e veja os resultados:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">vetor.<span style="color:#9900CC;">index</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;e&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <br />
vetor<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span> <br />
vetor<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9966CC; font-weight:bold;">class</span></div></div>
<p>Outra coisa interessante do ruby é a subtração de vetores, algo inexistente em linguagens como Java e C#. Execute o código abaixo e observe o resultado:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">vetorDeLetras = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;a&quot;</span>,<span style="color:#996600;">&quot;b&quot;</span>,<span style="color:#996600;">&quot;c&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <br />
outroVetor = &nbsp;<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;a&quot;</span>,<span style="color:#996600;">&quot;b&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <br />
vetorFinal = vetorDeLetras <span style="color:#006600; font-weight:bold;">-</span> outroVetor <br />
vetorFinal.<span style="color:#9900CC;">inspect</span></div></div>
<p>O resultado é um vetor com os elementos que estão no primeiro vetor, mas não no segundo: <a href="http://brunobemfica.net/wp-content/uploads/2010/04/figura11_arraysubtraction.png"><img class="aligncenter size-full wp-image-221" title="figura11_arraysubtraction" src="http://brunobemfica.net/wp-content/uploads/2010/04/figura11_arraysubtraction.png" alt="figura11_arraysubtraction" width="530" height="277" /></a> Ordenação de arrays é também muito simples em Ruby. Utilizando o método <em>sort</em>!, ordenamos o array, e utilizando o método <em>reverse</em> (cuja utilização já foi demonstrada quando falei de strings &#8211; lembrando que strings nada mais são que arrays de caracteres), podemos ordenar nossos arrays sem nenhum problema. Experimente rodar o código abaixo, e verifique os resultados:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">vet = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;a&quot;</span>,<span style="color:#996600;">&quot;c&quot;</span>,<span style="color:#996600;">&quot;d&quot;</span>,<span style="color:#996600;">&quot;b&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <br />
vet.<span style="color:#9900CC;">sort</span>! <br />
vet.<span style="color:#9900CC;">reverse</span></div></div>
<div id="attachment_231" class="wp-caption aligncenter" style="width: 478px"><a href="http://brunobemfica.net/wp-content/uploads/2010/04/figura12_arrayordenation.JPG"><img class="size-full wp-image-231 " title="Array Ordenation" src="http://brunobemfica.net/wp-content/uploads/2010/04/figura12_arrayordenation.JPG" alt="Ordenação de Arrays no Ruby" width="468" height="237" /></a><p class="wp-caption-text">Ordenação de Arrays no Ruby</p></div>
<p>E para terminar, vamos fazer uma atribuição de valores a mais de um elemento ao mesmo tempo. Execute o código abaixo, e veja como o Ruby faz isso:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">vet = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;a&quot;</span>,<span style="color:#996600;">&quot;b&quot;</span>,<span style="color:#996600;">&quot;c&quot;</span>,<span style="color:#996600;">&quot;d&quot;</span>,<span style="color:#996600;">&quot;e&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span><br />
vet<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>..3<span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">&quot;z&quot;</span>,<span style="color:#996600;">&quot;x&quot;</span>,<span style="color:#996600;">&quot;y&quot;</span> <br />
vet.<span style="color:#9900CC;">inspect</span></div></div>
<div id="attachment_232" class="wp-caption aligncenter" style="width: 478px"><a href="http://brunobemfica.net/wp-content/uploads/2010/04/figura13_arrayrewrite.JPG"><img class="size-full wp-image-232 " title="overrite elements" src="http://brunobemfica.net/wp-content/uploads/2010/04/figura13_arrayrewrite.JPG" alt="Sobrescrevendo elementos de um array" width="468" height="237" /></a><p class="wp-caption-text">Sobrescrevendo elementos de um array</p></div>
<p>Bem, por enquanto é só. Os Arrays são uma ferramenta muito poderosa no Ruby, e ainda há muito a falar sobre eles, mas tópicos mais avançados deixarei para que vocês descubram. Dúvidas, críticas e sugestões, os comentários estão abertos. Espero que tenham gostado do artigo(e do fato de não estar mais centralizado, hehe).  Abraços e keep coding! <img src='http://brunobemfica.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://brunobemfica.net/?feed=rss2&amp;p=211</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
