<?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>Wagner Andrade</title>
	<atom:link href="http://www.wagnerandrade.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.wagnerandrade.com/blog</link>
	<description>Simplificando a WEB</description>
	<lastBuildDate>Sun, 18 Oct 2009 05:58:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Phantom: Easy reflection in .NET</title>
		<link>http://www.wagnerandrade.com/blog/2009/10/phantom-easy-reflection-in-net/</link>
		<comments>http://www.wagnerandrade.com/blog/2009/10/phantom-easy-reflection-in-net/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 05:25:55 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Extension Methods]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[Phantom]]></category>
		<category><![CDATA[Reflection]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/2009/10/phantom-easy-reflection-in-net/</guid>
		<description><![CDATA[English version here.
Phantom DOWNLOAD.
Resolvi publicar um utilitário — inclusive com seu código (Github) — que venho usando à algum tempo em meus projetos .NET, o Phantom.
Phantom é um utilitário que torna fácil fazer reflexão em objetos. Para quem não sabe, reflexão consiste basicamente em trabalhar com objetos sem saber seu tipo, ou seja, chamar seus [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.wagnerandrade.com/phantom/readme.html">English version here</a>.</p>
<p><a href="../../phantom/Phantom.zip">Phantom DOWNLOAD</a>.</p>
<p>Resolvi publicar um utilitário — inclusive com <a href="http://github.com/wagnerandrade/Phantom">seu código (Github)</a> — que venho usando à algum tempo em meus projetos .NET, o <a href="http://www.wagnerandrade.com/phantom/Phantom.zip">Phantom</a>.</p>
<p>Phantom é um utilitário que torna fácil fazer reflexão em objetos. Para quem não sabe, reflexão consiste basicamente em trabalhar com objetos sem saber seu tipo, ou seja, chamar seus métodos e propriedades.</p>
<h3>Como usa isso?</h3>
<p>Para iniciar o uso do <strong>Phantom</strong> basta adicionar isso na sua classe:</p>
<pre>using Phantom;</pre>
<p>Simples! Isso faz com que aparece alguns métodos (<a href="http://www.wagnerandrade.com/blog/tag/extension-methods/">extension methods</a>) em todos os objetos.</p>
<h3>Ok, mas o que eu posso fazer?</h3>
<p>Get e set em propriedades, invocar métodos, pegar todas as propriedades e mais em objetos que você nem sabe o Type. Sim, isso é legal!</p>
<p>Vou usar C# nos exemplos. Notem que sempre manipulo object e nunca um tipo especifico.</p>
<h3>Pegando (get) valor de uma propriedade</h3>
<pre>object person = new Person { Name = "Arthur", Age = 4 };

person.Get("Name");

&gt;&gt; Arthur</pre>
<h3>Atribuindo (set) valor de uma propriedade</h3>
<pre>person.Set("Name", "Francine");</pre>
<h3>Pegando todas as propriedades</h3>
<pre>var properties = person.Values();

foreach(var property in properties)
{
    Console.WriteLine(property.Key + " = " + property.Value);
}

&gt;&gt; Name = Arthur
&gt;&gt; Age = 4</pre>
<h3>Bom para usar com objetos anônimos</h3>
<p>Já falei de objetos anônimos <a href="http://www.wagnerandrade.com/blog/2009/05/usando-tipos-anonimos-como-parametro/">aqui</a>.</p>
<pre>public void PrintName(object target)
{
    Console.WriteLine(target.Get("Name"));
}

PrintName(new { Name = "Wagner" });

&gt;&gt; Wagner</pre>
<h3>Importando valores de outros objetos</h3>
<pre>object animal = new Animal { Age = 20 };

person.Import(animal);

person.Get("Name");
person.Get("Age");

&gt;&gt; Arthur
&gt;&gt; 20</pre>
<h3>Invocando um método</h3>
<pre>object name = "Francine"; 

name.Invoke("ToUpper");

&gt;&gt; FRANCINE</pre>
<p>Existem outras utilidades, mas por hoje é só!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2009/10/phantom-easy-reflection-in-net/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ruby Snapshot #6: Imagens do momento</title>
		<link>http://www.wagnerandrade.com/blog/2009/07/ruby-snapshot-6-imagens-do-momento/</link>
		<comments>http://www.wagnerandrade.com/blog/2009/07/ruby-snapshot-6-imagens-do-momento/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 14:46:47 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Snapshot]]></category>
		<category><![CDATA[Imagens]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/?p=66</guid>
		<description><![CDATA[Estou voltando depois de muito tempo sem escrever. Dei aula à noite durante dois meses e isso me exigiu uma atenção especial. E nada melhor do que voltar com Ruby!
Como vocês já devem ter percebido adoro scripts. Gosto de  automatizar algumas tarefas que costumo realizar varias vezes ao dia.
As vezes vou até a página da [...]]]></description>
			<content:encoded><![CDATA[<p>Estou voltando depois de muito tempo sem escrever. Dei aula à noite durante dois meses e isso me exigiu uma atenção especial. E nada melhor do que voltar com Ruby!</p>
<p>Como vocês já devem ter percebido adoro scripts. Gosto de  automatizar algumas tarefas que costumo realizar varias vezes ao dia.</p>
<p>As vezes vou até a página da <a href="http://www.globo.com">Globo.com</a> ver o que está acontecendo no mundo. Mas tem muita informação na tela pra quem só corre o olho &#8211; e metade é Big Brother (pelo menos quando escrevi isso).</p>
<p>Para me ajudar fiz um script que resume a página da Globo.com pegando apenas suas imagens. Como sempre faço primeiro vou colocar o script e depois explico:</p>
<p><script src="http://gist.github.com/149258.js"></script></p>
<p>Primeiramente percebe-se que utilizei o <a href="http://wiki.github.com/why/hpricot">Hpricot</a> para fazer parse do HTML. Excelente, diga-se. A variável <em>html</em> serve para concatenar o HTML que o script vai gerar.</p>
<p>Na linha 8 faço uma leitura na página <a href="http://www.globo.com">Globo.com</a>, utilizo <a href="http://wiki.github.com/why/hpricot">Hpricot</a> e <a href="http://www.ensta.fr/~diam/ruby/online/ruby-stdlib-0.10.1/stdlib/libdoc/open-uri/rdoc/index.html">open-uri</a> para isso. Na linha 10 busco todas as imagens da página. Na linha 11 faço uma verificação na url da imagem para ver se é absoluta (<em>http://www.globo.com/imagem.jpg</em>) ou relativa (<em>/imagem.jpg</em>), transformando todas em urls absolutas para serem visualizadas de fora do servidor da Globo.</p>
<p>Finalizo o HTML que geramos e na linha 17 salvo em um arquivo chamado &#8220;Agora.html&#8221;. Quem está utilizando o Windows pode descomentar a linha 19, para abrir o Internet Explorer (<strong>Eca!</strong>) com esse arquivo.</p>
<p><strong>Você pode, facilmente, alterar o script e buscar as imagens de outro portal</strong>, como o <a href="http://www.terra.com.br/">Terra</a>, por exemplo. Modifique e comente&#8230; Até mais.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2009/07/ruby-snapshot-6-imagens-do-momento/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Usando tipos anônimos como parâmetro</title>
		<link>http://www.wagnerandrade.com/blog/2009/05/usando-tipos-anonimos-como-parametro/</link>
		<comments>http://www.wagnerandrade.com/blog/2009/05/usando-tipos-anonimos-como-parametro/#comments</comments>
		<pubDate>Wed, 13 May 2009 03:00:00 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Anonymous Types]]></category>
		<category><![CDATA[Extension Methods]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/?p=94</guid>
		<description><![CDATA[Quando a Microsoft anunciou os tipos anônimos (Anonymous Types) eu fiquei bastante contente, era possível criar tipos rapidamente de uma forma muito fácil. Para quem ainda não conhece essa nova funcionalidade aqui vai o link.
Olhando a sintaxe de construção de um tipo anônimo logo associei aos arrays associativos das linguagens de script, conhecidos como Hash. [...]]]></description>
			<content:encoded><![CDATA[<p>Quando a Microsoft anunciou os tipos anônimos (Anonymous Types) eu fiquei bastante contente, era possível criar tipos rapidamente de uma forma muito fácil. Para quem ainda não conhece essa nova funcionalidade <a href="http://msdn.microsoft.com/pt-br/library/bb384767.aspx" target="_blank">aqui vai o link</a>.</p>
<p>Olhando a sintaxe de construção de um tipo anônimo logo associei aos arrays associativos das linguagens de script, conhecidos como <em>Hash</em>. O C# sempre teve o objeto <em>Hashtable</em>, mas não é flexível comparando com linguagens como Ruby ou Javascript. Só pra exemplificar o que estou dizendo:</p>
<p>No Ruby posso chamar um método passando um hash como parâmetro, sintaxe bastante utilizada no Ruby on Rails, dessa forma:</p>
<pre>link_to("Profile", :controller =&gt; "profiles", :action =&gt; "show")
link_to("Profile", :controller =&gt; "profiles", :id =&gt; @id)</pre>
<p>Nas duas linhas de exemplo os dois últimos itens formam uma <em><a href="http://msdn.microsoft.com/pt-br/library/system.collections.hashtable.aspx" target="_blank">Hashtable</a></em>, no caso do Ruby se chama <em>Hash</em>. Do lado do método também fica fácil de capturar o que foi passado. Com tipos anônimos do C# podemos fazer uma sintaxe bem próxima, que ficaria assim:</p>
<pre>LinkTo("Profile", new { Controller = "profiles", Action = "show" });
LinkTo("Profile", new { Controller = "profiles", Id = id });</pre>
<h3>Mas porque utilizar essa forma de passar parâmetros?</h3>
<p>É elegante e limpo em alguns casos. Alguns métodos realizam funções onde é necessário informar MUITOS parâmetros para que se tenha um bom nível de customização da ação que será realizada. E como alguns parâmetros são opcionais acabamos tendo que criar várias sobrecargas para o mesmo método, afim de facilitar a vida de quem vai usar.</p>
<p>No exemplo acima estamos utilizando um método cria um link HTML em um ambiente MVC. Como são muitos parâmetros (texto, controller, action, style, class, id, querystring…) e raramente usaremos todos, utilizamos um tipo anônimo para informar os parâmetros “opcionais”. Assim não precisaremos encher a nossa classe com sobrecargas do método LinkTo.</p>
<p>Outro ganho que temos é na hora de adicionar mais um parâmetro ao método. Adicionamos no tipo anônimo e não precisamos alterar as chamadas na aplicação inteira. Mesmo com refactoring isso as vezes é problemático.</p>
<h3>Ok! Agora, como crio meu próprio método?</h3>
<p>Para ver como funciona vamos implementar um método que cria links, parecido com o que exemplifiquei antes. Primeiro veremos como fica o método – que vou chamar de “CriaLink” –, depois explico oque ele está fazendo:</p>
<p><script src="http://gist.github.com/111152.js"></script></p>
<p>Criei um extension method de nome <em>GetPropertyValue</em> na classe <em>Object</em> – para quem não sabe do que se trata extension methods <a href="http://www.wagnerandrade.com/blog/2008/11/c-30-extension-methods/" target="_blank">falei sobre isso aqui</a>. Esse método busca o valor da propriedade de qualquer objeto passando apenas seu nome. Isso vai ser muito útil para tratar os tipos anônimos.</p>
<p>Já na implementação do método “CriaLink” primeiramente busco os valores das possíveis propriedades atribuídas ao tipo anônimo passado por parâmetro, que é do tipo Object porque não é possível prever um tipo anônimo. O método <em>GetPropertyValue</em> já se responsabiliza por saber se existe ou não a propriedade, no caso dela não existir o resultado é null.</p>
<p>Depois fica mais simples. Apenas criei uma StringBuilder para concatenar a tag de link que vou criar. Testo se as variáveis provenientes dos parametros possuem valores e concateno o valor relativo a cada propriedade.</p>
<p>Por ultimo mostro como podemos utilizar o método que criamos e o resultado obtido.</p>
<p>Já falei aqui o quanto sou fã da flexibilidade das linguagens de script. O C# tem incorporado algumas funcionalidades dessas linguagens e mesmo assim, ao contrário do que eu imaginava, consegue manter sua característica de ser fortemente tipado. Temos que aproveitar isso e tornar nosso código mais inteligente.</p>
<p>Espero que tenham gostado e qualquer duvida ou sugestão é só entrar em <a href="http://www.wagnerandrade.com/blog/contato/" target="_blank">contato</a> ou comentar aqui mesmo. Até mais.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2009/05/usando-tipos-anonimos-como-parametro/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Formatação padrão para DateTime</title>
		<link>http://www.wagnerandrade.com/blog/2009/04/formatacao-padrao-para-datetime/</link>
		<comments>http://www.wagnerandrade.com/blog/2009/04/formatacao-padrao-para-datetime/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 13:28:43 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[DateTime]]></category>
		<category><![CDATA[Formatacao]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/?p=75</guid>
		<description><![CDATA[Um dos métodos mais práticos da plataforma .NET é o ToString(String) do objeto DateTime. Com ele podemos formatar a data sem usar outras classes utilitárias, apenas com a própria instancia do objeto de data, dessa forma: data.ToString(&#8220;dd/MM/yyyy&#8221;).
Ao imprimir a data atual com Console.Write(DateTime.Now) temos um resultado mais ou menos assim na tela: 07/04/2009 23:17:25. Isso [...]]]></description>
			<content:encoded><![CDATA[<p>Um dos métodos mais práticos da plataforma .NET é o <em>ToString(String)</em> do objeto <em>DateTime</em>. Com ele podemos formatar a data sem usar outras classes utilitárias, apenas com a própria instancia do objeto de data, dessa forma: <em>data.ToString(&#8220;dd/MM/yyyy&#8221;)</em>.</p>
<p>Ao imprimir a data atual com <em>Console.Write(DateTime.Now)</em> temos um resultado mais ou menos assim na tela: <em>07/04/2009 23:17:25</em>. Isso acontece porque o Console utiliza o método <em>ToString()</em> de qualquer objeto para transformá-lo em caracteres e imprimir na tela. O objeto a ser impresso nesse caso é um <em>DateTime </em>que por sua vez utiliza internamente <em>ToShortDateString() + &#8221; &#8221; + ToLongTimeString()</em>.</p>
<p>Quando se está trabalhando com muitas datas &#8211; geração de relatórios, por exemplo &#8211; fica trabalhoso e feio ficar replicando a mesma formatação de data no código, como: <em>data.ToString(&#8220;dd-MM-yyyy [HH:mm]&#8220;) </em>diversas vezes. Não seria mais fácil padronizar a saída de data? Isso é fácil!</p>
<pre>var customCulture = new CultureInfo("pt-BR");
customCulture.DateTimeFormat.ShortDatePattern = "dd-MM-yyyy";
customCulture.DateTimeFormat.LongTimePattern = "[HH:mm]";

Thread.CurrentThread.CurrentCulture = customCulture;
Thread.CurrentThread.CurrentUICulture = customCulture;</pre>
<p>O que eu fiz aí foi criar uma cultura customizável com base na pt-BR. Depois mudei as formatações de data curta e hora longa &#8211; justamente as formatações utilizadas por padrão pelo <em>DateTime</em>. Por ultimo é só atribuir essa cultura à thread corrente, o que geralmente abrange toda nossa aplicação.</p>
<p>Agora o método <em>ToString()</em> do <em>DateTime </em>vai utilizar a formatação &#8220;dd-MM-yyyy&#8221; para data (<em>ToShortDateString</em>) e &#8220;[HH:mm]&#8221; para hora (<em>ToLongTimeString</em>). Dessa forma podemos imprimir novamente no console que teremos um resultado diferente: <em>07/04/2009 [23:17]</em>.</p>
<p>Código repetitivo dificulta mudanças, gera erros e retrabalho. Portanto devemos sempre buscar alternativas quando isso acontece.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2009/04/formatacao-padrao-para-datetime/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Afinal, o que é HTTP?</title>
		<link>http://www.wagnerandrade.com/blog/2009/02/afinal-o-que-e-http/</link>
		<comments>http://www.wagnerandrade.com/blog/2009/02/afinal-o-que-e-http/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 12:59:30 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Request]]></category>
		<category><![CDATA[Response]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/?p=52</guid>
		<description><![CDATA[Você vê essa sigla diversas vezes por dia, até mesmo quando não está sentado no computador. As vezes nem mesmo olhando a novela consegue se livrar dessa maldita sigla &#8211; pode conferir lá nos créditos, está lá. Geralmente vem acompanhada de um site. Mas afinal, o que é HTTP? Mas não me venha com a [...]]]></description>
			<content:encoded><![CDATA[<p>Você vê essa sigla diversas vezes por dia, até mesmo quando não está sentado no computador. As vezes nem mesmo olhando a novela consegue se livrar dessa maldita sigla &#8211; pode conferir lá nos créditos, está lá. Geralmente vem acompanhada de um site. Mas afinal, o que é HTTP? Mas não me venha com a resposta pronta: Hypertext Transfer Protocol.</p>
<p>Não quero fazer uma abordagem muito técnica para explicar esse protocolo. Vou fazer isso com analogias para que todos possam entender, desde o desenvolvedor WEB &#8211; infelizmente alguns não tem nem idéia do que faz o HTTP &#8211; até sua avó. Ta bom, a sua avó talvez terá dificuldades.</p>
<p>Protocolo, para esse caso, é um padrão de escrita para que periféricos se entendam. Imagine que dois computadores, projetados por engenheiros que jamais se viram na vida, precisam se &#8220;entender&#8221;. Como fazer isso? Criando padrões. Na nossa própria linguagem do dia-a-dia temos diversos padrões estabelecidos. Sempre que alguém diz &#8220;tchau&#8221; você entende que a conversa acabou, isso é um padrão, um protocolo.</p>
<p>Ta, mas e o HTTP? Esse é um protocolo de comunicação de hypertexto, esse nome estranho nada mais é do que uma página na internet. Seu email e portal de fofocas preferido são hypertextos.</p>
<p>Na pratica funciona assim: Quando você digita um endereço no navegador ele precisa enviar alguma coisa para algum lugar dizendo que você quer ler alguma coisa. Imagine que você digitou o endereço do Google. Seu navegador prepara uma carta, isso mesmo, literalmente uma carta para o servidor onde fica o site do Google. O conteúdo dessa carta é mais ou menos isso:</p>
<pre>Host: www.google.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 (.NET CLR
3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive</pre>
<p>Não se apegue aos códigos, como já disse isso são apenas padrões. Esses padrões em especifico são conhecidos como HTTP. Se você não entende é porque não tem muito contato com esse tipo de linguagem, e se não é um desenvolvedor WEB não há problema algum. O importante nessa carta é o seguinte:</p>
<pre>Bom dia Google.com,

Gostaria de ler sua página.
Estou usando o navegador Firefox na versão 3.0.6.
No momento eu aceito HTML.
Gostaria de receber o conteúdo em português, mas também entendo inglês.
Uso o padrão de caracteres (letras) ISO-8859 e UTF-8.</pre>
<p>Seu navegador vai envelopar essa carta e enviar ao servidor do Google, que você solicitou (um dia falarei sobre TCP e outros protocolos que seriam esse envelope). Essa carta é tecnicamente conhecida como <strong>Request HTTP</strong>.</p>
<p>Esse servidor vai ler sua carta, porque ele lê TODAS as cartas que chegam, diferente do Papai Noel. Com base nas solicitações feitas na carta, o Google vai criar a resposta:</p>
<pre>Location: http://www.google.com.br/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Date: Mon, 08 Feb 2009 22:00:00 GMT
Server: gws
Content-Length: 222
...</pre>
<p>O Google está dizendo o seguinte:</p>
<pre>Olá,

Aqui é o Google.com.
Estou enviando a página que pediu.
Você pode guardar as informações em seu computador e usa-las em outras visitas.
Estou enviando apenas texto e HTML como você pediu.
Essa carta foi feita as 22:00 horas do dia 08/02/2009 utilizando servidor GWS.
O conteúdo é formado por 222 letras, segue:
...</pre>
<p>Coloquei três pontinhos substituindo o conteúdo da página. Esse conteúdo é um pouco mais extenso, mas não é nada de outro mundo. Nada mais é do que a forma codificada do que você vê no navegador. Essa carta de resposta também é conhecida como <strong>Response HTTP</strong>.</p>
<p>Claro que eu abordei de forma simplista, há muito mais o que se falar sobre esse protocolo e isso vou fazer em outros artigos. O próximo será um pouco mais técnico e sua avó realmente não vai entender. Falarei sobre Cookie e Sessão. Para saber mais detalhes e dar uma treinadinha no inglês técnico nada melhor do que a especificação oficial do HTTP, <a href="http://www.w3.org/Protocols/rfc2616/rfc2616.html">aqui</a>.</p>
<p>Espero que tenha ficado um pouco mais claro, tanto para desenvolvedores quanto para usuários da internet. E que as avós hi-tech me desculpem!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2009/02/afinal-o-que-e-http/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Agora também no iMasters</title>
		<link>http://www.wagnerandrade.com/blog/2009/02/agora-tambem-no-imasters/</link>
		<comments>http://www.wagnerandrade.com/blog/2009/02/agora-tambem-no-imasters/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 10:27:40 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[Geral]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/?p=45</guid>
		<description><![CDATA[Esse é um artigo um pouco diferente do habitual. Dessa vez quero apenas agradecer o retorno que tenho recebido desde que comecei a escrever aqui.
Na última sexta-feira (06/02) publiquei meu primeiro artigo no iMasters. Para mim é uma grande honra colaborar com um portal que é tão importante para os profissionais brasileiros na área da [...]]]></description>
			<content:encoded><![CDATA[<p>Esse é um artigo um pouco diferente do habitual. Dessa vez quero apenas agradecer o retorno que tenho recebido desde que comecei a escrever aqui.</p>
<p>Na última sexta-feira (06/02) publiquei <a href="http://imasters.uol.com.br/artigo/11411">meu primeiro artigo</a> no <a href="http://imasters.uol.com.br/">iMasters</a>. Para mim é uma grande honra colaborar com um portal que é tão importante para os profissionais brasileiros na área da internet. Espero que essa parceria dure bastante tempo e que seja bem aproveitada por todos.</p>
<p>No mais, sigo escrevendo, respondendo e principalmente ouvindo sugestões e aprendendo. Obrigado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2009/02/agora-tambem-no-imasters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows 7 no Macbook</title>
		<link>http://www.wagnerandrade.com/blog/2009/01/impressoes-do-windows-7-no-macbook/</link>
		<comments>http://www.wagnerandrade.com/blog/2009/01/impressoes-do-windows-7-no-macbook/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 13:06:47 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[Ambiente]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[MacBook]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/?p=28</guid>
		<description><![CDATA[Eu sei que não estou escrevendo nada novo aqui, todos já leram sobre primeiras impressões do Windows 7. Mas como instalei no Macbook com 1GB de memória &#8211; que é folcloricamente um ambiente hostil para Windows -, o sistema ainda é Beta e principalmente por eu não acreditar em todas boas impressões que li, resolvi [...]]]></description>
			<content:encoded><![CDATA[<p>Eu sei que não estou escrevendo nada novo aqui, todos já leram sobre primeiras impressões do Windows 7. Mas como instalei no Macbook com 1GB de memória &#8211; que é folcloricamente um ambiente hostil para Windows -, o sistema ainda é Beta e principalmente por eu não acreditar em todas boas impressões que li, resolvi instalar e pagar pra ver.</p>
<p>O Windows XP é um excelente sistema, mas já está ultrapassado e o tiu Balmer até quer tirá-lo das lojas. Compare com os jogos que saíram no mesmo período, Outubro de 2001, e as mesmas franquias agora em 2009. Nossa, que diferença! Precisamos de um novo sistema da plataforma Microsoft. Baixei o novo Windows com preconceitos pelas ultimas investidas deles em sistemas operacionais para usuários finais &#8211; sem citar nomes &#8211; mas no fundo esperançoso.</p>
<p>Queimei o DVD, abri o Boot Camp, partição de 40GB para a Microsoft, coloquei o DVD, reiniciou, bonito design do instalador&#8230; na hora de selecionar a partição de instalação já tive o primeiro problema: o Boot Camp criou uma partição FAT32 e o W7 precisa de NTFS.</p>
<p>Aí já me deu medo. Não preciso dizer o quão problemático é a manipulação de partições na instalação do Windows. E esse sistema ainda é Beta, mas esse não é meu computador Beta! Mas tive uma grata surpresa, foi simples e fácil. Não sei se minha mãe faria porque não tem a menor ideia do que é partição, mas é só clicar em alguns botões e está tudo pronto, partição formatada. Não precisei apertar L, D, C, F3, Scroll Lock ou qualquer outro botão que meu Macbook nem tem.</p>
<p>Depois disso só foi esperar ele instalar, respondi algumas perguntas como nome do usuário e outras configurações bem explicadas e comecei a usa-lo sem nenhum problema. Desliguei o note apenas antes de dormir, aí percebi que <strong>n</strong><strong>ão precisei reiniciar nenhuma vez depois do termino da instalação</strong>. Se tratando de Windows isso é demais! Estava acostumado a instalar o XP e reiniciar várias vezes, até pra colocar o mouse&#8230; ta bom, exagerei no mouse. Não cheguei a usar o Boot Camp pra Windows, fiquei com preguiça de baixar a versão pra Vista que não vem no CD do Leopard.</p>
<p>No fim, a instalação do Windows 7 em um Macbook foi bem tranquila. Não vou fazer analise das melhorias do sistema, prós e contras, isso é fácil de achar. Se estão curiosos sugiro que instalem o Windows 7, é uma bela surpresa.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2009/01/impressoes-do-windows-7-no-macbook/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Github theme agora para Intype</title>
		<link>http://www.wagnerandrade.com/blog/2009/01/github-theme-agora-para-intype/</link>
		<comments>http://www.wagnerandrade.com/blog/2009/01/github-theme-agora-para-intype/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 13:56:29 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[Ambiente]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Theme]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/?p=25</guid>
		<description><![CDATA[Um tempo atrás comentei aqui que sou fã do tema de apresentação de código do Github (aqui vai um exemplo). Acho que também já comentei que quando estou programando Ruby no Windows gosto de usar o Intype, que é um bom editor &#8211; ainda em fase alpha &#8211; no estilo Textmate, do Mac.
A boa noticia [...]]]></description>
			<content:encoded><![CDATA[<p>Um tempo atrás <a href="http://www.wagnerandrade.com/blog/2008/08/textmate-theme-github/">comentei aqui</a> que sou fã do tema de apresentação de código do Github (aqui vai um <a href="http://github.com/rails/rails/blob/master/actionpack/lib/action_controller/base.rb">exemplo</a>). Acho que também já comentei que quando estou programando Ruby no Windows gosto de usar o <a href="http://intype.info/home/index.php">Intype</a>, que é um bom editor &#8211; ainda em fase alpha &#8211; no estilo Textmate, do Mac.</p>
<p>A boa noticia é que encontrei um conversor de temas do Textmate para temas do Intype, peguei o <a href="http://github.com/sbecker/github_textmate_theme/tree">tema do Github </a>que uso no Textmate e fiz a conversão. Ao contrário do que eu esperava, o resultado ficou <strong>muito bom</strong>. Criei um <a href="http://github.com/wagnerandrade/github_intype_theme/tree">repositório no Github</a> para manter esse tema atualizado.</p>
<p>Para utilizar basta fazer o <a href="http://github.com/wagnerandrade/github_intype_theme/tree">download</a> lá do repositório, pegar o arquivo <em>GitHub.itTheme,</em> copia-lo para o diretório themes do Intype e reiniciar o editor.</p>
<p>Falando um pouco mais nesses editor, <strong>não</strong> uso a ultima versão estável, uso a ultima versão <strong>instável </strong>que foi disponibilizada (download da versão <a href="http://intype.info/download/download.php?intype-0.3.1.734.exe">Unstable 0.3.1.734</a>). Essa versão conta com árvore de projetos, que já é uma &#8220;mão na roda&#8221; pra quem programa em Rails, principalmente.</p>
<p>Nada como um bom tema para nos sentir mais a vontade escrevendo nossos códigos &#8211; bem coisa de nerd mesmo. Até mais!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2009/01/github-theme-agora-para-intype/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# 3.0 Extension Methods</title>
		<link>http://www.wagnerandrade.com/blog/2008/11/c-30-extension-methods/</link>
		<comments>http://www.wagnerandrade.com/blog/2008/11/c-30-extension-methods/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 13:27:15 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Extension Methods]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/?p=23</guid>
		<description><![CDATA[Quando me propus a iniciar o blog, comentei que iria escrever sobre ASP.NET e Ruby. Nesses quase seis meses nunca escrevi um artigo se quer para a tecnologia do aposentado tio Bill, mas hoje vamos ao primeiro. Neste primeiro post sobre o .NET vou falar especificamente de C# e mais especificamente sobre uma nova funcionalidade [...]]]></description>
			<content:encoded><![CDATA[<p>Quando me propus a iniciar o blog, <a href="http://www.wagnerandrade.com/blog/2008/05/iniciando/">comentei</a> que iria escrever sobre ASP.NET e Ruby. Nesses quase seis meses nunca escrevi um artigo se quer para a tecnologia do aposentado tio Bill, mas hoje vamos ao primeiro. Neste primeiro post sobre o .NET vou falar especificamente de C# e mais especificamente sobre uma nova funcionalidade que veio com o C# 3.0, os Extension Methods.</p>
<p>Extension Methods é um recurso que quem costuma trabalhar em linguagens de script, como Ruby, já está mais acostumado. Consiste em &#8220;inserir&#8221; métodos em objetos já compilados, como uma string, por exemplo. Sim, esqueça a sua classe StringHelper ou StringUtil, agora os métodos utilitários que você sempre quis poderão ser inseridos diretamente na fonte.</p>
<p>Vamos à prática, primeiro vou mostrar como um extension é declarado, depois o exemplo de uso. Vou fazer um exemplo que não é tão útil, mas a intenção aqui é apenas mostrar a funcionalidade.</p>
<p>Imaginemos que temos URLs em formato de string na nossa aplicação e precisamos ter o conteúdo destas URLs. Vou criar um extension no objeto string que lê essa URL e retorna o seu conteúdo. Vamos à implementação:</p>
<p><script src="http://gist.github.com/27331.js"></script></p>
<p>Agora o exemplo de como utilizar o método que criei:</p>
<pre>string responseBody = "http://www.google.com".ReadUrl();</pre>
<p>É fácil criar um extension. Primeiro precisamos de uma classe e um método <em>static</em>. O método extension tem uma peculiaridade, o primeiro parâmetro possui a palavra chave <em>this </em>seguido pelo objeto no qual o extension será &#8220;inserido&#8221;. A partir deste parâmetro, os subsequentes serão efetivamente utilizados na chamada do método. Esse primeiro parâmetro é muito importante, perceba que ele representa a instancia do próprio objeto. No exemplo, a string responseBody vai ter o conteúdo HTML da página inicial do Google.</p>
<p>À primeira impressão parece uma implementação complicada, mas nada mais que alguns minutos serão necessários para se familiarizar com isso.</p>
<p>Eu sempre fui fã das linguagens mais dinâmicas, e nessa característica as linguagens de script são a Disney. Esse recurso adicionado ao C# 3.0 nos dá flexibilidade para criar métodos que vão organizar bastante o nosso código. Em breve coloco mais artigos sobre .NET.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2008/11/c-30-extension-methods/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ruby Snapshot #5: Cronometro de código</title>
		<link>http://www.wagnerandrade.com/blog/2008/11/ruby-snapshot-5-cronometro-de-codigo/</link>
		<comments>http://www.wagnerandrade.com/blog/2008/11/ruby-snapshot-5-cronometro-de-codigo/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 14:02:43 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[Benchmark]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Snapshot]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/?p=21</guid>
		<description><![CDATA[Não é muito difícil de perceber que estou um pouco afastado do blog nas ultimas semanas. O motivo é sempre o mesmo: falta de tempo. Pra dizer a verdade acho essa uma desculpa esfarrapada, mas como a maioria dos seres humanos, gosto de utilizá-la.
Para retomar os artigos de códigos rápidos e úteis &#8211; nem sempre [...]]]></description>
			<content:encoded><![CDATA[<p>Não é muito difícil de perceber que estou um pouco afastado do blog nas ultimas semanas. O motivo é sempre o mesmo: falta de tempo. Pra dizer a verdade acho essa uma desculpa esfarrapada, mas como a maioria dos seres humanos, gosto de utilizá-la.</p>
<p>Para retomar os artigos de códigos rápidos e úteis &#8211; <a href="http://www.wagnerandrade.com/blog/2008/06/ruby-snapshot-3-faca-o-mac-ler-rss-literalmente/">nem sempre tão úteis</a> &#8211; utilizando Ruby (<a href="http://www.wagnerandrade.com/blog/category/snapshot/">os Snapshots</a>) vou mostrar como fazer um &#8220;cronometro&#8221; de código. Calma, vou explicar melhor.</p>
<p><strong>Antes de iniciar quero lembrar a existência do modulo <a href="http://apidock.com/ruby/Benchmark">Benchmark</a>, que é o mais indicado a ser utilizado neste caso.</strong> Levamos em conta então que esse post servirá apenas para estudo.</p>
<p>Muitas vezes quero saber quanto tempo um determinado trecho de código leva para ser executado, assim posso fazer otimizações bem focadas em determinadas linhas.</p>
<p>Ruby é uma linguagem que torna simples a manipulação de blocos de código, por isso criaremos um método que receberá um determinado código que alem de executar essas instruções passadas dirá quanto tempo levou para fazer isso. Seu funcionamento é bem simples, mostrando apenas o tempo real que o código levou para ser executado, não é 100% preciso, mas em linhas gerais é bem eficiente. Segue o método:</p>
<p><script src="http://gist.github.com/13174.js"></script></p>
<p>Primeiro ele verifica se foi passado o bloco de código que vai ser &#8220;analisado&#8221;. Em seguida o tempo inicial é armazenado, o código é executado (yield) e por fim diminui-se o tempo inicial do tempo no momento em que o código termina de ser executado. É impresso na tela a identificação do teste (para os casos de haver mais de um) junto com o tempo que o código levou para ser executado, em segundos.</p>
<p>Para testar o método usei o <a href="http://apidock.com/ruby/Kernel/sleep">sleep</a>, que faz uma interrupção no código durante um determinado tempo, no caso 318 milissegundos. Ao rodar esse teste é possível notar que nunca dá 318 milissegundos no bechmark. Isso porque os métodos sleep e o bechmark não são exatos.</p>
<p>É possível fazer diversas melhorias nesse método, o que é um bom exercício para estudar a linguagem. Qualquer sugestão é bem vinda.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2008/11/ruby-snapshot-5-cronometro-de-codigo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
