<?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"
	>

<channel>
	<title>Ramon Soares</title>
	<atom:link href="http://blog.ramonsoares.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.ramonsoares.com</link>
	<description>Symfony, Ruby On Rails, ETC</description>
	<pubDate>Wed, 22 Oct 2008 23:44:51 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<item>
		<title>Sequestro: Brasil x China</title>
		<link>http://blog.ramonsoares.com/2008/10/22/sequestro-brasil-x-china.html</link>
		<comments>http://blog.ramonsoares.com/2008/10/22/sequestro-brasil-x-china.html#comments</comments>
		<pubDate>Wed, 22 Oct 2008 23:44:51 +0000</pubDate>
		<dc:creator>Ramon Soares</dc:creator>
		
		<category><![CDATA[Textos]]></category>

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

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

		<category><![CDATA[off-topic]]></category>

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

		<guid isPermaLink="false">http://blog.ramonsoares.com/?p=36</guid>
		<description><![CDATA[Vamos a uma sutil comparação sobre 2 sequestros.
No Brasil: Caso Eloah
Tempo: 5
Desfecho: 1 Morta, 1 Ferida e um seqüestrado/assassino para nós pagadores de impostos e gente de bem banca. 
Na China: humnn.. sei o nome não.
Tempo: algumas horas
Desfecho: 1 Seqüestrado morto
Então vou posta alguma imagens do caso chines para que alguem dos órgãos de seguração [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos a uma sutil comparação sobre 2 sequestros.</p>
<p>No Brasil: Caso Eloah<br />
Tempo: 5<br />
Desfecho: 1 Morta, 1 Ferida e um seqüestrado/assassino para nós pagadores de impostos e gente de bem banca. </p>
<p>Na China: humnn.. sei o nome não.<br />
Tempo: algumas horas<br />
Desfecho: 1 Seqüestrado morto</p>
<p>Então vou posta alguma imagens do caso chines para que alguem dos órgãos de seguração publica vejam e aprendam.</p>
<p><a href="http://blog.ramonsoares.com/wp-content/uploads/2008/10/att00016.jpg"><img src="http://blog.ramonsoares.com/wp-content/uploads/2008/10/att00016-300x215.jpg" alt="" title="exigências" width="300" height="215" class="aligncenter size-medium wp-image-37" /></a></p>
<p><a href="http://blog.ramonsoares.com/wp-content/uploads/2008/10/att00019.jpg"><img src="http://blog.ramonsoares.com/wp-content/uploads/2008/10/att00019-300x200.jpg" alt="" title="Negociador" width="300" height="200" class="aligncenter size-medium wp-image-38" /></a></p>
<p><a href="http://blog.ramonsoares.com/wp-content/uploads/2008/10/att00022.jpg"><img src="http://blog.ramonsoares.com/wp-content/uploads/2008/10/att00022-300x204.jpg" alt="" title="Negociador em posição" width="300" height="204" class="alignnone size-medium wp-image-39" /></a></p>
<p><a href="http://blog.ramonsoares.com/wp-content/uploads/2008/10/att00025.jpg"><img src="http://blog.ramonsoares.com/wp-content/uploads/2008/10/att00025-300x212.jpg" alt="" title="Inicio das negociações" width="300" height="212" class="aligncenter size-medium wp-image-40" /></a></p>
<p><a href="http://blog.ramonsoares.com/wp-content/uploads/2008/10/att00028.jpg"><img src="http://blog.ramonsoares.com/wp-content/uploads/2008/10/att00028-300x198.jpg" alt="" title="Negociações concluídas" width="300" height="198" class="aligncenter size-medium wp-image-41" /></a></p>
<p><a href="http://blog.ramonsoares.com/wp-content/uploads/2008/10/att00031.jpg"><img src="http://blog.ramonsoares.com/wp-content/uploads/2008/10/att00031-214x300.jpg" alt="" title="Caso encerrado" width="214" height="300" class="aligncenter size-medium wp-image-42" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ramonsoares.com/2008/10/22/sequestro-brasil-x-china.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Conheça o Xare, a lista de desejos!</title>
		<link>http://blog.ramonsoares.com/2008/05/26/conheca-o-xare-a-lista-de-desejos.html</link>
		<comments>http://blog.ramonsoares.com/2008/05/26/conheca-o-xare-a-lista-de-desejos.html#comments</comments>
		<pubDate>Mon, 26 May 2008 14:57:28 +0000</pubDate>
		<dc:creator>Ramon Soares</dc:creator>
		
		<category><![CDATA[Curiosidades]]></category>

		<category><![CDATA[curiosidades xare]]></category>

		<guid isPermaLink="false">http://blog.ramonsoares.com/2008/05/26/conheca-o-xare-a-lista-de-desejos.html</guid>
		<description><![CDATA[O xare é um serviço que funciona como uma lista de desejos. Lá você pode criar um lista de coisas que deseja fazer e compartilhar com outros usuários, além de trocar idéias sobre como chegar no seu objetivo.
O funcionamento é muito simples, basta se cadastrar e começar a sua lista. Adicione amigos e acompanhe como [...]]]></description>
			<content:encoded><![CDATA[<p>O xare é um serviço que funciona como uma lista de desejos. Lá você pode criar um lista de coisas que deseja fazer e compartilhar com outros usuários, além de trocar idéias sobre como chegar no seu objetivo.</p>
<p>O funcionamento é muito simples, basta se cadastrar e começar a sua lista. Adicione amigos e acompanhe como andam suas listas. Descubra o que que as pessoas mais querem, compartilhe seus objetivos e ajude sonhos a se realizarem.</p>
<p>Vale a pena conferir, é interessante! Site: www.xare.com.br</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ramonsoares.com/2008/05/26/conheca-o-xare-a-lista-de-desejos.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Visual TraceRoute</title>
		<link>http://blog.ramonsoares.com/2008/01/28/visual-traceroute.html</link>
		<comments>http://blog.ramonsoares.com/2008/01/28/visual-traceroute.html#comments</comments>
		<pubDate>Mon, 28 Jan 2008 21:39:02 +0000</pubDate>
		<dc:creator>Ramon Soares</dc:creator>
		
		<category><![CDATA[Curiosidades]]></category>

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

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

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

		<guid isPermaLink="false">http://blog.ramonsoares.com/2008/01/28/visual-traceroute.html</guid>
		<description><![CDATA[&#8220;Aca&#8221; estava eu em um de meus momentos de inutilidade, olhando um projeto xare.us do caro xupisco (xapisco para os mais íntimos) pra quem não conhece ele é o dono do gamelib.com.br, se você curte games recomendo. 
Bem continuando, fuçando entre alguns dos links já cadastrados no xare.us achei um ferramenta no mínimo interessante, um [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Aca&#8221; estava eu em um de meus momentos de inutilidade, olhando um projeto xare.us do caro xupisco (xapisco para os mais íntimos) pra quem não conhece ele é o dono do gamelib.com.br, se você curte games recomendo. </p>
<p>Bem continuando, fuçando entre alguns dos links já cadastrados no xare.us achei um ferramenta no mínimo interessante, um traceroute de forma visual, ele mostra a rota entre você (ou o servidor deles) a o domínio a ser visitado exibindo a rota pelo google maps.</p>
<p>Click <a href="http://www.yougetsignal.com/visualTracertTool/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.yougetsignal.com');">aqui</a> e teste você mesmo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ramonsoares.com/2008/01/28/visual-traceroute.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>[Tradução] Ruby on Rails Finite State Machine Plugin: acts_as_state_machine</title>
		<link>http://blog.ramonsoares.com/2008/01/27/traducao-ruby-on-rails-finite-state-machine-plugin-acts_as_state_machine.html</link>
		<comments>http://blog.ramonsoares.com/2008/01/27/traducao-ruby-on-rails-finite-state-machine-plugin-acts_as_state_machine.html#comments</comments>
		<pubDate>Sun, 27 Jan 2008 11:32:45 +0000</pubDate>
		<dc:creator>Ramon Soares</dc:creator>
		
		<category><![CDATA[Plugin]]></category>

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

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

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

		<guid isPermaLink="false">http://blog.ramonsoares.com/2008/01/27/traducao-ruby-on-rails-finite-state-machine-plugin-acts_as_state_machine.html</guid>
		<description><![CDATA[Click aqui para ler a versão original em inglês
Uma Maquina de Estado Finito é um modelo de comportamento com um número finito de estados, interligados através de transições e eventos.
Neste guia, eu vou mostrar como o modelo de Maquina de Estado Finito pode ser recriado facilmente com um plugin do Ruby on Rails. O plugin [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Click <a href="http://rails.aizatto.com/2007/05/24/ruby-on-rails-finite-state-machine-plugin-acts_as_state_machine/" onclick="javascript:pageTracker._trackPageview ('/outbound/rails.aizatto.com');">aqui</a> para ler a versão original em inglês</strong></p>
<p>Uma Maquina de Estado Finito é um modelo de comportamento com um número finito de estados, interligados através de transições e eventos.</p>
<p>Neste guia, eu vou mostrar como o modelo de <a href="http://pt.wikipedia.org/wiki/M%C3%A1quina_de_estado_finito" onclick="javascript:pageTracker._trackPageview ('/outbound/pt.wikipedia.org');">Maquina de Estado Finito</a> pode ser recriado facilmente com um plugin do Ruby on Rails. O plugin que vamos usar é o <a href="http://elitists.textdriven.com/svn/plugins/acts_as_state_machine/trunk/README" onclick="javascript:pageTracker._trackPageview ('/outbound/elitists.textdriven.com');">acts_as_state_machine</a>, que não é muito bem documentado. O Google retorna alguns resultados, mais não são muito bons, principalmente para iniciantes.</p>
<p><span id="more-10"></span></p>
<h2>Porque você deve usar uma Maquina de Estado Finito?</h2>
<p>Para iniciar, se seu modelo tem um numero finito de diferentes estados, e você procura uma maneira fácil de fazer chamadas entre as mudanças de estados, como uma notificação, validação, incremento ou qualquer outra coisa.. </p>
<h2>Instalando o acts_as_state_machine</h2>
<p>Vá ate a pasta raiz de sua aplicação e execute:</p>
<pre name="code" class="ruby">
 $ ./script/plugin install http://elitists.textdriven.com/svn/plugins/acts_as_state_machine/trunk/
</pre>
<h2>Usando o acts_as_state_machine</h2>
<pre name="code" class="ruby">
  class Person < ActiveRecord::Base
    acts_as_state_machine :initial => :sleeping  

    state :sleeping
    state :showering
    state :working
    state :dating  

    event :shower do
      transitions :from => :sleeping, :to => :showering
      transitions :from => :working, :to => :showering
      transitions :from => :dating, :to => :showering
    end  

    event :work do
      transitions :from => :showering, :to => :working
      # Going to work before showering?  Stinky.
      transitions :from => :sleeping, :to => :working
    end  

    event :date do
      transitions :from => :showering, :to => :dating
    end  

    event :sleep do
      transitions :from => :showering, :to => :sleeping
      transitions :from => :working, :to => :sleeping
      transitions :from => :dating, :to => :sleeping
    end
  end
</pre>
<p><strong>NOTA:</strong> O plugin assume que o estado de seu model fica no campo <code>state</code>. Isso pode ser substituido com a adição da opção <code>:column => 'field'</code>.</p>
<p><strong>AVISO:</strong> Se você estiver usando um model que armazena endereços e existir o campo <code>"state"</code>. Você passara horas se perguntando por que as coisas não funcionam.</p>
<p>Observe que na linha 2 é declarado explicitamente o estado inicial. Dá linha 4 à 7 são indicados os vários estados que o Person pode estar.</p>
<p>Existe um aspecto bem peculiar ao se criar objetos usando o metodo <code>new</code>, quando o estado do objeto não é informado. O estado só será especificado quando salvar o novo registro. Uma solução é especificar o valor padrão do estado dentro da migração. Outra solução é usar o método <code>create</code></p>
<p><strong>Exemplo:</strong></p>
<pre name="code" class="ruby">
  person = Person.new
  person.state # nil
  person.save # true
  person.state # "sleeping"

  person = Person.create
  person.state # "sleeping"
  person.sleeping? # true
  person.rotting? # false

  person = Person.new
  person.state = "rotting" # "rotting"
  person.rotting? # true
  person.sleeping? # false
</pre>
<p><strong>NOTA:</strong> Caso não tenha notado, o método para testar se o <code>model</code>&#8220;state?&#8221;</p>
<p>Os <code>events</code> que você especifica também criam métodos na instância, para transitar de um <code>state</code> para outro. </p>
<p>Segue exemplos dos métodos que foram criados:</p>
<pre name="code" class="ruby">
  person.shower!
  person.work!
  person.date!
  person.sleep!
</pre>
<p><strong>NOTA:</strong> Os métodos criados seguem o padrão <code>"event!"</code></p>
<h2>Events</h2>
<p><strong>NOTA:</strong> Ao chamar um <code>event</code>, você também chama <code>ActiveRecord::Base.save</code>. Para quando ele falhar, apenas retorna <code>false</code>. Assegure-se de chamar <code>valid?</code> e <code>save!</code>.</p>
<p><code>Events</code> ajuda a você a migrar de um <code>state</code> para outro. Supondo que seu <code>person</code> esteja dormindo (<code>sleeping</code>), e queremos que ele vá para o chuveiro (<code>shower</code>), é só chama <code>shower!</code>.  </p>
<pre name="code", class="ruby">
  person.state # "sleeping"
  person.shower!
  person.state # "showering"
</pre>
<p><code>Events</code> te ajuda a organizar o fluxo no seu <code>model</code>. Porem eles podem ficar mais &#8220;poderosos&#8221; com os <code>callbacks</code>.</p>
<h2>Callbacks</h2>
<p>O <code>state</code> possui alguns <code>callbacks</code> que podem ser usados.</p>
<pre name="code" class="ruby">
 state :sleeping,
          :enter => :get_into_bed,
          :after => Proc.new {|model| model.whack_alarm_clock },
          :exit => :make_up_bed
</pre>
<p><code>Callbacks</code> são chamados quando os <code>models</code> estão em transição para um <code>state</code> especifico.</p>
<p><strong>NOTA:</strong> </p>
<ul>
<li><code>Callbacks</code> podem ser <code>symbol</code>ou <code>Proc</code>. Se usar um <code>symbol</code>, um método da instancia do <code>model</code> será chamado.</li>
<li>Os <strong><code>callbacks</code> agem diferentes</strong> em um <code>model</code> salvo de um novo e não salvo.</li>
</ul>
<p>Levando em consideração as chamadas ActiveRecord,  o callback de uma nova entrada seria:</p>
<ul>
<li>ActiveRecord::Base.before_save</li>
<li>ActiveRecord::Base.save</li>
<li>acts_as_state_machine :enter sleeping</li>
<li>acts_as_state_machine :after sleeping</li>
<li>ActiveRecord::Base.after_save</li>
</ul>
<p>Se o <code>model</code> não é uma nova entrada, os <code>callbacks</code> executam o seguinte, se eu tiver chamado o método <code>showe!</code>.</p>
<ul>
<li>acts_as_state_machine :enter showering</li>
<li>ActiveRecord::Base.before_save</li>
<li>ActiveRecord::Base.save</li>
<li>ActiveRecord::Base.after_save</li>
<li>acts_as_state_machine :after showering</li>
<li>acts_as_state_machine :exit sleeping</li>
</ul>
<h2>Protegendo os <code>states</code></h2>
<p>Mas como saber se você quer alguma espécie de validação para uma transição. Você sabe, só para garantir a integridade dos dados.</p>
<pre name="code" class="ruby">
  event :work do
    transitions :from => :showering, :to => :working
    # Going to work before showering?  Stinky.
    transitions :from => :sleeping, :to => :working, :guard => Proc.new {|o| o.clean? }
  end
</pre>
<p>A transição pode ser protegida especificando a opção <code>:guard</code> com um <code>symbol</code> ou um <code>Proc</code> (semelhante aos <code>callbacks</code>). O método ou <code>Proc</code> deve retornar <code>true</code> para prosseguir com a transição, ou ira falhar silenciosamente.</p>
<p>UPDATE: 26-05-2008</p>
<h3>LINKS</h3>
<ol>
<li>http://diogenesf.wordpress.com/2007/12/11/acts_as_state_machine-gerenciando-estados-de-um-model-rails/</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.ramonsoares.com/2008/01/27/traducao-ruby-on-rails-finite-state-machine-plugin-acts_as_state_machine.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Ubuntu + Ruby + Rails + Sqlite + Mongrel</title>
		<link>http://blog.ramonsoares.com/2008/01/02/ubuntu-ruby-rails-sqlite-mongrel.html</link>
		<comments>http://blog.ramonsoares.com/2008/01/02/ubuntu-ruby-rails-sqlite-mongrel.html#comments</comments>
		<pubDate>Wed, 02 Jan 2008 19:24:49 +0000</pubDate>
		<dc:creator>Ramon Soares</dc:creator>
		
		<category><![CDATA[Rails]]></category>

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

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

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

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

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

		<guid isPermaLink="false">http://blog.ramonsoares.com/2008/01/02/ubuntu-ruby-rails-sqlite-mongrel.html</guid>
		<description><![CDATA[Estava rolando uma discussão na lista rails-br sobre fazer roda o rails no ubuntu então eu decidir posta o meu &#8220;caminho da roça&#8221;. 
A seguir esta todos os programas que vamos instalar/configurar:

 Ruby 1.8.6-p111 (Interpretador); 
 Ruby Gems (Gerenciador de pacotes de softwares Ruby, estilo apt-get); 
 Rails 2.0.2 
 Sqlite 3 
 sqlite3-ruby (driver [...]]]></description>
			<content:encoded><![CDATA[<p>Estava rolando uma discussão na lista <a href="http://groups.google.com/group/rails-br" onclick="javascript:pageTracker._trackPageview ('/outbound/groups.google.com');">rails-br</a> sobre fazer roda o rails no ubuntu então eu decidir posta o meu &#8220;caminho da roça&#8221;. </p>
<p>A seguir esta todos os programas que vamos instalar/configurar:</p>
<ul>
<li> Ruby 1.8.6-p111 (Interpretador); </li>
<li> Ruby Gems (Gerenciador de pacotes de softwares Ruby, estilo apt-get); </li>
<li> Rails 2.0.2 </li>
<li> Sqlite 3 </li>
<li> sqlite3-ruby (driver do sqlite3 para ruby)</li>
</ul>
<p><span id="more-9"></span></p>
<h1>Instalando o Sqlite3</h1>
<p>Vamos começar instalado o sqlite e suas libs.</p>
<pre name="code" class="">
$ sudo apt-get install sqlite3 libsqlite3-0 libsqlite3-dev
</pre>
<h1>Baixando e Instalando o Ruby</h1>
<p>Agora vamos a nosso interpretador, existe uma versão dele no apt, mais com o apt é um tanto como desatualizado eu prefiro baixar e compilar a última versão stable. Como o ruby precisa de algumas libs vamos pedir uma ajudinha ao apt pra não precisarmos quebrar cabeça descobrindo quais libs precisamos:</p>
<pre name="code" class="php">
$ sudo apt-get build-dep ruby1.8
</pre>
<p>com isso ele vai instalar todas as libs que o pacote ruby1.8 precisar, que são as mesmas que vamos precisar pra instalar a nossa versão. Com tudo instalado e só fazer o seguinte</p>
<pre name="code" class="php">
$ wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p111.tar.gz
$ tar -zxvf ruby-1.8.6-p111.tar.gz
$ cd ruby-1.8.6-p111
$ ./configure --prefix=/usr
$ make
$ sudo make install
</pre>
<p>depois de executar os passos acima você terá o ruby rodando. Executando um ruby &#8211;version terá a seguinte saída:</p>
<pre name="code" class="php">
$ ruby --version
ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-linux]
</pre>
<h1>Baixando e Instalando o RubyGems</h1>
<p>Pra o rubygems tem existe uma versão no apt, porem mais uma vez eu prefiro baixa a ultima versão stable.</p>
<pre name="code" class="php">
$ wget http://rubyforge.org/frs/download.php/29548/rubygems-1.0.1.tgz
$ tar -zxvf rubygems-1.0.1.tgz
$ cd rubygems-1.0.1
$ ruby setup.rb
</pre>
<p>Pronto agora teremos o rubygems instalado e rodando. Executando o gem &#8211;version terá a seguinte saída:</p>
<pre name="code" class="php">
$ gem --version
1.0.1
</pre>
<h1>Baixando e Instalando o Rails e Mongrel</h1>
<p>Pronto apartir de agora a coisa fica fácil, vamos usar o rubygems para instalar tudo que precisamos. O rails existe no repositório do apt, contudo você terá problemas quando sair uma atualização pois vai demora pra essa atualização aparecer no apt, então vamos ao gem.</p>
<p>Execute o seguinte comando:</p>
<pre name="code" class="php">
$ sudo gem install rake

# eu sempre instalo atualizo o rails usando o servidor oficial pra evitar maiores problemas.
$ sudo gem install rails --source http://gems.rubyonrails.org/
$ sudo gem install mongrel
# este faz o rails se comunicar com o sqlite.
$ sudo gem install sqlite3-ruby
</pre>
<p>Agora esta tudo instalado. Bom proveito.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ramonsoares.com/2008/01/02/ubuntu-ruby-rails-sqlite-mongrel.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>2007.year + 1.year # =&gt; 2008 Years</title>
		<link>http://blog.ramonsoares.com/2008/01/02/2007year-1year-2008-years.html</link>
		<comments>http://blog.ramonsoares.com/2008/01/02/2007year-1year-2008-years.html#comments</comments>
		<pubDate>Wed, 02 Jan 2008 03:00:16 +0000</pubDate>
		<dc:creator>Ramon Soares</dc:creator>
		
		<category><![CDATA[Rails]]></category>

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

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

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

		<category><![CDATA[On Rails]]></category>

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

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

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

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

		<category><![CDATA[visite a bahia]]></category>

		<category><![CDATA[visite o brasil]]></category>

		<guid isPermaLink="false">http://blog.ramonsoares.com/2008/01/02/2007year-1year-2008-years.html</guid>
		<description><![CDATA[Bem la vem eu apois um bom tempo sem postar (preguiça mesmo) e com o único artigo incompleto. Este ano eu vou toma jeito pra o lado do blog, ainda essa semana eu termino a tradução do artigo que já esta ai no ar e termino outros 2 que ainda estão com rascunho. 
Esse inicio [...]]]></description>
			<content:encoded><![CDATA[<p>Bem la vem eu apois um bom tempo sem postar (preguiça mesmo) e com o único artigo incompleto. Este ano eu vou toma jeito pra o lado do blog, ainda essa semana eu termino a tradução do artigo que já esta ai no ar e termino outros 2 que ainda estão com rascunho. </p>
<p>Esse inicio de ano vai ser um pouco corrido, tenho alguns projetos ai pra da andamento e lançar no mercado, pois graças a deus mesmo antes de esta pronto já tenho clientes pra eles. Vou falar um pouco sobre os mesmos.</p>
<p>O primeiro e o que considero o de maior importância é o Visite o Brasil, que vai ser um projeto bastante grande e que vai me trazer bastante retorno.<br />
O projeto vem de &#8220;nacionalizar&#8221; o <a href="http://www.visiteabahia.com.br" alt="Visite a Bahia" onclick="javascript:pageTracker._trackPageview ('/outbound/www.visiteabahia.com.br');">Visite a Bahia</a>, que apesar de ser um site &#8220;feio&#8221; tem uma grande visitação, e é bastante grande porem &#8220;bagunçado&#8221;, vamos recriar completamente o sistema e o layout abusando o máximo possível do conceito  web 2.0.</p>
<p>Outros dois projetos são pessoais, mais que existe uma grande possibilidade de da certo, em parte por ter pessoas que realmente entendem do assunto colaborando para que os mesmos dêem certo, pois os mesmo serão usuários dos sistemas. Não vou anunciar oq é pois o mercado carece dos mesmos e eu não quero concorrentes. <img src='http://blog.ramonsoares.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>E só pra constar os 3 projetos ai serão feitos em <a href="http://www.rubyonrails.org/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.rubyonrails.org');">Ruby on Rails</a>, que é uma coisa a qual quero me foca completamente este ano, mais como diz o <a href="http://www.regex.pro.br/" onclick="javascript:pageTracker._trackPageview ('/outbound/www.regex.pro.br');">Felipe Pena</a> (ecl para os v<strong>irc</strong>iados.) <em>&#8220;não deixe o php.&#8221;</em>, então continuarei com o php e voltarei a meu estudo do <a href="http://www.symfony-project.org" alt="symfony Web PHP Framework" onclick="javascript:pageTracker._trackPageview ('/outbound/www.symfony-project.org');">symfony</a> cuja larguei para estudar o rails e me lembro de pouca coisa (para n dizer nada).</p>
<p>Axo q é isso!! Agora só espero não esquecer do pobre do blog de novo novamente.</p>
<p>AAAAAAAAAAAAAAAAAAAaa, já ia esquecendo&#8230;.<br />
liberei um pastebin público. é só acesso: <a href="http://paste.ramonsoares.com">http://paste.ramonsoares.com</a><br />
devo estar traduzindo por esses dias. deverei liberar varias &#8220;coizitas&#8221; assim o geral. Então abusem. (pois o google ta me pagando pra isso. rrs I Love AdSense)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ramonsoares.com/2008/01/02/2007year-1year-2008-years.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>[Tradução] Acts_As_Ferret Tutorial</title>
		<link>http://blog.ramonsoares.com/2007/10/08/traducao-acts_as_ferret-tutorial.html</link>
		<comments>http://blog.ramonsoares.com/2007/10/08/traducao-acts_as_ferret-tutorial.html#comments</comments>
		<pubDate>Tue, 09 Oct 2007 02:14:52 +0000</pubDate>
		<dc:creator>Ramon Soares</dc:creator>
		
		<category><![CDATA[Rails]]></category>

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

		<category><![CDATA[On Rails]]></category>

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

		<guid isPermaLink="false">http://blog.ramonsoares.com/2007/10/08/traducao-acts_as_ferret-tutorial/</guid>
		<description><![CDATA[Bem eu tinha dito no post anterior que estava cansado de escrever por hoje, + andei brincando um pouco com o Ferret e Act_As_Ferret que é na mais simples das explicações é uma engine de busca por textos. Em minha busca por conteúdo de estudo encontrei com ajuda do grande guru um ótimo tutorial, e [...]]]></description>
			<content:encoded><![CDATA[<p>Bem eu tinha dito no post anterior que estava cansado de escrever por hoje, + andei brincando um pouco com o <a href="http://ferret.davebalmain.com/trac/" onclick="javascript:pageTracker._trackPageview ('/outbound/ferret.davebalmain.com');">Ferret</a> e <a href="http://projects.jkraemer.net/acts_as_ferret/wiki" onclick="javascript:pageTracker._trackPageview ('/outbound/projects.jkraemer.net');">Act_As_Ferret</a> que é na mais simples das explicações é uma engine de busca por textos. Em minha busca por conteúdo de estudo encontrei com ajuda do <a href="http://www.google.com" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.google.com');">grande guru</a> um ótimo <a href="http://www.railsenvy.com/2007/2/19/acts-as-ferret-tutorial" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.railsenvy.com');">tutorial</a>, e decidir meio que traduzi-lo + acrescentando algumas observações.</p>
<p>Segue a &#8220;tradução&#8221;:</p>
<p><span id="more-6"></span></p>
<p>Se você quer adicionar uma busca rápida por textos em sua aplicação, e não teve sorte com o que o MySQL oferece, ou quer trabalhar com algo um pouco mais customizavel (e bastante rápido). Este tutorial lhe mostrara exatamente como fazer.</p>
<ol>
<li><a href="#what">O Que é o Ferret?</a></li>
<li><a href="#acts">Acts_As_Ferret</a></li>
<li><a href="#basic">Uso Básico</a></li>
<li><a href="#pagination">Busca com Paginação</a></li>
<li>Busca Avançada</li>
<li>Busca Fora dos Campos Padrões</li>
<li>Classificação Avançada (???)</li>
<li>Armazenando Campo (???)</li>
<li>Highlighting</li>
<li>Resultados Turbinados</li>
<li>Uso em Produção</li>
</ol>
<p><a title="what" name="what"></a></p>
<h2>O que exatamente é o Ferret?</h2>
<p>O Ferret é uma biblioteca de uma engine de busca de textos de alta performance para o Ruby baseada no Apache Lucene (que todo grande menino do java utiliza). Para instalar é muito simples:</p>
<pre name="code" class="ruby">gem install ferret</pre>
<p><a title="acts" name="acts"></a></p>
<h2>Então veio o Acts_As_Ferret</h2>
<p>Felizmente para nos desenvolvedores Rail, <a href="http://www.jkraemer.net/" title="Jens Kramer" onclick="javascript:pageTracker._trackPageview ('/outbound/www.jkraemer.net');">Jens Kramer</a> escreveu o <a href="http://projects.jkraemer.net/acts_as_ferret/wiki" title="Acts As Ferret" onclick="javascript:pageTracker._trackPageview ('/outbound/projects.jkraemer.net');">Acts As Ferret</a>, que nos propicia de forma muito simples a criação de um complexa index de busca em um curto período de tempo.</p>
<h5>Instalação: (Via Sistema)</h5>
<p>As versões superiores a 0.3.1 disponíveis pelo gem. E você pode usar:</p>
<pre name="code" class="ruby">gem install acts_as_ferret</pre>
<p>isto ira instalar a ultima versão no seu repositório gem local. Em sua aplicação Rails, você devera adicionar o seguinte código em environment.rb</p>
<pre name="code" class="ruby">require 'acts_as_ferret'</pre>
<p>Além disso, você deve copiar os scripts para iniciar e parar o o DRb Server e o arquivo de configuração do repositório gem para o seu projeto Rails:</p>
<pre name="code" class="ruby">
cp /usr/lib/ruby/gems/1.8/gems/acts_as_ferret-0.4.1/script/ferret_st* script/
cp /usr/lib/ruby/gems/1.8/gems/acts_as_ferret-0.4.1/config/ferret_server.yml config/</pre>
<h5>Instalação: (Via Plugin)</h5>
<pre name="code" class="ruby">ruby script/plugin install svn://projects.jkraemer.net/acts_as_ferret/tags/stable/acts_as_ferret</pre>
<p><a title="basic" name="basic"></a></p>
<h2>Uso Básico</h2>
<p>Vamo começar com o mais simples dos exemplos e vamos avançar a partir disso.</p>
<p>A primeira coisa que você deverá fazer é ir no model em que você pretende adicionar um índice e adicionar no topo:</p>
<pre name="code" class="ruby">
class Member &lt; ActiveRecord::Base
  acts_as_ferret :fields =&gt; [:first_name, :last_name]
end</pre>
<p>Como você pode ver, você vai especificar o nome dos campos que deseja indexar. Quando fizer uma busca, todos os campos especificados serão pesquisados e apenas Members serão retornados.</p>
<h5>Como fazer um pesquisa simples</h5>
<p>O Plugin Acts As Ferret adiciona métodos de busca adicionais aos Model do ActiveRecord. E ao contrario de outros tutoriais, vamos começar com:</p>
<p><code>find_id_by_contents</code></p>
<p>Portanto, se executamos:</p>
<pre name="code" class="ruby">
total_results, members = Member.find_id_by_contents("Gregg")</pre>
<p>Vai acontecer o seguinte:<br />
1. A pasta /index/development/member dentro de sua aplicação rails é criada e é onde ficaram os arquivos de índice.<br />
2. Todos os Members da minha consulta e seu primeiro/último nome serão adicionados ao índice. Agora todas as vezes que adicionar/atualizar/remover um Member, este índice será automaticamente atualizado. Se você precisar recriar o índice, basta remover a pasta correspondente e reiniciar o servidor, e o índice será recriado na próxima consulta a tabela.<br />
3. O Acts As Ferret executa a função Ferret&#8217;s <a href="http://ferret.davebalmain.com/api/classes/Ferret/Index/Index.html#M000022" onclick="javascript:pageTracker._trackPageview ('/outbound/ferret.davebalmain.com');">Search_Each</a> no index.<br />
4. É retornado o total de itens e os 10 primeiros resultados, no seguinte formato:</p>
<pre name="code" class="ruby">
members = [
         {:model =&gt; "Member", :id =&gt; "4", :score =&gt; "1.0"},
         {:model =&gt; "Member", :id =&gt; "21", :score =&gt; "0.93211"},
         {:model =&gt; "Member", :id =&gt; "27", :score =&gt; "0.32212"}
         ]</pre>
<p>Recebemos um Array com os 10 primeiros resultados (Foram mostrados apenas 3 acima) com o id e a relevância de cada um.<br />
No entanto se por exemplo existir 40 resultados possíveis, só teremos retornados os 10 primeiros resultados.</p>
<h5>E se quisermos mais de 10 resultados?</h5>
<p>O find_id_by_contents tem um conjunto de opções que podem ser passados:</p>
<p>Opções:</p>
<ul>
<li>offset:<br />
Default: 0<br />
Ajusta o offset do retorno. Isto é usado para paginar o resultado. Vamos supor que você mostre 10 resultados por pagina. Se você não encontrar o resultado desejado nos 10 primeiros resultados. Se você definir o :offset para 10 e vai ter os próximos 10 resultados.</li>
<li>limit:<br />
Default: 10<br />
Este é o numero de resultados que deve ser retornado. Defina :limit para :all para que seja retornado todos os resultados.</li>
</ul>
<p>Outras opções podem ser encontradas <a href="http://ferret.davebalmain.com/api/classes/Ferret/Index/Index.html#M000022" onclick="javascript:pageTracker._trackPageview ('/outbound/ferret.davebalmain.com');">aqui</a>.</p>
<h2>Se preferir, você pode usa find_id_by_contents passando com bloco de código:</h2>
<pre name="code" class="ruby">
results = []
total_results = Member.find_id_by_contents("Gregg") {|result|
        results.push result
}</pre>
<p>Neste ponto você deve esta pensando: &#8220;Bem eu quero mostrar os resultados da pesquisa e não apenas os IDs e pra isso eu vou ter que consultar os Models&#8221;. Assim você pode acabar fazendo algo do tipo:</p>
<pre name="code" class="ruby">
results = []
total_results = Member.find_id_by_contents("Gregg") {|result|
        results.push Member.find(result[:id])
}</pre>
<h2>No entanto existe uma maneira melhor!</h2>
<p>Pra isso tem o <a href="http://projects.jkraemer.net/acts_as_ferret/rdoc/classes/ActsAsFerret/ClassMethods.html#M000010" onclick="javascript:pageTracker._trackPageview ('/outbound/projects.jkraemer.net');">find_by_contents</a>.</p>
<pre name="code" class="ruby">@results = Member.find_by_contents("Gregg")</pre>
<p>O find_by_contents faz o seguinte:</p>
<ul>
<li>Primeiro chama o nosso amigo &#8220;find_id_by_contents&#8221; e pega os IDs.</li>
<li> Mantem todos os IDs retornado, em seguida, consulta os dados do Model. Portanto, se o Member 4, 21 e 27 foram retornados, ele ira fazer uma consulta para obter os dados atuais: select * from members where (members.id in (&#8217;4&#8242;, &#8216;21&#8242;, &#8216;27&#8242;))</li>
<li>Retorna um array com o resultado, que podemos considerar um Array com objetos ActiveRecord, mais que é na verdade um objeto ActsAsFerret:: SearchResults (com algumas características adicionais como mostrado a baixo).</li>
</ul>
<p>Poderíamos fazer algo como:</p>
<pre name="code" class="ruby">
members = Member.find_by_contents("Gregg")

# It gives us total hits!
puts "Total hits = #{members.total_hits}"
for member in members
   puts "#{member.first_name} #{member.last_name}"

   # And the search Score!
   puts "Search Score = #{member.ferret_score}"
end</pre>
<p>Verifique que &#8220;total_hits&#8221; e &#8220;ferret_score&#8221; não são campos da tabela. São informações adicionadas pelo plugin.</p>
<p><a title="pagination" name="pagination"></a></p>
<h2>E então, como eu posso paginar?</h2>
]]></content:encoded>
			<wfw:commentRss>http://blog.ramonsoares.com/2007/10/08/traducao-acts_as_ferret-tutorial.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>É nois na finta</title>
		<link>http://blog.ramonsoares.com/2007/10/08/e-nois-na-finta.html</link>
		<comments>http://blog.ramonsoares.com/2007/10/08/e-nois-na-finta.html#comments</comments>
		<pubDate>Tue, 09 Oct 2007 01:53:49 +0000</pubDate>
		<dc:creator>Ramon Soares</dc:creator>
		
		<category><![CDATA[Textos]]></category>

		<guid isPermaLink="false">http://blog.ramonsoares.com/e-nois-na-finta</guid>
		<description><![CDATA[olá cambada,
E ieu chegando de fininho no mundo dos bloqueiros, espero n me &#8220;infectar&#8221; e me torna dependente disso. (rs)
Estarei colocando aqui minhas experiências sobre assuntos que eu acredite que sejam relevantes, os assuntos deveram se restringir a área de tecnologia, nada de vídeos engraçados (assim espero) ou assuntos idiotas só pra chamar visitantes, pq [...]]]></description>
			<content:encoded><![CDATA[<p>olá cambada,</p>
<p>E ieu chegando de fininho no mundo dos bloqueiros, espero n me &#8220;infectar&#8221; e me torna dependente disso. (rs)</p>
<p>Estarei colocando aqui minhas experiências sobre assuntos que eu acredite que sejam relevantes, os assuntos deveram se restringir a área de tecnologia, nada de vídeos engraçados (assim espero) ou assuntos idiotas só pra chamar visitantes, pq antes de tudo este blog e para eu colocar coisas que eu ache importante e que me tenha alguma serventia em algum outro momento.</p>
<p>E como eu n espero e n quero ganhar dinheiro não será exibida nenhuma publicidade seja ela qual for. Pq eu sinceramente odeio entrar num blog e metade do que vejo é propaganda, n entro no ca***** de um blog pra ver po*** (BUUUUUA, bem que podia fazer PIIIIIIIII) de publicidade.</p>
<p>Bem é isso a, já cansei de escrever por hoje (se duvidar pela semana).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ramonsoares.com/2007/10/08/e-nois-na-finta.html/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
