<?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:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Guilherme Garnier</title>
	<atom:link href="http://ggarnier.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://ggarnier.wordpress.com</link>
	<description>Desenvolvimento de Software e Open Source</description>
	<pubDate>Thu, 08 May 2008 18:57:37 +0000</pubDate>
	<generator>http://wordpress.org/?v=MU</generator>
	<language>pt-br</language>
			<item>
		<title>O poder do Ruby</title>
		<link>http://ggarnier.wordpress.com/2008/05/08/o-poder-do-ruby/</link>
		<comments>http://ggarnier.wordpress.com/2008/05/08/o-poder-do-ruby/#comments</comments>
		<pubDate>Thu, 08 May 2008 18:57:37 +0000</pubDate>
		<dc:creator>ggarnier</dc:creator>
		
		<category><![CDATA[Programação]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[algoritmos]]></category>

		<guid isPermaLink="false">http://ggarnier.wordpress.com/?p=23</guid>
		<description><![CDATA[Muito se fala das vantagens do Ruby sobre muitas das linguagens atuais, por ser uma linguagem de altíssimo nível. Mas muitas vezes não percebemos grandes diferenças entre as linguagens, além das usuais diferenças de sintaxe - se as linhas de comando precisam de ponto-e-vírgula no final, se as variáveis precisam de $ no início do [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Muito se fala das vantagens do Ruby sobre muitas das linguagens atuais, por ser uma <a href="http://darynholmes.wordpress.com/2008/04/07/very-high-level-language-%E2%80%93-so-what/">linguagem de altíssimo nível</a>. Mas muitas vezes não percebemos grandes diferenças entre as linguagens, além das usuais diferenças de sintaxe - se as linhas de comando precisam de ponto-e-vírgula no final, se as variáveis precisam de $ no início do nome, se estas são tipadas ou não, se precisam ser declaradas ou não, etc. Porém, em algumas situações específicas, enxergamos o verdadeiro poder do Ruby.</p>
<p>Hoje precisei implementar uma paginação de resultados de busca. Eu sei que existem plugins para Rails que <a href="http://errtheblog.com/posts/47-i-will-paginate">simplificam esta tarefa</a>, porém como esta busca não é feita no banco de dados, e sim através de um indexador que já retorna resultados paginados, optamos por fazer manualmente a lista de links para as páginas.</p>
<p>Por exemplo: ao realizar uma busca, são exibidos os 10 primeiros resultados, com um link para a próxima página e a lista de links para cada página. Como o número de páginas, teoricamente, não tem limite, fiz o seguinte:</p>
<ul>
<li>caso o resultado tenha até 10 páginas, todas são exibidas</li>
<li>caso o resultado tenha mais de 10 páginas, são exibidas apenas 10, sendo que:</li>
<ul>
<li>caso a página atual seja uma das 6 primeiras, exibe os links para as páginas 1 a 10</li>
<li>caso a página atual seja maior que 6, exibe da página atual - 5 até a página atual + 4</li>
<li>caso a página atual seja uma das 10 últimas, exibe as 10 últimas</li>
</ul>
</ul>
<p>Pela descrição acima, percebemos que é uma lógica bem simples, porém meio chata para ser implementada - na maioria das linguagens atuais, isto exigiria um grande número de if&#8217;s aninhados, para verificarmos se as condições descritas acima são atendidas. Porém, em Ruby o código ficou muito simples e enxuto:</p>
<pre name="code" class="ruby">

if (num_pages &gt; 1)
  page_start = [1, page-5].max
  page_end = [num_pages, page+4].min
  if num_pages &gt; 10
    page_start = [page_start, num_pages-9].min
    page_end = [page_end, 10].max
  end
  page_start.upto(page_end) {|p|
    # Exibe os links
  }
end
</pre>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ggarnier.wordpress.com/23/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ggarnier.wordpress.com/23/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ggarnier.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ggarnier.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ggarnier.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ggarnier.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ggarnier.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ggarnier.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ggarnier.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ggarnier.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ggarnier.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ggarnier.wordpress.com/23/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ggarnier.wordpress.com&blog=2794254&post=23&subd=ggarnier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ggarnier.wordpress.com/2008/05/08/o-poder-do-ruby/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Instalação do mod_rails</title>
		<link>http://ggarnier.wordpress.com/2008/04/22/instalacao-do-mod_rails/</link>
		<comments>http://ggarnier.wordpress.com/2008/04/22/instalacao-do-mod_rails/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 21:52:23 +0000</pubDate>
		<dc:creator>ggarnier</dc:creator>
		
		<category><![CDATA[Ruby on Rails]]></category>

		<category><![CDATA[apache]]></category>

		<category><![CDATA[deploy]]></category>

		<category><![CDATA[mod_rails]]></category>

		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://ggarnier.wordpress.com/?p=21</guid>
		<description><![CDATA[Recentemente foi lançado o Phusion Passenger, mais conhecido como mod_rails. Trata-se de um módulo Apache para Rails que promete oferecer configuração e deploy de aplicações mais simplificado do que com o Mongrel, além de ser mais estável e utilizar menos memória.
Tentei instalar o mod_rails e encontrei várias dificuldades. Inicialmente tentei instalar no CentOS 4.4, mas [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Recentemente foi lançado o Phusion Passenger, mais conhecido como <a href="http://www.modrails.com">mod_rails</a>. Trata-se de um módulo Apache para Rails que promete oferecer configuração e deploy de aplicações mais simplificado do que com o Mongrel, além de ser mais estável e utilizar menos memória.</p>
<p>Tentei instalar o mod_rails e encontrei várias dificuldades. Inicialmente tentei instalar no CentOS 4.4, mas não consegui. Encontrei alguns conflitos de versões de pacotes (pré-requisitos do mod_rails), e ainda não consegui concluir a instalação.</p>
<p>Em seguida, tentei instalar no Ubuntu 7.10. As dificuldades foram menores, mas ainda assim não foi tão simples quanto parece pelo <a href="http://www.modrails.com/documentation/Users%20guide.html">guia do usuário</a>. Segue o passo-a-passo da instalação:</p>
<ol>
<li>Instalar os pré-requisitos:
<pre name="code" class="html">

sudo apt-get install apache2-mpm-prefork apache2-prefork-dev libapr1-dev
</pre>
<li>Instalar o gem do mod_rails:
<pre name="code" class="html">

sudo gem install passenger
</pre>
<li>Definir as seguintes variáveis de ambiente:
<pre name="code" class="html">

export HTTPD=/path/to/httpd
export APXS=/path/to/apxs (ou apxs2)
</pre>
<li>Executar o script de instalação do módulo Apache:
<pre name="code" class="html">

sudo /usr/lib/ruby/gems/1.8/gems/passenger-1.0.1/bin/passenger-install-apache2-module
</pre>
<li>Habilitar o mod_rails no httpd.conf do Apache, adicionando as linhas a seguir:
<pre name="code" class="html">

LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-1.0.1/ext/apache2/mod_passenger.so
RailsSpawnServer /usr/lib/ruby/gems/1.8/gems/passenger-1.0.1/bin/passenger-spawn-server
RailsRuby /usr/bin/ruby1.8
RailsEnv PROD
</pre>
<p>A última linha acima define o ambiente Rails que será utilizado. Se você omitir esta linha, será usado o ambiente padrão (production).</p>
<li>criar um virtual host no Apache:
<pre name="code" class="html">

&lt;VirtualHost *:80&gt;
  ServerName localhost
  DocumentRoot /var/www/rails/public
&lt;/VirtualHost&gt;
</pre>
</ol>
<p>Na configuração acima, DocumentRoot é o diretório public da sua aplicação Rails.</p>
<p>Ao concluir estas configurações e reiniciar o Apache, minha aplicação funcionou, porém os arquivos que estão no diretório public (arquivos javascript, css e imagens) não estavam acessíveis. Para resolver este problema:</p>
<ul>
<li>habilite o mod_rewrite
<li>adicione à configuração do virtual host:
<pre name="code" class="html">

&lt;Directory &quot;/var/www/rails/public&quot; &gt;
    Options         FollowSymLinks
    AllowOverride   All
&lt;/Directory&gt;
</pre>
<li>reinicie o Apache
</ul>
<p>Assim, finalmente consegui fazer a aplicação funcionar corretamente. Ainda não fiz nenhum benchmark comparando o mod_rails com o Mongrel, mas todos os que encontrei até agora são favoráveis ao mod_rails, como estes:</p>
<ul>
<li><a href="http://s2.diffuse.it/blog/show/53_Benchmarking+mod_rails+against+mongrel">Benchmarking mod_rails against mongrel</a>
<li><a href="http://www.akitaonrails.com/2008/4/16/phusion-passenger-mod_rails-test-drive">Phusion Passenger (mod_rails) Test-Drive</a>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ggarnier.wordpress.com/21/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ggarnier.wordpress.com/21/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ggarnier.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ggarnier.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ggarnier.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ggarnier.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ggarnier.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ggarnier.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ggarnier.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ggarnier.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ggarnier.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ggarnier.wordpress.com/21/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ggarnier.wordpress.com&blog=2794254&post=21&subd=ggarnier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ggarnier.wordpress.com/2008/04/22/instalacao-do-mod_rails/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Definição de nomes de atributos &#8220;humanizados&#8221;</title>
		<link>http://ggarnier.wordpress.com/2008/04/17/definicao-de-nomes-de-atributos-humanizados/</link>
		<comments>http://ggarnier.wordpress.com/2008/04/17/definicao-de-nomes-de-atributos-humanizados/#comments</comments>
		<pubDate>Thu, 17 Apr 2008 17:00:20 +0000</pubDate>
		<dc:creator>ggarnier</dc:creator>
		
		<category><![CDATA[Programação]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://ggarnier.wordpress.com/?p=20</guid>
		<description><![CDATA[A classe ActiveRecord::ConnectionAdapters::Column tem um método human_name que cria uma versão &#8220;humanizada&#8221; para os nomes das colunas de tabelas (atributos de um model). Porém, nem sempre o nome criado é o que desejamos. Por exemplo, se temos uma coluna num_usuarios, o método human_name retornará &#8220;Num Usuarios&#8221;, que, provavelmente, não é o que queremos. Para configurar [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>A classe ActiveRecord::ConnectionAdapters::Column tem um método human_name que cria uma versão &#8220;humanizada&#8221; para os nomes das colunas de tabelas (atributos de um model). Porém, nem sempre o nome criado é o que desejamos. Por exemplo, se temos uma coluna num_usuarios, o método human_name retornará &#8220;Num Usuarios&#8221;, que, provavelmente, não é o que queremos. Para configurar o human_name manualmente, há duas soluções:</p>
<p>1 - criar um hash e <a href="http://henrik.nyh.se/2007/12/change-displayed-column-name-in-rails-validation-messages">redefinir o método human_attribute_name</a>:</p>
<pre name="code" class="ruby">

class Model &lt; ActiveRecord::Base
  HUMANIZED_ATTRIBUTES = {
    num_usuarios =&gt; &#039;Número de usuários&#039;
  }

  def self.human_attribute_name(attr)
    HUMANIZED_ATTRIBUTES[attr.to_sym] || super
  end
end
</pre>
<p>2 - usar o plugin <a href="http://agilewebdevelopment.com/plugins/human_attribute_override">human_attribute_override</a>. Esta solução é mais simples e elegante:</p>
<pre name="code" class="ruby">

class Model &lt; ActiveRecord::Base
  attr_human_name :num_usuarios =&gt; &#039;Número de usuários&#039;
end
</pre>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ggarnier.wordpress.com/20/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ggarnier.wordpress.com/20/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ggarnier.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ggarnier.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ggarnier.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ggarnier.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ggarnier.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ggarnier.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ggarnier.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ggarnier.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ggarnier.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ggarnier.wordpress.com/20/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ggarnier.wordpress.com&blog=2794254&post=20&subd=ggarnier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ggarnier.wordpress.com/2008/04/17/definicao-de-nomes-de-atributos-humanizados/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Configurações fora do padrão em Rails, parte 2 - Relacionamentos HABTM</title>
		<link>http://ggarnier.wordpress.com/2008/04/10/configuracoes-fora-do-padrao-em-rails-parte-2-relacionamentos-habtm/</link>
		<comments>http://ggarnier.wordpress.com/2008/04/10/configuracoes-fora-do-padrao-em-rails-parte-2-relacionamentos-habtm/#comments</comments>
		<pubDate>Thu, 10 Apr 2008 19:46:40 +0000</pubDate>
		<dc:creator>ggarnier</dc:creator>
		
		<category><![CDATA[Programação]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<category><![CDATA[database]]></category>

		<category><![CDATA[fixtures]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[testes]]></category>

		<guid isPermaLink="false">http://ggarnier.wordpress.com/?p=19</guid>
		<description><![CDATA[Há um mês escrevi um post sobre configurações fora do padrão em Rails, onde descrevi como executar testes com models cujas tabelas não existem no banco de dados local, e sim em uma base externa. Porém, depois de postar, verifiquei que há um outro problema não resolvido com a configuração que descrevi nesse post: relacionamentos [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Há um mês escrevi um post sobre <a href="http://ggarnier.wordpress.com/2008/03/18/configuracoes-fora-do-padrao-em-rails/">configurações fora do padrão em Rails</a>, onde descrevi como executar testes com models cujas tabelas não existem no banco de dados local, e sim em uma base externa. Porém, depois de postar, verifiquei que há um outro problema não resolvido com a configuração que descrevi nesse post: relacionamentos HABTM (has and belongs to many).</p>
<p>Nos relacionamentos HABTM, normalmente, há dois models, um correspondente a cada tabela do banco de dados. Como a relação entre eles é de muitos para muitos, há uma terceira tabela no banco de dados, que é responsável pela associação das demais tabelas. Como essa tabela só costuma ter dois campos, que são FK&#8217;s correspondentes às PK&#8217;s dessas tabelas, ela não precisa ter um model; basta criar o relacionamento dos dois models como has_and_belongs_to_many, passando como parâmetro join_table essa tabela intermediária.</p>
<p>A configuração descrita no <a href="http://ggarnier.wordpress.com/2008/03/18/configuracoes-fora-do-padrao-em-rails/">post anterior</a> carrega manualmente os fixtures de cada model, porém não carrega fixtures correspondentes à tabela intermediária. Para isso, precisei implementar um novo método na classe Test::Unit::TestCase (arquivo test/test_helper.rb):</p>
<pre name="code" class="ruby">

def set_habtm_fixtures(class1, class2)
  return unless (class1.reflections &amp;&amp; class1.reflections.values)
  id1 = nil
  id2 = nil
  table = nil

  # Verifica qual dos relacionamentos do model class1 está associado à tabela class2
  class1.reflections.values.each do |r|
    # Se a classe associada for class2 e for uma relação HABTM, le os FK&#039;s e o nome da tabela
    if (r.klass == class2 &amp;&amp; !r.instance_values[&#039;options&#039;][:join_table].nil?)
      id1 = r.primary_key_name
      id2 = r.association_foreign_key
      table = r.instance_values[&#039;options&#039;][:join_table]
      break
    end
  end
  return if table.nil?
  connection = class1.connection

  data = File.open(File.join(RAILS_ROOT, &#039;test&#039;, &#039;fixtures&#039;, &quot;#{table}.yml&quot;)).readlines.join
  result = ERB.new(data).result
  parsed = YAML.load(result)

  # Exclui todos os registros da tabela
  connection.execute &quot;DELETE FROM #{table}&quot;

  parsed.values.each do |value|
    value1 = value[id1] || &#039;NULL&#039;
    value2 = value[id2] || &#039;NULL&#039;
    connection.execute &quot;INSERT INTO #{table} (#{id1}, #{id2}) values (#{value1}, #{value2})&quot;
  end
end
</pre>
<p>Este método ficou bem &#8220;feio&#8221;, pois, como não existe um model correspondente a esta tabela, precisei criar a query manualmente. O método recebe dois nomes de classes (ActiveRecord) como parâmetro. Primeiramente é verificado qual dos relacionamentos do model class1 está associado a class2, para descobrir quais são as FK&#8217;s e o nome da tabela. Em seguida, os registros desta tabela são excluídos, e cada linha do arquivo de fixtures é carregada (usando a conexão de um dos ActiveRecords).</p>
<p>Além disso, modifiquei o método set_fixtures desta mesma classe, criado no <a href="http://ggarnier.wordpress.com/2008/03/18/configuracoes-fora-do-padrao-em-rails/">post anterior</a>, pois percebi que não era necessário passar o nome da tabela como parâmetro, basta usar o método table_name:</p>
<pre name="code" class="ruby">

def set_fixtures (class_name)
  table = class_name.table_name
  return unless class_name.kind_of?(ActiveRecord::Base)

  # Define a conexao usada pela classe
  ActiveRecord::Base.connection = base.connection
  Fixtures.create_fixtures(File.join(RAILS_ROOT, &#039;test&#039;, &#039;fixtures&#039;), table) { base.connection }
end
</pre>
<p>Para exemplificar como usar estes métodos, imagine um cadastro de usuários com grupos, onde um usuário pode fazer parte de mais de um grupo. Neste exemplo, teríamos um model Usuario (tabela usuarios), um model Grupo (tabela grupos) e uma tabela usuarios_grupos, sem um model correspondente. Na classe de teste do model Usuario, teríamos o seguinte:</p>
<pre name="code" class="ruby">

class UsuarioTest &lt; ActiveSupport::TestCase
  def setup
    set_fixtures(Usuario)
    set_fixtures(Grupo)
    set_habtm_fixtures(Usuario, Grupo)
  end

  # Testes
end
</pre>
<p>No método setup, que é executado automaticamente quando os testes são executados, as duas chamadas a set_fixtures carregam as fixtures das tabelas de usuários e grupos, respectivamente; a chamada a set_habtm_fixtures atualiza a tabela usuarios_grupos.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ggarnier.wordpress.com/19/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ggarnier.wordpress.com/19/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ggarnier.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ggarnier.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ggarnier.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ggarnier.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ggarnier.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ggarnier.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ggarnier.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ggarnier.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ggarnier.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ggarnier.wordpress.com/19/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ggarnier.wordpress.com&blog=2794254&post=19&subd=ggarnier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ggarnier.wordpress.com/2008/04/10/configuracoes-fora-do-padrao-em-rails-parte-2-relacionamentos-habtm/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Como criar accessors para atributos de classe</title>
		<link>http://ggarnier.wordpress.com/2008/04/10/como-criar-accessors-para-atributos-de-classe/</link>
		<comments>http://ggarnier.wordpress.com/2008/04/10/como-criar-accessors-para-atributos-de-classe/#comments</comments>
		<pubDate>Thu, 10 Apr 2008 19:13:21 +0000</pubDate>
		<dc:creator>ggarnier</dc:creator>
		
		<category><![CDATA[Programação]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://ggarnier.wordpress.com/?p=18</guid>
		<description><![CDATA[Os métodos attr_reader, attr_writer e attr_accessor do Ruby servem para simplificar a criação de setters e getters para atributos de instância. Ex:


class Teste
  @valor = 1
  attr_accessor :valor
end

No código acima, o método attr_accessor já cria o getter e o setter para o atributo valor:


t = Teste.new
t.valor = 10
puts t.valor #=&#62; 10

Porém, como fazer [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Os métodos attr_reader, attr_writer e attr_accessor do Ruby servem para simplificar a criação de setters e getters para atributos de instância. Ex:</p>
<pre name="code" class="ruby">

class Teste
  @valor = 1
  attr_accessor :valor
end
</pre>
<p>No código acima, o método attr_accessor já cria o getter e o setter para o atributo valor:</p>
<pre name="code" class="ruby">

t = Teste.new
t.valor = 10
puts t.valor #=&gt; 10
</pre>
<p>Porém, como fazer o mesmo para atributos de classe? Eu fiz <a href="http://forum.rubyonbr.org/forums/1/topics/2910">essa pergunta</a> no <a href="http://forum.rubyonbr.org">forum RubyOnBr</a>. O Shairon Toledo me respondeu com o código do método attr_static_accessor, que é, na prática, o equivalente ao attr_accessor, só que para atributos de classe. Eu complementei o código dele com os métodos attr_static_reader e attr_static_writer:</p>
<pre name="code" class="ruby">

class Module
  def attr_static_reader(*args)
    args.each do |meth|
      init_var(meth)
      set_reader(meth)
    end
  end

  def attr_static_writer(*args)
    args.each do |meth|
      init_var(meth)
      set_writer(meth)
    end
  end

  def attr_static_accessor(*args)
    args.each do |meth|
      init_var(meth)
      set_reader(meth)
      set_writer(meth)
    end
  end

  private
  def init_var(var_name)
    var = &quot;@@#{var_name}&quot;.to_sym
    self.send(:class_variable_set, var, nil) unless self.send(:class_variable_defined?, var)
  end

  def set_reader(var_name)
    self.class.send(:define_method, var_name) {
      self.send(:class_variable_get, &quot;@@#{var_name}&quot;.to_sym)
    }
  end

  def set_writer(var_name)
    self.class.class_eval %Q{
      def #{var_name}=(value)
        self.send(:class_variable_set, &quot;@@#{var_name}&quot;.to_sym,value)
      end
    }
  end
end
</pre>
<p>Agora é possível fazer o seguinte:</p>
<pre name="code" class="ruby">

class Teste
  @@valor = 1
  attr_static_accessor :valor
end

puts Teste.valor #=&gt; 1
Teste.valor = 10
puts Teste.valor #=&gt; 10
</pre>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ggarnier.wordpress.com/18/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ggarnier.wordpress.com/18/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ggarnier.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ggarnier.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ggarnier.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ggarnier.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ggarnier.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ggarnier.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ggarnier.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ggarnier.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ggarnier.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ggarnier.wordpress.com/18/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ggarnier.wordpress.com&blog=2794254&post=18&subd=ggarnier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ggarnier.wordpress.com/2008/04/10/como-criar-accessors-para-atributos-de-classe/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Executando testes em partes</title>
		<link>http://ggarnier.wordpress.com/2008/04/04/executando-testes-em-partes/</link>
		<comments>http://ggarnier.wordpress.com/2008/04/04/executando-testes-em-partes/#comments</comments>
		<pubDate>Fri, 04 Apr 2008 21:36:34 +0000</pubDate>
		<dc:creator>ggarnier</dc:creator>
		
		<category><![CDATA[Programação]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[testes]]></category>

		<guid isPermaLink="false">http://ggarnier.wordpress.com/?p=17</guid>
		<description><![CDATA[A execução de testes em Rails é feita, normalmente, com o comando rake test. Este comando executa automaticamente todos os testes unitários e funcionais. Porém, algumas vezes queremos executar apenas uma parte dos testes, seja porque sabemos que outra parte do sistema está dando algum erro que pretendemos tratar depois, seja porque acabamos de alterar [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>A execução de testes em Rails é feita, normalmente, com o comando <code>rake test</code>. Este comando executa automaticamente todos os testes unitários e funcionais. Porém, algumas vezes queremos executar apenas uma parte dos testes, seja porque sabemos que outra parte do sistema está dando algum erro que pretendemos tratar depois, seja porque acabamos de alterar um trecho do código (ou dos testes) e queremos verificar se estes estão OK.</p>
<p>Para executar apenas os testes unitários, executamos o comando <code>rake test:units</code>. Para os testes funcionais, <code>rake test:funcionals</code>. Mas se quisermos executar um arquivo de testes específico, devemos trocar o rake pelo próprio ruby:</p>
<pre name="code" class="ruby">

ruby test/unit/usuario_test.rb
</pre>
<p>Para sermos ainda mais específicos, e executarmos um único método, basta acrescentar o parâmetro <code>--name</code>:</p>
<pre name="code" class="ruby">

ruby test/unit/usuario_test.rb --name test_dados
</pre>
<p>Outra vantagem de testar executando o ruby diretamente (sem o rake) é que não ocorre o problema de <a href="http://ggarnier.wordpress.com/2008/03/18/configuracoes-fora-do-padrao-em-rails/">tabelas não existentes no ambiente de desenvolvimento</a>, como ocorre com o rake.</p>
<p>Referência:</p>
<ul>
<li><a href="http://blog.jayfields.com/2007/10/rails-unit-test-without-rails.html">Rails: Unit Test without Rails</a></li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ggarnier.wordpress.com/17/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ggarnier.wordpress.com/17/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ggarnier.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ggarnier.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ggarnier.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ggarnier.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ggarnier.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ggarnier.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ggarnier.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ggarnier.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ggarnier.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ggarnier.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ggarnier.wordpress.com&blog=2794254&post=17&subd=ggarnier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ggarnier.wordpress.com/2008/04/04/executando-testes-em-partes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Impressão para PDF no Ubuntu - correção de problemas</title>
		<link>http://ggarnier.wordpress.com/2008/04/04/impressao-para-pdf-no-ubuntu-correcao-de-problemas/</link>
		<comments>http://ggarnier.wordpress.com/2008/04/04/impressao-para-pdf-no-ubuntu-correcao-de-problemas/#comments</comments>
		<pubDate>Fri, 04 Apr 2008 13:34:59 +0000</pubDate>
		<dc:creator>ggarnier</dc:creator>
		
		<category><![CDATA[Ubuntu]]></category>

		<category><![CDATA[linux]]></category>

		<category><![CDATA[pdf]]></category>

		<guid isPermaLink="false">http://ggarnier.wordpress.com/?p=16</guid>
		<description><![CDATA[Alguns programas no Ubuntu permitem a impressão para o formato PDF, como o Evince e o Gedit. Para ter essa opção disponível em qualquer programa, basta instalar uma impressora virtual de PDF, usando o pacote cups-pdf. Se ele não estiver instalado na sua distribuição, instale-o com o comando sudo apt-get install cups-pdf.
Para criar uma impressora [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Alguns programas no Ubuntu permitem a impressão para o formato PDF, como o Evince e o Gedit. Para ter essa opção disponível em qualquer programa, basta instalar uma impressora virtual de PDF, usando o pacote cups-pdf. Se ele não estiver instalado na sua distribuição, instale-o com o comando <code>sudo apt-get install cups-pdf</code>.</p>
<p>Para criar uma impressora de PDF, acesse a opção System -&gt; Administration -&gt; Printing e depois &#8220;New Printer&#8221;. Depois selecione &#8220;Print into PDF file&#8221; como tipo de impressora, e na tela seguinte, &#8220;Generic&#8221; como fabricante e &#8220;PDF file generator&#8221; como modelo. Finalmente, dê um nome para a impressora. Feito isso, a impressora de PDF ficará disponível para qualquer programa que tenha a opção de impressão. Os PDFs serão criados no diretório PDF dentro do home do usuário.</p>
<p>O processo acima já foi descrito diversas vezes, em vários blogs e sites sobre Linux. Porém, decidi escrever sobre isso porque a maioria dos artigos pára por aí, não informando como alterar as configurações do cups-pdf e nem como resolver alguns dos problemas mais comuns.</p>
<p><strong>Configurações</strong></p>
<p>O arquivo de configuração do cups-pdf fica em <code>/etc/cups/cups-pdf.conf</code>. Neste arquivo, ficam definidos o diretório de destino dos PDFs, o diretório de spool, as regras para formação dos nomes de arquivos a partir do nome do documento impresso, configurações de segurança e permissões, o grupo de usuários que tem permissão para usar esta impressora, tipo de log, configurações do Ghostscript e outros. Se você alterar algum destes parâmetros, será necessário executar <code>sudo /etc/init.d/cupsys restart</code> para que as modificações tenham efeito.</p>
<p><strong>Problemas</strong></p>
<p>Os <a href="https://bugs.launchpad.net/ubuntu/+source/cupsys/+bug/147551">problemas mais comuns</a> com o cups-pdf são:</p>
<ul>
<li>se após enviar um trabalho para a impressora o arquivo correspondente não aparecer no diretório PDF dentro do seu home (ou o diretório que você tiver definido no arquivo de configuração), verifique o log (por padrão fica em <code>/var/log/cups/cups-pdf_log</code>). Ele pode ajudar a descobrir o que ocorreu (ex: problemas de permissão)</li>
<li>verifique se o usuário está no grupo correspondente definido no arquivo de configuração (grupo lp por padrão)</li>
<li>se você alterar o diretório de destino dos PDFs, altere também o arquivo <code>/etc/apparmor.d/usr.sbin.cupsd</code>, na seção /usr/lib/cups/backend/cups-pdf. Este arquivo contém as regras de segurança do AppArmor, e define os diretórios onde o cups-pdf tem permissão de escrita. Após alterá-lo, execute <code>sudo /etc/init.d/cupsys restart</code></li>
<li>se o log do cups-pdf apresentar a mensagem <code>"[ERROR] failed to set file mode for PDF file (non fatal)&#8221;</code>, execute o comando <code>sudo aa-complain cupsd</code></li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ggarnier.wordpress.com/16/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ggarnier.wordpress.com/16/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ggarnier.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ggarnier.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ggarnier.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ggarnier.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ggarnier.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ggarnier.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ggarnier.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ggarnier.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ggarnier.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ggarnier.wordpress.com/16/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ggarnier.wordpress.com&blog=2794254&post=16&subd=ggarnier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ggarnier.wordpress.com/2008/04/04/impressao-para-pdf-no-ubuntu-correcao-de-problemas/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Atualização do Brazilian Rails</title>
		<link>http://ggarnier.wordpress.com/2008/04/03/atualizacao-do-brazilian-rails/</link>
		<comments>http://ggarnier.wordpress.com/2008/04/03/atualizacao-do-brazilian-rails/#comments</comments>
		<pubDate>Thu, 03 Apr 2008 16:29:55 +0000</pubDate>
		<dc:creator>ggarnier</dc:creator>
		
		<category><![CDATA[Programação]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://ggarnier.wordpress.com/?p=15</guid>
		<description><![CDATA[Quem já tentou tratar caracteres acentuados em Ruby deve ter percebido que a linguagem não considera estes caracteres como letras. Métodos como upcase e downcase são &#8220;locale insensitive&#8221;, como diz a descrição destes métodos no manual do Ruby:
str.downcase =&#62; Returns a copy of str with all uppercase letters replaced with their lowercase counterparts. The operation [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Quem já tentou tratar caracteres acentuados em Ruby deve ter percebido que a linguagem não considera estes caracteres como letras. Métodos como upcase e downcase são &#8220;locale insensitive&#8221;, como diz a descrição destes métodos no <a href="http://www.ruby-doc.org/core/">manual do Ruby</a>:</p>
<p>str.downcase =&gt; Returns a copy of str with all uppercase letters replaced with their lowercase counterparts. The operation is locale insensitive—only characters &#8220;A’’ to &#8220;Z’’ are affected.</p>
<p>O projeto <a href="http://brazilian-rails.rubyforge.org/">Brazilian Rails</a> foi criado com o objetivo de resolver este e outros problemas. O projeto é instalado como um plugin para Rails, e define novos métodos para a classe String, como o upcase_br e o downcase_br, que podem ser usados em substituição aos métodos originais. O plugin acrescenta ainda outras funcionalidades, como data, hora, feriados, dinheiro e mensagens de erro, todas adaptadas ao português brasileiro.</p>
<p>Ontem enviei um patch para o projeto, contribuindo com alguns novos métodos para Strings. Em breve a versão atualizada deverá ser disponibilizada, conforme o post do <a href="http://tinogomes.wordpress.com/2008/04/03/atualizacao-do-brazilian-rails/">Celestino Gomes</a>.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ggarnier.wordpress.com/15/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ggarnier.wordpress.com/15/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ggarnier.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ggarnier.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ggarnier.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ggarnier.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ggarnier.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ggarnier.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ggarnier.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ggarnier.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ggarnier.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ggarnier.wordpress.com/15/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ggarnier.wordpress.com&blog=2794254&post=15&subd=ggarnier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ggarnier.wordpress.com/2008/04/03/atualizacao-do-brazilian-rails/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Material sobre Scrum</title>
		<link>http://ggarnier.wordpress.com/2008/04/01/material-sobre-scrum/</link>
		<comments>http://ggarnier.wordpress.com/2008/04/01/material-sobre-scrum/#comments</comments>
		<pubDate>Tue, 01 Apr 2008 15:22:11 +0000</pubDate>
		<dc:creator>ggarnier</dc:creator>
		
		<category><![CDATA[Desenvolvimento ágil]]></category>

		<category><![CDATA[Scrum]]></category>

		<category><![CDATA[desenvolvimento]]></category>

		<guid isPermaLink="false">http://ggarnier.wordpress.com/?p=14</guid>
		<description><![CDATA[Aqui na Globo.com adotamos Scrum em (quase) todos os projetos. Quando cheguei aqui eu não conhecia praticamente nada sobre Scrum, e precisei aprender sobre o assunto para não ficar perdido.
Minha primeira fonte de consulta para o assunto foi o ótimo livro Agile Software Development with Scrum (que, inclusive, está na lista de livros recomendados para [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Aqui na <a href="http://globo.com">Globo.com</a> adotamos Scrum em (quase) todos os projetos. Quando cheguei aqui eu não conhecia praticamente nada sobre Scrum, e precisei aprender sobre o assunto para não ficar perdido.</p>
<p>Minha primeira fonte de consulta para o assunto foi o ótimo livro Agile Software Development with Scrum (que, inclusive, está na <a href="http://gc.blog.br/2008/03/27/10-livros-recomendados-para-desenvolvedores/">lista de livros recomendados para desenvolvedores</a> pelo Guilherme Chapiewski). É um livro introdutório, muito bom para quem está começando a conhecer o assunto.</p>
<p>Outro material interessante sobre o assunto são as <a href="http://gc.blog.br/2008/03/28/scrum-checklists/">checklists</a>, também indicadas pelo GC.</p>
<p>Finalmente, o site <a href="http://www.visaoagil.com/">Visão Ágil</a>, que publica periodicamente uma revista em PDF sobre desenvolvimento ágil, inaugurou uma seção Biblioteca, com palestras, artigos e apresentações, alguns deles sobre Scrum. Vale a pena dar uma olhada.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ggarnier.wordpress.com/14/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ggarnier.wordpress.com/14/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ggarnier.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ggarnier.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ggarnier.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ggarnier.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ggarnier.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ggarnier.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ggarnier.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ggarnier.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ggarnier.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ggarnier.wordpress.com/14/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ggarnier.wordpress.com&blog=2794254&post=14&subd=ggarnier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ggarnier.wordpress.com/2008/04/01/material-sobre-scrum/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Como abrir arquivos OpenXML no OpenOffice</title>
		<link>http://ggarnier.wordpress.com/2008/03/26/como-abrir-arquivos-openxml-no-openoffice/</link>
		<comments>http://ggarnier.wordpress.com/2008/03/26/como-abrir-arquivos-openxml-no-openoffice/#comments</comments>
		<pubDate>Wed, 26 Mar 2008 13:19:24 +0000</pubDate>
		<dc:creator>ggarnier</dc:creator>
		
		<category><![CDATA[OpenOffice]]></category>

		<category><![CDATA[Ubuntu]]></category>

		<category><![CDATA[linux]]></category>

		<category><![CDATA[openxml]]></category>

		<guid isPermaLink="false">http://ggarnier.wordpress.com/?p=13</guid>
		<description><![CDATA[Na versão 2007, o Microsoft Office começou a usar o formato OpenXML como padrão - no caso do Word, a extensão deste formato é docx. Porém, este formato é incompatível com o OpenOffice (e com versões anteriores do Word&#8230;). Para abrir arquivos deste formato no OpenOffice, instale o odf-converter. Após instalá-lo, reinicie o OpenOffice e [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Na versão 2007, o Microsoft Office começou a usar o formato OpenXML como padrão - no caso do Word, a extensão deste formato é docx. Porém, este formato é incompatível com o OpenOffice (e com versões anteriores do Word&#8230;). Para abrir arquivos deste formato no OpenOffice, instale o <a href="http://sourceforge.net/projects/odf-converter">odf-converter</a>. Após instalá-lo, reinicie o OpenOffice e você conseguirá abrir e salvar nesse formato. O pacote deb pode ser acessado <a href="http://www.getdeb.net/comment.php?rel_id=1519">aqui</a>. Instalei este pacote sem problemas no Ubuntu com OpenOffice 2.3, apesar dos comentários nessa página de download.</p>
<p>Referência:</p>
<ul>
<li><a href="http://www.tutolivre.net/arquivos-openxml-docx-xlsx-no-openoffice-e-broffice-sem-traumas/">Arquivos OpenXML (.docx, .xlsx) no OpenOffice e BrOffice sem traumas</a></li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ggarnier.wordpress.com/13/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ggarnier.wordpress.com/13/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ggarnier.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ggarnier.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ggarnier.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ggarnier.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ggarnier.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ggarnier.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ggarnier.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ggarnier.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ggarnier.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ggarnier.wordpress.com/13/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ggarnier.wordpress.com&blog=2794254&post=13&subd=ggarnier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ggarnier.wordpress.com/2008/03/26/como-abrir-arquivos-openxml-no-openoffice/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>