<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2portuguesefull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>AkitaOnRails.com</title><link>http://www.akitaonrails.com/posts</link><language>en-US</language><managingEditor>fabioakita@gmail.com (Fabio Akita)</managingEditor><lastBuildDate>Wed, 18 Nov 2009 12:51:07 PST</lastBuildDate><generator>AkitaOnRails http://www.akitaonrails.com</generator><description></description><meta xmlns="http://pipes.yahoo.com" name="pipes" content="noprocess" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/AkitaOnRails" type="application/rss+xml" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FAkitaOnRails" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FAkitaOnRails" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FAkitaOnRails" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/AkitaOnRails" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FAkitaOnRails" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FAkitaOnRails" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FAkitaOnRails" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:browserFriendly>Dedicated to all free thinker skeptical inquirer out there.</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>[Off-Topic] Restaurantes e Tecnologia</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/jdqGc7dbV2Q/off-topic-restaurantes-e-tecnologia</link><pubDate>Wed, 18 Nov 2009 12:51:07 PST</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5230</guid><description>&lt;p&gt;Existem desenvolvedores e desenvolvedores. Existem empresas e empresas. Apenas para efeitos ilustrativos deste post eu vou separar pelo menos dois tipos de empresa: onde tecnologia faz parte ou é o &lt;em&gt;core business&lt;/em&gt;, onde o gasto relacionado a tecnologia é considerado de fato &amp;#8220;investimento&amp;#8221;; ou empresas onde tecnologia é apenas acessória, considerada meramente parte do &amp;#8220;custo operacional&amp;#8221;, onde apenas somente para suportar o negócio, que é muito do que chamamos de &amp;#8220;backoffice&amp;#8221;. Na falta de termos melhores, chamarei empresas onde tecnologia é &lt;em&gt;core business&lt;/em&gt; de &lt;strong&gt;&amp;#8220;empresas de tecnologia&amp;#8221;&lt;/strong&gt; e os outros de &lt;strong&gt;&amp;#8220;enterpriseys&amp;#8221;&lt;/strong&gt; para facilitar.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="/assets/2009/11/18/A_Busy_Restaurant_Kitchen.JPG_original.jpeg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Por que estou dizendo isso? Porque muitas decisões são tomadas fora desse contexto. Decisões que normalmente se encaixam bem em &lt;em&gt;enterpriseys&lt;/em&gt; são tomadas em empresas de tecnologia e vice-versa. É um dos motivos de muitas discussões inúteis. Eu consigo entender porque um banco se sentiria incomodado de implementar hoje uma nova tecnologia, vamos chutar, trocar alguns de seus DB2 por um CouchDB por exemplo. Também consigo entender porque uma empresa médica ficaria relutante em trocar seus atuais programas embarcados de C, por exemplo, por .&lt;span class="caps"&gt;NET&lt;/span&gt; micro framework. Não quer dizer que nenhuma delas tenta, mas sim que não é o caso da maioria e nem que as tecnologias não funcionariam.&lt;/p&gt;&lt;div style="float: right; margin: 3px"&gt;&lt;img src="/assets/2009/11/18/cheftony_original.jpg" alt="" /&gt;&lt;/div&gt;&lt;p&gt;O mesmo não pode ser dito de &amp;#8220;empresas de tecnologia&amp;#8221;. Nesse contexto, tentar usar o que há de mais novo e mais avançado deveria ser o normal. Mais do que isso: criar as próprias tecnologias deveria ser o normal. Agora, a preocupação é que isso fique aleatório, desordenado e leve ao caos. Não se trata disso. É justamente por isso que empresas de tecnologia como Google, Microsoft, Novell, RedHat e diversos outros menores tem algo que se assemelha a um departamento de &amp;#8220;Research &amp;amp; Development&amp;#8221; (pesquisa e desenvolvimento), ou no mínimo a noção de &amp;#8220;pesquisar e experimentar&amp;#8221;. É por isso que eles se esforçam em contratar os profissionais do mercado que estão na ponta das novas tecnologias, coisa que não faz sentido por exemplo em um banco, ou uma seguradora, ou uma empresa de transportes.&lt;/p&gt;
&lt;p&gt;Esse pensamento parece óbvio e realmente é, mas por alguma razão eu vejo pessoas decidindo e discutindo coisas fora desses contextos, coisa que é particularmente irritante. Tecnologias mais recentes de código aberto, por exemplo, fazem total sentido em empresas de tecnologias. Mais do que isso: ter funcionários contribuindo para projetos de código aberto faz mais sentido ainda.&lt;/p&gt;
&lt;p&gt;Para facilitar a analogia, eu disse que em &amp;#8220;empresas de tecnologia&amp;#8221; o &lt;em&gt;core business&lt;/em&gt; é tecnologia (duh). Agora pense num restaurante. Nesse caso trata-se de uma empresa onde o &lt;em&gt;core business&lt;/em&gt; é cozinhar bons pratos culinários. Se nessa empresa eu decidir, fora do contexto, e pensar como se a comida fosse apenas acessória, poderia dizer: &lt;em&gt;&amp;#8220;porque não terceirizamos nossa cozinha e passamos a comprar hamburgers do McDonald&amp;#8217;s? Vai diminuir nosso custo operacional, teremos entrega garantida nas quantidades que precisamos. Mais do que isso, o mercado todo já conhece e gosta.&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="/assets/2009/11/18/chaplin-charlie-modern-times_01_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Pior ainda, se os cozinheiros desse restaurante tivessem a mentalidade: &lt;em&gt;&amp;#8220;ah, não quero testar esse novo ingrediente porque vai dar mais trabalho. Prefiro pegar o tempero já pronto no mercado.&amp;#8221;&lt;/em&gt; É o que eu chamo de &amp;#8220;cozinheiros de ovos mexidos&amp;#8221;. Isso porque qualquer um consegue fazer ovos mexidos.&lt;/p&gt;
&lt;p&gt;Em enterpriseys, normalmente a maior parte do trabalho é literalmente &amp;#8220;desenvolvimento de formulários e relatórios&amp;#8221;, o que justifica a existência de Fábricas de Software e a contratação de &amp;#8220;codificadores&amp;#8221;, o típico funcionário de restaurante que apenas esquenta a comida congelada de terceiros no micro-ondas.&lt;/p&gt;
&lt;p&gt;E eu também sempre diferencio um &amp;#8220;codificador&amp;#8221; de um &amp;#8220;desenvolvedor&amp;#8221;. Um desenvolvedor precisa ter a cabeça de um &amp;#8220;chéf&amp;#8221;, um verdadeiro cozinheiro, tentando coisas novas, testando novos ingredientes, arriscando novos pratos. É o que diferencia um chéf premiado de um funcionário que apenas esquenta uma grelha. Sem querer denegrir a profissão, estou apenas tentando ilustrar um conceito. E o problema é quando um esquentador de micro-ondas acha que é cozinheiro e o que ele está fazendo é gastronomia. Não é.&lt;/p&gt;
&lt;p&gt;Vale uma ressalva: não estou dizendo que não existem &amp;#8220;cozinheiros&amp;#8221; em consultorias ou enterpriseys. O que estou apontando é como a empresa encara esse tipo de serviço ou gasto. Como ex-consultor estou mais do que ciente que existem grandes mentes tentando influenciar e mudando o mindset de muitas indústrias. Exemplo claro disso é a Thoughtworks, por exemplo.&lt;/p&gt;
&lt;div style="float: right; margin: 3px"&gt;&lt;img src="/assets/2009/11/18/kitchen_original.jpg" alt="" /&gt;&lt;/div&gt;&lt;p&gt;Portanto, antes de mais nada, veja em qual contexto você está. Se estiver num restaurante de verdade, espera-se que você seja um cozinheiro. Não ache que agir como um esquentador de micro-ondas está correto, a menos que você queira levar o restaurante à falência.&lt;/p&gt;
&lt;p&gt;Outro exemplo do nosso mundo: acho que todos que lêem o meu blog conhecem o &lt;a href="http://github.com"&gt;Github&lt;/a&gt;, um dos repositórios de código-aberto mais inovadores da atualidade. Tentem colocar isso nas suas cabeças: foi o trabalho de literalmente 4 programadores, alguns deles que mal acabaram de sair da faculdade. Eles poderiam usar tudo que é considerado &amp;#8220;aceitável&amp;#8221; pelo &amp;#8220;mercado&amp;#8221;. Leiam este blog post deles: &lt;a href="http://github.com/blog/530-how-we-made-github-fast"&gt;Como fizemos o Github ficar rápido&lt;/a&gt;. Se você aspira ser um &amp;#8220;chéf&amp;#8221; nenhuma das tecnologias citadas deveria ser novidade: ldirectord, nginx, unicorn, rails, drdb, proxymachine, haproxy, redis, ernie, memcached. Querem mais? Ao mesmo tempo, só recentemente, eles lançaram duas novas tecnologias: &lt;a href="http://github.com/blog/542-introducing-resque"&gt;Resque&lt;/a&gt; e &lt;a href="http://github.com/blog/531-introducing-bert-and-bert-rpc"&gt;&lt;span class="caps"&gt;BERT&lt;/span&gt;-&lt;span class="caps"&gt;RPC&lt;/span&gt;&lt;/a&gt;. Vou repetir: não muito mais que 4 pessoas.&lt;/p&gt;
&lt;p&gt;Querem mais? Lembram do &lt;a href="http://www.modrails.com/"&gt;Phusion Passenger&lt;/a&gt; e do &lt;a href="http://www.rubyenterpriseedition.com/"&gt;Ruby Enterprise Edition&lt;/a&gt;? São dois garotos que nem saíram da universidade. Eles são &amp;#8220;chéfs&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Em uma empresa de tecnologia, essa é a meta. Em enterpriseys não. Onde você está?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4ntv-geD8zI2wwYpQgSxApzSrdw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4ntv-geD8zI2wwYpQgSxApzSrdw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4ntv-geD8zI2wwYpQgSxApzSrdw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4ntv-geD8zI2wwYpQgSxApzSrdw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=jdqGc7dbV2Q:Ze6uxKCSXbQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=jdqGc7dbV2Q:Ze6uxKCSXbQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=jdqGc7dbV2Q:Ze6uxKCSXbQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=jdqGc7dbV2Q:Ze6uxKCSXbQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=jdqGc7dbV2Q:Ze6uxKCSXbQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=jdqGc7dbV2Q:Ze6uxKCSXbQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=jdqGc7dbV2Q:Ze6uxKCSXbQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/jdqGc7dbV2Q" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/11/18/off-topic-restaurantes-e-tecnologia</feedburner:origLink></item><item><title>Chatting with Adam Jacob</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/mhzFWgaWyFw/chatting-with-adam-jacob</link><pubDate>Wed, 18 Nov 2009 07:46:21 PST</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5229</guid><description>&lt;div style="float: left; margin: 3px"&gt;&lt;img src="/assets/2009/11/18/Opscode_logo_final_full_aspect_medium_original.png" alt="" /&gt;&lt;/div&gt;&lt;p&gt;Configuration Management is a tricky subject. For non-starters, when you&amp;#8217;re a developer and you have few boxes to take care of, you can usually get away with just managing them manually. People are probably just used to pop in a CD, double-click the &amp;#8220;install&amp;#8221; program and click &amp;#8220;next&amp;#8221;, &amp;#8220;next&amp;#8221; until the end, then you manually log in to backup (when you remember it), and sometimes you do apply some security updates when you remember about them. &lt;/p&gt;
&lt;p&gt;But then you have more than a dozen machines, things start to get uglier, you end up making more mistakes, forgetting important steps, and all of a sudden managing machines become a nightmare. You end up being woken up in the middle of the night because you forgot to install some crucial component, and so on and so forth.&lt;/p&gt;
&lt;p&gt;The same way you need testing, continuous integration tools when you&amp;#8217;re a developer, you also need automated, reliable and flexible tools for the system administrator role. That&amp;#8217;s where tools such as &lt;strong&gt;Chef&lt;/strong&gt; kick in to help.&lt;/p&gt;
&lt;p&gt;From &lt;a href="http://opscode.com/"&gt;Opscode Inc.&lt;/a&gt;, we have &lt;a href="http://twitter.com/adamhjk"&gt;Adam Jacob&lt;/a&gt; (&lt;span class="caps"&gt;CTO&lt;/span&gt;) and &lt;a href="http://twitter.com/jesserobbins"&gt;Jesse Robbins&lt;/a&gt; (&lt;span class="caps"&gt;CEO&lt;/span&gt;) to talk about the new contender in the automated system administration field, &lt;a href="http://www.opscode.com/chef/"&gt;Chef&lt;/a&gt;, already in use by many companies which are striving with the cutting edge to maintain their datacenters.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; To kick start this interview, it would be great to have more background info about you guys. So, how did you end up in the configuration management space?&lt;/p&gt;
&lt;div style="float: right; margin: 3px"&gt;&lt;img src="/assets/2009/11/18/adam_jacob_original_original.png" alt="" /&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; I&amp;#8217;ve been a systems administrator for 13 years, and for a majority of that time I was working for companies who did a lot of mergers and acquisition work.  Every couple of months we would acquire a new company, and it was my job to help figure out how to absorb those companies into the whole.  I got really good at looking at an application I had nothing to do with creating, and figuring out what needed to be done to make it scale (or at least make it run.)&lt;/p&gt;
&lt;p&gt;One thing we couldn&amp;#8217;t do was tell the people who had built the applications that they needed to be radically altered (in many cases, they weren&amp;#8217;t even around anymore.)  What that meant in practice was we needed to have a very flexible, modular underlying architecture &amp;#8211; everything we did had to be in service of the application, not the other way around.  By necessity that meant becoming a tools developer &amp;#8211; if we didn&amp;#8217;t have the tools we needed, we would never be able to do the job in front of us.&lt;/p&gt;
&lt;p&gt;Eventually I co-founded a consulting firm called &lt;span class="caps"&gt;HJK&lt;/span&gt; Solutions.  We built fully automated infrastructure for startups &amp;#8211; everything from OS installation to application deployment, all fully automated (including Identity Management, Monitoring and Trending, etc.)  Over the course of the next two years we built infrastructure for 12 different startups, whose products ranged from electrical car fleet management to online dating.&lt;/p&gt;
&lt;p&gt;So I come to configuration management through the trenches &amp;#8211; as a line-level systems administrator trying to make my life easier, as a consultant helping others to reap the benefits, and now as a tool builder trying to move the state of the art forward.&lt;/p&gt;
&lt;div style="float: right; margin: 3px"&gt;&lt;img src="/assets/2009/11/18/Jesse_Robbins_original_original.png" alt="" /&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Jesse:&lt;/strong&gt; Jesse Robbins is &lt;span class="caps"&gt;CEO&lt;/span&gt; of Opscode (makers of Chef) and a recognized expert in Infrastructure, Web Operations, and Emergency Management. He serves as co-chair of the Velocity Web Performance &amp;amp; Operations Conference and contributes to the O&amp;#8217;Reilly Radar. Prior to co-founding Opscode, he worked at Amazon.com with a title of &amp;#8220;Master of Disaster&amp;#8221; where he was responsible for Website Availability for every property bearing the Amazon brand. Jesse is a volunteer Firefighter/&lt;span class="caps"&gt;EMT&lt;/span&gt; and Emergency Manager, and led a task force deployed in Operation Hurricane Katrina. His experiences in the fire service profoundly influence his efforts in technology, and he strives to distill his knowledge from these two worlds and apply it in service of both.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; What&amp;#8217;s the story behind Opscode, what&amp;#8217;s its mission, and what&amp;#8217;s the story for Chef&amp;#8217;s creation?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Opscode:&lt;/strong&gt; The story behind Opscode really starts when we met Jesse.  He had written an article for O&amp;#8217;Reilly Radar about &lt;a href="http://radar.oreilly.com/2007/10/operations-is-a-competitive-ad.html"&gt;Operations being the new secret sauce&lt;/a&gt; for startups.  He and I met for coffee, became friends, and stayed in touch.  Jesse understands operations culture at a visceral level, and he&amp;#8217;s very well connected to a huge community of like-minded people that I didn&amp;#8217;t even know existed.&lt;/p&gt;
&lt;p&gt;As our consulting company grew, we reached a crossroads &amp;#8211; we clearly had a nice business going, and it wasn&amp;#8217;t difficult for us to find more work.  What was difficult was finding people who had the skills to actually deploy a new infrastructure, and to adapt the stack we had developed for a new application.  We couldn&amp;#8217;t avoid the fact that there was a couple of weeks of very high-touch work that was required to get the entire infrastructure up and running for a new client.&lt;/p&gt;
&lt;p&gt;We tried to recruit Jesse during this period, since he was one of those rare people who could do that initial high-touch engagement.  He turned us down &amp;#8211; primarily because he saw what we did: we could build a consulting company that was huge, but it would still be down to us in the trenches every day.  Unless we could get over that hump, there were probably less stressful ways to make a living. :)&lt;/p&gt;
&lt;p&gt;So we started looking at what was stopping us from being able to get that initial part of the engagement done as quickly as possible.  What was stopping us from literally having a customer fill out a questionnaire, and letting that data drive 95% of the decisions about the infrastructure?&lt;/p&gt;
&lt;p&gt;It turned out the answer was, in a word, &amp;#8220;everything&amp;#8221;.  The entire stack of open source tools we were using had been built in a different era, and they saw the world through a very different lens. We needed everything to have an &lt;span class="caps"&gt;API&lt;/span&gt;, we needed everything to be more open with it&amp;#8217;s data, and we needed everything to be flexible enough to handle the next evolution of application architectures (whatever that may be.)&lt;/p&gt;
&lt;p&gt;Once we had that revelation, the next step was figuring out what a &amp;#8216;new stack&amp;#8217; would really look like.  If we could start from scratch, what would we take with us, and what would we leave behind? Amazon had done such a great job showing us what an &lt;span class="caps"&gt;API&lt;/span&gt; over the bootstrapping process could look like, and the kind of benefits that could be had from the approach.  So assuming something like that existed for bootstrapping, what about the next layer of the stack (configuration)?&lt;/p&gt;
&lt;p&gt;We started experimenting with Chef during this period of questioning. We started working on Chef with the goal of putting ourselves out of business &amp;#8211; making the barrier to entry to having a fully automated infrastructure so low that any developer or systems administrator could just do it.  We built a prototype, showed it to Jesse, and he agreed to come on board.&lt;/p&gt;
&lt;p&gt;Opscode was born then, and our mission came out of those experiments: we are bringing Infrastructure Automation to the Masses.  We want to tear down the barriers to entry that stop people from having really great, repeatable, automated infrastructure.  Our role is to bring developers and systems administrators the best tools possible, so that they can build the systems they have always wanted.&lt;/p&gt;
&lt;p&gt;We raised 2.5 million from &lt;span class="caps"&gt;DFJ&lt;/span&gt; in January of 2009 on that vision, and have been at it ever since.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; I&amp;#8217;d like to say that only amateur sysadmins do everything manually, but I think most small to medium corporations at least still do everything manually or with random scripts spread all over the place. The notion of &amp;#8220;configuration management&amp;#8221; is still new to a lot of people. Could you briefly explain what it is, and why it is important?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Opscode:&lt;/strong&gt; To me, &amp;#8220;Configuration Management&amp;#8221;, at it&amp;#8217;s core, is all the stuff you have to do to take a system from &amp;#8220;running an operating system&amp;#8221; to &amp;#8220;doing it&amp;#8217;s job&amp;#8221;.  When a systems administrator configures a system by hand, and posts her notes on a Wiki, she&amp;#8217;s practicing the most primitive form of Configuration Management.&lt;/p&gt;
&lt;p&gt;Now, having those notes is better than nothing &amp;#8211; when she needs to do that task again, she can at least go back and read them to remember what she did last time.  She still has to do it over again, though &amp;#8211; and the repetition gets tiresome.  So she starts writing scripts that encapsulate that knowledge in code, so that now she only has to run a series of smaller commands.&lt;/p&gt;
&lt;p&gt;Time passes, though, and entropy sets in.  The systems begin to drift from where they were when the systems administrator wrote the scripts. Next thing you know, the scripts don&amp;#8217;t run anymore, or if they did, the configuration they build is wrong.  Our intrepid admin then starts editing the scripts, or making new ones, to deal with the system when it&amp;#8217;s in this new state.  This is the stage we call &amp;#8220;tool sprawl&amp;#8221; &amp;#8211; you have a tool for each different phase of a systems observable life-cycle.&lt;/p&gt;
&lt;p&gt;Modern configuration management tools solve this problem by providing a framework for describing the final state a system should be in, rather than the discrete steps we should take to get there at any given time.  Rather than writing a script that lists the commands to install Apache, write the configuration file, and start the service, you would describe that &amp;#8220;apache should be installed&amp;#8221;, the configuration file &amp;#8220;should look like this&amp;#8221;, and the service &amp;#8220;should be running&amp;#8221;.&lt;/p&gt;
&lt;p&gt;When the configuration management system runs it looks at each of these descriptions individually, and makes sure that they are in the proper state.  We no longer care what the initial state of the system is &amp;#8211; the configuration management system will only take action at each step in the process if the system is not in the state you described. If you run it again, and nothing has changed, the system takes no action.  (Configuration management geeks call this property &lt;a href="http://en.wikipedia.org/wiki/Idempotence"&gt;idempotence&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;This means that you can describe your systems once in code, and as they change over time, simply update that code to reflect what you want the state of those systems to be.  The impact of this model on the daily life a systems administrator cannot be overstated &amp;#8211; it makes everything easier.&lt;/p&gt;
&lt;p&gt;It also has huge impacts outside the systems administrators world. You now have a living document that describes how all your servers are configured &amp;#8211; you can share it, you can put it in revision control, you can print it out for an auditor.  Business processes that previously required manual intervention frequently can be boiled down to discrete changes.  The more you work in this way, the more the impacts spread throughout the organization.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Even though the Ruby community probably compares Chef to Puppet, I think one of the most widely used system is CFEngine2. How does Chef compare with CFEngine2?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Opscode:&lt;/strong&gt; Cfengine 2 is where almost everyone in the configuration management world cut their teeth.  Mark Burgess is responsible for the academic papers that outlined the idea that each part of the system should be idempotent, and his work in studying how real-world systems can be managed at scale has done more to impact the evolution of configuration management than any other individual.&lt;/p&gt;
&lt;p&gt;In addition to the idea of idempotent resources, Burgess introduced the larger concept of &amp;#8220;convergence&amp;#8221;.  The basic idea here is that if you have the description of how every finite resource should be configured, given enough time, those resources will bring the system into a compliant state.  The order in which the resources run fundamentally does not matter &amp;#8211; eventually, they will all wind up in the right place.&lt;/p&gt;
&lt;p&gt;While this model works at a fundamental level, it has some pretty dramatic inefficiencies.  Cfengine applies resources based on their type &amp;#8211; all the files are managed at once, then all the services, then all the packages.  You can control the order they are run with the &amp;#8216;actionsequence&amp;#8217;, but each system gets only one order.  So if you need to have a file copied, a package installed, and a service restarted, it&amp;#8217;s easy enough to model.  When you start getting into more complex configurations, however, it becomes more and more difficult to get an actionsequence assembled that allows you to configure your entire system in a single run.&lt;/p&gt;
&lt;p&gt;This is not a bug in Cfengine &amp;#8211; it&amp;#8217;s by design.  Convergence is the answer &amp;#8211; it&amp;#8217;s okay that it has to run more than once, it will get there eventually.  If you are thinking too much about the order things should happen in, you&amp;#8217;re probably not thinking about idempotent descriptions.&lt;/p&gt;
&lt;p&gt;In my experience, though, this was frustrating at scale.  It meant that the amount of time it took to configure a system increased as the configuration became more complicated, and your ability to model complicated interactions in the system became increasingly opaque.&lt;/p&gt;
&lt;p&gt;For the era in which it was written, this problem mattered a lot less. If it takes you 6 to 8 weeks to get a server even ordered, then another week to get it racked, stacked, and the OS installed, the fact that Cfengine needs to run 3 times to configure it doesn&amp;#8217;t matter very much. (You have lots of bigger problems!)  In a world where many of us can go from bare-metal to running operating system in 5 minutes, either via our own install systems or an &lt;span class="caps"&gt;API&lt;/span&gt; call to &lt;span class="caps"&gt;AWS&lt;/span&gt;, it starts to matter a whole lot.&lt;/p&gt;
&lt;p&gt;Chef takes a different approach.  We start with the idea of an idempotent &amp;#8220;resource&amp;#8221; &amp;#8211; a package, a service, etc.  We add the idea of &amp;#8220;actions&amp;#8221; &amp;#8211; these are all the different states you might want to request a resource to be in.  Then you put these resources into &amp;#8220;recipes&amp;#8221;, which are evaluated in the order they are written. You can then have recipes rely on other recipes having completed before they are run, giving you the ability to say &amp;#8220;make sure Apache is installed before you configure my Web Application&amp;#8221;.&lt;/p&gt;
&lt;p&gt;The goal is that, with Chef, you can always bring the system into the proper state with a single Chef run.  It sees convergence as a response to a bug &amp;#8211; a system that is 1/2 configured is, in fact, broken.  If the cause of the bug is environmental &amp;#8211; a network service is not available, for example &amp;#8211; then running Chef again will likely fix things.  If the issue is that you haven&amp;#8217;t specified the order that you want resources to be configured in, though, then it&amp;#8217;s a bug in your recipes.  If you can&amp;#8217;t write a recipe to configure your system in a single Chef run, it&amp;#8217;s a bug in Chef.&lt;/p&gt;
&lt;p&gt;This also has side-effects for reasoning about the system at scale. Given the same configuration and attributes, Chef will always behave the same way, on every system.  As you add more and more things to the system, it&amp;#8217;s still easy to reason about when, and how, they will be configured.&lt;/p&gt;
&lt;p&gt;Interestingly enough, Cfengine 3 implements a system that is very similar to Chef.  Rather than a single global actionsequence, it uses a &amp;#8216;bundlesequence&amp;#8217;, where bundles are roughly analogous to Chef&amp;#8217;s concept of a recipe.&lt;/p&gt;
&lt;p&gt;Another major difference is that Chef allows you to &amp;#8216;look up&amp;#8217; at your entire infrastructure when configuring a system.  This ability comes in handy when you want to do things like configure a monitoring system, or a load balancer.  You can ask Chef questions like &amp;#8220;what are all the servers running my application in production&amp;#8221;, and use the response to configure your system. (You can see an example of this on &lt;a href="http://www.opscode.com/blog/2009/10/07/preview-chef-0-8-and-the-opscode-platform/"&gt;our blog&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;From a systems architecture point of view, Chef and Cfengine are actually fairly similar.  They both push the majority of the hard work of configuring a system out to the systems themselves.  This is highly advantageous at scale &amp;#8211; the Chef and Cfengine servers are really glorified file transfer systems.&lt;/p&gt;
&lt;p&gt;We differ pretty deeply on our approach to what a language for configuration management should look like, but I&amp;#8217;ll talk more about that in a later question.&lt;/p&gt;
&lt;p&gt;Cfengine is at work in some of the largest data centers in the industry, and it fundamentally altered the landscape of systems management.  While it&amp;#8217;s not the tool I want anymore, you can&amp;#8217;t understate the impact it&amp;#8217;s had on the design of every configuration management tool that came after it &amp;#8211; including Chef.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Chef has a lot of components to it. Could you briefly describe all the main components that work together? The client side, the server side, cookbooks?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Opscode:&lt;/strong&gt; Sure!  The most important part of Chef is the cookbooks &amp;#8211; they are where you actually describe your configuration.  They collect recipes, and all the assets needed for the recipe to run (files, templates, etc.).  &lt;a href="http://cookbooks.opscode.com"&gt;Cookbooks&lt;/a&gt; are very often share-able, and lots of cookbooks already exist.&lt;/p&gt;
&lt;p&gt;Chef can run your cookbooks in two modes &amp;#8211; a client/server mode (chef-client), or a stand-alone mode (chef-solo).  When you run chef-solo, you pass a &lt;span class="caps"&gt;URL&lt;/span&gt; to a tarball full of the cookbooks you want to have run.  There is no more infrastructure than that &amp;#8211; put your tarballs someplace you can download them, and go nuts.&lt;/p&gt;
&lt;p&gt;In client/server mode, each Chef client is configured to talk to a Chef Server.  The Server stores information about each client (a whole lot of it &amp;#8211; things like IP addresses, loaded kernel modules, and more), and distributes the cookbooks they need to configure themselves.  It also provides a &lt;span class="caps"&gt;REST&lt;/span&gt; &lt;span class="caps"&gt;API&lt;/span&gt; and an interactive Web UI, so you can easily alter the configuration of your systems centrally. Finally, all the data the server collects is indexed and searchable &amp;#8211; you can then use this in your recipes to configure services that require complex, dynamic configuration. (Some examples would be dynamically discovering a master MySQL server, or finding all the memcached servers in a cluster)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; What would you say about Chef&amp;#8217;s maturity? CFEngine has more than a decade of usage, which is difficult to beat. Would you say that it&amp;#8217;s &amp;#8220;mature enough&amp;#8221;? Meaning, it&amp;#8217;s already in production in companies of many sizes, its APIs don&amp;#8217;t change too much and my cookbooks will probably work if I upgrade to newer version of Chef?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Opscode:&lt;/strong&gt; Chef is a little over a year old &amp;#8211; it was first released to the public on January 15th, 2009.  Since then, 42 different developers have committed to the &lt;a href="https://www.ohloh.net/p/opscode-chef/factoids/2025809"&gt;project&lt;/a&gt;, around 5 of whom work for Opscode.  It&amp;#8217;s been in production use in the Engine Yard Cloud from the day it was released.  Since then, it&amp;#8217;s seen adoption by companies and universities of all different sizes, from small startups to huge enterprises with very heavy compliance requirements.&lt;/p&gt;
&lt;p&gt;So it&amp;#8217;s definitely &amp;#8220;mature enough&amp;#8221; for real world use &amp;#8211; lots of people are using it, and relying on it, every day.  Balancing that knowledge with the reality that the project is fast moving and evolving is important, and we try and do it in a number of ways:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;The recipe syntax is considered basically &amp;#8220;complete&amp;#8221;.  If we do make changes, they are backwards compatible to previous Chef releases. Short of something truly amazing coming along that radically alters the shape of the universe, this will remain true.&lt;/li&gt;
	&lt;li&gt;We test a lot.  Chef has over 2000 unit tests, and functional tests that cover the entirety of the &lt;span class="caps"&gt;REST&lt;/span&gt; &lt;span class="caps"&gt;API&lt;/span&gt;, and much of the individual resources (we&amp;#8217;re aiming for 100% feature test coverage.) There are more lines of code testing chef than there are lines of code in Chef proper.&lt;/li&gt;
	&lt;li&gt;If we do break backwards compatibility, we try and make it happen only when we bump the minor revision.  If you have an 0.7.x version of Chef installed, it should always work with other versions of Chef in the same release cycle.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Most of the work in Chef currently is around adding more functionality, not in changing the way existing functionality works. It&amp;#8217;s safe to use Chef today &amp;#8211; in the future, you&amp;#8217;ll just keep getting more good sauce to add to the mix, rather than having to deeply re-factor the way you do things.&lt;/p&gt;
&lt;p&gt;Finally, the Chef Community is truly epically great &amp;#8211; we have lots of people who are spending significant amounts of their time with Chef. Even if they aren&amp;#8217;t contributing code, they are answering questions, they are writing documentation, they are hanging out on &lt;span class="caps"&gt;IRC&lt;/span&gt; and offering you cupcakes.  It&amp;#8217;s a group of people that are focused on solving real world problems, and helping each other to do the same. It&amp;#8217;s by far what I&amp;#8217;m proudest of, and I think it has a significant impact on whether Chef is ready for prime time.  The bench is really, really deep.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Chef uses Ruby directly, which some would say it&amp;#8217;s both a blessing and a curse. It&amp;#8217;s probably perfect for Rubists, but I feel that most sysadmins are used to Bash, Python and are not very flexible on change. Why did you choose to use Ruby instead of a simpler language?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Opscode:&lt;/strong&gt; The answer to the question of why we use Ruby directly for the configuration language comes in two parts: why we extended a 3GL rather than build a declarative &lt;span class="caps"&gt;DSL&lt;/span&gt; or a complete modeling language, and why we chose Ruby as that 3GL.&lt;/p&gt;
&lt;p&gt;First, why we extended a 3GL.  Tools like Cfengine and Puppet build a declarative &lt;span class="caps"&gt;DSL&lt;/span&gt; for configuration management &amp;#8211; a custom language, which provides a model within which systems administrators or software developers can work to automate their system.  Other tools like Elastra&amp;#8217;s &lt;span class="caps"&gt;EDML&lt;/span&gt; and &lt;span class="caps"&gt;ECML&lt;/span&gt;, OpsWare&amp;#8217;s &lt;span class="caps"&gt;DCML&lt;/span&gt;, or Bcfg2 give you an &lt;span class="caps"&gt;XML&lt;/span&gt; schema to describe how the system should behave.&lt;/p&gt;
&lt;p&gt;The issue with these approaches is that, by definition, they must build an abstraction for every task the end-user may want to perform: an impossible feat.  The level of complexity inherent in automation, coupled with the inability to break out to 3GL language constructs when necessary, result in a system that can only target a subset of the total complexity, rather than enable users to find innovative solutions to their specific problems. By leveraging Ruby, adding support for other use cases is a matter of adding new sets of base classes while maintaining consistency and approachability in their interface design, because the full scope of the language is available.&lt;/p&gt;
&lt;p&gt;Our goal with Chef was to keep the simplicity that comes from having the focus be on idempotent resource declaration, while giving you the flexibility of a full 3GL.  In practical terms, anything you can do with Ruby you can do with Chef &amp;#8211; and since Ruby is a 3GL, that amounts to essentially anything.&lt;/p&gt;
&lt;p&gt;Larry Wall, the creator of Perl, has a quote that I love:&lt;/p&gt;
&lt;blockquote&gt;&amp;#8220;For most people the perceived usefulness of a computer language is inversely proportional to the number of theoretical axes the language intends to grind.&amp;#8221;&lt;/blockquote&gt;
&lt;p&gt;Since we wanted Chef to have the maximum amount of usefulness, we have actively tried to remove as many theoretical axes as possible &amp;#8211; a belief that we can imagine the total breadth of the problem space being one of them.  There is more than one way to do it with Chef, and the only valid criteria for rating the success of your automation project is whether it solves your problems in a reliable way.&lt;/p&gt;
&lt;p&gt;In practice, you need to know very little Ruby to use Chef. Here is an example of installing the program &amp;#8220;screen&amp;#8221;:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;package &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;screen&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;  action &lt;span class="sy"&gt;:install&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;The same thing in Puppet:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;package { &amp;quot;screen&amp;quot;: &lt;tt&gt;
&lt;/tt&gt;  ensure =&amp;gt; present &lt;tt&gt;
&lt;/tt&gt;}&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;And in Cfengine 2:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;packages:&lt;tt&gt;
&lt;/tt&gt;  screen action=install&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;While all of these systems require learning the syntax, at a base level, there isn&amp;#8217;t much difference between them in terms of raw learning required.  The difference is that when you hit a limitation in Chef, you have the ability to innovate easily, and when you hit those same limitations in other tools, you do not.&lt;/p&gt;
&lt;p&gt;We chose Ruby because of it&amp;#8217;s fairly unique ability to create new syntax easily.  Tools like Rspec are fine examples of ways you can manipulate Ruby for fun and profit that are very difficult to duplicate in other tools.  We wanted to make sure that, even though you were &amp;#8220;in&amp;#8221; a 3GL, you didn&amp;#8217;t have to go through any extra hoops to make the simple things work.  Ruby was the language that I was comfortable enough in, that I knew had the ability, to make that a reality.&lt;/p&gt;
&lt;p&gt;That said, one of our goals is to extend the ability to write Chef recipes into other 3GL&amp;#8217;s.  We have an example of doing this already with Perl &amp;#8211; and we made no changes to the Chef source to accomplish it.  You can see the &lt;a href="http://search.cpan.org/~holoway/Chef-0.01/lib/Chef.pm"&gt;demo here on &lt;span class="caps"&gt;CPAN&lt;/span&gt;&lt;/a&gt;.  It works by using Chef&amp;#8217;s &lt;span class="caps"&gt;JSON&lt;/span&gt; &lt;span class="caps"&gt;API&lt;/span&gt; to ship the compiled resources over to the Ruby library for execution, and over time we&amp;#8217;ll be extending those interfaces.  You&amp;#8217;ll be able to have recipes written in Python interoperating with recipes written in Ruby and Perl.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Does Chef have (or for that matter, need) something like Augeas, which Puppet is trying to support?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Opscode:&lt;/strong&gt; Augeas is neat.  Chef doesn&amp;#8217;t have Augeas support today, and the reason is that nobody has needed it badly enough to write the integration.  One reason is that, with Chef, it is quite easy to dynamically add to a resource (like, say, a template) or search for particular systems that match a criteria.  This means that the use-case for Augeas (which edits files in place) is less necessary &amp;#8211; you can often get the data you need to render a template, rather than needing to build it up over time with incremental edits.&lt;/p&gt;
&lt;p&gt;We think this is a better practice in general, as it ensures that all the systems you are managing can always be restored to a working state from nothing but the cookbook repository. If you use Augeas to allow idempotent changes of individual lines of a configuration file, it encourages the behavior of individual administrators editing files in place, which is a configuration management anti-pattern.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Sysadmins used to CFEngine complain about Ruby&amp;#8217;s dependencies and overall weight. Because for Chef to run you need Ruby installed. Not all distros have Ruby in the same version (although most already migrated to 1.8.7). Then you have the problem of weight. I am not familiar with Chef, but Puppet can grow to hundreds of megabytes. What they don&amp;#8217;t want is to have clusters of Chef machines (which, by themselves, also need maintenance, adding to the overall complexity). How do you deal with datacenters with thousands of servers? I know it&amp;#8217;s difficult to measure precisely, but what would be a reasonable ratio between Chef servers x managed servers?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Opscode:&lt;/strong&gt; When you are evaluating the scalability of configuration management systems, you want to look at two different axis.  The horizontal one, which is the number of systems that can be managed by a single configuration management server at a particular rate of change, and the vertical, which is how much of your infrastructure can be automated by the tool.&lt;/p&gt;
&lt;p&gt;On the vertical axis, I think Chef is the clear winner, for reasons I think are pretty well summed up by my answer to question 7. I would put Puppet second, and Cfengine last.&lt;/p&gt;
&lt;p&gt;On the horizontal axis, Cfengine is the clear winner.  It&amp;#8217;s written in C, and it has the thinnest possible server component &amp;#8211; it does nothing but authenticate clients and serve files, essentially. I know first hand of data-centers that are running huge numbers of servers off a single cfengine server.&lt;/p&gt;
&lt;p&gt;One important metric to keep in mind when discussing the horizontal scalability of a configuration management solution is that the most important metric is the &lt;strong&gt;rate of change&lt;/strong&gt;.  All the tools we&amp;#8217;ve been talking about are &amp;#8216;pull&amp;#8217; based &amp;#8211; the clients check in at an &amp;#8216;interval&amp;#8217; with the server, and apply a &lt;em&gt;&amp;#8216;splay&amp;#8217;&lt;/em&gt; to ensure that not all the systems check in at once.  A common out of the box configuration is an interval of 30 minutes, with a splay of 15 minutes. (This means a server checks in every 30-45 minutes, depending.)  If you are comfortable increasing that interval, you will get more scalability out of fewer resources (by lowering the amount of concurrency.)&lt;/p&gt;
&lt;p&gt;So when anyone says &amp;#8220;I have 10 thousand servers on a single configuration management server&amp;#8221;, ask them &amp;#8220;at what interval?&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Chef scales like a web application.  The server itself is quite thin, and is responsible for authenticating clients, transferring files, storing node state, and providing a search interface.  It scales horizontally by adding new Chef Servers as necessary.  The &lt;span class="caps"&gt;API&lt;/span&gt; is RESTful, and there is no session state between the clients and the server. (At least not in Chef 0.8+)  When you encounter scalability problems with Chef, the tools you apply are the same ones you apply to any well designed web application.&lt;/p&gt;
&lt;p&gt;You asked specifically about memory utilization &amp;#8211; Chef does quite well in this regard.  Individual server processes usually are between 14-50MB resident.  The client itself, running in daemon mode, is usually around 28MB resident.&lt;/p&gt;
&lt;p&gt;In our testing, the current bottleneck in a Chef server is &lt;span class="caps"&gt;CPU&lt;/span&gt;.  Chef is smart about how it handles file transfers &amp;#8211; we only transfer files that have changed on the server.  To support this we calculate a checksum for each file requested, and we currently don&amp;#8217;t cache the results.  We&amp;#8217;re planning on fixing this for the next major release of Chef (0.8.0) which should shift the bottleneck over to &lt;span class="caps"&gt;RAM&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;With Chef 0.7, you should be able to support thousands of clients at a half-hour interval and fifteen minute splay on reasonable commodity hardware.  The changes in Chef 0.8 should bring that number up dramatically &amp;#8211; I&amp;#8217;ll get back to you with some benchmarks once the patches are in. :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Probably related to the previous question, seems like specially after Sarbanes Oxley there&amp;#8217;s been an increasing interest in stuff such as &lt;span class="caps"&gt;ITIL&lt;/span&gt;, CoBit. Have you ever seen successful implementations of those in the Web-style infrastructure? I mean, I can see them succeeding in Banks, Aerospace and Defense, etc but I fail to see them working as advertised in a very dynamic environment such as Web services hosting. What are your experiences regarding this issue?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Opscode:&lt;/strong&gt; Well, I think you can think of &lt;span class="caps"&gt;ITIL&lt;/span&gt; in the same way you think about the classic &amp;#8216;Waterfall&amp;#8217; model of software development. For some kinds of projects and companies, it is essential &amp;#8211; it&amp;#8217;s hard to imagine working a different way.  Most often these are companies with huge manufacturing or quality control concerns &amp;#8211; medical health, aerospace, banking and finance, etc.&lt;/p&gt;
&lt;p&gt;The same thing applies to &lt;span class="caps"&gt;ITIL&lt;/span&gt; &amp;#8211; the larger the concern, and the more stringent the requirements, and the longer the lead time, the more the processes they describe start to make sense.  Like all large process, though, they tend to de-emphasize the human element &amp;#8211; people have roles to play, and forms to file. :)&lt;/p&gt;
&lt;p&gt;In the Web Ops culture, things are different.  I&amp;#8217;ve never seen a successful marriage of &lt;span class="caps"&gt;ITIL&lt;/span&gt; and Web Ops, and the reason is that the domains are so very different.  If there is a bug on the website, it&amp;#8217;s better to ship the fix now than wait for a release management process to ensure that the site won&amp;#8217;t have any more issues based on your fix, for example.  It&amp;#8217;s also a bad cultural fit &amp;#8211; in the best Web Ops teams, the focus is heavy on communication, agility, and respect, rather than process, formalism, and tooling.  The shift you start too see in the really great Web Ops companies is that their operations personel become enablers of the organization, rather than end-line blockers of change (to keep stability high.)&lt;/p&gt;
&lt;p&gt;In general, I think the 4 steps outlined in visible ops for emergency management are not bad ones, but the devil is always in the details. The guy you should really ask about this is Jesse &amp;#8211; he&amp;#8217;s largely responsible for Amazon&amp;#8217;s operational culture, and knows what it means to start hacking on that sort of thing from within huge organizations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Awesome, I think this is a wrap. Thank you very much for this interview!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fIUZ38UOckRV7Pz3xOMC1t3jj0A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fIUZ38UOckRV7Pz3xOMC1t3jj0A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fIUZ38UOckRV7Pz3xOMC1t3jj0A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fIUZ38UOckRV7Pz3xOMC1t3jj0A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=mhzFWgaWyFw:vNtGTNEVw1A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=mhzFWgaWyFw:vNtGTNEVw1A:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=mhzFWgaWyFw:vNtGTNEVw1A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=mhzFWgaWyFw:vNtGTNEVw1A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=mhzFWgaWyFw:vNtGTNEVw1A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=mhzFWgaWyFw:vNtGTNEVw1A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=mhzFWgaWyFw:vNtGTNEVw1A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/mhzFWgaWyFw" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/11/18/chatting-with-adam-jacob</feedburner:origLink></item><item><title>Chatting with Luke Kanies</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/IVtYLofEroY/chatting-with-luke-kaines</link><pubDate>Wed, 18 Nov 2009 07:45:32 PST</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5228</guid><description>&lt;p&gt;Configuration Management is a tricky subject. For non-starters, when you&amp;#8217;re a developer and you have few boxes to take care of, you can usually get away with just managing them manually. People are probably just used to pop in a CD, double-click the &amp;#8220;install&amp;#8221; program and click &amp;#8220;next&amp;#8221;, &amp;#8220;next&amp;#8221; until the end, then you manually log in to backup (when you remember it), and sometimes you do apply some security updates when you remember about them.&lt;/p&gt;
&lt;p&gt;But then you have more than a dozen machines, things start to get uglier, you end up making more mistakes, forgetting important steps, and all of a sudden managing machines become a nightmare. You end up being woken up in the middle of the night because you forgot to install some crucial component, and so on and so forth.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="/assets/2009/11/18/pic2_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The same way you need testing, continuous integration tools when you&amp;#8217;re a developer, you also need automated, reliable and flexible tools for the system administrator role. That&amp;#8217;s where tools such as &lt;strong&gt;Puppet&lt;/strong&gt; kick in to help.&lt;/p&gt;
&lt;p&gt;This time I&amp;#8217;ve interviewed &lt;a href="http://twitter.com/puppetmasterd"&gt;Luke Kanies&lt;/a&gt;, from &lt;a href="http://reductivelabs.com/"&gt;Reductive Labs&lt;/a&gt;, former contributor to the famous CFEngine tool and creator of &lt;a href="http://github.com/reductivelabs/puppet"&gt;Puppet&lt;/a&gt;, one of the most acclaimed configuration management tool for 21st century datacenters.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; To kick start this interview, it would be great to have more background info about you. So, how did you end up in the configuration management field? I understand that you have a long history with CFEngine development, right?&lt;/p&gt;
&lt;div style="float: right; margin: 3px"&gt;&lt;img src="/assets/2009/11/18/luke_kanies_portrait_original.jpg" alt="" /&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Luke:&lt;/strong&gt; I was a Unix admin going back to 1997, always writing scripts and tools to save myself time, and around 2001 I realized that I shouldn&amp;#8217;t have to write everything myself &amp;#8211; that someone somewhere should be able to save me time.  After a lot of research and experimentation, I settled on Cfengine, and had enough success with it that I started consulting, publishing, and contributing to the project.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; What&amp;#8217;s the story behind Reductive Labs, what&amp;#8217;s its mission, and what&amp;#8217;s the story for Puppet&amp;#8217;s creation?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Luke:&lt;/strong&gt; After a couple of years with Cfengine, I had a lot more insight but was frustrated because it still seemed to be too hard &amp;#8211; no one was sharing Cfengine code, and there were some problems it made you work really hard to solve.  The biggest issue, though, was that its development was very closed &amp;#8211; it was difficult to contribute much more than just bug fixes.&lt;/p&gt;
&lt;p&gt;I got frustrated enough that I stopped consulting and looked for other options.  I worked briefly at BladeLogic, a commercial software company in this space, but in the end I decided that the insight I had and the lack of a great solution were a good enough start for a business that I decided to morph my consulting company into a software company and write a new tool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; I&amp;#8217;d like to say that only amateur sysadmins do everything manually, but I think most small to medium corporations at least still do everything manually or with random scripts spread all over the place. The notion of &amp;#8220;configuration management&amp;#8221; is still new to a lot of people. Could you briefly explain what it is, and why it is important?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Luke:&lt;/strong&gt; It&amp;#8217;s surprisingly difficult to describe it succintly, but for me, there are two key rules:  You shouldn&amp;#8217;t need to connect directly to a given machine to change its configuration, and you should be able to redeploy any machine on your network very quickly.&lt;/p&gt;
&lt;p&gt;These two rules combine to require comprehensive automation and/or centralization for everything that goes into making a machine work.  Annoyingly, they also immediately introduce dependency cycles, because your automation server needs to be able to build itself, which is always a bit of a challenge.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; I think one of the most widely used system is CFEngine2. How does Puppet compare with it? Meaning, what do I have as value added when switching to Puppet, and what are the known caveats?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Luke:&lt;/strong&gt; There are multiple important functional differences.  The biggest is Puppet&amp;#8217;s &lt;strong&gt;Resource Abstraction Layer&lt;/strong&gt;, which allows Puppet users to avoid a lot of the detail they don&amp;#8217;t really care about, like how rpm, adduser, or init scripts work &amp;#8211; they talk about users, groups, and packages, and Puppet figures out the details.&lt;/p&gt;
&lt;p&gt;We also have explicit dependency support, which makes a huge difference &amp;#8211; it&amp;#8217;s easy to order related resources and restart services when their configuration files change, for instance.&lt;/p&gt;
&lt;p&gt;The language is also a bit more powerful. Like Cfengine, we have a simple custom language, but Puppet&amp;#8217;s language provides better support for heterogeneity, along with a composite resource construct that allows you to easily build in-language resource types like Apache virtual hosts that model more complex resources consisting of multiple simple resources.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Puppet has a lot of components. Could you briefly describe some of the main ones that work together? The client side, the server side, recipes?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Luke:&lt;/strong&gt; Most people use Puppet in client/server mode, where the central server is the only machine that has access to all of the code, and it runs a process capable of compiling that code into host-specific configurations. Then each machine runs a client (including the server), which then retrieves and applies that host-specific configuration.  This has nice security implications because you&amp;#8217;ve not shipped your code to every machine on your network.&lt;/p&gt;
&lt;p&gt;If this model doesn&amp;#8217;t work for you, though, it&amp;#8217;s also easy to run Puppet stand-alone, where each machine has all of the code and compiles it separately.  Multiple Puppet users do this for various reasons.  This stand-alone &amp;#8216;puppet&amp;#8217; executable is a standard interpreter &amp;#8211; it can be used to run 1 line scripts or thousands of lines in a complete configuration.&lt;/p&gt;
&lt;p&gt;Beyond this, we&amp;#8217;ve got a few other interesting executables, such as to access our certificate authority functionality, and an interesting executable called &amp;#8216;ralsh&amp;#8217; that provides a simple way to directly manage resources from the Unix shell, without having to write a separate script.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; What would you say about Puppet&amp;#8217;s maturity? CFEngine has more than a decade of usage, which is difficult to beat. Would you say that it&amp;#8217;s &amp;#8220;mature enough&amp;#8221;? Meaning, it&amp;#8217;s already in production in companies of many sizes, its APIs don&amp;#8217;t change too much and my recipes will probably work if I upgrade to a newer version of Puppet? I think the 0.x version makes some people nervous :-)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Luke:&lt;/strong&gt; Really we should have called a version from 2007 1.0, but it&amp;#8217;s hard to know how stable a release is going to be until it&amp;#8217;s been out for a while. :)&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s obviously tough to match Cfengine&amp;#8217;s long life, although they&amp;#8217;re somewhat forcibly migrating to Cfengine 3, which is a complete rewrite, so that maturity isn&amp;#8217;t worth quite as much right now.&lt;/p&gt;
&lt;p&gt;However, Puppet&amp;#8217;s been in production usage around the world since 2006, and it&amp;#8217;s currently used by more large companies than I could reasonably name &amp;#8211; Twitter, Digg, Google, Sun, Red Hat, and lots more &amp;#8211; and our community and customer base consider it to be mature.  For the line came some time early last year, when I found that the vast majority of issues people had were user issues on their part, rather than some flaw or shortcoming in Puppet.&lt;/p&gt;
&lt;p&gt;In general the APIs are quite stable, and we&amp;#8217;ve done quite well, I think, at maintaining backward compatibility when the APIs have had to change.  The point about &lt;span class="caps"&gt;API&lt;/span&gt; stability in a 1.0 release isn&amp;#8217;t so much to differentiate it from previous efforts as to make a promise for the future.  This especially matters for companies like Canonical, who want a release that they can support on Ubuntu for five years.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Puppet has its own language and you can use Ruby for the advanced cases. It&amp;#8217;s probably perfect for Rubists, but I feel that most sysadmins are used to Bash, Python and are not very flexible on change. Why did you choose to use Ruby instead of a more widespread language? What do sysadmins need to realize to shift paradigms?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Luke:&lt;/strong&gt; Part of it is that most people don&amp;#8217;t really need to know any ruby to be effective with Puppet.  Sure, you can get some more power if you do, but if you&amp;#8217;re not a language person, you&amp;#8217;re perfectively functional with just Puppet.&lt;/p&gt;
&lt;p&gt;Another nice thing is that we have a pretty smooth scale in terms of Ruby knowledge &amp;#8211; you can start out writing &lt;span class="caps"&gt;ERB&lt;/span&gt; templates or five line extensions to &lt;a href="http://github.com/reductivelabs/facter"&gt;Facter&lt;/a&gt;, which is our client-side querying system, and grow smoothly through to writing custom resource types.&lt;/p&gt;
&lt;p&gt;In the end, I chose Ruby because I was most productive in it.  I likely should have chosen Python, given its speed benefit and popularity at Red Hat and other places, but I found I just couldn&amp;#8217;t write code in it.  I started thinking in Ruby after only a few hours of usage, so it was impossible for me to turn away from it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Sysadmins used to CFEngine complain about Ruby&amp;#8217;s dependencies and overall weight. Because for Puppet to run you need Ruby installed. Not all distros have Ruby in the same version (although most already migrated to 1.8.7). Then you have the problem of weight. Puppet can grow to hundreds of megabytes. What they don&amp;#8217;t want is to have clusters of Puppet machines (which, by themselves, also need maintenance, adding to the overall complexity). How do you deal with datacenters with thousands of servers? I know it&amp;#8217;s difficult to measure precisely, but what would be a reasonable ratio between Puppet servers x managed servers?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Luke:&lt;/strong&gt; It&amp;#8217;s as impossible to tell you how many clients a Puppet server can handle as it is to tell you how many clients a Rails server can handle &amp;#8211; it all depends on the complexity of the tasks.  Google scaled to 4500 client machines on a single server, but most people tend to add another server at around 500-1000 clients.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s true that it&amp;#8217;s hard to keep memory usage down in a Ruby process, but we&amp;#8217;ve made great strides in our recent releases by doing things like deduplicating strings in memory and being more efficient in our code paths.  Really, though, we&amp;#8217;ve spent a lot more time on features and bug fixing and less time on optimizing &amp;#8211; until recently, we&amp;#8217;ve been a small development team, and we just didn&amp;#8217;t have the bandwidth for it.&lt;/p&gt;
&lt;p&gt;Now that my company, Reductive Labs, has some investment, we&amp;#8217;ve been able to add three full time developers, which is going to really help in this area.&lt;/p&gt;
&lt;p&gt;As to dependencies, this is one area we break strongly from the Ruby community &amp;#8211; we don&amp;#8217;t require a single gem, other than our own Facter tool (and it&amp;#8217;s usually not shipped as a gem).  Rubyists tend not to worry too much about package dependencies &amp;#8211; they just put it in vendor, as I&amp;#8217;m fond of saying &amp;#8211; but that doesn&amp;#8217;t work when you have to deploy thousands of copies.  So yes, you might have to install Ruby, but there won&amp;#8217;t be any other dependencies you have to deal with, which greatly simplifies it.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s generally as tough to know how you&amp;#8217;ll need to size your puppetmaster as it would be to size a web server &amp;#8211; it depends on how complicated the workload is.  In general, somewhere between 500 and 5000 clients, you&amp;#8217;ll need to have a second server, but most people probably find it closer to 500.  Really, though, if you&amp;#8217;ve got 3000 clients hitting a service, you probably want to make it horizontally scalable for stability in additional to performance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Security is a big concern nowadays, Puppet was worried from the beginning on the handshake procedure between clients and server, can you describe it a little bit? Also, is there any built-in recipes for hardening machines, for example? Or at least any desires to add such tools in the future?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Luke:&lt;/strong&gt; Puppet uses standard &lt;span class="caps"&gt;SSL&lt;/span&gt; certificates for authentication and encryption, including a certificate signing phase.  By default, the client generates a key and a certificate request (&lt;span class="caps"&gt;CSR&lt;/span&gt;) and then uploads the &lt;span class="caps"&gt;CSR&lt;/span&gt; to its server.  This upload, along with the later certificate download, are the only unauthenticated connections that are allowed by default.&lt;/p&gt;
&lt;p&gt;From there, a human normally has to trigger the client&amp;#8217;s certificate to be signed, but many organizations, including Google, automatically sign client certificates because they trust their internal network.&lt;/p&gt;
&lt;p&gt;As to automatic hardening, there aren&amp;#8217;t any recipes that I&amp;#8217;m aware of right now, but it&amp;#8217;s something that I&amp;#8217;m definitely interested in. Years ago I was a big fan of &lt;span class="caps"&gt;TITAN&lt;/span&gt;, which is a hardening package for various *NIX platforms, and it was part of the inspiration to write Puppet &amp;#8211; I&amp;#8217;ve always wanted a portable, executable security policy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; The puppetmaster uses Webrick by default, but the documentation also describes using Mongrel or Passenger. Are there any real gains in using those? Is it more for convenience or do we have performance/robustness improvements?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Luke:&lt;/strong&gt; Holy cow Webrick is slow.  It&amp;#8217;s really fantastic for proof of concepts &amp;#8211; get up and running in minutes.  Once you get beyond that proof of concept, though, you really need to switch to Mongrel or Passenger. If you get more than one concurrent connection in webrick, your clients start to suffer, but you can scale to far more with the other solutions out there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Are there any clients case you are allowed to talk about? Meaning, more details on the kind of infrastructure, difficulties, caveats, best practices?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Luke:&lt;/strong&gt; The possibilities here are pretty open ended.  Google uses Puppet to maintain their corporate IT, which means they&amp;#8217;re running it on thousands of laptops and desktops which is pretty different. MessageOne, a division of Dell, is really interesting in that their developers have to ship Puppet code to manage the applications that they ship, so if an app isn&amp;#8217;t trimming its logs or backing itself up, it&amp;#8217;s a bug that the app developer has to fix rather than the sysadmin.  This really helps to bridge the divide between dev and ops, which has worked out really well for them.&lt;/p&gt;
&lt;p&gt;Otherwise, there are lots of stores and best practices, but I&amp;#8217;m afraid that would be a whole second article. :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; I&amp;#8217;ve seen Andrew Shaffer talk about &lt;a href="http://www.slideshare.net/littleidea/agile-infra-agileroots-2009"&gt;Agile Infrastructure&lt;/a&gt; for a couple of years now, but I still think most IT organizations are unaware of this concept. Can you elaborate on what does it mean to be Agile outside of the development field?&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;embed src='http://agileroots2009.confreaks.com/player.swf' height='380' width='640' allowscriptaccess='always' allowfullscreen='true' flashvars='image=images%2F15-jun-2009-14-30-agile-infrastructure-andrew-shafer-preview.png&amp;file=http%3A%2F%2Fagileroots2009.confreaks.com%2Fvideos%2F15-jun-2009-14-30-agile-infrastructure-andrew-shafer-small.mp4&amp;plugins=viral-1'/&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Luke:&lt;/strong&gt; I think Agile Infrastructure has even less adoption than Agile Development.  The vast majority of IT shops haven&amp;#8217;t changed practices significantly in years and are largely unprepared for the growth in server count that they&amp;#8217;re experiencing.  They mostly try to scale by adding more people, which we call the &lt;em&gt;meatcloud&lt;/em&gt;, rather than scaling their tools and practice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Probably related to the previous question, seems like specially after Sarbanes Oxley there&amp;#8217;s been an increasing interest in stuff such as &lt;span class="caps"&gt;ITIL&lt;/span&gt;, CoBit. Have you ever seen successful implementations of those in the Web-style infrastructure? I mean, I can see them succeeding in Banks, Aerospace and Defense, etc but I fail to see them working as advertised in a very dynamic environment such as Web services hosting. What are your experiences regarding this issue?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Luke:&lt;/strong&gt; In general, I think these kinds of high-level policies are great for filings but aren&amp;#8217;t so great for actually solving problems.  The bigger a company is and the more public they are, the more likely they are to care about &lt;span class="caps"&gt;ITIL&lt;/span&gt; et al, but it doesn&amp;#8217;t really help them solve problems outside of PR in my experience.  You can be &lt;span class="caps"&gt;ITIL&lt;/span&gt; compliant and dysfunctional, or completely out of compliance but in fantastic shape.  Considering that the best standards are derived from implementation and best practice, which few of these are, I don&amp;#8217;t have a lot of hope for these being adopted by the best shops out there.&lt;/p&gt;
&lt;p&gt;My personal experience is that very few companies ask or care about these standards, and the ones that do usually do so in a kind of checkbox way, in that they want to make sure they can check off things like &lt;span class="caps"&gt;CMDB&lt;/span&gt; but they aren&amp;#8217;t really that concerned with the specifics.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; I think this is it! Thank you very much for this conversation!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1_04PW0KmN0NI_wAzzSBES0EHeY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1_04PW0KmN0NI_wAzzSBES0EHeY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1_04PW0KmN0NI_wAzzSBES0EHeY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1_04PW0KmN0NI_wAzzSBES0EHeY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=IVtYLofEroY:_l6EQZ6rugk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=IVtYLofEroY:_l6EQZ6rugk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=IVtYLofEroY:_l6EQZ6rugk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=IVtYLofEroY:_l6EQZ6rugk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=IVtYLofEroY:_l6EQZ6rugk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=IVtYLofEroY:_l6EQZ6rugk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=IVtYLofEroY:_l6EQZ6rugk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/IVtYLofEroY" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/11/18/chatting-with-luke-kaines</feedburner:origLink></item><item><title>[Tradução] Três Contextos Implícitos em Ruby</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/DXtHKHn-oOI/traducao-tres-contextos-implicitos-em-ruby</link><pubDate>Mon, 16 Nov 2009 11:28:28 PST</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5227</guid><description>&lt;p&gt;[Tradução] Três Contextos Implícitos em Ruby&lt;/p&gt;
&lt;p&gt;A desenvolvedora japonês &lt;strong&gt;@yugui&lt;/strong&gt; &lt;a href="http://yugui.jp/articles/846"&gt;escreveu um grande complemento&lt;/a&gt; ao artigo anterior sobre metaprogramação do Yehuda, que traduzo logo abaixo:&lt;/p&gt;
&lt;p&gt;Yehuda Katz escreveu &lt;a href="http://www.akitaonrails.com/2009/11/16/traducao-metaprogramacao-em-ruby-e-tudo-sobre-self"&gt;um artigo sobre &lt;code&gt;self&lt;/code&gt; e metaclass&lt;/a&gt;. Nesse artigo ele disse que &lt;code&gt;Person.instance_eval&lt;/code&gt; associa a &lt;strong&gt;metaclass de Person&lt;/strong&gt; para &lt;code&gt;self&lt;/code&gt; para uma classe &lt;code&gt;Person&lt;/code&gt;, mas isso é obviamente errado.&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Person&lt;/span&gt;; &lt;span class="r"&gt;end&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Person&lt;/span&gt;.instance_eval{ p &lt;span class="pc"&gt;self&lt;/span&gt; }  &lt;span class="c"&gt;#=&amp;gt; Person&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Como mencionei em um &lt;a href="http://yugui.jp/articles/558"&gt;artigo antigo&lt;/a&gt;, embora eu deva me desculpar por estar escrito em japonês, Ruby sempre tem 3 contextos implícitos: self, o chamado &amp;#8216;klass&amp;#8217; e o ponto constante de definição. Yehuda está confundindo &lt;em&gt;self&lt;/em&gt; com &amp;#8216;klass&amp;#8217;.&lt;/p&gt;
&lt;h2&gt;self&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;self&lt;/code&gt; é o &lt;code&gt;self&lt;/code&gt; que você conhece. É o receptor padrão de invocação de método. Sempre existe um &lt;code&gt;self&lt;/code&gt;.&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;p &lt;span class="pc"&gt;self&lt;/span&gt;                         &lt;span class="c"&gt;# mostra &amp;quot;main&amp;quot;  &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Foo&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;bar&lt;/span&gt;(a = (p &lt;span class="pc"&gt;self&lt;/span&gt;)) &lt;span class="r"&gt;end&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;foo = &lt;span class="co"&gt;Foo&lt;/span&gt;.new  &lt;tt&gt;
&lt;/tt&gt;foo.bar                        &lt;span class="c"&gt;# mostra &amp;quot;#&amp;lt;Foo:0x471004&amp;gt;&amp;quot;  &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Foo&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Baz&lt;/span&gt; &amp;lt; (p &lt;span class="pc"&gt;self&lt;/span&gt;; &lt;span class="pc"&gt;self&lt;/span&gt;)   &lt;span class="c"&gt;# mostra &amp;quot;Foo&amp;quot;  &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;No nível superior, uma instância especial de &lt;code&gt;Object&lt;/code&gt; chamada &amp;#8220;main&amp;#8221; é o self. Onde quer que esteja, você pode recuperar o self a partir da pseudovariável &lt;code&gt;self&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Se você invocar um método sem explicitar um receptor, &lt;code&gt;self&lt;/code&gt; receberá essa invocação.&lt;/p&gt;
&lt;h2&gt;o chamado &amp;#8216;klass&amp;#8217;&lt;/h2&gt;
&lt;p&gt;Eu chamei o conceito de &amp;#8216;klass&amp;#8217; no artigo antigo, mas não sei se é o melhor nome. É a classe padrão sobre o qual o método é definido. Agora gostaria de chamá-lo &amp;#8220;definidor padrão&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Ruby sempre segura a referência a uma classe assim como ao &lt;code&gt;self&lt;/code&gt;. Mas não há maneira de recuperá-lo diretamente. É mais implícito que &lt;code&gt;self&lt;/code&gt;. Se você definir um método sem dar um receptor específico, em outras palavras, se definir um método com o jeito sintático normal de definir métodos, o definidor padrão terá o método como um método de instância.&lt;/p&gt;
&lt;h3&gt;Exemplos:&lt;/h3&gt;
&lt;p&gt;No nível superior, &lt;code&gt;Object&lt;/code&gt; é a classe. Então funções globais são igualmente métodos de instância na classe &lt;code&gt;Object&lt;/code&gt; como você já sabe.&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;hoge&lt;/span&gt;; &lt;span class="r"&gt;end&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Kernel&lt;/span&gt;.instance_method(&lt;span class="sy"&gt;:hoge&lt;/span&gt;)  &lt;span class="c"&gt;#=&amp;gt; #&amp;lt;UnboundMethod: Object#hoge&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Aliás, &amp;#8220;hoge&amp;#8221;, &amp;#8220;fuga&amp;#8221;, &amp;#8220;piyo&amp;#8221; é japonês para &amp;#8220;foo&amp;#8221;, &amp;#8220;bar&amp;#8221;, &amp;#8220;baz&amp;#8221;.&lt;/p&gt;
&lt;p&gt;A sintaxe &lt;code&gt;class&lt;/code&gt; muda ambos os &lt;code&gt;self&lt;/code&gt; e o definidor padrão para a classe que está agora sendo definida.&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;T&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;hoge&lt;/span&gt;; &lt;span class="r"&gt;end&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;T&lt;/span&gt;.instance_method(&lt;span class="sy"&gt;:hoge&lt;/span&gt;)      &lt;span class="c"&gt;#=&amp;gt; #&amp;lt;UnboundMethod: T#hoge&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Em um corpo normal de método, &lt;code&gt;self&lt;/code&gt; é o receptor de invocação de métodos e o definidor padrão é a classe sintaticamente fora dela, agora ela é &lt;code&gt;T&lt;/code&gt;.&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;T&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;hoge&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;fuga&lt;/span&gt;; &lt;span class="r"&gt;end&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;t = &lt;span class="co"&gt;T&lt;/span&gt;.new  &lt;tt&gt;
&lt;/tt&gt;t.hoge  &lt;tt&gt;
&lt;/tt&gt;t.method(&lt;span class="sy"&gt;:fuga&lt;/span&gt;)               &lt;span class="c"&gt;#=&amp;gt; #&amp;lt;Method: T#fuga&amp;gt;  &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;T&lt;/span&gt;.instance_method(&lt;span class="sy"&gt;:fuga&lt;/span&gt;)      &lt;span class="c"&gt;#=&amp;gt; #&amp;lt;UnboundMethod: T#fuga&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Não confunda isso com &lt;code&gt;def self.fuga&lt;/code&gt;, uma definição de método singleton. Quando você dá uma definição de método a um receptor, o método será adicionado à eigenclass do receiver.&lt;/p&gt;
&lt;script src="http://gist.github.com/236302.js"&gt;&lt;/script&gt;&lt;p&gt;U não tem um método de instância chamado &lt;code&gt;fuga&lt;/code&gt; porque &lt;code&gt;fuga&lt;/code&gt; é um método singleton de &lt;code&gt;u&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Onde quer que esteja, existe um definidor padrão. Quando executa um valor padrão, o definidor padrão é a classe externa assim como no corpo do método.&lt;/p&gt;
&lt;script src="http://gist.github.com/236303.js"&gt;&lt;/script&gt;&lt;p&gt;Em outras palavras, a definição &lt;code&gt;class&lt;/code&gt; muda o definidor padrão mas não a definição de método.&lt;/p&gt;
&lt;h2&gt;família eval&lt;/h2&gt;
&lt;p&gt;O que o &lt;code&gt;instance_eval&lt;/code&gt; faz é:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;mudar o &lt;code&gt;self&lt;/code&gt; para o receptor do &lt;code&gt;instance_eval&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;mudar o definidor padrão para o eigenclass do receptor&lt;br /&gt;
  * se o receptor não tiver um eigenclass ainda, cria um.&lt;/li&gt;
	&lt;li&gt;executa o bloco dado&lt;/li&gt;
&lt;/ul&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;o = &lt;span class="co"&gt;Object&lt;/span&gt;.new  &lt;tt&gt;
&lt;/tt&gt;o.instance_eval &lt;span class="r"&gt;do&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;  p &lt;span class="pc"&gt;self&lt;/span&gt;                       &lt;span class="c"&gt;#=&amp;gt; #&amp;lt;Object:0x454f24&amp;gt;  &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;hoge&lt;/span&gt;; &lt;span class="r"&gt;end&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;o.method(&lt;span class="sy"&gt;:hoge&lt;/span&gt;)                &lt;span class="c"&gt;#=&amp;gt; #&amp;lt;Method: #&amp;lt;Object:0x454f24&amp;gt;.hoge&amp;gt;  &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Object&lt;/span&gt;.instance_method(&lt;span class="sy"&gt;:hoge&lt;/span&gt;)  &lt;span class="c"&gt;# raises a NameError &amp;quot;undefined method `hoge' for class `Object'&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Vamos lá:&lt;/p&gt;
&lt;script src="http://gist.github.com/236305.js"&gt;&lt;/script&gt;&lt;p&gt;Como o &lt;code&gt;instance_eval&lt;/code&gt; muda o definidor padrão do eigenclass para &lt;code&gt;$o&lt;/code&gt;, então &lt;code&gt;fuga&lt;/code&gt; e &lt;code&gt;piyo&lt;/code&gt; serão métodos singleton de &lt;code&gt;$o&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Oops, esqueci de mencionar que:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="co"&gt;RUBY_VERSION&lt;/span&gt;               &lt;span class="c"&gt;#=&amp;gt; &amp;quot;1.9.1&amp;quot;.  &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Ruby 1.8 age de maneira mais léxica, então você acabará tendo o contrário:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="gv"&gt;$o&lt;/span&gt;.method(&lt;span class="sy"&gt;:fuga&lt;/span&gt;)           &lt;span class="c"&gt;# raises a NameError  &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="gv"&gt;$o&lt;/span&gt;.method(&lt;span class="sy"&gt;:piyo&lt;/span&gt;)           &lt;span class="c"&gt;# raises a NameError  &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;T&lt;/span&gt;.instance_method(&lt;span class="sy"&gt;:fuga&lt;/span&gt;)   &lt;span class="c"&gt;#=&amp;gt; #&amp;lt;UnboundMethod: T#fuga&amp;gt;  &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;T&lt;/span&gt;.instance_method(&lt;span class="sy"&gt;:piyo&lt;/span&gt;)   &lt;span class="c"&gt;#=&amp;gt; #&amp;lt;UnboundMethod: T#piyo&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Em Ruby 1.8, o definidor padrão no corpo do método é baseado lexicamente na definição da classe externa. De qualquer forma, tanto no Ruby 1.8 quanto 1.9, &lt;code&gt;instance_eval&lt;/code&gt; muda &lt;code&gt;self&lt;/code&gt; para o receptor, o definidor padrão a seu eigenclass.&lt;/p&gt;
&lt;p&gt;Finalmente, &lt;code&gt;class_eval&lt;/code&gt; muda ambos &lt;code&gt;self&lt;/code&gt; e o definidor padrão para o receptor:&lt;/p&gt;
&lt;table&gt;
	&lt;tr&gt;
		&lt;td&gt; &lt;/td&gt;
		&lt;td&gt; &lt;strong&gt;self&lt;/strong&gt; &lt;/td&gt;
		&lt;td&gt; &lt;strong&gt;definidor padrão&lt;/strong&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; class_eval &lt;/td&gt;
		&lt;td&gt; o receptor &lt;/td&gt;
		&lt;td&gt; o receptor &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; instance_eval &lt;/td&gt;
		&lt;td&gt; o receptor &lt;/td&gt;
		&lt;td&gt; eigenclass do receptor &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;No meu &lt;a href="http://yugui.jp/articles/558"&gt;artigo antigo&lt;/a&gt; eu discuti sobre &lt;code&gt;Kernel#eval&lt;/code&gt; e &lt;code&gt;instance_eval/class_eval&lt;/code&gt; com execução de Strings.&lt;/p&gt;
&lt;h2&gt;definição de constantes&lt;/h2&gt;
&lt;p&gt;Quando você vê uma variável de instância, ela é uma variável da instância de &lt;code&gt;self&lt;/code&gt;. Quando você usa uma variável de classe, ela é uma variável de classe da classe de &lt;code&gt;self&lt;/code&gt;; ou o próprio &lt;code&gt;self&lt;/code&gt; quando &lt;code&gt;self&lt;/code&gt; é uma classe.&lt;/p&gt;
&lt;p&gt;Mas constantes se comportam de maneira diferente. É outro contexto implícito de Ruby. O Ruby Core Team chama esse conceito de &amp;#8220;cref&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Discutiremos esse conceito de &amp;#8220;cref&amp;#8221; em outro artigo.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LmGSZOzJVKUv1fQVvdz0y_G5W8Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LmGSZOzJVKUv1fQVvdz0y_G5W8Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LmGSZOzJVKUv1fQVvdz0y_G5W8Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LmGSZOzJVKUv1fQVvdz0y_G5W8Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=DXtHKHn-oOI:OyBYv57eO1c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=DXtHKHn-oOI:OyBYv57eO1c:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=DXtHKHn-oOI:OyBYv57eO1c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=DXtHKHn-oOI:OyBYv57eO1c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=DXtHKHn-oOI:OyBYv57eO1c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=DXtHKHn-oOI:OyBYv57eO1c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=DXtHKHn-oOI:OyBYv57eO1c:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/DXtHKHn-oOI" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/11/16/traducao-tres-contextos-implicitos-em-ruby</feedburner:origLink></item><item><title>[Tradução] Metaprogramação em Ruby: é tudo sobre Self</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/ev5SACWGD3Y/traducao-metaprogramacao-em-ruby-e-tudo-sobre-self</link><pubDate>Mon, 16 Nov 2009 10:56:08 PST</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5226</guid><description>&lt;p&gt;Hoje o &lt;a href="http://yehudakatz.com/2009/11/15/metaprogramming-in-ruby-its-all-about-the-self/"&gt;Yehuda Katz&lt;/a&gt; publicou um artigo muito didático sobre metaprogramação em Ruby que achei legal traduzir. Aí vai:&lt;/p&gt;
&lt;p&gt;Depois de escrever &lt;a href="http://yehudakatz.com/2009/11/12/better-ruby-idioms/"&gt;meu último post&lt;/a&gt; sobre idiomas de plugins Rails, eu percebi que metaprogramação Ruby, no fundo, é na realidade bem simples.&lt;/p&gt;&lt;p&gt;Tem a ver com o fato de que todo código Ruby é executado &amp;#8211; não há separação entre fases de compilação e runtime, cada linha de código é executado contra um &lt;em&gt;self&lt;/em&gt; particular. Considere os próximos 5 trechos de código:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;15&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;25&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Person&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="pc"&gt;self&lt;/span&gt;.species&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Homo Sapien&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Person&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;class&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class="cl"&gt;self&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;species&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Homo Sapien&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;class&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class="cl"&gt;Person&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;species&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Homo Sapien&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Person&lt;/span&gt;.instance_eval &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;species&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Homo Sapien&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="co"&gt;Person&lt;/span&gt;.species&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Homo Sapien&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Todos os 5 trechos definem um &lt;code&gt;Person.species&lt;/code&gt; que retornam &lt;code&gt;Homo Sapiens&lt;/code&gt;. Agora considere outro conjunto de trechos:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Person&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;name&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Matz&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Person&lt;/span&gt;.class_eval &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;name&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Matz&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Todos esses trechos definem um método chamado &lt;code&gt;name&lt;/code&gt; na classe Person. Então &lt;code&gt;Person.new&lt;/code&gt; retornará &amp;#8220;Matz&amp;#8221;. Para aqueles familiarizados com Ruby, isso não é novidade. Quando se aprende sobre metaprogramação, cada um desses trechos é apresentado de forma isolada: outro mecanismo para colocar métodos onde eles &amp;#8220;pertencem&amp;#8221;. Na verdade, entretanto, existe uma única explicação unificada de porque todos esses trechos de cóigo funcionam da forma como funcionam.&lt;/p&gt;
&lt;p&gt;Primeiro, é importante entender como a metaclasse de Ruby funciona. Quando você aprende Ruby, você aprende sobre o conceito de classe, e que cada objeto de Ruby tem um:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Person&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Person&lt;/span&gt;.class &lt;span class="c"&gt;#=&amp;gt; Class&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Class&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;loud_name&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;name.upcase&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;!&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Person&lt;/span&gt;.loud_name &lt;span class="c"&gt;#=&amp;gt; &amp;quot;PERSON!&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&lt;code&gt;Person&lt;/code&gt; é uma instância de &lt;code&gt;Class&lt;/code&gt;, então qualquer método adicionado a &lt;code&gt;Class&lt;/code&gt; está disponível em &lt;code&gt;Person&lt;/code&gt; também. O que não lhes é dito, entretanto, é que cada objeto em Ruby também tem seu próprio &lt;strong&gt;metaclass&lt;/strong&gt;, uma &lt;code&gt;Class&lt;/code&gt; que pode ter métodos, mas está anexado apenas ao objeto.&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;matz = &lt;span class="co"&gt;Object&lt;/span&gt;.new&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; matz.speak&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Place your burden to machine's shoulders&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;O que está acontecendo é que estamos adicionando o método &lt;code&gt;speak&lt;/code&gt; à &lt;strong&gt;metaclass&lt;/strong&gt; de &lt;code&gt;matz&lt;/code&gt;, e o objeto &lt;code&gt;matz&lt;/code&gt; herda de sua &lt;strong&gt;metaclass&lt;/strong&gt; e depois de &lt;code&gt;Object&lt;/code&gt;. A razão de porque isso não é tão claro é porque o metaclass é invisível em Ruby:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;matz = &lt;span class="co"&gt;Object&lt;/span&gt;.new&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; matz.speak&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Place your burden to machine's shoulders&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;matz.class &lt;span class="c"&gt;#=&amp;gt; Object&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Na verdade, a &amp;#8220;classe&amp;#8221; de &lt;code&gt;matz&lt;/code&gt; é sua metaclass invisível. Podemos ter acesso a essa metaclass assim:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;metaclass = &lt;span class="r"&gt;class&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class="cl"&gt;matz&lt;/span&gt;; &lt;span class="pc"&gt;self&lt;/span&gt;; &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;metaclass.instance_methods.grep(&lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;speak&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;/span&gt;) &lt;span class="c"&gt;#=&amp;gt; [&amp;quot;speak&amp;quot;]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Até este ponto, você provavelmente está tendo que se esforçar para ter tantos detalhes na cabeça; parece que existem regras demais. E que diabos é isso de &lt;code&gt;class &amp;lt;&amp;lt; matz&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Acontece que todas essas regras esquisitas se resumem em um conceito simples: controle sobre o &lt;code&gt;self&lt;/code&gt; em uma determinada parte do código. Vamos retornar à um dos trechos que já vimos antes:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Person&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;name&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Matz&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="pc"&gt;self&lt;/span&gt;.name &lt;span class="c"&gt;#=&amp;gt; &amp;quot;Person&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Aqui, estamos adicionando o método &lt;code&gt;nome&lt;/code&gt; à classe &lt;code&gt;Person&lt;/code&gt;. Quando dizemos &lt;code&gt;class Person&lt;/code&gt;, o &lt;code&gt;self&lt;/code&gt; até o fim do bloco é a própria classe &lt;code&gt;Person&lt;/code&gt;.&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="co"&gt;Person&lt;/span&gt;.class_eval &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;name&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Matz&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="pc"&gt;self&lt;/span&gt;.name &lt;span class="c"&gt;#=&amp;gt; &amp;quot;Person&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Aqui, estamos fazendo exatamente a mesma coisa: adicionando o método &lt;code&gt;name&lt;/code&gt; a instâncias da classe Person. Neste caso, &lt;code&gt;class_eval&lt;/code&gt; deixa o &lt;code&gt;self&lt;/code&gt; ser o &lt;code&gt;Person&lt;/code&gt; até o fim do bloco. Isso é perfeitamento direto quando se lida com classes, e igualmente direto quando se lida com metaclasses:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="co"&gt;Person&lt;/span&gt;.species&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Homo Sapien&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Person&lt;/span&gt;.name &lt;span class="c"&gt;#=&amp;gt; &amp;quot;Person&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Como no exemplo do &lt;code&gt;matz&lt;/code&gt; anteriormente, estamos definindo o método &lt;code&gt;species&lt;/code&gt; à metaclass de &lt;code&gt;Person&lt;/code&gt;. Nós não manipulamos &lt;code&gt;self&lt;/code&gt;, mas você pode ver o uso de &lt;code&gt;def&lt;/code&gt; num objeto anexa o método à metaclass desse objeto.&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Person&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="pc"&gt;self&lt;/span&gt;.species&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Homo Sapien&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="pc"&gt;self&lt;/span&gt;.name &lt;span class="c"&gt;#=&amp;gt; &amp;quot;Person&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Aqui, abrimos a classe &lt;code&gt;Person&lt;/code&gt;, fazendo o &lt;code&gt;self&lt;/code&gt; ser &lt;code&gt;Person&lt;/code&gt; pela duração do bloco, como no exemplo acima. Entretanto, estamos definindo um método à metaclasse de &lt;code&gt;Person&lt;/code&gt; aqui, já que estamos definindo o método em um objeto (&lt;code&gt;self&lt;/code&gt;). Você também pode ver que &lt;code&gt;self.name&lt;/code&gt; enquanto dentro da classe Person é idêntico a &lt;code&gt;Person.name&lt;/code&gt; enquanto fora dela.&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="r"&gt;class&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class="cl"&gt;Person&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;species&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Homo Sapien&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="pc"&gt;self&lt;/span&gt;.name &lt;span class="c"&gt;#=&amp;gt; &amp;quot;&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Ruby dá uma sintaxe para acessar a metaclass de um objeto diretamente. Fazendo &lt;code&gt;class &amp;lt;&amp;lt; Person&lt;/code&gt;, estamos fazendo o &lt;code&gt;self&lt;/code&gt; ser a metaclass de &lt;code&gt;Person&lt;/code&gt; pela duração do bloco. Como resultado, o método &lt;code&gt;species&lt;/code&gt; é adicionado à metaclass de &lt;code&gt;Person&lt;/code&gt;, em vez da classe propriamente dita.&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Person&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;class&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class="cl"&gt;self&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;species&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Homo Sapien&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;    &lt;span class="pc"&gt;self&lt;/span&gt;.name &lt;span class="c"&gt;#=&amp;gt; &amp;quot;&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Aqui, combinamos diversas técnicas. Primeiro, abrimos &lt;code&gt;Person&lt;/code&gt;, tornando &lt;code&gt;self&lt;/code&gt; igual à classe &lt;code&gt;Person&lt;/code&gt;. Em seguida, fazemos &lt;code&gt;class &amp;lt;&amp;lt; self&lt;/code&gt;, tornando &lt;code&gt;self&lt;/code&gt; igual à metaclass de &lt;code&gt;Person&lt;/code&gt;. Quando definimos o método &lt;code&gt;species&lt;/code&gt;, ela é definida na metaclass de &lt;code&gt;Person&lt;/code&gt;.&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="co"&gt;Person&lt;/span&gt;.instance_eval &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;species&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Homo Sapien&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="pc"&gt;self&lt;/span&gt;.name &lt;span class="c"&gt;#=&amp;gt; &amp;quot;Person&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;O último caso, &lt;code&gt;instance_eval&lt;/code&gt; na realidade faz algo interessante. Ela quebra o &lt;code&gt;self&lt;/code&gt; no &lt;code&gt;self&lt;/code&gt; que é usado para executar métodos e o &lt;code&gt;self&lt;/code&gt; que é usado quando novos métodos são definidos. Quando &lt;code&gt;instance_eval&lt;/code&gt; é usado, novos métodos são definidos na &lt;strong&gt;metaclass&lt;/strong&gt;, mas o &lt;code&gt;self&lt;/code&gt; é o próprio objeto.&lt;/p&gt;
&lt;p&gt;Em alguns desses casos, as múltiplas formas de atingir a mesma coisa sai naturalmente da semântica de Ruby. Depois desta explicação, deve ficar claro que &lt;code&gt;def Person.species&lt;/code&gt;, &lt;code&gt;class &amp;lt;&amp;lt; Person; def species,&lt;/code&gt; e &lt;code&gt;class Person; class &amp;lt;&amp;lt; self; def species&lt;/code&gt; não são três maneiras de fazer a mesma coisa que nasceram juntas, mas elas acabam saindo da própria flexibilidade do Ruby em relação a o que o &lt;code&gt;self&lt;/code&gt; é em determinado ponto do seu programa.&lt;/p&gt;
&lt;p&gt;Por outro lado, &lt;code&gt;class_eval&lt;/code&gt; é um pouco diferente. Porque ele recebe um bloco, em vez de agir como uma palavra-reservada, ela captura as variáveis locais ao redor dela. Isso fornece a possibilidade poderosas capacidades de DSLs, em adição a controlar o &lt;code&gt;self&lt;/code&gt; usado em um bloco de código. Mas além disso, ele é idêntico às outras construções aqui.&lt;/p&gt;
&lt;p&gt;Finalmente, &lt;code&gt;instance_eval&lt;/code&gt; quebra o &lt;code&gt;self&lt;/code&gt; em duas partes, ao mesmo tempo que dá acesso a variáveis definidas fora dela.&lt;br /&gt;
Na tabela a seguir, &lt;em&gt;define um novo escopo&lt;/em&gt; significa que código dentro do bloco &lt;strong&gt;não&lt;/strong&gt; tem acesso a variáveis locais fora do bloco.&lt;/p&gt;
&lt;table&gt;
	&lt;tr&gt;
		&lt;td&gt; &lt;strong&gt;mecanismo&lt;/strong&gt; &lt;/td&gt;
		&lt;td&gt; &lt;strong&gt;método de resolução&lt;/strong&gt; &lt;/td&gt;
		&lt;td&gt; &lt;strong&gt;definição de método&lt;/strong&gt; &lt;/td&gt;
		&lt;td&gt; &lt;strong&gt;novo escopo?&lt;/strong&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; &lt;strong&gt;class Person&lt;/strong&gt; &lt;/td&gt;
		&lt;td&gt; Person &lt;/td&gt;
		&lt;td&gt; mesmo &lt;/td&gt;
		&lt;td&gt; sim &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; &lt;strong&gt;class &amp;lt;&amp;lt; Person&lt;/strong&gt; &lt;/td&gt;
		&lt;td&gt; metaclass do Person &lt;/td&gt;
		&lt;td&gt; mesmo &lt;/td&gt;
		&lt;td&gt; sim &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; &lt;strong&gt;Person.class_eval&lt;/strong&gt; &lt;/td&gt;
		&lt;td&gt; Person &lt;/td&gt;
		&lt;td&gt; mesmo &lt;/td&gt;
		&lt;td&gt; não &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; &lt;strong&gt;Person.instance_eval&lt;/strong&gt; &lt;/td&gt;
		&lt;td&gt; Person &lt;/td&gt;
		&lt;td&gt; metaclass do Person &lt;/td&gt;
		&lt;td&gt; não &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Também note que &lt;code&gt;class_eval&lt;/code&gt; está apenas disponível a &lt;code&gt;Modules&lt;/code&gt; (note que Class herda de Module) e é um sinônimo para &lt;code&gt;module_eval&lt;/code&gt;. Além disso, &lt;code&gt;instance_exec&lt;/code&gt;, que foi adicionado ao Ruby 1.8.7, funciona exatamente como &lt;code&gt;instance_eval&lt;/code&gt;, exceto que ele também lhe permite enviar variáveis a um bloco.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tUkzkuFvC8OL95Tw6Rq8wX0G0DA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tUkzkuFvC8OL95Tw6Rq8wX0G0DA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tUkzkuFvC8OL95Tw6Rq8wX0G0DA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tUkzkuFvC8OL95Tw6Rq8wX0G0DA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=ev5SACWGD3Y:2_-OmSEBhxw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=ev5SACWGD3Y:2_-OmSEBhxw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=ev5SACWGD3Y:2_-OmSEBhxw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=ev5SACWGD3Y:2_-OmSEBhxw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=ev5SACWGD3Y:2_-OmSEBhxw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=ev5SACWGD3Y:2_-OmSEBhxw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=ev5SACWGD3Y:2_-OmSEBhxw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/ev5SACWGD3Y" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/11/16/traducao-metaprogramacao-em-ruby-e-tudo-sobre-self</feedburner:origLink></item><item><title>Rubistas.com.br</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/6I0_zl8clSI/rubistas-com-br</link><pubDate>Wed, 11 Nov 2009 11:22:15 PST</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5225</guid><description>&lt;p&gt;Last night I made available www.rubistas.com.br, a translation fork of the original &lt;a href="http://rubyists.eu"&gt;Rubyists.eu&lt;/a&gt;. I thought it&amp;#8217;s a great website because of its simplicity on the approach to group together communities and make them easier to find for everyone.&lt;/p&gt;
&lt;p&gt;But, I was careless. According to the &lt;a href="http://creativecommons.org/licenses/by-nc-sa/3.0/"&gt;Creative Commons License&lt;/a&gt; I failed to add proper attribution to Rock &amp;amp; Code and Rubyists.EU. So, Rock &amp;amp; Code contacted me. We talked and I agreed to cease and desist both my fork at github and the website.&lt;/p&gt;
&lt;p&gt;I was told that the way I wrote the original blog post in Portuguese (already removed) did upset some of the European collaborators. Specially the part that would translate as &lt;em&gt;&amp;#8220;&amp;#8230; it is nothing more than a Google Maps mashup.&amp;#8221;&lt;/em&gt; Again, the intention was never to be negative, quite contrary, it was to pinpoint the fact that it would not be difficult for people to collaborate.&lt;/p&gt;
&lt;p&gt;So, rubistas.com.br will remain down. I have no plans for it for the time being.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TSYbVwC_5IrgiSLwwWcJpvYRtn0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TSYbVwC_5IrgiSLwwWcJpvYRtn0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/TSYbVwC_5IrgiSLwwWcJpvYRtn0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TSYbVwC_5IrgiSLwwWcJpvYRtn0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=6I0_zl8clSI:yhGGHDVUA_U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=6I0_zl8clSI:yhGGHDVUA_U:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=6I0_zl8clSI:yhGGHDVUA_U:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=6I0_zl8clSI:yhGGHDVUA_U:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=6I0_zl8clSI:yhGGHDVUA_U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=6I0_zl8clSI:yhGGHDVUA_U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=6I0_zl8clSI:yhGGHDVUA_U:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/6I0_zl8clSI" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/11/10/rubistas-com-br</feedburner:origLink></item><item><title>[Off-Topic] Obediência à Autoridade</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/A9erYRtG2tk/off-topic-obediencia-a-autoridade</link><pubDate>Sun, 08 Nov 2009 14:50:07 PST</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5223</guid><description>&lt;p&gt;&lt;strong&gt;Atualização: 20/11&lt;/strong&gt; Atualizei os vídeos pelas versões legendadas em português no Vimeo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Atualização: 10/11&lt;/strong&gt; Acrescentei uma última seção sobre um assunto recente do Fred Brooks.&lt;/p&gt;
&lt;p&gt;Nas minhas últimas palestras sobre organizações eu mostro um vídeo do &lt;a href="http://en.wikipedia.org/wiki/Asch_conformity_experiments"&gt;experimento de Asch&lt;/a&gt;. Esse experimento demonstra como as pessoas entram em conformidade com um grupo, mesmo sabendo que o grupo pode estar errado. Mas por diversas razões, elas se conformam. Para nós agilistas, pense numa equipe realizando Planning Poker ou Retrospectiva. Quando a maior parte da equipe dá uma resposta, a minoria &amp;#8220;tende&amp;#8221; a ir com a opinião do grupo. Claro, alguns mantém sua posição mais firmemente, mas não é o normal. O normal é nos conformarmos, e isso deve ser levado em consideração. Assistam para entenderem:&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;object width="600" height="338"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=7592683&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=7592683&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="600" height="338"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/7592683"&gt;Experimento da Conformidade de Asch&lt;/a&gt; from &lt;a href="http://vimeo.com/akitaonrails"&gt;Fabio Akita&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Mais do que isso, nós funcionamos atualmente em organizações com estruturas antiquadas. Hierarquias, cargos, chefes, procedimentos, políticas. Tudo isso &amp;#8211; como eu falo nas palestras &amp;#8211; não funciona hoje em dia. Elas apenas limitam a organização como um todo. Trás resultados de curto prazo? Com certeza, por isso todos ainda usam. Em longo prazo, cria uma organização doente.&lt;/p&gt;&lt;p&gt;Um dos fatores é a respeito de autoridade. Em organizações desse tipo, quando se tem um &amp;#8220;chefe&amp;#8221;, o efeito é: &lt;em&gt;&amp;#8220;a responsabilidade das tarefas executadas não é do subordinado, mas do chefe que dá a ordem.&amp;#8221;&lt;/em&gt; É o que todos nós já ouvimos antes: &lt;em&gt;&amp;#8220;eu estava apenas seguindo ordens&amp;#8221;&lt;/em&gt;, ou &lt;em&gt;&amp;#8220;eu só trabalho aqui&amp;#8221;&lt;/em&gt;. Mesmo quando se está executando tarefas hediondas (nazistas torturando judeus, por exemplo), uma teoria é que as pessoas em si poderiam até entender que o que estavam fazendo estava &amp;#8220;errado&amp;#8221; mas como a decisão da execução saiu de alguma autoridade, nós não sentimos o mesmo remorso ou pensamos melhor em alternativas ou mesmo de simplesmente parar a execução.&lt;/p&gt;
&lt;p&gt;Quem demonstrou isso foi &lt;a href="http://en.wikipedia.org/wiki/Milgram_experiment"&gt;Stanley Milgram&lt;/a&gt;, nos anos 60. A &lt;span class="caps"&gt;BBC&lt;/span&gt; refez o mesmo experimento e você pode assistir ao meu resumo legendado:&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;object width="600" height="450"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=7592391&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=7592391&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="600" height="450"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/7592391"&gt;Experiência da Obediência de Stanley Milgram&lt;/a&gt; from &lt;a href="http://vimeo.com/akitaonrails"&gt;Fabio Akita&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Estes são todos perigos reais, que acontecem no nosso dia-a-dia:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;as pessoas se conformam com muita facilidade&lt;/li&gt;
	&lt;li&gt;as pessoas não gostam de parecer que estão erradas, portanto não arriscam&lt;/li&gt;
	&lt;li&gt;as pessoas obedecem autoridades, sejam chefes, sejam &lt;a href="http://www.akitaonrails.com/2009/11/04/off-topic-o-problema-das-credenciais"&gt;pessoas com status maior&lt;/a&gt; de alguma forma&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Que é um dos motivos pelos quais muitos dos projetos de agilidade, em particular, falham. Não adianta simplesmente dizer: &lt;em&gt;&amp;#8220;a equipe decide qual o melhor caminho&amp;#8221;&lt;/em&gt;, se ainda existe alguém com poder de veto. Se o veto for usado, apenas uma vez, ninguém mais da equipe vai levar qualquer coisa a sério. As organizações atuais limitam as pessoas, limitam seu possível potencial, limitam qualquer chance motivação, limitam a individualização, enfim, transformam as pessoas em robôs. E quanto mais um indivíduo se conforma nessa estrutura, mais ele se torna amorfo, praticamente um pedaço de carne ambulante.&lt;/p&gt;
&lt;p&gt;Portanto, a única saída, é &lt;strong&gt;eliminar&lt;/strong&gt; as hierarquias de poder. Assista minha introdução sobre essa idéia na palestra que dei no Rails Summit 2009 (créditos do vídeo para @agaelebe, obrigado por ter filmado):&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;embed src="http://blip.tv/play/AYGn3UQC" type="application/x-shockwave-flash" width="480" height="390" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt; &lt;/p&gt;
&lt;p&gt;Organizações, enquanto sistemas clássicos, fechados, tendem sempre a estagnar e entrar em colapso. Pode levar 10 anos, mas é o que vai acontecer, naturalmente. Sistemas complexos adaptativos, por outro lado, tendem a continuar em evolução, aprendendo com as pequenas falhas, refinando seus processos naturalmente. Mas isso exige heterarquias, não hierarquias, grupos formados espontaneamente, com controle descentralizado. Difícil de engolir? Concordo plenamente, por isso mesmo quem hoje está em posições de autoridade deveriam ser um pouco mais literados antes de executar as coisas. Aliás, este é outro ponto:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;as pessoas de hoje lidam com o conhecimento de forma superficial: elas preferem &amp;#8220;fazer&amp;#8221; em vez de &amp;#8220;perder tempo&amp;#8221; em aprender.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dan Pink apresentou no &lt;span class="caps"&gt;TED&lt;/span&gt; sobre motivação. Primeiro, relembrando: ninguém consegue motivar pessoas, por isso não tentem. Pessoas se motivam sozinhas ou não se motivam. O máximo que empresas e gerentes conseguem fazer é desmotivá-las. Por isso o principal é parar de atrapalhar. O que o Dan coloca é o óbvio: as empresas continuam usando técnicas arcaicas baseadas mais em folclore do que em ciência. O sistema de recompensas e punições não funciona. Entenda:&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;object width="600" height="338"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=7592823&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=7592823&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="600" height="338"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/7592823"&gt;&lt;span class="caps"&gt;TED&lt;/span&gt; &amp;#8211; Dan Pink &amp;#8211; Motivation &amp;#8211; Legendado&lt;/a&gt; from &lt;a href="http://vimeo.com/akitaonrails"&gt;Fabio Akita&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Ele afirma que as pessoas precisam de 3 coisas para se motivarem: Autonomia &amp;#8211; o desejo de controlar as próprias vidas -; Maestria &amp;#8211; o desejo de se tornar cada vez melhor no que faz -; Propósito &amp;#8211; fazer algo maior do que elas mesmas. O que ele descreve, na realidade, é nada mais nada menos do que Agentes dinâmicos, interativos em Sistemas Complexos Adaptativos. Agentes interagem entre si, cooperam e competem, evoluem ao redor de &amp;#8220;Atratores Estranhos&amp;#8221; que é o propósito ou identidade do grupo, empresa.&lt;/p&gt;
&lt;p&gt;Agilidade é uma evolução natural dos processos antigos de gestão. &lt;a href="http://www.worldblu.com/orgdemo/whatis.php"&gt;Organizações Democráticas&lt;/a&gt; são o passo de mais longo e mais abrangente numa organização.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/qFpk1B-DS38&amp;hl=en&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/qFpk1B-DS38&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;Este artigo é apenas uma introdução. Releia meus artigos &lt;a href="http://akitaonrails.com/off-topic"&gt;off-topic&lt;/a&gt; dos últimos meses para entender mais aspectos disso.&lt;/p&gt;
&lt;p&gt;&lt;a name="fred_brooks"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Fred Brooks&lt;/h2&gt;
&lt;div style="float: right; margin: 4px"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/11/10/brooks_original.jpg" alt="" /&gt;&lt;/div&gt;&lt;p&gt;Tive o grande prazer de assistir o Fred Brooks no Latinoware deste ano. Devo colocar que fiquei um pouco frustrado pela platéia não-presente, pois a palestra do Fred, que deveria estar cheia, tinha muito pouca gente, demonstrando que a maioria nem sabe sobre ele ou não tem interesse no assunto, o que é bem triste. &lt;/p&gt;
&lt;p&gt;O Fred fez uma palestra a respeito de uns 2 capítulos do livro que está escrevendo. Portanto fica a ressalva que ele não apresentou o conteúdo completo e por isso muitas coisas que eu especular podem estar explicadas nos outros capítulos.&lt;/p&gt;
&lt;p&gt;O tema foi sobre a importância de &amp;#8220;alguém&amp;#8221; que seja a Guia-Mestra de um projeto. Ele afirma que projetos, especialmente os grandes, precisam de um Arquiteto-Chefe ou coisa parecida para manter a integridade do produto final. Ele deu exemplos como o da construção de um avião por equipes separadas, onde haviam pessoas que se comunicavam com elas o tempo todo para garantir que o todo permaneceria integrado e consistente.&lt;/p&gt;
&lt;p&gt;Eu concordo com essa explicação. Ela é satisfatória e de fato arquiteturas complexas de sistema não aparecem &amp;#8220;do nada&amp;#8221; de diversas pessoas ou equipes trabalhando separadas.&lt;/p&gt;
&lt;p&gt;Porém, existe um &lt;strong&gt;enorme&lt;/strong&gt; caveat aqui. Dependendo de como você interpretar essa explicação, se você tiver o cargo de &amp;#8220;Arquiteto&amp;#8221; ou for certificado em &amp;#8220;Arquitetura de Sistemas&amp;#8221;, pode se sentir altamente justificado por uma celebridade como Fred dizendo que arquitetos são vitais a um projeto. Bem, você está &lt;strong&gt;errado&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Um arquiteto é nada mais nada menos do que um líder. Isso não é um cargo. É uma condição ganha por mérito, não por posição, certificação, ordem ou coisa parecida. Um exemplo: a kernel do Linux. Ninguém assinalou o Linus Torvalds ao posto de &amp;#8220;ditador benevolente&amp;#8221; do projeto, ele simplesmente emergiu de uma necessidade, as pessoas aceitaram sua liderança e, se estivessem muito descontentes, poderiam apenas ter feito um fork e um novo líder assumiria.&lt;/p&gt;
&lt;p&gt;Líderes de verdade emergem, não são colocados. À medida que um projeto como esse cresce, outros líderes emergem naturalmente em cada parte do projeto. Surgem o que o Linus chama de seus &amp;#8220;tenentes&amp;#8221;, pessoas como Andrew Morton já foi.&lt;/p&gt;
&lt;p&gt;Isso é importante: não é um posto de autoridade ditado de cima para baixo. É uma condição adquirida de baixo para cima. Mais do que isso, líderes evangelizam seus pontos de vista, convencem as pessoas, até certo ponto até podem obrigar certas posições, mas em última instância, em existindo &lt;strong&gt;abuso&lt;/strong&gt; dessa posição a equipe ao redor pode e deve reforçar seus pontos, seus valores ou ao final de uma briga sem vencedores, escolher por sair do projeto &amp;#8211; e não se conformar e continuar, como mostrei acima nos experimentos de Asch e Milgram.&lt;/p&gt;
&lt;p&gt;Isso funciona extremamente bem no mundo open source porque justamente se trata de um ambiente distribuído, sem hierarquias fixas, sem cargos fixos, onde as pessoas podem se movimentar entre os diversos setores do projeto, onde existe discussão, onde opiniões são levadas em consideração, onde novas idéias são testadas e experimentadas. É o extremo oposto de como se faz software tradicionalmente numa empresa. Uma descrição mais densa está no clássico &lt;a href="http://catb.org/~esr/writings/homesteading/"&gt;The Cathedral and the Bazaar&lt;/a&gt;, de Eric Raymond.&lt;/p&gt;
&lt;p&gt;Alguém, que se considera capaz de começar a resolver um determinado problema, começa assumindo as rédeas. As pessoas ao redor começam a enxergar valor nisso e podem começar a colaborar. A arquitetura inicial vai sofrendo revisões, mudanças e ela evolui. O &amp;#8220;líder&amp;#8221; desse projeto, provavelmente o autor, continua garantindo que a visão inicial continua e que mudanças propostas &amp;#8211; que podem ser melhores que as suas &amp;#8211; sejam devidamente incorporadas, em vez da retrógrada posição &lt;em&gt;&amp;#8220;não fui eu quem fiz, portanto não aprovo.&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Entender o mundo open source é a chave para entender sobre agilidade e sobre organizações democráticas. Elas nasceram assim por causa das limitações do ambientes (pessoas espalhadas pelo mundo, voluntários, falta de contato físico, necessidade de manter a integridade do código, etc). E mais, liderança não é chefia. Um líder não tem o direito de apenas gritar ordens. Um verdadeiro líder é um &lt;a href="http://en.wikipedia.org/wiki/Servant_leadership"&gt;líder servil&lt;/a&gt;. Ele colabora e ajuda a equipe, ao contrário de mandar e dizer como fazer. Ele influencia, ele evangeliza, ele tenta expor mais pontos de vista, tenta buscar consenso. Às vezes precisa tomar decisões mais difíceis, como ir contra a maioria para garantir a integridade do projeto. Mas faça isso muitas vezes da maneira errada e a equipe deve demovê-lo de sua posição. &lt;a href="http://en.wikipedia.org/wiki/Emotional_intelligence"&gt;Inteligência Emocional&lt;/a&gt;, nessa posição, é tão ou mais importante do que mero QI.&lt;/p&gt;
&lt;p&gt;Portanto, sim, projetos precisam de visões de integração. Mas, não, isso não justifica pessoas &amp;#8220;assinaladas&amp;#8221; autocraticamente como os &amp;#8220;arquitetos&amp;#8221;. Nos melhores projetos, essa posição irá emergir. Se a equipe não tem condição de emergir um líder e é necessário assinalar um, ela já está fundamentalmente quebrada. Boa sorte com esse projeto.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wVEb1v6kHPhKVdp0ugXO3ggjHrM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wVEb1v6kHPhKVdp0ugXO3ggjHrM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wVEb1v6kHPhKVdp0ugXO3ggjHrM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wVEb1v6kHPhKVdp0ugXO3ggjHrM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=A9erYRtG2tk:0XQWFjkKjx0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=A9erYRtG2tk:0XQWFjkKjx0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=A9erYRtG2tk:0XQWFjkKjx0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=A9erYRtG2tk:0XQWFjkKjx0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=A9erYRtG2tk:0XQWFjkKjx0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=A9erYRtG2tk:0XQWFjkKjx0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=A9erYRtG2tk:0XQWFjkKjx0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/A9erYRtG2tk" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/11/08/off-topic-obediencia-a-autoridade</feedburner:origLink></item><item><title>[Off-Topic] Celulares e Aviões</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/vuFFi4LUxxk/off-topic-celulares-e-avioes</link><pubDate>Sun, 08 Nov 2009 12:05:15 PST</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5222</guid><description>&lt;p&gt;Eu estou para escrever sobre isso faz alguns meses. Por acaso surgiu no &lt;a href="http://twitter.com/chemendonca/status/5538281845"&gt;Twitter&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;@AkitaOnRails, se você derrubar o avião twittando com esse 3G ligado, vai envergonhar o país inteiro! Rsrsrs!!!&lt;/blockquote&gt;
&lt;p&gt;É claro que foi uma piada :-) Mas de qualquer forma me motivou a finalmente escrever a respeito. Trata-se do comportamento das pessoas baseadas em premissas falsas.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/11/8/plane_wideweb__470x316_0_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Alguns meses atrás, enquanto estava indo para mais um evento, eu &amp;#8211; de propósito, como sempre &amp;#8211; mantenho meu iPhone ligado. Normalmente coloco em Air Mode enquanto no ar para economizar bateria, mas antes da decolagem eu estava assintindo um video podcast. Aí uma senhora do meu lado resolveu encrencar comigo mandando eu desligar. Obviamente eu ignorei ela. Daí o que ela fez? Chamou um comissário de vôo. Afe.&lt;/p&gt;
&lt;p&gt;Ela ainda soltou o que muitos ignoramentemente ainda acreditam: &lt;em&gt;&amp;#8220;este &amp;#8216;senhor&amp;#8217; está arriscando a minha vida!&amp;#8221;&lt;/em&gt; Imaginem minha vontade de soltar um &lt;em&gt;&amp;#8220;shut the fuck up!&amp;#8221;&lt;/em&gt;, claro não soltei :-)&lt;/p&gt;&lt;p&gt;Imagino que leitores do meu blog não acreditam nisso, mesmo assim muitos não devem saber porque esse aviso existe nos aviões. É só raciocinar. Se um eletrônico wireless pudesse realmente ter alguma mínima chance de interferir com a comunicação do avião, a ponto de derrubá-lo, você, se fosse o dono da companhia aérea, permitiria que alguém entrasse com um celular no seu avião??&lt;/p&gt;
&lt;p&gt;É a mesma coisa que deixar alguém entrar com uma bomba e apenas pedir educadamente &lt;em&gt;&amp;#8220;pedimos aos passageiros que carreguem bombas, para não ativá-las enquanto dentro do avião.&amp;#8221;&lt;/em&gt; Duh! O fato de podermos entrar com eletrônicos no avião é prova de que nenhum desses equipamentos coloca o avião em risco. Seria burrice. Se realmente derrubasse, todos os celulares seriam obrigados a ir despachados num container de chumbo, assim como não permitem entrarmos com objetos pontiagudos ou coisas do tipo.&lt;/p&gt;
&lt;p&gt;Portanto, se não faz mal nenhum, porque mesmo assim essa maldita mensagem ainda toca antes de decolarmos e antes de aterrissarmos? Agora é uma conclusão baseada em indução. Quais os dois momentos mais críticos de um vôo? Sim, decolagem e aterrissagem. São exatamente os momentos que a tripulação gostaria que os passageiros estejam mais prestando atenção a qualquer mensagem de emergência. Agora, se todo mundo estiver com fones de ouvido, jogando seus videogames, teclando nos seus laptops, uma mensagem de emergência demorará bastante até todos entenderem. Portanto, o objetivo principal de mandar desligar os equipamentos é única e exclusivamente para conseguir nossas atenções. Nada mais.&lt;/p&gt;
&lt;p&gt;Aí, minha teoria da conspiração é: se você apenas dissesse a verdade: &lt;em&gt;&amp;#8220;para termos sua atenção em casos de emergência, pedimos para desligar seus equipamentos&amp;#8221;&lt;/em&gt;, ninguém desligaria. Por isso deve ser melhor usar a burrice coletiva a seu favor e dizer &lt;em&gt;&amp;#8220;pedimos que desliguem seus celulares, videogames, mp3 players, computadores e não basta deixar em modo de avião.&amp;#8221;&lt;/em&gt; Ou seja, implicitamente usando o medo da interferência de sinais para que os próprios passageiros perturbem os outros &amp;#8211; como aconteceu comigo &amp;#8211; gerando um peer pressure que obriga os outros a desligar, só para não se dar ao trabalho de discutir.&lt;/p&gt;
&lt;p&gt;Aliás, se isso tudo fosse mesmo verdade, eu jamais entraria num avião. Pessoas com más intenções existem, porque confiar que elas desligariam? Aliás, eu não entenderia porque trabalhar num avião sabendo que os passageiros são um risco. Imaginem!&lt;/p&gt;
&lt;p&gt;Portanto, sim, se você acredita que sinais de celular podem derrubar um avião, você continua sofrendo de preguiça mental como falei no meu &lt;a href="/2009/11/04/off-topic-o-problema-das-credenciais"&gt;artigo anterior&lt;/a&gt;. Se ainda assim quiserem mais detalhes, por acaso achei hoje um episódio do &lt;a href="http://kwc.org/mythbusters/2006/04/episode_49_cellphones_on_plane.html"&gt;Mythbusters&lt;/a&gt; exatamente sobre isso.&lt;/p&gt;
&lt;p&gt;Equipamentos eletrônicos &lt;strong&gt;não&lt;/strong&gt; derrubam aviões. As companhias aéreas estão, espertamente, usando seu medo gerado pela ignorância coletiva. Estratégia inteligente.&lt;/p&gt;
&lt;p&gt;Ah sim, e embora isso não sirva exatamente como prova, testei isso em quase todos os meus vôos e mantive meu iPhone e iPod ligados durante o vôo :-P Não vi o avião caindo em nenhuma dessas vezes, obviamente. Mas, claro, eu estou sempre prestando atenção na decolagem e aterrissagem, porque entendo o princípio, o resto é só pela experimentação.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/psrJCDp2O5GqVbbLOV9BAEznPvA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/psrJCDp2O5GqVbbLOV9BAEznPvA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/psrJCDp2O5GqVbbLOV9BAEznPvA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/psrJCDp2O5GqVbbLOV9BAEznPvA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=vuFFi4LUxxk:jVfzewvpWTA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=vuFFi4LUxxk:jVfzewvpWTA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=vuFFi4LUxxk:jVfzewvpWTA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=vuFFi4LUxxk:jVfzewvpWTA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=vuFFi4LUxxk:jVfzewvpWTA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=vuFFi4LUxxk:jVfzewvpWTA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=vuFFi4LUxxk:jVfzewvpWTA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/vuFFi4LUxxk" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/11/08/off-topic-celulares-e-avioes</feedburner:origLink></item><item><title>[Off-Topic] O problema das credenciais</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/N8TtAf_pwCM/off-topic-o-problema-das-credenciais</link><pubDate>Wed, 04 Nov 2009 15:21:41 PST</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5221</guid><description>&lt;div style="float: right; margin: 4px"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/11/4/logical-fallacy1_original.jpg?1257376626" alt="" /&gt;&lt;/div&gt;&lt;p&gt;Não é de hoje que todos sabem que eu sou um forte proponente &lt;a href="/2008/04/19/off-topic-vamos-todos-impedir-a-regulamenta-o-da-profiss-o-de-analista-de-sistema"&gt;contra certificações&lt;/a&gt;, especificamente na área de Informática. Apesar da intenção em si ser boa, o efeito prático é mais danoso que os benefícios. Como dizem, &lt;em&gt;&amp;#8220;de boas intenções o inferno está cheio.&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Porém, eu iria mais longe e colocaria um termo guarda-chuva. Na realidade eu sou totalmente contra &lt;em&gt;&amp;#8220;Credenciais&amp;#8221;&lt;/em&gt;, em geral, particularmente fora de contexto. E além disso, eu também gosto de argumentar sobre argumentação. Não é de hoje que menciono sobre falácias sempre que posso. Estou muito longe de um entendimento mais amplo, mas estou sempre tentando expandir essa compreensão e acho que todos deveriam.&lt;/p&gt;
&lt;p&gt;Um exemplo simples: eu adoro o trabalho de um Martin Fowler, ou de um Robert Martin. Acho que seus insights são muito valiosos, suas recomendações são excelentes. Com certeza são pessoas que se esforçam para serem acima da média. Porém &amp;#8211; e aqui vem o problema &amp;#8211; eles também são seres humanos e, como tais, tem defeitos. Isso é um fato, indiscutível, que precisamos assumir em toda argumentação. Simplesmente porque um Uncle Bob disse alguma coisa, isso não configura automaticamente verdade.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/11/4/circular-reasoning1_original.jpg?1257376638" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Deveria ser óbvio, mas muitas pessoas se &amp;#8220;deslumbram&amp;#8221; com celebridades. Sério, viram literalmente &amp;#8220;cheerleaders&amp;#8221;. Ou seja, porque o cidadão trabalhou em alguma empresa de renome, ou porque escreveu um livro, ou simplesmente porque é um gringo, qualquer coisa que ele disser passa a ter peso de verdade. E isso é um enorme perigo. Tudo que os grandes nomes falam precisam passar pelo mesmo escrutínio que alguém sem renome diga. Sem exceções. Eu repito muitas das coisas que um Fowler diz, não porque o considero &amp;#8220;a autoridade suprema&amp;#8221; no assunto, mas porque o que ele diz efetivamente faz sentido, pode ser experimentado, discutido e, mais importante, abre caminho para ser refinado e evoluído.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/11/4/cheerleader_original.jpg?1257377862" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Isso é nada mais, nada menos do que a falácia de &lt;a href="http://en.wikipedia.org/wiki/Appeal_to_authority"&gt;argumentação por autoridade&lt;/a&gt;. Por que A disse B; e porque A é considerada uma autoridade; portanto B é verdade. Prestem atenção: usa-se isso todos os dias. Isso e mais uma dezena de outras falácias (vide lista abaixo) são usadas diariamente e nós caímos nelas o tempo todo.&lt;/p&gt;
&lt;p&gt;O contrário também é verdade, só porque o Philippe Kruchten ajudou a criar o &lt;span class="caps"&gt;RUP&lt;/span&gt; não quer dizer que ele seja ruim (brincadeira, o cara é muito bom). Aliás, isso é outra coisa que me incomoda muito: atacar alguma tecnologia, prática ou coisa assim atacando o seu criador ou participante. Por exemplo, &lt;em&gt;&amp;#8220;Rails é ruim porque o David é arrogante&amp;#8221;&lt;/em&gt;. Isso é uma falácia e é bem conhecida em inglês como falácia &lt;a href="http://en.wikipedia.org/wiki/Straw_man"&gt;Strawman&lt;/a&gt; (&amp;#8220;homem-de-palha&amp;#8221;) que em forma mais genérica é falar de um assunto irrelevante para tirar a atenção de discutir o assunto principal.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/11/4/strawman-240x300_original.jpg?1257376657" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Ambos os casos são ruins. Isso nos leva à tendência também de ignorar as pessoas sem renome, seu funcionário mais experiente, que efetivamente entende do problema, às vezes é ignorado, porque alguém de mais renome &amp;#8211; mas totalmente fora do contexto &amp;#8211; lançou certas &amp;#8220;verdades&amp;#8221;. Agora essa &amp;#8220;verdade&amp;#8221; é a lei. Sem mais perguntas. E, claro, o contrário também existe: você só acredita no seu funcionário mais antigo justamente porque é o mais antigo. Nada disso são boas justificativas. O importante sempre é: não interessa a pessoa, interessa sim seus argumentos. E argumentos que sigam o método científico.&lt;/p&gt;
&lt;p&gt;O fato é que a maioria de nós temos preguiça de pensar. Pura e simples preguiça. Além disso, a forma como fomos criados sempre trás figuras de autoridade e essa figura sempre tem mais razão do que nós &amp;#8211; um sinal de baixa auto-estima, eu diria. Portanto, quando vemos alguém em posição de autoridade, a tendência é aceitar o que vem dela, especialmente se estamos confortáveis com seu entendimento &amp;#8211; o velho problema de sair da zona de conforto. A maioria das pessoas não foi treinada para mudanças, foi treinada para estabilidade, por isso qualquer coisa diferente sempre é vista com maus olhos. A maioria apenas ouve aquilo que quer ouvir, só vê aquilo que quer ver. Ninguém de fora consegue mudar isso facilmente em outra pessoa, o que é bem triste.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;a href="http://www.fallacyfiles.org/taxonomy.html"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/11/4/TaxonomyC_original.png?1257376665" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Veja alguns artigos da Wikipedia sobre o assunto de argumentação:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Argument"&gt;Argumento&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Argumentation_theory"&gt;Teoria da Argumentação&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Burden_of_proof"&gt;Ônus da Prova&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_fallacies"&gt;Lista de Falácias&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Uma pessoa que não gosta de argumentar, por definição, não pode jamais ser tomadora de decisões. Muitos usam de credibilidade dos outros de forma inadequada (&lt;em&gt;&amp;#8220;porque fulano disse &amp;#8211; fora de contexto, mas disse &amp;#8230;&amp;#8221;&lt;/em&gt;). Mas o pior é quando uma decisão é tomada no grito, por força do cargo, por exemplo. Essa é a atitude de um indivíduo com claras incapacidades de argumentação e, portanto, de compreensão do assunto.&lt;/p&gt;
&lt;p&gt;Claro, em muitas ocasiões somos forçados a decidir alguma coisa &amp;#8220;por instinto&amp;#8221;. Se ficássemos o dia todo argumentando cada pequena decisão realmente não faríamos nada. Imagine argumentar se devo vestir a camisa vermelha ou amarela e porque. Não estou falando de micro-argumentação (que, assim como micro-gerenciamento, não funciona). Porém, decisões que envolvem pessoas, pontos de vista divergentes, devem ser analisados com mais calma. Se mesmo depois da argumentação ainda não for possível tirar uma conclusão lógica de nenhuma das duas premissas, no fim é o instinto que vai acabar guiando a possível solução. Argumentação não é uma ciência-exata, é humanas utilizando princípios científicos para uma melhor formulação de argumentos.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/11/4/humor-penguin-logic_original.jpg?1257376650" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;E ainda no caso de falácia, muitos ainda acreditam na &amp;#8220;ditadura da maioria&amp;#8221; ou &lt;em&gt;&amp;#8220;porque a maioria disse que algo é verdade é porque deve ser&amp;#8221;&lt;/em&gt;. Uma das formas falaciosas é descrita como &lt;a href="http://en.wikipedia.org/wiki/Argumentum_ad_populum"&gt;argumentum ad populum&lt;/a&gt;, ou aquele jeito malicioso de se começar uma frase: &lt;em&gt;&amp;#8220;Todo mundo sabe que &amp;#8230;&amp;#8221;&lt;/em&gt; Eu sempre digo que admiro os pais fundadores da América por terem tido insights avançados para a época que até hoje as pessoas não entendem direito. Citando Thomas Jefferson, temos:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Todos, também, devem ter em mente este princípio sagrado, que embora a vontade da maioria deva prevalecer em todos os casos, essa vontade de ser correto deve ser razoável; que a minoria possui direitos iguais, que leis iguais devem proteger, e violar isso seria opressão.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Portanto, também não é &lt;em&gt;&amp;#8220;em todos os casos a maioria vence&amp;#8221;&lt;/em&gt; mas sim &lt;em&gt;&amp;#8220;em todos os casos que não violam os direitos da minoria, a maioria vence&amp;#8221;&lt;/em&gt;. Isso é sutil. Por exemplo, porque a maioria decidiu que devemos tirar sua propriedade, portanto isso está correto. Não, porque cada indivíduo tem o direito à sua própria propriedade e o governo deve protegê-la. Assim, a vontade da maioria de retirar a propriedade de alguém é revogada pelo fato de um direito fundamental estar sendo violado, o que se configura, por definição, como opressão, não como democracia.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/11/4/sci_original.gif?1257376644" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Pensar é difícil, demanda estudo, demanda cultura, demanda prática. Pensar com afinco não é algo que a maioria das pessoas &amp;#8220;ocupadas&amp;#8221; tem vontade de fazer. A maioria prefere que lhe dêem as respostas prontas e enlatadas, ou então prefere escolher qualquer coisa rapidamente &amp;#8220;por instinto&amp;#8221;, ou &lt;em&gt;&amp;#8220;porque eu já escolhi certo antes, portanto vou escolher certo sempre&amp;#8221;&lt;/em&gt; ou ainda &lt;em&gt;&amp;#8220;porque já funcionou antes em algum lugar, deve funcionar aqui também&amp;#8221;&lt;/em&gt;, o que, obviamente é uma falácia, a boa e valha &lt;a href="http://en.wikipedia.org/wiki/Post_hoc_ergo_propter_hoc"&gt;Post hoc ergo propter hoc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Aliás, a &amp;#8220;Post hoc ergo propter hoc&amp;#8221; é o motivo de porque livros de auto-ajuda, livros com metodologias mágicas, receitas &amp;#8220;avançadas&amp;#8221; e todo tipo de procedimento enlatado vende tanto: porque retira o trabalho de pensar das pessoas, lhes dando respostas prontas, &amp;#8220;que já funcionaram em dúzias de lugares&amp;#8221;, ou coisa parecida.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/11/4/I_detect_fail-1_original.jpg?1257376676" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Algumas efetivamente, depois de pesquisa e experimentação prudente, são boas mesmo. A maioria, no entanto, me lembra uma alegoria, sobre de medicina. Imagine, se todos os médicos agissem assim. Você entra no consultório do médico e diz:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;- Doutor, estou com muitas dores.&lt;/li&gt;
	&lt;li&gt;- Meu filho, tome este remédio todos os dias e a dor acaba. Pode ir embora.&lt;/li&gt;
	&lt;li&gt;- Mas Doutor, o senhor não vai nem me examinar, me diagnosticar?&lt;/li&gt;
	&lt;li&gt;- Pra que? Já dei este remédio para os últimos 3 pacientes que passaram e todos melhoraram, porque vai ser diferente com você?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Engraçado? Não deveria ser. Reveja as decisões que você toma, ou que pessoas ao seu redor tomam, e vai notar que elas se parecem &lt;strong&gt;muito&lt;/strong&gt; com essa alegoria. Aliás, se parecem muito com a maioria dos argumentos falaciosos que menciono neste artigo. Eu mesmo me pego caindo nesse tipo de truque, muitas vezes. Mesmo a pessoa mais policiada ainda cai. Argumentação é uma arte. Compreensão também.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/11/4/Logical-Fallacies_original.jpg?1257376609" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Portanto, a única coisa a se fazer é o que eu digo o tempo todo: &lt;del&gt;&lt;strong&gt;Seja Cético.&lt;/strong&gt;&lt;/del&gt; &lt;strong&gt;Questione, sempre, o Status Quo.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Eze26cXTtR59hsRZGjg2SQ4RAao/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Eze26cXTtR59hsRZGjg2SQ4RAao/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Eze26cXTtR59hsRZGjg2SQ4RAao/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Eze26cXTtR59hsRZGjg2SQ4RAao/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=N8TtAf_pwCM:MMicCqsE4mk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=N8TtAf_pwCM:MMicCqsE4mk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=N8TtAf_pwCM:MMicCqsE4mk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=N8TtAf_pwCM:MMicCqsE4mk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=N8TtAf_pwCM:MMicCqsE4mk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=N8TtAf_pwCM:MMicCqsE4mk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=N8TtAf_pwCM:MMicCqsE4mk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/N8TtAf_pwCM" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/11/04/off-topic-o-problema-das-credenciais</feedburner:origLink></item><item><title>[Off-Topic] Saúde</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/2hOQcQL9WJw/off-topic-saude</link><pubDate>Sun, 01 Nov 2009 18:17:58 PST</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5220</guid><description>&lt;p&gt;&lt;strong&gt;Atualização: 03/11&lt;/strong&gt;&lt;/p&gt;
&lt;div style="float: right; margin: 5px"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/11/2/musculacao2_original.jpg" alt="" /&gt;&lt;/div&gt;&lt;p&gt;Finalmente, depois de mais de 5 anos sem atividade física significativa, terminei minha primeira sessão de exercícios físicos aqui em casa. O equivalente a 6Km em corrida a passo médio no meu elíptico, depois uma sessão anaeróbica com halteres pros braços. Ainda estou suando.&lt;/p&gt;
&lt;p&gt;Este último ano me deixou fisicamente e psicologicamente quebrado, quase sem eu perceber. Nunca fiz tanta pesquisa, e a parte frustrante de pesquisa é que para chegar a uma conclusão de um parágrafo, às vezes isso significa meses de noites mal dormidas, lendo, lendo, lendo.&lt;/p&gt;
&lt;p&gt;Isso sem contar as dezenas de eventos que participei este ano. A grande maioria das minhas palestras &amp;#8211; que não deixam de ser parte da minha pesquisa &amp;#8211; consumiram quase todos os meus fins de semana e feriados. Foram alguns poucos dias que usei durante o horário comercial para terminá-las.&lt;/p&gt;
&lt;p&gt;Com isso, meu ritmo diário ficou em torno de dormir diariamente lá pelas 4 da manhã, acordar lá pelas 9 ou 10 horas, 7 dias por semana. Sem contar os episódios de varar noite, que foram alguns durante o ano. Esse ritmo tem apertado bastante nos últimos 3 anos.&lt;/p&gt;&lt;h2&gt;Sit mens sana in corpore sano&lt;/h2&gt;
&lt;p&gt;Hoje estou com mais de 75kg e 1.72m de altura. Não preciso de um índice pra saber que estou fora de forma. Os &amp;#8220;pneus&amp;#8221; já se acumularam, os músculos estão fracos, a resistência física em geral está baixa. Até 2003 eu era mais pesado e mais fora de forma, estava com 78kg para mais. Em 6 meses de esteira diária, média de 6km por dia, mais exercícios anaeróbicos, otimização na alimentação &amp;#8211; redução drástica de gordura, carboidratos &amp;#8211; eu cheguei a menos de 70kg. Literalmente precisei refazer meu guarda-roupa.&lt;/p&gt;
&lt;p&gt;Porém, depois de 2004 esse ritmo já decaiu, o trabalho na consultoria ficou mais pesado, os clientes ficaram mais estressantes, e no fim de 2005 ainda resolvi começar com esse negócio de &amp;#8220;Rails&amp;#8221; :-) Aí já era.&lt;/p&gt;
&lt;p&gt;Mas agora já foi longe demais. Minha meta é, até o fim deste ano, voltar perto dos 72kg. Só que não é &amp;#8220;apenas&amp;#8221; perder 3kg. 3 é um saldo. Eu preciso perder muito mais do que isso de gordura ao mesmo tempo que substituo por músculo. Em breve preciso regular a dosagem diária de carboidratos e aumentar um pouco mais o consumo de aminoácidos, fora outros suplementos. Já fiz isso antes e acredito que não será tão difícil assim. O objetivo principal é melhorar a resistência física geral.&lt;/p&gt;
&lt;p&gt;Programadores, no geral, dão pouca atenção a isso. De fato, há tanta coisa que se pode fazer nas horas vagas, novos projetos open source, novos livros, blogs e mais blogs, artigos técnicos. Fora jogos, YouTube, Facebook. É &lt;strong&gt;bem&lt;/strong&gt; difícil se desconectar. Porém, o espelho vem me deixando mais e mais frustrado o que, por sua vez, piora o ciclo vicioso de me manter online. Programadores precisam ter vaidade para aumentar mais a auto-estima, e vaidade significa boa aparência, isso ajuda a retirar o ar introspecto e facilita a socialização. Inicia-se um ciclo virtuoso.&lt;/p&gt;
&lt;p&gt;Melhorar a forma física, novamente, não é algo que se faz com uma receita (como eu sempre digo, joguem fora as drogas como &amp;#8220;emagraça em 7 dias&amp;#8221;). Assim como a decisão de se tornar um bom programador, superando a média de aprendizado, também é preciso ter a atitude de querer superar as limitações físicas, ter sempre na cabeça o pensamento de &lt;em&gt;&amp;#8220;ainda falta mais, ainda preciso me esforçar mais.&amp;#8221;&lt;/em&gt; Como eu já passei por academias antes, já tive uma rotina de exercícios, ainda sei como regular meu ritmo. Se você nunca fez isso, acredite, vai doer, vai ser difícil, e depois de poucos dias a vontade de desistir é enorme. Desculpas começam a se amontoar e a maioria efetivamente se convence de que não precisa se esforçar tanto. É o que explica como as academias ganham dinheiro: faça o indivíduo assinar 6 meses, ele vai treinar por 2 semanas, depois vai desistir. Menos de 3 meses de rotina ainda é considerado tempo para desistência. Só quem consegue manter mais de 6 meses de rotina pode começar a imaginar que está conseguindo. E se exercitar de fim de semana não é exercício.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/11/2/honey-soy-salmon-with-carrot-swede-mash_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Hoje foi mais um primeiro dia para mim. Eu acho que já fiz isso umas 4 vezes nos últimos 10 anos. Estou começando a ganhar experiência nisso, o que não é exatamente razão de orgulho. Estes 2 últimos meses do ano serão um &amp;#8220;warm-up&amp;#8221;. O objetivo de 2010 é manter a rotina de exercícios diários o ano inteiro. Mas há um truque: acrescentar esta rotina de exercícios e aumentar minha rotina de pesquisa, ou seja, isso não poderá ser desculpa para diminuir meu trabalho em casa. Sem desafio não tem graça. Portanto o lance será otimizar mais meu tempo. Novamente, não há receita para isso. Nada de &lt;span class="caps"&gt;GTD&lt;/span&gt; ou receitas da moda desse tipo. Significa otimizar cada micro-decisão durante o dia.&lt;/p&gt;
&lt;p&gt;E, claro, &amp;#8220;bombas&amp;#8221; não funcionam. É como as metodologias da moda aplicadas da forma errada: dá efeito rápido, satisfação imediata, mas acumula efeitos colaterais de longo prazo que, também rapidamente, levam à destruição. Evite resultados rápidos. Por isso também virar um vegetariano ou vegan não é nem de longe uma opção. A opção é diminuir gorduras e aumentar proteínas, além de balancear as fontes de vitaminas. Nada mágico nisso. Da mesma forma, evite os &amp;#8220;gurus&amp;#8221;: nunca funcionam. Entenda os fundamentos e aplique os melhores exercícios às suas circunstâncias particulares. E para me forçar mais um pouco, eu sempre tenho o seguinte fundamento: &lt;em&gt;&amp;#8220;uma pessoa que não consegue sequer gerenciar sua própria forma física, não pode ter a pretensão de achar que pode gerenciar os outros.&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Uma curiosidade para quem acompanha meus off-topics sobre gerenciamento: aumentar a massa muscular é um processo de destruição. Exercícios como levantamente de peso foram feitos para, literalmente, &amp;#8220;rasgar&amp;#8221; os músculos. Por isso mesmo, para quem está começando, recomenda-se fazer esse tipo de exercício em dias alternados. Num dia você destrói seus músculos, no outro ele se reconstrói e aumenta um pouco mais para aguentar a carga. Por isso também é importante melhorar o metabolismo de proteínas. Aumentar músculos, portanto, não é um processo de apenas acúmulo. É sim, um processo de pequenas destruições e reconstruções. Pense nisso.&lt;/p&gt;
&lt;p&gt;Finalmente, este blog post tem o único objetivo de me ajudar a focar no objetivo. Por alguma razão, dá impressão de que estou assinando um compromisso :-) Espero que consiga cumprí-lo.&lt;/p&gt;
&lt;p&gt;&lt;a name="esclarecimento"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Esclarecimento sobre &amp;#8220;Perda de Peso&amp;#8221;&lt;/h3&gt;
&lt;p&gt;Só para ficar mais claro: &amp;#8220;perder 3kg&amp;#8221; não é um objetivo. Um cuidado que precisa se tomar é que a frase &lt;em&gt;&amp;#8220;perder peso&amp;#8221;&lt;/em&gt; é &lt;strong&gt;muito&lt;/strong&gt; errado. O certo seria dizer: &lt;em&gt;&amp;#8220;perder gordura e aumentar massa magra&amp;#8221;&lt;/em&gt;, ou seja, queimar gordura e aumentar músculo. Normalmente as duas coisas juntas não combinam muito bem.&lt;/p&gt;
&lt;p&gt;Algumas coisas que são importantes: para quem é sedentário, completamente destreinado, ao começar a fazer exercícios já se tem uma satisfação imediata de perda de peso e um pouco de aumento de massa magra &amp;#8211; a menos que você tenha problemas hormonais ou coisa assim -, isso é natural, mas tende a diminuir e vai ficando cada vez mais difícil queimar gordura e aumentar músculo.&lt;/p&gt;
&lt;p&gt;Tem que se tomar cuidado porque gordura não é fácil de queimar (nosso organismo evoluiu milhares de anos para manter reservas de energia para épocas de escassez, queimar gordura, do ponto de vista do organismo, é algo &amp;#8220;ruim&amp;#8221;).&lt;/p&gt;
&lt;p&gt;Além disso, a primeira coisa que você queima nunca é gordura, e sim carboidratos. Em exercícios aeróbicos como correr, os primeiros 20 min iniciais são queimando carboidratos, só depois é que se começa a queimar gordura. E pior: massa muscular é mais fácil de queimar do que gordura. Para ter resultados realmente efetivos o correto é consultar um nutricionista e criar uma dieta controlada, além de um bom instrutor que saiba controlar seus exercícios aeróbicos e anaeróbicos, frequencia, carga, etc.&lt;/p&gt;
&lt;p&gt;Uma das primeiras coisas &amp;#8211; e agora é apenas opinião de leigo, consulte seu nutricionista &amp;#8211; é diminuir a quantidade de carboidratos, bastante (o mais difícil: massas, doces). Não é zerar, mas diminuir bem. Não precisa deixar de ingerir gorduras, basta não abusar. E precisa comer carnes para suprir proteínas. Fora as vitaminas e fibras. Além de dividir mais sua alimentação: pequenas quantidades 5 ou 6 vezes por dia. Eu mesmo ainda não vou conseguir seguir uma dieta mais rigorosa, vamos ver.&lt;/p&gt;
&lt;p&gt;A balança normal &lt;strong&gt;não é&lt;/strong&gt; um bom indicador de melhoras: diminuir de peso (o saldo) pode significar que você está desidratando (perdendo apenas água), perdendo massa magra (literalmente perdendo músculo). Por isso precisa entender um pouco mais dos princípios antes de simplesmente apenas fazer &lt;em&gt;qualquer&lt;/em&gt; exercício.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jpdzxS6PANuSUgQXTK1PrruOh14/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jpdzxS6PANuSUgQXTK1PrruOh14/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jpdzxS6PANuSUgQXTK1PrruOh14/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jpdzxS6PANuSUgQXTK1PrruOh14/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=2hOQcQL9WJw:ILhiGcKgQ8A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=2hOQcQL9WJw:ILhiGcKgQ8A:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=2hOQcQL9WJw:ILhiGcKgQ8A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=2hOQcQL9WJw:ILhiGcKgQ8A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=2hOQcQL9WJw:ILhiGcKgQ8A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=2hOQcQL9WJw:ILhiGcKgQ8A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=2hOQcQL9WJw:ILhiGcKgQ8A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/2hOQcQL9WJw" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/11/02/off-topic-saude</feedburner:origLink></item><item><title>[Rails Summit 2010] Commence Planning</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/K9CEc8F_P9k/rails-summit-2010-commence-planning</link><pubDate>Thu, 29 Oct 2009 21:39:14 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5219</guid><description>&lt;p&gt;Railers all around the globe, I am very happy to report that the Ruby on Rails community in Brazil is growing strong. Last 13, 14th of October we had &lt;a href="http://www.railssummit.com.br/en/home"&gt;Rails Summit Latin America&lt;/a&gt;, with 550+ attendees we had the 2nd edition of the second largest Rails conference in the world after the official RailsConf.&lt;/p&gt;
&lt;p&gt;This conference is possible thanks to &lt;a href="http://www.locaweb.com.br"&gt;Locaweb&lt;/a&gt;, the largest hosting company in South America. Together, we were able to organize two very successful events. When I started being a Rails activist back in 2006, with virtually no rubyists in Brazil, I never imagined how far we would be able to go. Now we have a healthy ecosystem, with some great recognized open source programmers, some small consultings starting to pop up, a few startups starting to show up, even some &amp;#8216;enterprisey&amp;#8217; companies coming to adopt it. The Brazilian Rails community is a force to be reckoned.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/29/_URA6555_original.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a lot more to do though, and I am again counting on the international rubyists support to keep on going. The last 2 Rails Summits were real challenges, and we will strive to continue to deliver the best conference in South America. Up to this year&amp;#8217;s edition I had to have closed speakers list, but for 2010 I will finally be able to have an open Call for Participation, and I hope Railers all around the world show interest to come visit Brazil, get to know our beautiful country and meet our friendly people. I will let you know the details next year, as soon as I can.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/29/_URA6631_original.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Rails Summit gets inspiration from the official RailsConf. The format of the conference comprises 2 full days, with 2 parallel tracks, a Lightning Talk session, real-time translation from English to Portuguese and Portuguese to English, rooms with power plugs and ubiquitous wireless internet access. Up to this year we used the Elis Regina auditorium, inside the Anhembi Convention Center area, in São Paulo City. For next year we will move it to &lt;a href="http://www.convencoesfreicaneca.com.br/Conteudo.asp"&gt;Frei Caneca Convention Center&lt;/a&gt;, which is also in São Paulo City, nearer the famous Paulista Ave. area, much more convenient to find hotels and entertainment areas. I think you will enjoy it. Prices will be around &lt;span class="caps"&gt;USD&lt;/span&gt; 140 for the same 2 full days of event. &lt;strong&gt;Above&lt;/strong&gt;, you can see 2 photos from one of the other conferences that Locaweb does in the Frei Caneca Convention Center.&lt;/p&gt;
&lt;p&gt;We recorded all the talks from this year&amp;#8217;s edition and I will release them as soon as possible, so you can see how it was. &lt;a href="http://www.twitter.com/AkitaOnRails"&gt;Follow me&lt;/a&gt; on twitter or subscribe to this &lt;a href="http://feeds.feedburner.com/AkitaOnRailsEnglish"&gt;blog&amp;#8217;s feed&lt;/a&gt;. I&amp;#8217;ll keep you posted.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/D00qVXHdcC2glSCDo7OuGCB1GCY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D00qVXHdcC2glSCDo7OuGCB1GCY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/D00qVXHdcC2glSCDo7OuGCB1GCY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D00qVXHdcC2glSCDo7OuGCB1GCY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=K9CEc8F_P9k:6mYuuceguSU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=K9CEc8F_P9k:6mYuuceguSU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=K9CEc8F_P9k:6mYuuceguSU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=K9CEc8F_P9k:6mYuuceguSU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=K9CEc8F_P9k:6mYuuceguSU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=K9CEc8F_P9k:6mYuuceguSU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=K9CEc8F_P9k:6mYuuceguSU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/K9CEc8F_P9k" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/10/30/rails-summit-2010-commence-planning</feedburner:origLink></item><item><title>[Rails Summit 2010] Iniciando o Planejamento</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/EA_oBFf58eA/rails-summit-2010-iniciando-o-planejamento</link><pubDate>Tue, 27 Oct 2009 16:36:52 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5218</guid><description>&lt;p&gt;&lt;strong&gt;Atualização 28/10:&lt;/strong&gt; atualizei a estatística e pensando melhor, as conclusões são um pouco diferentes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Atualização 29/10:&lt;/strong&gt; coloquei algumas fotos do Frei Caneca.&lt;/p&gt;
&lt;p&gt;Um evento do porte do &lt;a href="http://www.railssummit.com.br"&gt;Rails Summit&lt;/a&gt; não se faz da noite para o dia. Em 2008 a Locaweb assumiu o risco e juntos fizemos um evento de escala internacional em apenas 3 meses. Isso facilmente se traduziria em suicídio, mas acho que conseguimos um excelente resultado, dadas as limitações logísticas.&lt;/p&gt;
&lt;p&gt;Para este ano, começamos meses atrás. O auditório Elis Regina foi alugado já no fim de 2008. Os palestrantes internacionais foram contactados logo depois da RailsConf 2009, em Las Vegas. Marketing, patrocínios, fornecedores, foi tudo planejado de antemão pela equipe de eventos da Locaweb. Por isso este ano, comparado com o ano passado, foi bem mais sossegado.&lt;/p&gt;
&lt;p&gt;Mas ainda temos algumas dúvidas não solucionadas. Por isso ontem lancei um &lt;a href="http://twitter.com/AkitaOnRails/status/5208145984"&gt;twit&lt;/a&gt; com uma primeira mini-pesquisa. Ficamos surpresos que a reação foi bem rápida! Em meros 5 min mais de 100 respostas foram coletadas. Neste momento já temos mais de &lt;del&gt;330&lt;/del&gt; 464 respostas. Com isso, eu compilei este resultado parcial:&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/28/Screen_shot_2009-10-28_at_9.12.34_PM_original.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;O Elis Regina é um excelente local, espaço amplo, bom para a comunidade socializar. Por outro lado ele é contra-mão para a maioria das pessoas. Fica longe do centro da cidade, ou seja, longe da maior parte dos hotéis. Fica longe dos pontos de baladas, bares. Fica longe do transporte público principal como metrô. Além de ser um dos locais mais caros de São Paulo para se fazer eventos.&lt;/p&gt;
&lt;p&gt;Em vista disso, estamos considerando o &lt;a href="http://www.freicanecashopping.com.br/convencoes/Espacos_auditorio.asp"&gt;Centro de Convenções do Shopping Frei Caneca&lt;/a&gt; que, para quem não conhece, fica no bairro Cerqueira César, uma região razoavelmente próxima à Avenida Paulista. Ou seja, próximo a metrô, a hotéis, bares, etc. Como fica no topo do Shopping Center, existe uma ampla praça de alimentação, o que nos economiza o problema de comida (vocês não tem idéia da dor de cabeça). Por outro lado, o espaço para socializar e fazer atividades paralelas como dojos, é menor.&lt;/p&gt;
&lt;p&gt;Outra coisa é sobre os dias do evento. Pessoalmente eu achava que os melhores dias seriam sexta e sábado, para ter domingo para descansar e para ficar mais fácil de convencer a empresa a liberar. Nós sempre fizemos no meio da semana, por experiência do pessoal de eventos. Mas olhando no gráfico vemos o seguinte: 1) quem já participou prefere durante a semana; 2) quem nunca participou prefere de sábado e domingo; 3) sexta e sábado perde nos dois. É quase um empate técnico entre dia de semana e sábado-domingo. Pensando melhor, acho que faremos durante a semana mesmo, preferencialmente numa &lt;strong&gt;quarta e quinta&lt;/strong&gt;, porque sexta sempre tem trânsito pior e as condições para um evento são piores, historicamente.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/27/4026602579_8ce8a84c53_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Eventos a preços baratos (próximo ou abaixo de R$ 50) são muito fáceis de encher. Mas eventos acima de R$ 200 já são considerados investimentos. Por isso mesmo ainda é complicado falar em sair de São Paulo. Dificilmente daria para encher mais de 500 pessoas a preços acima de R$ 200 fora daqui. Pelo menos não temos nenhum dado que indique o contrário.&lt;/p&gt;
&lt;p&gt;Por enquanto, consideramos fazer a conferência no Frei Caneca, provavelmente numa sexta e sábado. Ao preço de R$ 250 fixo, sem opção para estudantes (que é algo que só o Rails Summit fez, praticamente nenhum outro evento tem isso). A maioria não dá conta disso, mas R$ 400 é um preço &lt;strong&gt;muito abaixo&lt;/strong&gt; do preço de custo do evento. O Elis Regina, palestrantes internacionais, alimentação (2 almoços, 4 coffee-breaks), encarecem bastante o custo total. Essas mudanças todas ajudam a baixar bastante esse custo mantendo a qualidade geral.&lt;/p&gt;
&lt;p&gt;Não haverá mais preço especial para estudantes. Aliás, a maioria das conferências não tem isso, nos dois últimos anos eu pedi para colocar, mas não vale a pena. Fazendo no Frei Caneca, podemos reduzir o preço, isso já tornará o evento mais acessível e sem necessidade de mais descontos.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/28/Screen_shot_2009-10-28_at_9.56.46_PM_original.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Eu sei que muitos gostariam do evento em outros estados. Eu ouvi especialmente Rio de Janeiro e Porto Alegre. Pessoalmente, minha escolha é o Rio de Janeiro, sem sombra de dúvidas, pelas possibilidades de turismo e tudo mais. Mas, falando de forma realista, é muito difícil de justificar. Só de curiosidade, acima está o gráfico de participação relativa por estado. O que sabemos, comparando com outros eventos que participamos e organizamos, a logística é muito diferente. Fora de São Paulo, existem poucas alternativas de fornecedores, o custo para organizar é maior. Eventos menores são menos difíceis, mas um do porte do Summit é mais complicado.  E infelizmente é uma realidade que a população de São Paulo é pelo menos uma ordem de grandeza superior a qualquer outro lugar e esse tipo de conferência depende de uma quantidade maior de pessoas do que o normal. Somente eventos do tamanho de um &lt;span class="caps"&gt;FISL&lt;/span&gt; conseguem movimentar pessoas para fora de São Paulo.&lt;/p&gt;
&lt;p&gt;Além disso, eu ouvi e li diversos feedbacks e estou considerando tudo para melhorar ainda mais o conteúdo do ano que vem. Uma das coisas que finalmente vou conseguir fazer é um &lt;em&gt;Call for Participation&lt;/em&gt;, ou seja, alguns palestrantes eu mesmo vou pré-selecionar, mas a maioria dos slots serão preenchidos via propostas enviadas a mim por palestrantes de qualquer lugar do mundo. Daí eu farei a seleção e isso deve tornar a programação mais diversificada. Se você se interessa, comece a pensar no assunto. Ano que vem vou colocar as regras e datas no ar. E ainda teremos também a Desconferência, possivelmente de forma mais organizada e com tempo mais rígido que nos últimos dois anos (na RailsConf, o microfone é desligado por um timer, por exemplo).&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/29/_URA6555_original.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/29/_URA6631_original.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Acima estão algumas fotos do Encontro Locaweb que fizemos no Frei Caneca. Nesse caso estamos usando o auditório aberto, com 900 pessoas. Esse dá para ser dividido em 2 para fazer mais de uma sala.&lt;/p&gt;
&lt;p&gt;Bom, ainda é cedo. Estamos avaliando as opções. Ano que vem traremos as novidades o mais cedo possível.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jKw_HfGJIjMlupbjBD5YXUF_5FI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jKw_HfGJIjMlupbjBD5YXUF_5FI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jKw_HfGJIjMlupbjBD5YXUF_5FI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jKw_HfGJIjMlupbjBD5YXUF_5FI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=EA_oBFf58eA:pYgx9OjFRmg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=EA_oBFf58eA:pYgx9OjFRmg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=EA_oBFf58eA:pYgx9OjFRmg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=EA_oBFf58eA:pYgx9OjFRmg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=EA_oBFf58eA:pYgx9OjFRmg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=EA_oBFf58eA:pYgx9OjFRmg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=EA_oBFf58eA:pYgx9OjFRmg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/EA_oBFf58eA" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/10/27/rails-summit-2010-iniciando-o-planejamento</feedburner:origLink></item><item><title>[Rails Summit 2009] Retrospectiva</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/b4Hv3oy-r4Y/rails-summit-2009-retrospectiva</link><pubDate>Sat, 17 Oct 2009 16:06:16 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5217</guid><description>&lt;p&gt;Finalmente acabou, a segunda edição do Rails Summit 2009. Novamente tivemos aproximadamente 550 participantes, 20 palestrantes. Num ano de &amp;#8220;semi-crise&amp;#8221; (ou seja lá como estão chamando isso), foi um bom resultado.&lt;/p&gt;
&lt;p&gt;Tive a impressão que vieram mais pessoas de mais lugares fora de São Paulo. Claro, os cariocas vieram em peso, praticamente um arrastão :-) Foi ótimo ter todos eles juntos depois do #devinrio. O pessoal do Norte estava presente com o Paulo Fagiani, o Elomar e, claro, seu irmãozinho Aldo. Veio pessoal do Sul, do Nordeste, do Centro-Oeste. Além deles vieram meus amigos da Argentina, que não vejo desde o Locos x Rails que participei no começo do ano.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/17/4013425175_68b7b78b6f_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Os Brasileiros, novamente, deram um show de hospitalidade e camaradagem, teve #horaextra todos os dias. No primeiro dia foi no Bar Brahma, no segundo dia foi no Villa Vintém, eu sei que ontem ainda saíram novamente. É o tipo de coisa que não acontece nas RailsConf. Espero que todo mundo tenha aproveitado para fazer novos amigos, conseguir mais contatos e voltar mais inspirados em cada região para fortalecer as comunidades locais.&lt;/p&gt;&lt;h2&gt;Os Bastidores&lt;/h2&gt;
&lt;p&gt;Escolhemos o mesmo local do ano passado, o auditório Elis Regina, no Anhembi. Porém, ano passado as coisas foram feitas com muito mais pressa. Em 2008, começamos a organizar o evento em julho, para ser lançado em outubro, ou seja 3 meses efetivamente para fazer tudo. Foi bem difícil, mas a equipe de eventos da Locaweb fez um excelente trabalho. Este ano começamos a olhar isso com muito mais antecedência. Por exemplo, o website ficou pronto em julho, sendo que no ano passado ele só foi pro ar em setembro.&lt;/p&gt;
&lt;p&gt;Mesmo assim, os dias que escolhemos &amp;#8211; 13 e 14 de outubro &amp;#8211; foram difíceis de pegar. Tentamos já alugar em novembro do ano passado e mesmo assim a agenda de 2009 do anhembi já estava lotada, tinham poucos slots pra pegar. Ano passado concorremos na mesma semana do Microsoft TechEd e este ano concorremos com o Futurecom.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/17/4013423475_c59676970d_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Dos problemas do ano passado, resolvemos todos os principais:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;o calor do auditório B, que foi bem ruim no primeiro dia, mas resolvemos desta vez tendo de antemão nada menos do que 16 ar condicionados. Acredito que desta vez ninguém passou calor.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;o espaço apertado e o pé-direito baixo do auditório B foram resolvidos também, com uma sala que era quase o dobro do tamanho e altura do que o do ano passado. Para isso alugamos um espaço muito maior, o que também proporcionou um restaurante muito melhor e que gerou quase nenhuma fila na hora do almoço, nenhum aperto, e também muito menos calor.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;com o auditório B maior também conseguimos colocar uma cabine de tradução decente e tivemos tradução simultânea de português-inglês e inglês-português nos dois auditórios. Uma reclamação justa no ano passado foi a divisão de americanos no auditório maior e brasileiros no menor. O problema foi logístico mesmo. Pior porque ano passado tínhamos tradução para espanhol. Este ano eu resolvi não ter tradução pra espanhol (quem viaja até o Brasil pro Summit com certeza sabe inglês). Assim conseguimos dividir e colocar americanos também no auditório B.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/17/4013421709_e2f7a99ec5_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Cerca de 3 ou 4 meses antes do evento já estávamos em contato com todos os palestrantes internacionais para acelerar o processo de vistos que sempre é um problema. A intenção era que eles também se adiantassem, mas muitos deles empurraram com a barriga e deixaram para a última hora. Por isso tinha palestrante que só pegou o visto alguns dias antes do evento, seja porque demoraram, ou seja porque o consulado demorou mesmo.&lt;/p&gt;
&lt;p&gt;E ao contrário do ano passado, este ano tivemos muito mais problemas com os palestrantes internacionais. Primeiro o Justin Gehtland não conseguiu tirar o visto a tempo. No lugar dele deu tempo de colocar o Carlos Villela. O mesmo problema aconteceu com o Jason Seifer, mas felizmente ele ia palestrar em dupla com o Bruno Miranda e por isso deu pra manter a mesma palestra. Finalmente, na última hora, o Bryan Liles ficou com suspeita de gripe suína e também não pôde vir, mas como ele ia palestrar em paralelo comigo, acabei fazendo minha palestra ser um keynote.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/17/4008589268_7079c412a1_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Fora isso o Ilya Grigorik e o Chad Fowler tiveram problemas com atrasos nos vôos, mas pelo menos eles vieram antecipadamente. O Gregg Pollack aterrissou em São Paulo lá pelas 8 da manhã, sendo que ele ia palestrar às 10:30, então foi bem corrido. O Matt Aimonetti teve o vôo dele cancelado pela Delta Airlines! Felizmente ele conseguiu se virar e arranjar outro vôo e chegou na hora do almoço, sendo que a palestra dele ia fechar o primeiro dia! Haja coração!&lt;/p&gt;
&lt;p&gt;Este ano, felizmente, tivemos mais patrocinadores que o ano passado, também começamos a procurá-los com muito mais antecedência. Mais legal ainda porque tivemos três empresas que efetivamente usam Rails: a Caelum, a GoNow e a ThoughtWorks. Sem revelar valores, este ano conseguimos gastar menos do que o ano passado e ainda conseguimos entregar mais. Aprendemos muito. Mesmo assim, a Locaweb ainda foi a maior patrocinadora deste evento, pagando aproximadamente 1/3 do valor total. Para quem estava curioso, não, o evento não foi feito para dar lucro. Mas não significa que podemos gastar quanto quisermos &amp;#8211; não podemos -, por isso estamos já planejando o que podemos fazer para diminuir esse custo sem sacrificar muito da qualidade e ainda manter o evento viável.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/17/4013422701_3bf8169750_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/17/4014188680_c646e7583b_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Outro problema inesperado que não tivemos no ano passado foi o serviço dos terceirizados de som. No primeiro dia tivemos diversos problemas espalhados pelo dia, como chiado, microfonia, microfone que desligava do nada, etc. Vocês devem ter sentido parte desse problema, nos bastidores estava literalmente um &amp;#8220;pega-para-capar&amp;#8221;. Mas corremos para ajustar isso, e no segundo dia acho que não tivemos nenhum problema de microfones. O trabalho nos bastidores é bem pesado. Para que os participantes achem que tudo está correndo de forma suave, alguém está puxando muito peso por baixo dos panos :-) Eu só fiz isso agora no Summit, é preciso parabenizar a equipe de eventos da Locaweb que faz essa correria o ano inteiro.&lt;/p&gt;
&lt;h2&gt;Palestras&lt;/h2&gt;
&lt;p&gt;Ano passado algumas pessoas reclamaram porque as palestras focavam muito ou em testes ou em temas motivacionais. Eu acho importante que os keynotes sejam mais motivacionais. Por outro lado, foi por pura coincidência, mas de fato tivemos muitas palestras sobre o tema de testes. Este ano tentei tomar mais cuidado para escolher os palestrantes e acho que, no geral, deu uma boa mistura de temas para agradar à maioria.&lt;/p&gt;
&lt;p&gt;Tanto o Chad Fowler quanto o Obie Fernandez fizeram palestras especificamente direcionadas ao público brasileiro. O Chad levou em consideração que, diferente dos Estados Unidos, a adoção de Ruby on Rails está só começando aqui no Brasil. Por isso mesmo o tema foi sobre &amp;#8220;Insurgência Rails&amp;#8221;, ou seja, estratégias para tentar colocar Rails, gradualmente, dentro da sua empresa.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;embed src="http://blip.tv/play/AYGohSwC" type="application/x-shockwave-flash" width="480" height="390" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt; &lt;/p&gt;
&lt;p&gt;O Obie palestrou sobre um tema que eu particularmente gosto muito (e que palestrei bastante a respeito no começo do ano), que é sobre maestria. Em particular ele usou o tema do livro &amp;#8220;Outliers&amp;#8221; do Malcolm Gladwell, para explicar que talento é muito menos importante do que prática. Gladwell explica que, empiricamente, uma pessoa precisa de pelo menos 10 mil horas de prática antes de chegar ao estágio de mestre. Isso são 10 anos de esforço. Isso vai contra o &amp;#8220;bom senso&amp;#8221; de que &amp;#8220;basta se formar&amp;#8221; ou &amp;#8220;basta se certificar&amp;#8221; ou &amp;#8220;basta ter um cargo de sênior&amp;#8221; para se considerar bom em qualquer coisa. Novamente, um tema bastante comum atualmente para nós.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/17/4008587336_9347f99bcd_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Para falar especificamente de Rails 3, eu pedi ao Matt Aimonetti, um dos Rails Activists e ao José Valim, que participou do Google Summer of Code. O Ilya Grigorik e o Marcos Tapajós falaram de duas temas mais modernos, PubSubHubBub e CouchDB. As palestras um pouco mais técnicas ficaram a cargo do Leonardo Borges com JRuby, Arthur Zapparoli com Git, Glenn Vanderburg com Testes Fuzz, David Chelimsky com RSpec e Cucumber, o Carlos Brando falou sobre criar um framework web com Ruby, o Gregg Pollack e o Pratik Naik nos mostraram diversas bibliotecas e técnicas que muitos desconheciam, e o Fabio Kung mostrou todo o poder da magia negra da metaprogramação Ruby, codificando uma &lt;span class="caps"&gt;DSL&lt;/span&gt; ao vivo!&lt;/p&gt;
&lt;p&gt;Especificamente sobre Ruby, tivemos Rich Kilmer dando uma introdução ao Macruby e o Nando Vieira mostrando as novidades do Ruby 1.9. O Bruno Miranda falou sobre o case Cyloop, mais um exemplo de quão longe o Rails pode escalar. O Carlos Villela nos contou sobre a experiência da Thoughtworks em projetos de Ruby e, finalmente, o grande Vinícius Teles deu um show com um tema à la &lt;em&gt;Getting Real&lt;/em&gt; da 37signals, falando sobre sua própria experiência como empreendedor e dando dicas valiosas para quem quer começar seu próprio negócio. De longe uma das palestras mais aplaudidas do Summit.&lt;/p&gt;
&lt;p&gt;No primeiro dia ainda tivemos a famosa Desconferência, com várias boas palestras curtas. O pessoal do Guru-SP e RubyInside se apresentou. O pessoal da Plataforma Tec mostrou um plugin novo de autenticação, o Devise. O Cipriani deu um show técnico mostrando sistemas de comunicação em real-time usando Rails, &lt;span class="caps"&gt;AMPQ&lt;/span&gt;, etc. A galera do Rio, que veio em peso, falou de todas as atividades cariocas como o Dojo, o #horaextra, o Dev in Rio. O pessoal de Natal falou sobre eventos e do Oxente Rails 2010. Mas um dos pontos altos foi o Aldo Filho, irmão do Elomar, que fez uma palestra codificando ao vivo, com apenas 11 anos, demonstrando muito controle no que estava fazendo e falando tão bem quanto um profissional do palco. Dêem uma olhada:&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;embed src="http://blip.tv/play/AYGnlTEC" type="application/x-shockwave-flash" width="480" height="390" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt; &lt;/p&gt;
&lt;p&gt;Eu fiquei particularmente contente com a diversidade de assuntos e mais: como os brasileiros estão envolvidos em assuntos avançados. Espero que todos sigam os exemplos deles. Aliás, antes que eu me esqueça, dia 13, o primeiro dia do evento foi aniversário do José Valim e eu esqueci de dar os parabéns a ele! Sorry!!&lt;/p&gt;
&lt;h2&gt;Minha Palestra&lt;/h2&gt;
&lt;p&gt;Propositalmente, com tantos excelentes Railers e Rubistas presentes dando excelentes palestras, eu me dei ao luxo de palestrar sobre algo fora de Rails. Foi a segunda versão do tema &amp;#8220;Além do Caos&amp;#8221;. É uma palestra sobre agilidade que não fala especificamente sobre o que a maioria pensa sobre uma apresentação sobre metodologias Ágeis. Portanto nada de ficar pregando &amp;#8220;farás &lt;span class="caps"&gt;TDD&lt;/span&gt;&amp;#8221;, ou &amp;#8220;farás pair-programming&amp;#8221; ou qualquer outro tipo de dogmatização dessa maneira.&lt;/p&gt;
&lt;p&gt;Partindo da premissa que, sim, metodologias ágeis funcionam &amp;#8220;para quem pratica da forma correta&amp;#8221; eu quero encontrar as razões de porque as coisas funcionam. O &amp;#8220;porque&amp;#8221; sempre é mais importante do que o &amp;#8220;como&amp;#8221;, porque o segundo é consequência do primeiro. Sem entender os fundamentos, jamais saberemos quando estamos indo na direção correta, jamais saberemos como decidir quando encontramos bifurcações. Em vez de ficar apenas com as anedotas, o &amp;#8220;para ele funcionou então para mim deve funcionar&amp;#8221;, o folclore, eu preciso entender os princípios.&lt;/p&gt;
&lt;p&gt;Porém, mesmo depois de mais de um ano pesquisando a respeito em áreas como física, psicologia, sociologia, biologia, etc eu ainda não tenho um modelo unificado que explica todos os aspectos. Por isso o subtítulo da palestra é &amp;#8220;Pensamentos Aleatórios sobre Agilidade&amp;#8221;.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/17/4008267467_fb07b46c60_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Alguns recados importantes que eu queria passar: 1) nós estamos acostumados demais a apenas dogmatizar e apresentar as coisas como &amp;#8220;tudo funciona, basta fazer direito&amp;#8221;, isso pode ser bom num curto primeiro momento, mas não se sustenta; 2) sim, agilidade funciona mas se mantê-la estática ela deixará de funcionar rapidamente, por isso é preciso entender os princípios para adaptá-la e evoluir; 3) agilidade não é o fim da linha, é apenas mais um passo evolutivo, existem mais caminhos à frente que alguns já desbravaram; 4) ninguém tem uma resposta exata ainda, por isso apenas discutir o sexo dos anjos não nos levará a lugar algum.&lt;/p&gt;
&lt;p&gt;Nós, da organização do Rails Summit, gravamos todas as palestras. Eu ainda não sei como ficou porque o terceiro que ficou responsável por isso ainda não terminou de editar tudo. Assim que estiver tudo certo, vou publicar no site oficial do evento. Enquanto isso, alguns participantes gravaram algumas palestras, então vocês já podem se adiantar e assistir a minha por exemplo:&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;object width="600" height="450"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=7099091&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=7099091&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="600" height="450"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/7099091"&gt;Além do Caos &amp;#8211; Pensamentos Aleatórios sobre Agilidade&lt;/a&gt; from &lt;a href="http://vimeo.com/locaweb"&gt;Locaweb&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;
&lt;h2&gt;Comunidade&lt;/h2&gt;
&lt;p&gt;A melhor parte do evento, sempre, é a participação da comunidade, e vocês não decepcionaram. Muitos Railers, todo mundo reunido, trocando idéias, experiências, essa é a idéia do evento. Assistir as palestras é apenas uma pequena parte. E isso é bem claro no pós-evento. Tanto no primeiro quanto no segundo dia, uma quantidade enorme de pessoas continuaram reunidas, socializando. No primeiro dia demos Denial of Service no Bar Brahma do Aeroclube, no segundo dia foi a vez de um stack overflow no bar Vila Vintém.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/17/4013422197_f5cd323c1f_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Este deve ser o único evento de tecnologia que dá ressaca depois :-) Enquanto todos se recuperam, alguns já começaram a reportar como foi o evento. Então lá vão alguns dos links mais recentes.&lt;/p&gt;
&lt;p&gt;Quem quiser ver as fotos do evento, vejam estes álbuns:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.flickr.com/photos/danicuki/sets/72157622452350763/"&gt;Daniel Cukier&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.flickr.com/photos/levycarneiro/sets/72157622594891438/"&gt;Levy Carneiro&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://galeria.tapajos.me/fotos/72157622604025186/1"&gt;Marcos Tapajós&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.flickr.com/photos/plentz/sets/72157622607530412/"&gt;Diego Plentz&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quem quiser assistir vídeos do evento, aqui vai:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Agaelebe: &lt;a href="http://agaelebe.blip.tv/"&gt;Blip.tv&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://vimeo.com/tag:railssummit"&gt;Vimeo&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.youtube.com/results?search_type=videos&amp;amp;search_query=railssummit+2009&amp;amp;search_sort=video_date_uploaded"&gt;YouTube!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finalmente, os blog posts:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Alexandre Gazzola: &lt;a href="http://alexandregazola.wordpress.com/2009/10/14/rails-summit-latin-america-summary-of-the-first-day/"&gt;Primeiro Dia&lt;/a&gt; e &lt;a href="http://alexandregazola.wordpress.com/2009/10/17/rails-summit-latin-america-summary-of-the-second-day/"&gt;Segundo Dia&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://andrefaria.com/2009/10/15/rails-summit-2009-chad-fowler/"&gt;André Faria Gomes&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Leonardo Faria: &lt;a href="http://leonardofaria.net/2009/10/13/rails-summit-resumo-do-primeiro-dia/"&gt;Primeiro Dia&lt;/a&gt;, &lt;a href="http://leonardofaria.net/2009/10/14/rails-summit-resumo-do-segundo-dia/"&gt;Segundo Dia&lt;/a&gt; e &lt;a href="http://leonardofaria.net/2009/10/15/o-ecossistema-rails/"&gt;Ecossistema&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Carlos Brando: &lt;a href="http://www.nomedojogo.com/2009/10/13/os-slides-da-minha-apresentacao-no-rails-summit-latin-america-2009/"&gt;slides&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Nando Vieira: &lt;a href="http://simplesideias.com.br/rails-summit-o-que-mudou-no-ruby-1-9/"&gt;slides&lt;/a&gt; and &lt;a href="http://merbist.com/2009/10/23/railssummit-2009/"&gt;summary of the event&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Matt Aimonetti: &lt;a href="http://www.slideshare.net/mattetti/future-of-ruby-and-rails-2223913"&gt;slides&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Pratik Naik: &lt;a href="http://www.railsfire.com/article/railssummit-slides"&gt;slides&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://infoether.com/articles/mark/keynoting-at-rails-summit-latin-america-brazil"&gt;InfoEther&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;José Valim e Plataforma Tec: &lt;a href="http://feedproxy.google.com/~r/PlataformaBlog/~3/xTvItvrfC18/"&gt;slides&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Cairo Noleto: &lt;a href="http://caironoleto.com/2009/10/16/rails-summit-2009-e-o-lancamento-do-trendti-me/"&gt;TrendTi.me&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Blue Soft: &lt;a href="http://bluesoft.wordpress.com/2009/10/15/manifesto-2-0-por-alexandre-gomes-no-rails-summit-2009/"&gt;Manifesto 2.0&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.areacriacoes.com.br/2009/10/15/rails-summit"&gt;Área Criações&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://sharpshooting.com.br/2009/10/13/rails-summit-latin-america-2009/"&gt;SharpShooting&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://pothix.com/blog/events/rails-summit-2009"&gt;Willian Molinari&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://carlosantoniodasilva.wordpress.com/2009/10/19/rails-summit-latin-america-2009/"&gt;Carlos Antônio&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.madrugaonrails.com.br/2009/10/18/rails-summit-simplesmente-Otimo"&gt;Madruga on Rails&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Alexandre Gomes: &lt;a href="http://blog.seatecnologia.com.br/2009/10/16/sinform-agiles-e-railssummit"&gt;blog da &lt;span class="caps"&gt;SEA&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://hgfischer.com.br/2009/10/resumao-rails-summit-2009/"&gt;Herbert Fischer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Espero que todos tenham aproveitado o evento. Não deixem de blogar, publicar suas fotos e vídeos, compartilhar o que aprenderam, novas inspirações, novas idéias. Obrigado a todos que participaram, espero revê-los até o ano que vem!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LGm1oDj9NmSz4Qj0Z1Hv6y_FNC4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LGm1oDj9NmSz4Qj0Z1Hv6y_FNC4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LGm1oDj9NmSz4Qj0Z1Hv6y_FNC4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LGm1oDj9NmSz4Qj0Z1Hv6y_FNC4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=b4Hv3oy-r4Y:s8MyvBnEc5o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=b4Hv3oy-r4Y:s8MyvBnEc5o:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=b4Hv3oy-r4Y:s8MyvBnEc5o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=b4Hv3oy-r4Y:s8MyvBnEc5o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=b4Hv3oy-r4Y:s8MyvBnEc5o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=b4Hv3oy-r4Y:s8MyvBnEc5o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=b4Hv3oy-r4Y:s8MyvBnEc5o:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/b4Hv3oy-r4Y" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/10/17/rails-summit-2009-retrospectiva</feedburner:origLink></item><item><title>[Rails Summit 2009] ThoughtWorks pousa no Brasil</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/tQJ-BMk9FbM/rails-summit-2009-thoughtworks-pousa-no-brasil</link><pubDate>Thu, 08 Oct 2009 14:55:34 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5216</guid><description>&lt;p style="text-align: center"&gt;&lt;a href="http://www.railssummit.com.br?utm_campaign=Railssummit&amp;utm_source=banner_parceiros&amp;utm_medium=banner&amp;utm_content=por_728x90"&gt;&lt;img src="http://railssummit.com.br/imgs/43/original/728x90.gif" alt="Rails Summit 2009"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;English readers:&lt;/strong&gt; click &lt;a href="/2009/10/08/rails-summit-2009-thoughtworks-pousa-no-brasil#thoughtworks_english"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Como eu &lt;a href="http://twitter.com/AkitaOnRails/statuses/4687822234"&gt;twitei ontem&lt;/a&gt;, estamos muito orgulhos de anunciar que a &lt;a href="http://www.thoughtworks.com"&gt;ThoughtWorks&lt;/a&gt; se juntou como patrocinador da conferência na última hora. Inclusive eles resolveram dar um presente à comunidade: patrocinar metade de &lt;strong&gt;30 ingressos&lt;/strong&gt; para o Rails Summit, promoção que começou algumas horas atrás e ficará no ar até acabarem os ingressos patrocinados. Não percam!&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/8/TW_Logo_original.gif" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Mais ainda, você deve ter ouvido rumores sobre isso. Roy Singham, fundador da ThoughtWorks, soltou o anúncio na conferência &lt;a href="http://agiles2009.org"&gt;Agiles 2009&lt;/a&gt; acontecendo em Florianópolis, SC alguns minutos atrás. Estou muito contente de confirmar que sim, os rumores eram verdade: a ThoughtWorks decidiu aterrissar no Brasil. Eles estabelecerão seu quartel-general em Porto Alegre, RS, começando este ano.&lt;/p&gt;
&lt;p&gt;Agora, eles tem intenções de começar a contratar desenvolvedores de software brilhantes imediatamente. Eles estarão no Rails Summit para falar com &lt;strong&gt;você&lt;/strong&gt;, procurando grandes pessoas para embarcarem nessa empreitada.&lt;/p&gt;
&lt;p&gt;A ThoughtWorks é muito conhecida como uma força no mundo de desenvolvimento de software, com diversos escritórios pelo mundo. Eles tem grandes e conhecidos engenheiros, arquitetos trabalhando lá, redefinindo a maneira como fazemos software, como Martin Fowler.&lt;/p&gt;
&lt;p&gt;Não percam essa oportunidade de vir conhecê-los, pessoalmente. Estaremos esperando por você no &lt;a href="http://www.railssummit.com.br"&gt;Rails Summit 2009&lt;/a&gt;, semana que vem!&lt;/p&gt;&lt;p&gt;&lt;a name="thoughtworks_english"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;ThoughtWorks lands in Brazil&lt;/h2&gt;
&lt;p&gt;As I &lt;a href="http://twitter.com/AkitaOnRails/statuses/4687822234"&gt;twitted yesterday&lt;/a&gt;, we are very proud to announce that &lt;a href="http://www.thoughtworks.com"&gt;ThoughtWorks&lt;/a&gt; joined us as sponsor for the conference at the last moment.&lt;/p&gt;
&lt;p&gt;Moreover, you may have heard rumors about this. Roy Singham, founder of ThoughtWorks,  just released the announcement at the &lt;a href="http://www.agiles2009.org"&gt;Agiles 2009&lt;/a&gt; conference in Florianópolis, SC a few minutes ago. I am very happy to confirm that yes, the rumors are true: ThoughtWorks decided to land in Brazil. They will establish their head-quarters in Porto Alegre &amp;#8211; RS, starting this year.&lt;/p&gt;
&lt;p&gt;Now, they have intentions to start hiring bright and insightful software developers right away. They will be at Rails Summit to talk to &lt;strong&gt;you&lt;/strong&gt;, searching for matches to sign up for their enterprise.&lt;/p&gt;
&lt;p&gt;ThoughtWorks is a well known software development powerhouse, with offices around the globe. There are several great and well known engineers, architects working there, redefining the way we do software, such as Martin Fowler.&lt;/p&gt;
&lt;p&gt;Don&amp;#8217;t miss this opportunity to come and get to know them, in person. We will be awaiting you at &lt;a href="http://www.railssummit.com.br/en/home"&gt;Rails Summit 2009&lt;/a&gt;, next week!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/W8ETIjaNSSh0X2jyYiIOMNEIA6c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W8ETIjaNSSh0X2jyYiIOMNEIA6c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/W8ETIjaNSSh0X2jyYiIOMNEIA6c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W8ETIjaNSSh0X2jyYiIOMNEIA6c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=tQJ-BMk9FbM:gkqw8nTlhMs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=tQJ-BMk9FbM:gkqw8nTlhMs:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=tQJ-BMk9FbM:gkqw8nTlhMs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=tQJ-BMk9FbM:gkqw8nTlhMs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=tQJ-BMk9FbM:gkqw8nTlhMs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=tQJ-BMk9FbM:gkqw8nTlhMs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=tQJ-BMk9FbM:gkqw8nTlhMs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/tQJ-BMk9FbM" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/10/08/rails-summit-2009-thoughtworks-pousa-no-brasil</feedburner:origLink></item><item><title>[Rails Summit 2009] Palestrante Arthur Zapparoli</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/gJZmv2SiZtw/rails-summit-2009-palestrante-arthur-zapparoli</link><pubDate>Tue, 06 Oct 2009 08:03:42 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5215</guid><description>&lt;p style="text-align: center"&gt;&lt;a href="http://www.railssummit.com.br?utm_campaign=Railssummit&amp;utm_source=banner_parceiros&amp;utm_medium=banner&amp;utm_content=por_728x90"&gt;&lt;img src="http://railssummit.com.br/imgs/43/original/728x90.gif" alt="Rails Summit 2009"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;English translation:&lt;/strong&gt; click &lt;a href="/2009/10/06/rails-summit-2009-palestrante-arthur-zapparoli#arthur_english"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;div style="float: right; margin: 3px"&gt;&lt;a href="http://railssummit.locaweb.com.br/pt-BR/speakers#arthur_zapparoli"&gt;&lt;img src="http://railssummit.locaweb.com.br/imgs/19/original/arthur.jpg" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Arthur é Desenvolvedor de Softwares, trabalha com Ruby e Rails desde 2006. Atualmente trabalha para a startup brasileira &lt;a href="http://spix.info/"&gt;Spix&lt;/a&gt;. É conhecido como &lt;a href="http://twitter.com/arthurgeek"&gt;@ArthurGeek&lt;/a&gt; na comunidade e publica artigos no seu &lt;a href="http://arthurgeek.net/"&gt;blog&lt;/a&gt; no qual fala sobre assuntos relacionados à desenvolvimento.&lt;/p&gt;
&lt;p&gt;Ele foi um dos que começou a evangelizar mais o &lt;a href="http://merb-br.org/"&gt;Merb&lt;/a&gt; na comunidade brasileira, assim como o &lt;strong&gt;Git&lt;/strong&gt; como versionador de controle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Como você encontrou Ruby/Rails, o que foi que mais te atraiu?&lt;/p&gt;
&lt;p&gt;Conheci Rails na época da versão 0.13. Eu já trabalhava com Python, e adorava os recursos de uma linguagem dinâmica. Quando conheci o Rails, não me apaixonei por ele de cara, ainda gostava mais do Python. Nessa época, me envolvi com alguns &amp;#8220;clones&amp;#8221; do Rails para o Python (ironicamente, nenhum deles deu certo). Porém, como precisava de algo pronto para ser usado, acabei usando o Rails nos projetos da empresa onde trabalhava, e, com isso, precisei estudar Ruby da maneira certa. Depois disso, me apaixonei por Ruby e estou nessa até hoje. Claro que não abandonei o Python, mas hoje posso dizer que Ruby é minha linguagem favorita.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Quais assuntos mais te interessam atualmente e porque?&lt;/p&gt;
&lt;p&gt;Tenho um grande interesse pelo Rails 3, já que sempre gostei do Merb. Ruby 1.9 é algo que utilizo nos dias de hoje e estou sempre de olho nas novidades com relação à isto. Fora do mundo Ruby/Rails, me interesso bastante pelos &amp;#8220;Document based databases&amp;#8221; como CouchDB, e, principalmente o MongoDB. Tanto o Ruby 1.9 quanto o MongoDB é algo que utilizamos no dia-a-dia da empresa onde trabalho.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Sobre o que trata a sua palestra e para que tipos de desenvolvedores é mais indicado?&lt;/p&gt;
&lt;p&gt;A palestra se chama: &amp;#8220;Git: Controle de versões do jeito certo&amp;#8221; e abordará temas básicos, diferentes workflows e algumas dicas mais avançadas. É indicada para desenvolvedores que não usam nenhum controle de versões ou para aqueles que querem saber mais sobre como o Git pode ajudar no dia-a-dia de seu trabalho.&lt;/p&gt;&lt;p&gt;&lt;a name="arthur_english"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Speaker Arthur Zapparoli&lt;/h2&gt;
&lt;div style="float: right; margin: 3px"&gt;&lt;a href="http://railssummit.locaweb.com.br/en/speakers#arthur_zapparoli"&gt;&lt;img src="http://railssummit.locaweb.com.br/imgs/19/original/arthur.jpg" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Arthur is a Software Developer, works with Ruby and Rails since 2006. He currently works for a Brazilian startup &lt;a href="http://spix.info/"&gt;Spix&lt;/a&gt;. He is known as &lt;a href="http://twitter.com/arthurgeek"&gt;@ArthurGeek&lt;/a&gt; in the community and posts articles in his &lt;a href="http://arthurgeek.net/"&gt;blog&lt;/a&gt;, talking about topics related to software development.&lt;/p&gt;
&lt;p&gt;He also began helping to evangelize more &lt;a href="http://merb-br.org/"&gt;Merb&lt;/a&gt; in the Brazilian community as well as the &lt;strong&gt;Git&lt;/strong&gt; version control system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; How did you find Ruby / Rails, what attracted you the most?&lt;/p&gt;
&lt;p&gt;I got to know Rails at the time of version 0.13. I&amp;#8217;ve worked with Python, and loved the features of a dynamic language. When I met Rails, I didn&amp;#8217;t fall in love with it right away, I still liked Python more. At that time, I got involved with some &amp;#8220;clones&amp;#8221; of Rails for Python (ironically, none of them worked for me). However, as I needed something ready to be used, I ended up using Rails in projects for the company where I worked, and, therefore, I had to study Ruby the right way. After that, I fell in love with Ruby and I&amp;#8217;m with it today. Of course not I&amp;#8217;ve not abandoned Python, but today I can say that Ruby is my favorite language.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; What topics interest you the most today and why?&lt;/p&gt;
&lt;p&gt;I have great interest in Rails 3, as I always liked Merb. Ruby 1.9 is something that I use today and I&amp;#8217;m always on the lookout for news regarding this. Outside the Ruby / Rails world, I&amp;#8217;m very interested by &amp;#8220;Document based databases&amp;#8221; such as CouchDB, and especially MongoDB. Both Ruby 1.9 and MongoDB are things we use in a daily basis at the company where I work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; What is your talk about and what kind of developers will benefit the most?&lt;/p&gt;
&lt;p&gt;The talk is called &amp;#8220;Git: Version control the correct way&amp;#8221; and will address key topics, different workflows and some more advanced tips. It is recommended for developers who do not use any version control or for those who want to learn more about how Git can help in your daily workflow.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tEDdNF7fuYbbCTDpSjayugPqHKc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tEDdNF7fuYbbCTDpSjayugPqHKc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tEDdNF7fuYbbCTDpSjayugPqHKc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tEDdNF7fuYbbCTDpSjayugPqHKc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=gJZmv2SiZtw:M_lQAqC2Wjw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=gJZmv2SiZtw:M_lQAqC2Wjw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=gJZmv2SiZtw:M_lQAqC2Wjw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=gJZmv2SiZtw:M_lQAqC2Wjw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=gJZmv2SiZtw:M_lQAqC2Wjw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=gJZmv2SiZtw:M_lQAqC2Wjw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=gJZmv2SiZtw:M_lQAqC2Wjw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/gJZmv2SiZtw" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/10/06/rails-summit-2009-palestrante-arthur-zapparoli</feedburner:origLink></item><item><title>[Off-Topic] Windows and Unix: Promiscuidade</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/I6aSP6hQtGc/off-topic-windows-and-unix-promiscuidade</link><pubDate>Sun, 04 Oct 2009 16:33:22 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5214</guid><description>&lt;p style="text-align: center"&gt;&lt;a href="http://www.railssummit.com.br?utm_campaign=Railssummit&amp;utm_source=banner_parceiros&amp;utm_medium=banner&amp;utm_content=por_728x90"&gt;&lt;img src="http://railssummit.com.br/imgs/43/original/728x90.gif" alt="Rails Summit 2009"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Desde que o &lt;a href="http://en.wikipedia.org/wiki/Windows_NT"&gt;Windows NT&lt;/a&gt; 3.1 foi lançado em 1993, ele sempre teve algum suporte a sub-sistemas. Os bons engenheiros contratados da &lt;span class="caps"&gt;DEC&lt;/span&gt;, que efetivamente desenvolveram o NT, levaram à Redmond tecnologias e conceitos desconhecidos a eles como portabilidade (na época ele rodava em processadores PowerPC, &lt;span class="caps"&gt;MIPS&lt;/span&gt;, etc), access control lists, microkernel, multi-tarefa preemptiva, etc. O NT suportava, além do sub-sistema Win32, também OS/2 e um ambiente mínimo &lt;a href="http://en.wikipedia.org/wiki/Microsoft_POSIX_subsystem"&gt;&lt;span class="caps"&gt;POSIX&lt;/span&gt;.1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;De qualquer forma, esse suporte era bem rudimentar. Ele foi substituído anos depois pelo &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Windows_Services_for_UNIX"&gt;Services for Unix&lt;/a&gt; 1.0 em 1999 no NT 4.0 SP3+. Mas foi só no &lt;span class="caps"&gt;SFU&lt;/span&gt; 3.5, lançado em 2004, que esse suporte finalmente amadureceu a ponto de ser minimamente usável. Eu me lembro de usar o &lt;span class="caps"&gt;SFU&lt;/span&gt; 3.5 no meu desktop em vez do Cygwin (embora o Cygwin ainda pareça ter mais aplicativos e mais flexibilidade), mas pelo menos era um suporte &amp;#8220;oficial&amp;#8221; da Microsoft &amp;#8211; se isso significa alguma coisa.&lt;/p&gt;
&lt;p&gt;Junto ao &lt;span class="caps"&gt;SFU&lt;/span&gt; temos o suporte opcional da &lt;a href="http://www.interix.com/"&gt;Interix&lt;/a&gt;, que completa esse suporte com um ambiente &lt;span class="caps"&gt;GNU&lt;/span&gt; mais completo, incluindo SDKs para recompilar ferramentas Unix para Windows com &lt;span class="caps"&gt;SFU&lt;/span&gt;. Com ele conseguimos finalmente ter ferramentas úteis no mundo Windows, como acesso ao OpenSSH.&lt;/p&gt;
&lt;p&gt;Para os puristas, que não gostam de instalar nada que não seja &amp;#8220;default&amp;#8221; da Microsoft, saibam que no próprio &lt;em&gt;Add and Remove Programs&lt;/em&gt; (no Windows 2003) como no &lt;em&gt;Add Feature&lt;/em&gt; (no Windows 2008) você tem a opção &lt;em&gt;Subsystem for &lt;span class="caps"&gt;UNIX&lt;/span&gt;-based Applications&lt;/em&gt;, também conhecido agora como &lt;a href="http://suacommunity.com/"&gt;&lt;strong&gt;&lt;span class="caps"&gt;SUA&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt;. Primeiro você precisa instalar esse sub-sistema.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/4/Screen_shot_2009-10-04_at_7.48.52_PM_original.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Feito isso, você precisa baixar o &lt;em&gt;Utilities and &lt;span class="caps"&gt;SDK&lt;/span&gt;&lt;/em&gt; para o &lt;a href="http://u.akitaonrails.com/RH8C"&gt;Windows XP/2003&lt;/a&gt; ou &lt;a href="http://u.akitaonrails.com/vT11"&gt;Windows Vista/2008&lt;/a&gt;, eles pesam uns 190Mb e 490Mb, respectivamente. A instalação deles é demorada, e a única coisa a se lembrar é:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Escolha a opção &amp;#8220;Custom Installation&amp;#8221; e não &amp;#8220;Stantard&amp;#8221;. Daí escolha todos os &amp;#8220;opcionais&amp;#8221; desmarcados, você precisará deles.&lt;/li&gt;
	&lt;li&gt;Quando aparecer opções como setuid, sutoroot, case-insensitive, também marque todas as opções.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/4/Screen_shot_2009-10-04_at_7.24.41_PM_original.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Terminada a instalação, no caso do Windows 2008, você pode diretamente já baixar um dos &lt;a href="http://www.suacommunity.com/Default.htm#bundles"&gt;bundles&lt;/a&gt; que já vem com todas as ferramentas que você precisa. Selecione o link correto para W2K8 e já baixe de uma vez o &amp;#8220;Complete Toolset&amp;#8221; para facilitar.&lt;/p&gt;
&lt;p&gt;No Windows 2003, por alguma razão estranha &amp;#8211; não sei se é somente na minha máquina &amp;#8211; a instalação do bundle não funcionou. Em vez disso precisei baixar e instalar o &lt;a href="http://www.suacommunity.com/pkg_install.htm"&gt;Bootstrap Installer 3.5&lt;/a&gt;. No Windows 2008, se não quiser o bundle e quiser escolher os pacotes manualmente, nessa mesma página, baixe o &lt;a href="http://www.suacommunity.com/pkg_install.htm"&gt;Bootstrap Installer 6.0&lt;/a&gt;. Em todo caso esse é o mínimo para ter um Package Manager. Ele te dará condições de instalar pacotes mais ou menos como num Ubuntu você consegue fazer &amp;#8220;apt-get install apache2&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Ele provavelmente pedirá que você reboote a máquina, pelo menos no caso do Windows 2003. Depois, as duas primeiras coisas que eu instalei foram:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;pkg_update -L bash&lt;tt&gt;
&lt;/tt&gt;pkg_update -L openssh&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Pode parecer estranho o comando se chamar &amp;#8220;pkg_update&amp;#8221; mas existe um &amp;#8220;pkg_add&amp;#8221; que parece que é antigo e eles recomendam o primeiro. Outro detalhe: eu executei esses comandos via o &amp;#8220;C Shell&amp;#8221; que tem link no Start Menu. No Windows 2008, depois de instalar o Bash eu ganho um novo atalho, mas no Windows 2003 deu algum problemas e eu criei o atalho manualmente copiando a partir do &amp;#8220;C Shell&amp;#8221; e editando o caminho para executar &amp;#8220;/usr/local/bin/bash -l&amp;#8221;.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/4/Screen_shot_2009-10-04_at_8.30.08_PM_original.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Para iniciar o daemon do OpenSSH basta fazer:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;/etc/init.d/sshd start&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Pelo visto o &lt;span class="caps"&gt;SUA&lt;/span&gt; reinicia automaticamente os daemons configurados no /etc/init.d, como deveria mesmo. Isso lhe dá outras coisas como um daemon de cron, sendmail, dentre outros. Para acessar o sshd, não se esqueça de liberar &lt;em&gt;incoming connections&lt;/em&gt; na porta 22 no Firewall do Windows (que vem ativado por padrão no 2008 e desligado no 2003).&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/4/Screen_shot_2009-10-04_at_8.31.55_PM_original.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Se você cair em algum problema de core dumps, segmentation faults, talvez você precise desligar o &lt;span class="caps"&gt;DEP&lt;/span&gt;. Para isso edite o arquivo C:\boot.ini e troque a opção &lt;em&gt;&amp;#8220;/NoExecute=&amp;#8230;&amp;#8221;&lt;/em&gt; por &lt;em&gt;&amp;#8220;/NoExecute=AlwaysOff&amp;#8221;&lt;/em&gt;. Isso deve resolver esses problemas.&lt;/p&gt;
&lt;p&gt;Finalmente, você precisa &lt;a href="http://support.microsoft.com/kb/310519"&gt;configurar uma variável de ambiente&lt;/a&gt; chamada &amp;#8220;&lt;span class="caps"&gt;HOME&lt;/span&gt;&amp;#8221; apontando para seu diretório padrão. No Windows 2003 foi &amp;#8220;C:\&lt;span class="caps"&gt;DOCUME&lt;/span&gt;~1\&lt;span class="caps"&gt;ADMINI&lt;/span&gt;~1&amp;#8221; e no 2008 foi &amp;#8220;C:\Users\Administrator&amp;#8221;. Feito isso, a partir do meu Mac, conectei nos Windows via &lt;span class="caps"&gt;SSH&lt;/span&gt; normalmente. Ele me pediu senha e me jogou no meu diretório com shell Bash. Até parecia que eu havia conectado num Unix normal.&lt;/p&gt;
&lt;p&gt;Para ficar mais padrão, eu criei symbolic links para a pasta &amp;#8216;home&amp;#8217;:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;# Windows 2003:&lt;tt&gt;
&lt;/tt&gt;ln -s /dev/fs/C/Documents\ and\ Settings /home&lt;tt&gt;
&lt;/tt&gt;# Windows 2008:&lt;tt&gt;
&lt;/tt&gt;ln -s /dev/fs/C/Users /home&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Então, eu criei um projeto Rails básico, sem nada. Rodei o meu &lt;a href="http://github.com/akitaonrails/locarails"&gt;Locarails&lt;/a&gt; para gerar uma receita básica de capistrano. Editei o &amp;#8220;config/environment.rb&amp;#8221; criado e comentei as linhas 74 e 88:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;#run &amp;quot;cd #{release_path} &amp;amp;&amp;amp; rake db:migrate RAILS_ENV=production&amp;quot;&lt;tt&gt;
&lt;/tt&gt;#run &amp;quot;ln -s #{deploy_to}/current/public #{public_html}/#{application}&amp;quot;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Lembrando que as configurações são case-sensitive e, no meu caso, estava testando com usuário &amp;#8220;Administrator&amp;#8221; (com &amp;#8220;A&amp;#8221; maiúsculo):&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;set :user, &amp;quot;Administrator&amp;quot;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Fiz um &amp;#8220;cap deploy:setup&amp;#8221;, depois um &amp;#8220;cap deploy&amp;#8221; e, &lt;em&gt;voilá&lt;/em&gt; funcionou! Ele foi capaz de se conectar via &lt;span class="caps"&gt;SSH&lt;/span&gt; e realizar operações básicas como mkdir, ln, test e inclusive foi capaz de fazer upload dos arquivos via &lt;span class="caps"&gt;SCP&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Esse sub-sistema deveria vir instalado por padrão nos Windows, isso os tornaria mais úteis e incentivaria existir mais serviços como Capistrano que conseguem se comunicar com sistemas &lt;span class="caps"&gt;POSIX&lt;/span&gt;. No Windows tirando shares de rede (inseguro), &lt;span class="caps"&gt;RDP&lt;/span&gt; (inseguro), &lt;span class="caps"&gt;RPC&lt;/span&gt; (inseguro), &lt;span class="caps"&gt;FTP&lt;/span&gt; (inconveniente e inseguro) não sobra muita coisa para integrar. Com OpenSSH ganhamos um canal seguro, com autenticação simplificada graças ao sistema de troca de chaves e um ambiente &lt;span class="caps"&gt;POSIX&lt;/span&gt; onde podemos executar scripts e comandos para administrar as máquinas remotamente.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="http://www.akitaonrails.com/assets/2009/10/4/Screen_shot_2009-10-04_at_8.38.12_PM_original.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Vou fazer mais brincadeiras com esse ambiente, talvez coisas como Puppet, Chef, AutomateIt consigam fazer tarefas básicas em servidores Windows também. Outro detalhe: a conexão &lt;span class="caps"&gt;SSH&lt;/span&gt; só lhe dá acesso ao Bash ou outro shell Unix, mas não ao Command Prompt ou Powershell do Windows. Para isso você precisa de um &lt;a href="http://serverfault.com/questions/8411/what-is-a-good-ssh-server-to-use-on-windows"&gt;servidor &lt;span class="caps"&gt;SSH&lt;/span&gt; comercial&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;&lt;em&gt;&amp;#8220;Click e click Não é administração de sistemas. Um bom sysadmin tem intimidade com o console/shell.&amp;#8221;&lt;/em&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kh3Ak585NilnERmsyeLjg_ZuEis/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kh3Ak585NilnERmsyeLjg_ZuEis/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kh3Ak585NilnERmsyeLjg_ZuEis/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kh3Ak585NilnERmsyeLjg_ZuEis/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=I6aSP6hQtGc:1cBKkICfHy8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=I6aSP6hQtGc:1cBKkICfHy8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=I6aSP6hQtGc:1cBKkICfHy8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=I6aSP6hQtGc:1cBKkICfHy8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=I6aSP6hQtGc:1cBKkICfHy8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=I6aSP6hQtGc:1cBKkICfHy8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=I6aSP6hQtGc:1cBKkICfHy8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/I6aSP6hQtGc" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/10/04/off-topic-windows-and-unix-promiscuidade</feedburner:origLink></item><item><title>[Rails Summit 2009] Palestrante Nando Vieira</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/Gwl6RIuk-gk/rails-summit-2009-palestrante-nando-vieira</link><pubDate>Thu, 01 Oct 2009 08:32:35 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5213</guid><description>&lt;p style="text-align: center"&gt;&lt;a href="http://www.railssummit.com.br?utm_campaign=Railssummit&amp;utm_source=banner_parceiros&amp;utm_medium=banner&amp;utm_content=por_728x90"&gt;&lt;img src="http://railssummit.com.br/imgs/43/original/728x90.gif" alt="Rails Summit 2009"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;English translation:&lt;/strong&gt; click &lt;a href="/2009/10/01/rails-summit-2009-palestrante-nando-vieira#nando_english"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;div style="float: left; margin: 3px"&gt;&lt;a href="http://www.railssummit.com.br"&gt;&lt;img src="http://railssummit.locaweb.com.br/imgs/20/original/nando.jpg" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://railssummit.locaweb.com.br/pt-BR/speakers#nando_vieira"&gt;Nando Vieira&lt;/a&gt; é um dos rubistas mais antigos da nossa comunidade. Ele bloga no &lt;a href="http://simplesideias.com.br/"&gt;Simples Ideias&lt;/a&gt;, um dos blogs mais conhecidos sobre Ruby on Rails do Brasil. Trabalha atualmente como desenvolvedor web na Abril Digital, utilizando Rails. É também o fundador do &lt;a href="http://spesa.com.br/"&gt;Spesa&lt;/a&gt;, além de manter dezenas de &lt;a href="http://github.com/fnando"&gt;projetos Open-source&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Recentemente lançou um e-Book da sua série &lt;a href="http://howto.simplesideias.com.br/"&gt;&lt;span class="caps"&gt;HOWTO&lt;/span&gt;&lt;/a&gt; entitulado &lt;a href="http://simplesideias.com.br/pdf-o-que-mudou-no-ruby-1-9/"&gt;O que mudou no Ruby 1.9&lt;/a&gt;. Da mesma série você pode baixar o e-Book gratuito &lt;a href="http://howto.simplesideias.com.br/rails-application-templates"&gt;Rails Application Templates&lt;/a&gt; que ele também escreveu.&lt;/p&gt;
&lt;p&gt;Venha conhecê-lo no &lt;a href="http://www.railssummit.com.br"&gt;Rails Summit Latin America&lt;/a&gt;, que acontece nos dias 13 e 14 de Outubro. Estamos chegando perto. Você já se inscreveu?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Como você encontrou Ruby/Rails, o que foi que mais o atraiu?&lt;/p&gt;
&lt;p&gt;Conheci o Rails ainda na versão 0.13. Na época, não tinha quase nenhum blog em português sobre o tema e decidi criar o meu! Tinha visto algum artigo falando sobre ele e sobre como era fácil criar aplicativos e fui conferir. Por coincidência, estava querendo conhecer uma nova linguagem e quando vi a sintaxe do Ruby, decidi que era ela que eu iria aprender! E nessa estou até hoje!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; O que você tem estudado ou desenvolvido recentemente, seja em projetos particulares ou open source?&lt;/p&gt;
&lt;p&gt;Tenho visto bastante coisa sobre o Ruby 1.9, principalmente para poder adequar meus projetos a esta versão. Além disso, tenho me interessado bastante sobre testes em geral, principalmente Javascript (&lt;a href="http://visionmedia.github.com/jspec/"&gt;JSpec&lt;/a&gt; e &lt;a href="http://pivotallabs.com/users/nick/blog/articles/433-screw-unit-a-new-js-testing-framework-version-0-1"&gt;Screw Unit&lt;/a&gt;) e Aceitação (Cucumber).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Sobre o que trata a sua palestra e para quais tipos de desenvolvedores é mais indicado?&lt;/p&gt;
&lt;p&gt;Irei abordar as mudanças do Ruby 1.9 em relação à versão 1.8, com exemplos mostrando as novas funcionalidades e como corrigir comportamentos que deixaram de funcionar. É um assunto indicado para todos os programadores, pois cedo ou tarde, esta será a versão recomendada!&lt;/p&gt;&lt;p&gt;&lt;a name="nando_english"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Speaker Nando Vieira&lt;/h2&gt;
&lt;div style="float:left; margin: 3px"&gt;&lt;a href="http://www.railssummit.com.br/en/home"&gt;&lt;img src="http://railssummit.locaweb.com.br/imgs/20/original/nando.jpg" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://railssummit.locaweb.com.br/en/speakers#nando_vieira"&gt;Nando Vieira&lt;/a&gt; is one of the luminaries of the Brazilian Ruby Community. He blogs at &lt;a href="http://simplesideias.com.br/"&gt;Simples Idéias&lt;/a&gt;, one of the most popular blogs about Ruby on Rails in Brazil. He currently works as web developer for April Digital, using Rails. He&amp;#8217;s also the founder of &lt;a href="http://spesa.com.br/"&gt;Spesa&lt;/a&gt;, and maintains dozens of &lt;a href="http://github.com/fnando"&gt;Open-source projects&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;He recently released an e-book of his &lt;a href="http://howto.simplesideias.com.br/"&gt;&lt;span class="caps"&gt;HOWTO&lt;/span&gt;&lt;/a&gt; series titled &lt;a href="http://howto.simplesideias.com.br/o-que-mudou-no-ruby-19/"&gt;What has changed in Ruby 1.9&lt;/a&gt;. In the same series you can download the free e-Book &lt;a href="http://howto.simplesideias.com.br/rails-application-templates"&gt;Rails Application Templates&lt;/a&gt; which he also wrote.&lt;/p&gt;
&lt;p&gt;Come meet him at &lt;a href="http://www.railssummit.com.br/en/home"&gt;Rails Summit Latin America&lt;/a&gt;, on October 13th and 14th. We&amp;#8217;re getting close. Have you registered already?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; How did you find Ruby/Rails, what attracted you the most?&lt;/p&gt;
&lt;p&gt;I found Rails when it was still in version 0.13. At the time, there was nearly zero blogs in Portuguese about the subject and I decided to create my own! I had seen an article talking about how easy it was to create applications with it and I decided to give it a shot. Coincidentally, I was thinking of learning a new language and when I saw the syntax of Ruby, it was decided that I would learn it! And I continued up to this day.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; What have you studied or developed recently, for private projects or open source?&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve seen quite a lot about Ruby 1.9, mainly in order to tailor my projects to this version. Also, I have been concerned enough about testing in general, especially Javascript (&lt;a href="http://visionmedia.github.com/jspec/"&gt;JSpec&lt;/a&gt; and &lt;a href="http://pivotallabs.com/users/nick/blog/articles/433-screw-unit-a-new-js-testing-framework-version-0-1"&gt;Screw Unit&lt;/a&gt;) and Acceptance Testing (Cucumber).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; What is your talk about and what kinds of developers are going to benefit the most?&lt;/p&gt;
&lt;p&gt;I will address the changes in Ruby 1.9 from version 1.8, with examples showcasing the new features and how to fix the behaviors that no longer work. It is a subject recommended for all developers, because sooner or later, this will become the mainstream version!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4k8X_tbVZ9u02Hdj9VhPruShAG8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4k8X_tbVZ9u02Hdj9VhPruShAG8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4k8X_tbVZ9u02Hdj9VhPruShAG8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4k8X_tbVZ9u02Hdj9VhPruShAG8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=Gwl6RIuk-gk:GiLVKM1oS4Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=Gwl6RIuk-gk:GiLVKM1oS4Q:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=Gwl6RIuk-gk:GiLVKM1oS4Q:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=Gwl6RIuk-gk:GiLVKM1oS4Q:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=Gwl6RIuk-gk:GiLVKM1oS4Q:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=Gwl6RIuk-gk:GiLVKM1oS4Q:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=Gwl6RIuk-gk:GiLVKM1oS4Q:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/Gwl6RIuk-gk" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/10/01/rails-summit-2009-palestrante-nando-vieira</feedburner:origLink></item><item><title>[Rails Summit 2009] Palestrante Ilya Grigorik</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/-wnKnUPVL9Y/rails-summit-2009-palestrante-ilya-grigorik</link><pubDate>Sun, 27 Sep 2009 19:18:40 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5212</guid><description>&lt;p style="text-align: center"&gt;&lt;a href="http://www.railssummit.com.br?utm_campaign=Railssummit&amp;utm_source=banner_parceiros&amp;utm_medium=banner&amp;utm_content=por_728x90"&gt;&lt;img src="http://railssummit.com.br/imgs/43/original/728x90.gif" alt="Rails Summit 2009"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;English translation:&lt;/strong&gt; click &lt;a href="/2009/09/27/rails-summit-2009-palestrante-ilya-grigorik#ilya_english"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;div style="float: left; margin: 3px"&gt;&lt;a href="http://railssummit.locaweb.com.br/en/speakers#ilya_grigorik"&gt;&lt;img src="http://railssummit.locaweb.com.br/imgs/11/original/Ilya.jpg" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://railssummit.locaweb.com.br/en/speakers#ilya_grigorik"&gt;Ilya Grigorik&lt;/a&gt; é um desenvolvedor Ruby bem conhecido, especialmente por causa do seu blog &lt;a href="http://igvita.com"&gt;Igvita.com&lt;/a&gt; onde encontramos alguns dos artigos tecnicamente mais ricos e ainda assim de fácil compreensão, não só em torno de aplicações Rails, mas tudo que se relaciona com ele, incluindo drivers de banco de dados, análise de desempenho, integração de serviços e muito mais. Por causa disso ele foi premiado como &lt;a href="http://weblog.rubyonrails.org/2009/2/18/2009-ruby-hero-awards"&gt;Ruby Hero&lt;/a&gt; na RailsConf 2008 em Portland.&lt;/p&gt; 
&lt;p&gt;Ele também é o fundador do &lt;a href="http://www.postrank.com/"&gt;PostRank&lt;/a&gt;, um sistema de monitoramento em tempo real de  engajamento social de mídia e plataforma de análise. Ele acabou de lançar um outro produto complementar chamado &lt;a href="http://analytics.postrank.com/"&gt;Analytics&lt;/a&gt;, outra ótima maneira de controlar os seus relacionamentos.&lt;/p&gt;
&lt;p&gt;Você terá uma grande oportunidade de conhecê-lo no &lt;a href="http://www.railssummit.com.br/en/home"&gt;Rails Summit Latin America&lt;/a&gt; este ano. Não esqueça de se inscrever logo! Estamos apenas a mais alguns dias de distância!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; O que você mais gosta sobre a linguagem Ruby, o recurso ou conceito que &amp;#8220;clica&amp;#8221; para você?&lt;/p&gt;
&lt;p&gt;Eu não consigo escolher apenas um atributo, pois como a maioria das coisas, geralmente é a soma das partes que compõe a experiência. E, na verdade, é o que eu mais gosto sobre Ruby: todas as peças &amp;#8220;clicam&amp;#8221; juntas. As decisões de design por trás da linguagem Ruby dão uma natureza incrivelmente maleável: é fácil estendê-lo, é fácil modificá-lo, é fácil fazê-lo funcionar da maneira que você precisa para trabalhar na sua aplicação. Rails é o principal exemplo disso, mas as centenas de outras estruturas construídas em cima de Ruby são todos exemplos dessa propriedade.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Como um desenvolvedor Rails, o que é a coisa que você realmente gosta quando está codificando aplicações web?&lt;/p&gt;
&lt;p&gt;A capacidade de ir do nada para um protótipo totalmente operacional, em uma xícara de café. Se você está olhando para uma aplicação Rails, ou uma rápida em Sinatra / Rails Metal, a enorme quantidade de recursos e plugins torna o processo divertido e imediatamente gratificante.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Qual é a sua mais recente pesquisa ou interesse em desenvolvimento?&lt;/p&gt;
&lt;p&gt;Muito do meu tempo é dedicado à investigação e criação de protótipos de instrumentos e abordagens de arquiteturas de software distribuído &amp;#8211; desde mensagens, para balanceamento de carga, a bancos de dados. Combinado com o fato de que a maioria dos serviços que implantamos no &lt;a href="http://www.postrank.com"&gt;PostRank&lt;/a&gt; são escritos em Ruby, significa também se aprofundar mais na compreensão das partes internas do Ruby, tentando otimizar a VM para uma arquitetura distribuída.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Sobre o que é a sua palestra para o Rails Summit e quem são os tipos de desenvolvedores que se beneficiarão mais?&lt;/p&gt;
&lt;p&gt;Nesta palestra vou cobrir as tecnologias emergentes por trás da &amp;#8220;Real-Time Web&amp;#8221; (&lt;span class="caps"&gt;XMPP&lt;/span&gt;, &lt;span class="caps"&gt;AMQP&lt;/span&gt;, &lt;span class="caps"&gt;PSHB&lt;/span&gt;, Webhooks). A adoção do Rails ao modelo RESTful liberou os dados dos aplicativos e nos permitiu definir serviços que poderiam facilmente falar uns com os outros, a Real-Time Web está indo um passo além: em vez de diferentes web-services se consultando o tempo todo, conectá-los através de interfaces &lt;em&gt;push&lt;/em&gt;. Esta palestra terá início a partir do início e fornecerá uma visão geral de alto nível das tecnologias subjacentes. Saindo dela, você deve ser capaz de diferenciar e decidir sobre qual tecnologia se adaptará melhor às suas necessidades (não são todos iguais!).&lt;/p&gt;&lt;p&gt;&lt;a name="ilya_english"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Speaker Ilya Grigorik&lt;/h2&gt;
&lt;div style="float: left; margin: 3px"&gt;&lt;a href="http://railssummit.locaweb.com.br/en/speakers#ilya_grigorik"&gt;&lt;img src="http://railssummit.locaweb.com.br/imgs/11/original/Ilya.jpg" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://railssummit.locaweb.com.br/en/speakers#ilya_grigorik"&gt;Ilya Grigorik&lt;/a&gt; is a very well known Ruby developer, specially from his blog &lt;a href="http://igvita.com"&gt;Igvita.com&lt;/a&gt; where one can find some of the most technically rich yet easily understandable articles surrounding not only Rails apps but everything that goes with it, including database drivers, performance analysis, services integration and much more. Because of that he was awarded &lt;a href="http://weblog.rubyonrails.org/2009/2/18/2009-ruby-hero-awards"&gt;Ruby Hero&lt;/a&gt; at RailsConf 2008 in Portland.&lt;/p&gt;
&lt;p&gt;He is also the founder of &lt;a href="http://www.postrank.com"&gt;PostRank&lt;/a&gt;, a real-time social media engagement monitoring and analytics platform. He just released another companion product called &lt;a href="http://analytics.postrank.com/"&gt;Analytics&lt;/a&gt;, another great way to keep track of your online engagements.&lt;/p&gt;
&lt;p&gt;You will have a great opportunity to get to know him at &lt;a href="http://www.railssummit.com.br/en/home"&gt;Rails Summit Latin America&lt;/a&gt; this year. Don&amp;#8217;t forget to Register! We&amp;#8217;re just a few more days away!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; What do you like the most about the Ruby language, what feature or concept really &amp;#8220;clicks&amp;#8221; for you?&lt;/p&gt;
&lt;p&gt;I can never pick any one attribute because as with most things, it is usually the sum of parts that makes up the experience. And in fact, that&amp;#8217;s what I enjoy most about Ruby: all the parts click together. The design decisions behind the language give Ruby an incredibly malleable nature: it is easy to extend it, it is easy to modify it, it is easy to make it work in just the way you need it to work for your application. Rails is the premier example of this, but the hundreds of other frameworks built on top of Ruby are all examples of this property.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; As a Rails developer, what is the thing you really enjoy when you&amp;#8217;re coding web apps?&lt;/p&gt;
&lt;p&gt;The ability to go from nothing to a fully operational prototype with one cup of coffee. Whether you&amp;#8217;re looking at a fully fledged Rails application, or a quick Sinatra / Rails Metal app, the sheer amount of resources, and plugins makes the process both fun and immediately rewarding.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; What are your most recent research or development interests?&lt;/p&gt;
&lt;p&gt;A lot of my time is always dedicated to research and prototyping of tools and approaches for distributed software architectures &amp;#8211; anything from messaging, to load balancing, to databases. Combined with the fact that most of the services we deploy at &lt;a href="http://www.postrank.com"&gt;PostRank&lt;/a&gt; are written in Ruby, it also means delving deeper into understanding the internals of Ruby, and trying to optimize the VM for the distributed architecture.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; What is your Rails Summit talk about and who are the kind of developers that will benefit the most?&lt;/p&gt;
&lt;p&gt;In this talk I will cover the emerging technologies behind the &amp;#8217;Real-Time Web&amp;quot; (&lt;span class="caps"&gt;XMPP&lt;/span&gt;, &lt;span class="caps"&gt;AMQP&lt;/span&gt;, &lt;span class="caps"&gt;PSHB&lt;/span&gt;, Webhooks). Rails adoption of the RESTful model liberated the data from the app and allowed us to define services that could easily talk to each other, the Real-Time Web is looking to go one step beyond that: instead of polling different web-services, it aims to connect them via push interfaces. This talk will start from the beginning and will provide a high-level overview of the underlying technologies. Coming out of it, you should be able to differentiate and decide on which technology suits your needs best (they are not all the same!).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Wtpg31KE-HcPCSeIn3GKv3vyVZQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Wtpg31KE-HcPCSeIn3GKv3vyVZQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Wtpg31KE-HcPCSeIn3GKv3vyVZQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Wtpg31KE-HcPCSeIn3GKv3vyVZQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=-wnKnUPVL9Y:98vWv9JUI6c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=-wnKnUPVL9Y:98vWv9JUI6c:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=-wnKnUPVL9Y:98vWv9JUI6c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=-wnKnUPVL9Y:98vWv9JUI6c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=-wnKnUPVL9Y:98vWv9JUI6c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=-wnKnUPVL9Y:98vWv9JUI6c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=-wnKnUPVL9Y:98vWv9JUI6c:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/-wnKnUPVL9Y" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/09/27/rails-summit-2009-palestrante-ilya-grigorik</feedburner:origLink></item><item><title>[Off-Topic] Procurar Raciocionar Faz Bem</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/Il8zLI32whk/off-topic-procurar-raciocionar-faz-bem</link><pubDate>Sat, 26 Sep 2009 18:17:54 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5211</guid><description>&lt;p style="text-align: center"&gt;&lt;a href="http://www.railssummit.com.br?utm_campaign=Railssummit&amp;utm_source=banner_parceiros&amp;utm_medium=banner&amp;utm_content=por_728x90"&gt;&lt;img src="http://railssummit.com.br/imgs/43/original/728x90.gif" alt="Rails Summit 2009"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Esta semana surgiram alguns artigos interessantes, todos relacionados de alguma forma ao pensamento &amp;#8220;Agile&amp;#8221; de desenvolvimento de software.&lt;/p&gt;
&lt;div style="float: right; margin: 3px"&gt;&lt;img src="/assets/2009/9/26/Screen_shot_2009-09-26_at_6.51.42_PM_original.png" alt="" /&gt;&lt;/div&gt;&lt;p&gt;O primeiro, que eu achei muito bom, foi o &lt;a href="http://blog.obiefernandez.com/content/2009/09/10-reasons-pair-programming-is-not-for-the-masses.html"&gt;10 razões porque Pair Programming não é para as massas&lt;/a&gt; que o Obie Fernandez escreveu a respeito de sua própria experiência com programação pareada e porque ela é difícil de ser implementada na maioria dos lugares.&lt;/p&gt;
&lt;p&gt;Esses pontos se resumem em limitações físicas (cubículos são tão século XX &amp;#8230;), convencionalismos corporativos ainda em voga (entrevistas feitas por RH baseado em currículo, primando por certificação, por exemplo). Para mim, dois dos pontos mais importantes são o 6o. e o 2o. Como qualquer conceito, interpretado da forma errada, dará resultados errados.&lt;/p&gt;
&lt;p&gt;A primeira coisa que um programador precisa entender sobre programação pareada é que existem sempre piloto e co-piloto. Há a imagem de que o piloto é o indivíduo produtivo naquele instante e o co-piloto apenas olha e acompanha, passivo, silencioso. De jeito nenhum: esta é a forma errada de se parear e é a forma que, corretamente, os não-programadores (gerentes, etc) imaginam estar pagando 2 pessoas mas tendo apenas o serviço de 1. Em programação pareada, &lt;strong&gt;ambos&lt;/strong&gt; precisam obrigatoriamente estar participando. O co-piloto deve estar atento aos erros do piloto. O co-piloto deve estar pensando à frente, já imaginando alternativas melhores, eles devem estar ambos engajados em encontrar as melhores soluções. Mais do que isso: o teclado e o mouse devem conseguir trocar de mãos constantemente. Não existe pareamento onde o co-piloto fica o dia inteiro apenas observando. Se o co-piloto é passivo e silencioso, o piloto está pilotando sozinho, é como se ele estivesse sozinho, ponto.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="/assets/2009/9/26/ying_eric_pair_programming_original.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Existem pelo menos dois tipos de pares: onde ambos são razoavelmente equivalentes em termos de capacidades ou onde um dos dois é menos experiente ou tem capacidades um pouco diferentes. No primeiro caso, a dinâmica deve ser mais óbvia, as idéias vão bater mais vezes, eles vão conseguir decidir coisas mais rapidamente. No segundo caso, um deles tem o objetivo de aprender rápido. Mais do que isso, o que sabe menos tem a obrigação de arriscar mais, sempre sob a supervisão do mais experiente. E jamais deve ser passivo, ele deve buscar conhecimento fora, quando não estão pareando, e nunca deve esperar que tudo o que ele vai aprender é o piloto quem tem a obrigação de ensinar. Isso é errado: quem sabe menos é quem sempre tem a obrigação de correr atrás, ou então assumir que não vai conseguir e abdicar da posição.&lt;/p&gt;
&lt;p&gt;Lembrando que o valor fundamental da Agilidade se chama &lt;em&gt;&amp;#8220;Accountability&amp;#8221;&lt;/em&gt;, não consigo traduzir isso ao pé-da-letra em português, mas seria algo além do que &amp;#8220;responsável&amp;#8221;. Uma equipe Ágil é uma equipe conscientemente &amp;#8220;accountable&amp;#8221; pelo que faz. Quando eles se decidem, junto com o cliente, o product owner, sobre o Sprint Backlog, por exemplo, eles não estão recebendo &amp;#8220;ordens&amp;#8221; do tipo &lt;em&gt;&amp;#8220;este sprint terá estas 10 user stories porque o chefe mandou.&amp;#8221;&lt;/em&gt; Não, a equipe que se compromete com 10 stories está de fato se &amp;#8220;comprometendo&amp;#8221;, ou seja, ela tem consciência da sua velocidade, das suas capacidade e das suas fraquezas e toma uma decisão racional baseada nisso. Uma equipe que depois diz &lt;em&gt;&amp;#8220;não deu para entregar porque pediram demais,&amp;#8221;&lt;/em&gt; está se esquivando da sua responsabilidade. Ela deveria ter dito, no começo, &lt;em&gt;&amp;#8220;não, só conseguiremos fazer 8 dessas user stories, 10 é demais.&amp;#8221;&lt;/em&gt; Combinado não sai caro. É tudo uma questão de acertar expectativas e negociar, colaborar em buscar a melhor solução, não &amp;#8220;qualquer&amp;#8221; solução.&lt;/p&gt;
&lt;p style="text-align: center; margin: 3px"&gt;&lt;img src="/assets/2009/9/26/pair_programming_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;O mesmo vale no mundo reduzido entre 2 programadores pareando. Ambos precisam estar comprometidos com o que estão produzindo e com o colega. Se um deles é menos experiente, ele não deve ser o peso morto. Por outro lado, claro, se o mais experiente vê que o outro está tentando, ele deve ajudá-lo. Há um limite, claro, entre &amp;#8220;ajudar&amp;#8221; e &amp;#8220;carregar nas costas&amp;#8221;. Aqui vale a honestidade, e por isso existe uma fase no fim do Sprint chamado &amp;#8220;Retrospectiva&amp;#8221;, é exatamente o momento para se discutir isso e deixar tudo aberto, às claras. &lt;em&gt;&amp;#8220;Eu não gosto do fato de estar produzindo sozinho, enquanto meu par não está ajudando.&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Programação em Par, por si só, é apenas uma técnica. Mas lembrem-se que antes disso existem os valores do &lt;a href="http://agilemanifesto.org/"&gt;Manifesto Ágil&lt;/a&gt;. Todos sempre se esquecem: &lt;em&gt;&amp;#8220;Indivíduos e Interações mais do que Processos e Ferramentas.&amp;#8221;&lt;/em&gt; Se você está ainda se perguntando &amp;#8220;quais das técnicas Ágeis eu devo escolher usar&amp;#8221;, você ainda não entendeu. Antes de mais nada: você está comprometido com seu projeto? Sua equipe está comprometida com o projeto e com seus pares? Quais são os problemas que você quer resolver? Agilidade, por si só, não é uma receita mágica. Ela tem propósitos, se você não está mirando nesses propósitos, mas apenas escolhendo aleatoriamente 2 ou 3 práticas, isso não o torna Ágil, isso apenas o torna aleatório.&lt;/p&gt;
&lt;div style="float: right; margin: 3px"&gt;&lt;img src="/assets/2009/9/26/493px-Joel_spolsky_on_20_sept_2007_original.jpg" alt="" /&gt;&lt;/div&gt;&lt;p&gt;Daí vem o artigo do Joel Spolsky, sobre &lt;a href="http://www.joelonsoftware.com/items/2009/09/23.html"&gt;O Programador Fita Adesiva&lt;/a&gt;. Nesse artigo ele celebra um programador chamado Jamie Zawinski, de fato um grande programador, que trabalhou na Netscape produzindo software que ajudou a mudar o mundo, literalmente. Zawinski, segundo Spolsky, é do tipo &lt;em&gt;&amp;#8220;vamos lançar software o mais rápido possível, não importa como.&amp;#8221;&lt;/em&gt; e também do tipo &lt;em&gt;&amp;#8220;testes unitários são bonitos, mas quando o prazo aperta, o que importa é fazer rápido, e testes atrapalham.&amp;#8221;&lt;/em&gt; Lido da maneira errada, ela se torna uma desculpa para maus programadores dizerem: &lt;em&gt;&amp;#8220;Viva! Estou confirmado! Joel Spolsky disse que é bonito ser um programador cowboy!&amp;#8221;&lt;/em&gt; Pior ainda: &lt;em&gt;&amp;#8220;Joel Spolsky disse que eu não preciso me preocupar com testes.&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Antes de pular para alguma conclusão precipitada &amp;#8211; maldita geração &amp;#8220;fast-food&amp;#8221; &amp;#8211; leia a resposta a esse post escrita pelo bom e velho &lt;a href="http://blog.objectmentor.com/articles/2009/09/24/the-duct-tape-programmer"&gt;Uncle Bob Martin&lt;/a&gt; onde ele refuta esses argumentos. Na realidade Spolsky e Bob já andaram se &amp;#8220;pegando&amp;#8221; algumas vezes no passado quando num podcast o &lt;a href="http://www.infoq.com/news/2009/02/spolsky-vs-uncle-bob"&gt;Spolsky menosprezou &lt;span class="caps"&gt;TDD&lt;/span&gt; e os princípios &lt;span class="caps"&gt;SOLID&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Robert Martin, que se você não conhece, foi quem originou a reunião de uns 10 anos atrás, junto com os principais pensadores em desenvolvimento de software como Kent Beck, Martin Fowler, Dave Thomas, Jeff Sutherland, dentre tantos outros, que deu origem ao Manifesto Ágil. Ele que é programador ativo desde antes ainda de qualquer um de nós ter nascido e que ainda programa até hoje. E não estou dizendo um sênior que ainda só programa em Cobol, muito pelo contrário, que já passou pelas principais plataformas tecnológicas, entende orientação a objetos como ninguém, programa em Java, e é um defensor de &lt;a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882"&gt;Código Limpo&lt;/a&gt;. Aliás, se você é usuário do Github, pode encontrar alguns &lt;a href="http://github.com/unclebob"&gt;projetos do Bob&lt;/a&gt; por lá também.&lt;/p&gt;
&lt;p&gt;Algum tempo atrás, eu provavelmente estaria &lt;a href="/2006/9/27/flame-war-joel-spolsky-vs-rails"&gt;xingando e amaldiçoando&lt;/a&gt; o Spolsky, porém eu acho que entendo a posição dele. Dando o contexto, o Spolsky é de fato um grande empresário, tem uma empresa bem sucedida, com produtos de nicho bem sucedidos, não deixa de ser uma 37signals da geração anterior. Ex-funcionário da Microsoft, ele foi um dos responsáveis pela existência do Visual Basic for Applications, que até hoje é o coração do Excel e a menina-dos-olhos de qualquer contador, analista, etc que basicamente não vivem sem as macros do Excel. Junto com Jeff Atwood ele mantém o famoso site &lt;a href="http://stackoverflow.com/"&gt;StackOverflow&lt;/a&gt;. Além disso tem o excelente livro &lt;a href="http://www.amazon.com/Joel-Software-Occasionally-Developers-Designers/dp/1590593898"&gt;Joel on Software&lt;/a&gt;.&lt;/p&gt;
&lt;div style="float: left; margin: 3px"&gt;&lt;img src="/assets/2009/9/26/photo_martin_r_original.jpg" alt="" /&gt;&lt;/div&gt;&lt;p&gt;Neste ponto eu estou assumindo que não preciso lhes explicar o que é &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;Agilidade&lt;/a&gt;, nem quais são algumas das principais boas práticas de &lt;a href="http://www.extremeprogramming.org/"&gt;Extreme Programming&lt;/a&gt;, nem o que são os &lt;a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod"&gt;princípios &lt;span class="caps"&gt;SOLID&lt;/span&gt;&lt;/a&gt; do Bob Martin. Também estou assumindo que você já leu pelo menos alguns dos &lt;a href="http://www.joelonsoftware.com/"&gt;artigos&lt;/a&gt; do Spolsky para ter uma idéia do que ele costuma falar.&lt;/p&gt;
&lt;p&gt;Normalmente um agilista parece que está numa posição de &amp;#8220;convencer&amp;#8221; os outros de porque ser ágil é melhor. Mais do que isso: de que ser &amp;#8220;ágil&amp;#8221; e ser &amp;#8220;rápido&amp;#8221; não são sinônimos. Ser rápido é um efeito colateral de ser ágil. Essas interpretações são sutis.&lt;/p&gt;
&lt;p&gt;Por isso mesmo o que eu amaldiçôo é a geração fast-food: uma geração que se acostumou a pensar que as coisas são simples e superficiais. Que basta comprar um livro de &amp;#8220;emagreça em 7 dias&amp;#8221; para realmente emagrecer. Surpresa: se esse tipo de coisa realmente funcionasse, não haveria obesos no mundo. Duh.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="/assets/2009/9/26/BurningTheWitch_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Essa mesma geração lê o que o Spolsky fala e, superficialmente, chega às conclusões que falei acima: &lt;em&gt;&amp;#8220;o Spolsky concorda que eu devo ser cowboy.&amp;#8221;&lt;/em&gt; E eu acho que muitos de nós, agilistas, somos vítimas disso também. Na ânsia de responder à essa superficialidade, acabamos até ultrapassando a linha. O Bob Martin, por exemplo, poderia simplesmente ter ignorado esse post em vez de ter respondido.&lt;/p&gt;
&lt;p&gt;Pessoas passivas, conformistas, esperam ser validadas. Elas não entendem porque fazem o que fazem, apenas fazem. Claro, fazem o que lhes parece mais simples, mais fácil, mais seguro, e não o que tem chances de ser melhor, que pode trazer mais benefícios, ou que seja novo. Elas querem que as pessoas gostem delas. Não importa se estão fazendo as coisas certas ou não. Não importa se há maneira melhor. Por isso essa ânsia em validação. Foi sobre isso que traduzi no artigo &lt;a href="/2009/09/08/off-topic-o-culto-da-moral-cinzenta"&gt;Culto da Moral Cinzenta&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Quando alguém do &amp;#8220;calibre&amp;#8221; &amp;#8211; pelo menos do &amp;#8220;calibre&amp;#8221; perceptível &amp;#8211; de um Spolsky lança um post como esse, milhares de programadores nitidamente ruins ao redor do mundo se sentem validadas, justificadas. É um cenário triste.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="/assets/2009/9/26/BRILLIANT_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;E o Spolsky não está errado. O que ele coloca em cada um de seus artigos são pedaços de sua própria experiência. Cada pedaço, individualmente, não significa absolutamente nada. E não deve ser levado ao pé-da-letra. Aliás, nem mesmo o que o Bob Martin escreve num artigo. Nem mesmo o que eu escrevo num artigo. O resultado da soma das partes é ordens de grandeza maior do que a simples soma dos valores individuais de cada parte. É assim que funciona o caos.&lt;/p&gt;
&lt;p&gt;Ambos, Spolsky e Bob, não são antagônicos. O que um diz não invalida o que o outro diz. Esse é o truque. Ambos são &amp;#8220;pragmáticos&amp;#8221;, pelo menos segundo a definição de Pragmatismo de William James, onde algo é verdade para uma pessoa se ela tem utilidade para ela, independente se essa verdade continua sendo verdade para outra pessoa. (claro, ainda existe a interpretação de pragmatismo de Peirce e Dewey, mas isso é outra história). Ambos tentam explicar o que fazem que funcionam para eles. Dentro de um contexto, dentro do entendimento das premissas, dentro do entendimento dos valores, isso pode talvez funcionar para você também.&lt;/p&gt;
&lt;p&gt;O que quero dizer é que o que o Spolsky diz faz sentido para ele. O que Bob Martin diz faz sentido para ele. Se o que eles dizem fazem sentido para mim, ou para você, isso &lt;strong&gt;não&lt;/strong&gt; é problema deles, não é culpa deles, não deveria ser sequer do interesse deles. Da mesma forma, não usem o nome deles para justificar o que você faz ou diz sem entender porque está dizendo isso. &lt;em&gt;&amp;#8220;Eu faço &lt;span class="caps"&gt;TDD&lt;/span&gt; porque o Kent Beck disse que é bom&amp;#8221;&lt;/em&gt; é tão ruim de se dizer quanto &lt;em&gt;&amp;#8220;Eu faço código-grude porque o Zawinski disse que é melhor.&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Você deve dizer: &lt;em&gt;&amp;#8220;Eu faço &lt;span class="caps"&gt;TDD&lt;/span&gt; porque eu &lt;strong&gt;sei&lt;/strong&gt; quais são os benefícios que isso trás para mim.&amp;#8221;&lt;/em&gt; Ou, &lt;em&gt;&amp;#8220;Eu faço código-grude de vez em quando porque tenho &lt;strong&gt;consciência&lt;/strong&gt; das consequências que isso vai me trazer e aceito pagar o preço por isso.&amp;#8221;&lt;/em&gt; Ou, &lt;em&gt;&amp;#8220;Eu não faço programação em par o tempo todo porque eu já &lt;strong&gt;analisei&lt;/strong&gt; e concluí que no meu caso isso não funciona muito bem.&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Aliás, tudo que eu digo aqui &amp;#8211; no meu blog &amp;#8211; são elocubrações, reflexões pessoais, que porventura encontram seu caminho na forma escrita. Alguns acham que eu &amp;#8220;me acho o dono da verdade&amp;#8221;. Pois bem, isso é um problema de quem acha isso, não meu.&lt;/p&gt;
&lt;p&gt;Verdade seja dita: assim como o Bob diz no artigo dele, eu também não faço testes o tempo todo, muito menos testes primeiro como dita o &lt;span class="caps"&gt;TDD&lt;/span&gt;. Conheci as práticas de Extreme Programming apenas muitos anos depois que comecei como programador. Fui um programador extremamente cowboy a maior parte da minha carreira. E, mesmo entendendo porque todas as práticas ágeis são boas e porque eu deveria usá-las, eu ainda raciocino onde e quando devo usar o que. Quer dizer, eu entendo os princípios, as premissas e os resultados esperados. Caso contrário isso seria &lt;a href="http://en.wikipedia.org/wiki/Dogma"&gt;dogmatização&lt;/a&gt; e, por definição, tudo que é dogmatizado é ruim. &lt;strong&gt;Dogmas são a origem de todo o mal&lt;/strong&gt;. Tudo deve ser questionado, experimentado, medido, analisado e só então alguma conclusão pode surgir e, mesmo assim, pode ser refutado no futuro por novas evidências. O oposto de Dogma ou mesmo Cargo Cult é o &lt;a href="/2008/12/16/off-topic-m-todo-cient-fico-vs-cargo-cult"&gt;Método Científico&lt;/a&gt; como eu já expliquei anteriormente.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="/assets/2009/9/26/world-trade-center_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Só porque foi o Martin Fowler quem falou, não torna isso uma verdade incontestável. Só porque o &lt;a href="http://en.wikipedia.org/wiki/Ward_Cunningham"&gt;Ward Cunningham&lt;/a&gt; falou não é verdade absoluta. Todos eles, todos nós, somos seres humanos e, como tal, somos muito falíveis. Nós falhamos, e falhamos muito mais do que gostaríamos.&lt;/p&gt;
&lt;p&gt;Num mundo onde as pessoas falham, o que funciona melhor é o conhecimento coletivo, onde a possibilidade do erro de um é compensada pela inteligência complementar do outro. Por isso mesmo comunidades &amp;#8211; apenas as que primam pelo conhecimento e evolução, claro &amp;#8211; tendem a ser ordens de grandeza menos falíveis do que um único indivíduo.&lt;/p&gt;
&lt;p&gt;Se um indivíduo tem o conhecimento &amp;#8220;A&amp;#8221;, se outro indivíduo tem o conhecimento &amp;#8220;B&amp;#8221;, nenhum dos dois tem o conhecimento &amp;#8220;total&amp;#8221;, mas o conjunto dos dois, a &amp;#8220;comunidade&amp;#8221;, tem ambos os conhecimentos. Sozinhos eles sabem apenas parte da informação. Porém a &amp;#8220;entidade&amp;#8221; chamada &amp;#8220;comunidade&amp;#8221; é o mais próximo que conseguiremos chegar de &lt;a href="http://rubyurl.akitaonrails.com/SiAN"&gt;omnisciência&lt;/a&gt;.&lt;/p&gt;
&lt;div style="float: left; margin: 3px"&gt;&lt;img src="/assets/2009/9/26/charles_darwin_l_original.jpg" alt="" /&gt;&lt;/div&gt;&lt;p&gt;Por acaso, compartilhar conhecimento com os outros nos trás benefícios, e é por isso que o fazemos, não porque somos puramente altruístas. Dar sem ter nada para receber não faz sentido, muitos dão simplesmente porque isso lhes trás &amp;#8220;paz de espírito&amp;#8221; ou &amp;#8220;satisfação pessoal&amp;#8221;. Muito bem, isso é um tipo de retorno, também funciona. Pessoas como Kent Beck, Martin Fowler, Ken Schwaber, não estão &amp;#8220;dando&amp;#8221; nada. Elas estão compartilhando, ao ajudar a fomentar os valores ágeis, eles recebem de volta, seja na forma de mais conhecimento, mais reconhecimento, mais oportunidades, etc. Isso nos leva à boa e velha evolução darwinista, a única coisa que efetivamente funciona para melhoria contínua.&lt;/p&gt;
&lt;p&gt;O objetivo não é &amp;#8220;vender&amp;#8221; Ágil. Quando eu evangelizo a filosofia Ágil, não tenho nenhuma intenção de convencer ninguém a usar. Não ganho dividendos se mais pessoas usarem. Alguns até me cobram: &lt;em&gt;&amp;#8220;se eu usar Ágil, você me garante que vou ter resultados melhores?&amp;#8221;&lt;/em&gt; E eu respondo, &lt;em&gt;&amp;#8220;claro que não, eu não garanto nada.&amp;#8221;&lt;/em&gt; Eu compartilho o que funciona para mim, se isso vai funcionar para os outros realmente não é problema meu. O que eu espero, sim, é que quem esteja usando e descubra coisas novas, que compartilhe para que eu possa melhorar mais também. E, claro, se alguém me der um código mal feito, cheio de fita adesiva, sem nenhum teste, e espera que eu conviva com isso em silêncio, está redondamente enganado, porque isso não funciona para mim e eu não vou ficar quieto. Concordando com o Bob Martin, &lt;a href="http://blog.objectmentor.com/articles/2009/09/22/a-mess-is-not-a-technical-debt"&gt;Bagunça não é Dívida Técnica, é apenas Bagunça&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="/assets/2009/9/26/10commandments_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Algumas dicas: qualquer coisa que é &lt;em&gt;&amp;#8220;escrita em pedra&amp;#8221;&lt;/em&gt;, ou seja, algo que um dia foi o resumo do conhecimento coletivo de um grupo, mas que foi imortalizado na forma de um dogma, é ruim. Porque isso, sem dúvida, foi útil para as pessoas da época em que foi escrito, mas possivelmente não vale mais hoje. Por exemplo, se ainda seguimos os dogmas de desenvolvimento de software de 50 anos atrás, possivelmente estamos deixando de fazer as coisas da forma que a tecnologia e o conhecimento atual permitem. Por outro lado, um corpo de conhecimento que se permite evoluir, refinar, jogar fora o que não funciona mais, adicionar o que se aprende de novo, tem muito mais chances de estar certo. A comunidade Ágil funciona mais ou menos assim. A comunidade Open Source funciona mais ou menos assim. Nenhuma delas é perfeita, mas é a busca pela perfeição que torna o caminho mais interessante.&lt;/p&gt;
&lt;p&gt;Seja cético.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pPp7SGw_xU0SkJ1E4QZHfhLP6oo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pPp7SGw_xU0SkJ1E4QZHfhLP6oo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pPp7SGw_xU0SkJ1E4QZHfhLP6oo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pPp7SGw_xU0SkJ1E4QZHfhLP6oo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=Il8zLI32whk:XziZ1aFaeCQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=Il8zLI32whk:XziZ1aFaeCQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=Il8zLI32whk:XziZ1aFaeCQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=Il8zLI32whk:XziZ1aFaeCQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=Il8zLI32whk:XziZ1aFaeCQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=Il8zLI32whk:XziZ1aFaeCQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=Il8zLI32whk:XziZ1aFaeCQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/Il8zLI32whk" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/09/26/off-topic-procurar-raciocionar-faz-bem</feedburner:origLink></item><item><title>[Rails Summit 2009] Palestrante Matt Aimonetti</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/IfbPdUIWoME/rails-summit-2009-palestrante-matt-aimonetti</link><pubDate>Wed, 23 Sep 2009 17:13:12 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5210</guid><description>&lt;p style="text-align: center"&gt;&lt;a href="http://www.railssummit.com.br?utm_campaign=Railssummit&amp;utm_source=banner_parceiros&amp;utm_medium=banner&amp;utm_content=por_728x90"&gt;&lt;img src="http://railssummit.com.br/imgs/43/original/728x90.gif" alt="Rails Summit 2009"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;English translation:&lt;/strong&gt; click &lt;a href="/2009/09/23/rails-summit-2009-palestrante-matt-aimonetti#matt_english"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;div style="float: left; margin: 4px"&gt;&lt;a href="http://railssummit.locaweb.com.br/pt-BR/speakers#matt_aimonetti"&gt;&lt;img src="http://railssummit.locaweb.com.br/imgs/36/original/matt.jpg" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://merbist.com/"&gt;Matt Aimonetti&lt;/a&gt; é um ativista Rails, ele começou como evangelista de Merb e se envolveu na já famosa junção do Rails + Merb. Ele também é ativo na área de MacRuby e HotCocoa. Ele mora em San Diego, onde dirige sua  própria &lt;a href="http://ma-agile.com/"&gt;consultoria&lt;/a&gt;, fazendo projetos e treinamentos relacionados com Ruby, e ele também é um palestrante conhecido em eventos. Nós nos encontramos pela primeira vez no ano passado, na QCon de São Francisco. Você pode ouvir a entrevista que gravamos naquela época &lt;a href="/2008/11/21/rails-podcast-brasil-qcon-special-john-straw-yellowpages-com-and-matt-aimonetti-merb"&gt;aqui&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;Ele estará conosco no &lt;a href="http://www.railssummit.com.br/"&gt;Rails Summit Latin America 2009&lt;/a&gt;. Não esqueça de se inscrever!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; O que você mais gosta na linguagem Ruby, qual recurso ou conceito te atrai?&lt;/p&gt;
&lt;p&gt;Acho que o Ruby é a melhor linguagem de programação para expressar o que eu quero no meu código. É tão natural que parece mesmo &amp;#8220;certo&amp;#8221;. As pessoas são, como o falecido Guy Decoux era, capaz de se comunicar apenas em &lt;a href="http://www.ruby-forum.com/topic/166658"&gt;código Ruby&lt;/a&gt; e isso significa muito para mim. Mas há mais do que a fantástica sintaxe. Ruby tem uma maravilhosa comunidade e valores fortes, tais como testes, refatoramento, melhores práticas, open source etc.&lt;/p&gt;
&lt;p&gt;Eu estou realmente empolgado vendo empresas como a Apple e a Microsoft apostando fortemente na linguagem Ruby e sua comunidade.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Qual é a coisa que você mais gosta sobre Rails quando codifica aplicações web?&lt;/p&gt;
&lt;p&gt;O que eu mais gosto quando escrevo uma aplicação Rails está em usar Ruby. Eu tentei usar outros clones de Rails em outras línguas e nenhuma chegou perto da mesma experiência, devido à linguagem de programação subjacente. Mas além do Ruby, minha segunda coisa favorita sobre o Rails é a seqüência de uso de convenções inteligentes. Eu posso ver qualquer projeto Rails e compreender imediatamente o que está acontecendo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Qual é o seu interesse mais recente de pesquisa ou desenvolvimento?&lt;/p&gt;
&lt;p&gt;Eu aprendi muito sobre Ruby, trabalhando em MacRuby. Como se vê, há um monte de coisas no Ruby e suas bibliotecas-padrão que muito raramente uso. Eu também estou experimentando com pequenos jogos 2D escrito em Ruby. É uma mudança agradável de desenvolvimento web. Finalmente, eu ainda estou trabalhando com CouchDB e armazenamento de dados alternativos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Sobre o que é sua palestra para o Rails Summit e quem são os tipos de desenvolvedores que irão se beneficiar mais?&lt;/p&gt;
&lt;p&gt;Minha palestra é sobre o futuro do Ruby on Rails e concretamente o que isso significa para os desenvolvedores. Não será uma palestra sobre o encanamento interno, mas mais sobre uma perspectiva de alto nível com exemplos de nível mais elevado de código e exemplos concretos de coisas novas impressionantes que estarão disponíveis para os desenvolvedores Ruby.&lt;/p&gt;
&lt;p&gt;As pessoas que estão interessadas no que está chegando, os céticos e pessoas considerando usar Ruby/Rails pela primeira vez provavelmente acharão isso interessante.&lt;/p&gt;
&lt;p&gt;Além disso, se você gosta de &amp;#8220;futebol&amp;#8221;, deveria vir assistir minha palestra ;)&lt;/p&gt;&lt;p&gt;&lt;a name="matt_english"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Speaker Matt Aimonetti&lt;/h2&gt;
&lt;div style="float: left; margin: 4px"&gt;&lt;a href="http://railssummit.locaweb.com.br/en/speakers#matt_aimonetti"&gt;&lt;img src="http://railssummit.locaweb.com.br/imgs/36/original/matt.jpg" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://merbist.com/"&gt;Matt Aimonetti&lt;/a&gt; is a Rails Activist, he started as a Merb evangelist and was involved in the now famous Rails + Merb merge. He is also active in the MacRuby arena with HotCocoa. He lives in San Diego where he runs his own &lt;a href="http://ma-agile.com/"&gt;consultancy&lt;/a&gt;, doing Ruby related projects and training, and he is also a well known speaker in events. We met for the first time at last year&amp;#8217;s San Francisco QCon. You can listen to an interview we recorded back then &lt;a href="/2008/11/21/rails-podcast-brasil-qcon-special-john-straw-yellowpages-com-and-matt-aimonetti-merb"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;He will be with us at &lt;a href="http://www.railssummit.com.br/en/home"&gt;Rails Summit Latin America 2009&lt;/a&gt;. Don&amp;#8217;t forget to register soon and make reservations for hotel and city tour (it will be a great opportunity to also get to know São Paulo City).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; What do you like the most about the Ruby language, what feature or concept really &amp;#8220;clicks&amp;#8221; for you?&lt;/p&gt;
&lt;p&gt;I found Ruby to be the best programming language to express what I want my code to do. It is so natural that it feels &amp;#8220;right&amp;#8221;. People are, like the late Guy Decoux was, able communicate only in &lt;a href="http://www.ruby-forum.com/topic/166658"&gt;Ruby code&lt;/a&gt; and that means a lot to me. But there is more to it than the awesome syntax. Ruby has an awesome community and strong values such as testing, refactoring, best practices, &lt;span class="caps"&gt;OSS&lt;/span&gt; etc..&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m really psyched to see companies like Apple and Microsoft bet heavily on the Ruby language and community.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; What is the thing you really enjoy about Rails when you&amp;#8217;re coding web apps?&lt;/p&gt;
&lt;p&gt;What I enjoy the most when writing a Rails app is using Ruby. I tried using other Rails clones in other languages and none came close to the user experience due to the underlying programming language. But apart from Ruby, my second favorite thing about Rails is the string use of smart conventions. I can take almost any Rails projects and understand right away what&amp;#8217;s going on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; What are your most recent research or development interests?&lt;/p&gt;
&lt;p&gt;I learned so much about Ruby by working on MacRuby. As it turns out, there are a lot of goodies in Ruby and its standard libraries that we very rarely use. I&amp;#8217;m also experimenting with small 2D video games written in Ruby. It is a nice change from web development. Finally, I&amp;#8217;m still working with CouchDB and alternative data storage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; What is your Rails Summit talk about and who are the kind of developers that will benefit the most?&lt;/p&gt;
&lt;p&gt;My talk is about the future of Ruby and Rails and what it concretely means for developers. It&amp;#8217;s not going to be a talk about the inner plumbing but more about the big picture with higher level code examples and concrete examples of awesome new things that are going to be available to Ruby developers.&lt;/p&gt;
&lt;p&gt;People who are interested in what&amp;#8217;s coming up, skeptics and people considering using Ruby/Rails for the first time will hopefully find the talk interesting.&lt;/p&gt;
&lt;p&gt;Also, if you like &amp;#8220;futebol&amp;#8221; you should definitely come check out my talk ;)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YQ2rfCkJT7vjxD6qBrsVOTk6A2o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YQ2rfCkJT7vjxD6qBrsVOTk6A2o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YQ2rfCkJT7vjxD6qBrsVOTk6A2o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YQ2rfCkJT7vjxD6qBrsVOTk6A2o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=IfbPdUIWoME:JOgSBboX7Gc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=IfbPdUIWoME:JOgSBboX7Gc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=IfbPdUIWoME:JOgSBboX7Gc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=IfbPdUIWoME:JOgSBboX7Gc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=IfbPdUIWoME:JOgSBboX7Gc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=IfbPdUIWoME:JOgSBboX7Gc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=IfbPdUIWoME:JOgSBboX7Gc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/IfbPdUIWoME" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/09/23/rails-summit-2009-palestrante-matt-aimonetti</feedburner:origLink></item><item><title>[Rails Summit 2009] Palestrante Carlos Brando</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/WoqGsPqvW14/rails-summit-2009-palestrante-carlos-brando</link><pubDate>Mon, 21 Sep 2009 06:18:29 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5209</guid><description>&lt;p style="text-align: center"&gt;&lt;a href="http://www.railssummit.com.br?utm_campaign=Railssummit&amp;utm_source=banner_parceiros&amp;utm_medium=banner&amp;utm_content=por_728x90"&gt;&lt;img src="http://railssummit.com.br/imgs/43/original/728x90.gif" alt="Rails Summit 2009"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;English translation:&lt;/strong&gt; click &lt;a href="/2009/09/21/rails-summit-2009-palestrante-carlos-brando#carlos-brando-english"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;div style="float: left; margin: 3px"&gt;&lt;a href="http://railssummit.locaweb.com.br/pt-BR/speakers#carlos_brando"&gt;&lt;img src="http://railssummit.locaweb.com.br/imgs/21/original/brando.jpg" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;O &lt;strong&gt;Carlos Brando&lt;/strong&gt; acho que dispensa apresentações :-) Todos já o conhecem pelo blog &lt;a href="http://nomedojogo.com"&gt;Nome do Jogo&lt;/a&gt;, pelo e-book &lt;a href="http://www.nomedojogo.com/2008/06/09/new-free-book-ruby-on-rails-21-whats-new/"&gt;Rails 2.1&lt;/a&gt; e por &lt;a href="http://github.com/carlosbrando/"&gt;projetos open-source&lt;/a&gt; como o &lt;a href="http://www.nomedojogo.com/2008/11/18/shoulda-for-rspec-is-remarkable/"&gt;Remarkable&lt;/a&gt;. Dentre suas colaborações mais recentes, está a tradução do excelente livro do _why, o &lt;a href="http://why.nomedojogo.com/"&gt;Poignant Guide to Ruby&lt;/a&gt;; e o lançamento da versão nacional do site britânico &lt;a href="http://www.rubyinside.com.br"&gt;Ruby Inside&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Na sua &lt;a href="http://www.nomedojogo.com/sobre/"&gt;própria descrição&lt;/a&gt;, ele é viciado em programação e atualmente é diretor de tecnologia da &lt;a href="http://amanaie.com.br/"&gt;Amanaiê&lt;/a&gt;, uma empresa que cria, produz e distribui aplicativos sociais. Atua na área de desenvolvimento de softwares há mais de doze anos, tendo trabalhado com Visual Basic, C, C++, Java, C# e agora &lt;strong&gt;Ruby&lt;/strong&gt;. Já trabalhou em várias companhias brasileiras e estrangeiras como Portugal Telecom Group, AT&amp;amp;T Latin America, DirecTV, &lt;span class="caps"&gt;SKY&lt;/span&gt;, &lt;span class="caps"&gt;VISA&lt;/span&gt; e &lt;a href="http://surgeworks.com/"&gt;Surgeworks Inc&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Já se apresentou em vários eventos brasileiros relacionados com Ruby, incluindo a edição do ano passado do &lt;a href="http://www.railssummit.com.br/"&gt;Rails Summit Latin America&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Além de suas atividades profissionais, Carlos e sua esposa trabalham como voluntários dando aulas para deficientes auditivos. Ele regularmente ensina língua de sinais e atua como interprete.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Como você encontrou Ruby/Rails, o que foi que mais te atraiu?&lt;/p&gt;
&lt;p&gt;Eu já trabalhava há 12 anos como programador e pelo menos 7 principalmente com tecnologia Microsoft e estava um pouco cansado de fazer as mesmas coisas todos os dias, literalmente tinha perdido o prazer no meu trabalho. Foi quando ouvi falar do Rails pela primeira vez, mas sem entender do que se tratava, simplesmente o ignorei. Alguns meses depois li um artigo no blog do Chad Fowler onde ele mencionava o Ruby e como estava feliz em trabalhar com esta linguagem e isto me fez voltar a olhar para o Rails.&lt;/p&gt;
&lt;p&gt;Comecei estudando por conta própria e comprei o livro &amp;#8220;Repensando a web com Rails&amp;#8221; do Fábio Akita e o &lt;a href="http://www.amazon.com/Ruby-Way-Second-Techniques-Programming/dp/0672328844"&gt;The Ruby Way&lt;/a&gt; de Hal Fulton. Em duas semanas eu já tinha montado meu primeiro site em Rails, o extinto CarreiraTI, um site de empregos para profissionais da área de tecnologia. Seis meses depois fui convidado para fazer parte da equipe da Surgeworks, onde trabalhei por quase 2 anos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails&lt;/strong&gt;: Quais assuntos mais te interessam atualmente e por quê?&lt;/p&gt;
&lt;p&gt;Tenho me interessado muito pelas entranhas da linguagem, entender como o Ruby funciona por dentro. Aos poucos estou deixando o Rails cada vez mais de lado, e me envolvendo mais com o Ruby.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails&lt;/strong&gt;: Sobre o que trata sua palestra e para que tipos de desenvolvedores é mais indicado?&lt;/p&gt;
&lt;p&gt;Atualmente fui contratado por uma startup brasileira chamada Amanaiê, que desenvolve aplicativos para redes sociais. Depois de passar um tempo fazendo software para estas plataformas, estou trabalhando especificamente no desenvolvimento de um framework para acelerar a criação de projetos deste tipo. Durante muito tempo acompanhei de perto o desenvolvimento do Rails, o que me rendeu dois livros. Este conhecimento é o que tem me ajudado a repensar algumas coisas e criar um novo framework baseado no Ruby.&lt;/p&gt;
&lt;p&gt;Minha palestra no Rails Summit tratará exatamente deste tema: o processo de construção de um framework utilizando Ruby. Se você realmente quer entender como o Rails funciona, então crie o seu próprio framework. Nesta palestra vou comentar sobre algumas das dificuldades que encontrei durante este projeto e quais as soluções encontradas. O processo de renderização, geradores de códigos, helpers e banco de dados estão entre os assuntos que serão tratados. Acredito que ao analisar este tópicos de um ponto de vista mais simplista fará com que você entenda melhor como algumas coisas funcionam internamente no Rails.&lt;/p&gt;
&lt;p&gt;&lt;a name="carlos-brando-english"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Speaker Carlos Brando&lt;/h2&gt;
&lt;div style="float:left; margin: 3px"&gt;&lt;a href="http://railssummit.locaweb.com.br/en/speakers#carlos_brando"&gt;&lt;img src="http://railssummit.locaweb.com.br/imgs/21/original/brando.jpg" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;I think &lt;strong&gt;Carlos Brando&lt;/strong&gt; needs no introduction :-) Everyone knows his blog &lt;a href="http://nomedojogo.com"&gt;Nome do Jogo&lt;/a&gt;, the e-book &lt;a href="http://www.nomedojogo.com/2008/06/09/new-free-book-ruby-on-rails-21-whats-new/"&gt;Rails 2.1&lt;/a&gt;, his &lt;a href="http://github.com/carlosbrando/"&gt;open-source projects&lt;/a&gt; such as &lt;a href="http://www.nomedojogo.com/2008/11/18/shoulda-for-rspec-is-remarkable/"&gt;Remarkable&lt;/a&gt;. Among his most recent collaborations, there&amp;#8217;s the translation of the excellent book from _why, the &lt;a href="http://why.nomedojogo.com/"&gt;Poignant Guide to Ruby&lt;/a&gt;; and the launch of the Brazilian version of the British website &lt;a href="http://www.rubyinside.com"&gt;Ruby Inside&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;In his &lt;a href="http://www.nomedojogo.com/sobre/"&gt;own words&lt;/a&gt;, he is addicted to programming and is currently chief technology officer for &lt;a href="http://amanaie.com.br/"&gt;Amanaiê&lt;/a&gt;, a Brazilian company that creates, produces and distributes social applications. He is in the software development field for over twelve years, having worked with Visual Basic, C, C++, Java, C# and now Ruby. He has worked in several Brazilian and foreign companies like Portugal Telecom Group, AT&amp;amp;T Latin America, DirecTV, &lt;span class="caps"&gt;SKY&lt;/span&gt;, &lt;span class="caps"&gt;VISA&lt;/span&gt; and &lt;a href="http://surgeworks.com/"&gt;Surgeworks Inc&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;He has performed in several events related to Ruby in Brazil, including last year&amp;#8217;s edition of &lt;a href="http://www.railssummit.com.br/"&gt;Rails Summit Latin America&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In addition to his professional activities, Carlos and his wife volunteer teaching to deaf people. He regularly teaches sign language and acts as interpreter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails&lt;/strong&gt;: How did you find Ruby / Rails, what most attracted you?&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been working 12 years as a programmer and at least 7 of them primarily with Microsoft technologies; and I was a bit tired of doing the same things over and over. I&amp;#8217;ve literally lost the pleasure in my work. When I heard about Rails for the first time &amp;#8211; without understanding what it was &amp;#8211; I simply ignored it. A few months later I read an article in Chad Fowler&amp;#8217;s blog where he mentioned how happy he was to work with Ruby, and this made me take a second look at Rails.&lt;/p&gt;
&lt;p&gt;I started studying on my own and bought &amp;#8220;Rethinking the web with Rails&amp;#8221; book by Fabio Akita and &lt;a href="http://www.amazon.com/Ruby-Way-Second-Techniques-Programming/dp/0672328844"&gt;The Ruby Way&lt;/a&gt; by Hal Fulton. In two weeks I had set up my first site in Rails, the now extinct CarreiraTI, a job site for professionals in technology. Six months later I was invited to join the Surgeworks team, where I worked for almost 2 years.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails&lt;/strong&gt;: What subjects interest you the most nowadays and why?&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been very interested in the inner plumbings of the language, to understand how Ruby works from the inside. I am gradually leaving Rails aside, and getting more involved with Ruby.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails&lt;/strong&gt;: What is your talk at Rails Summit about, and what kind of developers will benefit the most?&lt;/p&gt;
&lt;p&gt;I am currently hired by a Brazilian startup called Amanaiê, which develops social network applications. After spending time making software for these platforms, I&amp;#8217;m working specifically on developing a framework to speed up the creation of such projects. For a long time I closely followed the development of Rails, which resulted in two books. This knowledge is what helped me to rethink some things and create a new framework based on Ruby.&lt;/p&gt;
&lt;p&gt;My talk at Rails Summit will address exactly this issue: the process of building a framework using Ruby. If you really want to understand how Rails works, then create your own framework. In this talk I comment on some of the difficulties I found during this project and what were solutions I used. The process of rendering, code generators, helpers and database are among the subjects to be treated. I believe that in examining this topic from a  more simplistic standpoint will make you better understand how things work internally in Rails.&lt;/p&gt;
&lt;p&gt;Rails Summit will have Portuguese to English translator, so you can watch Carlos talk too! &lt;a href="http://www.railssummit.com.br/en/home"&gt;Register now!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LkxSF6alofzLKeGSboL5H7aeIHs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LkxSF6alofzLKeGSboL5H7aeIHs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LkxSF6alofzLKeGSboL5H7aeIHs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LkxSF6alofzLKeGSboL5H7aeIHs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=WoqGsPqvW14:gnP5AseQqCs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=WoqGsPqvW14:gnP5AseQqCs:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=WoqGsPqvW14:gnP5AseQqCs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=WoqGsPqvW14:gnP5AseQqCs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=WoqGsPqvW14:gnP5AseQqCs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=WoqGsPqvW14:gnP5AseQqCs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=WoqGsPqvW14:gnP5AseQqCs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/WoqGsPqvW14" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/09/21/rails-summit-2009-palestrante-carlos-brando</feedburner:origLink></item><item><title>[Off-Topic] Meu Backup Pessoal (Drobo/Time Capsule)</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/DhOxHdSE8ZE/off-topic-meu-backup-pessoal-drobo-time-capsule</link><pubDate>Sat, 19 Sep 2009 15:16:21 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5208</guid><description>&lt;p style="text-align: center"&gt;&lt;a href="http://www.railssummit.com.br?utm_campaign=Railssummit&amp;utm_source=banner_parceiros&amp;utm_medium=banner&amp;utm_content=por_728x90"&gt;&lt;img src="http://railssummit.com.br/imgs/43/original/728x90.gif" alt="Rails Summit 2009"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Eu não sou muito paranóico com backup mas tomo meus cuidados. Por exemplo, eu não tenho 100% de confiança em storages remoto, seja ele Gmail, Amazon S3, Dropbox ou qualquer coisa desse tipo. Esse tipo de serviço é uma ajuda extra, mas jamais deve ser o storage primário. Meus e-mails, calendários, contatos estão todos centralizados no &lt;a href="http://www.me.com"&gt;Mobile Me&lt;/a&gt;, meu Gmail faz forward de tudo pro Mobile Me servindo basicamente como um bom filtro de spam.&lt;/p&gt;
&lt;p&gt;Eu tenho uma cópia de tudo isso sincronizado no meu Macbook, e tudo no meu Macbook está guardado no &lt;a href="http://www.apple.com/timecapsule/"&gt;Time Capsule&lt;/a&gt; de 1TB, via &lt;a href="http://www.apple.com/macosx/what-is-macosx/time-machine.html"&gt;Time Machine&lt;/a&gt;. Portanto eu tenho pelo menos 3 cópias de todos os meus dados mais importantes.&lt;/p&gt;
&lt;p&gt;Para outros dados menos voláteis como vídeos, programas, projetos antigos e coisas desse tipo eu tinha dois discos externos ligados, um de 400GB e outro de 500GB, via &lt;span class="caps"&gt;USB&lt;/span&gt; 2 no meu Mac Mini de casa. Eles faziam &lt;a href="http://everythinglinux.org/rsync/"&gt;rsync&lt;/a&gt; entre si todos os dias às 4 da manhã. Eu deixo meu Mac Mini ligado o tempo todo, ele não consome muita energia, e é silencioso ao nível de parecer que está desligado, o que é muito importante. Ele próprio também faz backup de si no mesmo Time Capsule. Desta forma todos os meus dados tem pelo menos um backup.&lt;/p&gt;
&lt;p&gt;Para o dia-a-dia carrego outro disco externo &lt;a href="http://www.lacie.com/products/product.htm?pid=11084"&gt;LaCie de 500GB&lt;/a&gt;. Todo dado importante nele tem uma cópia nos discos externos de casa, ele serve apenas para transporte. Porém, essa configuração ainda é muito ruim. Primeiro porque esses cases de disco externo tem cada um uma fonte de energia e um cabo &lt;span class="caps"&gt;USB&lt;/span&gt;. É muito cabo bagunçado. Segundo, eles não   foram feitos para ficar ligados o tempo todo, não tem inteligência e consomem muita energia, são muito barulhentos, acumulam muito pó, enfim, são péssimos para esse propósito. O próprio rsync uma vez por dia não é adequado, pois eu fico com uma janela de 24 horas descoberto.&lt;/p&gt;
&lt;p&gt;Redundância é extremamente importante. Eu já me vi pensando &lt;em&gt;&amp;#8220;que desperdício, tenho 2 discos que somam quase 1TB mas só posso usar 400GB.&amp;#8221;&lt;/em&gt; Mas esse é o &amp;#8216;seguro&amp;#8217; que se deve pagar. De nada adianta usar 1TB e depois um dos discos quebra e você perde metade dos seus dados. Por isso há pelo menos 2 coisas que se pode fazer: um mirror bem caseiro com rsync como eu fiz, ou montar um micro caseiro com &lt;span class="caps"&gt;RAID&lt;/span&gt; via software.&lt;/p&gt;
&lt;p&gt;Há alguns anos uma empresa chamada Data Robotics apareceu em cena e lançou um dos produtos que está na minha lista de compra faz quase 3 anos: o Drobo. Ele é literalmente um robô.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="/assets/2009/9/19/IMG_0103_original.JPG" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Como diz a definição da Wikipedia:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Um robô é um agente artificial virtual ou mecânico. Na prática, é normalmente uma máquina eletro-mecânica que é guiada por um computador ou programação eletrônica e, portanto, é capaz de realizar tarefas sozinho.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;É exatamente isso que ele faz. Ele é um &amp;#8220;enclosure&amp;#8221;, uma caixa-preta, onde você pode encaixar facilmente até 4 discos &lt;span class="caps"&gt;SATA&lt;/span&gt;. Ele inteligentemente sabe como gerenciá-los sem precisar se preocupar em configurar partições, volumes, etc. Basta encaixar os drives e ele faz todo o resto. Internamente, ele faz a configuração que for necessária para otimizar o uso do espaço, seja um mirror simples se houver apenas 2 drives até algo parecido com um &lt;span class="caps"&gt;RAID&lt;/span&gt;-5 quando se tem pelo menos 3 drives. Mas nada disso é visível, ele apenas &amp;#8220;faz&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Claro, existem opções muito mais &amp;#8220;baratas&amp;#8221; em termos de custo de material. Como já disse, qualquer PC velho com software no estilo do &lt;a href="http://www.freenas.org/"&gt;FreeNAS&lt;/a&gt; ou mesmo um Linux normal onde você configura &lt;span class="caps"&gt;RAID&lt;/span&gt; via software manualmente serviria. A chave aqui é não pensar só no &amp;#8220;agora&amp;#8221; e pensar no &amp;#8220;daqui a pouco&amp;#8221;. Os cenários que um storage desse tipo (seja feito em casa, um drive externo como o LaCie, um Windows Home Server ou coisa do tipo) é justamente &lt;strong&gt;rápida&lt;/strong&gt; recuperação quando um dos drives falha, de preferência o mais próximo possível de &lt;strong&gt;downtime Zero&lt;/strong&gt; e fácil expansão: quando eu comprar um drive maior, quero somente encaixá-lo e quero que o sistema se vire para fazer tudo funcionar.&lt;/p&gt;
&lt;p&gt;Nenhuma das alternativas, montadas em casa ou comerciais, tem capacidade para garantir downtime zero e expansão flexível inteligente. Este é o diferencial do Drobo, que atualmente simplesmente não tem nenhum equivalente no mercado. Ele é literalmente à prova de &lt;a href="http://br.answers.yahoo.com/question/index?qid=20090714112916AAweN3S"&gt;&lt;span class="caps"&gt;BIOS&lt;/span&gt;&lt;/a&gt;, ou mais adequadamente &amp;#8220;Zero Configuration&amp;#8221;: você liga na tomada, liga o cabo Firewire 800 ou &lt;span class="caps"&gt;USB&lt;/span&gt; 2 no micro e pronto, ele faz o resto.&lt;/p&gt;
&lt;p&gt;Assista este vídeo com a Cali Lewis, é tudo que você precisa saber sobre o funcionamento dele:&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/05yqvb5n36M&amp;hl=en&amp;fs=1&amp;color1=0x5d1719&amp;color2=0xcd311b"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/05yqvb5n36M&amp;hl=en&amp;fs=1&amp;color1=0x5d1719&amp;color2=0xcd311b" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;É apenas isso mesmo. Veja mais detalhes no &lt;a href="http://www.drobo.com"&gt;site oficial dele&lt;/a&gt;. Sim, o preço dele é &amp;#8220;salgado&amp;#8221;, não sai por menos de &lt;strong&gt;&lt;span class="caps"&gt;USD&lt;/span&gt; 400&lt;/strong&gt;, isso sem contar os drives. Se considerar com mais 2 drives de 1TB cada (ele precisa de pelo menos 2 drives, de qualquer tamanho), o conjunto não sai por menos de &lt;span class="caps"&gt;USD&lt;/span&gt; 600. E junte a isso, claro, a taxa do seu &amp;#8220;importador&amp;#8221;.&lt;/p&gt;
&lt;h2&gt;Disclaimer&lt;/h2&gt;
&lt;p&gt;Antes que alguém comece, não, não estou dizendo que soluções caseiras de &lt;span class="caps"&gt;RAID&lt;/span&gt; são ruins. Se o Drobo não existisse seria exatamente o que eu faria: compraria um micro com gabinete pequeno, um controlador &lt;span class="caps"&gt;RAID&lt;/span&gt;, instalaria um FreeNAS ou algo assim e pronto. Porém, dado que o Drobo existe esta é a solução que eu pessoalmente preferi.&lt;/p&gt;
&lt;p&gt;O preço é bem mais caro, pelo menos 2 ou 3 vezes mais, sem sombra de dúvidas, mas a comodidade e segurança de longe compensam. Não é o tipo de coisa que você decide comprar num piscar de olhos. Eu esperei quase 3 anos antes de finalmente comprar.&lt;/p&gt;
&lt;p&gt;Qualquer solução que: 1) possibilitar downtime zero de recuperação e; 2) expansão elástica com drives de diferentes capacidades, também com downtime zero; será uma alternativa tão boa quanto o Drobo.&lt;/p&gt;
&lt;p&gt;Para começar, veja o tamanho dele comparado ao meu Mac Mini:&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="/assets/2009/9/19/IMG_0112_original.JPG" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Minha experiência até aqui&lt;/h2&gt;
&lt;p&gt;Meu Drobo está em funcionamento a menos de 24 horas ainda. Mas até agora ele é exatamente o que eu esperava. A primeira coisa que fiz foi ligá-lo na tomada, instalar o Drobo Dashboard (que pode ser &lt;a href="http://www.drobo.com/support/updates.php"&gt;baixado&lt;/a&gt; do site). Na primeira vez ele pede para formatar os discos e gerar o volume. Depois disso ele já aparece no meu desktop como mais um volume montado.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="/assets/2009/9/19/IMG_0102_original.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Daí eu transferi todo meu conteúdo dos drives externos para ele. Fiz isso via rsync mesmo (caso a transferência parasse no meio). Foram quase 400GB de conteúdo que levou mais de 10 horas durante a noite transferindo (&lt;span class="caps"&gt;USB&lt;/span&gt; 2 não é exatamente a coisa mais rápida do mundo).&lt;/p&gt;
&lt;p&gt;Isso pronto, pela manhã eu já pude retirar os drives externos. Só isso já me deu um enorme alívio: foram toneladas de cabos a menos embaixo da minha mesa, cabos &lt;span class="caps"&gt;USB&lt;/span&gt; em cima e aqueles cases feios e empoeirados. Minha mulher agradece. Veja como o case estava acumulando muita poeira:&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="/assets/2009/9/19/IMG_0105_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Retirei os drives dos cases, limpei e imediatamente inseri nos dois slots sobrando do Drobo. Ele imediatamente reconheceu os novos drives e, sem precisar desmontar o volume ou parar de copiar arquivos para ele, o espaço disponível aumentou dinamicamente. Essa é a facilidade inegável dessa arquitetura: agora tenho 2 drives de 1TB cada, um de 500GB e outro de 400GB formando um espaço útil de quase 1.7TB redundantes.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="/assets/2009/9/19/IMG_0107_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Claro, a brincadeira não estaria terminada se eu não pudesse testar a maior funcionalidade dele: retirar e recolocar drives dinamicamente sem perder acesso do micro ao volume. Foi o que eu fiz: retirei um dos discos, enquanto tudo estava ligado, para simular um drive com falha. Meu Mac Mini nem pestanejou e para ele o volume continuava ali, intacto, e eu conseguia acessar os dados sem problemas. Recoloquei o drive e após alguns segundos todas as luzes já estavam verdes novamente.&lt;/p&gt;
&lt;p&gt;Veja a quantidade irritante de cabos que tinha no chão embaixo da mesa:&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="/assets/2009/9/19/IMG_0111_original.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;A principal vantagem se chama paz de espírito: eu sei que na hora de um aperto, quando um dos drives falhar (e um deles vai, eles sempre falham) será tão simples quanto comprar um novo drive e espetar no lugar. Ainda tem tempo para encher esses 1.7TB, mas se encher, basta comprar um drive maior e espetar no lugar do drive mais velho. E assim por diante.&lt;/p&gt;
&lt;p&gt;Em termos visuais, o fato de ter tirado aquele monte de coisas atrapalhando da mesa e colocado um monolito elegante e simples é uma grande ajuda. Ele é um produto que foi feito com cuidado: nada de parafusos aparecendo, ventoinhas barulhentas. É um monolito negro, e com ótimo acabamento. Inclusive a tampa da frente, que dá acesso aos drives, é anexado magneticamente, também dispensando a necessidade de uma chave de fenda. São detalhes desse tipo que demonstram o cuidado que um fabricante tem com seu produto.&lt;/p&gt;
&lt;p&gt;Agora, veja como minha mesa ficou muito mais agradável:&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="/assets/2009/9/19/IMG_0113_original.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Tem tudo que um bom produto precisa: é efetivamente funcional, extremamente simples de usar, transmite segurança, e tem um excelente acabamento, é bonito. O software também é simples, tem o suficiente para informar e operar tudo que preciso &amp;#8211; e na grande maioria do tempo ele vai ficar desligado &amp;#8211; além disso o hardware em si é eficiente em mostrar as informações mais importantes como o estado dos drives (luzes verde, vermelha e laranja) e um indicador azul onde cada led aceso indica 10% do espaço físico real já utilizado. Ou seja, basta olhar para ele para saber o que fazer.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img src="/assets/2009/9/19/Captura_de_tela_2009-09-19_às_13.51.16_original.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;O Drobo em si não é um &lt;a href="http://en.wikipedia.org/wiki/Network-attached_storage"&gt;&lt;span class="caps"&gt;NAS&lt;/span&gt;&lt;/a&gt; (Network Attached Storage &amp;#8211; Storage anexado à rede). Para torná-lo um &lt;span class="caps"&gt;NAS&lt;/span&gt; é necessário outro produto chamado &lt;a href="http://www.drobo.com/Products/droboshare.php"&gt;DroboShare&lt;/a&gt; que é basicamente um mini-computador, num design bem pequeno, que permite compartilhar o Drobo à uma rede. Você pode adquirir esse produto ou simplesmente ligá-lo a qualquer computador na rede. No meu caso, o Mac Mini é um excelente micro para ser um servidor caseiro. É pequeno, silencioso, consumo adequado de energia, e por isso vou manter os dois conectados e ligados o tempo todo. Com recursos com o &lt;a href="http://www.apple.com/mobileme/features/mac.html"&gt;Back to My Mac&lt;/a&gt; que vem no Mobile Me, consigo ter acesso a ele, de forma segura usando um canal encriptado, de qualquer lugar a partir do meu Macbook, seja do escritório, seja de algum hotel, aeroporto, etc. Muito conveniente.&lt;/p&gt;
&lt;p&gt;Ainda tem pouco tempo de uso, esse tipo de produto precisa de meses para realmente começar a mostrar seu valor, mas para mim já valeu a pena o investimento.&lt;/p&gt;
&lt;h2&gt;Conclusão&lt;/h2&gt;
&lt;p&gt;Definitivamente estou muito contente com esta solução. Com o tempo esse tipo de solução deve ficar mais barata. Já está mais acessível do que era quando foi lançado, se não me engano era na faixa dos &lt;span class="caps"&gt;USD&lt;/span&gt; 500 ou mais. Além disso discos de 1TB há 3 anos eram muito caros. Hoje os discos de 2TB estão ficando acessíveis.&lt;/p&gt;
&lt;p&gt;Ou seja, discos, assim como memória &lt;span class="caps"&gt;RAM&lt;/span&gt; e pendrives, estão literalmente baratos. São ítens que já foram bastante comoditizados. Pensando que a velocidade dos provedores deve crescer, que o nível de downloads deve aumentar, que o preço dos drives está caindo, a dinâmica de trocar de drives deve ser mais comum e a preocupação em manter tanto volume sem redundância é muito pior. É exatamente esse tipo de proteção contra o tempo que o Drobo vende. É isso que estou pagando.&lt;/p&gt;
&lt;p&gt;Esta solução é mais do que adequada para uma pessoa física, como um storage para residências. Deve também ser mais do que suficiente para micro-empresas que precisam de storage para um servidor compartilhado de arquivos. Para pequenas empresas que lidam com volumes maiores de dados como estúdios, produtoras, vocês vão querer o &lt;a href="http://www.drobo.com/products/drobopro/"&gt;Drobo Pro&lt;/a&gt;. É a mesma coisa mas em vez de 4 slots ele tem espaço para até 8 drives paralelos, permitindo inclusive montar o storage usando iSCSI via Gigabit Ethernet.&lt;/p&gt;
&lt;p&gt;Para empresas média ou grandes, claro, não é esta a solução que você precisa. Procure storages de verdade, de grande porte, com hardware especializado. Além disso, lembrar que o Drobo não é a mesma categoria de produto que um HP Mediasmart. As características que mencionei no &amp;#8220;Disclaimer&amp;#8221; acima não se aplicam a quase nenhum outro produto. A maioria dos &amp;#8220;storages&amp;#8221; vendidos ao consumidor não são mais do que um HD &lt;span class="caps"&gt;SATA&lt;/span&gt; com um case glorificado. Pior ainda quando eles vendem um case com 2 HDs configurados em mirror como um striped set, onde se você perde um drive, perde todos os dados.&lt;/p&gt;
&lt;p&gt;Finalmente, esta solução ainda não é completa. É o suficiente para uma residência. Mas se você tem uma micro-empresa e tem dados valiosos, você vai querer backup on-site e off-site (ou seja, guardado fisicamente fora do seu escritório). De nada adianta um backup onsite se seu escritório pegar fogo, ou se sofrer um roubo e ele for levado embora. Sempre garanta que seus dados estejam seguros fora daqui. No meu caso, residencial, é por isso que eu pago por um Mobile Me, para que meus dados mais importantes como meus e-mails estejam off-site, como contingência.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Qhfp0giU6suKGpKQH-VDLSPuEQY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Qhfp0giU6suKGpKQH-VDLSPuEQY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Qhfp0giU6suKGpKQH-VDLSPuEQY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Qhfp0giU6suKGpKQH-VDLSPuEQY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=DhOxHdSE8ZE:Ery2VZH4Mec:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=DhOxHdSE8ZE:Ery2VZH4Mec:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=DhOxHdSE8ZE:Ery2VZH4Mec:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=DhOxHdSE8ZE:Ery2VZH4Mec:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=DhOxHdSE8ZE:Ery2VZH4Mec:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=DhOxHdSE8ZE:Ery2VZH4Mec:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=DhOxHdSE8ZE:Ery2VZH4Mec:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/DhOxHdSE8ZE" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/09/19/off-topic-meu-backup-pessoal-drobo-time-capsule</feedburner:origLink></item><item><title>[Rails Summit 2009] Palestrante Bryan Liles</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/FxUZIA4vPMw/rails-summit-2009-palestrante-bryan-liles</link><pubDate>Fri, 18 Sep 2009 09:29:47 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5207</guid><description>&lt;p style="text-align: center"&gt;&lt;a href="http://www.railssummit.com.br?utm_campaign=Railssummit&amp;utm_source=banner_parceiros&amp;utm_medium=banner&amp;utm_content=por_728x90"&gt;&lt;img src="http://railssummit.com.br/imgs/43/original/728x90.gif" alt="Rails Summit 2009"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;English translation:&lt;/strong&gt; click &lt;a href="/2009/09/18/rails-summit-2009-palestrante-bryan-liles#en_bryan_liles"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://railssummit.locaweb.com.br/pt-BR/pages/speakers#bryan_liles"&gt;Bryan Liles&lt;/a&gt; ficou bastante conhecido depois do Ruby Hoedown de 2008 com sua palestra &lt;a href="http://rubyhoedown2008.confreaks.com/05-bryan-liles-lightning-talk-tatft-test-all-the-f-in-time.html"&gt;Test All the Fucking Time&lt;/a&gt; cunhando o termo &amp;#8220;&lt;span class="caps"&gt;TATFT&lt;/span&gt;&amp;#8221;.&lt;/p&gt;
&lt;p style="text-align:center"&gt;&lt;object width="600" height="345"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=4544115&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=4544115&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="600" height="345"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/4544115"&gt;RailsConf 2009 &amp;#8211; Mensagem de Bryan Liles para Brasileiros&lt;/a&gt; from &lt;a href="http://vimeo.com/akitaonrails"&gt;Fabio Akita&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Ele virá falar sobre boas práticas de programação, baseado numa séria que começou recentemente no seu blog &lt;a href="http://smartic.us/"&gt;Smartic.us&lt;/a&gt;, chamado &lt;a href="http://smartic.us/category/yerdoinitwrong/"&gt;#yerdoinitwrong&lt;/a&gt; (literalmente, &amp;#8220;voceestafazendoerrado&amp;#8221;). Veja a apresentação da série:&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;object width="600" height="405"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6581783&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=6581783&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="600" height="405"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/6581783"&gt;#yerdoinitwrong intro&lt;/a&gt; from &lt;a href="http://vimeo.com/bryanl"&gt;Bryan Liles&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;O &lt;a href="http://smartic.us/2009/09/16/yerdoinitwrong-episode-1-logging-with-syslog/"&gt;primeiro episódio&lt;/a&gt; fala sobre enviar os logs do Rails para um servidor remoto usando syslog, e recomenda o excelente Splunk, que eu também gosto. Não perca os episódios.&lt;/p&gt;
&lt;p&gt;Não deixe de trocar figurinhas com ele durante o Rails Summit! &lt;a href="http://www.railssummit.com.br"&gt;Inscreva-se já!&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="en_bryan_liles"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Speaker Bryan Liles&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://railssummit.locaweb.com.br/en/pages/speakers#bryan_liles"&gt;Bryan Liles&lt;/a&gt; became very well known after his talk &lt;a href="http://rubyhoedown2008.confreaks.com/05-bryan-liles-lightning-talk-tatft-test-all-the-f-in-time.html"&gt;Test All the Fucking Time&lt;/a&gt; at Ruby Hoedown 2008, coining the term &amp;#8220;&lt;span class="caps"&gt;TATFT&lt;/span&gt;&amp;#8221;.&lt;/p&gt;
&lt;p style="text-align:center"&gt;&lt;object width="600" height="345"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=4544115&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=4544115&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="600" height="345"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/4544115"&gt;RailsConf 2009 &amp;#8211; Bryan Liles message to Brazilians&lt;/a&gt; from &lt;a href="http://vimeo.com/akitaonrails"&gt;Fabio Akita&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;He&amp;#8217;ll come to talk about best practices in software development, based on the series he recentely started at his blog &lt;a href="http://smartic.us/"&gt;Smartic.us&lt;/a&gt; called &lt;a href="http://smartic.us/category/yerdoinitwrong/"&gt;#yerdoinitwrong&lt;/a&gt;. Watch his introduction to the series:&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;object width="600" height="405"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6581783&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=6581783&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="600" height="405"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/6581783"&gt;#yerdoinitwrong intro&lt;/a&gt; from &lt;a href="http://vimeo.com/bryanl"&gt;Bryan Liles&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://smartic.us/2009/09/16/yerdoinitwrong-episode-1-logging-with-syslog/"&gt;first episode&lt;/a&gt; talks about sending your Rails logs to a remote server using syslog, and he even recommends the excellent Splunk, which I like as well. Don&amp;#8217;t miss his episodes.&lt;/p&gt;
&lt;p&gt;And come to the Rails Summit to talk and exchange information with him! &lt;a href="http://www.railssummit.com.br/en/home"&gt;Register now!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vdeFE8x0KCzFoNcxWGjKI2sxz_0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vdeFE8x0KCzFoNcxWGjKI2sxz_0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vdeFE8x0KCzFoNcxWGjKI2sxz_0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vdeFE8x0KCzFoNcxWGjKI2sxz_0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=FxUZIA4vPMw:rsXs8v8cwoA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=FxUZIA4vPMw:rsXs8v8cwoA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=FxUZIA4vPMw:rsXs8v8cwoA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=FxUZIA4vPMw:rsXs8v8cwoA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=FxUZIA4vPMw:rsXs8v8cwoA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=FxUZIA4vPMw:rsXs8v8cwoA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=FxUZIA4vPMw:rsXs8v8cwoA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/FxUZIA4vPMw" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/09/18/rails-summit-2009-palestrante-bryan-liles</feedburner:origLink></item><item><title>[Rails Summit 2009] Palestrante Leonardo Borges</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/M8DBu9G7OtU/rails-summit-2009-palestrante-leonardo-borges</link><pubDate>Thu, 17 Sep 2009 15:51:48 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5206</guid><description>&lt;p style="text-align: center"&gt;&lt;a href="http://www.railssummit.com.br?utm_campaign=Railssummit&amp;utm_source=banner_parceiros&amp;utm_medium=banner&amp;utm_content=por_728x90"&gt;&lt;img src="http://railssummit.com.br/imgs/43/original/728x90.gif" alt="Rails Summit 2009"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;English translation:&lt;/strong&gt; click &lt;a href="/2009/09/17/rails-summit-2009-palestrante-leonardo-borges#leonardo-borges-english"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A partir de hoje vou colocar alguns posts sobre alguns dos palestrantes do &lt;a href="http://www.railssummit.com.br"&gt;Rails Summit Latin America 2009&lt;/a&gt;. Não deixe de se inscrever! Dias 13 e 14 de Outubro, em São Paulo.&lt;/p&gt;
&lt;div style="float: left; margin: 3px"&gt;&lt;a href="http://railssummit.locaweb.com.br/pt-BR/speakers"&gt;&lt;img src="http://railssummit.locaweb.com.br/imgs/5/original/leonardo.jpg" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Leonardo Borges&lt;/strong&gt; é desenvolvedor com 9 anos de experiência, já trabalhou em empresas de portes variados criando aplicações corporativas especialmente em Java. Atualmente vive em Madrid e trabalha com Ruby On Rails na &lt;a href="http://www.miraiespana.com/"&gt;Mirai España&lt;/a&gt; onde, dentre outros projetos, participa da iniciativa JRuby de integrar código legado com Rails. Escreve no &lt;a href="http://www.leonardoborges.com/"&gt;seu blog&lt;/a&gt; sobre desenvolvimento de software e temas relacionados.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Como você encontrou Ruby/Rails, o que foi que mais te atraiu?&lt;/p&gt;
&lt;p&gt;Foi no início de 2007. Lendo blogs e notícias na internet cheguei no site oficial do Rails e vi o famoso vídeo &lt;a href="http://www.rubyonrails.pro.br/apresentacoes"&gt;Creating a weblog in 15 minutes&lt;/a&gt;. Fiquei impressionado! Aquele vídeo foi capaz de vender nao só a produtividade que o Rails proporciona, mas o nível de expressividade ao qual podemos chegar em Ruby.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Quais assuntos mais te interessa atualmente e por quê?&lt;/p&gt;
&lt;p&gt;Devido à natureza dos projetos aqui na empresa &amp;#8211; um mix de Ruby e Java &amp;#8211; tenho me interessado bastante em JRuby e a &lt;span class="caps"&gt;JVM&lt;/span&gt; de uma maneira geral, estudando também alternativas como Scala.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; Sobre o que trata sua palestra e para que tipos de desenvolvedores é mais indicado?&lt;/p&gt;
&lt;p&gt;Eu acredito que JRuby veio pra ficar e que uma de suas maiores forças está em atrair empresas/desenvolvedores já acostumados ao mundo Java. Para isso uma integração precisa e simples entre Ruby e Java deve ser possível.&lt;/p&gt;
&lt;p&gt;Na minha palestra &amp;#8220;JRuby no mundo corporativo&amp;#8221; vou mostrar como essa integração pode ser feita para dar uma nova roupagem a um sistema legado usando JRuby on Rails.&lt;/p&gt;
&lt;p&gt;Essa sessão é para qualquer desenvolvedor Ruby interessado em rodar suas applicaçoes na &lt;span class="caps"&gt;JVM&lt;/span&gt;. No entanto, se você está trabalhando com Java no momento e está pensando como pode introduzir Ruby na sua empresa, essa palestra pode ser particularmente útil.&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;AVISO&lt;/span&gt;: Você verá fontes Java e &lt;span class="caps"&gt;XML&lt;/span&gt; nessa sessão! :P&lt;/p&gt;
&lt;h3&gt;Links&lt;/h3&gt;
&lt;ul&gt;
	&lt;li&gt;Blog do Leonardo: &lt;a href="http://leonardoborges.com/"&gt;http://leonardoborges.com/&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Site oficial do JRuby: &lt;a href="http://www.jruby.org/"&gt;http://www.jruby.org/&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;JRubyConf, primeiro evento específico de JRuby em São Francisco, pela Engine Yard: &lt;a href="http://www.jrubyconf.com/"&gt;http://www.jrubyconf.com/&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Blog do Charles Nutter, principal mantenedor: &lt;a href="http://blog.headius.com/"&gt;http://blog.headius.com/&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Jetty-Rails, uma das melhores formas de desenvolver JRuby on Rails: &lt;a href="http://jetty-rails.rubyforge.org/"&gt;http://jetty-rails.rubyforge.org/&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;JTestR, testando Java usando ferramentas Ruby como RSpec: &lt;a href="http://jtestr.codehaus.org/"&gt;http://jtestr.codehaus.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;a name="leonardo-borges-english"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Speaker Leonardo Borges&lt;/h2&gt;
&lt;p style="text-align: center"&gt;&lt;a href="http://www.railssummit.com.br?utm_campaign=Railssummit&amp;utm_source=banner_parceiros&amp;utm_medium=banner&amp;utm_content=por_728x90"&gt;&lt;img src="http://railssummit.com.br/imgs/43/original/728x90.gif" alt="Rails Summit 2009"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Starting off today, I&amp;#8217;ll post about some of the speakers for &lt;a href="http://www.railssummit.com.br"&gt;Rails Summit Latin America 2009&lt;/a&gt;. Register today! It&amp;#8217;s gonna be at São Paulo, Brazil, October 13th and 14th.&lt;/p&gt;
&lt;div style="float: left; margin: 3px"&gt;&lt;a href="http://railssummit.locaweb.com.br/pt-BR/speakers"&gt;&lt;img src="http://railssummit.locaweb.com.br/imgs/5/original/leonardo.jpg" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Leonardo Borges&lt;/strong&gt; is a developer with 9 years of experience. He&amp;#8217;ve been working for several companies creating enterprise applications specially with Java. He currently lives in Madrid, where he works with Ruby on Rails at &lt;a href="http://www.miraiespana.com/"&gt;Mirai España&lt;/a&gt; where, among other projects, colaborates in the JRuby initiative to integrate legacy code with Rails. He writes in &lt;a href="http://www.leonardoborges.com/"&gt;his blog&lt;/a&gt; about software development and related subjects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; How did you find Ruby/Rails, what attracted you the most?&lt;/p&gt;
&lt;p&gt;It was in the beginning of 2007. By reading blogs and news on the internet I arrived at the Rails official website where I saw the famous &lt;a href="http://rubyonrails.org/screencasts"&gt;Creating a weblog in 15 minutes&lt;/a&gt; screencast. I was impressed! That video was able to sell not only the productivity that Rails delivers, but also the level of expressiveness where we can achieve in Ruby.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; What subjects most interest you and why?&lt;/p&gt;
&lt;p&gt;Due to the nature of the projects I have in my company &amp;#8211; a mixture of Ruby and Java &amp;#8211; I&amp;#8217;ve very interested in JRuby and the &lt;span class="caps"&gt;JVM&lt;/span&gt; in general, studying alternatives such as Scala as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AkitaOnRails:&lt;/strong&gt; What is the subject of your talk and what kind of developers will benefit the most?&lt;/p&gt;
&lt;p&gt;I believe that JRuby will stay for a long time and one of its major strengths is to attract companies/developers already used to the Java world. For that end, a precise and simple integration between Ruby and Java is necessary.&lt;/p&gt;
&lt;p&gt;In my talk &amp;#8220;JRuby in the enterprise&amp;#8221; I&amp;#8217;ll show how that integration can be achieved to bring new life to a legacy system using JRuby on Rails.&lt;/p&gt;
&lt;p&gt;This session is recommended to any Ruby developer interested in running his applications on the &lt;span class="caps"&gt;JVM&lt;/span&gt;. On the other hand, if you&amp;#8217;re currently working with Java and trying to figure out how to introduce Ruby in your company, this talk can be particularly useful.&lt;/p&gt;
&lt;p&gt;Warking: You&amp;#8217;ll see lots of Java and &lt;span class="caps"&gt;XML&lt;/span&gt; source code in this talk! :P&lt;/p&gt;
&lt;h3&gt;Links&lt;/h3&gt;
&lt;ul&gt;
	&lt;li&gt;Leonardo&amp;#8217;s Blog: &lt;a href="http://leonardoborges.com/"&gt;http://leonardoborges.com/&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;JRuby official website: &lt;a href="http://www.jruby.org/"&gt;http://www.jruby.org/&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;JRubyConf, the first specific event for JRuby, in San Francisco, by Engine Yard: &lt;a href="http://www.jrubyconf.com/"&gt;http://www.jrubyconf.com/&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Charles Nutter&amp;#8217;s Blog, the main maintainer: &lt;a href="http://blog.headius.com/"&gt;http://blog.headius.com/&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Jetty-Rails, one of the best ways to develop with JRuby on Rails: &lt;a href="http://jetty-rails.rubyforge.org/"&gt;http://jetty-rails.rubyforge.org/&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;JTestR, testing Java using Ruby tools such as RSpec: &lt;a href="http://jtestr.codehaus.org/"&gt;http://jtestr.codehaus.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/MXc0IXmmiaaEG_ABM1HRzteMgtg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MXc0IXmmiaaEG_ABM1HRzteMgtg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/MXc0IXmmiaaEG_ABM1HRzteMgtg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MXc0IXmmiaaEG_ABM1HRzteMgtg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=M8DBu9G7OtU:Amb1C1AGc0M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=M8DBu9G7OtU:Amb1C1AGc0M:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=M8DBu9G7OtU:Amb1C1AGc0M:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=M8DBu9G7OtU:Amb1C1AGc0M:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=M8DBu9G7OtU:Amb1C1AGc0M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=M8DBu9G7OtU:Amb1C1AGc0M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=M8DBu9G7OtU:Amb1C1AGc0M:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/M8DBu9G7OtU" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/09/17/rails-summit-2009-palestrante-leonardo-borges</feedburner:origLink></item><item><title>[Rails Summit 2009] O Trailer mais Esperado! </title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/EX5cas2xe-s/rails-summit-2009-o-trailer-mais-esperado</link><pubDate>Thu, 17 Sep 2009 08:06:55 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5205</guid><description>&lt;p style="text-align: center"&gt;&lt;a href="http://www.railssummit.com.br?utm_campaign=Railssummit&amp;utm_source=banner_parceiros&amp;utm_medium=banner&amp;utm_content=por_728x90"&gt;&lt;img src="http://railssummit.com.br/imgs/43/original/728x90.gif" alt="Rails Summit 2009"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Imagino que quem viu o &lt;a href="http://www.akitaonrails.com/2009/09/16/rails-summit-2009-teaser-trailer"&gt;Teaser Trailer&lt;/a&gt; de ontem ficou curioso. O pessoal que participou do &lt;a href="http://www.devinrio.com.br/"&gt;Dev in Rio&lt;/a&gt; viu uma versão &amp;#8220;especial&amp;#8221; em primeira mão alguns dias atrás, agora aí vai a versão oficial:&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/aR7zOHDzsPM&amp;hl=en&amp;fs=1&amp;color1=0x5d1719&amp;color2=0xcd311b"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/aR7zOHDzsPM&amp;hl=en&amp;fs=1&amp;color1=0x5d1719&amp;color2=0xcd311b" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;E você, já se inscreveu no &lt;a href="http://www.railssummit.com.br"&gt;Rails Summit Latin America 2009&lt;/a&gt; ?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tYQRCGZ9XEVD5I0zqG85jLx7Ns4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tYQRCGZ9XEVD5I0zqG85jLx7Ns4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tYQRCGZ9XEVD5I0zqG85jLx7Ns4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tYQRCGZ9XEVD5I0zqG85jLx7Ns4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=EX5cas2xe-s:-d_vfvLzRCQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=EX5cas2xe-s:-d_vfvLzRCQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=EX5cas2xe-s:-d_vfvLzRCQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=EX5cas2xe-s:-d_vfvLzRCQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=EX5cas2xe-s:-d_vfvLzRCQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=EX5cas2xe-s:-d_vfvLzRCQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=EX5cas2xe-s:-d_vfvLzRCQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/EX5cas2xe-s" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/09/17/rails-summit-2009-o-trailer-mais-esperado</feedburner:origLink></item><item><title>[Tradução] Os problemas do pensamento do Visual Studio (e outras IDEs)</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/RO-FWX2taRQ/tradu--o-os-problemas-do-pensamento-do-visual-studio-e-outras-ides</link><pubDate>Wed, 16 Sep 2009 22:57:15 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5204</guid><description>&lt;p style="text-align: center"&gt;&lt;a href="http://www.railssummit.com.br?utm_campaign=Railssummit&amp;utm_source=banner_parceiros&amp;utm_medium=banner&amp;utm_content=por_728x90"&gt;&lt;img src="http://railssummit.com.br/imgs/43/original/728x90.gif" alt="Rails Summit 2009"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;De tempos em tempos alguém me pergunta algo do tipo &lt;em&gt;&amp;#8220;Que &lt;span class="caps"&gt;IDE&lt;/span&gt; você usa para programar em Ruby?&amp;#8221;&lt;/em&gt; E todos ficam surpresos ou frustrados quando eu digo &lt;em&gt;&amp;#8220;Nenhum, apenas um editor de textos competente.&amp;#8221;&lt;/em&gt; Parece que a maioria dos programadores de Visual Basic, Delphi, Java, C#, VB.&lt;span class="caps"&gt;NET&lt;/span&gt;, simplesmente não conseguem sair do dogma dos IDEs com IntelliSense.&lt;/p&gt;
&lt;p&gt;Eu, felizmente, comecei a programar dBase numa era onde o máximo em editor de textos era o Wordstar. No &lt;span class="caps"&gt;DOS&lt;/span&gt; eu usei &lt;span class="caps"&gt;EDLIN&lt;/span&gt; e depois o Edit que vinha nos &lt;span class="caps"&gt;DOS&lt;/span&gt; acho que 5.0. Quando fui programador Clipper no começo da década de 90, meu editor favorito era o Norton Editor. Somado a ferramentas como Sidekick, eu tinha a estação de desenvolvimento mais poderosa que se poderia querer: um editor de textos e só.&lt;/p&gt;
&lt;p&gt;Quando o Java surgiu, um &lt;span class="caps"&gt;IDE&lt;/span&gt; com capacidades de auto-complete eram obrigatórias. Em .&lt;span class="caps"&gt;NET&lt;/span&gt; a mesma coisa, e pelas mesmas razões. Aqui eu traduzo a palestra entitulada &lt;a href="http://www.charlespetzold.com/etc/DoesVisualStudioRotTheMind.html"&gt;O Visual Studio estraga nossas mentes?&lt;/a&gt;, apresentada no &lt;span class="caps"&gt;NYC&lt;/span&gt; .&lt;span class="caps"&gt;NET&lt;/span&gt; Developer’s Group, em 20 de Outubro de 2005 por &lt;a href="http://rubyurl.com/L1vF"&gt;Charles Petzold&lt;/a&gt;. Ele faz uma longa análise dos fundamentos de porque um programador viciado nos dogmas impostos pelo Visual Studio está se tornando um programador ruim.&lt;/p&gt;
&lt;p&gt;Atualmente, eu programo apenas Ruby (e outras coisas como Javascript de vez em quando) apenas no Textmate, um competente editor de textos, reminiscente de inspirações em Emacs e &lt;a href="/2009/04/27/the-best-environment-for-rails-on-windows-part-2"&gt;Vim&lt;/a&gt;, outros dois excelentes editores. E não sinto falta de Eclipses, Netbeans ou qualquer coisa desse tipo e, obviamente, nenhuma falta do Visual Studio. Ah sim, precisar de auto-complete só mostra uma coisa: que as APIs estão sendo muito porcamente desenhadas ultimamente, tornando-as ridiculamente longas!&lt;/p&gt;
&lt;p&gt;Recomendo ler o &lt;a href="http://www.charlespetzold.com/etc/DoesVisualStudioRotTheMind.html"&gt;artigo inteiro&lt;/a&gt;, pois só traduzi as partes relevantes ao meu ponto. Vamos à tradução:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PS:&lt;/strong&gt; Vale a pena descrever o paradoxo: não dá para efetivamente ser produtivo em .&lt;span class="caps"&gt;NET&lt;/span&gt; sem Visual Studio, em Java sem Eclipse/Netbeans/etc ou ObjC sem XCode. Isso é um fato. Na prática mesmo, a solução não é fazer C# em Notepad. Esse é o ponto a se pensar ;-)&lt;/p&gt;&lt;h2&gt;Proliferação de APIs&lt;/h2&gt;
&lt;p&gt;Vinte anos atrás, em Novembro de 1985, o Windows 1.0 foi lançado com cerca de 400 funções documentadas. Dez anos depois, o Windows 95 teve bem mais de mil.&lt;/p&gt;
&lt;p&gt;Hoje (em Outubro de 2005), estamos prontos para o lançamento oficial do .&lt;span class="caps"&gt;NET&lt;/span&gt; Framework 2.0. Tabulando somente o MSCorLib.dll e aqueles assemblies que começam com a palavra &lt;em&gt;System&lt;/em&gt;, temos mais de 5.000 classes públicas que incluem mais de 45.000 métodos públicos e 15.000 propriedades públicas, sem contar os métodos e propriedades herdados e não sobrescritos. Um livro que listasse os nomes, valores de retorno e argumentos destes métodos e propriedades, uma por linha, teria cerca de mil páginas.&lt;/p&gt;
&lt;p&gt;Se você escrevesse cada uma das 60.000 propriedades e métodos em cartões de 7 por 12 centímetros com uma pequena descrição do que fazem, teria uma pilha de 12 metros. Estes 60.000 cartões, alinhados de ponta a ponta &amp;#8211; pelo comprimento de 12cm &amp;#8211; poderia cercar o Central Park (quase), e eu ouvi que isso será realmente um projeto de arte pública no próximo verão.&lt;/p&gt;
&lt;p&gt;Pode qualquer programador dominar 60.000 métodos e propriedades? Acho que não. Uma solução, é claro, é a especialização. Eu mesmo me especializei. Esta noite, eu espero que ninguém me faça perguntas sobre Web Forms ou &lt;span class="caps"&gt;ASP&lt;/span&gt; .&lt;span class="caps"&gt;NET&lt;/span&gt; ou &lt;span class="caps"&gt;SQL&lt;/span&gt; Server, pois essas não são minhas especialidades. Eu faço Windows Forms, e minha linguagem é C#.&lt;/p&gt;
&lt;h2&gt;IntelliSense&lt;/h2&gt;
&lt;p&gt;Visual Studio tem tentado atenuar o problema da proliferação de classes, métodos e propriedades com um recurso chamado IntelliSense. Isso certamente coloca a informação ao nosso alcance, se você pensar em seus dedos no sentido figurado como aquele lugar na tela onde o cursor do teclado está.&lt;/p&gt;
&lt;p&gt;Como outras tecnologias viciantes, eu tenho um relacionamento de amor / ódio com o IntelliSense, e quanto mais eu o desprezo mais o uso, e quanto mais eu o uso, mais revoltado fico com a forma como fiquei viciado, e quanto mais viciado fico, mais eu desejo que isso nunca tivesse sido inventado.&lt;/p&gt;
&lt;p&gt;Apenas no caso de você ter estado fora das trincheiras por algum tempo, o IntelliSense é a culminação de algumas tentativas anteriores em tecnologias de completar código. Se você digitar um nome de objeto e um ponto, por exemplo, obterá um menu de rolagem com uma lista de todos os métodos públicos, propriedades e eventos para essa classe, e quando você escolhe um nome de método e abre um parêntese, poderá obter as sobrecargas com vários argumentos, e uma dica descrevendo o que o método faz.&lt;/p&gt;
&lt;p&gt;IntelliSense é considerado por alguns como a inovação de programação mais importante desde a cafeína. Ele funciona especialmente bem com .&lt;span class="caps"&gt;NET&lt;/span&gt; porque o Visual Studio pode usar reflexão para obter todas as informações que precisa das DLLs que você especificou como referências.&lt;/p&gt;
&lt;p&gt;Na verdade, o IntelliSense tornou-se o primeiro aviso quando você não incluiu devidamente uma referência &lt;span class="caps"&gt;DLL&lt;/span&gt; ou uma diretiva &lt;em&gt;using&lt;/em&gt; no topo do seu código. Você começa a digitar e o IntelliSense aparece com nada. Daí já sabe imediatamente que algo está errado.&lt;/p&gt;
&lt;p&gt;E, no entanto, o IntelliSense também está ditando a forma como programamos.&lt;/p&gt;
&lt;p&gt;Por exemplo, por muitos anos os programadores têm debatido se é melhor codificar de cima para baixo, onde basicamente você começa com a estrutura geral do programa e, eventualmente, o código das rotinas mais detalhadas na parte inferior ou, alternativamente, a abordagem de baixo para cima, onde você começa com as funções de nível baixo e prossegue para cima. Algumas linguagens, como Pascal clássico, basicamente impõe uma abordagem de baixo para cima, mas outras linguagens não.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nota do Akita:&lt;/strong&gt; Na comunidade Ruby on Rails, na vertente que adotou o Cucumber como ferramenta Ágil, o conceito de Behavior Driven Development (&lt;span class="caps"&gt;BDD&lt;/span&gt;) nos leva a programar de cima para baixo, que hoje é considerado uma forma muito mais eficiente de desenvolvimento, iniciando pelas User Stories, indo para a interface com o usuário, depois as rotas, os controllers, os models e só então as tabelas no banco, por exemplo.&lt;/p&gt;
&lt;p&gt;Bem, o debate está terminado. Para o IntelliSense funcionar corretamente, programação de baixo para cima é melhor. O IntelliSense quer cada classe, cada método, cada propriedade, cada parâmetro do método, todas as variáveis locais adequadamente definidas antes de se referir a elas. Se esse não for o caso, então ele tentará corrigir o que você está digitando, usando algo que foi definido, e que provavelmente é simplesmente errado.&lt;/p&gt;
&lt;p&gt;Por exemplo, suponha que você está digitando um código e decide que precisa de uma variável chamada &lt;em&gt;id&lt;/em&gt;, e em vez de defini-la primeiro, você começa a digitar uma instrução que começa com &lt;em&gt;id&lt;/em&gt; e um espaço. Eu sempre digito um espaço entre a minha variável e o sinal de igual. Como &lt;em&gt;id&lt;/em&gt; não está definido em nenhum lugar, o IntelliSense encontrará algo que começa com estas duas letras que está sintaticamente correta, de acordo com as referências, namespaces, e o contexto de seu código. No meu caso particular, o IntelliSense decide que eu realmente queria definir uma variável do tipo de interface &lt;em&gt;IDataGridColumnStyleEditingNotificationService&lt;/em&gt;, uma interface que eu nunca tive a oportunidade de usar.&lt;/p&gt;
&lt;p&gt;No lado positivo, se você realmente precisa definir um objeto do tipo &lt;em&gt;IDataGridColumnStyleEditingNotificationService&lt;/em&gt;, tudo que precisa fazer é digitar &lt;em&gt;id&lt;/em&gt; e um espaço.&lt;/p&gt;
&lt;p&gt;Se isso é errado, você pode eliminar o código proposto pelo IntelliSense e voltar ao que digitou originalmente com a combinação de teclas Ctrl-Z para desfazer. Eu gostaria de bater na mão dele e dizer &amp;#8220;Não&amp;#8221;, mas Ctrl-Z é a única coisa que funciona. Quem poderia supor que Ctrl-Z se tornaria uma das teclas mais importantes na utilização de modernas aplicações do Windows? Ctrl-Z funciona no Microsoft Word como, bem, quando o Word é excessivamente agressivo consertando sua digitação.&lt;/p&gt;
&lt;p&gt;Mas a implicação aqui é impressionante. Para o IntelliSense começar a trabalhar direito, você não apenas deve codificar em uma estrutura de baixo para cima, mas dentro de cada método ou propriedade, também deve escrever código linearmente do início ao fim &amp;#8211; exatamente como se estivesse usando o editor de linhas do velho &lt;span class="caps"&gt;DOS&lt;/span&gt;, o &lt;a href="http://en.wikipedia.org/wiki/Edlin"&gt;&lt;span class="caps"&gt;EDLIN&lt;/span&gt;&lt;/a&gt;. Você deve definir todas as variáveis antes de usá-las. Não mais saltando para qualquer lugar em seu código.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nota do Akita:&lt;/strong&gt; por isso é tão desconfortável exercitar Test Driven Development (&lt;span class="caps"&gt;TDD&lt;/span&gt;) com IDEs: &lt;span class="caps"&gt;TDD&lt;/span&gt; exige programação de cima para baixo, primeiro criando testes que falham para depois criar o código que a satisfaz. A &lt;span class="caps"&gt;IDE&lt;/span&gt; simplesmente não gosta dessa ordem e exige malabarismo para sair disso.&lt;/p&gt;
&lt;p&gt;Não é que o IntelliSense está nos ensinando a programar como uma máquina, é só que o IntelliSense seria muito mais feliz se assim o fizéssemos.&lt;/p&gt;
&lt;p&gt;E eu acho que isso está nos tornando mais idiotas. Em vez de descobrir exatamente o método que eu preciso, ou em vez de tentar lembrar um nome de propriedade indescritível, encontro-me a percorrer as possibilidades que o IntelliSense oferece, à procura de um nome familiar, ou pelo menos algo que parece se encaixar.&lt;/p&gt;
&lt;p&gt;Eu não preciso lembrar mais nada. O IntelliSense se lembrará para mim. Além disso, eu justifico a mim mesmo que não quero aqueles 60.000 métodos e propriedades bagunçando minha mente. A minha saúde mental global será sem dúvida melhor sem eles, mas ao mesmo tempo, estou impedido de alcançar um estilo fluido de codificação porque ela não vem inteiramente da minha cabeça. Minha codificação tornou-se um diálogo constante com o IntelliSense.&lt;/p&gt;
&lt;p&gt;Então eu não acho que o IntelliSense está nos ajudando a nos tornar programadores melhores. O objetivo real é para nos tornarmos programadores mais &lt;em&gt;rápidos&lt;/em&gt;, o que também significa que está barateando nosso trabalho.&lt;/p&gt;
&lt;p&gt;Claro, eu poderia sempre apenas desligá-lo.&lt;/p&gt;
&lt;p&gt;E andar descalço? De jeito nenhum!&lt;/p&gt;
&lt;p&gt;IntelliSense é uma tecnologia inevitável. Se a Microsoft não tivesse feito isso, alguém teria. Os seres humanos nunca foram inclinados a abster-se de perseguir certas tecnologias, pois eles podem ter repercussões infelizes.&lt;/p&gt;
&lt;h2&gt;Código Gerado&lt;/h2&gt;
&lt;p&gt;Não só o Visual Studio tenta completar código que estamos digitando, mas há muitos anos, o Visual Studio quis gerar o código para nós. Se selecionarmos um novo projeto de tipo Aplicativo Windows, por exemplo, e dar-lhe um nome e um local em uma unidade de disco, o Visual Studio gerará código suficiente para que este projeto seja imediatamente compilável e executável.&lt;/p&gt;
&lt;p&gt;De alguma forma, nós fomos convencidos de que esta é a maneira correta de programar. Eu não sei porquê. Pessoalmente, acho que iniciar um programa com um arquivo de código fonte vazio é muito agradável. Eu gosto de escrever as preliminares e, em seguida, a função principal, ou o método &lt;em&gt;main&lt;/em&gt;. O momento em que eu possa realmente usar alguma ajuda não é quando estou começando um programa, mas quando estou tentando terminar. Onde está o Visual Studio então?&lt;/p&gt;
&lt;p&gt;Vamos para o Visual Studio 2005 em nossa imaginação e criar um programa C# Windows Forms &amp;#8211; um projeto do tipo Aplicação Windows &amp;#8211; e analisar o código.&lt;/p&gt;
&lt;p&gt;Primeiro, vemos que o Visual Studio ligou o nosso programa a um grupo de bibliotecas de vínculo dinâmico que ele acha que precisamos. Criou referências não somente aos assemblies System, System.Drawing e System.Windows.Forms que são necessários em qualquer aplicativo não-trivial de Windows Forms, mas também System.Data, System.Deployment e System.Xml, independentemente se seu programa necessita dessas DLLs ou não. Estas referências extras não fazem nenhum mal real, exceto se alguém examina o programa &amp;#8211; talvez para fazer algumas alterações após o programador original ter ido embora &amp;#8211; e assume que a aplicação &lt;em&gt;requer&lt;/em&gt; estas referências. Agora há confusão, porque existem referências a DLLs que o programa realmente não precisa.&lt;/p&gt;
&lt;p&gt;Entre outros arquivos, o Visual Studio cria um Form1.cs que gentilmente permite a você, o programador, modificar. Esse é o código fonte do arquivo onde os manipuladores de eventos vão para controles no formulário principal. Nós vemos um monte de directivas &lt;em&gt;using&lt;/em&gt; no topo com os namespaces para as necessidades do programa. Os namespaces normais para os programas do Windows Forms são System, System.Drawing e System.Windows.Forms, mas o Visual Studio também inclui System.Collections, System.ComponentModel, System.Data e System.Text, alguns dos quais são úteis com certeza, mas se o programa realmente não usar qualquer uma das classes nesses namespaces, eles são apenas ruídos de distração.&lt;/p&gt;
&lt;p&gt;O Visual Studio também inclui todo o código que gera em um namespace onde é dado o mesmo nome que o nome do projeto. Claro, eu entendo completamente o valor de ter um namespace para DLLs, mas por que ter um namespace para as aplicações? Eu pensei muito, e não consigo entender.&lt;/p&gt;
&lt;p&gt;Eu tenho falado sobre código, mas quando você cria um novo projeto Windows Forms, o Visual Studio não coloca qualquer um dos arquivos de código fonte na sua frente. Em vez disso, ele coloca uma exibição de design de um formulário onde você deve começar a preencher de forma interativa com controles.&lt;/p&gt;
&lt;p&gt;O Visual Studio também cria um arquivo chamado Form1.Designer.cs, e em algumas versões beta do Visual Studio 2005, esse arquivo não foi sequer listado entre os arquivos do projeto, por padrão. Este é o arquivo onde o Visual Studio insere código gerado quando você cria o formulário. O Visual Studio realmente não quer que você mexa com esse arquivo e por boas razões. Ele espera que este código gerado esteja em um determinado formato e, se você mexer nele, pode não ser capaz de lê-lo de volta na próxima vez que abrir o projeto.&lt;/p&gt;
&lt;p&gt;(&amp;#8230;)&lt;/p&gt;
&lt;h2&gt;Design Interativo&lt;/h2&gt;
&lt;p&gt;A maioria das coisas realmente inovadoras de design interativo, encontrou sua primeira manifestação no Visual Basic de Windows, e aqui é onde eu comecei a ficar nervoso sobre onde a programação no Windows estava indo. Não só você poderia mover um botão em seu formulário, e de forma interativa posicioná-lo e acertar seu tamanho do jeito que quisesse, mas se clicasse no botão, o Visual Basic geraria um manipulador de eventos para você, deixando-o digitar o código.&lt;/p&gt;
&lt;p&gt;Isso me incomodou porque o Visual Basic estava tratando de um programa não como um documento completo e coerente, mas como pequenos trechos de código anexado para objetos visuais. Isso não é programar. Não é isso que o compilador vê. Como é que alguém obtêm um senso de um programa completo? Me deixou perplexo.&lt;/p&gt;
&lt;p&gt;Eventualmente, o material de desenho interativo encontrou seu caminho para o desenvolvimento com C++ e Microsoft Foundation Classes, e lá, eu realmente acreditei, a geração de código foi usado para esconder um monte de coisas cabeludas do &lt;span class="caps"&gt;MFC&lt;/span&gt; que realmente &lt;em&gt;ninguém&lt;/em&gt; queria ouvir falar.&lt;/p&gt;
&lt;p&gt;Para um autor que escreve livros de programação, todo este material apresenta um dilema. Como você escreve um tutorial de programação? Você se concentra sobre o uso do Visual Studio para desenvolver aplicativos? Sinceramente, eu achei muito difícil escrever frases como &amp;#8220;Agora arraste o objeto botão da caixa de ferramenta para a sua caixa de diálogo&amp;#8221; e ainda sentir como se estivesse ensinando programação. Eu nunca escrevi sobre C++ e &lt;span class="caps"&gt;MFC&lt;/span&gt;, parcialmente porque &lt;span class="caps"&gt;MFC&lt;/span&gt; parecia um invólucro fino sobre a &lt;span class="caps"&gt;API&lt;/span&gt; do Windows e muito mal orientado a objetos. Eu continuei a rever edições posteriores do &lt;em&gt;Programming Windows&lt;/em&gt; sob a suposição de que os seus leitores fossem programadores como eu, que preferiam escrever seu próprio código do zero.&lt;/p&gt;
&lt;h2&gt;Até mais, Resource Script&lt;/h2&gt;
&lt;p&gt;Eu comecei a olhar para o beta do .&lt;span class="caps"&gt;NET&lt;/span&gt; 1.0 e Windows Forms, no verão de 2000, e era claramente mais orientado a objeto do que o &lt;span class="caps"&gt;MFC&lt;/span&gt; jamais poderia ser. Gostei disso. Eu também estava intrigado que o Resource Script tinha desaparecido completamente. Você criava e montava controles nas caixas de diálogo &amp;#8211; agora reunidos sob o termo mais global de &amp;#8220;formulários&amp;#8221; &amp;#8211; ali mesmo em seu código. Claro que, mesmo no Windows 1.0, você poderia criar controles no código, e a primeira edição do &lt;em&gt;Programming Windows&lt;/em&gt; tem alguns exemplos. Mas simplesmente não era muito agradável, porque toda criação de controles envolvia uma chamada para a função &lt;em&gt;CreateWindow&lt;/em&gt; de 11 argumentos. Mas a criação de controles via código no Windows Forms era um piscar de olhos.&lt;/p&gt;
&lt;p&gt;O que é agradável sobre criar e manipular controles no código é que você os está criando e manipulando no código. Suponha que você queira uma coluna de dez botões igualmente espaçados do mesmo tamanho exibindo nomes de cores. Em um programa, você pode realmente armazenar os dez valores de cores em um só lugar. É chamado um &lt;em&gt;array&lt;/em&gt;. Há também uma excelente forma de criar e posicionar estes dez botões. É chamado de um loop &lt;em&gt;for&lt;/em&gt;. Isso é programação.&lt;/p&gt;
&lt;p&gt;Mas o Visual Studio não quer que você use arrays ou loops for para criar e posicionar esses botões. Ele quer que você use o designer, e ele quer gerar o código para você e escondê-lo onde você não possa vê-lo.&lt;/p&gt;
&lt;p&gt;Quase vinte anos após o primeiro Editor de diálogo, o Visual Studio agora é o culpado, que gera código feio e o avisa para que não se meta com ele.&lt;/p&gt;
&lt;p&gt;Se você tentar ler este código, não é assim tão fácil, porque cada classe e estrutura é precedido por um namespace completo:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;System.Windows.Forms.Button button1 = System.Windows.Forms.Button ();&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Claro, nós sabemos porque o Visual Studio precisa fazer isso. Em teoria, é possível para você adicionar à caixa de ferramentas do Visual Studio outro controle &lt;em&gt;Button&lt;/em&gt; chamado de outra &lt;span class="caps"&gt;DLL&lt;/span&gt; com outro namespace, e deve haver uma maneira de diferenciá-los.&lt;/p&gt;
&lt;p&gt;Como o Visual Studio está gerando código baseado nos controles que você selecionar, ele dá nomes padrões aos controles, como &lt;em&gt;button1&lt;/em&gt;, &lt;em&gt;button2&lt;/em&gt;, &lt;em&gt;button3&lt;/em&gt;, &lt;em&gt;label1&lt;/em&gt;, &lt;em&gt;label2&lt;/em&gt;, &lt;em&gt;label3&lt;/em&gt;, &lt;em&gt;textBox1&lt;/em&gt;, &lt;em&gt;textBox2&lt;/em&gt;, &lt;em&gt;textBox3&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Claro, o Visual Studio permite que você altere o nome da variável. Você pode alterar a propriedade &lt;em&gt;Nome&lt;/em&gt; do controle, e isso se torna não apenas a propriedade &lt;em&gt;Nome&lt;/em&gt; do objeto botão, mas também o seu nome de variável.&lt;/p&gt;
&lt;p&gt;Os programadores realmente fazem isso? Eu tenho certeza que alguns fazem, mas também estou certo que muitos não o fazem. Como eu sei? Dê uma olhada em alguns dos códigos de exemplo que vem da Microsoft. Lá você verá &lt;em&gt;button1&lt;/em&gt;, &lt;em&gt;button2&lt;/em&gt;, &lt;em&gt;button3&lt;/em&gt;, etc. E, no entanto, todos concordam que um dos elementos mais importantes de código auto-documentado está em dar nomes significativos às suas variáveis e objetos.&lt;/p&gt;
&lt;p&gt;Se o Visual Studio realmente quisesse que você escrevesse código bom, toda vez que você arrastasse um controle no formulário, uma janela pop-up irritante diria: &amp;#8220;Escreva um nome significativo para este controle.&amp;#8221; Mas o Visual Studio não está interessado em fazer você escrever código bom. Ele quer que você escreva código rápido.&lt;/p&gt;
&lt;p&gt;Enquanto estou no assunto de nomes de variáveis, eu deveria dizer algo positivo sobre o Visual Studio. O Visual Studio 2005 tem uma facilidade totalmente esplêndida de renomear variáveis. Você sabe como às vezes realmente quer mudar o nome de uma variável para estar mais em sintonia com sua função real no programa, mas você está receoso por causa dos possíveis efeitos secundários de buscar e substituir? Bem, esta nova renomeação de variáveis evita tudo isso, e também irá lhe dizer se você está renomeando algo para um nome que já existe. Espero que as pessoas se aproveitem disso para renomear seus controles para algo diferente dos padrões do Visual Studio.&lt;/p&gt;
&lt;h2&gt;Propriedades usadas Demais&lt;/h2&gt;
&lt;p&gt;Outro problema com a geração de código do Visual Studio é que todo controle vira uma propriedade na classe onde é criado. Esta é uma prática odiosa de programação, e realmente me incomoda que programadores possam estar olhando o código gerado pelo Visual Studio para aprender técnicas de programação adequada, e é isso que eles vêem.&lt;/p&gt;
&lt;p&gt;Nos dias anteriories à orientação-a-objetos de programação C, tínhamos variáveis locais e variáveis globais, variáveis dentro de funções e variáveis fora de funções. Um dos objetivos da boa programação em C estava em manter o número de variáveis globais ao mínimo. Como qualquer variável global poderia ser modificada por qualquer função, era mais fácil entender um programa se simplesmente não houvesse muitas delas &amp;#8211; se as funções estritamente se comunicassem entre si através de argumentos e valores de retorno.&lt;/p&gt;
&lt;p&gt;Às vezes, no entanto, os programadores C ficavam um pouco, digamos, &lt;em&gt;sonolentos&lt;/em&gt;, e faziam uma série de variáveis globais que realmente não precisavam existir, porque era mais fácil dessa maneira. Ao invés de acrescentar um argumento extra para uma função, porque armazená-lo como uma global?&lt;/p&gt;
&lt;p&gt;As variáveis globais basicamente desapareceram em programação orientada-a-objetos, exceto que propriedades são agora as novas variáveis globais e podem ser abusadas de forma muito ruim.&lt;/p&gt;
&lt;p&gt;Um dos princípios básicos de programação orientada-a-objetos está em esconder dados. Isso geralmente se aplica entre classes. Classes não devem expor tudo o que têm. Elas deveriam ter uma interface pública o menor possível, e outras classes devem saber apenas o que precisam saber. Mas o princípio de ocultamento de dados é importante também &lt;em&gt;dentro&lt;/em&gt; de uma classe. Métodos devem ter acesso limitado aos dados que outros métodos estão usando. Em geral, as variáveis devem ser locais para um método a menos que haja uma razão específica de porque precisam ser acessados de qualquer outro método.&lt;/p&gt;
&lt;p&gt;Quando você cria um objeto usando o operador &lt;em&gt;new&lt;/em&gt;, a quantidade de armazenamento alocada no heap para o objeto deve ser suficiente para acomodar todas as propriedades definidas na classe que está criando o objeto e todas as classes ancestrais. As propriedades basicamente definem o tamanho do objeto na memória. Eu sei que estamos muito além do ponto de se preocupar com cada byte de armazenamento, mas quando você olha para as propriedades que definiu em sua classe, deve estar se perguntando: Será que todo este material realmente precisa ser armazenado com cada objeto no heap? Ou restringi com sucesso as propriedades às informações necessárias para manter o objeto?&lt;/p&gt;
&lt;p&gt;Alguém me disse que gosta de armazenar objetos como propriedades porque tem medo do garbage collector do .&lt;span class="caps"&gt;NET&lt;/span&gt; limpar tudo que não estiver em definições apropriadas de propriedade. Depois de anos definindo muito poucas propriedades em .&lt;span class="caps"&gt;NET&lt;/span&gt;, posso lhes dizer que isto não é um problema. O garbage collector do .&lt;span class="caps"&gt;NET&lt;/span&gt; só excluirá objetos que não são mais referenciados em qualquer parte do programa. Se você ainda pode acessar um objeto de alguma forma, ele não é elegível para coleta de lixo.&lt;/p&gt;
&lt;p&gt;Em teoria, nenhuma controle-filho criado como parte de um formulário deve ser armazenado como uma propriedade porque o pai &amp;#8211; geralmente um formulário &amp;#8211; armazena todos os seus controles-filho na coleção chamada &lt;em&gt;Controls&lt;/em&gt;, e você pode fazer referência a cada controle indexando a propriedade &lt;em&gt;Controls&lt;/em&gt; usando inteiros ou a propriedade texto &lt;em&gt;Nome&lt;/em&gt; que lhe foi atribuída ao criar o controle. E aqui mais uma vez você está muito melhor se os controles tiverem nomes significativos e não &lt;em&gt;button1&lt;/em&gt;, &lt;em&gt;button2&lt;/em&gt;, &lt;em&gt;button3&lt;/em&gt;, &lt;em&gt;label1&lt;/em&gt;, &lt;em&gt;label2&lt;/em&gt;, &lt;em&gt;label3&lt;/em&gt; &amp;#8230;&lt;/p&gt;
&lt;p&gt;Se um determinado objeto é definido como uma propriedade ou uma variável local é algo que nós, como programadores devemos estar pensando a cada objeto que criamos. Um label que tem o mesmo texto durante toda a duração do formulário pode ser facilmente local. Para um rótulo cujo texto é o conjunto de um manipulador de eventos de algum outro controle, provavelmente é mais conveniente armazenar como uma propriedade.&lt;/p&gt;
&lt;p&gt;É muito simples. Mas o Visual Studio não quer que você pense sobre isso. O Visual Studio quer tudo armazenado como uma propriedade.&lt;/p&gt;
&lt;h2&gt;Visual Studio Desmistificado&lt;/h2&gt;
&lt;p&gt;Mesmo se o Visual Studio gerasse código imaculado, ainda haveria um problema. Como ele está gerando o código, também ergue muros entre o código e o programador. Ele implica que esta é a única maneira que você pode escrever um programa Windows moderno ou web, porque há certos aspectos da programação moderna que só ela conhece. E o Visual Studio aumenta essa impressão, incluindo código clichê que contém material que nunca foi realmente discutido de forma adequada, nos tutoriais ou documentação que a Microsoft oferece.&lt;/p&gt;
&lt;p&gt;Torna-se imperativo para mim, como professor de programação Windows Forms e programação de Avalon, deliberadamente ir na direção oposta. Eu sinto necessidade de desmistificar o que o Visual Studio está fazendo e demonstrar como você pode desenvolver esses aplicativos escrevendo seu próprio código e, se você quiser, compilar esse código na linha de comando totalmente fora do Visual Studio.&lt;/p&gt;
&lt;p&gt;Nos meus livros de formulários do Windows, eu digo ao leitor para não escolher Aplicação Windows quando se inicia um novo projeto Windows Forms, mas escolher a opção Projeto Vazio em vez disso. O projeto vazio não cria nada além de um arquivo de projeto. Todas as referências e todo o código deve ser adicionado explicitamente.&lt;/p&gt;
&lt;p&gt;Estou prestando um serviço público, mostrando aos programadores como escrever código de uma maneira que é diametralmente oposta às funcionalidades incorporadas na ferramenta que eles estão usando? Eu não sei. Talvez isto seja errado, mas não vejo outra alternativa.&lt;/p&gt;
&lt;p&gt;(&amp;#8230;)&lt;/p&gt;
&lt;h2&gt;Os Prazeres Puros de Código Puro&lt;/h2&gt;
&lt;p&gt;Alguns meses atrás &amp;#8211; talvez como um antídoto para toda essa overdose de Windows Forms e programação Avalon que tenho feito &amp;#8211; eu comecei a programar em C novamente. Só um pouquinho. Uma revista que li &amp;#8211; o semanário britânico &lt;em&gt;New Scientist&lt;/em&gt; &amp;#8211; tem uma parte chamada de &amp;#8220;Enigma&amp;#8221;, que apresenta um pequeno enigma de matemática. Aqui está um curto de Junho passado: &amp;#8220;Qual é o maior inteiro cujos algarismos são todos diferentes (e não incluem 0), que é divisível por cada um dos seus dígitos individuais?&amp;#8221; Se você resolve um dos problemas Enigma, pode enviar a sua solução, e uma é escolhida aleatoriamente em uma determinada data, e se o seu for escolhido você ganha &lt;span class="caps"&gt;USD&lt;/span&gt; 25 e uma menção na revista.&lt;/p&gt;
&lt;p&gt;Estes problemas Enigma realmente me incomodaram durante anos, porque eles sempre me pareceram ser resolvidos escrevendo um programa curto e testando as possibilidades e, por alguma razão, isso me parecia absurdo.&lt;/p&gt;
&lt;p&gt;Alguns meses atrás eu decidi que poderia realmente ser interessante resolver os problemas com código, e em seguida enviar os programas e soluções no meu site um dia depois do prazo, mas cerca de uma semana antes da resposta aparecer impressa.&lt;/p&gt;
&lt;p&gt;Eu decidi usar o bom e velho &lt;span class="caps"&gt;ANSI&lt;/span&gt; C, e editar o código-fonte no Bloco de notas &amp;#8211; que não tem nenhuma noção de IntelliSense e nenhuma noção de qualquer outra coisa &amp;#8211; e compilar na linha de comando usando tanto o compilador Microsoft C e o compilador &lt;span class="caps"&gt;GNU&lt;/span&gt; C.&lt;/p&gt;
&lt;p&gt;O que é interessante sobre este projeto é que eu não tenho que olhar nada. Eu tenho codificado em C há 20 anos. Foi a minha linguagem preferida antes de C#. E isso é apenas pura codificação algorítmica com saída de texto simples. É somente conteúdo.&lt;/p&gt;
&lt;p&gt;Eu também descobri que os problemas &lt;em&gt;realmente&lt;/em&gt; exigem uma reflexão antes de codificá-los. Muitas vezes, o número total de combinações é proibitivo. Você realmente tem que trabalhar. Você não quer escrever um programa que precisa ser executado por uma semana antes de chegar à instrução &lt;em&gt;printf&lt;/em&gt;. Por exemplo, se o problema que citei: &amp;#8220;Qual é o maior inteiro cujos algarismos são todos diferentes (e não incluem 0) que é divisível por cada um dos seus dígitos individuais?&amp;#8221; Isso realmente ajuda a perceber que este número inteiro não pode conter o dígito 5 se ele também contém qualquer dígito par, porque então o número será divisível por 10, e o último dígito seria 0, o que não é permitido. Assim, o número que estamos procurando provavelmente não inclui 5. O que imediatamente reduz as possibilidades por uma ordem de grandeza.&lt;/p&gt;
&lt;p&gt;Mesmo após este processo preliminar, há ainda codificação para fazer, mas não há nenhuma &lt;span class="caps"&gt;API&lt;/span&gt;, não há classes, não há propriedades, não há formulários, não há controles, não há manipuladores de eventos, e não há definitivamente o Visual Studio.&lt;/p&gt;
&lt;p&gt;É somente eu e o código e, por algum tempo, me sinto como um &lt;strong&gt;verdadeiro programador&lt;/strong&gt; novamente.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ToQ64CXi1ic_ynDwYjTNMfaWvVE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ToQ64CXi1ic_ynDwYjTNMfaWvVE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ToQ64CXi1ic_ynDwYjTNMfaWvVE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ToQ64CXi1ic_ynDwYjTNMfaWvVE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=RO-FWX2taRQ:MacZmB8048M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=RO-FWX2taRQ:MacZmB8048M:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=RO-FWX2taRQ:MacZmB8048M:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=RO-FWX2taRQ:MacZmB8048M:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=RO-FWX2taRQ:MacZmB8048M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=RO-FWX2taRQ:MacZmB8048M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=RO-FWX2taRQ:MacZmB8048M:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/RO-FWX2taRQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/09/17/tradu--o-os-problemas-do-pensamento-do-visual-studio-e-outras-ides</feedburner:origLink></item><item><title>[Rails Summit 2009] Teaser Trailer</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/ZI-CZr1S0x8/rails-summit-2009-teaser-trailer</link><pubDate>Wed, 16 Sep 2009 05:35:49 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5203</guid><description>&lt;p style="text-align: center"&gt;&lt;a href="http://www.railssummit.com.br?utm_campaign=Railssummit&amp;utm_source=banner_parceiros&amp;utm_medium=banner&amp;utm_content=por_728x90"&gt;&lt;img src="http://railssummit.com.br/imgs/43/original/728x90.gif" alt="Rails Summit 2009"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Quem esteve no &lt;a href="http://devinrio.com.br/"&gt;Dev in Rio 2009&lt;/a&gt; e quem participou do &lt;a href="http://akitaonrails.com/railssummit2008"&gt;Rails Summit 2008&lt;/a&gt; sabe do que estou falando :-)&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/zbdTAoJpvz8&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/zbdTAoJpvz8&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;Aqui vai a história sobre isso, diretamente pelo &lt;a href="http://tapajos.me"&gt;Tapajós&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Eu estava sentado junto com a galera do Rio vendo a morena passando de um lado para o outro e observando que ninguém se concentrava na palestra. Todo mundo estava fazendo a cobertura do evento no twitter e eu tive a idéia de pôr uma foto dela lá, provocando quem não veio ao evento.&lt;/p&gt;
&lt;p&gt;Como eu era um novo usuário do twitter e achava meio estúpido o propósito dele de dizer o que se está fazendo eu sempre tentei subverter o uso dele e tive a idéia de fazer a mesma coisa com um repositório de código. Fui lá no github, criei o projeto, coloquei uma foto e publiquei o link no Twitter.&lt;/p&gt;
&lt;p&gt;Nesse momento eu fui até o &lt;a href="http://twitter.com/defunkt"&gt;Chris Wanstrath&lt;/a&gt; (criador do github) e mostrei o projeto. Ele achou super engraçado e comentou que as pessoas achavam os usos mais estranhos possíveis para os repositórios e que isso era bem engraçado e fizemos uma pequena &amp;#8220;aposta&amp;#8221; que o projeto ia bombar.&lt;/p&gt;
&lt;p&gt;Em poucos minutos minha caixa de e-mails estava lotada de &lt;a href="http://github.com/guides/pull-requests"&gt;pull request&lt;/a&gt; com dezenas e fotos e como estava bem complicado gerenciar tudo e ainda observa-la eu resolvi dar direito de commit a algumas pessoas e o projeto ganhou vida própria.&lt;/p&gt;
&lt;p&gt;Meu medo era a morena ficar &amp;#8220;P&amp;#8221; e querer arrumar confusão. Era impossível voltar atrás! Mas felizmente ela ficou sabendo e não ligou, por isso o projeto continuou crescendo e até hoje continua sendo &lt;a href="http://github.com/guides/fork-a-project-and-submit-your-modifications"&gt;forkado&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Por falar em fork, o Dr. Nic foi um dos que adorou o projeto e &lt;a href="http://www.youtube.com/watch?v=6j24jV5SGZU"&gt;gravou um pequeno vídeo&lt;/a&gt; sobre ele.&lt;/p&gt;
&lt;p&gt;Bem, O &lt;a href="http://www.railssummit.com.br"&gt;Rails Summit 2009&lt;/a&gt; está chegando e eu estarei lá para dar continuidade ao projeto e se der tempo vou palestrar também.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Assistam a outros teasers do &lt;a href="http://www.railssummit.com.br"&gt;Rails Summit 2009&lt;/a&gt; em &lt;a href="http://www.youtube.com/user/AkitaOnRails"&gt;http://www.youtube.com/user/AkitaOnRails&lt;/a&gt; e ajudem a promover o evento!&lt;/p&gt;
&lt;p&gt;Não se esqueçam, o &lt;a href="http://www.railssummit.com.br"&gt;Rails Summit&lt;/a&gt; acontece dias 13 e 14 de Outubro, não deixem para se registrar na última hora!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ckl8aYuzR89tvoGhtrrfgzymi_M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ckl8aYuzR89tvoGhtrrfgzymi_M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ckl8aYuzR89tvoGhtrrfgzymi_M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ckl8aYuzR89tvoGhtrrfgzymi_M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=ZI-CZr1S0x8:qgd3_-3ZFjM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=ZI-CZr1S0x8:qgd3_-3ZFjM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=ZI-CZr1S0x8:qgd3_-3ZFjM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=ZI-CZr1S0x8:qgd3_-3ZFjM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=ZI-CZr1S0x8:qgd3_-3ZFjM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=ZI-CZr1S0x8:qgd3_-3ZFjM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=ZI-CZr1S0x8:qgd3_-3ZFjM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/ZI-CZr1S0x8" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/09/16/rails-summit-2009-teaser-trailer</feedburner:origLink></item><item><title>[Off-Topic] A Argumentação através da Intimidação </title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/ZkvAGYwHvo8/off-topic-a-argumenta--o-atrav-s-da-intimida--o</link><pubDate>Sat, 12 Sep 2009 08:40:26 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5202</guid><description>&lt;p&gt;Há um certo tipo de argumentação que, na verdade, não é uma argumentação, mas um meio de evitar o debate e extorquir o acordo de um adversário baseado em noções indiscutíveis. É um método de burlar a lógica usando pressão psicológica. Uma vez que é particularmente comum na cultura de hoje e continuará crescendo, é bom aprender a identificá-lo e estar em guarda.&lt;/p&gt;
&lt;p&gt;Este método tem uma certa semelhança com a falácia &lt;a href="http://pt.wikipedia.org/wiki/Argumentum_ad_hominem"&gt;ad hominem&lt;/a&gt;, vem da mesma raiz psicológica, mas é essencialmente diferente. A falácia ad hominem consiste em tentar contrariar um argumento acusando o caráter de seu proponente. Exemplo: &lt;em&gt;&amp;#8220;o candidato X é imoral, pois seu argumento é falso.&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;O método de pressão psicológica consiste em ameaçar a integridade do caráter de um oponente usando seu próprio argumento, então contestando a argumentação, sem debate. Exemplo: &lt;em&gt;&amp;#8220;Só o imoral não vê que o argumento do candidato X é falso.&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;No primeiro caso, a imoralidade do Candidato X (real ou inventado) é oferecido como prova da falsidade de seus argumentos. No segundo caso, a falsidade de seu argumento é afirmada de forma arbitrária e oferecida como prova de sua imoralidade.&lt;/p&gt;
&lt;p&gt;Na selva epistemológica de hoje, esse segundo método é usado com mais freqüência do que qualquer outro tipo de argumento irracional. Deve ser classificado como uma falácia lógica e pode ser designado como &amp;#8220;a argumentação através da intimidação&amp;#8221;.&lt;/p&gt;
&lt;p&gt;A característica essencial da argumentação através da intimidação é o seu apelo à auto-dúvida moral e sua dependência do medo, culpa ou ignorância da vítima. É usado na forma de um ultimato exigindo que a vítima renuncie à sua idéia sem discussão, sob pena de ser considerado moralmente indigno. O padrão é sempre: &lt;em&gt;&amp;#8220;Somente aqueles que são maus (desonestos, cruéis, insensíveis, ignorantes, etc) tem essas idéias.&amp;#8221;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;O exemplo clássico do argumento da intimidação é a história &lt;a href="http://tinyurl.com/qlmbw7"&gt;As Roupas Novas do Imperador&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nessa história, alguns charlatães vendem roupas inexistente ao Imperador, afirmando que a beleza incomum do vestuário os torna invisíveis para aqueles que são moralmente condenáveis de coração. Observe os fatores psicológicos necessários para fazer este trabalho: os charlatães confiam na auto-dúvida do Imperador; e ele não põe em dúvida essa afirmação, nem a sua autoridade moral. Ele se rende ao mesmo tempo, alegando que de fato enxerga as peças de vestuário, negando assim a evidência de seus próprios olhos e invalidando a sua própria consciência em vez de enfrentar uma ameaça à sua auto-estima precária. Sua distância da realidade pode ser avaliada pelo fato de que ele prefere andar nu na rua, exibindo as suas vestes inexistente para o povo, ao invés de arriscar incorrer na condenação moral de dois canalhas. As pessoas, motivadas pelo mesmo pânico psicológico, tentam ultrapassar um ao outro com exclamações em voz alta sobre o esplendor de suas vestes, até que uma criança grita que o rei está nu.&lt;/p&gt;
&lt;p&gt;Este é o modelo exato do trabalho da Argumentação através Intimidação, como está sendo trabalhado em torno de nós hoje.&lt;/p&gt;
&lt;p&gt;Todos já ouvimos e continuamos ouvindo esse tipo de coisa constantemente:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;em&gt;&amp;#8220;Somente aqueles que não possuem instintos mais refinados falham em aceitar a moralidade do altruísmo.&amp;#8221;&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;&amp;#8220;Somente os ignorantes não sabem que a razão foi invalidada.&amp;#8221;&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;&amp;#8220;Somente os reacionários de coração negro podem defender o capitalismo.&amp;#8221;&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;&amp;#8220;Só sedendos por guerra podem opor-se às Nações Unidas.&amp;#8221;&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;&amp;#8220;Só os lunáticos ainda acreditam na liberdade.&amp;#8221;&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;&amp;#8220;Só os covardes não veem que a vida é um esgoto.&amp;#8221;&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;&amp;#8220;Só os superficiais procuram a beleza, felicidade, realização, valores ou heróis.&amp;#8221;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Como exemplo de um campo inteiro de atividade baseada em nada além da argumentação através da intimidação, dou-lhe a arte moderna, onde, a fim de comprovar que de fato possuem o discernimento especial que somente a elite &amp;#8220;mística&amp;#8221; tem, a população tenta superar um ao outro em exclamações em voz alta do esplendor de alguns pedaço de lona borrados.&lt;/p&gt;
&lt;p&gt;A argumentação através da intimidação domina discussões de hoje em duas formas. Em discursos públicos e impressos, ele floresce sob a forma de estruturas longas, envolventes, elaboradas de palavreado ininteligível, que transmitem nada exceto uma clara ameaça moral. (&lt;em&gt;&amp;#8220;Só os de mentalidade primitiva deixam de perceber que a clareza é simplificação excessiva.&amp;#8221;&lt;/em&gt;) Mas, em particular, no dia-a-dia, ele vem sem palavras, nas entrelinhas, sob a forma de sons inarticulados contendo implicações não declaradas. Baseia-se, não no que é dito, mas em como se diz &amp;#8211; não no conteúdo, mas no tom de voz.&lt;/p&gt;
&lt;p&gt;O tom é geralmente de uma incredulidade beligerante ou desdenhosa. &lt;em&gt;&amp;#8220;Certamente você não é um defensor do capitalismo, não é?&amp;#8221;&lt;/em&gt; E se isso não intimida a vítima em perspectiva, que responde, corretamente: &lt;em&gt;&amp;#8220;Eu sou&amp;#8221;&lt;/em&gt; &amp;#8211; o diálogo se segue mais ou menos assim:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&amp;#8220;Ah, você não poderia ser! Não é verdade!&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Verdade&amp;#8221;.&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Mas todo mundo sabe que o capitalismo está ultrapassado!&amp;#8221;&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Eu não&amp;#8221;.&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Ah, não pode ser verdade!&amp;#8221;&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Já que eu não sei, você vai me dizer as razões para pensar que o capitalismo está ultrapassado?&amp;#8221;&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Oh, não seja ridículo!&amp;#8221;&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Vai me dizer as razões?&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Bem, se você realmente não sabe, não sou eu que poderia possivelmente lhe dizer!&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tudo isso é acompanhado de sobrancelhas levantadas, de olhos arregalados, encolher de ombros, grunhidos, e todo arsenal de sinais não-verbais comunicando insinuações sinistras e vibrações emocionais de uma única espécie: desaprovação.&lt;/p&gt;
&lt;p&gt;Se essas vibrações falham, se tais debatedores são desafiados, verifica-se que eles não têm argumentos, nenhuma evidência, nenhuma prova, nenhuma razão, nenhum motivo no qual fundamentar &amp;#8211; que sua agressividade ruidosa serve para esconder o vácuo &amp;#8211; que a argumentação através da intimidação é uma confissão de impotência intelectual.&lt;/p&gt;
&lt;p&gt;O arquétipo primordial desta argumentação é evidente (e assim são as razões do seu recurso para o neo-misticismo da nossa era): &lt;em&gt;&amp;#8220;Para aqueles que entendem, nenhuma explicação é necessária; para aqueles que não entendem, nenhuma é possível&amp;#8221;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;A fonte psicológica do que o argumento é metafísica social.&lt;/p&gt;
&lt;p&gt;Um metafísico social é aquele que trata a consciência dos outros homens como superiores aos seus próprios e para os fatos da realidade. Para um metafísico social a avaliação moral de si próprio pelos outros é uma preocupação primária que substitui a verdade, fatos, razão lógica. A reprovação dos outros é tão terrível para ele que nada pode resistir ao seu impacto dentro da sua consciência, assim ele negaria a evidência de seus próprios olhos e invalidaria a sua própria consciência em prol da aprovação moral de qualquer charlatão vadio. Apenas um metafísico social poderia conceber tal coisa absurda como a esperança de ganhar um argumento intelectual insinuando: &lt;em&gt;&amp;#8220;Mas as pessoas não vão gostar de você!&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Estritamente falando, um metafísico social não percebe a sua argumentação em termos conscientes: ele acha isso &amp;#8220;instintivamente&amp;#8221;, pela introspecção, uma vez que representa a sua forma psico-epistemológica de vida. Todos nós já encontramos o tipo irritante de pessoa que não escuta o que alguém diz, mas às vibrações emocionais da voz do outro, ansiosamente traduzindo-os em aprovação ou reprovação para, em seguida, responder de acordo. Esta é uma espécie de argumentação auto-imposta através da intimidação, à qual um metafísico social se rende na maioria dos seus encontros humanos. E assim, quando ele encontra um adversário, quando suas premissas são contestadas, ele recorre automaticamente à arma que o assusta mais: a retirada da sua aprovação moral.&lt;/p&gt;
&lt;p&gt;Uma vez que esse tipo de terror psicológico é desconhecido para homens saudáveis, isso pode ser considerado como argumentação através da intimidação, precisamente por causa da sua inocência. Sem entender o motivo da argumentação ou para acreditar que ele é apenas um blefe sem sentido, eles assumem que seu usuário tem algum tipo de conhecimento ou razões para apoiar suas afirmações aparentemente auto-confiantes, beligerantes, dando-lhe o benefício da dúvida &amp;#8211; e são deixados em confusão perplexa. É assim que os metafísicos social vitimizam os jovens, os inocentes, a consciência.&lt;/p&gt;
&lt;p&gt;Isto é particularmente prevalente nas salas de aula da faculdade. Muitos professores usam a argumentação através da intimidação para abafar o pensamento independente entre os estudantes, para fugir a perguntas que não conseguem responder, para desencorajar qualquer análise crítica de seus premissas arbitrárias ou qualquer desvio do status quo intelectual.&lt;/p&gt;
&lt;p&gt;&amp;#8220;Aristóteles? Meu querido companheiro&amp;#8221; (um suspiro cansado) &amp;#8220;Se você tivesse lido o trabalho do Professor Spiffkin&amp;#8221; (respeitosamente) &amp;#8220;da edição de janeiro de 1912 da revista Intellect, que&amp;#8221; (com desdém) &amp;#8220;obviamente você não leu, saberia&amp;#8221; (levianamente) &amp;#8220;que Aristóteles foi refutado.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;Professor X?&amp;#8221; (sendo X o nome de um distinto teórico de economia de livre empresa) &amp;#8220;Você está citando o Professor X? Oh não, fala sério!&amp;#8221; &amp;#8211; seguido de uma risada sarcástica com a intenção de transmitir que o Professor X foi completamente desacreditado. (Por quem? Fim da discussão.)&lt;/p&gt;
&lt;p&gt;Esses professores são freqüentemente assistidos pela brigada dos capangas dos &amp;#8220;liberais&amp;#8221; da sala de aula, que explodem em gargalhadas em momentos apropriados.&lt;/p&gt;
&lt;p&gt;Em nossa vida política, a argumentação através da intimidação é o método quase exclusivo de discussão. Predominantemente, os debates políticos de hoje consistem de manchas e desculpas, ou intimidação e apaziguamento. O primeiro é geralmente (mas não exclusivamente) praticada pelos &amp;#8220;liberais&amp;#8221;, o segundo pelos &amp;#8220;conservadores&amp;#8221;. Os campeões, neste contexto, são os &amp;#8220;liberais&amp;#8221; republicanos que praticam ambas: a primeira, em relação a seus companheiros &amp;#8220;conservadores&amp;#8221; republicanos, a segunda, aos democratas.&lt;/p&gt;
&lt;p&gt;Todas as manchas são argumentos de intimidação: eles consistem de afirmações depreciativas, sem qualquer indício ou prova, oferecidos como substitutos das evidências ou provas, visando à covardia moral ou credulidade impensada dos ouvintes.&lt;/p&gt;
&lt;p&gt;A argumentação através da intimidação não é nova, tem sido utilizada em todas as idades e culturas, mas raramente em escala tão ampla quanto hoje. Ela é usada mais cruamente na política do que em outros campos de atividade, mas não se limita à política. Ela permeia toda a nossa cultura. É um sintoma de falência cultural.&lt;/p&gt;
&lt;p&gt;Como é que alguém pode resistir a esse argumento? Existe apenas uma arma contra ela: a certeza moral.&lt;/p&gt;
&lt;p&gt;Quando se entra em qualquer batalha intelectual, grande ou pequena, pública ou privada, não se pode buscar, desejar ou esperar aprovação do inimigo. Verdade ou mentira deve ser a preocupação exclusiva e o critério de julgamento &amp;#8211; não a aprovação ou desaprovação de qualquer pessoa e, acima de tudo, não a aprovação dessas cujos padrões são o oposto do seu próprio. (obs: já viram aquelas argumentações que começam &amp;#8220;Eu respeito muito você, mas &amp;#8230;&amp;#8221; &amp;#8211; claramente buscando uma aprovação).&lt;/p&gt;
&lt;p&gt;Deixe-me enfatizar que o argumento da intimidação não consiste em colocar julgamento moral em questões intelectuais, mas de substituir o julgamento moral pelo argumento intelectual. Avaliações morais estão implícitas na maioria das questões intelectuais; não é meramente permitido, mas obrigatório colocar um juízo moral quando e onde necessário; suprimir tal julgamento é um ato de covardia moral. Mas um julgamento moral deve sempre seguir e jamais anteceder (ou substituir), as razões em que se baseia.&lt;/p&gt;
&lt;p&gt;Quando se dá razões para um veredito, se assume a responsabilidade por ele e coloca-se à disposição ao julgamento objetivo: se suas razões são erradas ou falsas, sofre-se as conseqüências. Mas, condenar sem fundamentação é um ato de irresponsabilidade, uma espécie de atropelamento e fuga moral, que é a essência da argumentação através da intimidação.&lt;/p&gt;
&lt;p&gt;Observa-se que os homens que usam esse argumento são os que temem um ataque moral fundamentado mais do que qualquer outro tipo de batalha, e quando encontram um adversário confiante moralmente, eles são os mais altos em protestar que &amp;#8220;moralização&amp;#8221; deve ser mantida fora das discussões intelectuais. Mas, discutir o mal de uma forma que implica a neutralidade, é uma forma de aprová-la.&lt;/p&gt;
&lt;p&gt;A argumentação através da intimidação ilustra porque é importante ter certeza das próprias premissas e da própria fundação moral. Ele ilustra o tipo de armadilha intelectual que aguarda aqueles que se aventuram sem uma análise completa, clara e consistente das próprias convicções, totalmente integrada até os fundamentos &amp;#8211; aqueles que de forma imprudente pulam para a batalha, armados apenas com algumas noções flutuantes aleatórias em uma névoa do desconhecido, do não identificado, do indefinido, do não provado, e apoiado por nada além de seus sentimentos, esperanças e medos. A argumentação através da intimidação é seu maior inimigo. Em questões morais e intelectuais, não é suficiente estar certo: é necessário saber que está certo.&lt;/p&gt;
&lt;p&gt;por &lt;strong&gt;Ayn Rand&lt;/strong&gt; &amp;#8211; último capítulo de &amp;#8220;The Virtue of Selfishness&amp;#8221;, 1964&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/i3v5gSJe0ujde3dfQlmL-sU3bdU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/i3v5gSJe0ujde3dfQlmL-sU3bdU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/i3v5gSJe0ujde3dfQlmL-sU3bdU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/i3v5gSJe0ujde3dfQlmL-sU3bdU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=ZkvAGYwHvo8:tdUAlf05LUo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=ZkvAGYwHvo8:tdUAlf05LUo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=ZkvAGYwHvo8:tdUAlf05LUo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=ZkvAGYwHvo8:tdUAlf05LUo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=ZkvAGYwHvo8:tdUAlf05LUo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=ZkvAGYwHvo8:tdUAlf05LUo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=ZkvAGYwHvo8:tdUAlf05LUo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/ZkvAGYwHvo8" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/09/12/off-topic-a-argumenta--o-atrav-s-da-intimida--o</feedburner:origLink></item><item><title>[Off-Topic] Direitos do Homem</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/kf6_wtuXr7g/off-topic-direitos-do-homem</link><pubDate>Wed, 09 Sep 2009 22:14:11 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5201</guid><description>&lt;div style="float: right; margin: 3px"&gt;&lt;img src="/assets/2009/9/8/The_Virtue_of_Selfishness_Ayn_Rand_unabridged_M_original.jpg" alt="" /&gt;&lt;/div&gt;&lt;p&gt;Normalmente eu não gosto de falar de política. Detesto. Sempre achei uma grande perda de tempo. Porém, diante das visões mais exacerbadas de populismo-esquerdismo, da ignorância quando se engrandece o socialismo-tirano cubano ou a ditadura totalitária venezuelana; diante do clamor por reestatização e os movimentos contra a privatização &amp;#8211; todas calcadas na idéia de &amp;#8220;o bem para o povo&amp;#8221;, &amp;#8220;pelo benefício da maioria&amp;#8221;, &amp;#8220;pela ajuda aos fracos&amp;#8221; e outra baboseiras como essa, achei que poderia pelo menos oferecer uma pequena contribuição filosófica, traduzindo pelo menos mais um capítulo do livro de Ayn Rand, &lt;a href="http://www.aynrandbookstore2.com/prodinfo.asp?number=AR09B"&gt;The Virtue of Selfishness&lt;/a&gt; que fala exatamente sobre esse tema, lembrando, claro, que ele foi escrito sobre o contexto dos anos 60. Mas é impressionante como as coisas não mudaram muito nesse sentido. Mas, antes, mais um trecho da introdução, a respeito da fundação do &amp;#8220;egoísmo racional&amp;#8221; do Objetivismo:&lt;/p&gt;
&lt;blockquote&gt;Observem a indecência do que se passa por julgamentos morais hoje. Um industrial que produz uma fortuna, e um bandido que rouba um banco são considerados igualmente imorais, uma vez que ambos procuraram riqueza para seu próprio benefício &amp;#8220;egoísta&amp;#8221;. Um jovem que abandona sua carreira, a fim de sustentar os pais e nunca ultrapassa o posto de escriturário de mantimentos é considerado moralmente superior ao jovem que sofre um esforço excruciante e alcança a sua ambição pessoal. Um ditador é considerado como moral, uma vez que as atrocidades indescritíveis que foram cometidos foram para beneficiar &amp;#8220;o povo&amp;#8221;, e não a si mesmo. &lt;br /&gt;
&lt;br /&gt;
Observe o que este critério de benefício da moralidade faz na vida de um homem. A primeira coisa que ele aprende é que a moralidade é o seu inimigo, ele não tem nada a ganhar com isso, ele só pode perder; perda auto-infligida, dor auto-infligido e a mortalha cinza, debilitante de uma obrigação incompreensível é tudo o que ele pode esperar. Ele pode esperar que outros podem, ocasionalmente, sacrificar-se para seu benefício, como ele se sacrifica de má vontade a eles, mas ele sabe que o relacionamento vai trazer ressentimento mútuo, não prazer &amp;#8211; e que, moralmente, sua perseguição de valores será como um intercâmbio de presentes de Natal indesejados, não escolhidos, onde nenhum é moralmente permitido comprar para si mesmo. Além dos momentos onde ele consegue realizar um ato de auto-sacrifício, ele não possui nenhum significado moral: a moral não toma conhecimento dele e não tem nada a dizer-lhe para orientá-lo nas questões cruciais de sua vida, é apenas a sua próprio vida pessoal, privada, &amp;#8220;egoísta&amp;#8221; e, como tal, é considerado ou mal, ou, na melhor das hipóteses, amoral. &lt;br /&gt;
&lt;br /&gt;
&amp;#8230; &lt;br /&gt;
&lt;br /&gt;
Já que o egoísmo é a &amp;#8220;preocupação com os próprios interesses,&amp;#8221; a ética Objectivista utiliza esse conceito em seu sentido exato e mais puro. Não é um conceito que pode ser entregue aos inimigos do homem, nem para os equívocos irrefletidos, distorções, preconceitos e medos do ignorante e do irracional. O ataque ao &amp;#8220;egoísmo&amp;#8221; é um ataque à auto-estima do homem, desistir de um é desistir do outro.&lt;/blockquote&gt;&lt;h2&gt;Capítulo 12 &amp;#8211; Direitos do Homem&lt;/h2&gt;
&lt;p&gt;Se alguém quiser defender uma sociedade livre &amp;#8211; ou seja, capitalismo &amp;#8211; ele deve entender que a fundação indispensável é o princípio do direito individual. Se alguém quiser suportar os direitos individuais, ele deve entender que o capitalismo é o único sistema que pode suportar e os proteger. E se alguém quiser medir o relacionamento da liberdade com os objetivos dos intelectuais de hoje, ele deve medí-lo pelo fato que o conceito de direitos individuais é evitado, distorcido, pervertido e raramente discutivo pelos chamados &amp;#8220;conservadores&amp;#8221;.&lt;/p&gt;
&lt;p&gt;&amp;#8220;Direitos&amp;#8221; são um conceito moral, o conceito que fornece uma transição lógica dos princípios que norteiam as ações de um indivíduo para os princípios que orientam a sua relação com os outros, o conceito  que preserva e protege a moralidade individual em um contexto social, a ligação entre o código moral de um homem e o código jurídico de uma sociedade, entre ética e política. Os direitos individuais são o meio para subordinar a sociedade à lei moral.&lt;/p&gt;
&lt;p&gt;Todo sistema político é baseado em algum código de ética. A ética dominante da história da humanidade são variantes da doutrina altruísta-coletivista, que subordinava o indivíduo a alguma autoridade superior, seja mística ou social. Consequentemente, a maioria dos sistemas políticos eram variantes da mesma tirania estatista, diferindo apenas em grau, não em princípio básico, limitada apenas pelos acidentes da tradição, do caos, da luta sangrenta e colapso periódico. Sob todos esses sistemas, a moralidade era um código aplicável ao indivíduo, mas não à sociedade. A Sociedade foi colocada fora da lei moral, como a sua incorporação ou fonte ou intérprete exclusivo &amp;#8211; e a inculcação de devoção auto-sacrificial ao dever social foi considerado como o principal objetivo da ética na existência terrena do homem.&lt;/p&gt;
&lt;p&gt;Uma vez que não existe tal entidade como &amp;#8220;sociedade&amp;#8221;, já que a sociedade é apenas um número de homens individuais, isto significou, na prática, que os governantes da sociedade estavam isentos da lei moral, sujeita apenas aos rituais tradicionais, detendo o poder total e exigindo obediência cega &amp;#8211; no princípio implícito de: &amp;#8220;O bom é o que é bom para a sociedade (ou a tribo, a raça, a nação), e decretos do governante são sua voz na terra.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Isto era verdade de todos os sistemas estatais, em todas as variantes da ética altruísta-coletivista, mística ou social. &amp;#8220;O direito divino dos reis&amp;#8221;, resume a teoria política do primeiro &amp;#8220;Vox populi, vox Dei&amp;#8221; do segundo. Como testemunha: a teocracia do Egito, com o faraó como um deus encarnado, a regra da maioria ilimitada ou democracia de Atenas, o estado de bem-estar executado pelos imperadores de Roma, a Inquisição da Idade Média, a monarquia absolutista da França, o estado de bem-estar da Prússia de Bismarck, as câmaras de gás da Alemanha nazista, o matadouro da União Soviética.&lt;/p&gt;
&lt;p&gt;Todos estes sistemas políticos era expressões da ética altruísta-coletivista e sua característica comum é o fato de que a sociedade estava acima da lei moral, como um adorador caprichoso, onipotente, soberano. Assim, politicamente, todos estes sistemas eram variantes de uma sociedade amoral.&lt;/p&gt;
&lt;p&gt;O resultado mais profundamente revolucionário dos Estados Unidos da América foi a subordinação da sociedade à lei moral.&lt;/p&gt;
&lt;p&gt;O princípio dos direitos individuais do homem representou a extensão da moralidade no sistema social, como a limitação do poder do Estado, como a proteção do homem contra a força bruta do coletivo, como a subordinação do poder ao direito. Os Estados Unidos foram a primeira sociedade moral da história.&lt;/p&gt;
&lt;p&gt;Todos os sistemas anteriores consideravam o homem como um meio de sacrifício para os objetivos dos outros, e da sociedade como um fim em si mesmo. Os Estados Unidos consideraram o homem como um fim em si mesmo, e a sociedade como um meio para a  convivência pacífica, ordenada e voluntária de indivíduos. Todos os sistemas anteriores tinham considerado que a vida do homem pertence à sociedade, que a sociedade pode dispor dele da forma que quiser, e que qualquer liberdade que ele desfruta é seu apenas por favor, com a permissão da sociedade, que pode ser revogada a qualquer momento. Os Estados Unidos decidiu que a vida do homem é seu por direito (o que significa: por princípio moral e por sua natureza), que um direito é a propriedade de um indivíduo, que a sociedade como tal, não tem direitos, e que o único propósito moral de uma governo é a proteção dos direitos individuais.&lt;/p&gt;
&lt;p&gt;Um &amp;#8220;direito&amp;#8221; é um princípio moral que define e sanciona a liberdade de ação de um homem em um contexto social. Existe apenas um direito fundamental (todos os outros são as suas consequências ou corolários): um direito do homem à sua própria vida. A vida é um processo de ações auto-geradas de auto-sustentação, o direito à vida significa o direito de exercer ações auto-geradas de auto-sustentação, o que significa: a liberdade de tomar todas as medidas exigidas pela natureza de forma racional sendo para o apoio, a promoção, a satisfação e o prazer de sua própria vida. (Esse é o significado do direito à vida, liberdade e a busca da felicidade.)&lt;/p&gt;
&lt;p&gt;O conceito de &amp;#8220;direito&amp;#8221; se refere apenas à ação, especificamente, a liberdade de ação. Isso significa ausência de coerção física, coação ou interferência de outros homens. Assim, para cada indivíduo, um direito é a sanção moral de um positivo &amp;#8211; de sua liberdade para agir em seu próprio julgamento, para seus próprios objetivos, por sua própria escolha voluntária. Quanto aos seus vizinhos, seus direitos não impõem obrigações a eles, exceto de um tipo negativo: de se abster de violar os seus direitos.&lt;/p&gt;
&lt;p&gt;O direito à vida é a fonte de todos os direitos &amp;#8211; e do direito de propriedade é a sua implementação. Sem direitos de propriedade, nenhum outro direito é possível. Já que o homem tem de sustentar a sua vida por seu próprio esforço, o homem que não tem direito ao produto do seu esforço não tem meios para sustentar a sua vida. O homem que produz, enquanto outros dispõe do seu produto, é um escravo.&lt;/p&gt;
&lt;p&gt;Tenha em mente que o direito à propriedade é um direito de ação, como todos os outros: não é o direito a um objeto, mas a ação e as conseqüências de produzir ou ganhar esse objeto. Não é uma garantia de que um homem vai ganhar qualquer propriedade, mas apenas uma garantia de que ele terá sua propriedade se ganhá-lo. É o direito de adquirir, guardar, usar e dispor dos bens materiais.&lt;/p&gt;
&lt;p&gt;O conceito de direitos individuais é tão nova na história da humanidade que a maioria dos homens não a compreenderam plenamente até hoje. De acordo com as duas teorias da ética, o místico ou o social, alguns homens afirmam que os direitos são um dom de Deus, outros, que os direitos são um dom da sociedade. Mas, na verdade, a fonte dos direitos é a natureza do homem.&lt;/p&gt;
&lt;p&gt;A Declaração de Independência afirmou que &amp;#8220;homens são dotados por seu Criador de certos direitos inalienáveis.&amp;#8221; Se alguém acredita que o homem é produto de um Criador ou da natureza, a questão da origem do homem não altera o fato de que ele é uma entidade de um tipo específico de um ser racional que não pode funcionar com êxito sob coerção, e que os direitos são uma condição necessária para o seu modo particular de sobrevivência.&lt;/p&gt;
&lt;p&gt;&amp;#8220;A fonte dos direitos do homem não é a lei divina ou lei do Congresso, mas a lei da identidade. A é A e homem é homem. Os direitos são condições de existência exigido pela natureza do homem para sua própria sobrevivência. Se o homem deve viver na Terra, é direito dele usar sua mente, é direito agir em seu próprio livre julgamento, é direito trabalhar para os seus valores e manter o produto de seu trabalho. Se a vida na Terra é o seu propósito, ele tem o direito de viver como um ser racional: a natureza o proíbe do irracional. &amp;quot;(Atlas Shrugged.)&lt;/p&gt;
&lt;p&gt;Violar os direitos do homem significa obrigá-lo a agir contra seu próprio julgamento, ou expropriar seus valores. Basicamente, só há uma maneira de fazê-lo: pelo uso de força física. Há dois potenciais violadores dos direitos do homem: os criminosos e o governo. A grande conquista dos Estados Unidos foi de estabelecer uma distinção entre esses dois, proibindo ao segundo a versão legalizada das atividades do primeiro.&lt;/p&gt;
&lt;p&gt;A Declaração de Independência estabele o princípio de que &amp;#8220;para assegurar esses direitos, governos são instituídos entre os homens.&amp;#8221; Isso forneceu a única justificativa válida de um governo e definiu o seu único objetivo correto: para proteger os direitos do homem, protegendo-o da violência física.&lt;/p&gt;
&lt;p&gt;Assim, a função do governo mudou do papel de governante para o papel servil. O governo foi instituído para proteger o homem dos criminosos &amp;#8211; e a Constituição foi escrita para proteger o homem do governo. O &lt;em&gt;Bill of Rights&lt;/em&gt; não era dirigida contra cidadãos particulares, mas contra o governo como uma declaração explícita de que os direitos individuais se sobressaem a qualquer poder público ou social.&lt;/p&gt;
&lt;p&gt;O resultado foi o padrão de uma sociedade civilizada que, por breve espaço de cerca de cento e cinquenta anos, a América chegou perto de conquistar. Uma sociedade civilizada é aquela em que a força física é banida das relações humanas, em que o governo, agindo como um policial, pode usar a força apenas em retaliação e somente contra aqueles que iniciam seu uso.&lt;/p&gt;
&lt;p&gt;Este foi o sentido essencial e intenção da filosofia política da América, implícita no princípio dos direitos individuais. Mas não foi formulado de forma explícita, nem totalmente aceita, nem consistentemente praticada.&lt;/p&gt;
&lt;p&gt;A contradição interna da América foi a ética altruísta-coletivista. Altruísmo é incompatível com Liberdade, com o capitalismo e os direitos individuais. Não se pode combinar a busca da felicidade com o status moral de um animal de sacrifício.&lt;/p&gt;
&lt;p&gt;Foi o conceito de direitos individuais que deu à luz a uma sociedade livre. Foi com a destruição de direitos individuais que a destruição da liberdade tinha de começar.&lt;/p&gt;
&lt;p&gt;A tirania coletivista não se atreve a escravizar um país por um confisco dos seus valores, material ou moral. Tem que ser feito por um processo de corrupção interna. Assim como no reino material a pilhagem das riquezas de um país é feito inflacionando a moeda &amp;#8211; então hoje se pode testemunhar o processo de inflação sendo aplicado à esfera de direitos. O processo envolve tamanho crescimento de recém promulgados &amp;#8220;direitos&amp;#8221; que as pessoas não percebem o fato de que o sentido do conceito está sendo revertido. Assim como dinheiro ruim acaba com o dinheiro bom, assim essa &amp;#8220;máquina de imprimir direitos&amp;#8221; nega os direitos autênticos.&lt;/p&gt;
&lt;p&gt;Considere o fato curioso que nunca houve tal proliferação, em todo o mundo, de dois fenômenos contraditórios: de &amp;#8220;direitos&amp;#8221; novos e de campos de trabalho escravo.&lt;/p&gt;
&lt;p&gt;O truque foi a troca do conceito de direitos da esfera política para a econômica.&lt;/p&gt;
&lt;p&gt;A plataforma do Partido Democrata de 1960, resume a troca de forma ousada e explícita. Ela declara que uma Gestão Democrata &amp;#8220;reafirmará o projeto econômico dos direitos que Franklin Roosevelt escreveu em nossa consciência nacional dezesseis anos atrás.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Tenha claramente em mente o significado do conceito de &amp;#8220;direitos&amp;#8221; quando ler a lista que esta plataforma oferece:&lt;/p&gt;
&lt;p&gt;&amp;#8220;1. O direito a um trabalho útil e remunerado, em indústrias ou estabelecimentos comerciais ou fazendas ou minas do país.&lt;/p&gt;
&lt;p&gt;&amp;#8220;2. O direito de ganhar o suficiente para fornecer alimentação adequada, de vestuário e de recreação.&lt;/p&gt;
&lt;p&gt;&amp;#8220;3. O direito de cada agricultor para criar e vender seus produtos a um retorno que dará a ele e sua família uma vida decente.&lt;/p&gt;
&lt;p&gt;&amp;#8220;4. O direito de cada homem de negócios, grande e pequeno, de comercializar em uma atmosfera de liberdade em relação à concorrência desleal e da dominação de monopólios no país e no exterior.&lt;/p&gt;
&lt;p&gt;&amp;#8220;5. O direito de cada família a uma casa decente.&lt;/p&gt;
&lt;p&gt;&amp;#8220;6. O direito à assistência médica adequada e oportunidade de alcançar e gozar de boa saúde.&lt;/p&gt;
&lt;p&gt;&amp;#8220;7. O direito à proteção adequada para os temores econômicos da velhice, doença, acidentes e desemprego.&lt;/p&gt;
&lt;p&gt;&amp;#8220;8. O direito a uma boa educação.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Uma pergunta simples adicionada a cada uma das oito cláusulas acima tornaria a questão clara: à custa de quem?&lt;/p&gt;
&lt;p&gt;Postos de trabalho, alimentação, vestuário, recreação (!), casas, assistência médica, educação, etc, não crescem na natureza. Esses são valores feitos pelo homem &amp;#8211; bens e serviços produzidos pelos homens. Quem vai fornecer isso a eles?&lt;/p&gt;
&lt;p&gt;Se alguns homens têm garantia por direito aos produtos do trabalho dos outros, isso significa que os outros são privados de direitos e condenados ao trabalho escravo.&lt;/p&gt;
&lt;p&gt;Qualquer alegação de &amp;#8220;direito&amp;#8221; de um homem, que implica na violação dos direitos do outro, não é e não pode ser um direito.&lt;/p&gt;
&lt;p&gt;Nenhum homem pode ter o direito de impor uma obrigação não escolhida, um dever sem recompensa ou um direito de servidão involuntária a outro homem. Não pode existir qualquer coisa tal como &amp;#8220;o direito de escravizar.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Um direito não inclui a implementação material desse direito por outros homens; ele inclui apenas a liberdade de ganhar tal implementação por próprio esforço.&lt;/p&gt;
&lt;p&gt;Observe-se, neste contexto, a precisão intelectual dos Pais Fundadores da América: eles falaram do direito à &amp;#8220;busca pela felicidade&amp;#8221;, não do direito à felicidade. Isso significa que um homem tem o direito de tomar as ações que considera necessário para atingir a sua felicidade, mas isso não significa que outros devem fazê-lo feliz.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;a href="http://tinyurl.com/5bkx5d"&gt;&lt;img src="/assets/2009/9/10/declaration_original.jpg" alt="" /&gt;&lt;/a&gt; &lt;br/&gt;&lt;em&gt;&amp;#8220;Consideramos estas verdades como evidentes por si mesmas, que todos os homens são criados iguais, que são dotados pelo Criador de certos direitos inalienáveis, que entre estes estão a Vida, Liberdade e a &lt;strong&gt;Busca pela Felicidade&lt;/strong&gt;.&amp;#8221;&lt;/em&gt; &amp;#8211; Thomas Jefferson&lt;/p&gt;
&lt;p&gt;O direito à vida significa que um homem tem o direito de apoiar a sua vida pelo seu próprio trabalho (em qualquer nível econômico, tão alto quanto a sua capacidade o levar), mas isso não significa que outros devem prestar-lhe as necessidades da vida.&lt;/p&gt;
&lt;p&gt;O direito à propriedade significa que um homem tem o direito de tomar as medidas econômicas necessárias para ganhar sua propriedade, usá-lo e descartá-lo, mas isso não significa que outros devem fornecer-lhe essa propriedade.&lt;/p&gt;
&lt;p&gt;O direito à liberdade de expressão significa que um homem tem o direito de expressar suas idéias, sem risco de supressão, interferência ou ação punitiva por parte do governo. Isso não significa que outros devem fornecer-lhe uma sala de aula, uma estação de rádio ou uma prensa de impressão para expressar suas idéias.&lt;/p&gt;
&lt;p&gt;Qualquer empresa que envolve mais do que um homem, exige o consentimento voluntário de cada participante. Cada um deles tem o direito de tomar sua própria decisão, mas ninguém tem o direito de forçar a sua decisão sobre os outros.&lt;/p&gt;
&lt;p&gt;Não há tal coisa como um &amp;#8220;direito a um emprego&amp;#8221;, existe apenas o direito de livre comércio, que é um direito do homem de ter um emprego se outro homem escolher contratá-lo. Não há direito a &amp;#8220;uma casa&amp;#8221;, apenas o direito de livre comércio: o direito de construir uma casa ou comprá-lo. Não existem direitos a um salário &amp;#8220;justo&amp;#8221; ou um preço &amp;#8220;justo&amp;#8221; se ninguém escolhe pagar por isso, contratar um homem ou comprar seu produto. Não há &amp;#8220;direitos dos consumidores&amp;#8221; ao leite, sapatos, filmes ou champanhe, se ninguém escolhe fabricar tais itens (existe apenas o direito de fabricá-los você mesmo). Não há &amp;#8220;direitos&amp;#8221; de grupos especiais, não há &amp;#8220;direitos dos agricultores, dos trabalhadores, dos empresários, dos trabalhadores, dos empregadores, dos idosos, dos jovens, dos jovens.&amp;#8221; Existem apenas os Direitos do Homem &amp;#8211; direitos possuídos por cada homem individualmente e por todos os homens como indivíduos.&lt;/p&gt;
&lt;p&gt;Os direitos de propriedade e o direito de livre comércio são os únicos &amp;#8220;direitos econômicos&amp;#8221; do homem (eles são, de fato, direitos políticos) &amp;#8211; e não pode haver tal coisa como &amp;#8220;um projeto de lei de direitos econômicos.&amp;#8221; Mas observe que os defensores deste último tem feito tudo e destruíram o primeiro.&lt;/p&gt;
&lt;p&gt;Lembre-se que os direitos são princípios morais que definem e protegem a liberdade de ação de um homem, mas não impõe obrigações aos demais. Os cidadãos não são uma ameaça para os direitos ou liberdades dos outros. Um cidadão que recorre à força física e viola os direitos dos outros é um criminoso e os homens têm proteção legal contra ele.&lt;/p&gt;
&lt;p&gt;Criminosos são uma pequena minoria em qualquer época ou país. E o mal que fizeram à humanidade é infinitesimal quando comparado com os horrores &amp;#8211; o derramamento de sangue, as guerras, as perseguições, a confiscação, as fomes, as escravidões, a destruição por atacado, perpetrados pelos governos da humanidade. Potencialmente, um governo é a ameaça mais perigosa para os direitos dos homems: ele detém um monopólio legal sobre o uso de força física contra vítimas legalmente desarmadas. Quando irrestrito e ilimitado pelos direitos individuais, um governo é o inimigo mortal dos homens. Não é como proteção contra ações privadas, mas contra as ações governamentais que o &amp;#8220;Bill of Rights&amp;#8221; foi escrito.&lt;/p&gt;
&lt;p&gt;Agora observe o processo pelo qual essa proteção está sendo destruído.&lt;/p&gt;
&lt;p&gt;O processo consiste em atribuir a cidadãos particulares as violações específicas constitucionalmente vedadas ao Governo (que cidadãos particulares não têm poder para cometer) e assim libertando o governo de todas as restrições. A troca está se tornando cada vez mais evidente no domínio da liberdade de expressão. Por anos, os coletivistas  propagam a idéia de que a recusa de um indivíduo particular, de financiar um adversário é uma violação do direito do oponente da liberdade de expressão e um ato de &amp;#8220;censura&amp;#8221;.&lt;/p&gt;
&lt;p&gt;É &amp;#8220;censura&amp;#8221;, dizem eles, se um jornal se recusa a empregar ou publicar escritores cujas idéias são diametralmente opostas à sua política.&lt;/p&gt;
&lt;p&gt;É &amp;#8220;censura&amp;#8221;, dizem eles, se os empresários se recusam a anunciar numa revista que denuncia, os insulta e as mancha.&lt;/p&gt;
&lt;p&gt;É &amp;#8220;censura&amp;#8221;, dizem eles, se um patrocinador de TV se opõe a algum atentado perpetrado em um programa que está financiamento, tais como o incidente de Alger Hiss sendo convidado a denunciar o ex-vice-presidente Nixon.&lt;/p&gt;
&lt;p&gt;E depois há Newton N. Minow que declara: &amp;#8220;Existe censura de popularidade, pelos anunciantes, pelas redes, pelas filiais que rejeitam a programação oferecida às suas áreas.&amp;#8221; É o mesmo Sr. Minow que ameaça revogar a licença de qualquer estação que não seguir com sua opinião sobre a programação &amp;#8211; e que afirma que isso não é censura.&lt;/p&gt;
&lt;p&gt;Considere as implicações de tal tendência.&lt;/p&gt;
&lt;p&gt;&amp;#8220;Censura&amp;#8221; é um termo que apenas diz respeito à ação governamental. Nenhuma ação privada é censura. Nenhum indivíduo particular ou agência pode silenciar um homem ou suprimir uma publicação; só o governo consegue fazer isso. A liberdade de expressão dos indivíduos particulares inclui o direito de não concordar, não ouvir e não  financiar seus próprios antagonistas.&lt;/p&gt;
&lt;p&gt;Mas de acordo com doutrinas como o projeto &amp;#8220;econômico de direitos&amp;#8221;, um indivíduo não tem o direito de dispor do seu próprio meio material através da orientação de suas próprias convicções &amp;#8211; e deve entregar o seu dinheiro de forma indiscriminada a qualquer falador ou propagandista, que têm o &amp;#8220;direito&amp;#8221; à sua propriedade.&lt;/p&gt;
&lt;p&gt;Isto significa que a capacidade de fornecer as ferramentas materiais para a expressão das idéias de um homem o priva do direito de ter a propriedade sobre qualquer idéia. Isso significa que um editor tem que publicar livros que considera inúteis, falsas ou más &amp;#8211; que um patrocinador de TV tem que financiar comentadores que optam por afrontar suas convicções &amp;#8211; que o proprietário de um jornal deve tornar suas páginas editoriais  a qualquer jovem hooligan que clamar pela escravização da imprensa. Isso significa que um grupo de homens, adquire o &amp;#8220;direito&amp;#8221; à licença ilimitada &amp;#8211; enquanto outro grupo é reduzido à irresponsabilidade desamparada.&lt;/p&gt;
&lt;p&gt;Mas uma vez que é obviamente impossível fornecer qualquer reclamante com um emprego, um microfone ou uma coluna de jornal, quem irá determinar a &amp;#8220;distribuição&amp;#8221; dos &amp;#8220;direitos econômicos&amp;#8221; e selecionar os destinatários, quando o direito dos proprietários de escolha foi abolida? Bem, Sr. Minow indicou isso muito claramente.&lt;/p&gt;
&lt;p&gt;E se você cometer o erro de pensar que isso se aplica apenas aos grandes proprietários, é melhor perceber que a teoria do &amp;#8220;direito econômico&amp;#8221; inclui o &amp;#8220;direito&amp;#8221; de cada aspirante a escritor, cada poeta jovem, cada compositor ruidoso e cada artista não-objetivo (que puxa saco de político) ao apoio financeiro que você não lhes deu quando não assistiu seus shows. O que mais é o significado do projeto para gastar o dinheiro dos seus impostos em arte subsidiada?&lt;/p&gt;
&lt;p&gt;E enquanto as pessoas estão reclamando sobre os &amp;#8220;direitos econômicos,&amp;#8221; o conceito de direitos políticos, está desaparecendo. Esquece-se que o direito à liberdade de expressão significa a liberdade para defender pontos de vista e a encarar as possíveis consequências, incluindo desacordo com outros, oposição, impopularidade e falta de apoio. A função política do &amp;#8220;direito à liberdade de expressão&amp;#8221; é proteger as minorias dissidentes e impopulares da repressão violenta &amp;#8211; não para garantir-lhes apoio,  vantagens e recompensas de uma popularidade que não ganharam.&lt;/p&gt;
&lt;p&gt;O &amp;#8220;Bill of Rights&amp;#8221; diz: &amp;quot;O Congresso não fará nenhuma lei &amp;#8230; cerceando a liberdade de expressão ou de imprensa &amp;#8230; &amp;quot; Ele não exige que os cidadãos privados ofereçam um microfone para o homem que defende a sua destruição, ou uma chave de acesso para o ladrão que quer roubá-los, ou uma faca para o assassino que quer cortar suas gargantas.&lt;/p&gt;
&lt;p&gt;Tal é o estado de uma das questões mais cruciais de hoje: os direitos políticos versus &amp;#8220;direitos econômicos.&amp;#8221; É ou-ou. Um destrói o outro. Mas não existe, de fato, &amp;#8220;direitos econômicos&amp;#8221;, &amp;#8220;direitos coletivos&amp;#8221;, &amp;#8220;direitos de interesse público.&amp;#8221; A expressão &amp;#8220;direitos individuais&amp;#8221; é uma redundância: não há nenhum outro tipo de direitos e ninguém mais para os possuir.&lt;/p&gt;
&lt;p&gt;Aqueles que defendem o capitalismo laissez-faire são os únicos defensores dos direitos do homem.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/qUNYbCOMp8k&amp;hl=en&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/qUNYbCOMp8k&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uZ-6JHZdKBiAdCvyFeXBRB3MJ9Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uZ-6JHZdKBiAdCvyFeXBRB3MJ9Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uZ-6JHZdKBiAdCvyFeXBRB3MJ9Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uZ-6JHZdKBiAdCvyFeXBRB3MJ9Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=kf6_wtuXr7g:-CuNlwOEUrQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=kf6_wtuXr7g:-CuNlwOEUrQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=kf6_wtuXr7g:-CuNlwOEUrQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=kf6_wtuXr7g:-CuNlwOEUrQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=kf6_wtuXr7g:-CuNlwOEUrQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=kf6_wtuXr7g:-CuNlwOEUrQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=kf6_wtuXr7g:-CuNlwOEUrQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/kf6_wtuXr7g" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/09/10/off-topic-direitos-do-homem</feedburner:origLink></item><item><title>Playing with Dry Scaffold and Inherited Resources</title><link>http://feedproxy.google.com/~r/AkitaOnRails/~3/nC9j5e5sELc/playing-with-dry-scaffold-and-inherited-resources</link><pubDate>Wed, 09 Sep 2009 11:40:37 PDT</pubDate><guid isPermaLink="false">tag:www.akitaonrails.com,2008:Post/5200</guid><description>&lt;p&gt;There are several ways to start a new Rails project nowadays, specially since Rails brought &lt;a href="http://github.com/jeremymcanally/rails-templates/tree/master"&gt;project templates&lt;/a&gt; to the mix. On the other hand there are still lot&amp;#8217;s of generators. So, today I want to just pinpoint some tips on this regard.&lt;/p&gt;
&lt;p&gt;First of all, make sure you have all the usual suspects installed:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;sudo gem install rspec rspec-rails josevalim-inherited_resources mislav-will_paginate justinfrench-formtastic thoughtbot-factory_girl haml ryanb-nifty_generators&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;One other is &lt;a href="http://github.com/akitaonrails/dry_scaffold/tree/master"&gt;dry_scaffold&lt;/a&gt; from &lt;a href="http://github.com/akitaonrails/grimen"&gt;grimen&lt;/a&gt;. I&amp;#8217;ve made a fork and added rspec support today. I think the 0.3.3 version should be generated soon from Github, then you will be able to install it like this:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;sudo gem install akitaonrails-dry_scaffold&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;But you can also install it manually from the source:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;git clone git://github.com/akitaonrails/dry_scaffold.git&lt;tt&gt;
&lt;/tt&gt;cd dry_scaffold&lt;tt&gt;
&lt;/tt&gt;gem build dry_scaffold.gemspec&lt;tt&gt;
&lt;/tt&gt;sudo gem install dry_scaffold-0.3.3.gem&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Now, create a normal Rails 2.3.x project and configure your config/environment.rb with:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;config.gem &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;haml&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;config.gem &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;will_paginate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;config.gem &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;justinfrench-formtastic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:lib&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;formtastic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="sy"&gt;:source&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;http://gems.github.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;config.gem &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;josevalim-inherited_resources&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:lib&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;inherited_resources&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="sy"&gt;:source&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;http://gems.github.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;And also add the following to your config/environments/test.rb:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;config.gem &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;rspec&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;config.gem &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;rspec-rails&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;In order to add Rspec support, create the initial &lt;a href="http://github.com/justinfrench/formtastic/tree/master"&gt;Formtastic&lt;/a&gt; stylesheets and add a little bit of sugar to your layouts do the following:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;./script/generate rspec&lt;tt&gt;
&lt;/tt&gt;./script/gererate formtastic_stylesheets&lt;tt&gt;
&lt;/tt&gt;./script/generate nifty_layout --haml&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Notice that I am referring to Ryan Bates&amp;#8217; &lt;a href="http://github.com/ryanb/nifty-generators/tree/master"&gt;Nifty Generators&lt;/a&gt;. I really like it&amp;#8217;s initial &lt;span class="caps"&gt;CSS&lt;/span&gt; and layout to start a new project instead of the default &amp;#8216;blank&amp;#8217; theme. But that&amp;#8217;s just me :-)&lt;/p&gt;
&lt;p&gt;The excellent &lt;a href="http://github.com/justinfrench/formtastic/tree/master"&gt;Formtastic&lt;/a&gt; will create your scaffolded views with a bit more of web semantics, so it&amp;#8217;s highly recommended to use. To make it look pretty, add the following to your &amp;#8216;app/views/layouts/application.html.haml&amp;#8217;:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;  = stylesheet_link_tag &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;application&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  = stylesheet_link_tag &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;formtastic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  = stylesheet_link_tag &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;formtastic_changes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Finally, you can start scaffolding some resources to get started, for example:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;./script/generate dry_scaffold Post title:string body:text --rspec&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;If you don&amp;#8217;t like fixtures you&amp;#8217;d rather use &lt;a href="http://github.com/thoughtbot/factory_girl/tree/master"&gt;Factory Girl&lt;/a&gt; instead doing this:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;./script/generate dry_scaffold Post title:string body:text --rspec --fgirl&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;By default, it&amp;#8217;s going to create thin controller with Inherited Resources and paginated with Will Paginate. The view templates will use &lt;a href="http://haml-lang.com/"&gt;&lt;span class="caps"&gt;HAML&lt;/span&gt;&lt;/a&gt; and &lt;a href="http://github.com/justinfrench/formtastic/tree/master"&gt;Formtastic&lt;/a&gt; for a semantically rich form. It will create tests using the standard test/unit and fixtures, but I&amp;#8217;d rather choose Rspec and &lt;a href="http://github.com/thoughtbot/factory_girl/tree/master"&gt;Factory Girl&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s also going to generate a separated &amp;#8220;_form&amp;#8221; partial that both &amp;#8220;new&amp;#8221; and &amp;#8220;edit&amp;#8221; views will use, which is one of those things that you do all the time after a normal scaffold. The usage of &lt;span class="caps"&gt;HAML&lt;/span&gt; is not very common, but I would recommend everybody to at least try it for a while, it will grow on you quickly. And having well formatted &lt;span class="caps"&gt;HTML&lt;/span&gt; outputs is always nice.&lt;/p&gt;
&lt;p&gt;The Dry Scaffold also supports generating just models (&amp;#8220;./script/generate dry_model&amp;#8221;). Read the documentation on the github project site to understand all the options.&lt;/p&gt;
&lt;p&gt;With this, you should be good to go and start to rapidly prototype your next web application.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CmKWOOQkbksnG0JFDdU00NFwFuI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CmKWOOQkbksnG0JFDdU00NFwFuI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CmKWOOQkbksnG0JFDdU00NFwFuI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CmKWOOQkbksnG0JFDdU00NFwFuI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=nC9j5e5sELc:L8WHk7KH9ns:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=nC9j5e5sELc:L8WHk7KH9ns:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=nC9j5e5sELc:L8WHk7KH9ns:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=nC9j5e5sELc:L8WHk7KH9ns:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=nC9j5e5sELc:L8WHk7KH9ns:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?i=nC9j5e5sELc:L8WHk7KH9ns:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AkitaOnRails?a=nC9j5e5sELc:L8WHk7KH9ns:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AkitaOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AkitaOnRails/~4/nC9j5e5sELc" height="1" width="1"/&gt;</description><feedburner:origLink>http://akitaonrails.com/2009/09/09/playing-with-dry-scaffold-and-inherited-resources</feedburner:origLink></item></channel></rss>
