
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>1up4Developers</title>
	<atom:link href="http://1up4dev.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://1up4dev.org</link>
	<description>Nadando contra o Waterfall. tail -f /mind/realworld &#62;&#62; /blog</description>
	<lastBuildDate>Tue, 22 Dec 2009 16:24:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Importando e exportando suas gems com Rubygems Snapshot</title>
		<link>http://1up4dev.org/2009/12/importando-e-exportando-suas-gems-com-rubygems-snapshot/</link>
		<comments>http://1up4dev.org/2009/12/importando-e-exportando-suas-gems-com-rubygems-snapshot/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 16:24:09 +0000</pubDate>
		<dc:creator>Roger Leite</dc:creator>
				<category><![CDATA[projetos]]></category>
		<category><![CDATA[quick tips]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=618</guid>
		<description><![CDATA[Final de ano está rendendo.
O rubygems_snapshot nasceu da necessidade de &#8220;migrar&#8221; as gems instaladas de uma máquina para outra, aliado ao rvm (veja este post-guia-rápido), permite mudar e/ou criar diferentes ambientes em minutos. Assim você pode fugir do famoso &#8220;gem hell&#8221;.
Veja como é difícil usar:
Instalação:
sudo gem install rubygems_snapshot
Para exportar as gems instaladas:
gem snapshot export projeto-exemplo.yml
Supondo [...]]]></description>
			<content:encoded><![CDATA[<p>Final de ano está rendendo.<br />
O <a href="http://github.com/rogerleite/rubygems_snapshot">rubygems_snapshot</a> nasceu da necessidade de &#8220;migrar&#8221; as gems instaladas de uma máquina para outra, aliado ao <a href="http://rvm.beginrescueend.com/">rvm</a> (veja este <a href="http://www.nuxlli.com.br/2009/11/24/para-tudo-instale-o-rvm-antes/">post-guia-rápido</a>), permite mudar e/ou criar diferentes ambientes em minutos. Assim você pode fugir do <span style="text-decoration: line-through;">famoso</span> &#8220;gem hell&#8221;.</p>
<p>Veja como é difícil usar:</p>
<p>Instalação:</p>
<pre>sudo gem install rubygems_snapshot</pre>
<p>Para <strong>exportar</strong> as gems instaladas:</p>
<pre>gem snapshot export projeto-exemplo.yml</pre>
<p>Supondo que esteja em outra máquina, para <strong>importar</strong> as gems, use:</p>
<pre>[sudo] gem snapshot import projeto-exemplo.yml</pre>
<h2>Afinal, o que tem de legal nisso?</h2>
<p>Vamos supor que você acaba de entrar numa nova equipe e tem que montar o ambiente de desenvolvimento (por sinal, um ambiente complicado de configurar). O gem snapshot aliada ao rvm, foi feito para facilitar isto, vamos a um exemplo rápido:</p>
<p>Com o rvm, você pode criar um &#8220;novo ambiente&#8221;:</p>
<pre>rvm use 1.8.7%projeto_exemplo</pre>
<pre>gem list</pre>
<p>Deve retornar vazio.</p>
<pre>gem install rubygems_snapshot</pre>
<pre>gem snapshot import projeto-exemplo.yml</pre>
<p>Instalará as gems necessárias para o projeto e pronto!</p>
<h2>ToDo:</h2>
<p>Esta é uma versão bem básica, onde o &#8220;import&#8221; somente lê as gem e version e manda instalar sem requerir dependências. Está previsto de colocar um aviso no final das gems que deram erro, geralmente devido a dependências de &#8220;build nativos&#8221;, mas por enquanto estamos usando aqui na equipe com sucesso.</p>
<h2>Como faço para criar um rubygems plugin também?</h2>
<p>Bom, logo de cara posso te garantir que não é difícil (apesar da pouca documentação na internet), mas deixarei os detalhes para um outro post. Por enquanto, a minha recomendação é: clone o projeto, analise os dois rb do projeto <img src='http://1up4dev.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  e crie o seu!</p>
<p>Caso algum corajoso for usar, estou a disposição para ajudar, é só deixar um comentário aê!<br />
Valeu e sucesso!</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/12/importando-e-exportando-suas-gems-com-rubygems-snapshot/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Agile Enterprise Edition</title>
		<link>http://1up4dev.org/2009/12/agile-enterprise-edition/</link>
		<comments>http://1up4dev.org/2009/12/agile-enterprise-edition/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 09:00:08 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[questionamento]]></category>
		<category><![CDATA[real world]]></category>
		<category><![CDATA[agilidade]]></category>
		<category><![CDATA[corporativismo]]></category>
		<category><![CDATA[metodologia]]></category>
		<category><![CDATA[pragmatic waterfall]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=560</guid>
		<description><![CDATA[Para começar o post, segue esta história sobre gerenciamento que vi no blog do Gustavo Ribeiro:
Todos os dias, uma formiga chegava cedinho ao escritório e pegava duro no trabalho. A formiga era produtiva e feliz. O gerente marimbondo estranhou a formiga trabalhar sem supervisão. Se ela era produtiva sem supervisão, seria ainda mais se fosse [...]]]></description>
			<content:encoded><![CDATA[<p>Para começar o post, segue esta história sobre <em>gerenciamento</em> que vi no blog do <a href="http://gustavoribeiro.com/blog/gerenciamento" target="_blank">Gustavo Ribeiro</a>:</p>
<blockquote><p>Todos os dias, uma formiga chegava cedinho ao escritório e pegava duro no trabalho. A formiga era produtiva e feliz. O gerente marimbondo estranhou a formiga trabalhar sem supervisão. Se ela era produtiva sem supervisão, seria ainda mais se fosse supervisionada.</p>
<p>E colocou uma barata, que preparava belíssimos relatórios e tinha muita experiência, como supervisora. A primeira preocupação da barata foi a de padronizar o horário de entrada e saída da formiga.</p>
<p>Logo, a barata precisou de uma secretária para ajudar a preparar os relatórios e contratou também uma aranha para organizar os arquivos e controlar as ligações telefônicas.</p>
<p>O marimbondo ficou encantado com os relatórios da barata e pediu também gráficos com indicadores e análise das tendências que eram mostradas em reuniões.</p>
<p>A barata, então, contratou uma mosca, e comprou um computador com impressora colorida. Logo, a formiga produtiva e feliz, começou a se lamentar de toda aquela movimentação de papéis e reuniões!<br />
O marimbondo concluiu que era o momento de criar a função de gestor para a área onde a formiga produtiva e feliz, trabalhava. O cargo foi dado a uma cigarra, que mandou colocar carpete no seu escritório e comprar uma cadeira especial.</p>
<p>A nova gestora cigarra logo precisou de um computador e de uma assistente (sua assistente na empresa anterior) para ajudá-la a preparar um plano estratégico de melhorias e um controle do orçamento para a área onde trabalhava a formiga, que já não cantarolava mais e cada dia se tornava mais chateada.</p>
<p>A cigarra, então, convenceu o gerente marimbondo, que era preciso fazer um estudo de clima. Mas, o marimbondo, ao rever as cifras, se deu conta de que a unidade na qual a formiga trabalhava já não rendia como antes e contratou a coruja, uma prestigiada consultora, muito famosa, para que fizesse um diagnóstico da situação. A coruja permaneceu três meses nos escritórios e emitiu um volumoso relatório, com vários volumes que concluía: &#8220;Há muita gente nesta empresa!&#8221;</p>
<p>Então o marimbondo mandou demitir a formiga porque ela andava muito desmotivada e aborrecida.</p></blockquote>
<p>Então lembrei de uma imagem que ilustra perfeitamente esta fábula e retrata fielmente a &#8220;organização&#8221; de alguma empresas:</p>
<p style="text-align: center;"><a href="http://1up4dev.org/wp-content/uploads/2009/07/trabalho_em_equipe.jpg"><img class="aligncenter" title="trabalho_em_equipe" src="http://1up4dev.org/wp-content/uploads/2009/07/trabalho_em_equipe-222x300.jpg" alt="" width="222" height="300" /></a></p>
<h2>Dividir para conquistar: você está fazendo isso errado!</h2>
<p>Quando uma <em>startup</em> passa a vender mais e ter uma procura maior por seus produtos/serviços (o que é bom), uma reação comum da &#8220;cúpula&#8221; é aumentar o quadro de funcionários visando atender a demanda. Logo surgem os problemas com a organização do pessoal e/ou fluxo de trabalho. A solução mais simplista (e óbvia) é a especialização: fulano faz isso, ciclano faz aquilo, e beltrano gerencia. Logo controles são criados, fluxos validados, centros de custo, documentos, reuniões, atas, comitês, gestão de pessoas e relacionamento, terceirização, cargos, departamentos&#8230; e nasce o monstro da <a href="http://pt.wikipedia.org/wiki/Burocracia">burocracia</a>, aka &#8220;enterprise&#8221;.</p>
<p>Com essa <a href="http://en.wikipedia.org/wiki/Enterprise_architecture">especialização</a>, cada &#8220;módulo&#8221; (também conhecido como departamento) começa a perder o foco no GRANDE objetivo da empresa e passa a defender apenas <a href="http://1up4dev.org/2008/11/os-guardioes-da-cascata">seus interesses</a> &#8211; a famosa MISSÃO da empresa passa a ser coadjuvante. O resultado? A empresa dobra ou triplica seu quadro de funcionários e na maioria dos casos, seu lucro bruto. Porém agora tem mais despesas com pessoal e gastos extras para manter  esse novo modelo &#8220;enterprise&#8221;. Trocando em miúdos, continua na mesma!</p>
<p>Onde está o erro? Mais uma vez o FOCO está na <a href="http://1up4dev.org/2008/11/foco-no-problema/">solução</a> ao invés de PROBLEMA. Se você ler meus posts anteriores vai ver que este é um tema recorrente. Então por que as empresas continuam fazendo as coisas erradas e cometendo os mesmos erros?</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/R47Xe8kVrv0&amp;hl=pt_BR&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/R47Xe8kVrv0&amp;hl=pt_BR&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Idéias criativas surgem das pessoas <a href="http://blog.aspercom.com.br/2008/07/21/hierarquias-sao-inteligentes-nas-pontas/">diretamente</a> relacionadas com os problemas e não de diretores, contadores, gestores, etc. Esse modelo &#8220;enterprise&#8221; é um <em>overhead</em> organizacional que só gera ruído e desperdício!</p>
<h2>A solução é adotar agile!</h2>
<p>SOLUÇÃO!? Mas qual era o PROBLEMA mesmo!? Sim, mais uma vez o foco é a <a href="http://agilesoftwaredevelopment.com/blog/janusz-gorycki/agile-dead">solução</a> ao invés do problema.</p>
<p>Como eu disse nos posts anteriores, acreditar que uma mudança drástica do processo pode mudar a cultura da empresa e pincipalmente as pessoas é o maior erro na adoção de metodologias ágeis. Mudam o processo mas não mudam as pessoas.</p>
<p>De uma forma simples e direta, agile resume-se a quatro valores:</p>
<blockquote><p>Individuals and interactions over processes and tools<br />
Working software over comprehensive documentation<br />
Customer collaboration over contract negotiation<br />
Responding to change over following a plan</p></blockquote>
<p>Ou seja, pessoas, software, colaboração e feedback. Simples assim!</p>
<p>O manifesto ágil não cita nada sobre &#8220;enterprise&#8221;, sobre a implementação. Este é o grande desafio em sua adoção. Como seguir estes valores sem burocratizar e engessar o processo? Como criar uma relação de colaboração com os clientes? Como responder rapidamente a mudanças? Como eliminar o esforço que não agrega valor ao produto e/ou empresa? Como evitar politicagem?</p>
<h2>Mantenha-se pequeno!</h2>
<p>Otimize! Busque soluções para os problemas que impedem de produzir mais e com mais qualidade. Faça MAIS com MENOS. Foque no O QUE ao invés do COMO. Escale as pessoas verticalmente!</p>
<p>Inove! Não espere conseguir resultados diferentes fazendo sempre a mesma coisa. Busque novidades, opniões, experiências. Ouça seus funcionários, seus clientes. Estude, pesquise, arrisque, erre, acerte&#8230; continuamente.</p>
<p>Mantenha o foco! Tenha um GRANDE e único objetivo e certifique-se que todos acreditem nesta filosofia. É importante que todos comprem a idéia e o <em>modus operandis</em>.</p>
<p>Finalizando, este é apenas meu ponto de vista, baseado na minha experiência em diversas empresas grandes e pequenas, vivenciando problemas, errando muito e principalmente aprendendo com os erros dos outros. Agilidade pode funcionar bem em grandes corporações, desde que haja foco e que todos comprem a idéia. Você pode concordar ou não.</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/12/agile-enterprise-edition/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ruby, Rubygems e $LOAD_PATH ou Como funciona o require de gems</title>
		<link>http://1up4dev.org/2009/12/ruby-rubygems-e-load_path-ou-como-funciona-o-require-de-gems/</link>
		<comments>http://1up4dev.org/2009/12/ruby-rubygems-e-load_path-ou-como-funciona-o-require-de-gems/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 10:30:15 +0000</pubDate>
		<dc:creator>Roger Leite</dc:creator>
				<category><![CDATA[quick tips]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[load_path]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=589</guid>
		<description><![CDATA[Na madrugada passada, andei &#8220;brincando&#8221; com o fonte do Rubygems. Logo de cara posso te dizer que não consegui fazer o que queria, e pra amenizar o sentimento de &#8220;perda de tempo&#8221;, resolvi postar alguns truques aprendidos.
Baixei o fonte do rubygems, como faço pra rodá-lo sem alterar o meu sistema?
Foi a primeira pergunta que fiz. [...]]]></description>
			<content:encoded><![CDATA[<p>Na madrugada passada, andei &#8220;brincando&#8221; com o fonte do <a href="http://rubyforge.org/projects/rubygems/">Rubygems</a>. Logo de cara posso te dizer que não consegui fazer o que queria, e pra amenizar o sentimento de &#8220;perda de tempo&#8221;, resolvi postar alguns truques aprendidos.</p>
<h2>Baixei o fonte do rubygems, como faço pra rodá-lo sem alterar o meu sistema?</h2>
<p>Foi a primeira pergunta que fiz. Percebi que com o google não iria encontrar a resposta, mas consegui uma dica importante: $LOAD_PATH.</p>
<pre>$ irb</pre>
<pre>irb(main):001:0&gt; $LOAD_PATH</pre>
<p>No meu Ubuntu, obtive:</p>
<pre>["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", "."]</pre>
<pre>$ ls /usr/local/lib/site_ruby/1.8/</pre>
<p>Exatamente nesta pasta que se encontra o rubygems.rb. Bingo!<br />
Para rodar o fonte do rubygems, só é necessário adicionar ao $LOAD_PATH a pasta lib do projeto. Dado que estou na raiz do projeto rubygems baixado, execute:</p>
<pre>~/rubygems$ ruby -I $PWD/lib ./bin/gem -v</pre>
<p>O paramêtro -I permite adicionar diretório ao $LOAD_PATH. Simples e prático. Primeiro problema resolvido, comecei a programar.</p>
<h2>Afinal, como funciona o &#8220;require de gems&#8221;?</h2>
<p>Bom, já sabemos que o require &#8220;rubygems&#8221; fuciona pois encontra-se no $LOAD_PATH do ruby, no caso do meu Ubuntu em &#8220;/usr/local/lib/site_ruby/1.8&#8243;.</p>
<p>Basicamente (e muito), o Rubygems faz duas coisas no Kernel do Ruby.</p>
<ul>
<li>Adiciona o metodo Kernel#gem.</li>
<li>Faz um <a href="http://en.wikipedia.org/wiki/Monkey_patch">Monkey Patch</a> no Kernel#require</li>
</ul>
<h3>Kernel#gem</h3>
<p>Permite &#8220;acionar&#8221; uma versão específica de gem. Note que este acionar, traduz-se para, adicionar a lib da gem no $LOAD_PATH. Segue um trecho do comentário do Kernel#gem:</p>
<p style="padding-left: 30px;">##</p>
<p style="padding-left: 30px;"># Use Kernel#gem to activate a specific version of +gem_name+.</p>
<p style="padding-left: 30px;">#</p>
<p style="padding-left: 30px;"># +version_requirements+ is a list of version requirements that the</p>
<p style="padding-left: 30px;"># specified gem must match, most commonly &#8220;= example.version.number&#8221;.  See</p>
<p style="padding-left: 30px;"># Gem::Requirement for how to specify a version requirement.</p>
<p style="padding-left: 30px;">#</p>
<p style="padding-left: 30px;"># If you will be activating the latest version of a gem, there is no need to</p>
<p style="padding-left: 30px;"># call Kernel#gem, Kernel#require will do the right thing for you.</p>
<p style="padding-left: 30px;">#</p>
<p style="padding-left: 30px;"># Kernel#gem returns true if the gem was activated, otherwise false.  If the</p>
<p style="padding-left: 30px;"># gem could not be found, didn&#8217;t match the version requirements, or a</p>
<p style="padding-left: 30px;"># different version was already activated, an exception will be raised.<br />
[...]</p>
<h3>Kernel#require</h3>
<p>No final do rubygems.rb encontramos:</p>
<p>if RUBY_VERSION &lt; &#8216;1.9&#8242; then</p>
<p>require &#8216;rubygems/custom_require&#8217;</p>
<p>end</p>
<p>Não consegui descobrir o que acontece com o ruby 1.9, mas no 1.8, o monkey patch executa os seguintes passos:</p>
<ul>
<li>Chama o &#8220;original&#8221; require;</li>
<li>Em caso de LoadError;
<ul>
<li>Executa o &#8220;Gem.searcher.find(path)&#8221;;</li>
<li>Se <em>true</em>
<ul>
<li>Chama o activate (novamente traduz-se para adiciona a gem no $LOAD_PATH)</li>
<li>Executa o &#8220;original&#8221; require novamente;</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3>Exemplos com o IRB</h3>
<p>Para finalizar legal e comprovar tudo isso, fiz alguns testes:</p>
<pre>$ gem list json</pre>
<p style="padding-left: 30px;">*** LOCAL GEMS ***</p>
<p style="padding-left: 30px;">json (1.2.0, 1.1.9)</p>
<p style="padding-left: 30px;">json_pure (1.2.0)</p>
<p style="padding-left: 30px;">
<pre>$ irb</pre>
<pre>irb(main):001:0&gt; $LOAD_PATH</pre>
<p style="padding-left: 30px;">=&gt; ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", "."]</p>
<pre>irb(main):004:0&gt; require "json"</pre>
<p style="padding-left: 30px;">LoadError: no such file to load &#8212; json</p>
<p style="padding-left: 30px;">from (irb):4:in `require&#8217;</p>
<p style="padding-left: 30px;">from (irb):4</p>
<p style="padding-left: 30px;">from :0</p>
<pre>irb(main):005:0&gt; gem "json", "= 1.2.0"</pre>
<p style="padding-left: 30px;">NoMethodError: undefined method `gem&#8217; for main:Object</p>
<p style="padding-left: 30px;">from (irb):5<br />
from :0</p>
<p>O require &#8220;json&#8221; por si só, carrega a versão mais atual da gem.</p>
<pre>irb(main):006:0&gt; require "rubygems"</pre>
<p>=&gt; true</p>
<pre>irb(main):007:0&gt; require "json"</pre>
<p>=&gt; true</p>
<pre>irb(main):008:0&gt; JSON::VERSION</pre>
<p>=&gt; &#8220;1.2.0&#8243;</p>
<pre>irb(main):009:0&gt; $LOAD_PATH</pre>
<p>=&gt; ["/usr/lib/ruby/gems/1.8/gems/gemcutter-0.1.8/lib", "/usr/lib/ruby/gems/1.8/gems/json-1.2.0/bin", "/usr/lib/ruby/gems/1.8/gems/json-1.2.0/ext/json/ext", "/usr/lib/ruby/gems/1.8/gems/json-1.2.0/ext", "/usr/lib/ruby/gems/1.8/gems/json-1.2.0/lib", "/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", "."]</p>
<pre>irb(main):010:0&gt; quit</pre>
<p>Após o require &#8220;json&#8221;, as pastas foram adicionadas no $LOAD_PATH.</p>
<pre>"/usr/lib/ruby/gems/1.8/gems/json-1.2.0/bin", "/usr/lib/ruby/gems/1.8/gems/json-1.2.0/ext/json/ext", "/usr/lib/ruby/gems/1.8/gems/json-1.2.0/ext", "/usr/lib/ruby/gems/1.8/gems/json-1.2.0/lib"</pre>
<p>Agora olhe que <strong>interessante</strong> este <strong>último teste</strong>:</p>
<pre>$ irb

irb(main):001:0&gt; require "rubygems"</pre>
<p>=&gt; true</p>
<pre>irb(main):002:0&gt; $LOAD_PATH</pre>
<p>=&gt; ["/usr/lib/ruby/gems/1.8/gems/gemcutter-0.1.8/lib", "/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", "."]</p>
<pre>irb(main):003:0&gt; gem "json", "= 1.1.9"</pre>
<p>=&gt; true</p>
<pre>irb(main):004:0&gt; $LOAD_PATH</pre>
<p>=&gt; ["/usr/lib/ruby/gems/1.8/gems/gemcutter-0.1.8/lib", "/usr/lib/ruby/gems/1.8/gems/json-1.1.9/bin", "/usr/lib/ruby/gems/1.8/gems/json-1.1.9/ext/json/ext", "/usr/lib/ruby/gems/1.8/gems/json-1.1.9/ext", "/usr/lib/ruby/gems/1.8/gems/json-1.1.9/lib", "/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", "."]</p>
<pre>irb(main):005:0&gt; JSON</pre>
<p>NameError: uninitialized constant JSON<br />
from (irb):5</p>
<pre>irb(main):006:0&gt; require "json"</pre>
<p>=&gt; true</p>
<pre>irb(main):007:0&gt; JSON::VERSION</pre>
<p>=&gt; &#8220;1.1.9&#8243;</p>
<pre>irb(main):008:0&gt; quit</pre>
<p>Note que após o gem &#8220;json&#8221;, &#8220;= 1.1.9&#8243; &#8230; a versao 1.1.9 foi adicionada no $LOAD_PATH mas não foi carregada. Ao executar o require &#8220;json&#8221;, como este já estava no $LOAD_PATH, a versão 1.1.9 é usada.</p>
<p>Espero que com estas explicações, você use com mais segurança o rubygems.</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/12/ruby-rubygems-e-load_path-ou-como-funciona-o-require-de-gems/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails Summit 2009</title>
		<link>http://1up4dev.org/2009/10/rails-summit-2009/</link>
		<comments>http://1up4dev.org/2009/10/rails-summit-2009/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 13:21:22 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[eventos]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[railssummit]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=558</guid>
		<description><![CDATA[Estamos de volta depois de algumas semanas de correria e muito trabalho, o que nos impediu de postar sobre vários assuntos atuais e experiências recentes. Também migramos de empresa. Agora o Roger e eu estamos trabalhando em uma empresa maior, focada em conteúdo digital, desenvolvendo aplicações de grande porte com Ruby e Rails  
O [...]]]></description>
			<content:encoded><![CDATA[<p>Estamos de volta depois de algumas semanas de correria e muito trabalho, o que nos impediu de postar sobre vários assuntos atuais e experiências recentes. Também migramos de empresa. Agora o <a href="http://1up4dev.org/author/rogerbarreto/">Roger</a> e eu estamos trabalhando em uma empresa maior, focada em conteúdo digital, desenvolvendo aplicações de grande porte com Ruby e Rails <img src='http://1up4dev.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h1>O evento</h1>
<p>Se você não soube do <a href="http://www.railssummit.com.br/">Rails Summit 2009</a> ou não sabe nem o que é Rails recomendo que acesse <a href="http://pbskids.org/teletubbies/">este site</a>. Deixando o sarcasmo de lado, a edição 2009 do Rails Summit foi muito boa. As palestras foram excelentes (com algumas poucas exceções). Os coffe-breaks e as <a href="http://github.com/railssummit/morena_opensource/tree/master/RailsSummit2009/">locagirls</a> também!</p>
<p><img class="alignnone size-full wp-image-567" title="Rails Summit 2009 Locaweb" src="http://1up4dev.org/wp-content/uploads/2009/10/4013425175_68b7b78b6f_original.jpg" alt="Rails Summit 2009 Locaweb" width="500" height="333" /></p>
<p>Quem não conseguiu ir este ano pode conferir o que aconteceu e assistir a algumas palestras nos seguintes links:</p>
<p><a href="http://github.com/leonardoborges/railssummit09">http://akitaonrails.com/2009/10/17/rails-summit-2009-retrospectiva</a></p>
<p><a href="http://andrefaria.com/2009/10/15/rails-summit-2009-chad-fowler/">http://andrefaria.com/2009/10/15/rails-summit-2009-chad-fowler/</a></p>
<p><a href="http://andrefaria.com/2009/10/19/rails-summit-gregg-pollack/">http://andrefaria.com/2009/10/19/rails-summit-gregg-pollack/</a></p>
<p><a href="http://marciotrindade.com/2009/10/13/rails-summit-2009-parte-1">http://marciotrindade.com/2009/10/13/rails-summit-2009-parte-1</a></p>
<p><a href="http://marciotrindade.com/2009/10/14/rails-summit-2009-parte-2">http://marciotrindade.com/2009/10/14/rails-summit-2009-parte-2</a></p>
<p><a href="http://marciotrindade.com/2009/10/16/rails-summit-2009-parte-3">http://marciotrindade.com/2009/10/16/rails-summit-2009-parte-3</a></p>
<h1>Rails não escala</h1>
<p>Das palestras técnicas, focadas em Ruby e Rails, destaco a do <a href="http://blog.envylabs.com">Gregg Pollac</a>: On The Edge of Rails Performance, que falou sobre algumas <a href="http://andrefaria.com/2009/10/19/rails-summit-gregg-pollack/">ferramentas e plugins</a> para ajudar a melhorar a performance de aplicações Rails.</p>
<p>O estreiante <a href="http://m.onkey.org/2009/10/18/railssummit-slides">Pratik Naik</a> também deu algumas dicas muito boas para melhoar a performance e falou um bouco sobre suas experiências com Rails.</p>
<p>Para finalizar, o <a href="http://brunomiranda.com/">Bruno Miranda</a> fechou falando sobre sua experiência com o desenvolvimento do <a href="http://br.msn.cyloop.com/">Cyloop</a>, uma rede social de música, mostrando os problemas enfrentados com escalabilidade e as estratégias utilizadas para resolvê-los.</p>
<p>E claro que não podia deixar de falar da excelente palestra do <a href="http://www.slideshare.net/fabiokung/dsls-internas-e-ruby">Fábio Kung</a> sobre metaprogramação com Ruby, apresentando um hands-on, ou seja, &lt;faustao&gt;quem sabe faz ao vivo&lt;/faustao&gt;, para criar uma DSL em Ruby e outras técnicas de magia negra como <a href="http://coderrr.wordpress.com/2008/11/22/super-simple-callbacks-in-ruby/">Callbacks</a>, que pretendo abordar com mais detalhes aqui no blog.</p>
<p>Resumindo, projetar aplicações Rails escaláveis não é uma tarefa trivial e deve ser pensada com muito cuidado. Pretendo explorar mais este assunto nos próximos posts do blog.</p>
<h1>Agilidade a seu favor</h1>
<p>Apesar de ser um evento sobre Rails, um tema predominante foi agile. A <a href="http://andrefaria.com/2009/10/15/rails-summit-2009-chad-fowler/">largada</a> foi dada pelo <a href="http://chadfowler.com/">Chad Fowler</a> que falou sobre a insurgência Ruby on Rails, incentivando o movimento ágil a &#8220;quebrar as regras&#8221;, <a href="http://chadfowler.com/2006/12/27/the-big-rewrite">parar de fazer as coisas que sabemos que estão erradas</a>! Também ressaltou que é preciso ter coragem e atitude para rejeitar os moldes corporativos e lutar contra os <a href="http://akitaonrails.com/2009/03/30/off-topic-net-negative-producing-programmer">trolls</a>, os <a href="http://1up4dev.org/2008/11/os-guardioes-da-cascata/">guardiões da cascata</a>.</p>
<p>O <a href="http://akitaonrails.com/">Akita</a> realmente surpreendeu com sua <a href="http://vimeo.com/7099091">palestra</a> &#8220;Agile, beyond chaos&#8221;. Explicou os princípios do <a href="http://agilemanifesto.org/">manifesto ágil</a> e comprovou cientificamente o &#8220;porque&#8221; agile funciona!</p>
<p>A palestra sobre empreendedorismo do <a href="http://improveit.com.br/empresa/vinicius">Vinícius Teles</a> foi uma verdadeira aula, contando um pouco da sua história, as dificuldades e obstáculos superados até conseguir transformar o <a href="http://beonthe.net/">Be on the Net</a> em realidade. Resumindo: ganhe dinheiro fazendo o que você gosta e ajudando as outras pessoas a ganhar dinheiro!</p>
<p>Finalizando com chave de ouro, o <a href="http://obiefernandez.com/">Obie Fernandez</a> falou sobre a &#8220;arte&#8221; do desenvolvimento de aplicações. Assim como um artista que precisa praticar muito para atingir a excelência, um programador precisa praticar e codificar muito&#8230; &#8220;O que você está esperando? Fuck the enterprise!&#8221;</p>
<p>Resumindo, falou-se muito sobre agilidade usando ruby e rails como uma ferramenta pragmática. As empresas de software sérias já estão usando Ruby. É a <a href="http://1up4dev.org/2009/08/ruby-quando-a-linguagem-de-programacao-faz-diferenca/">linguagem ideal para o modelo ágil</a>.</p>
<h2>Comentários do Roger</h2>
<p>Tomei a liberdade de adicionar uma nota neste post do <a href="http://1up4dev.org/author/rodrigopanachi/">Panachi</a>, pois como participante do <a href="http://1up4dev.org/2008/10/rails-summit-eu-fui/">Rails Summit 2008</a>, resumidamente notei três coisas do evento:</p>
<ul>
<li>A infra estrutura do evento estava muito melhor, mais espaço, mais organização e sem o calor infernal do ano passado. Parabéns para o Akita e o pessoal da Locaweb pelo ótimo trabalho e evento mais uma vez!</li>
<li>Tivemos ótimas palestras técnicas sobre como melhorar a performance de aplicações Ruby!</li>
<li>Em 2008 a grande mensagem foi &#8220;Participe!&#8221;. Ficou bem claro a importância de participar de projetos e contribuir. Este ano, a grande mensagem foi &#8220;<em>Fuck the Enterprise!</em>&#8220;. <img src='http://1up4dev.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/10/rails-summit-2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ruby: quando a linguagem de programação faz diferença!</title>
		<link>http://1up4dev.org/2009/08/ruby-quando-a-linguagem-de-programacao-faz-diferenca/</link>
		<comments>http://1up4dev.org/2009/08/ruby-quando-a-linguagem-de-programacao-faz-diferenca/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 11:25:58 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[real world]]></category>
		<category><![CDATA[agilidade]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=545</guid>
		<description><![CDATA[Pretendo neste post falar um pouco da minha evolução na programação e como Ruby e Rails agregaram mais conhecimento e me tornaram um melhor desenvolvedor.
A gente se forma na faculdade e de repente estamos trabalhando como programador em alguma empresa de software. A primeira coisa que você vai concluir é que nada a maioria das [...]]]></description>
			<content:encoded><![CDATA[<p>Pretendo neste post falar um pouco da minha evolução na programação e como Ruby e Rails agregaram mais conhecimento e me tornaram um melhor desenvolvedor.</p>
<p>A gente se forma na <a href="http://gc.blog.br/2009/05/18/o-que-eu-acho-sobre-faculdades-de-informatica/" target="_blank">faculdade</a> e de repente estamos trabalhando como programador em alguma empresa de <a href="http://1up4dev.org/2008/10/software-e-sobre-investimento/" target="_blank">software</a>. A primeira coisa que você vai concluir é que <span style="text-decoration: line-through;">nada</span> a maioria das coisas que foram ensinadas na <a href="http://akitaonrails.com/2009/04/17/off-topic-devo-fazer-faculdade" target="_blank">faculdade</a> não se aplicam na vida real. Triste realidade&#8230;</p>
<p>Mas como um bom programador (que você é) logo começará a se questionar e se interessar por novos assuntos, aprender novos conceitos e técnicas de programação, pois você não se sentirá <a href="http://1up4dev.org/2008/06/a-importancia-de-estudar-constantemente/" target="_blank">confortável</a> fazendo as mesmas tarefas repetitivas ou que não sejam otimizadas.</p>
<h2>Orientação a objetos</h2>
<p>Nada de cachorrinhos ou pessoas com ações como andar, comer, etc. No mundo real, seus problemas são faturas, notas fiscais, relatórios, importadores de arquivos, planilhas&#8230; e por aí vai. Seu primeiro desafio será de entender a orientação a objetos de verdade. Mas não se preocupe se isto demorar um pouco pois logo a &#8220;lâmpada&#8221; acenderá e tudo ficará <a href="http://domaindrivendesign.org/" target="_blank">claro como o dia</a>.</p>
<h2>Linguagem e frameworks</h2>
<p>Agora você consegue modelar os objetos da sua aplicação mas se depara com assuntos técnicos que podem ser solucionados prontamente utilizando-se <a href="http://guilher.me/inovacao/frameworks-ageis-para-projetos-de-web20/" target="_blank">frameworks</a> e alguns recursos avançados da linguagem em questão. Logo você estará visitando os sites da documentação do Struts, do Hibernate, do Ant&#8230; e descobrirá que o nome <a href="http://www.apache.org/" target="_blank">Apache</a>, além de tribo indígena, é muito mais do que um servidor Web. Após muitas provas de conceito e algumas noites sem dormir, você será um programador muito produtivo e confiante.</p>
<h2>Análise e documentação</h2>
<p>Parabéns! Aqui você já pode ser considerado um desenvolvedor. Logo seu destaque na equipe será recompensado com mais trabalho <span style="text-decoration: line-through;">de corno</span> desafiador. Nesta fase sua empresa se parece com uma <a href="http://1up4dev.org/2009/04/agilidade-e-a-buzzword-do-momento/" target="_blank">padaria</a>: &#8220;Me vê meio quilo do relatório X&#8221;, &#8220;Faz dois webservices pra viagem!&#8221;, &#8220;Aí, saindo uma fornada de casos de uso&#8230;&#8221;, etc. Logo <a href="http://1up4dev.org/2008/11/os-guardioes-da-cascata/" target="_blank">alguém</a> tem a brilhante <a href="http://1up4dev.org/2008/11/arquiteto-cascateiro/" target="_blank">idéia</a> de &#8220;documentar&#8221; tudo desde uma simples alteração no CSS do sistema até complexos e numerosos <a href="http://blog.fragmental.com.br/2008/07/25/uh-eme-ele/" target="_blank">diagramas</a> e notações daquele novo sistema para integração. No começo a novidade até parece ser uma boa idéia, mas logo você vai <a href="http://1up4dev.org/2009/07/cuidado-com-casos-de-uso/" target="_blank">descobrir</a> que o que realmente importa é <a href="http://1up4dev.org/2008/11/foco-no-problema/" target="_blank">ouvir os problemas dos clientes</a>.</p>
<h2>Testes</h2>
<p>Se você não teve a sorte de ser orientado desde o começo da sua carreira sobre desenvolvimento guiado por testes, você aprende a importância de testes da melhor maneira possível: <a href="http://www.nomedojogo.com/2009/04/06/so-os-imaturos-nao-testam/" target="_blank">tomando na cabeça</a>! Os problemas começam a ficar mais claros. Você fica mais focado na tarefa que está desempenhando e felizmente também cresce profissionalmente com este aprendizado. Você se pergunta como conseguia desenvolver sem testes e por que a linguagem que você <a href="http://gc.blog.br/2008/10/19/java-e-ruim/" target="_blank">utiliza</a> não tem um suporte mais &#8220;nativo&#8221; a testes.</p>
<h2>Metodologia</h2>
<p>No decorrer da sua experiência você tentará desempenhar suas atividades de <a href="http://1up4dev.org/2008/10/a-perpetuacao-da-especie/" target="_blank">várias maneiras</a>. Quando você faz de tudo um pouco acha que o melhor seria fazer apenas uma tarefa específica mas depois descobre que estava enganado. Neste ponto você provavelmente já experimentou pelo menos duas metodologias de desenvolvimento e saberá identificar as vantagens e <a href="http://1up4dev.org/2008/06/guerrilha-agile-parte-1/" target="_blank">desvantagens</a> em cada uma.</p>
<h2>Agilidade</h2>
<p>Felizmente sua <a href="http://1up4dev.org/2009/01/tpw-dicas-para-a-qualidade-do-software/" target="_blank">experiência</a> o guia para um caminho mais <a href="http://1up4dev.org/2008/12/agilidade-cascateira/" target="_blank">ágil</a>. Após aprender e aplicar os mandamentos do <a href="http://agilemanifesto.org/" target="_blank">manifesto ágil</a> e aprimorar seus conceitos e habilidades técnicas, desenvolver aplicações torna-se uma tarefa &#8220;natural&#8221; que você desempenha com fluência independente da linguagem ou tecnologia utilizada. Suas maiores conquistas se resumem em conseguir contornar um problema tecnológico ou limitação da linguagem, negociar o escopo do projeto com o cliente, implementar a maior cobertura de testes possíveis, <a href="http://1up4dev.org/2009/02/tpw-testando-sistemas-legados-automatizando-build/" target="_blank">automatizar</a> processos durante o desenvolvimento, etc.</p>
<p>Neste ponto você começa a se questionar: o que devo fazer agora para <a href="http://akitaonrails.com/2009/07/23/tradu--o-o-que-faz-um-bom-programador" target="_blank">evoluir</a> profissionalmente?</p>
<h2>Ruby!</h2>
<p>Eis que você conhece Ruby e Rails. A linguagem parece estranha a primeira vista mas após algum tempo dedicado e muito estudo você descobre que é uma ferramenta muito poderosa e produtiva, onde você pode &#8220;fluir&#8221; com seu desenvolvimento. Você pensa no que quer fazer e faz! Escreve sua &#8220;feature&#8221;, implementa e roda! Simples e <a href="http://1up4dev.org/2009/04/business-bingo-generator/" target="_blank">divertido</a>!</p>
<p>Ruby e Rails vieram suprir uma necessidade e/ou carência dos desenvolvedores por <a href="http://www.nomedojogo.com/2009/05/06/como-ruby-on-rails-pode-o-tornar-um-programador-pior/" target="_blank">simplicidade</a>. Até seu surgimento, desenvolver aplicações nas linguagens populares do mercado era uma tarefa complicada e trabalhosa. Ruby é uma linguagem poderosa. Rails é simples e muito produtivo. Combinação perfeita!</p>
<p>O que você tá <a href="http://pt.wikipedia.org/wiki/Procrastinar" target="_blank">esperando</a>? <a href="http://why.nomedojogo.com/" target="_blank">Comece</a> agora <a href="http://akitaonrails.com/" target="_blank">mesmo</a> a <a href="http://www.rubyinside.com.br/" target="_blank">estudar</a> <a href="http://www.ruby-lang.org/" target="_blank">Ruby</a> e <a href="http://www.rubyonrails.pro.br/" target="_blank">Rails</a> e seja feliz!</p>
<p>UPDATE: para não causar confusão, alterei o título. Lembre-se: Ruby é linguagem e Rails é framework!</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/08/ruby-quando-a-linguagem-de-programacao-faz-diferenca/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Cuidado com Casos de Uso</title>
		<link>http://1up4dev.org/2009/07/cuidado-com-casos-de-uso/</link>
		<comments>http://1up4dev.org/2009/07/cuidado-com-casos-de-uso/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 09:45:58 +0000</pubDate>
		<dc:creator>Roger Leite</dc:creator>
				<category><![CDATA[real world]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=516</guid>
		<description><![CDATA[Na Engenharia de Software, um caso de uso (ou use case) é um tipo de classificador representando uma unidade funcional coerente provida pelo sistema, subsistema, ou classe manifestada por seqüências de mensagens intercambiáveis entre os sistemas e um ou mais atores. Pode ser representado por uma elipse contendo, internamente, o nome do caso de uso. [...]]]></description>
			<content:encoded><![CDATA[<p>Na Engenharia de Software, um caso de uso (ou <em>use case</em>) é um tipo de classificador representando uma unidade funcional coerente provida pelo sistema, subsistema, ou classe manifestada por seqüências de mensagens intercambiáveis entre os sistemas e um ou mais atores. Pode ser representado por uma elipse contendo, internamente, o nome do caso de uso. (fonte: <a href="http://pt.wikipedia.org/wiki/Caso_de_uso">Wikipédia</a>)</p>
<p>A própria explicação do Caso de Uso demonstra o que costumam ser na prática, ou seja, um monte de <em>buzzwords</em> para enganar o usuário e levar a sua assinatura. Este por sinal, só é citado no segundo parágrafo&#8230;</p>
<h2>É uma cilada Bino!!!</h2>
<div id="attachment_525" class="wp-caption aligncenter" style="width: 370px"><a href="http://pt.wikipedia.org/wiki/Carga_Pesada"><img class="size-full wp-image-525" title="Caso de Uso!?! Pode ser uma cilada Bino!" src="http://1up4dev.org/wp-content/uploads/2009/07/cilada_bino.jpg" alt="" width="360" height="120" /></a><p class="wp-caption-text">Caso de Uso!?! Pode ser uma cilada Bino!</p></div>
<p>Pontos negativos que podem tornar numa cilada:</p>
<ul>
<li>Não tem público definido. Casos de Uso são feitos para os analistas, desenvolvedores, testadores e as vezes para o usuário.</li>
<li>Casos de Uso não compilam. O usuário quer um sistema e não papéis para assinar.</li>
<li>Não traz o famoso ROI, traduzindo, retorno de investimento. Já vi muitos projetos de &#8220;anos em análise&#8221;, e no final, tinham uma bíblia inútil junto com um grande rombo nas contas.</li>
<li>Difícil de manter atualizado. É natural que as coisas mudem, e a cada mudança ter que atualizar quilos de documentos, não é prático e muito caro.</li>
<li>Pelo fato de terem um público abrangente, é consumido muito tempo com detalhes inúteis, como diagramas de &#8220;tudo&#8221;, que não ajudam em nada no desenvolvimento. Mais um item que consome tempo, recurso e muito dinheiro.</li>
</ul>
<p>A lista pode continuar fácil, mas devemos ir para a parte que interessa:</p>
<h2>Como corresponder a expectativa do usuário?</h2>
<p>Vou colocar o que está dando certo para mim. Caso encontrem alguma semelhança com o capítulo 7 do <a href="http://www.pragprog.com/titles/tpp/the-pragmatic-programmer">Pragmatic Programmer</a>, não estranhem, foi de lá mesmo que eu me &#8220;inspirei&#8221;.</p>
<p>Nada melhor do que a dica 51 (uma boa idéia!) para começar:</p>
<p style="padding-left: 30px;"><em>Don&#8217;t gather requirements &#8212; Dig for them</em></p>
<p>Numa tradução livre e tosca, colocaria assim:</p>
<p style="padding-left: 30px;">Não reuna requisitos, cave-os!</p>
<ul>
<li>Este negócio de &#8220;cavar&#8221;, é algo como: descobrir por que o usuário faz, e não somente como. Descobrindo o por que, você consegue sugerir maneiras diferentes de como fazer. Isso nos leva a próxima dica.</li>
<li>Lembre-se que, requisitos não são arquitetura, nem design, muito menos interface do usuário. Requisitos são necessidades!</li>
<li>Não seja escravo de nenhuma anotação. Use o melhor método que se comunica com o seu público. No meu caso, papel e caneta, com rascunhos da futura tela, já está funcionando e bem.</li>
<li>Não ter medo de sugerir novas idéias. Acredito que se dependesse da maioria dos usuários, todos os sistemas teriam cara de Excel! <img src='http://1up4dev.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Com o porque em mente, fica mais fácil sugerir funcionalidades como filtros, layout etc.</li>
<li><em>Some things are better done, than described.</em> -&gt; Algumas coisas são melhores feitas do que descritas. Pra mim, esta dica tem funcionado com reformulação de telas, algum &#8220;filtro maluco&#8221; etc.</li>
</ul>
<p>Sei que este post é muito &#8220;abstrato&#8221;, rápido e sem referência nenhuma, mas a idéia em si é causar uma reflexão em ti, sobre o modo que tu trabalha. Hoje, ele é prático? o cliente está satisfeito com resultado? o cliente está satisfeito com a velocidade, desde a análise a concepção? está havendo desperdício de verba?</p>
<p>Estas perguntas são interessantes, e sempre devem ser feitas. Por mais que o software seja problemático, se conseguirmos corresponder a expectativa do usuário, teremos mais um cliente satisfeito na carteira.</p>
<p>O tema Caso de Uso, é polêmico, e não quero causar <em>flame</em>. Pra cada ambiente, equipe, produto/projeto existe uma maneira diferente de trabalhar. O que espero evitar, são aqueles papéis inúteis, com: &#8220;se a ação teve sucesso, deve mostrar ok&#8221; &#8230; bah!</p>
<p>Por sinal, um dos <a href="http://rafael.adm.br/p/os-top-cinco-erros-nao-tecnicos-cometidos-por-desenvolvedores/">cinco grandes erros não técnicos, cometidos por programadores</a> (<a href="http://www.makinggoodsoftware.com/2009/07/07/5-top-non-technical-mistakes-made-by-programmers/">original aqui</a>) é: Esquecer do usuário. Lembre disto! <img src='http://1up4dev.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/07/cuidado-com-casos-de-uso/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Paginação no Rails com will_paginate e Ajax de modo fácil</title>
		<link>http://1up4dev.org/2009/07/paginacao-no-rails-com-will_paginate-e-ajax-de-modo-facil/</link>
		<comments>http://1up4dev.org/2009/07/paginacao-no-rails-com-will_paginate-e-ajax-de-modo-facil/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 03:30:48 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[quick tips]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=503</guid>
		<description><![CDATA[Paginação é um recurso simples e indispensável em qualquer aplicação séria. Em se tratando de Rails, a solução mais popular é a gem WillPaginate que basicamente adiciona o método &#8220;paginate_&#8221; aos models do ActiveRecord e fornece um helper para renderização dos links da paginação nas views.
Instalando a gem:
sudo gem install will_paginate
Para utilizar na aplicação, adicione [...]]]></description>
			<content:encoded><![CDATA[<p>Paginação é um recurso simples e indispensável em qualquer aplicação séria. Em se tratando de Rails, a solução mais popular é a gem <a href="http://github.com/mislav/will_paginate/tree/master" target="_blank">WillPaginate</a> que basicamente adiciona o método &#8220;paginate_&#8221; aos models do ActiveRecord e fornece um helper para renderização dos links da paginação nas views.</p>
<p>Instalando a gem:</p>
<pre>sudo gem install will_paginate</pre>
<p>Para utilizar na aplicação, adicione no final do <code>config/environment.rb</code>:</p>
<pre>require 'will_paginate'</pre>
<p>Altere o controller para utilizar paginação:</p>
<pre>def index
  @posts = Post.paginate :all, :page =&gt; params[:page], :per_page =&gt; 10
end</pre>
<p>E adicione os links da paginação na view:</p>
<pre>&lt;%= will_paginate @posts %&gt;</pre>
<p>Pronto! Ao clicar nos links da paginação o parâmetro &#8220;page&#8221; será incluído automaticamente na requisição.</p>
<p><a href="http://1up4dev.org/wp-content/uploads/2009/07/posts.png"><img class="alignnone size-medium wp-image-509" title="posts" src="http://1up4dev.org/wp-content/uploads/2009/07/posts-300x253.png" alt="" width="300" height="253" /></a></p>
<h2>Legal, mas cadê o &#8220;ajax&#8221;?</h2>
<p>Por padrão o WillPaginate não se preocupa com isso. O próprio desenvolvedor <a href="http://wiki.github.com/mislav/will_paginate/ajax-pagination" target="_blank">recomenda usar javascript</a> para interceptar o &#8220;click&#8221; dos links e renderizar o resultado na mesma página.</p>
<p>Outra alternativa seria estender a classe responsável por renderizar os links da paginação para utilizar requisições com ajax.</p>
<p>Inclua em <code>app/helpers</code> o arquivo <code>ajax_will_paginate.rb</code> com o código:</p>
<pre>class AjaxWillPaginate &lt; WillPaginate::LinkRenderer
  def prepare(collection, options, template)
    @update = options[:update]
    super
  end
  protected
  def page_link(page, text, attributes = {})
    @template.link_to_remote(text, {
      :url     =&gt; url_for(page),
      :method  =&gt; :get,
      :update =&gt; @update
    })
  end
end</pre>
<p>Então adicione no final do arquivo <code>config/environment.rb</code>:</p>
<pre>  WillPaginate::ViewHelpers.pagination_options[:renderer] = 'AjaxWillPaginate'</pre>
<p>E altere a chamada do helper na view para:</p>
<pre>&lt;%= will_paginate @posts, :update =&gt; 'div_principal' %&gt;</pre>
<p>Informe na opção <code>:update</code> o Id de um objeto html que contenha todo o conteúdo da paginação que será substituído nas requisições seguintes.</p>
<p>É importante lembrar que esta solução altera o comportamento de todos os helpers de paginação da aplicação, por isso deve ser utilizada com cautela. <a href="http://www.botvector.net/2008/08/willpaginate-on-ajax.html" target="_blank">Outras</a> <a href="http://weblog.redlinesoftware.com/2008/1/30/willpaginate-and-remote-links" target="_blank">soluções</a> parecidas podem ser encontradas <a href="http://www.google.com.br/search?q=ajax+will+paginate" target="_blank">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/07/paginacao-no-rails-com-will_paginate-e-ajax-de-modo-facil/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Agendando tarefas em aplicações Rails com rufus-scheduler</title>
		<link>http://1up4dev.org/2009/05/agendando-tarefas-em-aplicacoes-rails-com-rufus-scheduler/</link>
		<comments>http://1up4dev.org/2009/05/agendando-tarefas-em-aplicacoes-rails-com-rufus-scheduler/#comments</comments>
		<pubDate>Sun, 31 May 2009 18:33:06 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[quick tips]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=501</guid>
		<description><![CDATA[Rufus é um conjunto de gems utilizado para Workflow e BPM. O rufus-scheduler é a gem responsável pelo agendamento e execução de tarefas (jobs). Se você programa em Java e conhece o Quartz não vai ter dificuldade em utilizá-la.
Instalação:
sudo gem install rufus-scheduler
Utilização:
require 'rubygems'
require 'rufus/scheduler'

scheduler = Rufus::Scheduler.start_new

scheduler.every '5m' do
  puts 'Executando a cada 5 minutos'
end

scheduler.schedule [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://rufus.rubyforge.org/" target="_blank">Rufus</a> é um conjunto de gems utilizado para <a href="http://pt.wikipedia.org/wiki/Fluxo_de_Trabalho" target="_blank">Workflow</a> e <a href="http://pt.wikipedia.org/wiki/Business_Process_Management" target="_blank">BPM</a>. O <a href="http://rufus.rubyforge.org/rufus-scheduler/" target="_blank">rufus-scheduler</a> é a gem responsável pelo agendamento e execução de tarefas (jobs). Se você programa em Java e conhece o <a href="http://www.opensymphony.com/quartz/wikidocs/QuickStart.html" target="_blank">Quartz</a> não vai ter dificuldade em utilizá-la.</p>
<p>Instalação:</p>
<pre>sudo gem install rufus-scheduler</pre>
<p>Utilização:</p>
<pre>require 'rubygems'
require 'rufus/scheduler'

scheduler = Rufus::Scheduler.start_new

scheduler.every '5m' do
  puts 'Executando a cada 5 minutos'
end

scheduler.schedule '0 18 * * *' do
  puts 'Executando todos os dias as 18h'
end</pre>
<p>Simples assim! Consulte a <a href="http://rufus.rubyforge.org/rufus-scheduler/" target="_blank">documentação</a> oficial ou <a href="http://github.com/jmettraux/rufus-scheduler/tree/master" target="_blank">contribua com o código</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/05/agendando-tarefas-em-aplicacoes-rails-com-rufus-scheduler/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Gerando cheat sheet para os snippets do gedit</title>
		<link>http://1up4dev.org/2009/05/gerando-cheat-sheet-para-os-snippets-do-gedit/</link>
		<comments>http://1up4dev.org/2009/05/gerando-cheat-sheet-para-os-snippets-do-gedit/#comments</comments>
		<pubDate>Tue, 05 May 2009 08:00:37 +0000</pubDate>
		<dc:creator>Roger Leite</dc:creator>
				<category><![CDATA[projetos]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=482</guid>
		<description><![CDATA[Acredito que a maioria de vocês conhecem e/ou já usaram as famosas cheat sheets (tradução para &#8220;cola&#8221;?) para algo. Costumo usá-las quando quero fixar algum conceito novo ou simplesmente para consultas rápidas. Com o pai Google, é possível encontrar os mais diversos tipos: HTML, Ruby, Ruby on Rails, Shell Script&#8230; etc.
Atualmente venho praticando Ruby, sendo [...]]]></description>
			<content:encoded><![CDATA[<p>Acredito que a maioria de vocês conhecem e/ou já usaram as famosas <em>cheat sheets</em> (tradução para &#8220;cola&#8221;?) para algo. Costumo usá-las quando quero fixar algum conceito novo ou simplesmente para consultas rápidas. Com o pai Google, é possível encontrar os mais diversos tipos: <a title="Pesquisa no Google para cheat sheet HTML" href="http://www.google.com.br/search?q=cheat+sheet+HTML&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=com.ubuntu:en-US:unofficial&amp;client=firefox-a">HTML</a>, <a title="Pesquisa no Google para cheat sheet Ruby" href="http://www.google.com.br/search?hl=pt-BR&amp;client=firefox-a&amp;rls=com.ubuntu%3Aen-US%3Aunofficial&amp;hs=Ejh&amp;q=cheat+sheet+Ruby&amp;btnG=Pesquisar&amp;meta=">Ruby</a>, <a title="Pesquisa no Google para cheat sheet Ruby on Rails" href="http://www.google.com.br/search?hl=pt-BR&amp;client=firefox-a&amp;rls=com.ubuntu%3Aen-US%3Aunofficial&amp;hs=WQ2&amp;q=cheat+sheet+Ruby+on+Rails&amp;btnG=Pesquisar&amp;meta=">Ruby on Rails</a>, <a title="Pesquisa no Google para cheat sheet Shell Script" href="http://www.google.com.br/search?hl=pt-BR&amp;client=firefox-a&amp;rls=com.ubuntu%3Aen-US%3Aunofficial&amp;hs=h7M&amp;q=cheat+sheet+Shell+Script&amp;btnG=Pesquisar&amp;meta=">Shell Script</a>&#8230; etc.</p>
<p>Atualmente venho praticando Ruby, sendo o gedit &#8211; &#8220;tunado&#8221; com vários plugins &#8211; o meu maior aliado. Um dos plugins que mais me ajuda é o <a title="Link para o home do Snippets" href="http://live.gnome.org/Gedit/Plugins/Snippets">Snippets</a> e neste <a title="Post sobre o gedit snippets" href="http://cassiomarques.wordpress.com/2008/09/16/gedit-snippets/">post do Cássio Marques</a>, você encontra uma breve descrição do que é, e um link para snippets de exemplo.</p>
<p>Tudo isso foi só pra contar o que me levou a criar a gem gedit-snippets-tool. Com ela é possível criar <em>cheat sheets</em> dos seus snippets. Supondo que você tenha ruby e rubygem instalados, seu modo de uso é muito simples. Para instalar a gem execute:</p>
<pre><code>sudo gem install rogerleite-gedit-snippets-tool -s http://gems.github.com</code></pre>
<p>Após a instalação, para gerar um <em>cheat sheet</em> com todos os seus snippets, execute:</p>
<pre><code>gedit-snippets-tool -cs &gt; ~/mycheatsheet.xhtml</code></pre>
<p>Caso tenha muitos snippets, e deseja criar um cheat sheet somente com Ruby e Ruby on Rails por exemplo, execute:</p>
<pre><code>gedit-snippets-tool -cs ruby* &gt; ~/mycheatsheet.xhtml</code></pre>
<div id="attachment_484" class="wp-caption aligncenter" style="width: 301px"><a href="http://1up4dev.org/wp-content/uploads/2009/04/cheatsheet-example.png"><img class="size-medium wp-image-484" title="cheatsheet example" src="http://1up4dev.org/wp-content/uploads/2009/04/cheatsheet-example-291x300.png" alt="Meu cheat sheet de exemplo" width="291" height="300" /></a><p class="wp-caption-text">Meu cheat sheet de exemplo</p></div>
<p>Levando em conta que a gem foi feita em três dias e focamos somente o necessário para lançarmos uma versão 0.x &#8220;em produção&#8221;, vamos as limitações:</p>
<ul>
<li>O gedit-snippets-tool lê os snippets (arquivos XML) que estão na pasta &#8220;home&#8221;. Constatei que o gedit &#8220;limpo&#8221; logo após habilitar o plugin Snippets, guarda os snippets na pasta &#8220;/usr/share/gedit-2/plugins/snippets/&#8221;. Bom, se for este o seu caso, peço a gentileza de copiá-los para a &#8220;home&#8221; em &#8220;{home-folder}/.gnome2/gedit/snippets/&#8221;.</li>
<li>O template usado para gerar a página xhtml está bem &#8220;rústico&#8221;. O lado bom disso é que está bem fácil de alterá-lo. Vejam o código do template (via gist, leitores de RSS, sorry):</li>
</ul>
<p><script src="http://gist.github.com/106439.js"></script></p>
<p>Quem tiver sugestões (<strong>inclusive</strong> de template), podem forkar o projeto ou se quiser, deixe um comentário que eu entro em contato.</p>
<h3>Sobre o Desenvolvimento</h3>
<p>Assim que tive a idéia, análisei o que seria necessário, e resumindo:</p>
<ul>
<li>Ler os XMLs dos snippets;</li>
<li>Uma engine para gerar páginas através de &#8220;templates&#8221;;</li>
<li>Fazer uma gem executável&#8230; pois assim é mais fácil e rápido para quem quiser usá-la;</li>
</ul>
<p>A parte do XML é fácil, pois até já fiz coisa parecida <a title="Link de como usei o REXML do Ruby" href="http://1up4dev.org/2008/08/tpw-colocando-dicas-em-pratica/">antes</a>. A parte da engine para templates, o pai Google me guiou a uma ótima, chamada <a href="http://www.kuwata-lab.com/erubis/">Erubis</a>, que é uma gem e torna as coisas muito mais fáceis.</p>
<p>Para criar o esqueleto da gem, usei o <a href="http://github.com/dcrec1/gemhub">gemhub</a> do <a href="http://www.mouseoverstudio.com/blog/2008/10/27/criando-gems-com-gemhub-nunca-foi-tao-simples/">Diego Carrion</a>, que facilitou muito o meu trabalho, sem contar a ajuda que me deu na hora de publicar o gemspec no github&#8230; valeu truta! Bom, o resto foram três noites programando e aprendendo a fazer a minha primeira gem. Quem quiser participar estão todos convidados a &#8220;forka-lo&#8221; no <a title="gedit-snippets-tool home" href="http://github.com/rogerleite/gedit-snippets-tool">github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/05/gerando-cheat-sheet-para-os-snippets-do-gedit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery DataTables, GitHub API e links da semana</title>
		<link>http://1up4dev.org/2009/05/jquery-datatables-github-apilinks-semana/</link>
		<comments>http://1up4dev.org/2009/05/jquery-datatables-github-apilinks-semana/#comments</comments>
		<pubDate>Mon, 04 May 2009 04:00:27 +0000</pubDate>
		<dc:creator>Equipe 1up4dev</dc:creator>
				<category><![CDATA[novidades da semana]]></category>
		<category><![CDATA[quick tips]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[jquey]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=477</guid>
		<description><![CDATA[jQuery DataTables
Nós somos fãs de jQuery pela sua simplicidade e poder de extensão através de plugins. Falando nisso, este plugin torna qualquer tabela &#60;table/&#62; em um &#8220;grid&#8221; ordenável, pesquisavel e paginável automagicamente.

Para usar, basta incluir o plugin na página após o jQuery e executar o script:
$(document).ready(function() {
    $("id-tabela").dataTable();
}
No site oficial é possível [...]]]></description>
			<content:encoded><![CDATA[<h2><a href="http://www.datatables.net/" target="_blank">jQuery DataTables</a></h2>
<p>Nós somos fãs de jQuery pela sua simplicidade e poder de extensão através de plugins. Falando nisso, este plugin torna qualquer tabela &lt;table/&gt; em um &#8220;grid&#8221; ordenável, pesquisavel e paginável <em>automagicamente</em>.</p>
<p><a href="http://1up4dev.org/wp-content/uploads/2009/05/datatables.png"><img class="aligncenter size-medium wp-image-490" title="datatables" src="http://1up4dev.org/wp-content/uploads/2009/05/datatables-300x86.png" alt="" width="300" height="86" /></a></p>
<p>Para usar, basta incluir o plugin na página após o jQuery e executar o script:</p>
<pre>$(document).ready(function() {
    $("id-tabela").dataTable();
}</pre>
<p>No <a href="http://www.datatables.net/" target="_blank">site oficial</a> é possível consultar a documentação, exemplos e a <a href="http://www.datatables.net/plug-ins#language" target="_blank">tradução</a> para pt-br.</p>
<h2><a title="github api take two" href="http://github.com/blog/413-github-api-take-two">GitHub API, version 2</a></h2>
<p>Os caras do GitHub não são fracos não&#8230; já faz um tempinho, mas antes tarde do que nunca, anunciaram em seu <a title="GitHub Blog" href="http://github.com/blog">blog</a> a versão 2 do GitHub API. Ela provê acesso à &#8220;Repository, User, Commit, Object and Network&#8221; e futuramente ao Gist também. Como é a primeira release e ainda estão trabalhando nela, o próprio pessoal do Github pede ajuda a &#8220;desbravadores&#8221; e que abram tickets, caso encontrem algo. Documentação você encontra em  <a title="GitHub API Documentation" href="http://develop.github.com">develop.github.com</a>.</p>
<h2>Links da semana</h2>
<p><a href="http://www.desenvolvimentoparaweb.com/usabilidade/8-caracteristicas-de-user-interfaces-ui-de-sucesso/" target="_blank">8 características de User Interfaces (UI) de sucesso</a></p>
<p><a href="http://github.com/ryanb/nifty-generators/tree/master" target="_blank">Nifty Generators para Ruby on Rails</a></p>
<p><a href="http://olabini.com/blog/2009/04/jruby-on-rails-on-google-app-engine/" target="_blank">JRuby on Rails no Google App Engine</a></p>
<p><a href="http://www.ajaxianos.com.br/2008/10/grid-com-ordenacao-e-paginacao-animados/" target="_blank">Grid com ordenação e paginação animados</a></p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/05/jquery-datatables-github-apilinks-semana/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
