<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Anderson Leite</title>
	<atom:link href="http://andersonleiteblog.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://andersonleiteblog.wordpress.com</link>
	<description>programmer</description>
	<lastBuildDate>Tue, 03 Jan 2012 20:33:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='andersonleiteblog.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/f75d64ff03ddde856a45459bd9e2e5fe?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Anderson Leite</title>
		<link>http://andersonleiteblog.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://andersonleiteblog.wordpress.com/osd.xml" title="Anderson Leite" />
	<atom:link rel='hub' href='http://andersonleiteblog.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Quando redes sociais não são só Facebook e Twitter</title>
		<link>http://andersonleiteblog.wordpress.com/2012/01/02/quando-redes-sociais-nao-sao-so-facebook-e-twitter/</link>
		<comments>http://andersonleiteblog.wordpress.com/2012/01/02/quando-redes-sociais-nao-sao-so-facebook-e-twitter/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 16:44:23 +0000</pubDate>
		<dc:creator>anderson_leite</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://andersonleiteblog.wordpress.com/?p=719</guid>
		<description><![CDATA[Alguns projetos demandam ferramentas já conhecidas e que usamos repetidas vezes em diversos projetos, já outros nos desafiam com novas ideias e solucoes. Vou relatar um caso desses, em que criar algo novo foi necessário. Pra começar imagine uma aplicação web qualquer dessas que se utilizam de facebook/twitter connect. Você se loga com sua conta [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=719&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Alguns projetos demandam ferramentas já conhecidas e que usamos repetidas vezes em diversos projetos, já outros nos desafiam com novas ideias e solucoes. </p>
<p>Vou relatar um caso desses, em que criar algo novo foi necessário. Pra começar imagine uma aplicação web qualquer dessas que se utilizam de facebook/twitter connect. Você se loga com sua conta de um desses serviços pra adiantar bons passos de cadastro, evitar criar mais um senha, etc, caso do <a href="http://www.agendatech.com.br" title="Agendatech" target="_blank">Agendatech</a> por exemplo.</p>
<p>Agora imagine um ação digital que ocorreu principalmente no Orkut e fez com que alguns milhões de usuários interagissem com a marca. Você tem a opção de uma nova campanha inciando toda viralização novamente ou continuar com rodos esses usuários já ativados.</p>
<p>O problema aqui é que claramente o Orkut não oferece recursos de desenvolvimento tão avançados, e é sobre essa experiencia que quero descrever nesse post. Antes, queria lembrar a todos que, em tempos modernos que todos querem fazer aplicativos pra facebook/twitter, bons programadores querem resolver problemas de software.</p>
<p><strong>Ei Orkut, me autoriza.</strong><br />
Eu nunca tinha visto nenhuma aplicação web que tenha um Orkut conect até então. E esse é o primeiro problema.<br />
Muito desenvolvimento já foi feito prao Orkut na forma de aplicativos, aqueles que rodam dentro dá própria rede social,mas não me recordo e não encontrei nenhum que utilizasse na forma <a href="http://code.google.com/apis/orkut/docs/off-site-apps/index.html" target="_blank">off-site</a>.</p>
<p>Muitos dos links do Google nesse sentido estão quebrados ou desatualizados, encontrar alguma coisa em Ruby então, muito difícil.</p>
<p>Qualquer biblioteca de connect hoje utiliza <a href="http://oauth.net/" target="_blank">OAuth</a>. O processo todo costuma se encapsulado em alguma biblioteca pra facilitar as coisas.<br />
Existe uma lib do Orkut chamada <a href="http://code.google.com/p/orkut-os-client/" target="_blank">Orkut OS Client</a>, escrita em Java. Após testar essa lib, da pra ver que ela consegue fazer o connect e acessar dados de perfil do Orkut, além de scraps e outras coisas.</p>
<p><strong>Atravessando a ponte</strong><br />
Uma primeira solução aqui poderia ser um serviço intermediário. Esse serviço precisaria ser acessado pela app Rails, faria o connect utilizando a lib java e devolveria o resultado da requisição. Nada impossível de se fazerm utilizando <a href="http://www.sinatrarb.com/" target="_blank">Sinatra</a> e <a href="http://jruby.org/" target="_blank">JRuby</a>, acessados via REST. Essa solução tem pontos positivos, como utilizar a própria lib do Google pra fazer as coisas, mas subir um serviço a mais gera mais possíveis pontos de falha, como tratamento mensagens entre os servers, falha no serviço, etc.</p>
<p><strong>Portando</strong><br />
Se a lib Java faz, então da pra fazer em Ruby. A primeira idéia que vem na cabeça aqui normalmente é: <em>&#8220;Abre lá a lib Java, ve as URL&#8217;s que ela chama e faz todos os parsers você mesmo em Ruby&#8221;.<br />
</em><br />
Seria órimo se fosse assim. A lib Java utiliza uma forma bem peculiar pra prover as informações. Não temos aqui um webservices preparadinho pra atender e responder nossas necessidades.<br />
O Orkut oferece as informações via <a href="http://json-rpc.org/" target="_blank">RPC-JSON</a>. Esse não é de longe o formato de comunicação mais da moda, mas é o que tem.<br />
Basicamente esse formato espera apenas posts, mesmo que pra solicitar informações. Esses posts deve ser feitos pra um RPC Endpoint com uma mensagem formatada, adivinhe em que, JSON. Claro que essa mensagem deve seguir as convenções e parametros que o serviço entenda.<br />
O retorno é outro JSON com a resposta da requisição.</p>
<p><strong>Mas eu to na moda</strong><br />
Minha primeira opção pra resolver esse problema de connect e authorização pelo orkut em um sistema Rails, foi utilizar o <a href="https://github.com/intridea/omniauth" target="_blank">Omniauth</a>.<br />
O Omniauth é uma gem bem reconhecida pra isso no meio Ruby e permite que você crie sua própria estratégia caso um provider nnao esteja pronto.<br />
Fiz isso e <a href="http://blog.caelum.com.br/criando-novas-estrategias-com-omniauth/" target="_blank">criei</a> a <a href="https://github.com/intridea/omniauth/pull/396" target="_blank">estratégia</a> para o Orkut.<br />
Um belo passo frente ao problema, agora era capaz de pedir ao orkut a conexão, autorizar o usuário, e receber um token de acesso.<br />
Precisamos de um token pois qualquer solicitação ao serviço vai precisar dessa validação. </p>
<p>Aparentemente uma primeira etapa concluída, agora só falta consumir os dados como perfil e scraps. Porém aqui tudo vai por água abaixo.<br />
O Orkut não aceita utilizar um token gerado por outras formas pra pedir os dados no serviço RPC-JSON. Ele responde com falha na autenticação e bloqueia tudo. Voltamos a estaca zero.</p>
<p><strong>Faça-se a luz</strong><br />
Voltar pra solução do serviço intermediário utilizando a própria lib java do Orkut é uma opção. Mas pelos problemas citados acima vale mais um estudo. Conhecendo um pouco mais do processo interno da lib Java, e entendendo como é feito todo processo de requissição e autenticação, resolvi portar a lib pra uma versão Ruby. Essa alternativa tem o problema de ser um pouco mais trabalhosa e precisar de conhecimento de Ruby e Java,<br />
e refazer processos como o de autenticação por captcha com oauth autorizado, entre outras partes,<br />
porém elimina os problemas de ter um serviço a mais só pra executar essa tareefa. Tendo uma lib Ruby pra fazer tanto o connect quanto oas requisições pra serviços temos tudo na mesma linguagem e ambiente, faciltando muito as coisas.</p>
<p>A bliblioteca em questão foi chamada de <strong>orkut_os_client</strong>, tem um <a href="http://orkut.heroku.com/" target="_blank">demo</a> online e o código está no <a href="https://github.com/andersonleite/orkut_os_client" target="_blank">Github</a>.<br />
Tenho muitas dúvidas de como melhorá-la ou como testa, ou seja, se você estiver a fim de dar uma olhada, não exite em conversar comigo.</p>
<p>Essa biblioteca já passou por diversas requisições, e o código é utilizado em um sistema com um número pesado de acessos por minuto, ou seja, vem cumprindo bem sua função</p>
<p><strong>Conclusão</strong><br />
O Phillip Calçado fez um <a href="http://philcalcado.com/2011/12/29/read_the_dinossaurs.html">post muito legal</a> sobre a importância do conhecimento de tecnologias antigas, sua evolução, etc.<br />
Se você é um programador, o problema a ser resolvido deveria ser aquilo que te motiva. Conhecimento de tecnologias antigas ajuda muito na criação de tecnologias novas.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/andersonleiteblog.wordpress.com/719/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/andersonleiteblog.wordpress.com/719/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/andersonleiteblog.wordpress.com/719/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/andersonleiteblog.wordpress.com/719/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/andersonleiteblog.wordpress.com/719/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/andersonleiteblog.wordpress.com/719/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/andersonleiteblog.wordpress.com/719/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/andersonleiteblog.wordpress.com/719/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/andersonleiteblog.wordpress.com/719/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/andersonleiteblog.wordpress.com/719/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/andersonleiteblog.wordpress.com/719/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/andersonleiteblog.wordpress.com/719/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/andersonleiteblog.wordpress.com/719/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/andersonleiteblog.wordpress.com/719/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=719&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://andersonleiteblog.wordpress.com/2012/01/02/quando-redes-sociais-nao-sao-so-facebook-e-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b583dd1f235705801e9ae89658fa7caf?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anderson_leite</media:title>
		</media:content>
	</item>
		<item>
		<title>Track de Ruby na QConSP 2011</title>
		<link>http://andersonleiteblog.wordpress.com/2011/09/10/track-de-ruby-na-qconsp-2011/</link>
		<comments>http://andersonleiteblog.wordpress.com/2011/09/10/track-de-ruby-na-qconsp-2011/#comments</comments>
		<pubDate>Sat, 10 Sep 2011 21:29:37 +0000</pubDate>
		<dc:creator>anderson_leite</dc:creator>
				<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://andersonleiteblog.wordpress.com/?p=701</guid>
		<description><![CDATA[A Caelum mais uma vez organiza um excelente evento, com palestras de alto nível e diversidade. No primeiro dia já tivemos excelentes keynotes e ótimas palestras como do Alberto Souza e Lucas Cavalcanti falando sobre Scala como alternativa para aplicações Java e Design de código com Guilherme Silveira. Amanhã teremos muito mais conteúdo interessante, divididos [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=701&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://www.caelum.com.br">Caelum</a> mais uma vez organiza um excelente evento, com palestras de alto nível e diversidade.<br />
No primeiro dia já tivemos excelentes keynotes e ótimas palestras como do <a href="http://twitter.com/#!/alberto_souza">Alberto Souza</a> e <a href="http://twitter.com/#!/lucascs">Lucas Cavalcanti</a> falando sobre Scala como alternativa para aplicações Java e Design de código com <a href="http://twitter.com/guilhermecaelum">Guilherme Silveira</a>.</p>
<p>Amanhã teremos muito mais conteúdo interessante, divididos entre Ruby, Agile e Arquitetura. A track de Ruby que tenho a honra de apresentar amanhã foi escolhida com muito cuidado, com palestrantes e temas bem atuais, focando em problemas e soluções, algumas antigas outras mais novas.</p>
<blockquote><p>Palestrantes</p></blockquote>
<p><a href="http://andersonleiteblog.files.wordpress.com/2011/09/nelson-haraguchi.jpg"><img src="http://andersonleiteblog.files.wordpress.com/2011/09/nelson-haraguchi.jpg?w=150&#038;h=150" alt="" title="nelson-haraguchi" width="150" height="150" class="alignleft size-thumbnail wp-image-704" /></a><br />
<strong>Nelson Haraguchi</strong> será o primeiro a falar, apresentando problemas e soluções em projetos Ruby com 80 milhões de requisições na Boo-Box. Como suportar um crescimento tão grande e escalar sistemas desse porte.</p>
<p><a href="http://andersonleiteblog.files.wordpress.com/2011/09/hiro-asari.jpg"><img src="http://andersonleiteblog.files.wordpress.com/2011/09/hiro-asari.jpg?w=150&#038;h=150" alt="" title="hiro-asari" width="150" height="150" class="alignright size-thumbnail wp-image-706" /></a><br />
Muitos projetos Ruby hoje são desenvolvidos por programadores com experiencia em Java, ou mesmo possuem ambas as linguagens, utilizando o melhor dos mundos. Toda essa história pode ser aproveitada para utilizando o melhor das ferramentas disponíveis. <strong>Hiro Asari</strong>, JRuby engineer da <strong>Engine Yard</strong> vai falar sobre essa convergência e como anda o projeto JRuby atualmente. </p>
<p><a href="http://andersonleiteblog.files.wordpress.com/2011/09/vinicius-baggio.jpg"><img src="http://andersonleiteblog.files.wordpress.com/2011/09/vinicius-baggio.jpg?w=594" alt="" title="vinicius-baggio"   class="alignleft size-full wp-image-708" /></a><br />
Pegando mais um gancho no assunto, muitas lições aprendidas por programadores experientes em outras linguagens tem sido esquecidas em projetos Ruby. <strong>Vinicius baggio</strong>, mais um integrante do GURU-SP vai mostrar técnicas que não podem ser esquecidas por novos programadores.</p>
<p><a href="http://andersonleiteblog.files.wordpress.com/2011/09/bruno-andrade-alves.jpg"><img src="http://andersonleiteblog.files.wordpress.com/2011/09/bruno-andrade-alves.jpg?w=128&#038;h=150" alt="" title="bruno-andrade-alves" width="128" height="150" class="alignright size-thumbnail wp-image-709" /></a><br />
Após essa toda essa trajetória, chegamos a ferramentas da atualidade que buscam resolver mais desses problemas. <strong>Bruno Alves</strong>, da Dito, vem contar casos reais de uma aplicação Ruby escalável através de Node.js, Redis e Rails.</p>
<p><a href="http://andersonleiteblog.files.wordpress.com/2011/09/shay-frendt.jpg"><img src="http://andersonleiteblog.files.wordpress.com/2011/09/shay-frendt.jpg?w=150&#038;h=150" alt="" title="shay-frendt" width="150" height="150" class="alignleft size-thumbnail wp-image-710" /></a><br />
Pra fechar e cada vez mais abrirmos as possibilidades atuais na internet, <strong>Shay Frendt</strong>, da Think Relevance, conhecida empresa principalmente por conta do Clojure, fala sobre a utilização de Ruby e Rails em projetos para iOS como iPad e iPhone.</p>
<p>Esperamos vocês lá!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/andersonleiteblog.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/andersonleiteblog.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/andersonleiteblog.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/andersonleiteblog.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/andersonleiteblog.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/andersonleiteblog.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/andersonleiteblog.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/andersonleiteblog.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/andersonleiteblog.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/andersonleiteblog.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/andersonleiteblog.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/andersonleiteblog.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/andersonleiteblog.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/andersonleiteblog.wordpress.com/701/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=701&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://andersonleiteblog.wordpress.com/2011/09/10/track-de-ruby-na-qconsp-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b583dd1f235705801e9ae89658fa7caf?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anderson_leite</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2011/09/nelson-haraguchi.jpg?w=150" medium="image">
			<media:title type="html">nelson-haraguchi</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2011/09/hiro-asari.jpg?w=150" medium="image">
			<media:title type="html">hiro-asari</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2011/09/vinicius-baggio.jpg" medium="image">
			<media:title type="html">vinicius-baggio</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2011/09/bruno-andrade-alves.jpg?w=128" medium="image">
			<media:title type="html">bruno-andrade-alves</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2011/09/shay-frendt.jpg?w=150" medium="image">
			<media:title type="html">shay-frendt</media:title>
		</media:content>
	</item>
		<item>
		<title>Novidades no agendatech e versão para Android</title>
		<link>http://andersonleiteblog.wordpress.com/2011/01/03/novidades-no-agendatech-e-versao-para-android/</link>
		<comments>http://andersonleiteblog.wordpress.com/2011/01/03/novidades-no-agendatech-e-versao-para-android/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 21:57:07 +0000</pubDate>
		<dc:creator>anderson_leite</dc:creator>
				<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://andersonleiteblog.wordpress.com/?p=687</guid>
		<description><![CDATA[O Agendatech é um projeto que comecei junto com o Alberto Souza, com o intuito de listar uma série de eventos que ocorrem no Brasil. Como instrutor da Caelum, tive contato com muitos programadores que vinham de fora de São Paulo e queriam participar de algum dojo ou eventos de tecnologia enquanto faziam os cursos. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=687&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://www.agendatech.com.br">Agendatech</a> é um projeto que comecei junto com o <a href="http://twitter.com/alberto_souza">Alberto Souza</a>, com o intuito de listar uma série de eventos que ocorrem no Brasil. Como instrutor da <a href="http://www.caelum.com.br">Caelum</a>, tive contato com muitos programadores que vinham de fora de São Paulo e queriam participar de algum dojo ou eventos de tecnologia enquanto faziam os cursos. Além disso percevemos que no twitter muita gente dizia que sua agenda de eventos para ir no ano estava lotada. Nós queriamos saber onde as pessoas estavam indo e que eventos estão para ocorrer no Brasil.<br />
<a href="http://andersonleiteblog.files.wordpress.com/2011/01/screen-shot-2011-01-03-at-7-55-30-pm.png"><img src="http://andersonleiteblog.files.wordpress.com/2011/01/screen-shot-2011-01-03-at-7-55-30-pm.png?w=594" alt="" title="Screen shot 2011-01-03 at 7.55.30 PM"   class="aligncenter size-full wp-image-695" /></a></p>
<p>Existem alguns sites que tentavam fazer isso, mas todos muito desatualizados ou que não tinham uma proximidade grande com as comunidades de tecnologia, o que fazia com que esses sites apenas mostraassem eventos grandes, que todos já conhecem.</p>
<p>O <a href="http://www.agendatech.com.br">Agendatech</a> é populado por uma série de programadores, desenvolvedores, designers, empreendedores, arquitetos e diversos outros profissionais de tecnologia, fazendo com que eventos pequenos ou grandes possam ser localizados.</p>
<p>Desde o surgimento uma série de pessoas já colaboraram com o projeto, que é desenvolvido em <a href="http://www.rubyonrails.pro.br/">Rails</a> e roda no <a href="http://www.heroku.com">Heroku</a>. Agradecimentos especiais ao <a href="http://twitter.com/vinibaggio">Vini Baggio</a>, um dos maiores commiters do projeto desde que ele surgiu. Para conferir a lista de colaboradores clique <a href="https://github.com/ideiasaleatorias/agendatech/contributors">aqui</a>.</p>
<p>O agendatech teve apoio de muitos eventos, e fica aqui os agradecimentos especiais a <a href="http://www.caelum.com.br">Caelum</a>, <a href="http://www.infoq.com/br/">InfoQ</a> e <a href="http://www.rubyinside.com.br/">RubyInside</a>.</p>
<blockquote><p>Novidades</p></blockquote>
<p>Algumas das novidades que colocamos no ar foi o novo layout e o upgrade para Rails 3.</p>
<p>Além disso agora é possível fazer um login rápido com seu twitter e clicar no botão &#8220;EU VOU&#8221;, que agrupa todos os participantes.<br />
<a href="http://andersonleiteblog.files.wordpress.com/2011/01/screen-shot-2011-01-03-at-7-41-07-pm.png"><img src="http://andersonleiteblog.files.wordpress.com/2011/01/screen-shot-2011-01-03-at-7-41-07-pm.png?w=594" alt="" title="Screen shot 2011-01-03 at 7.41.07 PM"   class="aligncenter size-full wp-image-688" /></a></p>
<p>Na área de descrição do evento temos agora possibilidade de discussão sobre temas do evento.</p>
<blockquote><p>Versão Android</p></blockquote>
<p>Ainda não temos a melhor app para Android mas demos o passo inicial. Já está disponível na Android Market a aplicação que permite listar e cadastrar eventos via JSON.</p>
<p>Falta um bom design além de diversas melhorias, mas assim como começamos a versão web, a versão mobile para Android também está disponível open-source no <a href="https://github.com/andersonleite/agendatech-android">github</a>.</p>
<p><a href="http://andersonleiteblog.files.wordpress.com/2011/01/and1.png"><img src="http://andersonleiteblog.files.wordpress.com/2011/01/and1.png?w=594" alt="" title="and1"   class="alignleft size-full wp-image-693" /></a></p>
<p>Fica os agradecimentos ao <a href="http://twitter.com/jonas_alves">Jonas Alves</a> e <a href="http://twitter.com/passos">Daniel Passos</a>, pelos commits e refatorações dessa primeira versão.</p>
<p>Se você tiver idéias ou gostaria de ajudar com novas funcionalidades, testes automatizados ou refactoring não deixe de mandar seu pull request!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/andersonleiteblog.wordpress.com/687/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/andersonleiteblog.wordpress.com/687/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/andersonleiteblog.wordpress.com/687/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/andersonleiteblog.wordpress.com/687/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/andersonleiteblog.wordpress.com/687/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/andersonleiteblog.wordpress.com/687/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/andersonleiteblog.wordpress.com/687/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/andersonleiteblog.wordpress.com/687/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/andersonleiteblog.wordpress.com/687/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/andersonleiteblog.wordpress.com/687/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/andersonleiteblog.wordpress.com/687/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/andersonleiteblog.wordpress.com/687/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/andersonleiteblog.wordpress.com/687/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/andersonleiteblog.wordpress.com/687/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=687&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://andersonleiteblog.wordpress.com/2011/01/03/novidades-no-agendatech-e-versao-para-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b583dd1f235705801e9ae89658fa7caf?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anderson_leite</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2011/01/screen-shot-2011-01-03-at-7-55-30-pm.png" medium="image">
			<media:title type="html">Screen shot 2011-01-03 at 7.55.30 PM</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2011/01/screen-shot-2011-01-03-at-7-41-07-pm.png" medium="image">
			<media:title type="html">Screen shot 2011-01-03 at 7.41.07 PM</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2011/01/and1.png" medium="image">
			<media:title type="html">and1</media:title>
		</media:content>
	</item>
		<item>
		<title>2010 in review</title>
		<link>http://andersonleiteblog.wordpress.com/2011/01/03/2010-in-review/</link>
		<comments>http://andersonleiteblog.wordpress.com/2011/01/03/2010-in-review/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 02:25:32 +0000</pubDate>
		<dc:creator>anderson_leite</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://andersonleiteblog.wordpress.com/?p=685</guid>
		<description><![CDATA[The stats helper monkeys at WordPress.com mulled over how this blog did in 2010, and here&#8217;s a high level summary of its overall blog health: The Blog-Health-o-Meter™ reads This blog is on fire!. Crunchy numbers A Boeing 747-400 passenger jet can hold 416 passengers. This blog was viewed about 10,000 times in 2010. That&#8217;s about [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=685&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[
<p>The stats helper monkeys at WordPress.com mulled over how this blog did in 2010, and here&#8217;s a high level summary of its overall blog health:</p>
<p align="center"><img style="border:1px solid #ddd;background:#f5f5f5;padding:20px;" src="http://s0.wp.com/i/annual-recap/meter-healthy4.gif" width="250" height="183" alt="Healthy blog!"></p>
<p align="center">The <em>Blog-Health-o-Meter™</em> reads This blog is on fire!.</p>
<h2>Crunchy numbers</h2>
<p>			<a href="http://andersonleiteblog.files.wordpress.com/2010/09/picture-21.png"><img src="http://andersonleiteblog.files.wordpress.com/2010/09/picture-21.png?w=288" alt="Featured image" style="max-height:230px;float:right;border:1px solid #ddd;background:#fff;margin:0 0 1em 1em;padding:6px;" /></a></p>
<p>A Boeing 747-400 passenger jet can hold 416 passengers.  This blog was viewed about <strong>10,000</strong> times in 2010.  That&#8217;s about 24 full 747s.</p>
<p>
<p>In 2010, there were <strong>12</strong> new posts, growing the total archive of this blog to 41 posts. There were <strong>67</strong> pictures uploaded, taking up a total of 3mb. That&#8217;s about 1 pictures per week.</p>
<p>The busiest day of the year was September 12th with <strong>204</strong> views. The most popular post that day was <a style="color:#08c;" href="http://andersonleiteblog.wordpress.com/2010/09/12/rails-3-internals/">Rails 3 Internals</a>.</p>
<p></p>
<h2>Where did they come from?</h2>
<p>The top referring sites in 2010 were <strong>blog.caelum.com.br</strong>, <strong>andersonleite.com.br</strong>, <strong>davidpaniz.com</strong>, <strong>twitter.com</strong>, and <strong>google.com.br</strong>.</p>
<p>Some visitors came searching, mostly for <strong>jquery shadow</strong>, <strong>anderson leite</strong>, <strong>restfulie</strong>, <strong>shadow jquery</strong>, and <strong>clojure</strong>.</p>
<div style="clear:both;"></div>
<h2>Attractions in 2010</h2>
<p>These are the posts and pages that got the most views in 2010.</p>
<div style="clear:left;float:left;font-size:24pt;line-height:1em;margin:-5px 10px 20px 0;">1</div>
<p>					<a style="margin-right:10px;" href="http://andersonleiteblog.wordpress.com/2010/09/12/rails-3-internals/">Rails 3 Internals</a> <span style="color:#999;font-size:8pt;">September 2010</span><br />4 comments											</p>
<div style="clear:left;float:left;font-size:24pt;line-height:1em;margin:-5px 10px 20px 0;">2</div>
<p>					<a style="margin-right:10px;" href="http://andersonleiteblog.wordpress.com/2010/02/09/metaprogramacao-ruby-object-model/">#1 Metaprogramação: Ruby Object Model</a> <span style="color:#999;font-size:8pt;">February 2010</span><br />10 comments											</p>
<div style="clear:left;float:left;font-size:24pt;line-height:1em;margin:-5px 10px 20px 0;">3</div>
<p>					<a style="margin-right:10px;" href="http://andersonleiteblog.wordpress.com/2009/11/04/jquery-reflection-e-shadow/">JQuery | Reflection e Shadow</a> <span style="color:#999;font-size:8pt;">November 2009</span>											</p>
<div style="clear:left;float:left;font-size:24pt;line-height:1em;margin:-5px 10px 20px 0;">4</div>
<p>					<a style="margin-right:10px;" href="http://andersonleiteblog.wordpress.com/about/">Sobre</a> <span style="color:#999;font-size:8pt;">February 2009</span>											</p>
<div style="clear:left;float:left;font-size:24pt;line-height:1em;margin:-5px 10px 20px 0;">5</div>
<p>					<a style="margin-right:10px;" href="http://andersonleiteblog.wordpress.com/2010/02/10/metaprogramacao-definindo-metodos/">#2 Metaprogramação: Definindo métodos</a> <span style="color:#999;font-size:8pt;">February 2010</span><br />8 comments											</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/andersonleiteblog.wordpress.com/685/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/andersonleiteblog.wordpress.com/685/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/andersonleiteblog.wordpress.com/685/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/andersonleiteblog.wordpress.com/685/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/andersonleiteblog.wordpress.com/685/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/andersonleiteblog.wordpress.com/685/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/andersonleiteblog.wordpress.com/685/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/andersonleiteblog.wordpress.com/685/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/andersonleiteblog.wordpress.com/685/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/andersonleiteblog.wordpress.com/685/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/andersonleiteblog.wordpress.com/685/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/andersonleiteblog.wordpress.com/685/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/andersonleiteblog.wordpress.com/685/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/andersonleiteblog.wordpress.com/685/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=685&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://andersonleiteblog.wordpress.com/2011/01/03/2010-in-review/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b583dd1f235705801e9ae89658fa7caf?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anderson_leite</media:title>
		</media:content>

		<media:content url="http://s0.wp.com/i/annual-recap/meter-healthy4.gif" medium="image">
			<media:title type="html">Healthy blog!</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2010/09/picture-21.png?w=288" medium="image">
			<media:title type="html">Featured image</media:title>
		</media:content>
	</item>
		<item>
		<title>Meu ambiente de desenvolvimento em 7 itens</title>
		<link>http://andersonleiteblog.wordpress.com/2010/12/29/meu-ambiente-de-desenvolvimento-em-7-itens/</link>
		<comments>http://andersonleiteblog.wordpress.com/2010/12/29/meu-ambiente-de-desenvolvimento-em-7-itens/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 03:55:05 +0000</pubDate>
		<dc:creator>anderson_leite</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://andersonleiteblog.wordpress.com/?p=680</guid>
		<description><![CDATA[Meu amigo Vini Baggio (@vinibaggio) me convidou pra brincadeira, então vamos lá: Máquina / Sistema Operacional Uso Mac OS X desde 2006. Até 2009 usei um Macbook White 13&#8243; e hoje um Macbook Pro 13&#8243;. Em casa uso um monitor adicional de 22&#8243;. Gosto de mouse, claro que não pra programar, mas pra navegar ou [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=680&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Meu amigo <a href="http://vinibaggio.net/">Vini Baggio</a> (@vinibaggio) me convidou pra brincadeira, então vamos lá:</p>
<p><strong>Máquina / Sistema Operacional</strong><br />
Uso Mac OS X desde 2006. Até 2009 usei um Macbook White 13&#8243; e hoje um Macbook Pro 13&#8243;. Em casa uso um monitor adicional de 22&#8243;. Gosto de mouse, claro que não pra programar, mas pra navegar ou me aventurar no Photoshop. Meu antigo Macbook não funciona mais o track pad e é dependente do cabo da bateria, consequentemente virou DVD de luxo na sala =) . </p>
<p><strong>Editor</strong><br />
Costumo usar mais o textMate porém desde o último Rails Rumble venho seguindo a moda e me aventurando no Vim. Nunca fui fã de aprender a dar um &#8220;combo&#8221; pra copiar arquivos, nem &#8220;meia lua pra frente soco forte&#8221; pra poder gravar arquivos, mas acabei gostando do Vim depois de uma série de deploys e tarefas de sysadmin. Uso Rails.vim, snipMate, surrond, ragtag e mais outros plugins.<br />
Ultimamente tenho me aventurado em desenvolver pra Android, então o Eclipse está sempre aberto rodando o emulador.</p>
<p><strong>Terminal</strong><br />
Terminal bash tradicional com algumas coisas no bashrc, gosto de um plugin chamado Visor e umas frescuras pras <a href="http://blog.fallingsnow.net/2009/08/28/fixing-colors-in-terminal-app-on-10-6/">cores do terminal </a>.<br />
As abas costuma ser uma pro vim, rails console, ssh e outras pra tarefas adicionais.</p>
<p><strong>Browser</strong><br />
Tenho usado o Chrome pra quase tudo, mas não largo o glorioso Firefox e o Firebug pra programação front end.</p>
<p><strong>Software</strong></p>
<ul>
<li>TweetDeck</li>
<li>iTunes</li>
<li>Adium/Skype</li>
<li>VLC</li>
<li>Quicksilver</li>
</ul>
<p><strong>Source-code</strong><br />
Git!</p>
<p><strong>Música</strong><br />
Em casa de madrugada sempre com o fone, porém na <a href="http://www.caelum.com.br">Caelum</a> aproveito pra aprender com as discussões que ocorrem toda hora, então fico só com um fonezinho branco em só um lado pra não perder nada <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>É isso, convido <a href="http://davidpaniz.com/">David Paniz</a>, <a href="http://ahalmeida.com/">Adriano Almeida</a> e <a href="http://agilenomundoreal.com.br/">Guilherme Silveira</a> e o mestre <a href="http://fabiokung.com/">Fabio Kung</a> pra bincadeira.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/andersonleiteblog.wordpress.com/680/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/andersonleiteblog.wordpress.com/680/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/andersonleiteblog.wordpress.com/680/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/andersonleiteblog.wordpress.com/680/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/andersonleiteblog.wordpress.com/680/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/andersonleiteblog.wordpress.com/680/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/andersonleiteblog.wordpress.com/680/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/andersonleiteblog.wordpress.com/680/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/andersonleiteblog.wordpress.com/680/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/andersonleiteblog.wordpress.com/680/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/andersonleiteblog.wordpress.com/680/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/andersonleiteblog.wordpress.com/680/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/andersonleiteblog.wordpress.com/680/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/andersonleiteblog.wordpress.com/680/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=680&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://andersonleiteblog.wordpress.com/2010/12/29/meu-ambiente-de-desenvolvimento-em-7-itens/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b583dd1f235705801e9ae89658fa7caf?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anderson_leite</media:title>
		</media:content>
	</item>
		<item>
		<title>Rails 3 Internals</title>
		<link>http://andersonleiteblog.wordpress.com/2010/09/12/rails-3-internals/</link>
		<comments>http://andersonleiteblog.wordpress.com/2010/09/12/rails-3-internals/#comments</comments>
		<pubDate>Sun, 12 Sep 2010 17:16:59 +0000</pubDate>
		<dc:creator>anderson_leite</dc:creator>
				<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://andersonleiteblog.wordpress.com/?p=639</guid>
		<description><![CDATA[O Rails 3 foi finalmente anunciado e nele uma série de mudanças arquiteturais foram feitas. A princípio, para que programa, as mudanças podem parecer simples, penas novos comandos ou novas API&#8217;s. Mas se olharmos nos detalhes internos do framework podemos ver que as mudanças impactam diretamente na forma de usar o framework. O Rails 3 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=639&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>O <strong>Rails 3</strong> foi finalmente anunciado e nele uma série de mudanças arquiteturais foram feitas.<br />
A princípio, para que programa, as mudanças podem parecer simples, penas novos comandos ou novas API&#8217;s. Mas se olharmos nos detalhes internos do framework podemos ver que as mudanças impactam diretamente na forma de usar o framework.</p>
<p>O <strong>Rails 3</strong> tem uma série de melhorias, mas nesse post quero tratar especificamente de uma, que é <strong>Modularidade</strong>.<br />
<strong>Modularidade</strong> lembra de alguma forma baixo-acoplamento, fator indispensável para uma boa arquitetura.</p>
<blockquote><p>Active Relation</p></blockquote>
<p>Podemos analisar a questão da modularidade de várias maneiras, aqui vamos analisar usando o <strong>ActiveRelation</strong>.<br />
O <strong>ActiveRelation</strong> permite querys muito mais interessantes, veja essa diferença entre Rails 2 e <strong>Rails 3</strong>.</p>
<p><a href="http://andersonleiteblog.files.wordpress.com/2010/09/picture-1.png"><img src="http://andersonleiteblog.files.wordpress.com/2010/09/picture-1.png?w=594" alt="" title="Picture 1"   class="alignnone size-full wp-image-640" /></a></p>
<p>O que percebemos nessa figura é que a nova API possui métodos muito mais intuitivos e interessantes<br />
para criar querys. Alguns detalhes importantes aqui são: </p>
<ul>
<li>No Rails 2 o retorno já era um array com seus models. No Rails 3 cada método devolve um objeto chamado Relation</li>
<li>Esse objeto Relation é capaz de fazer um encadeamento de operações. Com isso, auery final só é chamada quando<br />
executado explicitamente algum método como all ou each.</li>
<li>No Rails 3 comportamento é Lazy Loading.</li>
</ul>
<p>Visto isso, duas coisas podem ser analisádas:</p>
<ul>
<li>Como isso é feito por dentro?</li>
<li>Como usar isso na minha app?</li>
</ul>
<blockquote><p>Internamente</p></blockquote>
<p>Procurando internamente no fonte do <strong>Rails</strong>, encontramos o arquivo <strong>query_methods.rb</strong>. Esse é o arquivo responsável pela idéia de encadeamento:</p>
<p><a href="http://andersonleiteblog.files.wordpress.com/2010/09/picture-2.png"><img src="http://andersonleiteblog.files.wordpress.com/2010/09/picture-2.png?w=594" alt="" title="Picture 2"   class="alignnone size-full wp-image-641" /></a></p>
<p>Repare no código fonte. Independente do método chamado o <strong>Rails</strong> sempre faz uma cópia do encadeamento atual, adiciona um novo comportamento e devolve essa <strong>Relation</strong> atualizada. E quem é esse <strong>relation</strong> ?</p>
<p><a href="http://andersonleiteblog.files.wordpress.com/2010/09/picture-3.png"><img src="http://andersonleiteblog.files.wordpress.com/2010/09/picture-3.png?w=594" alt="" title="Picture 3"   class="alignnone size-full wp-image-642" /></a></p>
<p><strong>relation</strong> é um método do <strong>ActiveRecord</strong> que verifica se o encadeamento já foi inicializado e decide por criar um novo ou devolver o mesmo.<br />
Ainda temos na classe <strong>Relation</strong> um delegate, que roda o método <strong>to_a</strong> toda vez que o Relation for disparado. É nesse ponto que  o <strong>Rails</strong> controla o hit no banco de dados. Interessante notar que o método <strong>find_by_sql</strong> ainda é utilizado, porém, com uma query<br />
gerada pelo <strong>ARel</strong>.</p>
<blockquote><p>Como melhorar meu código com isso?</p></blockquote>
<p>O que não pode acontecer é apenas aceitar como funciona e usar a API. Esse <strong>encadeamneto</strong> abre novas possíbilidades de querys muito mais interessantes e otimizadas. Um ponto sempre complexo em aplicações são filtros que necessitam <strong>querys dinâmicas</strong>.</p>
<p><a href="http://andersonleiteblog.files.wordpress.com/2010/09/picture-4.png"><img src="http://andersonleiteblog.files.wordpress.com/2010/09/picture-4.png?w=594" alt="" title="Picture 4"   class="alignnone size-full wp-image-645" /></a></p>
<p>Filtros que necessitam muitos parâmetros com um número grande de <strong>combinações possíveis entre eles</strong> são complicados de fazer e manter.<br />
Como tirar proveito do ActiveRelation pra melhorar isso ?</p>
<p>Se utilizarmos a mesma idéia de clonar o relation e devolve-lo de acordo com cada filtro preenchido pelo usuário, podemos montar uma implementação bem interessante com um pouco de meta-programação.</p>
<p><a href="http://andersonleiteblog.files.wordpress.com/2010/09/picture-5.png"><img src="http://andersonleiteblog.files.wordpress.com/2010/09/picture-5.png?w=594" alt="" title="Picture 5"   class="alignnone size-full wp-image-646" /></a></p>
<p>Repare que com um método <strong>filtered_relation</strong> podemos iterar sobre cada filtro possível, adicionando uma nova relation.<br />
Cada <strong>relation</strong> é única e ensinamos como tratar com um método exclusivo.</p>
<p>Nesse caso utilizamos o ActiveRecord, mas hoje o Rails 3 não é opnionated. Até hoje, o Rails era considerado um<br />
meta-framework, ou seja, um conjunto de frameworks, que juntos formavam o Rails. </p>
<p>No Rails 3, um componente central foi totalmente alterado para servir de fundação para o Rails. Todos os<br />
considerados frameworks principais como ActiveRecord, ActionMailer etc deixaram de ser framewors e hoje são plugins.</p>
<p>O componente que organiza tudo isso é o Railtie. Todo plugin hoje é herda de Railtie. Ao inicializar o Rails,<br />
o Railtie procura todos as classes que herdam de Railtie e começa sua inicialização. Nesse momento, cada plugin é responsável<br />
pelo seu processo de boot, ou seja, desacoplado do Rails.</p>
<p><a href="http://andersonleiteblog.files.wordpress.com/2010/09/picture-6.png"><img src="http://andersonleiteblog.files.wordpress.com/2010/09/picture-6.png?w=594" alt="" title="Picture 6"   class="alignnone size-full wp-image-649" /></a></p>
<p>Se olhar os geradores, podemos entender como o Rails pluga os principais componentes(ActiveRecord, ActionController, etc)</p>
<p><a href="http://andersonleiteblog.files.wordpress.com/2010/09/picture-71.png"><img src="http://andersonleiteblog.files.wordpress.com/2010/09/picture-71.png?w=594" alt="" title="Picture 7"   class="alignnone size-full wp-image-653" /></a></p>
<blockquote><p>Railtie + Plugins + ARel&#8230;</p></blockquote>
<p>Se apartir do fonte do Rails criamos uma funcinalidade de filtro e se o Rails aceita fácilmente plugins hoje, por que não<br />
juntar tudo agora ?</p>
<p>Podemos criar um plugin de filtros dinâmicos. Se você se interessar por ver o código ou contribuir, basta acessar o <strong>github do plugin</strong> <a href="http://github.com/andersonleite/filtered_relation">filtered_relation</a></p>
<p>Os slides dessa apresentação estão no SlideShare</p>
<p><a href="http://www.slideshare.net/andersonleite/rails-3-internals-5201474"><img src="http://andersonleiteblog.files.wordpress.com/2010/09/picture-21.png?w=594" alt="" title="Picture 2"   class="alignnone size-full wp-image-660" /></a></p>
<div style="width:425px;" id="__ss_5183983"><strong><a href="http://www.slideshare.net/andersonleite/rails-3-internals-5183983" title="Rails 3 Internals">Rails 3 Internals</a></strong>
<div style="padding:5px 0 12px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/andersonleite">andersonleite</a>.</div>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/andersonleiteblog.wordpress.com/639/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/andersonleiteblog.wordpress.com/639/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/andersonleiteblog.wordpress.com/639/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/andersonleiteblog.wordpress.com/639/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/andersonleiteblog.wordpress.com/639/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/andersonleiteblog.wordpress.com/639/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/andersonleiteblog.wordpress.com/639/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/andersonleiteblog.wordpress.com/639/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/andersonleiteblog.wordpress.com/639/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/andersonleiteblog.wordpress.com/639/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/andersonleiteblog.wordpress.com/639/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/andersonleiteblog.wordpress.com/639/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/andersonleiteblog.wordpress.com/639/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/andersonleiteblog.wordpress.com/639/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=639&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://andersonleiteblog.wordpress.com/2010/09/12/rails-3-internals/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b583dd1f235705801e9ae89658fa7caf?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anderson_leite</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2010/09/picture-1.png" medium="image">
			<media:title type="html">Picture 1</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2010/09/picture-2.png" medium="image">
			<media:title type="html">Picture 2</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2010/09/picture-3.png" medium="image">
			<media:title type="html">Picture 3</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2010/09/picture-4.png" medium="image">
			<media:title type="html">Picture 4</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2010/09/picture-5.png" medium="image">
			<media:title type="html">Picture 5</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2010/09/picture-6.png" medium="image">
			<media:title type="html">Picture 6</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2010/09/picture-71.png" medium="image">
			<media:title type="html">Picture 7</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2010/09/picture-21.png" medium="image">
			<media:title type="html">Picture 2</media:title>
		</media:content>
	</item>
		<item>
		<title>Clojure: Estados #2</title>
		<link>http://andersonleiteblog.wordpress.com/2010/09/04/clojure-estados-2/</link>
		<comments>http://andersonleiteblog.wordpress.com/2010/09/04/clojure-estados-2/#comments</comments>
		<pubDate>Sat, 04 Sep 2010 18:16:37 +0000</pubDate>
		<dc:creator>anderson_leite</dc:creator>
				<category><![CDATA[clojure]]></category>

		<guid isPermaLink="false">http://andersonleiteblog.wordpress.com/?p=626</guid>
		<description><![CDATA[A função hello criada anteriormente é pura. Isto significa que ela não tem nenhum efeito colateral. Esse tipo de função é relativamente fácil de escrever, testar e entender além de ser recomendada pra diversas necessidades. Porém muitos programas possuem estado compartilhado e precisam de funções não puras como essa para manter esse estado compartilhado. Melhorando [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=626&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://andersonleiteblog.wordpress.com/2010/08/26/clojure-hello-world-e-funcoes-1/">função hello criada anteriormente</a> é <strong>pura</strong>. Isto significa que ela não tem nenhum efeito colateral. Esse tipo de função é relativamente fácil de escrever, testar e entender além de ser<br />
recomendada pra diversas necessidades.</p>
<p>Porém muitos programas possuem <strong>estado compartilhado</strong> e precisam de funções não puras como essa para manter esse estado compartilhado.</p>
<blockquote><p>Melhorando a função hello</p></blockquote>
<p>Nossa função agora manterá um registro de todas as chamadas que forem feitas a ela. Para isso, usaremos um &#8220;<strong>set</strong>&#8221; do <strong>Clojure</strong>.</p>
<p><code>#{}<br />
⇒<br />
#{}<br />
</code></p>
<p>Como adicionar elementos nesse <strong>set</strong> ? Para isso utilizaremos um &#8220;<strong>conj</strong>&#8220;.<br />
<strong>Conj</strong> é a significa conjoin de forma simplificada e ele cria novas coleções com os ítens adicionados.<br />
Podemos então usar o <strong>conj</strong> com um elemento em um <strong>set</strong>.</p>
<p><code><br />
(conj #{} "Anderson")<br />
⇒<br />
#{"Anderson"} </p>
<p></code><br />
Agora que sabemos como criar &#8220;<strong>sets</strong>&#8220;, precisamos de alguma forma manter os registros das chamadas a nossa função hello.<br />
Para isso, <strong>Clojure</strong> possui referencias (<strong>refs</strong>) e para nomear uma referência usamos <strong>def</strong>.</p>
<p><strong>def</strong> é quase igual ao <strong>defn</strong> mas de uma forma mais generalista. Usando <strong>def</strong> podemos definir funções ou dados.<br />
Usamos <strong>def</strong> para criar referências e associá-las a nossa função:</p>
<p><code><br />
(def visitors (ref #{}))<br />
⇒<br />
#'user/visitors<br />
</code></p>
<blockquote><p>E onde está esse controle de estados tão forte em Closure ?</p></blockquote>
<p><a href="http://andersonleiteblog.files.wordpress.com/2010/09/sharing-300x273.gif"><img src="http://andersonleiteblog.files.wordpress.com/2010/09/sharing-300x273.gif?w=594" alt="" title="sharing-300x273"   class="alignnone size-full wp-image-631" /></a></p>
<p>O que acontece se tentarmos <strong>alterar</strong> essa referência que criamos ?<br />
Vamos tentar fazer isso usando &#8220;<strong>alter</strong>&#8220;. Usando &#8220;<strong>alter</strong>&#8221; podemos tentar alterar nossa referência, inclusive passando argumentos se necessário. Vamos tentar alterar &#8220;visitor&#8221; para &#8220;visitors&#8221;.<br />
<code><br />
(alter visitors conj "Anderson")<br />
⇒<br />
java.lang.IllegalStateException: No transaction running<br />
</code></p>
<p>Como vemos acima, <strong>clojure</strong> protege as referências. Podemos alterá-las mas precisamos de &#8220;<strong>transactions</strong>&#8220;, deixando para o <strong>Clojure</strong> o trabalho pesado de lidar com concorrêcia entre múltiplas chamadas a nossa função.</p>
<p>E como crio essa <strong>transaction</strong> ?<br />
Para criar uma <strong>transaction</strong> usamos <strong>dosync</strong>. </p>
<p><code>(dosync (alter visitors conj "Anderson"))<br />
⇒<br />
#{"Anderson"}<br />
</code><br />
Agora podemos buscar a referência com <strong>deref</strong>, veja:</p>
<p><code>(deref visitors)<br />
⇒<br />
#{"Anderson"}<br />
@visitors<br />
⇒<br />
#{"Anderson"}<br />
</code></p>
<p>Agora podemos construir uma função hello muito mais avançada e elaborada:<br />
 <code>(defn hello<br />
    "Returns a hello message, calling you by username.<br />
      Knows if you have been here before."<br />
	[username]<br />
	(dosync<br />
		(let [past-visitor (@visitors username)]<br />
			(if past-visitor<br />
				(str "Welcome back, " username)<br />
				(do<br />
					(alter visitors conj username)<br />
					(str "Hello, " username)))))) </code></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/andersonleiteblog.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/andersonleiteblog.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/andersonleiteblog.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/andersonleiteblog.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/andersonleiteblog.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/andersonleiteblog.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/andersonleiteblog.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/andersonleiteblog.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/andersonleiteblog.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/andersonleiteblog.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/andersonleiteblog.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/andersonleiteblog.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/andersonleiteblog.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/andersonleiteblog.wordpress.com/626/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=626&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://andersonleiteblog.wordpress.com/2010/09/04/clojure-estados-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b583dd1f235705801e9ae89658fa7caf?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anderson_leite</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2010/09/sharing-300x273.gif" medium="image">
			<media:title type="html">sharing-300x273</media:title>
		</media:content>
	</item>
		<item>
		<title>Clojure: Hello World e Funções #1</title>
		<link>http://andersonleiteblog.wordpress.com/2010/08/26/clojure-hello-world-e-funcoes-1/</link>
		<comments>http://andersonleiteblog.wordpress.com/2010/08/26/clojure-hello-world-e-funcoes-1/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 06:32:03 +0000</pubDate>
		<dc:creator>anderson_leite</dc:creator>
				<category><![CDATA[clojure]]></category>

		<guid isPermaLink="false">http://andersonleiteblog.wordpress.com/?p=618</guid>
		<description><![CDATA[Para rodar seus programas Clojure, além do clojure.zip, você precisa do Java runtime. Precisa ser a versão 5 no mínimo, mas é muito recomendado usar 6 pois melhorias de performance a melhores logs de erros. Vamos analizar um pouco mais da linguagem agora. Quando estamos no prompt, podemos imprimir usando a função println. hello world [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=618&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Para rodar seus programas Clojure, além do clojure.zip, você precisa do Java runtime. Precisa ser a versão 5 no mínimo, mas é muito recomendado usar 6 pois melhorias de performance a melhores logs de erros.</p>
<p>Vamos analizar um pouco mais da linguagem agora. Quando estamos no prompt, podemos imprimir usando a função println. </p>
<p><code>hello world<br />
user=&gt; (println "hello world")<br />
| hello world<br />
-&gt; nil<br />
</code></p>
<p>A segunda linha é o output e a terceira linha, nil, é o retorno da função.</p>
<blockquote><p>Definindo funções</p></blockquote>
<p>Como toda linguagem você pode definir suas próprias funções:</p>
<p><code>user=&gt; (defn hello [name] (str "Hello, " name))<br />
⇒<br />
#'user/hello<br />
</code></p>
<p>O que essa linha faz ?</p>
<ul>
<li> <strong>defn</strong> define uma função. </li>
<li><strong>hello</strong> é o nome da função. </li>
<li>a função hello recebe um argumento, <strong>name</strong>. </li>
<li><strong>str</strong> é uma chamada a uma função que concatena argumento em uma string. </li>
</ul>
<p>O valor de retorno é <strong>#’user/hello</strong>. O prefixo <strong>#</strong>’ indica que a função foi guardada em uma <strong>variável Clojure</strong>, e user é o <strong>namespace</strong> dessa função.</p>
<blockquote><p>Usando funções</p></blockquote>
<p><a href="http://andersonleiteblog.files.wordpress.com/2010/08/state_youre_doing_it_wrong_tshirt-p2350635438588072523gsv_210.jpg"><img src="http://andersonleiteblog.files.wordpress.com/2010/08/state_youre_doing_it_wrong_tshirt-p2350635438588072523gsv_210.jpg?w=594" alt="" title="state_youre_doing_it_wrong_tshirt-p2350635438588072523gsv_210"   class="alignnone size-full wp-image-621" /></a></p>
<p>Uma vez criada a função e guardada em uma variável <strong>clojure</strong>, podemos chama=la:</p>
<p><code>user=&gt; (hello "anderson")<br />
⇒<br />
"Hello, anderson"</p>
<p></code></p>
<blockquote><p>Variaveis especiais</p></blockquote>
<p>As variáveis que criamos e guardamos no <strong>Clojure</strong> continuam acessíveis:</p>
<p><code>user=&gt; (hello "anderson")<br />
"Hello, anderson"<br />
</code></p>
<p><code>user=&gt; (hello "Caelum")<br />
"Hello, Caelum"<br />
</code></p>
<p>E agora podemos combinar essas variáveis especiais:</p>
<p><code>(str *1 " and " *2)<br />
⇒<br />
"Hello, Caelum and Hello, anderson"<br />
</code></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/andersonleiteblog.wordpress.com/618/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/andersonleiteblog.wordpress.com/618/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/andersonleiteblog.wordpress.com/618/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/andersonleiteblog.wordpress.com/618/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/andersonleiteblog.wordpress.com/618/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/andersonleiteblog.wordpress.com/618/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/andersonleiteblog.wordpress.com/618/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/andersonleiteblog.wordpress.com/618/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/andersonleiteblog.wordpress.com/618/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/andersonleiteblog.wordpress.com/618/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/andersonleiteblog.wordpress.com/618/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/andersonleiteblog.wordpress.com/618/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/andersonleiteblog.wordpress.com/618/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/andersonleiteblog.wordpress.com/618/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=618&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://andersonleiteblog.wordpress.com/2010/08/26/clojure-hello-world-e-funcoes-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b583dd1f235705801e9ae89658fa7caf?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anderson_leite</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2010/08/state_youre_doing_it_wrong_tshirt-p2350635438588072523gsv_210.jpg" medium="image">
			<media:title type="html">state_youre_doing_it_wrong_tshirt-p2350635438588072523gsv_210</media:title>
		</media:content>
	</item>
		<item>
		<title>Clojure #0</title>
		<link>http://andersonleiteblog.wordpress.com/2010/08/21/clojure/</link>
		<comments>http://andersonleiteblog.wordpress.com/2010/08/21/clojure/#comments</comments>
		<pubDate>Sat, 21 Aug 2010 07:17:23 +0000</pubDate>
		<dc:creator>anderson_leite</dc:creator>
				<category><![CDATA[clojure]]></category>

		<guid isPermaLink="false">http://andersonleiteblog.wordpress.com/?p=608</guid>
		<description><![CDATA[Clojure é uma linguagem dinâmica que pode rodar na JVM, possui uma syntax bem limpa e clara, é extremamente baseada em Lisp, e tem características de liguagem funcional, ou seja, estrutura de dados imutáveis tornando a maioria das funções livres de efeitos colaterais, o que torna mais fácil a escrita de programas complexos. Por rodar [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=608&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Clojure</strong> é uma linguagem dinâmica que pode rodar na JVM, possui uma syntax bem limpa e clara, é extremamente baseada em Lisp, e tem características de liguagem funcional, ou seja, estrutura de dados imutáveis tornando a maioria das funções livres de efeitos colaterais, o que torna mais fácil a escrita de programas complexos.</p>
<p><a href="http://andersonleiteblog.files.wordpress.com/2010/08/clojure.png"><img src="http://andersonleiteblog.files.wordpress.com/2010/08/clojure.png?w=594" alt="" title="clojure"   class="alignnone size-full wp-image-610" /></a></p>
<p>Por rodar na <strong>JVM</strong>, <strong>Clojure</strong> é muito relacionado com <strong>Java</strong>. A integração é bem simples e rápida, não necessitando nenhuma camada intermediária e, ao contraário da maioria das linguagens dinâmicas, <strong>clojure</strong> é rápido pois foi justamente escrito para tirar vantagens dos poderes de otimização das <strong>JVMs</strong>, podendo ser usada para diversos propósitos.</p>
<p><strong>Clojure</strong> combina idéias vindas do <strong>Lisp</strong>, da programação funcional e lida com problemas de concorrência.</p>
<blockquote><p>Instalando</p></blockquote>
<p>Pra ver os primeiros códigos Clojure rodando é necessário baixar o arquivo <a href="http://code.google.com/p/clojure/downloads/detail?name=clojure-1.1.0.zip">cloujure.zip</a></p>
<p>Descompaacte o arquivo. Voce vai encontrar diversas pastas e arquivos, mas não se preocupe com isso agora.<br />
Dentro dessa pasta crie um arquivo chamado<strong> clojure.clj</strong> (repare no .<strong>CLJ</strong> para arquivos clojure).<br />
Vamos começar criando um teste ao invés do tradicional <a href="http://en.wikipedia.org/wiki/Read-eval-print_loop">REPL</a>. Não se preocupe em entender toda syntax agora, apenas vá se adaptando:<br />
<code><br />
(ns clojure.test.example<br />
  (:use clojure.test))</p>
<p>(deftest add-1-to-1<br />
  (is (= 2 (+ 1 1))))</p>
<p>(run-all-tests)</code></p>
<p>Rode no terminal com:<br />
<code>java -cp clojure.jar clojure.main -i clojure.clj</code></p>
<p>Quando tudo der certo você deve ver o seguinte output:<br />
<code><br />
Testing user</p>
<p>Testing clojure.zip</p>
<p>Ran 1 tests containing 1 assertions.<br />
0 failures, 0 errors.</code></p>
<blockquote><p>Mais Clojure</p></blockquote>
<p><strong>Clojure</strong> equilibra conhecimentos de linguagens do passado com poderes das linguagens atuais.<br />
Veja o exemplo abaixo:<br />
<code><br />
//Java<br />
public class StringUtils {<br />
public static boolean isBlank(String str) {<br />
int strLen;<br />
if (str == null || (strLen = str.length()) == 0) {<br />
return true;<br />
}<br />
for (int i = 0; i &lt; strLen; i++) {<br />
if ((Character.isWhitespace(str.charAt(i)) == false)) {<br />
return false;<br />
}<br />
}<br />
return true;<br />
}<br />
} </p>
<p>; Clojure<br />
(defn blank? [s] (every? #(Character/isWhitespace %) s)) </code></p>
<p>A versão <strong>Clojure</strong> é bem mais curta, mas o mais importante é ser mais simples. Não são necessárias nem variáveis. Isso é possível graças as chamadas &#8220;higher-order function&#8221;  (funções que aceitam outras funções como argumento e/ou retornam funções como resultado). Além disso a versão Cljure é bem legivel. É como ler &#8220;uma string é vazia se toos os caracteres nela são espaços em branco&#8221;.</p>
<p><code><br />
// java<br />
public class Person {<br />
private String firstName;<br />
private String lastName;<br />
public Person(String firstName, String lastName) {<br />
this.firstName = firstName;<br />
this.lastName = lastName;<br />
}<br />
public String getFirstName() {<br />
return firstName;<br />
}<br />
public void setFirstName(String firstName) {<br />
this.firstName = firstName;<br />
}<br />
public String getLastName() {<br />
return lastName;<br />
}<br />
public void setLastName(String lastName) {<br />
this.lastName = lastName;<br />
}<br />
} </p>
<p>; clojure<br />
(defstruct person :first-name :last-name)<br />
</code></p>
<p><strong>Person em</strong> <strong>Clojure</strong> é imutavel (<strong>Clojure</strong> também prove implementação correta de hash_code e equals automaticamente).</p>
<p><a href="http://andersonleiteblog.files.wordpress.com/2010/08/clojuratica.png"><img src="http://andersonleiteblog.files.wordpress.com/2010/08/clojuratica.png?w=594" alt="" title="clojuratica"   class="alignnone size-full wp-image-613" /></a></p>
<blockquote><p>Definindo funções</p></blockquote>
<p><code>(defn hello-world [username]<br />
(println (format "Hello, %s" username))) </code></p>
<p><strong>Clojure</strong> é uma linguagem funcional, mas não puramente como <strong>Haskell</strong>.<br />
Funções podem ser criadas em runtime, retornadas, e normalmente usadas como um tipo como outro qualquer.<br />
E nos tempos atuais, programação funcional é muito mais urgente que antes, devido aos avanços de hardware.</p>
<p><strong>Clojure</strong> simplifica a programação concorrente, tornando fácil escrever código thread-safe.<br />
Como estruturas imutáveis não mudam nunca, não existe risco de dados corrompidos por terem sidos utilizados<br />
por outras threads. Tudo isso dentro da já consagrada <strong>JVM</strong>, onde inclusive, <strong>Clojure</strong> implementa funções simples<br />
para uma série de interfaces <strong>Java</strong>.</p>
<p>Agora que já falamos sobre as características do <strong>Clojure</strong>, os próximos posts abordarão mais sobre código.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/andersonleiteblog.wordpress.com/608/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/andersonleiteblog.wordpress.com/608/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/andersonleiteblog.wordpress.com/608/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/andersonleiteblog.wordpress.com/608/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/andersonleiteblog.wordpress.com/608/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/andersonleiteblog.wordpress.com/608/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/andersonleiteblog.wordpress.com/608/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/andersonleiteblog.wordpress.com/608/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/andersonleiteblog.wordpress.com/608/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/andersonleiteblog.wordpress.com/608/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/andersonleiteblog.wordpress.com/608/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/andersonleiteblog.wordpress.com/608/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/andersonleiteblog.wordpress.com/608/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/andersonleiteblog.wordpress.com/608/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=608&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://andersonleiteblog.wordpress.com/2010/08/21/clojure/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b583dd1f235705801e9ae89658fa7caf?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anderson_leite</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2010/08/clojure.png" medium="image">
			<media:title type="html">clojure</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2010/08/clojuratica.png" medium="image">
			<media:title type="html">clojuratica</media:title>
		</media:content>
	</item>
		<item>
		<title>Aula aberta na Caelum &#124; Slides</title>
		<link>http://andersonleiteblog.wordpress.com/2010/04/16/aula-aberta-na-caelum-slides/</link>
		<comments>http://andersonleiteblog.wordpress.com/2010/04/16/aula-aberta-na-caelum-slides/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 21:03:17 +0000</pubDate>
		<dc:creator>anderson_leite</dc:creator>
				<category><![CDATA[active_record]]></category>
		<category><![CDATA[metaprogramação]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://andersonleiteblog.wordpress.com/?p=592</guid>
		<description><![CDATA[A aula aberta na Caelum foi bem legal, presença de cerca de 70 pessoas. Tivemos a palestra do Akita e uma minha sobre ActiveRecord. Um dos próximos eventos da comunidade Ruby/Rails será o Ruby e Rails no mundo real.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=592&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A aula aberta na Caelum foi bem legal, presença de cerca de 70 pessoas. </p>
<p>Tivemos a palestra do Akita<br />
<a href="http://www.slideshare.net/akitaonrails/caelum-dicas-web-2010"><img src="http://andersonleiteblog.files.wordpress.com/2010/04/picture-10.png?w=594" alt="" title="Picture 10"   class="alignnone size-full wp-image-599" /></a></p>
<p> e uma minha sobre ActiveRecord.<br />
<a href="http://www.slideshare.net/andersonleite/active-record"><img src="http://andersonleiteblog.files.wordpress.com/2010/04/picture-9.png?w=594" alt="" title="Picture 9"   class="alignnone size-full wp-image-598" /></a></p>
<p>Um dos próximos eventos da comunidade Ruby/Rails será o Ruby e Rails no mundo real.<br />
<a href="http://www.guru-sp.com/evento"><img src="http://andersonleiteblog.files.wordpress.com/2010/04/rubyrails_full1.gif?w=594" alt="" title="ruby+rails_full"   class="alignnone size-full wp-image-595" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/andersonleiteblog.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/andersonleiteblog.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/andersonleiteblog.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/andersonleiteblog.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/andersonleiteblog.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/andersonleiteblog.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/andersonleiteblog.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/andersonleiteblog.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/andersonleiteblog.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/andersonleiteblog.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/andersonleiteblog.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/andersonleiteblog.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/andersonleiteblog.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/andersonleiteblog.wordpress.com/592/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andersonleiteblog.wordpress.com&amp;blog=6565773&amp;post=592&amp;subd=andersonleiteblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://andersonleiteblog.wordpress.com/2010/04/16/aula-aberta-na-caelum-slides/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b583dd1f235705801e9ae89658fa7caf?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anderson_leite</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2010/04/picture-10.png" medium="image">
			<media:title type="html">Picture 10</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2010/04/picture-9.png" medium="image">
			<media:title type="html">Picture 9</media:title>
		</media:content>

		<media:content url="http://andersonleiteblog.files.wordpress.com/2010/04/rubyrails_full1.gif" medium="image">
			<media:title type="html">ruby+rails_full</media:title>
		</media:content>
	</item>
	</channel>
</rss>
