<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Guilherme Garnier</title>
	
	<link>http://blog.guilhermegarnier.com</link>
	<description>Desenvolvimento de Software e Open Source</description>
	<lastBuildDate>Tue, 22 Nov 2011 13:24:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/guilhermegarnier" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="guilhermegarnier" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Rails e mass assignment: como aumentar a segurança dos atributos</title>
		<link>http://blog.guilhermegarnier.com/2011/11/rails-e-mass-assignment-como-aumentar-a-seguranca-dos-atributos/</link>
		<comments>http://blog.guilhermegarnier.com/2011/11/rails-e-mass-assignment-como-aumentar-a-seguranca-dos-atributos/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 13:24:47 +0000</pubDate>
		<dc:creator>guilhermegarnier</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[activemodel]]></category>
		<category><![CDATA[activerecord]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[Segurança]]></category>

		<guid isPermaLink="false">http://blog.guilhermegarnier.com/?p=487</guid>
		<description><![CDATA[Ao utilizar o scaffold do Rails, ele criará todos os métodos necessários no controller. Depois que o usuário preenche os dados do formulário e envia, é executado o método create do controller. Este método faz algo semelhante ao código abaixo (no exemplo é um CRUD de usuário): Na forma em que o Rails cria o [...]]]></description>
			<content:encoded><![CDATA[<p>Ao utilizar o scaffold do Rails, ele criará todos os métodos necessários no controller. Depois que o usuário preenche os dados do formulário e envia, é executado o método create do controller. Este método faz algo semelhante ao código abaixo (no exemplo é um CRUD de usuário):</p>
<pre class="brush: ruby; title: ; notranslate">
@usuario = Usuario.new(params[:usuario])
</pre>
<p>Na forma em que o Rails cria o formulário, os atributos do usuário são passados ao controller como um hash. O valor do params acima é algo parecido com isso:</p>
<pre class="brush: jscript; title: ; notranslate">
{&quot;authenticity_token&quot;=&gt;&quot;xI1Cy+LvUZzg6FR/1Y/JHcaHVPRyWsHmRII8BhMOr0E=&quot;,
 &quot;utf8&quot;=&gt;&quot;?&quot;,
 &quot;action&quot;=&gt;&quot;create&quot;,
 &quot;controller&quot;=&gt;&quot;usuarios&quot;,
 &quot;usuario&quot;=&gt;{&quot;nome&quot;=&gt;&quot;Novo usuario&quot;, &quot;email&quot;=&gt;&quot;novo@usuario.com&quot;}}
</pre>
<p>Além da definição do token de segurança, codificação em utf-8, nome do controller e da action que será executada, o parâmetro usuario contém todos os atributos que foram preenchidos no formulário. Desta forma, é muito simples atribuir os parâmetros preenchidos a um objeto Usuario, seja criando um novo (<em>@usuario = Usuario.new(params[:usuario])</em>) ou editando (<em>@usuario.update_params(params[:usuario])</em>). O Rails chama isso de <a href="http://guides.rubyonrails.org/security.html#mass-assignment"><em>mass assignment</em></a>.</p>
<p>O problema desta abordagem é que o usuário poderia facilmente inserir novos parâmetros neste hash, simplesmente adicionando tags input hidden no formulário (usando o <a href="http://getfirebug.com/">Firebug</a>, por exemplo):</p>
<pre class="brush: xml; title: ; notranslate">
&lt;input type=&quot;hidden&quot; name=&quot;usuario[admin]&quot; id=&quot;usuario_admin&quot; value=&quot;true&quot; /&gt;
</pre>
<p>Adicionando o código acima, o novo usuário criado receberia o valor <em>true</em> no atributo <em>admin</em>, o que representa uma falha grave na segurança da aplicação.</p>
<p>O Rails oferece um mecanismo para garantir a segurança nestes casos, usando os métodos <a href="http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods/attr_protected"><em>attr_protected</em></a> e <a href="http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods/attr_accessible"><em>attr_accessible</em></a> do <a href="http://apidock.com/rails/ActiveModel">ActiveModel</a>. O primeiro permite definir atributos que não podem ser alterados através de <em>mass assignment</em>:</p>
<pre class="brush: ruby; title: ; notranslate">
class Usuario
  attr_protected :admin
end
</pre>
<p>E o <em>attr_accessible</em> é uma forma mais segura: somente os atributos passados para este método poderão ser alterados com <em>mass assignment</em>. Os demais ficam protegidos:</p>
<pre class="brush: ruby; title: ; notranslate">
class Usuario
  attr_accessible :nome, :email
end
</pre>
<p>Obviamente estes dois métodos não podem ser usados simultaneamente, pois um exclui o outro.</p>
<p>Se você quiser atualizar um objeto com <em>mass assignment</em> ignorando a segurança fornecida pelo <em>attr_accessible</em> e pelo <em>attr_protected</em>, basta utilizar o parâmetro <em>without_protection</em> (somente no Rails 3.1):</p>
<pre class="brush: ruby; title: ; notranslate">
Usuario.create(
  {:nome =&gt; &quot;Novo usuario&quot;, :email =&gt;&quot;novo@usuario.com&quot;, :admin =&gt; true},
  :without_protection =&gt; true)
</pre>
<p>No exemplo acima, o usuário criado terá o atributo <em>admin</em> igual a <em>true</em>, mesmo que tenha sido usado o método <em>attr_protected</em> ou o <em>attr_accessible</em> para evitar a alteração deste atributo.</p>
<p>Outra opção interessante para evitar a alteração de atributos indesejados é o método <a href="http://apidock.com/rails/ActiveRecord/Base/attr_readonly/class"><em>attr_readonly</em></a>. Os atributos passados para este método só poderão ser definidos na criação do objeto, e não poderão ser alterados depois. Porém, este método faz parte do <a href="http://apidock.com/rails/ActiveRecord/Base">ActiveRecord::Base</a>, e não do ActiveModel, ou seja, ele não estará disponível se você usar outro ORM. <a href="https://github.com/rails/rails/issues/3376">Há uma issue aberta no Github</a> solicitando que este método seja movido para o ActiveModel.</p>
<p>Link relacionado:</p>
<ul>
<li><a href="http://simplesideias.com.br/recebendo-dados-do-usuario-attr_accessible-e-attr_protected/">Recebendo dados do usuário: attr_accessible e attr_protected</a></li>
</ul>
<h3 class='related_post_title'>Posts relacionados:</h3>
<ul class='related_post'>
<li><a href='http://blog.guilhermegarnier.com/2008/06/rails-sem-banco-de-dados/' title='Rails sem banco de dados'>Rails sem banco de dados</a></li>
<li><a href='http://blog.guilhermegarnier.com/2008/04/configuracoes-fora-do-padrao-em-rails-parte-2-relacionamentos-habtm/' title='Configurações fora do padrão em Rails, parte 2 &#8211; Relacionamentos HABTM'>Configurações fora do padrão em Rails, parte 2 &#8211; Relacionamentos HABTM</a></li>
<li><a href='http://blog.guilhermegarnier.com/2008/03/configuracoes-fora-do-padrao-em-rails/' title='Configurações fora do padrão em Rails'>Configurações fora do padrão em Rails</a></li>
<li><a href='http://blog.guilhermegarnier.com/2008/03/acessando-multiplos-bancos-de-dados-em-rails/' title='Acessando múltiplos bancos de dados em Rails'>Acessando múltiplos bancos de dados em Rails</a></li>
<li><a href='http://blog.guilhermegarnier.com/2009/06/instant-rails-o-ambiente-rails-de-bolso/' title='Instant Rails, o ambiente Rails de bolso'>Instant Rails, o ambiente Rails de bolso</a></li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/Re4sUQJaSRvqmgkytJuWspGK21s/0/da"><img src="http://feedads.g.doubleclick.net/~a/Re4sUQJaSRvqmgkytJuWspGK21s/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Re4sUQJaSRvqmgkytJuWspGK21s/1/da"><img src="http://feedads.g.doubleclick.net/~a/Re4sUQJaSRvqmgkytJuWspGK21s/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.guilhermegarnier.com/2011/11/rails-e-mass-assignment-como-aumentar-a-seguranca-dos-atributos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Integrando o Remember the Milk ao Google Calendar e Gmail</title>
		<link>http://blog.guilhermegarnier.com/2011/09/integrando-o-remember-the-milk-ao-google-calendar-e-gmail/</link>
		<comments>http://blog.guilhermegarnier.com/2011/09/integrando-o-remember-the-milk-ao-google-calendar-e-gmail/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 13:20:08 +0000</pubDate>
		<dc:creator>guilhermegarnier</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[google calendar]]></category>
		<category><![CDATA[remember the milk]]></category>

		<guid isPermaLink="false">http://blog.guilhermegarnier.com/?p=473</guid>
		<description><![CDATA[O Google Calendar é uma excelente ferramenta para manter o controle de compromissos pendentes. Porém, tem dois problemas: é limitado a tarefas que tenham uma data específica e não dependem do usuário concluir, ou seja, uma tarefa que foi programada para ontem mas não foi realizada não aparecerá mais no meu calendário (ou melhor, aparecerá [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://calendar.google.com">Google Calendar</a> é uma excelente ferramenta para manter o controle de compromissos pendentes. Porém, tem dois problemas: é limitado a tarefas que tenham uma data específica e não dependem do usuário concluir, ou seja, uma tarefa que foi programada para ontem mas não foi realizada não aparecerá mais no meu calendário (ou melhor, aparecerá no dia em que estava prevista, e provavelmente será esquecida com o tempo). Isso acontece porque o Google Calendar não é uma ferramenta voltada para tarefas, e sim para eventos. Para realizar o controle de tarefas, o melhor é utilizar uma ferramenta específica para tal. Idealmente uma que seja integrável ao Google Calendar, pois este continua sendo uma excelente ferramenta para controle de eventos (visualizar eventos futuros, compartilhar com outras pessoas, etc).</p>
<p>A opção mais óbvia para controle de tarefas seria o <a href="http://mail.google.com/tasks">Google Tasks</a>, pois é do próprio Google, e como tal, é totalmente integrado não só ao Google Calendar, mas também ao Gmail. Apesar de ser uma boa opção, o Google Tasks é bastante limitado, e não possui (ainda) uma funcionalidade que considero básica para uma ferramenta de controle de tarefas: o cadastro de tarefas recorrentes (ex: toda segunda-feira, todo mês no dia 10).</p>
<p>Em função destas limitações, eu prefiro utilizar o <a href="http://www.rememberthemilk.com">Remember the Milk</a>, que é uma ferramenta muito mais completa que o Google Tasks. Ele também pode ser integrado tanto ao Gmail quanto ao Google Calendar.</p>
<h3>Integração com Google Calendar</h3>
<p>A integração é bem simples, através da interface iCalendar do Remember the Milk: vá até a opção settings, aba Info. Copie o link &#8220;iCalendar Events Service (All Lists)&#8221;. Em seguida, vá ao Google Calendar, em &#8220;other calendars&#8221;, à esquerda, há uma opção &#8220;Add by URL&#8221;. Cole a URL que foi copiada do Remember the Milk, e será criado um novo calendário com as suas tarefas &#8211; obviamente só aparecerão as que tem data.</p>
<p>Apesar de funcionar bem, a integração é limitada: a hora da tarefa não aparece, não há link direto para ver a tarefa no RTM, e é somente uma visualização, ou seja, não é possível editar, excluir ou concluir a tarefa a partir do Google Calendar. Além disso, quando uma tarefa é concluída, ela demora um tempo para sumir do calendário. Mas é possível configurar reminders para este calendário específico, o que torna a integração mais útil.</p>
<p>O calendário criado exibe todas as tarefas do seu RTM que não estão concluídas e tem data. Outra possibilidade é criar calendários com listas específicas. Para isso, vá ao RTM, faça uma busca ou selecione uma lista ou smart list específica. No lado direito aparecerá uma opção &#8220;iCalendar (Events)&#8221;. Copie esse link e repita o procedimento anterior no Google Calendar.</p>
<p>O RTM também disponibiliza dois <a href="http://www.rememberthemilk.com/services/googlecalendar/">gadgets para Google Calendar</a>:</p>
<ul>
<li><a href="http://www.rememberthemilk.com/services/googlecalendar/sidebar/">Sidebar Gadget</a></li>
<p>Permite visualizar, editar e adicionar tarefas diretamente no Google Calendar. Só não é possível visualizar e editar notas, mas há um link para exibir no RTM.</p>
<li><a href="http://www.rememberthemilk.com/services/googlecalendar/">Daily Gadget</a></li>
<p>Adiciona um botão a cada dia do calendário; ao ser clicado, exibe a lista de tarefas do dia.
</ul>
<h3>Integração com Gmail</h3>
<p>O RTM disponibiliza duas maneiras de exibir as tarefas no Gmail:</p>
<ul>
<li>Gadget do Google Calendar</li>
<p>Se você configurou a integração do RTM com o Google Calendar, descrita acima, o gadget do Google Calendar exibirá as tarefas do RTM.</p>
<li><a href="http://www.rememberthemilk.com/services/gmail/gadget/">Gmail Gadget</a></li>
<p>Este gadget possui as mesmas funcionalidades do Sidebar Gadget para Google Calendar.</p>
<li><a href="http://www.rememberthemilk.com/services/gmail/addon/">Add-on</a> (Firefox e Chrome)</li>
<p>Esta extensão é bem semelhante ao Gmail Gadget, mas possui algumas funcionalidades a mais: ela pode ser configurada para criar tarefas automaticamente quando um email for marcado com estrela ou com um label específico. Também é possível criar uma tarefa associada a um email específico, que será automaticamente concluída quando o email for respondido.
</ul>
<h3 class='related_post_title'>Posts relacionados:</h3>
<ul class='related_post'>
<li><a href='http://blog.guilhermegarnier.com/2010/01/problema-com-a-extensao-do-remember-the-milk-no-gmail/' title='Problema com a extensão do Remember The Milk no Gmail'>Problema com a extensão do Remember The Milk no Gmail</a></li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/Ljl7X_vBFYcH9lEt2uxZfm7yva8/0/da"><img src="http://feedads.g.doubleclick.net/~a/Ljl7X_vBFYcH9lEt2uxZfm7yva8/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Ljl7X_vBFYcH9lEt2uxZfm7yva8/1/da"><img src="http://feedads.g.doubleclick.net/~a/Ljl7X_vBFYcH9lEt2uxZfm7yva8/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.guilhermegarnier.com/2011/09/integrando-o-remember-the-milk-ao-google-calendar-e-gmail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gerenciando múltiplas versões de Ruby no Windows</title>
		<link>http://blog.guilhermegarnier.com/2011/05/gerenciando-multiplas-versoes-de-ruby-no-windows/</link>
		<comments>http://blog.guilhermegarnier.com/2011/05/gerenciando-multiplas-versoes-de-ruby-no-windows/#comments</comments>
		<pubDate>Thu, 19 May 2011 17:55:24 +0000</pubDate>
		<dc:creator>guilhermegarnier</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[pik]]></category>
		<category><![CDATA[rvm]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.guilhermegarnier.com/?p=451</guid>
		<description><![CDATA[O RVM já se tornou a opção padrão para gerenciar múltiplas versões de Ruby. Ele permite instalar várias versões, alternar entre elas, instalar gems em cada versão independentemente&#8230; mas não funciona em ambiente Windows. Eu sei que este não é um ambiente muito popular para desenvolvimento Ruby, mas existem usuários de Windows (seja por opção [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="https://rvm.beginrescueend.com/">RVM</a> já se tornou a opção padrão para gerenciar múltiplas versões de Ruby. Ele permite instalar várias versões, alternar entre elas, instalar gems em cada versão independentemente&#8230; mas não funciona em ambiente Windows. Eu sei que este não é um ambiente muito popular para desenvolvimento Ruby, mas existem usuários de Windows (seja por opção ou por obrigação) programando em Ruby. Para estes, uma alternativa ao RVM é o <a href="https://github.com/vertiginous/pik">Pik</a>.</p>
<p>O Pik funciona de forma bastante semelhante ao RVM. Para instalá-lo, primeiro é necessário instalar o <a href="http://rubyinstaller.org/">Ruby Installer</a>, um pacote pré-configurado especialmente para instalar o Ruby no Windows. A documentação do Pik recomenda a versão 1.8.7. Em seguida, instale as gems rake, isolate e o próprio pik:</p>
<pre class="brush: bash; title: ; notranslate">
gem install rake isolate pik
</pre>
<p>Antes de instalar o isolate, talvez seja necessário atualizar o <a href="http://rubygems.org/">Rubygems</a> com o comando abaixo:</p>
<pre class="brush: bash; title: ; notranslate">
gem update --system
</pre>
<p>O próximo passo é instalar o Pik no diretório de sua preferência. Um detalhe importante que já me custou um bom tempo é que o path completo não deve conter espaços. Execute o seguinte comando para instalar em <em>C:\Ruby\pik</em>, por exemplo:</p>
<pre class="brush: bash; title: ; notranslate">
pik_install C:\Ruby\pik
</pre>
<p>Concluída a instalação, o comando <em>pik help commands</em> exibe uma lista com os comandos disponíveis. Quem já usou o RVM não terá dificuldades, pois os comandos são bem semelhantes. Os comandos mais comuns são:</p>
<ul>
<li><em>pik install ruby/jruby/ironruby [versão]</em> -> instala a versão desejada do Ruby, JRuby ou IronRuby. A versão é opcional; se for omitida, será instalada a versão mais recente. Importante: antes de executar este comando, instale o <a href="http://www.7-zip.org/">7zip</a> e adicione-o ao path</li>
<li><em>pik list</em> -> exibe as versões de Ruby atualmente instaladas</li>
<li><em>pik use [versão]</em> -> seleciona uma versão instalada</li>
<li><em>pik gem [comando]</em> -> executa um comando do Rubygems em todas as versões instaladas</li>
<li><em>pik ruby [parâmetros]</em> -> executa Ruby em todas as versões instaladas</li>
</ul>
<p>Inicialmente, o comando <em>pik list</em> exibe apenas a versão 1.8.7:</p>
<pre class="brush: bash; title: ; notranslate">
C:\Ruby\pik&gt;pik list
* 187: ruby 1.8.7 (2011-02-18 patchlevel 334) [i386-mingw32]
</pre>
<p>Decidi instalar a última versão do Ruby e do JRuby. Após instalar estas duas versões, a saída do comando <em>pik list</em> ficou assim (o asterisco mostra a versão atualmente em uso):</p>
<pre class="brush: bash; title: ; notranslate">
C:\Ruby\pik&gt;pik install ruby
...
C:\Ruby\pik&gt;pik install jruby
...
C:\Ruby\pik&gt;pik list
  161: jruby 1.6.1 (ruby-1.8.7-p330) (2011-04-12 85838f6) (Java HotSpot(TM) Client VM 1.6.0_24) [Windows XP-x86-java]
* 187: ruby 1.8.7 (2011-02-18 patchlevel 334) [i386-mingw32]
  192: ruby 1.9.2dev (2010-05-31) [i386-mingw32]
</pre>
<p>Para selecionar o JRuby, por exemplo, use o comando <em>pik use 161</em> (é importante lembrar que neste caso os comandos mudam de nome: <em>irb</em> vira <em>jirb</em>, <em>ruby</em> vira <em>jruby</em>):</p>
<pre class="brush: bash; title: ; notranslate">
C:\Ruby\pik&gt;pik use 161

C:\Ruby\pik&gt;ruby -v
'ruby' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.

C:\Ruby\pik&gt;jruby -v
jruby 1.6.1 (ruby-1.8.7-p330) (2011-04-12 85838f6) (Java HotSpot(TM) Client VM 1.6.0_24) [Windows XP-x86-java]
</pre>
<p>Para instalar gems, basta usar o comando <em>gem install</em> normalmente. A gem será instalada na versão atual do Ruby (ou seja, a que você selecionou com o comando <em>pik use</em>). O comando <em>pik gem</em> permite instalar uma gem em todas as versões:</p>
<pre class="brush: bash; title: ; notranslate">
C:\Ruby\pik&gt;pik gem install mongo
jruby 1.6.1 (ruby-1.8.7-p330) (2011-04-12 85838f6) (Java HotSpot(TM) Client VM 1.6.0_24) [Windows XP-x86-java]

Fetching: bson-1.3.1-jruby.gem (100%)
Fetching: mongo-1.3.1.gem (100%)
Successfully installed bson-1.3.1-java
Successfully installed mongo-1.3.1
2 gems installed

ruby 1.8.7 (2011-02-18 patchlevel 334) [i386-mingw32]

Fetching: bson-1.3.1.gem (100%)
Fetching: mongo-1.3.1.gem (100%)
Successfully installed bson-1.3.1
Successfully installed mongo-1.3.1
2 gems installed
Installing ri documentation for bson-1.3.1...
Installing ri documentation for mongo-1.3.1...
Installing RDoc documentation for bson-1.3.1...
Installing RDoc documentation for mongo-1.3.1...

ruby 1.9.2dev (2010-05-31) [i386-mingw32]

Successfully installed bson-1.3.1
Successfully installed mongo-1.3.1
2 gems installed
Installing ri documentation for bson-1.3.1...
Installing ri documentation for mongo-1.3.1...
Installing RDoc documentation for bson-1.3.1...
Installing RDoc documentation for mongo-1.3.1...
</pre>
<p>O comando <em>pik ruby</em> permite executar um código em todas as versões instaladas, útil para verificar incompatibilidades entre as versões, como por exemplo <a href="http://blog.guilhermegarnier.com/2011/03/representacao-de-data-e-hora-em-ruby-1-8-7-e-1-9/">o construtor com parâmetros da classe Time</a>:</p>
<pre class="brush: bash; title: ; notranslate">
C:\Ruby\pik&gt;pik ruby -e &quot;puts Time.new('2011-01-01')&quot;
jruby 1.6.1 (ruby-1.8.7-p330) (2011-04-12 85838f6) (Java HotSpot(TM) Client VM 1.6.0_24) [Windows XP-x86-java]

ArgumentError: wrong number of arguments (1 for 0)
  (root) at -e:1

ruby 1.8.7 (2011-02-18 patchlevel 334) [i386-mingw32]

-e:1:in `initialize': wrong number of arguments (1 for 0) (ArgumentError)
        from -e:1:in `new'
        from -e:1

ruby 1.9.2dev (2010-05-31) [i386-mingw32]

2011-01-01 00:00:00 -0200
</pre>
<p>Mais detalhes sobre o funcionamento do Pik podem ser encontrados no <a href="https://github.com/vertiginous/pik">Github do projeto</a>.<br />
<h3 class='related_post_title'>Posts relacionados:</h3>
<ul class='related_post'>
<li><a href='http://blog.guilhermegarnier.com/2011/03/representacao-de-data-e-hora-em-ruby-1-8-7-e-1-9/' title='Representação de data e hora em Ruby 1.8.7 e 1.9'>Representação de data e hora em Ruby 1.8.7 e 1.9</a></li>
<li><a href='http://blog.guilhermegarnier.com/2009/06/instant-rails-o-ambiente-rails-de-bolso/' title='Instant Rails, o ambiente Rails de bolso'>Instant Rails, o ambiente Rails de bolso</a></li>
<li><a href='http://blog.guilhermegarnier.com/2011/02/ruby-no-ubuntu-erro-na-instalacao-de-rubygems/' title='Ruby no Ubuntu &#8211; erro na instalação de Rubygems'>Ruby no Ubuntu &#8211; erro na instalação de Rubygems</a></li>
<li><a href='http://blog.guilhermegarnier.com/2009/12/classes-abstratas-em-ruby/' title='Classes abstratas em Ruby?'>Classes abstratas em Ruby?</a></li>
<li><a href='http://blog.guilhermegarnier.com/2008/10/ferramenta-em-rails-para-criacao-de-blogs/' title='Ferramenta em Rails para criação de blogs'>Ferramenta em Rails para criação de blogs</a></li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/XwuiwuncxNZWawHFzGXta0jL6fM/0/da"><img src="http://feedads.g.doubleclick.net/~a/XwuiwuncxNZWawHFzGXta0jL6fM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/XwuiwuncxNZWawHFzGXta0jL6fM/1/da"><img src="http://feedads.g.doubleclick.net/~a/XwuiwuncxNZWawHFzGXta0jL6fM/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.guilhermegarnier.com/2011/05/gerenciando-multiplas-versoes-de-ruby-no-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ajude o Firefox a crescer com o Test Pilot</title>
		<link>http://blog.guilhermegarnier.com/2011/05/ajude-o-firefox-a-crescer-com-o-test-pilot/</link>
		<comments>http://blog.guilhermegarnier.com/2011/05/ajude-o-firefox-a-crescer-com-o-test-pilot/#comments</comments>
		<pubDate>Thu, 05 May 2011 11:13:35 +0000</pubDate>
		<dc:creator>guilhermegarnier</dc:creator>
				<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://blog.guilhermegarnier.com/?p=437</guid>
		<description><![CDATA[A principal característica de projetos open source é que qualquer pessoa pode contribuir com eles. Geralmente quando falamos em contribuir com este tipo de projeto, logo pensamos em código fonte &#8211; corrigir um bug ou implementar uma melhoria. Mas na verdade podemos contribuir de várias formas (para mais informações sobre o modelo open source, recomendo [...]]]></description>
			<content:encoded><![CDATA[<p>A principal característica de projetos open source é que qualquer pessoa pode contribuir com eles. Geralmente quando falamos em contribuir com este tipo de projeto, logo pensamos em código fonte &#8211; corrigir um bug ou implementar uma melhoria. Mas na verdade podemos contribuir de várias formas (para mais informações sobre o modelo open source, recomendo a leitura do famoso artigo <a href="http://www.catb.org/~esr/writings/homesteading/cathedral-bazaar/">The Cathedral and the Bazaar</a>, de Eric Raymond), mesmo sem conhecimento técnico. Outra possibilidade é através de ajuda na documentação &#8211; melhorar uma documentação incompleta ou traduzir para outras línguas. Porém, apesar de não exigir conhecimentos específicos, exige tempo, o que nem sempre as pessoas têm disponível.</p>
<p>No caso do Firefox, há uma outra forma de contribuir para o projeto, que não exige qualquer conhecimento específico. É através do <a href="https://testpilot.mozillalabs.com/">Test Pilot</a>, uma extensão que, ao ser instalada, exibe uma lista de estudos sendo conduzidos pela Mozilla. Sempre que surgir um novo estudo, você poderá ver os detalhes dele e optar por participar ou não. O estudo que acontece com mais frequencia é o <a href="https://testpilot.mozillalabs.com/testcases/aweeklife">&#8220;A Week in the Life of a Browser&#8221;</a>, onde, caso você aceite participar, durante uma semana o Test Pilot monitorará informações sobre o seu uso do browser, como memória utilizada, número de abas abertas simultaneamente, número de downloads e de bookmarks &#8211; ou seja, <a href="https://testpilot.mozillalabs.com/privacy.php">nenhuma informação sensível do usuário é coletada</a>. No final do período do estudo, esses dados são enviados para a Mozilla, mas antes você pode ver exatamente que informações serão enviadas através de gráficos como esse:</p>
<p><a href="http://blog.guilhermegarnier.com/wp-content/uploads/2011/03/testpilot-e1304592358105.jpg"><img src="http://blog.guilhermegarnier.com/wp-content/uploads/2011/03/testpilot-e1304592358105-169x300.jpg" alt="" title="testpilot" width="169" height="300" class="aligncenter size-medium wp-image-435" /></a></p>
<p>Alguns estudos são pesquisas sobre usabilidade e funcionalidades específicas, como mecanismos de busca e uso de bookmarks e dos botões na toolbar. Para ver os estudos já realizados, acesse a <a href="https://testpilot.mozillalabs.com/testcases/">página de test cases</a>. Para participar, basta <a href="https://addons.mozilla.org/pt-BR/firefox/addon/test-pilot/">instalar a extensão</a>.<br />
<h3 class='related_post_title'>Posts relacionados:</h3>
<ul class='related_post'>
<li><a href='http://blog.guilhermegarnier.com/2011/01/migrando-do-delicious-para-o-google-bookmarks/' title='Migrando do Delicious para o Google Bookmarks'>Migrando do Delicious para o Google Bookmarks</a></li>
<li><a href='http://blog.guilhermegarnier.com/2010/08/solucao-de-problema-com-o-flash-player-no-ubuntu-com-firefox-3-6-4/' title='Solução de problema com o Flash Player no Ubuntu com Firefox &gt;= 3.6.4'>Solução de problema com o Flash Player no Ubuntu com Firefox >= 3.6.4</a></li>
<li><a href='http://blog.guilhermegarnier.com/2010/06/exclusao-de-itens-individuais-do-historico-do-firefox/' title='Exclusão de itens individuais do histórico do Firefox'>Exclusão de itens individuais do histórico do Firefox</a></li>
<li><a href='http://blog.guilhermegarnier.com/2010/04/compartilhando-perfis-do-firefox-com-dual-boot/' title='Compartilhando perfis do Firefox com dual boot'>Compartilhando perfis do Firefox com dual boot</a></li>
<li><a href='http://blog.guilhermegarnier.com/2010/02/videos-com-html-5-e-a-nova-guerra-dos-browsers/' title='Vídeos com HTML 5 e a nova guerra dos browsers'>Vídeos com HTML 5 e a nova guerra dos browsers</a></li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/_40LlwvkSr-1w33WH8CHwX8RdU0/0/da"><img src="http://feedads.g.doubleclick.net/~a/_40LlwvkSr-1w33WH8CHwX8RdU0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/_40LlwvkSr-1w33WH8CHwX8RdU0/1/da"><img src="http://feedads.g.doubleclick.net/~a/_40LlwvkSr-1w33WH8CHwX8RdU0/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.guilhermegarnier.com/2011/05/ajude-o-firefox-a-crescer-com-o-test-pilot/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Representação de data e hora em Ruby 1.8.7 e 1.9</title>
		<link>http://blog.guilhermegarnier.com/2011/03/representacao-de-data-e-hora-em-ruby-1-8-7-e-1-9/</link>
		<comments>http://blog.guilhermegarnier.com/2011/03/representacao-de-data-e-hora-em-ruby-1-8-7-e-1-9/#comments</comments>
		<pubDate>Tue, 01 Mar 2011 10:57:10 +0000</pubDate>
		<dc:creator>guilhermegarnier</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[jruby]]></category>

		<guid isPermaLink="false">http://blog.guilhermegarnier.com/?p=407</guid>
		<description><![CDATA[A classe Time do Ruby é usada, como esperado, para representar uma data e hora. Existem várias formas de criar uma nova instância, a mais óbvia é usando Time.new (ou Time.now), que cria uma nova instância com a data e hora atuais: Também é possível criar uma instância usando métodos como Time.at(time), que recebe um [...]]]></description>
			<content:encoded><![CDATA[<p>A classe <a href="http://www.ruby-doc.org/core/classes/Time.html">Time</a> do Ruby é usada, como esperado, para representar uma data e hora. Existem várias formas de criar uma nova instância, a mais óbvia é usando Time.new (ou Time.now), que cria uma nova instância com a data e hora atuais:</p>
<pre class="brush: ruby; title: ; notranslate">
irb(main):007:0&gt; Time.new
=&gt; Wed Feb 09 13:23:52 -0200 2011
irb(main):008:0&gt; Time.now
=&gt; Wed Feb 09 13:23:53 -0200 2011
</pre>
<p>Também é possível criar uma instância usando métodos como <a href="http://www.ruby-doc.org/core/classes/Time.html#M000334">Time.at(time)</a>, que recebe um timestamp como parâmetro, <a href="http://www.ruby-doc.org/core/classes/Time.html#M000337">Time.local(year, month, day, hour, min, sec_with_frac)</a> e outros. Também há um construtor que recebe como parâmetro uma string representando a data:</p>
<pre class="brush: ruby; title: ; notranslate">
irb(main):001:0&gt; Time.new('2011-01-01')
=&gt; Sat Jan 01 00:00:00 -0200 2011
</pre>
<p>Eu havia escrito um código que usava esse construtor no <a href="https://github.com/ggarnier/pidgin-logs-compressor">pidgin-logs-compressor</a>, mas quando testei no <a href="http://jruby.org">JRuby</a> 1.5.5, recebi uma exceção &#8220;ArgumentError: wrong number of arguments (1 for 0)&#8221;. Achei que fosse algum bug do JRuby, e realmente <a href="http://jira.codehaus.org/browse/JRUBY-5008">havia esse bug</a> na versão que eu usava, mas já estava corrigido no JRuby 1.6RC1. Atualizei para esta versão, mas o erro continuou. Descobri que o erro que eu estava cometendo era relacionado com a versão do Ruby, e não do JRuby. Esse construtor com parâmetros é aceito no Ruby 1.9, mas não no 1.8.7, que é a versão usada por padrão pelo JRuby. Para fazer com que ele utilize a versão 1.9, basta acrescentar o parâmetro <em>&#8211;1.9</em> na linha de comando:</p>
<pre class="brush: ruby; title: ; notranslate">
jruby --1.9 -e 'puts Time.new(&quot;2011-02-16&quot;)'
</pre>
<p>Para manter compatibilidade com versões anteriores, é necessário usar algum dos outros métodos, como eu optei por fazer no <a href="https://github.com/ggarnier/pidgin-logs-compressor">pidgin-logs-compressor</a>.</p>
<p>Para um overview de algumas novidades do Ruby 1.9: <a href="http://www.igvita.com/2011/02/03/new-ruby-19-features-tips-tricks/">New Ruby 1.9 Features, Tips &#038; Tricks</a>.<br />
<h3 class='related_post_title'>Posts relacionados:</h3>
<ul class='related_post'>
<li><a href='http://blog.guilhermegarnier.com/2011/02/ruby-no-ubuntu-erro-na-instalacao-de-rubygems/' title='Ruby no Ubuntu &#8211; erro na instalação de Rubygems'>Ruby no Ubuntu &#8211; erro na instalação de Rubygems</a></li>
<li><a href='http://blog.guilhermegarnier.com/2009/12/classes-abstratas-em-ruby/' title='Classes abstratas em Ruby?'>Classes abstratas em Ruby?</a></li>
<li><a href='http://blog.guilhermegarnier.com/2009/06/instant-rails-o-ambiente-rails-de-bolso/' title='Instant Rails, o ambiente Rails de bolso'>Instant Rails, o ambiente Rails de bolso</a></li>
<li><a href='http://blog.guilhermegarnier.com/2008/10/ferramenta-em-rails-para-criacao-de-blogs/' title='Ferramenta em Rails para criação de blogs'>Ferramenta em Rails para criação de blogs</a></li>
<li><a href='http://blog.guilhermegarnier.com/2008/06/rails-sem-banco-de-dados/' title='Rails sem banco de dados'>Rails sem banco de dados</a></li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/p7HgEGVQ2uHYqBvhjE2LWQQqmRQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/p7HgEGVQ2uHYqBvhjE2LWQQqmRQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/p7HgEGVQ2uHYqBvhjE2LWQQqmRQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/p7HgEGVQ2uHYqBvhjE2LWQQqmRQ/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.guilhermegarnier.com/2011/03/representacao-de-data-e-hora-em-ruby-1-8-7-e-1-9/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ruby no Ubuntu – erro na instalação de Rubygems</title>
		<link>http://blog.guilhermegarnier.com/2011/02/ruby-no-ubuntu-erro-na-instalacao-de-rubygems/</link>
		<comments>http://blog.guilhermegarnier.com/2011/02/ruby-no-ubuntu-erro-na-instalacao-de-rubygems/#comments</comments>
		<pubDate>Mon, 21 Feb 2011 10:59:25 +0000</pubDate>
		<dc:creator>guilhermegarnier</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[rubygem]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.guilhermegarnier.com/?p=404</guid>
		<description><![CDATA[Dica rápida de Ruby: se ao tentar instalar uma Rubygem no Ubuntu você receber uma mensagem como essa: A solução é simples: basta instalar o pacote ruby-dev: sudo apt-get install ruby-dev. Este pacote é necessário para a instalação de gems nativas, que precisam ser compiladas na instalação. Posts relacionados: Instant Rails, o ambiente Rails de [...]]]></description>
			<content:encoded><![CDATA[<p>Dica rápida de Ruby: se ao tentar instalar uma <a href="http://rubygems.org">Rubygem</a> no Ubuntu você receber uma mensagem como essa:</p>
<pre class="brush: bash; title: ; notranslate">
guilherme@guilherme-desktop:~$ sudo gem install mechanize
Building native extensions.  This could take a while...
ERROR:  Error installing mechanize:
    ERROR: Failed to build gem native extension.

/usr/bin/ruby1.8 extconf.rb
extconf.rb:5:in `require': no such file to load -- mkmf (LoadError)
    from extconf.rb:5
</pre>
<p>A solução é simples: basta instalar o pacote ruby-dev: <em>sudo apt-get install ruby-dev</em>. Este pacote é necessário para a instalação de gems nativas, que precisam ser compiladas na instalação.<br />
<h3 class='related_post_title'>Posts relacionados:</h3>
<ul class='related_post'>
<li><a href='http://blog.guilhermegarnier.com/2009/06/instant-rails-o-ambiente-rails-de-bolso/' title='Instant Rails, o ambiente Rails de bolso'>Instant Rails, o ambiente Rails de bolso</a></li>
<li><a href='http://blog.guilhermegarnier.com/2011/03/representacao-de-data-e-hora-em-ruby-1-8-7-e-1-9/' title='Representação de data e hora em Ruby 1.8.7 e 1.9'>Representação de data e hora em Ruby 1.8.7 e 1.9</a></li>
<li><a href='http://blog.guilhermegarnier.com/2010/12/ubuntu-netbook-remix-no-hp-mini/' title='Ubuntu Netbook Remix no HP Mini'>Ubuntu Netbook Remix no HP Mini</a></li>
<li><a href='http://blog.guilhermegarnier.com/2010/08/solucao-de-problema-com-o-flash-player-no-ubuntu-com-firefox-3-6-4/' title='Solução de problema com o Flash Player no Ubuntu com Firefox &gt;= 3.6.4'>Solução de problema com o Flash Player no Ubuntu com Firefox >= 3.6.4</a></li>
<li><a href='http://blog.guilhermegarnier.com/2009/12/classes-abstratas-em-ruby/' title='Classes abstratas em Ruby?'>Classes abstratas em Ruby?</a></li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/4s8lp4L0OWkFH8Y8CRvsy6efOwg/0/da"><img src="http://feedads.g.doubleclick.net/~a/4s8lp4L0OWkFH8Y8CRvsy6efOwg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/4s8lp4L0OWkFH8Y8CRvsy6efOwg/1/da"><img src="http://feedads.g.doubleclick.net/~a/4s8lp4L0OWkFH8Y8CRvsy6efOwg/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.guilhermegarnier.com/2011/02/ruby-no-ubuntu-erro-na-instalacao-de-rubygems/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Migrando do Delicious para o Google Bookmarks</title>
		<link>http://blog.guilhermegarnier.com/2011/01/migrando-do-delicious-para-o-google-bookmarks/</link>
		<comments>http://blog.guilhermegarnier.com/2011/01/migrando-do-delicious-para-o-google-bookmarks/#comments</comments>
		<pubDate>Wed, 12 Jan 2011 10:21:16 +0000</pubDate>
		<dc:creator>guilhermegarnier</dc:creator>
				<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Bookmarks]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Delicious]]></category>

		<guid isPermaLink="false">http://blog.guilhermegarnier.com/?p=387</guid>
		<description><![CDATA[Alguns anos atrás, comecei a sentir necessidade de manter meus bookmarks sincronizados entre os diversos computadores que eu utilizava. Até que conheci o Delicious. Isso foi em 2007, e desde então eu comecei a usá-lo constantemente. Cada vez que eu usava o Firefox em algum computador pela primeira vez, a primeira extensão que eu instalava [...]]]></description>
			<content:encoded><![CDATA[<p>Alguns anos atrás, comecei a sentir necessidade de manter meus bookmarks sincronizados entre os diversos computadores que eu utilizava. Até que conheci o <a href="http://www.delicious.com">Delicious</a>. Isso foi em 2007, e desde então eu comecei a usá-lo constantemente. Cada vez que eu usava o Firefox em algum computador pela primeira vez, a primeira extensão que eu instalava era <a href="https://addons.mozilla.org/en-US/firefox/addon/3615/">a do Delicious</a>. Através desta extensão, um simples Control+D abre a janela para adicionar a página atual ao seus bookmarks do Delicious, e Control+B abre a barra lateral com seus bookmarks, organizados por tags.</p>
<p>Há alguns meses, eu havia pensado em migrar meus bookmarks para o <a href="http://www.google.com/bookmarks">Google Bookmarks</a>, mas desisti, pois eu já estava bastante acostumado com o Delicious. Até que no início de dezembro veio a bomba: o Yahoo, que havia comprado o Delicious em 2005, <a href="http://techcrunch.com/2010/12/16/is-yahoo-shutting-down-del-icio-us/">anunciou que encerraria o serviço</a>! Imediatamente comecei a pensar em alternativas, e o Google Bookmarks foi minha primeira opção. Alguns dias depois, o <a href="http://techcrunch.com/2010/12/17/yahoo-trying-to-sell-del-icio-us-not-to-shut-it-down/">Yahoo voltou à cena informando que iria vender, e não fechar o serviço</a>, e o próprio <a href="http://blog.delicious.com/blog/2010/12/whats-next-for-delicious.html">Delicious publicou uma nota sobre o assunto</a>. Mas, mesmo assim, para mim foi a deixa para fazer a migração para outro serviço. Apesar de existirem <a href="http://bookshop.livejournal.com/1080038.html">várias alternativas ao Delicious</a>, escolhi o Google Bookmarks pela simplicidade, e por já estar integrado à minha conta no Google.</p>
<p>A primeira parte da migração foi fácil: exportar os bookmarks do Delicious, através da opção Settings -> <a href="https://secure.delicious.com/settings/bookmarks/export">Export/Backup Bookmarks</a>. Para <a href="http://www.google.com/support/bookmarks/bin/answer.py?answer=178166">importá-los no Google Bookmarks</a>, uma das maneiras mais simples é importar os bookmarks do Delicious no Firefox e sincronizá-los com o <a href="http://www.toolbar.google.com/">Google Toolbar</a>. Também é possível fazer a importação usando o <a href="http://www.google.com/chrome">Google Chrome</a>, ou usar algum script (como <a href="http://blog.darkhax.com/2010/12/16/import-delicious-to-google-bookmarks">este</a>) ou serviço, como o <a href="http://delicious-export.appspot.com/">del.icio.us to Google Bookmarks</a>.</p>
<p>Em seguida, procurei as opções para integração com o browser (adicionar e pesquisar nos bookmarks). No Firefox existem diversas extensões para Google Bookmarks. Testei algumas, e a que achei melhor foi o <a href="https://addons.mozilla.org/pt-BR/firefox/addon/2888/">GMarks</a>. Com ela, é possível adicionar bookmarks com Control+D, de forma bem semelhante à extensão do Delicious, e também há uma barra lateral, acionada com Alt+M. Porém, não há integração com a barra de endereços, ou seja, não é possível pesquisar nos bookmarks digitando diretamente o endereço (como permitem as versões mais recentes da extensão do Delicious). Porém, há duas maneiras de pesquisar (além de acessar diretamente a página do Google Bookmarks para fazer a pesquisa):</p>
<ol>
<li>Ao digitar a tecla Home duas vezes, aparecerá uma caixa de texto para pesquisa. É só digitar qualquer coisa e depois escolher um resultado e apertar Enter (ou Alt+Enter para abrir em outra aba)</li>
<li>Criando um atalho para a busca: acesse o <a href="https://www.google.com/bookmarks">Google Bookmarks</a>, clique com o botão direito sobre o campo de busca e selecione a opção &#8220;Add a keyword for this search&#8221;. O Firefox adicionará a pesquisa nos bookmarks locais, e você poderá adicionar um keyword a este bookmark. Digite &#8220;gb&#8221;, por exemplo, e clique em OK. Agora, ao digitar qualquer texto precedido desta keyword na barra de endereços (por exemplo: &#8220;gb teste&#8221;), o Firefox pesquisará este texto no Google Bookmarks. Mas os resultados não aparecem diretamente, você precisa escolher a opção &#8220;Search Google Bookmarks&#8221; entre as sugestões que aparecem</li>
</ol>
<p>Para <a href="http://metaed.blogspot.com/2008/12/using-google-bookmarks-in-google-chrome.html">integrar o Google Bookmarks ao Chrome</a> é ainda mais simples, pois não é necessário instalar qualquer extensão (afinal, ambos são do Google). Para adicionar bookmarks, acesse a <a href="http://www.google.com/support/chrome/bin/answer.py?hl=en&#038;answer=100215">página de ajuda</a>. Ela disponibiliza um botão que pode ser arrastado para a barra de bookmarks, e ao clicar nele, a página atual será adicionada. Para adicionar a pesquisa no Google Bookmarks à barra de endereços, clique na barra com o botão direito, selecione &#8220;Edit search engines&#8221; e adicione um novo, com as seguintes configurações:<br />
<strong>Nome:</strong> Google Bookmarks<br />
<strong>Keyword:</strong> gb<br />
<strong>URL:</strong> http://google.com/bookmarks/find?&#038;q=%s</p>
<p>Agora, a pesquisa integrada à barra de endereços funcionará da mesma forma que no Firefox (&#8220;gb texto para pesquisa&#8221;).<br />
<h3 class='related_post_title'>Posts relacionados:</h3>
<ul class='related_post'>
<li><a href='http://blog.guilhermegarnier.com/2011/05/ajude-o-firefox-a-crescer-com-o-test-pilot/' title='Ajude o Firefox a crescer com o Test Pilot'>Ajude o Firefox a crescer com o Test Pilot</a></li>
<li><a href='http://blog.guilhermegarnier.com/2010/08/solucao-de-problema-com-o-flash-player-no-ubuntu-com-firefox-3-6-4/' title='Solução de problema com o Flash Player no Ubuntu com Firefox &gt;= 3.6.4'>Solução de problema com o Flash Player no Ubuntu com Firefox >= 3.6.4</a></li>
<li><a href='http://blog.guilhermegarnier.com/2010/06/exclusao-de-itens-individuais-do-historico-do-firefox/' title='Exclusão de itens individuais do histórico do Firefox'>Exclusão de itens individuais do histórico do Firefox</a></li>
<li><a href='http://blog.guilhermegarnier.com/2010/04/compartilhando-perfis-do-firefox-com-dual-boot/' title='Compartilhando perfis do Firefox com dual boot'>Compartilhando perfis do Firefox com dual boot</a></li>
<li><a href='http://blog.guilhermegarnier.com/2010/02/videos-com-html-5-e-a-nova-guerra-dos-browsers/' title='Vídeos com HTML 5 e a nova guerra dos browsers'>Vídeos com HTML 5 e a nova guerra dos browsers</a></li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/KgFodIeWQZ_z3Ar9bY6VWy886GA/0/da"><img src="http://feedads.g.doubleclick.net/~a/KgFodIeWQZ_z3Ar9bY6VWy886GA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/KgFodIeWQZ_z3Ar9bY6VWy886GA/1/da"><img src="http://feedads.g.doubleclick.net/~a/KgFodIeWQZ_z3Ar9bY6VWy886GA/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.guilhermegarnier.com/2011/01/migrando-do-delicious-para-o-google-bookmarks/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Ubuntu Netbook Remix no HP Mini</title>
		<link>http://blog.guilhermegarnier.com/2010/12/ubuntu-netbook-remix-no-hp-mini/</link>
		<comments>http://blog.guilhermegarnier.com/2010/12/ubuntu-netbook-remix-no-hp-mini/#comments</comments>
		<pubDate>Mon, 20 Dec 2010 10:21:35 +0000</pubDate>
		<dc:creator>guilhermegarnier</dc:creator>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[netbook]]></category>

		<guid isPermaLink="false">http://blog.guilhermegarnier.com/?p=378</guid>
		<description><![CDATA[Outro dia um amigo me pediu para instalar o Ubuntu no netbook dele, um HP Mini (não lembro exatamente qual modelo). Baixei o Ubuntu Netbook Remix 10.10 e instalei no pen drive, seguindo as instruções que aparecem na página de download. Em seguida, fiz o boot pelo pen drive e iniciei a instalação. Tudo ia [...]]]></description>
			<content:encoded><![CDATA[<p>Outro dia um amigo me pediu para instalar o Ubuntu no netbook dele, um HP Mini (não lembro exatamente qual modelo). Baixei o <a href="http://www.ubuntu.com/netbook">Ubuntu Netbook Remix 10.10</a> e instalei no pen drive, seguindo as instruções que aparecem na <a href="http://www.ubuntu.com/netbook/get-ubuntu/download">página de download</a>. Em seguida, fiz o boot pelo pen drive e iniciei a instalação. Tudo ia bem até que em determinado momento recebi uma mensagem de erro. Não lembro qual era a mensagem, mas parecia ser algo relacionado a disco. Tentei novamente e o erro se repetiu.</p>
<p>Em seguida, lembrei que quando eu havia instalado este mesmo sistema operacional num outro netbook HP Mini, mas a versão do Ubuntu era 10.04. Como a página principal do Ubuntu só disponibiliza links para download da última versão, encontrei as versões anteriores na página <a href="http://releases.ubuntu.com/">Ubuntu Releases</a>. Na página específica da <a href="http://releases.ubuntu.com/lucid/">versão 10.04 (Lucid Lynx)</a> o link aparece como <a href="http://releases.ubuntu.com/lucid/ubuntu-10.04-netbook-i386.iso">PC (Intel x86) netbook live CD</a>.</p>
<p>Após baixar esta versão e instalá-la no pen drive, tudo funcionou. Aparentemente é algum problema relacionado com a versão 10.10 mesmo. Tudo funciona de primeira, sem necessitar qualquer configuração (bluetooth, som, webcam, etc.), exceto o wifi. A página <a href="https://wiki.ubuntu.com/HardwareSupport/Machines/Netbooks">Hardware support</a> do wiki do Ubuntu traz a solução: basta conectar o netbook à Internet via porta Ethernet e reinstalar o driver <em>bcmwl</em>, digitando no terminal: <em>sudo apt-get install bcmwl-kernel-source</em>. Após a instalação, reinicie o netbook e tudo funcionará.<br />
<h3 class='related_post_title'>Posts relacionados:</h3>
<ul class='related_post'>
<li><a href='http://blog.guilhermegarnier.com/2011/02/ruby-no-ubuntu-erro-na-instalacao-de-rubygems/' title='Ruby no Ubuntu &#8211; erro na instalação de Rubygems'>Ruby no Ubuntu &#8211; erro na instalação de Rubygems</a></li>
<li><a href='http://blog.guilhermegarnier.com/2010/08/solucao-de-problema-com-o-flash-player-no-ubuntu-com-firefox-3-6-4/' title='Solução de problema com o Flash Player no Ubuntu com Firefox &gt;= 3.6.4'>Solução de problema com o Flash Player no Ubuntu com Firefox >= 3.6.4</a></li>
<li><a href='http://blog.guilhermegarnier.com/2008/11/matrix-rodando-no-windows/' title='Matrix rodando no Windows'>Matrix rodando no Windows</a></li>
<li><a href='http://blog.guilhermegarnier.com/2008/11/script-para-verificar-o-status-da-conexao-pppoe/' title='Script para verificar o status da conexão PPPoE'>Script para verificar o status da conexão PPPoE</a></li>
<li><a href='http://blog.guilhermegarnier.com/2008/06/instalacao-do-firefox-30-no-ubuntu/' title='Instalação do Firefox 3.0 no Ubuntu'>Instalação do Firefox 3.0 no Ubuntu</a></li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/KGLMCNKuXMjsL88ITVxGB_ZakF0/0/da"><img src="http://feedads.g.doubleclick.net/~a/KGLMCNKuXMjsL88ITVxGB_ZakF0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/KGLMCNKuXMjsL88ITVxGB_ZakF0/1/da"><img src="http://feedads.g.doubleclick.net/~a/KGLMCNKuXMjsL88ITVxGB_ZakF0/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.guilhermegarnier.com/2010/12/ubuntu-netbook-remix-no-hp-mini/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resumo do Dev in Rio 2010</title>
		<link>http://blog.guilhermegarnier.com/2010/10/resumo-do-dev-in-rio-2010/</link>
		<comments>http://blog.guilhermegarnier.com/2010/10/resumo-do-dev-in-rio-2010/#comments</comments>
		<pubDate>Fri, 29 Oct 2010 10:36:01 +0000</pubDate>
		<dc:creator>guilhermegarnier</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[dev in rio]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.guilhermegarnier.com/?p=364</guid>
		<description><![CDATA[No dia 09 de outubro aconteceu o Dev in Rio 2010. Como a edição de 2009 foi muito boa, a expectativa para a deste ano era alta. E foi correspondida! Desta vez foram duas salas com palestras acontecendo simultaneamente. Eu fiquei na sala 2, onde assisti às seguintes palestras: HTML 5 e as novas JS [...]]]></description>
			<content:encoded><![CDATA[<p>No dia 09 de outubro aconteceu o <a href="http://www.devinrio.com.br/">Dev in Rio 2010</a>. Como <a href="http://blog.guilhermegarnier.com/2009/09/resumo-do-dev-in-rio/">a edição de 2009 foi muito boa</a>, a expectativa para a deste ano era alta. E foi correspondida! Desta vez foram duas salas com palestras acontecendo simultaneamente. Eu fiquei na sala 2, onde assisti às seguintes palestras:</p>
<ul>
<li>HTML 5 e as novas JS APIs &#8211; <a href="http://yayquery.com.br/">Leonardo Balter</a></li>
<p>Na primeira palestra foram apresentadas as principais APIs do HTML5. A palestra foi bem interessante, apesar de bastante prejudicada pela falta de WiFi no local, o que impediu que o palestrante mostrasse os vários exemplos que ele tinha preparado.</p>
<li>NodeJS &#8211; a performance que eu sempre quis ter &#8211; <a href="http://codificando.com/">Emerson Macedo</a></li>
<p>A palestra do Emerson foi excelente. Ele apresentou o problema de bloqueio de I/O no acesso a banco de dados, que é um dos principais gargalos no desempenho para a maioria das linguagens de programação. O <a href="http://nodejs.org/">NodeJS</a> ajuda a resolver este problema pois usa Javascript, que é uma linguagem orientada a eventos. No final da apresentação, ele divulgou o <a href="http://nodecasts.org/">Nodecasts</a>, site de screencasts sobre NodeJS que ele acaba de criar. A apresentação está disponível no <a href="http://codificando.com/2010/10/devinrio-nodecasts/">blog do Emerson</a>.</p>
<li>Lightning Talks</li>
<p>Após o almoço, foi disponibilizado um horário para lightning talks, pequenas apresentações de 5 minutos para quem tivesse algo interessante para mostrar. Como o tempo foi curto, foram apenas duas apresentações: a primeira sobre desenvolvimento de aplicações Python para celular e outra sobre a Apache Foundation.</p>
<li>Symfony &#8211; OO PHP para gente grande &#8211; <a href="http://lsouza.pro.br/">Luã de Souza</a></li>
<p>Nesta palestra, foi apresentado o <a href="http://www.symfony-project.org/">Symfony</a>, um framework PHP para desenvolvimento web que vem crescendo bastante. É um framework MVC que, a exemplo de praticamente qualquer framework atual, inspira-se no Rails para simplificar o desenvolvimento de aplicações web.</p>
<li>Refactoring &#8211; Porque apenas fazer funcionar não é o suficiente &#8211; <a href="http://caikesouza.com/">Caike Souza</a></li>
<p>Esta foi uma das melhores palestras do evento. Caike Souza falou sobre refactoring &#8211; destacando que não existe refactoring sem testes -, apresentou as principais vantagens e alguns exemplos práticos em Ruby.</p>
<li>Arquitetura: cansado da mesmice? &#8211; <a href="http://blog.caelum.com.br/">Guilherme Silveira</a></li>
<p>Apesar do título não deixar claro, esta palestra foi direcionada a arquitetura com serviços Restful. Como todas as palestras dele, Guilherme Silveira foi bastante claro, mostrando as vantagens de uma arquitetura voltada para serviços, que vai além da simples troca de arquivos XML entre aplicações. Ele mostrou um exemplo bem interessante, sobre integração entre sites de viagens, reserva de hotéis e calendário, onde o compartilhamento de recursos permite que uma aplicação acesse diretamente os serviços de outra. Mais detalhes no <a href="http://blog.caelumobjects.com/2010/10/01/hypermedia-and-dependency-injection-a-lesson-not-to-be-forgotten/">post que ele escreveu no blog da Caelum</a>.</p>
<li>Testes unitários em JavaScript: usar ou não usar mock? &#8211; Márcio Santana</li>
<p>Na última palestra, foram apresentadas ferramentas para testes de código Javascript. Esta palestra também foi muito interessante, pois testes de Javascript são muito pouco comuns, mas não deveriam, já que Javascript também é código, e as aplicações web atuais possuem uma quantidade cada vez maior de código Javascript, principalmente para manipular interações com os usuários. Além do <a href="http://docs.jquery.com/Qunit">QUnit</a> &#8211; framework para testar Javascript -, foram apresentadas bibliotecas de mock, como o <a href="http://github.com/felipesilva/Chameleon">Chameleon</a>.
</ul>
<p>Enquanto isso, na sala 1 ocorreram palestras sobre Arduino, empreendedorismo, Scum e Ruby.</p>
<p>Apesar de tudo, o evento teve alguns problemas de organização. Além da já citada indisponibilidade de WiFi, as duas salas ficavam em andares diferentes, e o coffee break era ao lado da sala 1, o que dificultava o deslocamento. Num determinado momento, a palestra da sala 2 terminou e todos desceram para o andar da sala 1 para o coffee break, porém não podíamos entrar, pois a palestra não havia terminado. Apesar destes pequenos problemas, o Dev in Rio deste ano manteve a qualidade da primeira edição. Agora, ficamos aguardando a edição de 2011!<br />
<h3 class='related_post_title'>Posts relacionados:</h3>
<ul class='related_post'>
<li><a href='http://blog.guilhermegarnier.com/2009/09/resumo-do-dev-in-rio/' title='Resumo do Dev in Rio'>Resumo do Dev in Rio</a></li>
<li><a href='http://blog.guilhermegarnier.com/2009/08/dev-in-rio-eu-vou/' title='Dev in Rio &#8211; eu vou!'>Dev in Rio &#8211; eu vou!</a></li>
<li><a href='http://blog.guilhermegarnier.com/2009/12/classes-abstratas-em-ruby/' title='Classes abstratas em Ruby?'>Classes abstratas em Ruby?</a></li>
<li><a href='http://blog.guilhermegarnier.com/2009/06/instant-rails-o-ambiente-rails-de-bolso/' title='Instant Rails, o ambiente Rails de bolso'>Instant Rails, o ambiente Rails de bolso</a></li>
<li><a href='http://blog.guilhermegarnier.com/2009/01/extensoes-do-firefox-recomendadas-para-desenvolvedores-web/' title='Extensões do Firefox recomendadas para desenvolvedores web'>Extensões do Firefox recomendadas para desenvolvedores web</a></li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/_Izsc3V8xZUOzfiFEGSwfwdBnSM/0/da"><img src="http://feedads.g.doubleclick.net/~a/_Izsc3V8xZUOzfiFEGSwfwdBnSM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/_Izsc3V8xZUOzfiFEGSwfwdBnSM/1/da"><img src="http://feedads.g.doubleclick.net/~a/_Izsc3V8xZUOzfiFEGSwfwdBnSM/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.guilhermegarnier.com/2010/10/resumo-do-dev-in-rio-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solução de problema com o Flash Player no Ubuntu com Firefox &gt;= 3.6.4</title>
		<link>http://blog.guilhermegarnier.com/2010/08/solucao-de-problema-com-o-flash-player-no-ubuntu-com-firefox-3-6-4/</link>
		<comments>http://blog.guilhermegarnier.com/2010/08/solucao-de-problema-com-o-flash-player-no-ubuntu-com-firefox-3-6-4/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 11:03:03 +0000</pubDate>
		<dc:creator>guilhermegarnier</dc:creator>
				<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.guilhermegarnier.com/?p=349</guid>
		<description><![CDATA[Desde a versão 3.6.4, o Firefox possui um recurso chamado Crash protection (somente para Windows e Linux). Agora o browser cria um processo à parte chamado plugin-container para execução dos plugins do Flash, QuickTime e Silverlight. O objetivo é impedir que um erro na execução de um destes plugins trave o browser &#8211; caso isto [...]]]></description>
			<content:encoded><![CDATA[<p>Desde a versão 3.6.4, o Firefox possui um recurso chamado <a href="https://wiki.mozilla.org/Firefox/Crash_Protection">Crash protection</a> (somente para Windows e Linux). Agora o browser cria um processo à parte chamado <em>plugin-container</em> para execução dos plugins do Flash, QuickTime e Silverlight. O objetivo é impedir que um erro na execução de um destes plugins trave o browser &#8211; caso isto ocorra, somente o plugin será interrompido.</p>
<p>Depois que atualizei o Firefox para esta versão &#8211; na verdade, atualizei diretamente do 3.6.3 para o 3.6.6 &#8211; no Ubuntu 10.04, o Flash simplesmente parou de funcionar, exibindo a mensagem <a href="http://support.mozilla.com/en-US/kb/The+Adobe+Flash+plugin+has+crashed">&#8220;The Adobe Flash plugin has crashed&#8221;</a>. Tentei reinstalar o Flash diversas vezes, tanto pelos pacotes <em>adobe-flashplugin</em> e <em>flashplugin-installer</em> usando o apt-get quando baixando um arquivo .deb diretamente. A página <a href="http://www.mozilla.com/pt-BR/plugincheck/">plugin check</a> informava que o Flash estava instalado, porém com uma versão desatualizada (9.x). Também tentei reinstalar o Firefox e nada.</p>
<p>Depois de alguns dias de tentativas frustradas, finalmente tive a ideia de testar com outro browser. Pelo Chrome o Flash funcionava perfeitamente, ou seja, o problema estava diretamente relacionado com o Firefox.</p>
<p>Após mais algumas pesquisas, encontrei o artigo <a href="http://kb.mozillazine.org/Plugin-container_and_out-of-process_plugins">Plugin-container and out-of-process plugins</a>. Descobri que há um parâmetro na configuração do Firefox (digite <em>about:config</em> na barra de endereços para acessá-la) chamado <em>dom.ipc.plugins.enabled</em> que permite habilitar ou desabilitar o crash protection para plugins de terceiros. Este parâmetro serve para qualquer plugin não especificado, e o valor padrão é <em>false</em>. Há um parâmetro específico para o plugin do Flash: no Linux é o <em>dom.ipc.plugins.enabled.libflashplayer.so</em>, e no Windows é <em>dom.ipc.plugins.enabled.npswf32.dll</em>. Este parâmetro tem o valor padrão <em>true</em>; depois que mudei para <em>false</em>, o Flash passou a funcionar na maioria dos sites; porém, os <a href="http://video.globo.com">vídeos da Globo.com</a>, por exemplo, continuaram não funcionando, mas passaram a exibir uma mensagem dizendo que o Flash estava desatualizado.</p>
<p>Para descobrir mais informações sobre os plugins, digitei <em>about:plugins</em> na barra de endereços. <a href="http://kb.mozillazine.org/About:plugins">A página que apareceu</a> mostrou duas versões de Flash instaladas: uma era a mais recente (10.x) e a outra estava desatualizada (9.x). Porém, esta tela não mostrava a localização de cada plugin. Para descobrir o path completo para cada plugin, voltei para a tela de configuração (<em>about:config</em>) e alterei o valor do parâmetro <em>plugin.expose_full_path</em> para <em>true</em>. Agora, a tela do <em>about:plugins</em> passa a exibir o path de cada plugin instalado.</p>
<p>Desta forma, descobri que havia uma versão mais antiga do Flash instalada no meu home (em <em>/home/guilherme/.mozilla/plugins/libflashplayer.so</em>). Não sei a ordem em que o Firefox procura os plugins, mas aparentemente este estava sendo utilizado em vez do mais atual, que fica em <em>/usr/lib/flashplugin-installer/libflashplayer.so</em>. Removi a versão que estava no home e o Flash voltou a funcionar perfeitamente, inclusive depois de reativar o crash protection.</p>
<p>Outras referências úteis não citadas:</p>
<ul>
<li><a href="http://kb.mozillazine.org/Flash">Flash &#8211; MozillaZine Knowledge Base</a></li>
<li><a href="http://support.mozilla.com/pt-BR/kb/Managing+the+Flash+plugin?bl=n">Managing the Flash plugin </a></li>
</ul>
<h3 class='related_post_title'>Posts relacionados:</h3>
<ul class='related_post'>
<li><a href='http://blog.guilhermegarnier.com/2008/06/instalacao-do-firefox-30-no-ubuntu/' title='Instalação do Firefox 3.0 no Ubuntu'>Instalação do Firefox 3.0 no Ubuntu</a></li>
<li><a href='http://blog.guilhermegarnier.com/2011/02/ruby-no-ubuntu-erro-na-instalacao-de-rubygems/' title='Ruby no Ubuntu &#8211; erro na instalação de Rubygems'>Ruby no Ubuntu &#8211; erro na instalação de Rubygems</a></li>
<li><a href='http://blog.guilhermegarnier.com/2010/12/ubuntu-netbook-remix-no-hp-mini/' title='Ubuntu Netbook Remix no HP Mini'>Ubuntu Netbook Remix no HP Mini</a></li>
<li><a href='http://blog.guilhermegarnier.com/2010/04/compartilhando-perfis-do-firefox-com-dual-boot/' title='Compartilhando perfis do Firefox com dual boot'>Compartilhando perfis do Firefox com dual boot</a></li>
<li><a href='http://blog.guilhermegarnier.com/2008/11/matrix-rodando-no-windows/' title='Matrix rodando no Windows'>Matrix rodando no Windows</a></li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/dsNKCUDBJfEpOkF5z67ORwE0pxs/0/da"><img src="http://feedads.g.doubleclick.net/~a/dsNKCUDBJfEpOkF5z67ORwE0pxs/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/dsNKCUDBJfEpOkF5z67ORwE0pxs/1/da"><img src="http://feedads.g.doubleclick.net/~a/dsNKCUDBJfEpOkF5z67ORwE0pxs/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.guilhermegarnier.com/2010/08/solucao-de-problema-com-o-flash-player-no-ubuntu-com-firefox-3-6-4/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

