<?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 &#187; Programação</title>
	<atom:link href="http://heltonduarte.com/category/programacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://heltonduarte.com</link>
	<description>O seu espaço sobre programação</description>
	<lastBuildDate>Fri, 15 Jul 2011 18:38:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<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>1</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>4</slash:comments>
		</item>
		<item>
		<title>Aprenda Ruby on Rails com os experts no assunto</title>
		<link>http://heltonduarte.com/2009/07/31/aprenda-ruby-on-rails-com-os-experts-no-assunto/</link>
		<comments>http://heltonduarte.com/2009/07/31/aprenda-ruby-on-rails-com-os-experts-no-assunto/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 20:36:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[oxente rails]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=247</guid>
		<description><![CDATA[Visando aprender algo sobre Ruby On Rails até próxima semana, quando será realizado o Oxente Rails, venho dar-lhes dicas de tutoriais para começar essa grande aventura na nova sensação da web.]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal,</em></p>
<p>Como dito em um <a title="Oxente Rails" href="http://heltonduarte.com/2009/06/26/oxente-rails-a-sensacao-chega-ao-nordeste/" target="_blank">post anterior</a> o <a title="Oxente Rails - Site Oficial" href="http://oxenterails.com" target="_blank">Oxente Rails</a> está chegando a Natal nos dias 7 e 8 de agosto, com o objetivo de divulgar esse <strong>framework web</strong> que está crescendo tanto nos últimos anos. Eu, como muitas outras pessoas, irei ao evento para tentar aprender um pouco sobre a <strong>linguagem (Ruby)</strong> e a <strong>plataforma (Rails)</strong>, no entanto não queria chegar lá sem saber de NADA e resolvi procurar <strong>tutoriais rápidos</strong> (ou ler a introdução dos tutoriais maiores) para iniciar. Juntando o útil ao agradável, resolvi fazer esse post mostrando links para as principais referências do assunto, já que não tive tempo nessa semana para pesquisar sobre <strong>Expressões Regulares</strong> (para escrever no blog), as quais ficarão para uma semana posterior, ok?</p>
<p>Bem, primeiramente, é fundamental a visita ao <a title="AkitaOnRails.com" href="http://akitaonrails.com/" target="_blank">AkitaOnRails.com</a>, site com diversos tutoriais feitos por um dos <strong>pioneiros de Rails no Brasil</strong> e aos blogs de <a title="Marcos Tapajós - ruby, rails, desenvolvimento ágil e tecnologia" href="http://tapajos.me/" target="_blank">Tapajós</a> e <a title="mergulhaoinfo on rails" href="http://mergulhao.info/" target="_blank">Mergulhão</a>. Temos também os sites comunitários como <a title="RubyOnRails.pro.br" href="http://www.rubyonrails.pro.br/" target="_blank">RubyOnRails.pro.br</a>, <a title="Ruby Inside Brasil" href="http://www.rubyinside.com.br/" target="_blank">RubyInsideBrasil</a>, <a title="RubyOnBr.org" href="http://www.rubyonbr.org/" target="_blank">RubyOnBr.org</a>, entre outros. Alguns <strong>tutoriais</strong> bem legais seguem abaixo para quem quiser se aventurar em <strong>Ruby On Rails</strong>!</p>
<ul>
<li><a title="O que é Ruby?, por RubyOnBr.org" href="http://www.rubyonbr.org/articles/2006/08/24/o-que-ruby/" target="_blank">O que é Ruby?</a>, por <strong>RubyOnBr.org</strong></li>
<li><a title="Micro-Tutorial de Ruby" href="http://akitaonrails.com/2008/11/10/micro-tutorial-de-ruby" target="_blank">Micro-Tutorial de Ruby</a>, por <strong>Fábio Akita</strong> (não tem nada de micro&#8230;)</li>
<li><a title="# Rolling with Rails 2.1 - The First Full Tutorial" href="http://akitaonrails.com/2008/05/25/rolling-with-rails-2-1-the-first-full-tutorial-part-1" target="_blank">Rolling with Rails 2.1 &#8211; The First Full Tutorial</a> (a versão atual é 2.3)</li>
<li><a title="Getting Started with Rails" href="http://guides.rails.info/getting_started.html" target="_blank">Getting Started with Rails</a></li>
</ul>
<p><strong>Veja também</strong> um post do blog sobre <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>.</p>
<p><em>É isso aí, pessoal, nos encontramos no Oxente Rails! Quem vai? E alguém tem mais algum tutorial ou site que queria recomendar? <strong>Comente</strong> e conte-nos!</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Entrega o teu caminho ao SENHOR; confia nEle, e Ele tudo fará.&#8221;</em> <strong>Salmos 37.5</strong></p>
<p><em>&#8220;Mas os ímpios perecerão, e os ímpios do SENHOR serão como a gordura dos cordeiros; desaparecerão e em fumaça se desfarão.&#8221;</em> <strong>Salmos 37.20</strong></p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 198px; width: 1px; height: 1px;">http://www.rubyonbr.org/articles/2006/08/24/o-que-ruby/</div>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/07/31/aprenda-ruby-on-rails-com-os-experts-no-assunto/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Evite E-mail Injection</title>
		<link>http://heltonduarte.com/2009/06/19/evite-e-mail-injection/</link>
		<comments>http://heltonduarte.com/2009/06/19/evite-e-mail-injection/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 20:15:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Evitar SPAM]]></category>
		<category><![CDATA[mail()]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=221</guid>
		<description><![CDATA[O E-mail Injection é uma vulnerabilidade que pode ocorrer em aplicações de internet que enviam e-mails, devido a algumas paricularidades do protocolo MIME.]]></description>
			<content:encoded><![CDATA[<p><em>Olá leitores!</em></p>
<p>O post hoje tem um caráter <strong>bem técnico</strong>, mas curto, e fala de uma linguagem da qual eu não sou nem tão familiarizado, contudo é bastante difundida no mercado de desenvolvimento Web: o <strong>PHP</strong>. Esse tópico foi sugestão do <strong>Mayron Cachina</strong>, veja seu <a title="Twitter de Mayron Cachina" href="http://twitter.com/mayroncachina" target="_blank">twitter</a> e <a title="MayronCachina.net" href="http://mayroncachina.net" target="_blank">site</a>. Faça você também sugestões de assuntos para serem postados e, para ter sempre informações sobre tecnologia, <a title="Twitter de Helton Duarte" href="http://twitter.com/heltonduarte" target="_blank">me siga no twitter</a>.</p>
<p><img class="alignright size-medium wp-image-222" title="PHP" src="http://heltonduarte.com/wp-content/uploads/2009/06/php_logo-300x223.gif" alt="PHP" width="210" height="156" />O <a title="E-mail Injection" href="http://en.wikipedia.org/wiki/E-mail_injection" target="_blank">E-mail Injection</a> é uma vulnerabilidade que pode ocorrer em aplicações de internet que <strong>enviam e-mails</strong>, sendo o caso mais conhecido ao usar a <strong>função mail() do PHP </strong>(entretanto, pode ocorrer em qualquer linguagem web). Tudo ocorre devido ao formato de uma mensagem do protocolo <a title="MIME Protocol" href="http://en.wikipedia.org/wiki/MIME" target="_blank">MIME</a>, pois ela delimita os campos por <strong>&#8220;Carriage Return&#8221;</strong>, permitindo usuários maliciosos inserirem essas quebras de linha ao final do Remetente da mensagem, por exemplo, e colocando uma imensa lista de CC (cópias) para mandar <strong>SPAM</strong>. Veja abaixo:</p>
<p>Sender: sender@anonymous.www%0ACc:recipient@someothersite.xxx<br />
Subject: ahem<br />
Message: My Message&#8230;</p>
<p><strong>Os dados da mensagem MIME ficarão da seguinte maneira (gerando o SPAM que o spammer quiser):</strong></p>
<p>To: recipient@victim.xxx<br />
Subject: ahem<br />
From: sender@anonymous.xxx<br />
Cc:recipient@someothersite.xxx</p>
<p><strong>OBS: Para quem não sabe, o código hexadecimal para quebrar linha é %0A.</strong></p>
<p>Para <strong>evitar esse ENORME problema</strong>, é necessário criar uma <strong>função</strong> para <strong>avaliar o conteúdo das variáveis</strong> recebidas do usuário, fazendo simples testes <strong>se há quebra de linha</strong> no meio dos campos, evitando o envio dos <strong>SPAMs</strong> e, muitas vezes, assegurando a integridade da imagem da empresa. Viu como é fácil? Portanto, não só os programadores <strong>PHP</strong>, mas todos os que mexem com Web, não podem mais cometer esses erros. Se quiser de mais informações, como <strong>alguns códigos de exemplos</strong> e tal, veja os seguintes links:</p>
<ul>
<li><a title="E-mail Injection" href="http://www.damonkohler.com/2008/12/email-injection.html" target="_blank">damonkohler.com &#8211; Inglês<br />
</a></li>
<li><a title="MeioCódigo.com" href="http://www.meiocodigo.com/2007/05/26/evitar-mail-injection-em-php/" target="_blank">MeioCódigo.com &#8211; Português<br />
</a></li>
<li><a title="TheSiteWizard.com" href="http://www.thesitewizard.com/php/protect-script-from-email-injection.shtml" target="_blank">thesitewizard.com &#8211; Inglês<br />
</a></li>
</ul>
<p><strong>Posts interessantes:</strong></p>
<ul>
<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="_blank">XNA &#8211; A fábrica de jogos da Microsoft</a></li>
<li><a title="E3 2009 - Uma revolução" href="http://heltonduarte.com/2009/06/09/e3-2009-uma-revolucao/" target="_blank">E3 2009 &#8211; Uma revolução</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>
</ul>
<p><em>E aí pessoal, o que acharam? Façam comentários! <strong>Sugiram ideias para os próximos posts! </strong>Conte também suas experiências com essa situação de E-mail Injection.</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Guia-me na tua verdade e ensina-me, pois tu és o Deus da minha salvação; por ti estou esperando todo o dia.&#8221;</em> <strong>Salmos 25.5</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/06/19/evite-e-mail-injection/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>XNA &#8211; A fábrica de jogos da Microsoft</title>
		<link>http://heltonduarte.com/2009/06/12/xna-a-fabrica-de-jogos-da-microsoft/</link>
		<comments>http://heltonduarte.com/2009/06/12/xna-a-fabrica-de-jogos-da-microsoft/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 23:52:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[brgames]]></category>
		<category><![CDATA[desenvolvimento de jogos]]></category>
		<category><![CDATA[Imagine Cup]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[xna challenge]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=216</guid>
		<description><![CDATA[Microsoft XNA é um conjunto de ferramentas de desenvolvimento baseadas no MS Visual Studio que permite aos programadores criar jogos para Windows, XBox 360 e Zune. Leia mais...]]></description>
			<content:encoded><![CDATA[<p><em>E aí pessoal?</em></p>
<p><img class="alignleft size-full wp-image-217" title="XNA Game Studio" src="http://heltonduarte.com/wp-content/uploads/2009/06/xna_logo.jpg" alt="XNA Game Studio" width="300" height="255" />Como prometido, hoje irei contar um pouco sobre o que é o <a title="XNA - Wikipédia" href="http://pt.wikipedia.org/wiki/Microsoft_XNA" target="_blank">Microsoft XNA Game Studio</a>, para todos aqueles fanáticos por jogos! Tenho consciência de que meu nível com o <strong>XNA</strong> não é tão grande e, portanto, não irei fazer um <em>curso de programação em XNA</em>, como tinha dito, porém darei os links das pessoas mais indicadas para isso, ok? Posso fazer alguns posts sobre assuntos interessantes que eu for descobrindo na minha empreitada de <strong>desenvolvimento de jogos</strong>.</p>
<p><strong>XNA</strong> não é somente um framework, como dizem por aí. Na verdade, o <a title="XNA - MSDN Developer Center" href="http://msdn.microsoft.com/pt-br/library/bb200104(en-us).aspx" target="_blank">XNA Game Studio</a> é o ambiente de desenvolvimento baseado no <strong>XNA Framework</strong>. Esse último é um conjunto de ferramentas facilitadoras do desenvolvimento de jogos criado pela <strong>Microsoft</strong> e baseada no <a title="Visual C# - Developer Center" href="http://msdn.microsoft.com/pt-br/vcsharp/default.aspx" target="_blank">Visual C#</a>, possibilitando uma enorme agilidade nesse processo e dando a permissão de criar games para <strong>Windows, XBox 360 e Zune</strong>, algo extremamente interessante. Ele vem de modo a substituir o <a title="Managed DirectX" href="http://en.wikipedia.org/wiki/Managed_DirectX" target="_blank">Managed DirectX</a> e é baseado no <strong>.NET framework</strong>, ou seja, facilita a vida do programador quanto a seguridade do código e outras coisas. Veja mais sobre o <a title=".NET Framework" href="http://msdn.microsoft.com/en-us/netframework/default.aspx" target="_blank">.NET Framework</a>.</p>
<p>Hoje em dia o <strong>XNA</strong> já está bem popularizado, muito graças a <a title="Imagine Cup" href="http://imaginecup.com/default.aspx" target="_blank">Imagine Cup</a>, acredito eu, pois nessa competição, uma das maiores e mais diversificadas do mundo, no que diz respeito a tecnologia, há uma categoria de desenvolvimento de jogos, a qual exige a utilização do<strong> XNA</strong>. Esse ano, como já em diversas vezes, o Brasil estará representado na final, agora pela equipe <a title="Levv IT - Game Development" href="http://imaginecup.com/MyStuff/MyTeam.aspx?TeamId=16948" target="_blank">Levv IT</a>. Além dela, já existem diversas competições de jogos Brasil afora, como <a title="XNA Challenge Brasil" href="http://www.xnachallenge.com.br/" target="_blank">XNA Challenge</a> e o <a title="BR Games" href="http://www.brgames2009.com.br/index.html" target="_blank">BRGames</a>.</p>
<p>No final das contas, para você que gosta de desenvolver jogos, o <a title="XNA - MSDN Developer Center" href="http://msdn.microsoft.com/pt-br/library/bb200104(en-us).aspx" target="_blank">Microsoft XNA Game Studio</a>, que por sinal lançou sua versão <a title="XNA 3.1" href="http://blogs.msdn.com/xna/archive/2009/06/11/xna-game-studio-3-1-is-go.aspx" target="_blank">XNA 3.1</a> hoje, é uma dos melhores <strong>IDEs</strong> (ambiente de desenvolvimento), está em crescente melhoramento e já possui uma vasta comunidade de desenvolvedores, pronta para ajudar os iniciantes. Veja agora, os principais links de<strong> tutoriais</strong>:</p>
<ul>
<li><a title="XNA - MSDN Developer Center" href="http://msdn.microsoft.com/pt-br/library/bb200104(en-us).aspx" target="_blank">XNA &#8211; MSDN Developer Center</a></li>
<li><a title="XNA Creators Club" href="http://creators.xna.com/en-US/education/gettingstarted" target="_blank">XNA Creators Club &#8211; Getting Started</a></li>
<li><a title="Sharpgames" href="http://www.sharpgames.net/" target="_blank">Sharpgames &#8211; Comunidade Brasileira de XNA</a></li>
</ul>
<p><img class="alignright size-medium wp-image-218" title="Mikura - Feito em XNA" src="http://heltonduarte.com/wp-content/uploads/2009/06/mikura2_xna-300x225.jpg" alt="Mikura - Feito em XNA" width="300" height="225" />Além do mais, veja o <a title="Luciano José - XNA" href="http://lucianojosefj.spaces.live.com/default.aspx?sa=570194272" target="_blank">blog do Luciano José</a>, <em>um dos maiores expoentes em XNA do Brasil</em>. Para aqueles de Natal-RN, há a célula acadêmica da Microsoft, da qual eu participo (e, por sinal, sou pouco assíduo), o <a title="XNA Natal Academics" href="http://natalacademics.ning.com/" target="_blank">XNA Natal Academics</a>. Então, bons jogos para vocês!</p>
<p>OBS: Relembrando que estou com a ideia de um projeto de desenvolvimento de jogos com fins terapêuticos, como para ajudar crianças com câncer ou algo do tipo. Esses jogos terão temas de combate a doenças, por exemplo: destruir as células maldosas do câncer; protejer a pele de raios ultra-violeta; entre outros. <strong>Peço a ajuda de todos com sugestões para esse projeto, principalmente com ideias de temas a serem utilizados.</strong></p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="E3 2009 - Uma revolução" href="http://heltonduarte.com/2009/06/09/e3-2009-uma-revolucao/" target="_blank">E3 2009 &#8211; Uma revolução</a></li>
<li><a title="Cursos grátis na Internet - MIT" href="http://heltonduarte.com/2009/01/19/cursos-gratis-na-internet-mit/" target="_blank">Cursos grátis na Internet &#8211; MIT</a></li>
</ul>
<p><em>Prontos para aprender XNA? Vamos lá, pessoal! Está faltando alguma coisa no post? <strong>Deixe seu comentário</strong> e ajude-nos. Conte também sobre suas experiências com essa ferramenta!</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Quem é o Rei da Glória? O SENHOR forte e poderoso, o SENHOR poderoso na guerra. Quem é o Rei da Glória? O SENHOR dos Exércitos; Ele é o Rei da Glória.&#8221;</em><strong> Salmos 24.8,10</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/06/12/xna-a-fabrica-de-jogos-da-microsoft/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Ruby on Rails, a nova sensação da Web</title>
		<link>http://heltonduarte.com/2008/11/29/ruby-on-rails-a-nova-sensacao-da-web/</link>
		<comments>http://heltonduarte.com/2008/11/29/ruby-on-rails-a-nova-sensacao-da-web/#comments</comments>
		<pubDate>Sun, 30 Nov 2008 02:16:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[37signals]]></category>
		<category><![CDATA[DRY]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://heltonduarte.wordpress.com/?p=31</guid>
		<description><![CDATA[Visão geral sobre o framework On Rails para a linguagem Ruby, mostrando o que é uma linguagem limpa e bela e seus princípios, além de indicação para sites de tutoriais.]]></description>
			<content:encoded><![CDATA[<p><strong>Mais um post para todos!</strong></p>
<p>Venho aqui falar para vocês sobre uma nem tão nova ferramenta da Web, porém pouco conhecida ainda aqui em nosso país: o <strong>Ruby on Rails</strong>, criado por <strong>David Heinemeier Hanson</strong>, para ser uma linguagem linda, como o próprio falou em entrevista para a revista INFO Exame Novembro/2008. <em>&#8220;[...]o Ruby me permitiu escrever os códigos mais belos que eu já programei.&#8221;</em></p>
<p>Primeiramente vamos descobrir o que é o Ruby, ok? Ruby é uma linguagem orientada a objetos com o objetivo de limpar o código dos programadores, tendo uma sintaxe bem limpa e de fácil compreensão (mescla características de <em>Python, Pearl e Smalltal</em>k, segundo<a class="wp-caption" title="Ruby On Rails" href="http://www.onlamp.com/pub/a/onlamp/2006/12/14/revisiting-ruby-on-rails-revisited.html" target="_blank"><span>Bill Walton e Curt Hibbs</span></a>). Foi criada por <strong>Yukihiro Matsumoto</strong>, no Japão, porém só foi fazer mais sucesso quando começaram a serem lançados livros em inglês sobre a linguagem.</p>
<p>O segundo ponto a ser abordado é o que seria o <strong>Rails</strong>, criado pelo dinamarquês David. Rails seria um framework para a linguagem Ruby, o qual tem <strong>código aberto</strong> e é direcionado para aplicações Web, podendo ter acesso a banco de dados, além disso seu principal foco é uma metodologia para desenvolvimento ágil. Você provavelmente deve estar se perguntando (principalmente se já programa para Web, em PHP por exemplo), por que eu escolherei o Rails se há diversos frameworks e linguagens para realizar a mesma função?</p>
<p>A resposta para sua pergunta é simples: porque o que David Heinemeier queria foi conseguido, <strong>Rails é realmente LINDO</strong>. O código torna-se extremamente limpo, além de ser baseado na <strong>arquitetura MVC</strong> (padrão de arquitetura de sofware que facilita a programação ao separar os dados &#8211; <em>Model</em> &#8211; e o layout &#8211; <em>View</em> &#8211; além de algo para uní-los, o <em>Controller</em>). Possui filosofias de desenvolvimento para simplificar a nossa vida, como as seguintes:</p>
<p><strong>-&gt; Convention over Configuration (CoC)</strong>: é baseada no fato de que o programador não precisa especificar tudo em sua aplicação, apenas o que é não é convencional. Por exemplo, se eu desejo criar uma classe &#8220;Venda&#8221; na minha aplicação &#8211; dentro do Model, automaticamente exitirá no Banco de Dados uma tabela &#8220;Vendas&#8221; por padrão, contudo se eu preferir posso nomeá-la para &#8220;ProdutosVendidos&#8221; e apenas nesse caso precisarei especificar seu nome. Deu para entender? Qualquer dúvida pode mandar em um comentário que procurarei responder.</p>
<p><strong>-&gt; Don`t repeat yourself (DRY)</strong>: princípio do livro <em>The Pragmatic Programmer</em>, de <em>Andy Hunt e Dave Thomas</em>, ele consiste no fato de que um código não pode estar duplicado de forma alguma, porque essa ação pode gerar futuras inconsistências e diminuir a clareza do código. Tudo em sua aplicação que possuir alguma relação lógica deve estar sincronizado com o outro em relação às mudanças, como o exemplo da tabela &#8220;Vendas&#8221;, citada anteriormente, que ao ser mudada também criaria outros campos na classe &#8220;Venda&#8221;, por exemplo.</p>
<p>Como visto acima, o Rails é algo que deve ser visto com bons olhos por todos aqui no Brasil por todos os motivos apresentados acima e precisa ser conhecido dos programadores Web, para trazer à tona um desenvolvimento belo e limpo, como nos sonhos de qualquer programador. Para você que gosta de Web essa é uma excelente oportunidade, também pelo fato de que diversas empresas já estão trabalhando com esse framework, um exemplo de grande sucesso é o <a class="wp-caption" title="Twitter" href="http://twitter.com/" target="_blank">Twitter</a>, feito com Rails.</p>
<p>Para que você possa ter contato com essa plataforma, colocarei diversos links, muitos dos quais busquei informações para poder elaborar esse post:</p>
<p>* <a class="wp-caption" title="Site oficial de Rails no Brasil" href="http://www.rubyonrails.pro.br/" target="_blank">http://www.rubyonrails.pro.br/</a></p>
<p>* <a class="wp-caption" title="Grupo de discussão Rails-BR" href="http://groups.google.com/group/rails-br" target="_blank">http://groups.google.com/group/rails-br</a></p>
<p>* <a class="wp-caption" title="Ruby On BR" href="http://www.rubyonbr.org/" target="_blank">http://www.rubyonbr.org/</a></p>
<p>* <a class="wp-caption" title="Guia de iniciação em Rails" href="http://guides.rails.info/getting_started_with_rails.html" target="_blank">http://guides.rails.info/getting_started_with_rails.html</a></p>
<p>* <a class="wp-caption" title="Motivação para escolher Rails" href="http://imasters.uol.com.br/artigo/4746/programacao/porque_ruby_on_rails/" target="_blank">http://imasters.uol.com.br/artigo/4746/programacao/porque_ruby_on_rails/</a></p>
<p>Bem acredito que seja isso que eu tinha para falar, espero ter dado uma visão geral sobre o Ruby on Rails para todos vocês, procurem mais sobre ele, não se prendam apenas à esse post, ok? Para o pessoal do nordeste, provavelmente no próximo ano será realizado o <a title="Oxente Rails" href="http://oxenterails.com" target="_blank">Oxente Rails</a>, para todos nós agraciarmos essa beleza de linguagem e, se meu amigo <a class="wp-caption" title="Blog do Elomar" href="http://codando.wordpress.com/" target="_blank">Elomar França</a> conseguir, acontecerá na minha cidade, em Natal-RN.</p>
<p><em>Até a próxima!</em></p>
<p>PS: lembrando que foi criada recentemente a página de <em>Sugestões</em> aqui no blog, para vocês comentarem como devem ser feitas as postagens ou algum assunto que desejam muito conhecer, para que eu possa estudar e postar sobre ele. Valeu!</p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;A Vida de um indivíduo só faz sentido se ajuda a tornar as vidas das demais criaturas mais nobres e mais belas.&#8221;</em> Albert Einstein</p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2008/11/29/ruby-on-rails-a-nova-sensacao-da-web/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

