<?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>Blog de Helton Duarte</title>
	<atom:link href="http://heltonduarte.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://heltonduarte.com</link>
	<description>O seu espaço sobre programação</description>
	<lastBuildDate>Wed, 03 Mar 2010 13:43:56 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Small is Beautiful: The Design of Lua</title>
		<link>http://heltonduarte.com/2010/03/03/small-is-beautiful-the-design-of-lua/</link>
		<comments>http://heltonduarte.com/2010/03/03/small-is-beautiful-the-design-of-lua/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 13:24:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Linguagens de programação]]></category>
		<category><![CDATA[Lua]]></category>
		<category><![CDATA[PUC-RJ]]></category>
		<category><![CDATA[Roberto Ierusalimschy]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=350</guid>
		<description><![CDATA[Hoje venho falar de mais um evento ocorrido em Natal-RN, o qual teve como palestrante o prof. Dr. Roberto Ierusalimschy, da PUC-RJ, criador da linguagem de programação Lua, utilizada em diversos projetos pelo mundo. A palestra abordou temas como o que considerar na criação de uma linguagem de programação e aspectos técnicos de Lua, como seu sistema de números e as chamadas co-rotinas.]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal,</em></p>
<p>Hoje venho falar de mais um evento ocorrido em Natal-RN (em <strong>02/03/2010</strong>), no <strong>auditório da Biblioteca Zila Mamede</strong> (<a title="UFRN" href="http://www.ufrn.br" target="_blank">UFRN</a>), o qual teve como palestrante o <strong>prof. Dr. Roberto Ierusalimschy, </strong>da <a title="PUC-RJ" href="http://www.puc-rio.br/" target="_blank">PUC-RJ</a>, criador da <strong>linguagem de programação</strong> <a title="Lua Programming Language" href="http://www.lua.org" target="_blank">Lua</a>, utilizada em diversos projetos pelo mundo. A palestra abordou <strong>temas como o que considerar na criação de uma linguagem de programação</strong> e <strong>aspectos técnicos de Lua</strong>, como seu <em>sistema de números</em> e as chamadas <em>co-rotinas</em>. Em seguida, darei uma breve descrição do evento.</p>
<h3>O que escolher ao projetar uma linguagem</h3>
<p>Primeiramente, o professor Roberto definiu que <strong>não há uma linguagem ótima para tudo</strong>, pois na criação de qualquer uma é preciso escolher entre temas como <strong>Segurança vs. Flexibilidade</strong>, ao escolher tipagem estática ou dinâmica;<strong> Legibilidade vs. Concisão</strong>, no caso de haver diversos modos para realizar a mesma tarefa; e <strong>Desempenho vs. Abstração</strong>, principalmente em linguagens interpretadas. No entanto, o foco é <strong>Simplicidade vs. Quase todo o resto</strong>, ou seja, se você deseja criar uma linguagem bem simples, é preciso abdicar de muitas outras qualidades, já que <strong>muitos problemas podem ser resolvidos ao adicionar complexidade</strong>.</p>
<h3>Lua</h3>
<p>Em seguida, o docente da PUC-RJ explicou que um dos <strong>objetivos principais de Lua</strong>, se não o principal, é a <strong>simplicidade </strong>(<strong>&#8220;Tão simples quanto possível, mas não mais do que isso.&#8221;</strong>). Contudo, eles almejaram sempre algo com <strong>muitos usos e usuários</strong>, focando também em <strong>portabilidade</strong> e o termo <strong>&#8220;embedability&#8221;</strong>, criado pelo próprio Ierusalimschy para designar que <strong>pode ser incorporada a diversos outros projetos</strong>, como <strong>C/C++, Java, Fortran, C#, Perl, Ruby, Python, Ada</strong>, etc.</p>
<p><strong>Lua possui um tamanho extremamente pequeno</strong> se comparada com outras linguagens com o mesmo poder que ela, pois tem seu <strong>binário com menos do que 200KB</strong> e possui o núcleo da linguagem separado de <strong>diversas bibliotecas, sendo bem fácil removê-las e tornar um projeto ainda menor,</strong> sendo possível rodar em quase tudo o que já se ouviu falar. O professor Roberto deu algumas <strong>características fundamentais da linguagem</strong>, como: <strong>sintaxe convencional</strong>; <strong>sintaticamente parecida com Scheme</strong>; <strong>escopo estático</strong>; <strong>tipagem dinâmica</strong>; <strong>procedimentos são objetos e argumentos são passados por valor</strong> (as alterações no valor dos parâmetros não são feitos na própria variável passada, mas em uma cópia dela); <strong>modelo de aritmética do IEEE 754</strong>.</p>
<h3>Design</h3>
<p>Nesse ponto da palestra <strong>a discussão começou a ser mais técnica</strong>, abordando aspectos do projeto da linguagem <a title="Lua Programming Language" href="http://www.lua.org" target="_blank">Lua</a>, como seu <strong>sistema numérico</strong>, as <strong>tabelas</strong>, as <strong>co-rotinas</strong> e o <strong>casamento de padrões</strong> (também conhecido por expressões regulares, mas de forma equivocada, segundo o professor Roberto Ierusalimschy).</p>
<p>Os <strong>números</strong> em<a title="Lua Programming Language" href="http://www.lua.org" target="_blank"> Lua </a>são tratados em um <strong>único tipo numérico</strong>, o que possibilita<strong> regras claras e bem documentadas</strong>, <strong>evitanto regras de conversão</strong> entre tipos e possuindo uma <strong>implementação simples em C</strong>, contudo há uma enorme <strong>lentidão quando o hardware não suporta ponto flutuante </strong>e é <strong>difícil lidar com operações bit-a-bit</strong>, pois não se sabe quantos bits exatamente estão sendo usados para representar o número.</p>
<p>As <strong>tabelas são arrays associativos</strong>, ou seja, <strong>permitem qualquer valor como chave</strong>, e é a <strong>única estrutura de dados em Lua</strong>, podendo implementar <strong>tanto módulos (math.sin(3)) quanto objetos</strong>, no entanto <strong>não há controle de acesso</strong> com as palavras reservadas <em>private, protected, etc.</em>, sendo necessário convencionar entre os próprios programadores essa permissão. <strong>Outro problema é a determinação de tamanho de sequências</strong> utilizando tabelas, pois <strong>índices nil são tratados como inexistentes</strong>, gerando inconsistência em situações como (1, 2, nil, 4) <strong>[Quantos elementos há nessa sequência?]</strong>.</p>
<p>A <strong>co-rotina </strong>é uma funcionalidade de <a title="Lua Programming Language" href="http://www.lua.org" target="_blank">Lua </a>pouco presente em outras linguagens (<strong>parecida com as continuações de Scheme, mas com implementação e semântica mais simples</strong>) e podem ser chamadas em qualquer ponto do programa e controladas em qualquer nível de função (no caso de recursividade). Para entender melhor esse conceito e os outros, é recomendado que se veja a <a title="Lua Programming Language - Manual 5.1" href="http://www.lua.org/manual/5.1/" target="_blank">documentação da linguagem</a>.</p>
<p>Também foi abordado o <strong>casamento de padrões, funcionalidade não muito completa na linguagem</strong>, possuindo uma <strong>biblioteca padrão pequena </strong>e sendo desenvolvida a <strong>biblioteca LPEG, ainda não-padrão,</strong> com muitas alternativas, todavia ainda muito grande para ser incorporada a <a title="Lua Programming Language" href="http://www.lua.org" target="_blank">Lua</a> (~ 2200 linhas de código).</p>
<h3>Conclusão</h3>
<p>Por fim, pôde-se perceber que <strong>o projeto de qualquer linguagem envolve conflitos de objetivos </strong>e, dessa forma, é preciso ter bem definido na mente do criador quais são suas prioridades, porque, como o professor Roberto também frizou, <strong>é mais fácil fazer algo novo em uma linguagem do que tirar</strong>.</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Não é apenas o emprego dos sonhos" href="http://heltonduarte.com/2010/02/06/nao-e-apenas-o-emprego-dos-sonhos/" target="_self">Não é apenas o emprego dos sonhos</a></li>
<li><a title="Segmentation Fault - a memória do PC pede ajuda!" href="http://heltonduarte.com/2010/01/27/segmentation-fault-a-memoria-do-pc-pede-ajuda/" target="_self">Segmentation Fault &#8211; a memória do PC pede ajuda!</a></li>
<li><a title="Google Docs para Estudantes" href="http://heltonduarte.com/2009/10/10/google-docs-para-estudantes/" target="_self">Google Docs para estudantes</a></li>
<li><a title="Minhas 10 coisas favoritas sobre Ruby" href="http://heltonduarte.com/2009/09/12/minhas-10-coisas-favoritas-sobre-ruby/" target="_self">Minhas 10 coisas favoritas sobre Ruby</a></li>
</ul>
<p><em>E você, o que achou da palestra sobre a criação da linguagem Lua? Alguma dúvida? <strong>Comente</strong> e vamos discutir o assunto!</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Porque vale mais um dia nos teus átrios do que, em outra parte, mil. Preferiria estar à porta da Casa do meu Deus, a habitar nas tendas da impiedade.&#8221;</em> <strong>Salmos 84.10</strong></p>
<p><em>&#8220;Porque o SENHOR Deus é um sol e escudo; o SENHOR dará graça e glória; não negará bem algum aos que andam na retidão.&#8221;</em> <strong>Salmos 84.11</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2010/03/03/small-is-beautiful-the-design-of-lua/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Não é apenas o emprego dos sonhos</title>
		<link>http://heltonduarte.com/2010/02/06/nao-e-apenas-o-emprego-dos-sonhos/</link>
		<comments>http://heltonduarte.com/2010/02/06/nao-e-apenas-o-emprego-dos-sonhos/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 03:20:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Reflexões]]></category>
		<category><![CDATA[Dia Livre]]></category>
		<category><![CDATA[Electronic Arts]]></category>
		<category><![CDATA[Emprego]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Globo.com]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Lionhead Studios]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Yahoo!]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=346</guid>
		<description><![CDATA[Hoje venho dar dicas bem importantes, principalmente para aqueles que sempre sonharam em trabalhar numa grande empresa, porém pensam que nunca passará de um sonho. Tenho só uma coisa a dizer: pode virar realidade, mas você vai ter que ralar! Primeiramente, tive a ideia do post por causa do Dia Livre 10.01, que aconteceu no IFRN, com a palestra de Daniel Rocha sobre a vida de um Googler (aquele que trabalha no Google), além do mais, também tenho um exemplo próximo de sucesso em grandes empresas. Aproveitando o espaço, dia 19/02/2010, no IFRN, haverá o Dia Livre 10.02, com o Leonardo Martins mostrando como é sua vida no portal Globo.com]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal,</em></p>
<p>Hoje venho dar dicas bem importantes, principalmente para aqueles que sempre sonharam em <strong>trabalhar numa grande empresa</strong>, porém pensam que nunca passará de um sonho. Tenho só uma coisa a dizer: <strong>pode virar realidade, mas você vai ter que ralar!</strong> Primeiramente, tive a ideia do post por causa do <a title="Dia Livre 10.01" href="http://rn.softwarelivre.org/dialivre/10.01/" target="_blank">Dia Livre 10.01</a>, que aconteceu no <a title="IFRN" href="http://www.ifrn.edu.br" target="_blank">IFRN</a>, com a palestra de <a title="Daniel Rocha - Twitter" href="http://twitter.com/danielrocha" target="_blank">Daniel Rocha</a> sobre a vida de um <strong>Googler (aquele que trabalha no Google)</strong>, além do mais, também tenho um exemplo próximo de sucesso em grandes empresas. Aproveitando o espaço, dia <strong>19/02/2010</strong>, no <a title="IFRN" href="http://www.ifrn.edu.br" target="_blank">IFRN</a>, haverá o <a title="Dia Livre 10.02" href="http://rn.softwarelivre.org/dialivre/10.02/" target="_blank">Dia Livre 10.02</a>, com o <strong>Leonardo Martins</strong> mostrando como é sua vida no portal <a title="Globo.com" href="http://www.globo.com" target="_blank">Globo.com</a></p>
<p>Primeiramente, <strong>como o próprio Daniel disse</strong> em sua palestra: <strong>estude!</strong> Não deixe nada passar desapercebido, afinal, <strong>todo conhecimento lhe trará algo importante</strong>. Aquela<strong> matemática </strong>que você tanto criticava? É pré-requisito para o cargo de <a title="Gameplay Engineer - EA" href="https://jobs.ea.com/jobs/jobposting.aspx?postid=a0z50000000INqpAAG" target="_blank">Gameplay Engineer</a> da<a title="Electronic Arts" href="http://www.ea.com" target="_blank"> Electronic Arts</a>. Aqueles infindáveis <strong>protocolos de redes</strong> que lhe tiravam do sério? É pré-requisito para <a title="Software Engineer - Yahoo!" href="http://careers.yahoo.com/jdescription.php?frm=jsres&amp;oid=21720" target="_blank">Software Engineer</a> no <a title="Yahoo!" href="http://www.yahoo.com" target="_blank">Yahoo!</a>. E o curso de <strong>Ciência da Computação</strong> que seu amigo faz, mas você sempre disse a ele que <strong>é melhor ser auto-didata?</strong> É obrigatório em praticamente todos os empregos no <a title="Google" href="http://www.google.com" target="_blank">Google</a>, <a title="Microsoft" href="http://www.microsoft.com" target="_blank">Microsoft</a>, <a title="Facebook" href="http://www.facebook.com" target="_blank">Facebook</a>, etc. Não estou dizendo que todas essas características são<strong> indispensáveis a qualquer programador</strong>, mas, pelo menos, para aqueles que querem tentar <strong>uma vaga nessas multinacionais americanas</strong>.</p>
<h3><a title="Google Jobs" href="http://www.google.com.br/jobs" target="_blank">Google Jobs</a></h3>
<h4>Vaga: <a title="Google - Software Engineer" href="http://www.google.com.br/support/jobs/bin/answer.py?answer=32267" target="_blank">Software Engineer</a></h4>
<p>Tenha um conhecimento avançado(íssimo) em <strong>algoritmos e estruturas de dados</strong>, principalmente nas linguagens<strong> C++ e Java</strong> (um ótimo treinamento para isso são as <strong>competições de programação</strong> pelo mundo afora e seus sites relacionados, como o <a title="USACO Training Program" href="http://ace.delos.com/usacogate" target="_blank">USACO Training Program</a>, <a title="TopCoder" href="http://www.topcoder.com/" target="_blank">TopCoder</a> e <a title="UVa Online Judge" href="http://uva.onlinejudge.org/" target="_blank">UVa Online Judge</a>). Conhecimentos em <strong>Python ou JavaScript/Ajax</strong> também são importantes, assim como a essencial <strong>fluência em inglês</strong>.</p>
<h3><a title="Microsoft Careers" href="http://careers.microsoft.com" target="_blank">Microsoft Careers</a></h3>
<h4>Vaga: <a title="Microsoft - Software Engineer" href="https://careers.microsoft.com/JobDetails.aspx?ss=&amp;pg=0&amp;so=&amp;rw=1&amp;jid=11790&amp;jlang=EN" target="_blank">Software Engineer: Development</a></h4>
<p>Habilidade na <strong>resolução de problemas</strong> e, pelo menos, <strong>3 anos de experiência em C++ e/ou linguagens de script</strong> (novamente a dica das <strong>competições</strong>, pessoal!), com <strong>mestrado ou doutorado</strong> nas áreas de <strong>computação ou matemática</strong>. Fluência em<strong> inglês</strong> (como em todos!). Além de paixão por <strong>qualidade de software</strong> e desenvolvimento.</p>
<h3><a title="Yahoo Careers" href="http://careers.yahoo.com" target="_blank">Yahoo Careers</a></h3>
<h4>Vaga: <a title="Senior Web Developer" href="http://careers.yahoo.com/jdescription.php?frm=jsres&amp;oid=23483" target="_blank">Senior Web Developer</a></h4>
<p>Como é uma vaga para <strong>Web Developer</strong>, esse foi o único que vi e <strong>não pedia conhecimentos avançados em C++</strong>, no entanto você precisa saber bem de <strong>HTML/CSS/JavaScript/Ajax</strong>, além de conhecer o <strong>Unix/BSD</strong> e o servidor <strong>Apache</strong>. Dessa forma, é exigido o <strong>conhecimento em PHP e SQL</strong>, com conhecimentos de <strong>orientação a objetos e bancos de dados relacionais.</strong> E <strong>inglês fluente</strong> para não perder o costume.</p>
<h3><a title="Facebook Carrers" href="http://www.facebook.com/careers/" target="_blank">Facebook Carrers</a></h3>
<h4>Vaga: <a title="Software Engineer, Data" href="http://www.facebook.com/careers/department.php?dept=engineering" target="_blank">Software Engineer, Data</a></h4>
<p>Grande experiência em <strong>trabalho com quantidades gigantescas de dados</strong>, alto conhecimento em <strong>C++, Java ou *nix </strong>(também conhecido com Unix-like, é como nos referimos a SOs que são parecidos com o Unix, by <a title="Twitter - Adorilson" href="http://twitter.com/adorilson" target="_blank">@adorilson</a>), além de habilidade com <strong>sistemas de arquivos, arquiteturas de servidores e sistemas distribuídos</strong>. Algo interessante no <strong>Facebook</strong> foi a versatilidade em requerer um funcionário com <strong>conhecimentos em PHP, Python ou Ruby</strong>. <strong>Inglês </strong>fluente!</p>
<h3><a title="Electronic Arts Jobs" href="https://jobs.ea.com/jobs/viewjobs.aspx" target="_blank">Electronic Arts Jobs</a></h3>
<h4>Vaga: <a title="Gameplay Engineer - EA" href="https://jobs.ea.com/jobs/jobposting.aspx?postid=a0z50000000INqpAAG" target="_blank">Gameplay Engineer</a></h4>
<p>Possuir um <strong>Bacharelado em Ciência da Computação ou Matemática</strong> (ou algo parecido) e, como adicional, um <strong>mestrado ou doutorado</strong>, além de demonstrar <strong>experiência com desenvolvimento de jogos</strong>, com <strong>habilidades em C++ e LUA/Python</strong> (vão participar de <strong>competições</strong>, que resolve &#8220;todo&#8221; o seu problema). Deve ter<strong> pelo menos um jogo lançado oficialmente</strong> (difícil para iniciantes) e, como extra, experiência em<strong> arquitetura ou implementação de Inteligência Artificial </strong>em um personagem.</p>
<h3><a title="Lionhead Studion Jobs" href="http://www.lionhead.com/Jobs.aspx" target="_blank">Lionhead Studion Jobs</a></h3>
<h4>Vaga: <a title="Standard Gameplay Programmer - Lionhead" href="http://www.lionhead.com/Jobs.aspx#9" target="_blank">Standard Gameplay Programmer</a></h4>
<p>Deve ter pelo me<strong>nos dois anos de experiência em projetos de bom nível</strong><strong> com C++, com experiência em </strong>algum jogo lançado e com <strong>desenvolvimento para XBox 360 (não obrigatório).</strong> Conhecimentos <strong>avançados em C++</strong>, habilidade com<strong> Lua</strong> e conhecimentos de <strong>Otimização de Código</strong> são bem cotados para a vaga, portanto treinar para <strong>qualquer competição de programação seria uma passo a mais </strong>na sua jornada!</p>
<p>Esses são somente alguns exemplos de <strong>grandes empresas esperando por grandes profissionais</strong>. Como já foi falado para mim, gostaria que vocês ficassem com isso em mente: <strong>participar dessas competições é sim uma marca significativa em seu currículo</strong> e &#8220;garantem&#8221; sua habilidade em programação, por isso muitas dessas <strong>empresas estão sempre &#8220;pescando&#8221; os competidores</strong> assim que os eventos terminam (<a title="Google Code Jam" href="http://code.google.com/codejam/" target="_blank">Google Code Jam</a> é um exemplo bem dado para isso).</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Segmentation Fault - a memória do PC pede ajuda!" href="http://heltonduarte.com/2010/01/27/segmentation-fault-a-memoria-do-pc-pede-ajuda/" target="_self">Segmentation Fault &#8211; a memória do PC pede ajuda!</a></li>
<li><a title="Treinando para a OAH 2009" href="http://heltonduarte.com/2009/09/25/treinando-para-a-oah-2009/" target="_self">Treinando para a OAH 2009</a></li>
<li><a title="Google Code Jam 2009: uma nova oportunidade" href="http://heltonduarte.com/2009/08/17/google-code-jam-2009-uma-nova-oportunidade/" target="_self">Google Code Jam 2009: uma nova oportunidade</a></li>
<li><a title="XNA - A fábrica de jogos da Microsoft" href="http://heltonduarte.com/2009/06/12/xna-a-fabrica-de-jogos-da-microsoft/" target="_self">XNA &#8211; A fábrica de jogos da Microsoft</a></li>
</ul>
<p><em>E aí, qual das empresas você prefere trabalhar? Diga sua opinião e <strong>comente</strong> sobre o que achou das ofertas!</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;A ti, ó Deus, glorificamos, a ti damos louvor, pois o teu nome está perto, as tuas maravilhas o declaram.&#8221; </em><strong>Salmos 75.1</strong></p>
<p><em>&#8220;Tu és o Deus que fazes maravilhas; tu fizeste notória a tua força entre os povos.&#8221;</em> <strong>Salmos 77.14</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2010/02/06/nao-e-apenas-o-emprego-dos-sonhos/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Segmentation Fault &#8211; a memória do PC pede ajuda!</title>
		<link>http://heltonduarte.com/2010/01/27/segmentation-fault-a-memoria-do-pc-pede-ajuda/</link>
		<comments>http://heltonduarte.com/2010/01/27/segmentation-fault-a-memoria-do-pc-pede-ajuda/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 15:26:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Treinamento OBI/IOI]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[erro]]></category>
		<category><![CDATA[segmentation fault]]></category>
		<category><![CDATA[USACO Training Program]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=344</guid>
		<description><![CDATA[Explicação sobre "Segmentation Fault", assim como as causas mais prováveis de gerar esse tipo de erro. Ajuda para a OBI / IOI com mais uma dica para você!]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal,</em></p>
<p>Venho treinando nos últimos dias com o foco na <a title="OBI 2010" href="http://olimpiada.ic.unicamp.br" target="_blank">OBI 2010</a> e, quem sabe, na <a title="IOI 2010" href="http://www.ioi2010.org" target="_blank">IOI 2010</a> (se Deus quiser!), no site de treinamento da equipe dos Estados Unidos, mais conhecido como <a title="USACO Training Program" href="http://ace.delos.com/usacogate" target="_blank">USACO Training Program</a> e percebi que é uma <strong>fonte impressionante de treinamento para competições de programação</strong>, especialmente as citadas acima. Durante algumas resoluções de problemas me deparei com um erro chamado <strong>&#8220;Segmentation Fault&#8221;</strong> quando eu tentava executar o programa e resolvi pesquisar a respeito para esclarecer melhor na minha mente e poder passar a todos, já que não é um erro tão raro de ocorrer em programas.</p>
<p>Quando se tem um <strong>irmão expert em C++</strong> e amante de competições de programação assim como eu tenho, é bem mais fácil tirar as dúvidas, portanto segue a explicação (adaptada) que <strong>Herbert Duarte</strong> deu para esse problema.</p>
<p><strong>Segfault</strong>, como também é conhecido, ocorre quando um programa está tentando <strong>acessar uma área de memória protegida</strong>, ou seja, que não faz parte de seu endereçamento (espaço da memória revervado pelo Sistema Operacional para cada um dos programas que estão sendo executados), ou quando <strong>tenta acessar um local de forma inapropriada</strong>, como por exemplo, tentando escrever em um espaço que é de somente-leitura. As <strong>causas mais comuns</strong> para esse tipo de erro são as seguintes:</p>
<ul>
<li><strong>Ponteiros não inicializados ou com valores inválidos</strong>, pois quando o programa tenta acessá-lo provavelmente irá cair em algum lugar aleatório da memória que o programa não tem acesso;</li>
<li><strong>Acessar uma posição inválida de matrizes ou vetores</strong>, já que o programa irá calcular a posição como se ela existisse e provavelmente irá cair em um local sem acesso (ocorrendo frequentemente quando o programa calcula, em alguma situação, uma posição para ser acessada, porque, se houver qualquer erro nesse cálculo, a posição acessada será inválida);</li>
<li>Tentar alterar um caracter de uma string que foi inicializada como &#8220;Somente leitura&#8221;.</li>
</ul>
<p>Bem, dessa forma, espero que cuidem melhor de seus programas para não caírem nesse mesmo erro, lembrando apenas que <strong>Segmentation Fault não é um erro de compilação de código</strong>, mas um erro de execução de programa.</p>
<p><strong>Fonte para auxílio:</strong> <a title="Segmentation Fault - Wikipedia" href="http://en.wikipedia.org/wiki/Segmentation_fault" target="_blank">Segmentation Fault &#8211; Wikipedia</a></p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Treinando para a OAH 2009" href="http://heltonduarte.com/2009/09/25/treinando-para-a-oah-2009/" target="_self">Treinando para a OAH 2009</a></li>
<li><a title="Google Code Jam 2009: uma nova oportunidade" href="http://heltonduarte.com/2009/08/17/google-code-jam-2009-uma-nova-oportunidade/" target="_self">Google Code Jam 2009: uma nova oportunidade</a></li>
<li><a title="Categoria: Programando Melhor" href="http://heltonduarte.com/category/cursos/programando-melhor/" target="_self">Categoria: Programando Melhor</a></li>
</ul>
<p><em>Mais algum erro está perturbando vocês? <strong>Comente</strong> e nos conte que procuraremos sempre ajudá-lo!</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Eu, porém, estou aflito e necessitado; apressa-te por mim, ó Deus; tu és o meu auxílio e o meu libertador; SENHOR, não te detenhas.&#8221;</em> <strong>Salmos 70.5</strong></p>
<p><em>&#8220;Por ti tenho sido sustentado desde o ventre; tu és aquele que me tiraste do ventre de minha mãe; o meu louvor será para ti constantemente.&#8221; </em><strong>Salmos 71.6</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2010/01/27/segmentation-fault-a-memoria-do-pc-pede-ajuda/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Novidades no blog e missão nova</title>
		<link>http://heltonduarte.com/2010/01/23/novidades-no-blog-e-missao-nova/</link>
		<comments>http://heltonduarte.com/2010/01/23/novidades-no-blog-e-missao-nova/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 22:10:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Notícias / Novidades]]></category>
		<category><![CDATA[missão do blog]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=342</guid>
		<description><![CDATA[Apresentar a nova missão do blog e as novidades apresentadas, para que o leitor comente sobre o que achou das mudanças.]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal,</em></p>
<p>Estamos distantes nos últimos tempos, devido à falta de tempo por estar concluindo o curso de <strong>Técnico de Nível Médio Integrado em Informática pelo IFRN Campus Natal/Central</strong>, contudo estou voltando à ativa hoje, modificando a organização das categorias do blog e redefinindo a sua missão, ou seja, o próposito ao qual ele se propõe.</p>
<h3 style="text-align: left;">Missão do blog</h3>
<p style="text-align: left;">Trazer aos leitores um treinamento para competições de programação, dando um embasamento tanto na área de algoritmos e estruturas de dados, quanto na matemática.</p>
<p style="text-align: left;">Atualizar os leitores em relação às novidades da área de informática, especialmente de programação, além de informar sobre os principais eventos, trazendo sempre a avaliação e resumo dos presenciados pelo autor.</p>
<p style="text-align: left;">Realizar recomendações de leituras, tanto com resenhas de livros e revistas, quanto com indicações de outros blogs, e também disponibilizar reflexões para os leitores.</p>
<p style="text-align: left;"><strong>OBS:</strong> Essa informação também pode ser acessada na área de <a title="Sobre" href="http://heltonduarte.com/about" target="_self">Sobre</a> do <a title="Blog de Helton Duarte" href="http://heltonduarte.com" target="_self">Blog</a>.</p>
<p style="text-align: left;">Espero que apreciem as nossas mudanças para tornar o blog mais atrativo e, em breve, traremos novidades para todos.</p>
<p style="text-align: left;"><em>O que você achou das mudanças? <strong>Comente</strong> sobre o assunto e peça novidades.</em></p>
<p style="text-align: left;"><strong>Helton de Melo Duarte</strong></p>
<p style="text-align: left;"><em>&#8220;A justiça do sincero endireitará o seu caminho, mas o ímpio, pela sua impiedade, cairá. A justiça dos virtuosos os livrará, mas, na sua perversidade, serão apanhados os iníquos.&#8221;</em> <strong>Provérbios 11.5-6</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2010/01/23/novidades-no-blog-e-missao-nova/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google Docs para estudantes</title>
		<link>http://heltonduarte.com/2009/10/10/google-docs-para-estudantes/</link>
		<comments>http://heltonduarte.com/2009/10/10/google-docs-para-estudantes/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 16:37:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Aplicativos / Tecnologias]]></category>
		<category><![CDATA[compartilhamento]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Docs]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=301</guid>
		<description><![CDATA[Tradução de dicas para a utilização do Google Docs, além de um vídeo a respeito. Não perca!
Se você está trabalhando em um projeto de disciplina ou algo mais divertido, economize tempo e colabore em documentos, planilhas e apresentações.]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal</em>,</p>
<p>Gostaria de desculpar-me pelo tempo inativo aqui no blog, justificando que estou em meu ano de vestibular e, por isso, tempo não é algo comum em minha vida recente. =( Hoje venho fazer novamente a<strong> tradução </strong>de um documento para apresentar a vocês o <a title="Google Docs" href="http://docs.google.com" target="_blank">Google Docs</a>, ferramenta para <strong>criação, edição e compartilhamento</strong> de <strong>documentos, planilhas e apresentações</strong>. (<em>Link do original</em>: <a title="Google Docs for Students" href="http://www.google.com/google-d-s/college/#utm_campaign=docsb2s&amp;utm_source=en-na-us-studentblog-docsb2s&amp;utm_medium=blog" target="_blank">Google Docs for Students</a>)</p>
<h3>Seu prazo está perto. Seu colega está longe.</h3>
<p>Se você está trabalhando em um projeto de disciplina ou algo mais divertido, economize tempo e colabore em documentos, planilhas e apresentações.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="560" height="340" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/A7y7NafWXeM&amp;hl=en&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="560" height="340" src="http://www.youtube.com/v/A7y7NafWXeM&amp;hl=en&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><strong>Editem o mesmo documento</strong>, com amigos, colegas de turma ou professores.</p>
<p><strong>Acesse seus documentos em qualquer lugar e a qualquer hora</strong>, desse modo eles não irão embora juntamente com seu disco rígido.</p>
<p><strong>Crie facilmente documentos para sua escola ou jogos</strong> e organize-os em um local sem bagunça.</p>
<h3>Dicas e truques usando o Google Docs</h3>
<ol>
<li><strong>Não começe do zero</strong> &#8211; Confira nossa galeria de templates para assistentes, assistentes de professores e líderes estudantis.</li>
<li><strong>Diga não para anexos de e-mail</strong> &#8211; Use o histórico de revisões para olhar qualquer versão anterior de seus documentos.</li>
<li><strong>Anotações das ideias para os projetos em grupo</strong> &#8211; Com a gravação dos pensamentos de todos em um só local, nenhuma boa ideia será deixada para trás.</li>
<li><strong>Precisa de pesquisas para as aulas?</strong> &#8211; Envie um formulário para suas listas de e-mail e consiga uma planilha organizada das respostas instataneamente.</li>
<li><strong>Olhe os guias para iniciantes</strong> &#8211; Crie seus primeiros documentos facilmente com guias para <a title="Getting Started - Documents" href="http://docs.google.com/support/bin/static.py?hl=en&amp;page=guide.cs&amp;guide=21008" target="_blank">documentos</a>,<a title="Getting Started - Spreadsheets" href="http://docs.google.com/support/bin/static.py?hl=en&amp;page=guide.cs&amp;guide=20322" target="_blank"> planilhas</a> e <a title="Getting Started - Presentations" href="http://docs.google.com/support/bin/static.py?hl=en&amp;page=guide.cs&amp;guide=19431" target="_blank">apresentações</a>.</li>
<li><strong>Confira os manuais avançados </strong>- Explore as entradas e saídas de <a title="Advanced Google Documents Tips and Tricks" href="http://docs.google.com/View?id=dzq234z_3gmq84nc5" target="_blank">documentos</a>, <a title="Advanced Google Spreadsheets Tips and Tricks" href="http://docs.google.com/View?id=dzq234z_4fsjtzbfq" target="_blank">planilhas</a> e <a title="Advanced Google Presentations Tips and Tricks" href="http://docs.google.com/View?id=dzq234z_2fc7d9qdv" target="_blank">apresentações</a>.</li>
<li><strong>Use formulários para seu grupo de estudantes</strong> &#8211; Colete respostas, organize seu orçamento ou participe de reuniões colaborativas.</li>
<li><strong>Faça guias colaborativas de estudo</strong> &#8211; Convide qualquer um para o mesmo documento do Google e coloque em suas anotações de aula.</li>
<li><strong>Planejamento de viagens</strong> &#8211; Deixe qualquer um contribuir para seu itinerário em um documento, complete seu orçamento em uma planilha, etc.</li>
<li><strong>Converse enquanto trabalha</strong> &#8211; Chats são feitos dentro de planilhas do Google, tornando fácil discutir com os outros as mudanças que você está fazendo.</li>
<li><strong>Faça listas pessoais sobre o que falta fazer</strong> &#8211; Com poucos cliques em sua caixa de entrada, fique certo de que nenhuma atividade importante foi deixada sem fazer.</li>
<li><strong>Experimente as funções da planilha</strong> &#8211; Reúna estatísticas como a classificação de uma equipe ou o PIB de um país com o <a title="GoogleLookup" href="http://docs.google.com/support/bin/answer.py?hl=en&amp;answer=54199" target="_blank">GoogleLookup</a>.</li>
</ol>
<p>Bem, as dicas para utilização do <a title="Google Docs" href="http://docs.google.com" target="_blank">Google Docs</a> foram dadas, então <strong>comece a experimentar</strong>!</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Getting Real e mais sobre a 37signals" href="http://heltonduarte.com/2009/08/21/getting-real-e-mais-sobre-a-37signals/" target="_self">Getting Real e mais sobre a 37signals</a></li>
<li><a title="Google Chrome OS - Como será?" href="http://heltonduarte.com/2009/07/24/google-chrome-os-como-sera/" target="_self">Google Chrome OS &#8211; Como será?</a></li>
<li><a title="Computação em nuvem: Evolução?" href="http://heltonduarte.com/2009/05/14/computacao-em-nuvem-evolucao/" target="_self">Computação em nuvem: Evolução?</a></li>
<li><a title="Computadores de mão: Smartphones" href="http://heltonduarte.com/2009/02/18/computadores-de-mao-smartphones/" target="_blank">Computadores de mão: Smartphones</a></li>
</ul>
<p><em>E aí, o que achou do Google Docs?</em> <em><strong>Comente</strong> sobre sua experiência com essa ferramenta!</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Cantai a Deus, cantai louvores ao seu nome; louvai aquele que vai sobre os céus, pois o seu nome é JEOVÁ; exultai diante dele.&#8221;</em> <strong>Salmos 68.4</strong></p>
<p><em>&#8220;O nosso Deus é o Deus da salvação; e a JEOVÁ, o SENHOR, pertencem as saídas para escapar da morte.&#8221;</em> Salmos 68.20</p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/10/10/google-docs-para-estudantes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Treinando para a OAH 2009</title>
		<link>http://heltonduarte.com/2009/09/25/treinando-para-a-oah-2009/</link>
		<comments>http://heltonduarte.com/2009/09/25/treinando-para-a-oah-2009/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 20:57:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Cursos / Dicas / Tutoriais]]></category>
		<category><![CDATA[Algoritmo]]></category>
		<category><![CDATA[Hostnet]]></category>
		<category><![CDATA[OAH]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[UVa Online Judge]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=299</guid>
		<description><![CDATA[Bem, pessoal, como alguns já devem saber, próxima sexta-feira acontece em todo o Brasil a primeira fase da III Olimpíada de Algoritmo Hostnet e estarei participando mais um ano, em busca do bicampeonato =D. A fim de treinarmos para essa competição, resolvi fazer esse post, dando umas dicas e um exercício, como exemplo, para vocês tentarem fazer.]]></description>
			<content:encoded><![CDATA[<p>Estamos aqui de novo!</p>
<p>Bem, pessoal, como alguns já devem saber, próxima sexta-feira acontece em todo o Brasil a <strong>primeira fase</strong> da <a title="III Olimpíada de Algoritmo Hostnet" href="http://www.oah.com.br" target="_blank">III Olimpíada de Algoritmo Hostnet</a> e estarei participando mais um ano, em busca do bicampeonato =D. A fim de treinarmos para essa competição, resolvi fazer esse post, dando umas <strong>dicas e um exercício</strong>, como exemplo, para vocês tentarem fazer. <strong>OBS:</strong> <em>Quem quiser saber se resolveu corretamente, faça um comentário dizendo isso que entrarei em contato por e-mail, ok?</em></p>
<h2>Dicas</h2>
<p>Tirando como base as <a title="Maratona de Programação - Dicas" href="http://maratona.ime.usp.br/dicas08.html" target="_blank">dicas do site da Maratona de Programação</a> e o <a title="Common Mistakes in Online and Real-time Contests" href="http://www.acm.org/crossroads/xrds7-5/contests.html" target="_blank">artigo do Shariar Manzoor na revista Crossroads</a>, pensei em umas dicas básicas:</p>
<ul>
<li>Não há nada pior do que gastar muito tempo fazendo e passando a limpo um     algoritmo para, depois, descobrir que ele está errado. Na OAH, esse     erro é fatal, já que o tempo é sempre um grande adversário. Por isso, apesar de a pressa ser necessária, procure sempre     certificar-se da corretude do algoritmo ANTES de escrevê-lo!</li>
<li>A escolha de seu time é essencial. Um bom time de programação precisa que cada componente tenha um conhecimento de algoritmos básicos (ordenação, encontrar n-ésimo número primo, calcular MDC/MMC, etc.), além da capacidade de criar novos para situações diversas.</li>
<li>Ao treinar, certifique-se de que cada membro do time sabe fazer o básico, como escrever procedimentos e fazer &#8220;debug&#8221; de um algoritmo. Um time bem-sucedido terá membros com algumas especialidades, como aquele que resolve problemas com busca, ou aquele bom em matemática, ou aquele que encontra erros facilmente. Todos os membros devem saber as qualidades e defeitos dos outros para saber quem ficará responsável por cada questão.</li>
<li>Todos devem estar aptos para realizar <a title="Obie Fernandez: 10 Reasons Pair Programming Is Not For the Masses" href="http://blog.obiefernandez.com/content/2009/09/10-reasons-pair-programming-is-not-for-the-masses.html" target="_blank">Pair-Programming</a>, ou seja, resolver uma das questões juntamente com outro membro, principalmente as mais difíceis. Não aconselho que fiquem os 3 membros pensando sobre o mesmo problema, a não ser em casos extremos.</li>
<li>Faça treinos de simulação, pois é a melhor forma de fazer a prova em um bom tempo. Treinar nas mesmas condições da competição é uma ótima dica, ou seja, fazer uma prova passada com o tempo cronometrado e depois pedir para um professor da instituição corrigí-la.</li>
<li>Faça muitas questões daqui para sexta-feira!</li>
</ul>
<h2>Exercício</h2>
<h3><strong>Coleta de Lixo Ecológica</strong> (traduzido e adaptado de <a title="UVa - Ecological Bin Packing" href="http://online-judge.uva.es/p/v1/102.html" target="_blank">&#8220;Ecological Bin Packing&#8221;, do UVa Online Judge</a>)</h3>
<p><strong>O Problema</strong></p>
<p>Reciclar vidro requer que ele seja separado por cor em uma das três categorias: vidro marrom, vidro verde e vidro transparente. Nesse problema você terá 3 latas de lixo, cada uma contendo um número específico de garrafas marrom, verde e transparente. No intuito de serem recicladas, as garrafas terão de ser movidas a fim de cada lata de lixo conter apenas garrafas de uma cor.</p>
<p>O problema é minimizar o número de garrafas que serão movidas. Você deve assumir que o único problema é minimizar o número de movimentos entre os cestos de lixo. Para a proposta desse problema, cada lixo tem a capacidade de armazenar infinitas garrafas e a única restrição é movê-las para cada cesto conter garrafas de uma única cor.</p>
<p><strong>A Entrada</strong></p>
<p>A entrada que seu programa irá ler consiste em uma linha contendo nove inteiros. Os primeiros três inteiros representam o número de garrafas marrons, verdes e transparentes (respectivamente) na lata 1, os segundos três inteiros representam o número de garrafas marrons, verdes e transparentes (respectivamente) na lata 2, os últimos três inteiros representam o número de garrafas marrons, verdes e transparentes (respectivamente) na lata 3. Por exemplo, a linha 10 15 20 30 12 8 15 8 31, indica que há 20 garrafas transparentes na lata 1, 12 garrafas verdes na lata 2 e 15 marrons na lata 3.</p>
<p><strong>A Saída</strong></p>
<p>A saída indicará as garrafas de que cores que estarão em cada lata para minimizar o número de movimentos. Você também deve escrever o número mínimo de movimentos com as garrafas para que isso ocorra.</p>
<p>O programa deverá escrever uma string com três letras maiúsculas &#8216;M&#8217;, &#8216;V&#8217; e &#8216;T&#8217; (representando as cores marrom, verde e transparente) representando a cor associada a cada lata de lixo.</p>
<p>O primeiro caracter representa a cor relacionada com a primeira lata, o segundo caracter representa a cor relacionada com a segunda lata e o terceiro caracter representa a cor relacionada com a terceira lata. Além disso, o inteiro representando o menor número de movimentos a serem feitos deverá vir seguido da string, separados com um espaço.</p>
<p>Se mais de uma ordem de latas marrom, verde e transparente produzir o número mínimo de movimentos, então a string que vier primeiro alfabeticamente deverá ser escrita.</p>
<p><strong>Exemplo de Entrada 1</strong></p>
<p>1 2 3 4 5 6 7 8 9</p>
<p><strong>Exemplo de Saída 1</strong></p>
<p>MTV 30</p>
<p><strong>Exemplo de Entrada 2</strong></p>
<p>5 10 5 20 10 5 10 20 10</p>
<p><strong>Exemplo de Saída 2</strong></p>
<p>TMV 50</p>
<p>Com isso, <strong>nossas dicas para a OAH 2009</strong> estão dadas, então eu desejo a todos os competidores, desde já, <strong>boa sorte</strong>! Mostrem a todos que vocês são capazes, mas não esqueçam, Deus é o único responsável por qualquer conquista sua.</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Categoria: Cursos - Programando Melhor" href="http://heltonduarte.com/category/cursos/programando-melhor/" target="_self">Categoria: Cursos &#8211; Programando Melhor</a></li>
<li><a title="Google Code Jam 2009: uma nova oportunidade" href="http://heltonduarte.com/2009/08/17/google-code-jam-2009-uma-nova-oportunidade/" target="_self">Google Code Jam 2009: uma nova oportunidade</a></li>
<li><a title="Top Coder Marathon Matches" href="http://heltonduarte.com/2009/01/14/top-coder-marathon-matches/" target="_self">Top Coder Marathon Matches</a></li>
<li><a title="OAH 2008" href="http://heltonduarte.com/2008/11/24/oah-2008/" target="_self">OAH 2008</a></li>
</ul>
<p><em>Vamos lá, treine bem para mais essa competição! <strong>Comente </strong>e diga qual colégio estará representando, além do mais, tire qualquer dúvida!</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;O justo se alegrará no SENHOR e confiará nEle; e todos os retos de coração se regozijarão.&#8221;</em> <strong>Salmos 64.10</strong></p>
<p><em>&#8220;Bendito seja Deus, que não rejeitou a minha oração, nem desviou de mim a sua misericórdia.&#8221;</em> <strong>Salmos 66.20</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/09/25/treinando-para-a-oah-2009/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Minhas 10 coisas favoritas sobre Ruby</title>
		<link>http://heltonduarte.com/2009/09/12/minhas-10-coisas-favoritas-sobre-ruby/</link>
		<comments>http://heltonduarte.com/2009/09/12/minhas-10-coisas-favoritas-sobre-ruby/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 03:11:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[yehuda katz]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=293</guid>
		<description><![CDATA[Primeiro guest post do blog, ou seja, esse post não foi escrito por mim, eu apenas traduzi o post do Yehuda Katz sobre "My 10 Favorite Things About the Ruby Language" com a revisão textual de Elomar França. ]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal,</em></p>
<p>Hoje será um pouco diferente, pois o texto não foi escrito por mim e sim pelo <a title="Yehuda Katz - Twitter" href="http://twitter.com/wycats" target="_blank">@wycats</a> <strong>(Yehuda Katz)</strong> do blog <a title="Katz Got Your Tongue?" href="http://yehudakatz.com" target="_blank">&#8220;Katz Got Your Tongue?&#8221;</a>. Ele é um membro da equipe do <a href="http://www.rubyonrails.org/">Ruby on Rails</a> e desenvolvedor líder do projeto <a href="http://www.merbivore.com/">Merb</a>.           Ele é um membro do time principal do <a href="http://www.jquery.com/">jQuery</a> e um grande contribuidor para o <a href="http://www.datamapper.org/doku.php">DataMapper</a>.          Ele <strong>contribui para muitos projetos de código aberto</strong>, como <a href="http://rubini.us/">Rubinius</a> e <a href="http://github.com/jbarnette/johnson">Johnson</a>, e trabalha em alguns que ele mesmo criou, como <a href="http://github.com/wycats/thor">Thor</a>. <strong>Yehuda</strong> gentilmente concedeu que eu traduzisse seu post e o colocasse no blog e, além dele, tive também a ajuda do grande <a title="Elomar - Twitter" href="http://twitter.com/elomar" target="_blank">@elomar</a>, que fez a <strong>revisão completa</strong> da tradução com seus ajustes essenciais. <strong>Então, aí vai o post! (Link do original: </strong><a title="My 10 Favorite Things About the Ruby Language" href="http://yehudakatz.com/2009/08/24/my-10-favorite-things-about-the-ruby-language/" target="_blank">My 10 Favorite Things About the Ruby Language</a>)</p>
<p><strong>OBS: Infelizmente, o código disposto aqui não está sendo tabulado corretamente, tornando difícil sua visualização. Peço desculpas a todos por isso e, assim que possível, corrigirei o problema.<br />
</strong></p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">&#8220;Eu trabalho com Ruby todos os dias e ao longo do tempo comecei a realmente gostar de usá-lo. Aqui está uma lista de algumas coisas específicas que eu realmente gosto em Ruby. Algumas delas são óbvias e algumas também existem em outras linguagens. A proposta é compartilhar coisas que eu gosto em Ruby, não para comparar e competir com alguma linguagem específica.</p>
<h3>1. Tipagem Dinâmica</h3>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">Existem coisas muito boas sobre linguagens de tipagem estática, como verificação em tempo de compilação e suporte a IDE. No entanto, na minha experiência, tipagem dinâmica realmente ajuda a conseguir projetos concisos e limpos durante as mudanças, especialmente nos estágios inicial e mediano deles.</p>
<p style="margin-bottom: 0in;">Eu estou muito feliz que eu não preciso criar uma interface formal para meus novos objetos implementarem, simplesmente para me possibilitar trocar facilmente as classes por outras, no futuro.</p>
<h3 style="margin-bottom: 0in;">2. Duck Typing</h3>
<p style="margin-bottom: 0in;"><em>(nota: como é um termo técnico, não há tradução que seja interessante colocar)</em></p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">Isso é efetivamente só uma extensão de Tipagem Dinâmica. Em <strong>Ruby</strong>, métodos que esperam ser aptos a operar objetos String não checam se é uma String (<strong>is_a?(String)</strong>). Eles checam se o objeto responde a mensagem to_str (<strong>respond_to?(:to_str)</strong>) e então chamam o to_str naquele objeto se ele permitir. Similarmente, objetos que representam Paths em Ruby podem implementar um método to_path para proporcionar uma representação de path.</p>
<p style="margin-bottom: 0in;">Em Rails, nós usamos essa técnica para objetos que tem características de &#8220;model&#8221; ao esperar deles o <strong>respond_to?(:to_model)</strong>. Isso permite-nos suportar qualquer objeto em contextos relevantes, se aqueles objetos puderem nos fornecer uma representação &#8220;model&#8221; deles.</p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<h3 style="margin-bottom: 0in;">3. Módulos Incríveis</h3>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;"><strong>Ruby</strong> fornece um benefício similar ao &#8220;traits&#8221; em Scala, Squeak e Perl. Efetivamente, os módulos de Ruby permitem a adição dinâmica de novos elementos da hierarquia de classe em tempo de execução. O uso de super é dinamicamente avaliado em tempo de execução para considerar qualquer módulo que possa ter sido acrescentado, tornando fácil extender funcionalidade em uma superclass quantas vezes você desejar, sem ser forçado a decidir onde super estará ao declarar sua classe.</p>
<p style="margin-bottom: 0in;">Além disso, os módulos de Ruby fornecem os eventos <strong>append_features</strong> e <strong>included</strong>, que tornam possível usar módulos robustamente para isolar extensões uma da outra e para dinamicamente extender classes na base da característica de inclusão.</p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<h3 style="margin-bottom: 0in;">4. Corpos de classes não são especiais</h3>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">Em Ruby, corpos de classes são tem um contexto especial. Eles são simplesmente um contexto onde self aponta para o objeto da classe. Se você já usou Rails, você provavelmente viu um código como esse:</p>
<p style="margin-bottom: 0in;">class Comment &lt; ActiveRecord::Base</p>
<p style="margin-bottom: 0in;">validates_presence_of :post_id</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">Pode parecer que <strong>validates_presence_of</strong> é uma característica da linguagem, mas na verdade é um método sendo chamado em Comment que é fornecido por <strong>ActiveRecord::Base</strong>.</p>
<p style="margin-bottom: 0in;">Esse método pode executar um código arbitrário, também no contexto da classe, incluindo criar novos métodos, executar outras partes de código ou atualizar a variável de instância da classe. Ao contrário das &#8220;Java annotations&#8221;, que devem ser executadas em tempo de compilação, <strong>corpos de classes em Ruby</strong> podem pegar informações em tempo de execução para considerar, como opções fornecidas dinamicamente ou os resultados da avaliação de outro código.</p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<h3 style="margin-bottom: 0in;">5. String Eval</h3>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">Eu não estou me referindo a &#8220;String eval&#8221; arbitrários em tempo de execução, mas a String eval que são usados para criar métodos no processo de boot de uma <strong>aplicação Ruby</strong>.</p>
<p style="margin-bottom: 0in;">Isso torna possível pegar estruturas definidas pelo Ruby, como Rails routes ou AOP-definitions, e compilá-las em métodos Ruby. Claro, é possível implementar essas coisas como complementos para outras linguagens, todavia Ruby torna possível implementar esse tipo de coisa em Ruby puro. É, numa visão ampla, uma linguagem <strong>&#8220;self-hosting&#8221; (que compila seu próprio código fonte)</strong>.</p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<h3 style="margin-bottom: 0in;">6. Blocos e &#8220;Lambdas&#8221;</h3>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">Eu já disse isso algumas vezes e repetirei: eu não considero linguagens sem &#8220;lambdas&#8221; anônimos poderosas o bastante para meu usuo diário. Essas construções são, na verdade, extremamente comuns e encontradas em linguagens como <strong>Ruby</strong>, JavaScript, Scala, Clojure e Lisp.</p>
<p style="margin-bottom: 0in;">Eles tornam possível implementar construções de <strong>escopo de bloco</strong> que parecem características da linguagem. O exemplo mais comum é o de operações com arquivos. Em linguagens sem &#8220;lambdas&#8221;, usuários são forçados a utilizar um bloco no mesmo escopo que ele abriu o arquivo para assegurar que ele está fechado.</p>
<p style="margin-bottom: 0in;">Em Java:</p>
<p style="margin-bottom: 0in;">static void run(String in)</p>
<p style="margin-bottom: 0in;">throws FileNotFoundException {</p>
<p style="margin-bottom: 0in;">File input = new File(in);</p>
<p style="margin-bottom: 0in;">String line; Scanner reader = null;</p>
<p style="margin-bottom: 0in;">try {</p>
<p style="margin-bottom: 0in;">reader = new Scanner(input);</p>
<p style="margin-bottom: 0in;">while(reader.hasNextLine()) {</p>
<p style="margin-bottom: 0in;">System.out.println(reader.nextLine());</p>
<p style="margin-bottom: 0in;">}</p>
<p style="margin-bottom: 0in;">} finally { reader.close(); }</p>
<p style="margin-bottom: 0in;">}</p>
<p style="margin-bottom: 0in;">Entre outras coisas, o Java precisa colocar a criação do Scanner em um bloco TRY para garantir que será fechado. Em contraste, a <strong>versão Ruby</strong>:</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">def run(input)</p>
<p style="margin-bottom: 0in;">File.open(input, &#8220;r&#8221;) do |f|</p>
<p style="margin-bottom: 0in;">f.each_line {|line| puts line }</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Por causa da existência de blocos, é possível abstrair a necessidade de fechar o arquivo em um único local, minimizando erros do programador e reduzindo duplicação.</p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<h3 style="margin-bottom: 0in;">7. Ataque Combo: Linguagem que se &#8220;auto-compila&#8221;</h3>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">A combinação de diversas das características acima produz exemplos reais de formas que podemos “extender” o Ruby em Rails. Considere o seguinte:</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">respond_to do |format|</p>
<p style="margin-bottom: 0in;">if @user.save</p>
<p style="margin-bottom: 0in;">flash[:notice] = &#8216;User was successfully created.&#8217;</p>
<p style="margin-bottom: 0in;">format.html { redirect_to(@user) }</p>
<p style="margin-bottom: 0in;">format.xml { render <img src='http://heltonduarte.com/wp-includes/images/smilies/icon_mad.gif' alt=':x' class='wp-smiley' /> ml =&gt; @user, :status =&gt;ted, :location =&gt; @user }</p>
<p style="margin-bottom: 0in;">else</p>
<p style="margin-bottom: 0in;">format.html { render :action =&gt; &#8220;new&#8221; }</p>
<p style="margin-bottom: 0in;">format.xml { render <img src='http://heltonduarte.com/wp-includes/images/smilies/icon_mad.gif' alt=':x' class='wp-smiley' /> ml =&gt; @user.errors, :status =&gt; :unprocessable_entity }</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Nesse caso, nós estamos aptos a misturar métodos (<strong>respond_to</strong>) com código Ruby (<strong>if e else</strong>) para produzir um novo escopo de bloco. A semântica do Ruby para blocos permite-nos retornar ou executar blocos<span style="font-family: Nimbus Roman No9 L;"><span style="font-size: small;"> </span></span>de dentro deles, mas misturando mais as fronteiras de blocos de código e construções como if ou while.</p>
<p style="margin-bottom: 0in;">Em Rails 3, nós introduzimos:</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">class PeopleController &lt; ApplicationController</p>
<p style="margin-bottom: 0in;">respond_to :html, <img src='http://heltonduarte.com/wp-includes/images/smilies/icon_mad.gif' alt=':x' class='wp-smiley' /> ml, :json</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">def index</p>
<p style="margin-bottom: 0in;">@people = Person.find(:all)</p>
<p style="margin-bottom: 0in;">respond_with(@people)</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Aqui, <strong>respond_to</strong> é fornecido em um nível de classe. Isso diz ao Rails que <strong>respond_with (índice)</strong> deve aceitar HTML, XML ou JSON como formatos. Se o usuário solicitar um formato diferente, é automaticamente retornado um erro 406 (não aceito).</p>
<p style="margin-bottom: 0in;">Se você for um pouco mais profundo, você pode ver que o método respond_to é definido como:</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">def respond_to(*mimes)</p>
<p style="margin-bottom: 0in;">options = mimes.extract_options!</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">only_actions   = Array(options.delete(:only))</p>
<p style="margin-bottom: 0in;">except_actions = Array(options.delete(:except))</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">mimes.each do |mime|</p>
<p style="margin-bottom: 0in;">mime = mime.to_sym</p>
<p style="margin-bottom: 0in;">mimes_for_respond_to[mime]          = {}</p>
<p style="margin-bottom: 0in;">mimes_for_respond_to[mime][:only]   = only_actions   unless only_actions.empty?</p>
<p style="margin-bottom: 0in;">mimes_for_respond_to[mime][:except] = except_actions unless except_actions.empty?</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Esse método é definido no módulo <strong>ActionController::MimeResponds::ClassMethods</strong>, que é colocado no <strong>ActionController::Base</strong>. Além disso, <strong>mimes_for_respond_to</strong> é definido usando <strong>class_inheritable_reader</strong>. O método do <strong>class_inheritable_reader (macro?)</strong> usa <strong>class_eval</strong> para adicionar métodos numa classe em questão para emular a funcionalidade attr_accessor.</p>
<p style="margin-bottom: 0in;">Entender todos os detalhes não é importante. O que é importante é que usando as características do Ruby descritas acima, é possível criar camadas de abstração que podem aparecer para adicionar funcionalidades na linguagem.</p>
<p style="margin-bottom: 0in;">Um desenvolvedor olhando para o <strong>ActionController::MimeResponds</strong> não precisa entender como <strong>class_inheritable_reader</strong> trabalha &#8211; ele só precisa entender a função básica. E um desenvolvedor olhando para a documentação da API não precisa entender como o <strong>respond_to</strong> a nível de classe é implementado &#8211; ele só precisa entender a funcionalidade fornecida. Dito isso, descamando cada camada leva a simplificar as abstrações que controem outras abstrações. Não há necessidade de descamar tudo de uma vez só.</p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<h3 style="margin-bottom: 0in;">8. Bons Literais</h3>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;"><em><span style="font-size: small;">(nota: literais são tipo valores básicos, que você pode criar sem chamar um método .new)</span></em></p>
<p style="margin-bottom: 0in;">Eu geralmente esqueço isso quando programo em <strong>Ruby</strong>, somente para reclamar quando uso uma linguagem com menos e pouco expressivos literais.</p>
<p style="margin-bottom: 0in;"><strong>Ruby</strong> tem literais para quase tudo:</p>
<ul>
<li>Strings: single-line (uma linha), double-line (duas linhas), interpolated (interpolado)</li>
<li>Números: binary, octal, decimal, hex</li>
<li>Null: nil</li>
<li>Boolean: true (verdadeiro), false (falso)</li>
<li>Vetores: [1,2], %w(cada palavra é um elemento)</li>
<li>Dicionários: {chave =&gt; valor} e no Ruby 1.9 {chave: valor}</li>
<li>Expressões regulares: /hello/, %r{hello/path}, %r{hello#{interpolated}}</li>
<li>Símbolos: :name e :&#8221;string qualquer&#8221;</li>
<li>Bloco: {bloco literal}</li>
</ul>
<p style="margin-bottom: 0in;">E eu penso que estou perdendo algo. Enquanto isso pode parecer acadêmico, bom, legível, literais podem <strong>aumentar a habilidade do programador</strong> de escrever um código curto, mas extremamente expressivo. É claramente possível conseguir as mesmas coisas que você pode com um Dicionário &#8220;literal&#8221; ao instanciar um novo objeto Dicionário e colocar as chaves e valores um por vez, mas isso reduz a capacidade deles como parâmetros de algum método, por exemplo.</p>
<p style="margin-bottom: 0in;">A concisão de um Dicionário &#8220;literal&#8221; permitiu os <strong>programadores de Ruby</strong> a efetivamente adicionar um recurso de argumentos limitados por palavras-chave à linguagem sem precisar da aprovação dos criadores dela. Ainda é outro pequeno exemplo de auto-compilação.</p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<h3 style="margin-bottom: 0in;">9. Tudo é um Objeto e Todo Código é Executado e tem um Self</h3>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">Eu mostrei isso um pouco atrás, mas muito da razão dos corpos das Classes trabalharem como eles trabalham é uma consequência da <strong>infalível orientação a objeto da linguagem Ruby</strong>. Dentro do corpo de uma classe, Ruby é simplesmente executado com um self apontando para a classe. Além disso, nada é especial no contexto da classe; é possível avaliar o código de um contexto de classe de qualquer localidade. Veja:</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">module Util</p>
<p style="margin-bottom: 0in;">def self.evaluate(klass)</p>
<p style="margin-bottom: 0in;">klass.class_eval do</p>
<p style="margin-bottom: 0in;">def hello</p>
<p style="margin-bottom: 0in;">puts &#8220;#{self} says Hello!&#8221;</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">class PersonName &lt; String</p>
<p style="margin-bottom: 0in;">Util.evaluate(self)</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Isso é exatamente equivalente a:</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">class PersonName &lt; String</p>
<p style="margin-bottom: 0in;">def hello</p>
<p style="margin-bottom: 0in;">puts &#8220;#{self} says Hello!&#8221;</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Ao remover as fontreiras artificiais entre código em diferentes locais, <strong>Ruby reduz a sobrecarga conceitual</strong> de criar abstrações. E isso é o resultado de um forte e consistente modelo de objeto.</p>
<p style="margin-bottom: 0in;"><em>Mais um exemplo nesse tópico</em>. Essa expressão é muito comum em Ruby: <strong>possivelmente_nulo &amp;&amp; possivelmente_nulo.nome_do_metodo</strong>. Já que <strong>nil</strong> é somente um objeto em Ruby, mandar mensagens a ele que não serão entendidas resultará em um <strong>NoMethodError</strong>. Alguns desenvolvedores recomendam a seguinte sintaxe: <strong>possivelmente_nulo.try(:nome_do_metodo)</strong>. Isso pode ser implementado em Ruby como a seguir:</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">class Object</p>
<p style="margin-bottom: 0in;">alias_method :try, :__send__</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">class NilClass</p>
<p style="margin-bottom: 0in;">def try</p>
<p style="margin-bottom: 0in;">nil</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Essencialmente, isso adiciona o método<strong> try</strong> a qualquer Object. Quando o Object é <strong>nil</strong>, <strong>try</strong> simplesmente retorna nil. Quando o Object não é <strong>nil</strong>, <strong>try</strong> simplesmente chama o método em questão.</p>
<p style="margin-bottom: 0in;">Usando <strong>aplicações segmentadas </strong>das classes abertas de <strong>Ruby</strong>, combinado com o fato que tudo em Ruby, incluindo<strong> nil</strong>, é um objeto, nós estamos aptos a criar um novo recurso de Ruby. Novamente, isso não é grande coisa, mas é outro caso no qual as escolhas certas na linguagem podem permitir que nós criemos abstrações muito úteis.</p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<h3 style="margin-bottom: 0in;">10. Rack</h3>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">Eu irei trapacear um pouco porque <strong>Rack não faz parte da linguagem Ruby, mas ele </strong><strong>demonstra algumas coisas úteis sobre a linguagem. Primeiramente, a biblioteca </strong>Rack só chegou ao 1.0 no começo desse ano e já todo framework web de Ruby suporta Rack. Se você usa um framework Ruby, você pode ser garantido que ele usa Rack e qualquer &#8220;Rack middleware&#8221; padrão irá funcionar.</p>
<p style="margin-bottom: 0in;">Isso foi tudo feito sem qualquer sacrifício de compatibilidade anterior, um tributo à flexibilidade da linguagem Ruby.</p>
<p style="margin-bottom: 0in;">Rack também traz recursos do Ruby para fazer seu trabalho. A API Rack parece com isso:</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Rack::Builder.new do</p>
<p style="margin-bottom: 0in;">use Some::Middleware, param</p>
<p style="margin-bottom: 0in;">use Some::Other::Middleware</p>
<p style="margin-bottom: 0in;">run Application</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Nesse breve trecho de código, muitas coisas estão trabalhando. Primeiro, um bloco é passado para <strong>Rack::Builder</strong>. Segundo, esse bloco é avaliado no contexto de uma nova instância de <strong>Rack::Builder</strong>, o que dá acesso a usar e rodar os métodos. Terceiro, o parâmetro passado para usar e rodar é uma classe &#8220;literal&#8221;, que em Ruby é um simples objeto. Isso permite Rack chamar <strong>passed_in_middleware.new(app, param)</strong>, em que new é somente uma chamada de método no objeto da classe <strong>Some::Middleware</strong>.</p>
<p style="margin-bottom: 0in;">E no caso de você pensar que implementar o código seria hediondo, aqui está:</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">class Rack::Builder</p>
<p style="margin-bottom: 0in;">def initialize(&amp;block)</p>
<p style="margin-bottom: 0in;">@ins = []</p>
<p style="margin-bottom: 0in;">instance_eval(&amp;block) if block_given?</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">def use(middleware, *args, &amp;block)</p>
<p style="margin-bottom: 0in;">@ins &lt;&lt; lambda { |app| middleware.new(app, *args, &amp;block) }</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">def run(app)</p>
<p style="margin-bottom: 0in;">@ins &lt;&lt; app #lambda { |nothing| app }</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Isso é todo o necessário para implementar o código que eu mostrei acima que <strong>cria uma nova aplicação Rack</strong>. Instanciando o middleware é uma simples questão:</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">def to_app</p>
<p style="margin-bottom: 0in;">inner_app = @ins.last</p>
<p style="margin-bottom: 0in;">@ins[0...-1].reverse_each { |app| inner_app = app.call(inner_app) }</p>
<p style="margin-bottom: 0in;">inner_app</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">def call(env)</p>
<p style="margin-bottom: 0in;">to_app.call(env)</p>
<p style="margin-bottom: 0in;">end</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Primeiro, nós pegamos o último elemento, que é nosso ponto final. Nós, então, iteramos os elementos restantes com reverse, instanciando cada middleware com o próximo elemento da cadeia e retornando o objeto resultante.</p>
<p style="margin-bottom: 0in;">Finalmente, nós definimos uma chamada de método no Construtor, que é requerida pelo Rack especificamente, que chama to_app e passa o ambiente por ele, retirando a cadeia.</p>
<p style="margin-bottom: 0in;">Através do uso de um bom número de técnicas descritas no post, nós estamos aptos a criar uma aplicação compatível com Rack que suporta o &#8220;Rack middleware&#8221; em menos que duas dúzias de linhas de código.&#8221;</p>
<p style="margin-bottom: 0in;"><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Manifesto ágil" href="http://heltonduarte.com/2009/08/28/manifesto-agil/" target="_self">Manifesto ágil</a></li>
<li><a title="Getting Real e mais sobre a 37signals" href="http://heltonduarte.com/2009/08/21/getting-real-e-mais-sobre-a-37signals/" target="_blank">Getting Real e mais sobre a 37signals</a></li>
<li><a title="Aprenda Ruby on Rails com os experts no assunto" href="http://heltonduarte.com/2009/07/31/aprenda-ruby-on-rails-com-os-experts-no-assunto/" target="_self">Aprenda Ruby on Rails com os experts no assunto</a></li>
<li><a title="Ruby on Rails, a nova sensação da Web" href="http://heltonduarte.com/2008/11/29/ruby-on-rails-a-nova-sensacao-da-web/" target="_self">Ruby on Rails, a nova sensação da Web</a></li>
</ul>
<p style="margin-bottom: 0in;"><em>Vamos lá, conte-nos o que achou desse nosso primeiro Guest Post! Já está com todo o gás para entrar no Ruby? Comente e pergunte!</em></p>
<p style="margin-bottom: 0in;"><strong>Helton de Melo Duarte</strong></p>
<p style="margin-bottom: 0in;"><em>&#8220;Em Deus está a minha salvação e a minha glória; a rocha da minha fortaleza e o meu refúgio estão em Deus.&#8221;</em> Salmos 62.7</p>
<p style="margin-bottom: 0in;"><em>&#8220;Ouve, ó Deus, a minha voz na minha oração; livra a minha vida do horror do inimigo.&#8221; </em><strong>Salmos 64.1</strong></p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/09/12/minhas-10-coisas-favoritas-sobre-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manifesto ágil</title>
		<link>http://heltonduarte.com/2009/08/28/manifesto-agil/</link>
		<comments>http://heltonduarte.com/2009/08/28/manifesto-agil/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 18:49:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Desenvolvimento ágil]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[manifesto ágil]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=289</guid>
		<description><![CDATA[Olá pessoal, hoje venho mostrá-los algo que já está na comunidade de informática a algum tempo, contudo está ganhando forças a cada dia e mostrando-se muito eficaz: desenvolvimento ágil de software. Chega de milhões de diagramas das aulas de engenharia de software (eu sei que tem um propósito, mas é muita burocracia!), vou traduzir o Agile Manifesto, publicado em 2001 por grandes nomes da área.]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal,</em></p>
<p>Hoje venho mostrá-los algo que já está na comunidade de informática a algum tempo, contudo está ganhando forças a cada dia e mostrando-se muito eficaz: <strong>desenvolvimento ágil de software</strong>. Chega de milhões de diagramas das aulas de <em>engenharia de software</em> (eu sei que tem um propósito, mas é muita burocracia!), vou traduzir abaixo o <a title="Agile Manifesto" href="http://www.agilemanifesto.org" target="_blank">Agile Manifesto</a>, publicado em <strong>2001</strong> por grandes nomes da área.</p>
<p>&#8220;Nós estamos descobrindo melnhores maneiras de desenvolver software ao fazer isso e ajudando outros a fazer. Por esse trabalho, nós começamos a <strong>valorizar</strong>:</p>
<ul>
<li><strong>Indivíduos e interações</strong>, ao invés de processos e ferramentas;</li>
<li><strong>Software funcional</strong>, ao invés de documentação compreensiva;</li>
<li><strong>Colaboração do cliente</strong>, ao invés de negociação de contrato;</li>
<li><strong>Resposta a mudanças</strong>, ao invés de seguir um plano.</li>
</ul>
<p>É isso, enquanto há algum valor nos itens à direita, nós valorizamos mais os itens à esquerda.</p>
<h3>Princípios por trás do Manifesto Ágil</h3>
<p>Nós seguimos esses princípios:</p>
<ul>
<li>Nossa maior prioridade é satisfazer o cliente através de entregas rápidas e contínuas de software usual.</li>
<li>Seja bem-vindo à mudança de requisitos, mesmo que tarde no desenvolvimento. Processos ágeis aproveitam a mudança para a vantagem competitiva do cliente.</li>
<li>Entregar software utilizável frequentemente, de algumas semanas a alguns meses, com preferência a menores escalas de tempo.</li>
<li>Executivos e desenvolvedores devem trabalhar juntos diariamente durante o projeto.</li>
<li>Construa projetos em torno de indivíduos motivados. Dê-lhes o ambiente e a ajuda que eles precisam e confie neles para ter o trabalho concluído.</li>
<li>O método mais eficiente e eficaz de transmitir informações para uma equipe de desenvolvimento e dentro dela é conversa face-a-face.</li>
<li>Software funcional é a medida primordial do progresso.</li>
<li>Processos ágeis promovem desenvolvimento sustentável. Os patrocinadores, desenvolvedores e usuários deveriam ser aptos a manter um ritmo constante indefinidamente.</li>
<li>Atenção contínua à excelência técnica e bom design aumenta a agilidade.</li>
<li>Simplicidade &#8211; a arte de maximizar a quantidade de trabalho não feito &#8211; é essencial.</li>
<li>As melhores arquiteturas, requisitos e design surgem de um time auto-organizado.</li>
<li>Em intervalos regulares, o time reflete em como tornar-se mais eficiente, então sintoniza e ajusta seu comportamento.&#8221;</li>
</ul>
<p>Se você quiser saber mais sobre o assunto, sugiro que dê uma olhada na<a title="Agile Manifesto - History" href="http://www.agilemanifesto.org/history.html" target="_blank"> história de criação do Manifesto</a> e <a title="Agile Manifesto - Authors" href="http://www.agilemanifesto.org/authors.html" target="_blank">sobre os autores</a>, para ter uma visão mais legal. Além do mais, você pode demonstrar que realmente apóia o assunto e <a title="Agile Manifesto - Signatory" href="http://www.agilemanifesto.org/sign/signup.cgi" target="_blank">assinar o manifesto</a>.</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Getting Real e mais sobre a 37signals" href="http://heltonduarte.com/2009/08/21/getting-real-e-mais-sobre-a-37signals/" target="_self">Getting Real e mais sobre a 37signals</a></li>
<li><a title="Aprenda Ruby on Rails com os experts no assunto" href="http://heltonduarte.com/2009/07/31/aprenda-ruby-on-rails-com-os-experts-no-assunto/" target="_self">Aprenda Ruby on Rails com os experts no assunto</a></li>
<li><a title="Ruby on Rails, a nova sensação da Web" href="http://heltonduarte.com/2008/11/29/ruby-on-rails-a-nova-sensacao-da-web/" target="_self">Ruby on Rails, a nova sensação da Web</a></li>
</ul>
<p><em>E aí, o que achou do desenvolvimento ágil? Conte suas experiências com técnicas como eXtreme Programming ou Scrum, pois depois haverá posts sobre eles. <strong>Comente!</strong></em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Livra-me, meu Deus, dos meus inimigos; defende-me daqueles que se levantam contra mim.&#8221;</em> <strong>Salmos 59.1</strong></p>
<p><em>&#8220;A ti, ó fortaleza minha, cantarei louvores, porque Deus é a minha defesa, é o Deus da minha misericórdia.&#8221;</em> <strong>Salmos 59.17</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/08/28/manifesto-agil/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Getting Real e mais sobre a 37signals</title>
		<link>http://heltonduarte.com/2009/08/21/getting-real-e-mais-sobre-a-37signals/</link>
		<comments>http://heltonduarte.com/2009/08/21/getting-real-e-mais-sobre-a-37signals/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 18:53:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Recomendações]]></category>
		<category><![CDATA[37signals]]></category>
		<category><![CDATA[Getting Real]]></category>
		<category><![CDATA[Rework]]></category>
		<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=260</guid>
		<description><![CDATA[Olá pessoal, hoje venho falar sobre um livro muito bom e extremamente recomendado a quem é da área de informática (ainda não o li por completo, mas já li diversas partes): Getting Real, da 37Signals (criadores do framework Ruby On Rails). Na verdade, venho divulgar ainda mais o trabalho da empresa que mudou o modo de pensar no desenvolvimento para a internet.]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal,</em></p>
<p>Hoje venho falar sobre um <strong>livro</strong> muito bom e <strong>extremamente recomendado</strong> a quem é da <strong>área de informática</strong> (ainda não o li por completo, mas já li diversas partes): <a title="Getting Real: Português" href="http://gettingreal.37signals.com/GR_por.php" target="_blank">Getting Real</a>, da <a title="37signals" href="http://37signals.com" target="_blank">37Signals</a> (criadores do framework <a title="Ruby On Rails" href="http://rubyonrails.org" target="_blank">Ruby On Rails</a>). Na verdade, venho <strong>divulgar</strong> ainda mais o trabalho da <a title="37signals" href="http://37signals.com" target="_blank">empresa que mudou o modo de pensar no desenvolvimento para a internet</a>.</p>
<h3>37signals</h3>
<p><img class="alignleft size-full wp-image-261" title="37signals" src="http://heltonduarte.com/wp-content/uploads/2009/08/37signals-logo.jpg" alt="37signals" width="207" height="59" />Empresa sediada em <strong>Chicago, EUA</strong>, com um objetivo claro: <strong>fazer as coisas mais simples</strong>. Atualmente, são 14 pessoas que desenvolvem aplicações na web com foco em <a title="37signals: Clientes" href="http://37signals.com/customers" target="_blank">grupos pequenos</a>, seja uma pequena empresa, seja um departamento de uma multinacional. Os principais executivos da empresa são <a title="Twitter Jason Fried" href="http://twitter.com/jasonfried" target="_blank">Jason Fried</a> e <a title="Twitter DHH" href="http://twitter.com/dhh" target="_blank">David Heinemeier Hansson</a>, do blog <a title="Loud Thinking" href="http://www.loudthinking.com/" target="_blank">Loud Thinking</a> (e criador oficial do <strong>Rails</strong>).</p>
<h3>Getting Real</h3>
<p><img class="alignright size-medium wp-image-262" title="Getting Real" src="http://heltonduarte.com/wp-content/uploads/2009/08/GettingReal-300x199.jpg" alt="Getting Real" width="300" height="199" />Esse livro mostra as <strong>filosofias de negócio, design, programação e marketing</strong> da <a title="37signals" href="http://37signals.com" target="_blank">37signals</a>, responsável por 5 aplicações de extremo sucesso na web: <strong>Basecamp, Campfire, Backpack, Writeboard, Ta-da List</strong>. Qualquer um que trabalha em <strong>aplicações web</strong> &#8211; <em>empresários, designers, programadores, executivos ou &#8220;marketeiros&#8221;</em> &#8211; irão encontrar valor e inspiração nesse livro, sub-titulado de<strong> &#8220;O modo mais inteligente, rápido e fácil de criar um aplicação web de sucesso&#8221;</strong>.</p>
<p>Para acompanhar a evolução do <a title="Software livre" href="http://pt.wikipedia.org/wiki/Software_livre" target="_blank">software livre</a>, de <a title="Código aberto" href="http://pt.wikipedia.org/wiki/C%C3%B3digo_aberto" target="_blank">código aberto</a>, presenciado em todo o mundo, o livro <a title="Getting Real" href="http://gettingreal.37signals.com/" target="_blank">Getting Real</a> está disponibilizado <a title="Getting Real: Inglês" href="http://gettingreal.37signals.com/toc.php" target="_blank">gratuitamente</a> na web, com diversas <a title="Getting Real: Português" href="http://gettingreal.37signals.com/GR_por.php" target="_blank">traduções</a>.</p>
<h3>Rework</h3>
<p><img class="alignleft size-medium wp-image-265" title="Rework" src="http://heltonduarte.com/wp-content/uploads/2009/08/rework-cover-front-big2-197x300.png" alt="Rework" width="197" height="300" />Hoje, foi oficialmente revelada a criação de <strong>mais um livro pela empresa</strong>, o <a title="Rework: Unveiling the cover" href="http://37signals.com/svn/posts/1864-rework-unveiling-the-cover" target="_blank">Rework</a>, o qual estará disponível para <strong>venda no dia 9 de março de 2010</strong>, todavia já pode ser <a title="Rework: Pré-venda Amazon.com" href="http://www.amazon.com/Rework-Jason-Fried/dp/0307463745" target="_blank">pré-vendido pela Amazon.com</a>. Segundo eles, tudo o que sabem sobre <strong>negócios</strong> estará nesse <strong>novo livro</strong>&#8230;só nos resta esperar! =D</p>
<h3>Mais&#8230;</h3>
<p>Outro livro deles é o <a title="Defensive Design for the Web" href="http://www.amazon.com/Defensive-Design-Web-improve-messages/dp/073571410X/ref=tag_gam_ptcn_edpp_url" target="_blank">Defensive Design for the Web: How to improve error messages, help, forms, and other crisis points</a>, que o <a title="@elomar" href="http://twitter.com/elomar" target="_blank">@elomar</a> me informou. Para mais informações, vejam os blogs da <a title="37signals" href="http://37signals.com" target="_blank">37signals</a>: <a title="Signal vs. Noise" href="http://37signals.com/svn" target="_blank">Signal vs. Noise</a> e <a title="Product Blog" href="http://productblog.37signals.com/" target="_blank">Product Blog</a>.</p>
<p><strong>OBS:</strong> Aproveitem a área para você dar suas <a title="HeltonDuarte.com - Sugestões" href="../sugestoes/" target="_self">sugestões</a> de assuntos e nos ajudem a criar um <strong>blog melhor</strong>.</p>
<p><strong>OBS 2: </strong>Foi feita uma alteração nas categorias do blog, organizando-as de uma melhor forma. Por favor, conte-nos o que achou dessa modificação.</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Aprenda Ruby on Rails com os experts no assunto" href="http://heltonduarte.com/2009/07/31/aprenda-ruby-on-rails-com-os-experts-no-assunto/" target="_self">Aprenda Ruby On Rails com os experts no assunto</a></li>
<li><a title="Google Chrome OS - Como será?" href="http://heltonduarte.com/2009/07/24/google-chrome-os-como-sera/" target="_self">Google Chrome OS &#8211; Como será?</a></li>
<li><a title="Computação em nuvem: Evolução?" href="http://heltonduarte.com/2009/05/14/computacao-em-nuvem-evolucao/" target="_blank">Computação em nuvem: Evolução?</a></li>
<li><a title="Ruby on Rails, a nova sensação da Web" href="http://heltonduarte.com/2008/11/29/ruby-on-rails-a-nova-sensacao-da-web/" target="_blank">Ruby on Rails, a nova sensação da Web</a></li>
</ul>
<p><em>Está doidinho para trabalhar na 37signals? Bem, como isso não é para qualquer um, pelo menos ajude a criar uma web melhor e dê suas dicas! <strong>Comente</strong> sobre o que achou do post!</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Deus é o nosso refúgio e fortaleza, socorro bem presente na angústia. Pelo que não temeremos, ainda que a terra se mude, e ainda que os montes se transportem para o meio dos mares.&#8221;</em><strong> Salmos 46.1,2</strong></p>
<p><em>&#8220;Tem misericórdia de mim, ó Deus, segundo a tua benignidade; apaga as minhas transgressões, segundo a multidão das tuas misericórdias.&#8221; </em><strong>Salmos 51.1</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/08/21/getting-real-e-mais-sobre-a-37signals/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Google Code Jam 2009: uma nova oportunidade</title>
		<link>http://heltonduarte.com/2009/08/17/google-code-jam-2009-uma-nova-oportunidade/</link>
		<comments>http://heltonduarte.com/2009/08/17/google-code-jam-2009-uma-nova-oportunidade/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 18:40:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Notícias / Novidades]]></category>
		<category><![CDATA[code jam]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Top Coder]]></category>
		<category><![CDATA[UVa Online Judge]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=257</guid>
		<description><![CDATA[Olá pessoal,
Venho avisá-los de outra competição de programação que está vindo por aí: Google Code Jam 2009! É mais uma competição em que podem participar profissionais e estudantes no intuito de construir algoritmos desafiantes e com um diferencial: permite que você programe na sua linguagem favorita com o ambiente de programação à sua escolha! =D
Saiba tudo sobre essa nova oportunidade!]]></description>
			<content:encoded><![CDATA[<p><em><img class="alignleft size-full wp-image-258" title="Google Code Jam" src="http://heltonduarte.com/wp-content/uploads/2009/08/Google-Code-Jam-logo.gif" alt="Google Code Jam" width="206" height="77" />Olá pessoal,</em></p>
<p>Passei um bom tempo sem postar não foi? Bem, primeiramente tive provas e fiquei sem tempo&#8230;aí depois vieram as férias e precisava de descanso ^^ Mas voltando ao batente, venho avisá-los de <strong>outra competição de programação</strong> que está vindo por aí: <a title="Google Code Jam 2009" href="http://code.google.com/codejam/" target="_blank">Google Code Jam 2009</a>! É mais uma competição em que podem participar<strong> profissionais e estudantes </strong>no intuito de construir algoritmos desafiantes e com um diferencial: permite que você <strong>programe na sua linguagem favorita</strong> com o <strong>ambiente de programação à sua escolha</strong>! =D</p>
<p>Você já pode fazer seu <a title="Google Code Jam 2009 - Registro" href="http://code.google.com/codejam/contest/registration" target="_blank">registro</a>, tendo até o dia <strong>3 de setembro</strong> para isso. O desafio é composto de algumas fases de qualificação, nas quais os competidores terão de 3 a 6 problemas para resolver, sendo recebidos além de uma descrição dos mesmos, um arquivo de entrada para testar seu programa, sendo divididos entre Entradas pequenas e grandes, valendo pontos independentemente um do outro.</p>
<p><em><strong>Como serão as fases da competição?</strong></em></p>
<p>O <strong>Code Jam</strong> irá começar com um <strong>Qualification Round</strong>, do dia <strong>2 ao 3 de setembro</strong>, consistindo de <strong>3 problemas</strong>. Não há limite no número de pessoas a avançar para a próxima fase, sendo <strong>essa primeira fase apenas para &#8220;peneirar&#8221; os programadores</strong>: para avançar <strong>é necessário resolver um conjunto de testes pequeno e um grande</strong>, independente do problema.</p>
<p>Agora chega o <strong>Online Round 1</strong>, o qual será subdividido em <strong>3 sub-rounds</strong> para poder abranger o maior número de fusos horários, possibilitando ao participante escolher em qual irá participar. Para o <strong>Online Round 2</strong> seguirão <strong>1000 programadores de cada sub-round</strong>, totalizando os <strong>3000 melhores</strong> classificados.</p>
<p>O <strong>Online Round 2</strong> serve &#8220;apenas&#8221; para selecionar os bons programadores, <strong>avançando 500 para o Online Round 3</strong> e, desse último, <strong>25 para os Onsite Finals</strong>. As finais acontecerão em <strong>Mountain View, Califórnia</strong>, na sede do <strong>Google</strong>, no dia <strong>13 de novembro de 2009</strong>, mas não se preocupem: Viagem e acomodação serão pagas pela gigante da internet. Lembrando também que os <strong>500 melhores colocados</strong> ganharão uma <strong>camiseta</strong> do <strong>Google Code Jam</strong> e os <strong>25 primeiros</strong> ganharão<strong> prêmios em dinheiro</strong>, distribuídos da seguinte forma:</p>
<ul>
<li>1º lugar -&gt; US$ 5000,00</li>
<li>2º lugar -&gt; US$ 2000,00</li>
<li>3º lugar -&gt; US$ 1000,00</li>
<li>4º ao 25º lugar -&gt; US$ 100,00</li>
</ul>
<p>No entanto, acredito que o <strong>maior prêmio seja a visibilidade</strong> que uma competição dessa proporciona, tendo <strong>quase garantia de contratação pelo Google</strong> para os melhores. Para mais informações, veja as <a title="Google Code Jam 2009 - Regras" href="http://code.google.com/codejam/rules.html" target="_blank">regras</a>. Para quem se interessou, vá logo treinando nos sites do <a title="Top Coder.com" href="http://www.topcoder.com/" target="_blank">TopCoder.com</a>, <a title="UVa Online Judge" href="http://uva.onlinejudge.org/" target="_blank">UvaOnline Judge</a> ou nos problemas dos <a title="Google Code Jam - Practice" href="http://code.google.com/codejam/contest" target="_blank">JAMs anteriores</a>.</p>
<p><strong>OBS:</strong> Para quem ainda não viu, temos novidades no blog: uma área para você dar suas <a title="HeltonDuarte.com - Sugestões" href="http://heltonduarte.com/sugestoes/" target="_self">sugestões</a> de assuntos e o <a title="Twitter Tools" href="http://wordpress.org/extend/plugins/twitter-tools/" target="_blank">Twitter Tools</a>, do <a title="Super Wordpress" href="http://comocriarmeusite.com.br/2009/06/02/conheca-o-super-wordpress/" target="_blank">Super Wordpress</a> da <a title="Hostnet" href="http://www.hostnet.com.br/" target="_blank">Hostnet,</a> permitindo que você veja as atualizações do <a title="Twitter de Helton Duarte" href="http://twitter.com/heltonduarte" target="_blank">meu Twitter</a> direto do blog! Aproveitem!</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Aprenda Ruby on Rails com os experts no assunto" href="http://heltonduarte.com/2009/07/31/aprenda-ruby-on-rails-com-os-experts-no-assunto/" target="_self">Aprenda Ruby on Rails com os experts no assunto</a></li>
<li><a title="Desafio Nacional Acadêmico" href="http://heltonduarte.com/2009/05/23/desafio-nacional-academico/" target="_self">Desafio Nacional Acadêmico</a></li>
<li><a title="Programando melhor: Aula 8 - Grafos III" href="http://heltonduarte.com/2009/05/04/programando-melhor-aula-8-grafos-iii/" target="_self">Programando melhor: Aula 8 &#8211; Grafos III</a></li>
<li><a title="Programando melhor: Aula 7 - Grafos II" href="http://heltonduarte.com/2009/04/30/programando-melhor-aula-7-grafos-ii/" target="_self">Programando melhor: Aula 7 &#8211; Grafos II</a></li>
<li><a title="Programando melhor: Aula 6 - Grafos I" href="http://heltonduarte.com/2009/04/18/programando-melhor-aula-6-grafos-i/" target="_self">Programando melhor: Aula 6 &#8211; Grafos I</a></li>
</ul>
<p><em>E aí? Quem vai participar do Google Code Jam? Tire suas dúvidas aqui e, quando tiver mais novidades da competição, postarei informações! <strong>Comente</strong> e diga sua opinião.</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Eu disse: Guardarei os meus caminhos para não delinquir com a minha língua; enfrearei a minha boca enquanto o ímpio estiver diante de mim.&#8221;</em> <strong>Salmos 39.1</strong></p>
<p><em>&#8220;Bem-aventurado o homem que põe no SENHOR a sua confiança e que não respeita os soberbos, nem os que se desviam para a mentira.&#8221;</em> <strong>Salmos 40.4</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/08/17/google-code-jam-2009-uma-nova-oportunidade/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
