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

<channel>
	<title>Blog do Camata</title>
	<atom:link href="http://douglascamata.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://douglascamata.net</link>
	<description></description>
	<lastBuildDate>Sat, 06 Apr 2013 22:13:25 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Compilando cgminer no OS X</title>
		<link>http://douglascamata.net/compilando-cgminer-no-os-x/</link>
		<comments>http://douglascamata.net/compilando-cgminer-no-os-x/#comments</comments>
		<pubDate>Sat, 06 Apr 2013 22:13:25 +0000</pubDate>
		<dc:creator>Douglas Camata</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bitcoin]]></category>
		<category><![CDATA[cgminer]]></category>
		<category><![CDATA[compilar]]></category>
		<category><![CDATA[gpu mining]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[mac os]]></category>
		<category><![CDATA[mac os x]]></category>
		<category><![CDATA[mining]]></category>
		<category><![CDATA[osx]]></category>

		<guid isPermaLink="false">http://douglascamata.net/?p=96</guid>
		<description><![CDATA[Para compilar o cgminer no OS X será necessário instalar algumas bibliotecas no sistema. Para isso será usado o Homebrew. Para instalá-lo bastante executar $ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go) Depois, instalar as bibliotecas necessárias usando o seguinte comando: $ brew install git autoconf automake c-ares curl libusb pkg-config wget Agora, clonamos o repositório de..]]></description>
				<content:encoded><![CDATA[<p>Para compilar o cgminer no OS X será necessário instalar algumas bibliotecas no sistema. Para isso será usado o <a title="Homepage do Homebrew" href="http://brew.sh/">Homebrew</a>. Para instalá-lo bastante executar</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt">$</span> <span class="wp-shkshell-command">ruby</span> -e <span class="wp-shkshell-string">"$(<span class="</span>wp-shkshell-command">curl</span> -fsSL https://raw.github.com/mxcl/homebrew/go)<br /></div>

<p>Depois, instalar as bibliotecas necessárias usando o seguinte comando:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt">$</span> <span class="wp-shkshell-command">brew</span> install git autoconf automake c-ares curl libusb pkg-config wget<br /></div>

<p>Agora, clonamos o repositório de código e compilamos o projeto:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt">$</span> <span class="wp-shkshell-command">git</span> clone https://github.com/ckolivas/cgminer.git<br />cd cgminer<br />./autogen.sh PKG_CONFIG_PATH=/usr/local/opt/curl/lib/pkgconfig<br />make<br />make install<br /></div>

<p>Pronto, o cgminer será compilado com suporte a GPU mining e será instalado no sistema. Se você desejar rodar ele direto da pasta onde foi compilado e não instalar, basta omitir o último passo e executar o binário cgminer.</p>
]]></content:encoded>
			<wfw:commentRss>http://douglascamata.net/compilando-cgminer-no-os-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IOR Tutorial (versão outubro, 2004) no Linux e Mac</title>
		<link>http://douglascamata.net/ior-tutorial-versao-outubro-2004-no-linux-e-mac/</link>
		<comments>http://douglascamata.net/ior-tutorial-versao-outubro-2004-no-linux-e-mac/#comments</comments>
		<pubDate>Sat, 06 Apr 2013 21:55:27 +0000</pubDate>
		<dc:creator>Douglas Camata</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[heurística]]></category>
		<category><![CDATA[IOR]]></category>
		<category><![CDATA[IORTutorial]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://douglascamata.net/?p=90</guid>
		<description><![CDATA[Precisei do programa IOR Tutorial para rodar alguns algoritmos da disciplina de Complexidade e Heurística, fui procurar na internet para download e encontrei somente versões antigas, sem a parte de heurísticas e um instalador .exe. Como o programa é feito em Java, resolvi procurar onde estava o arquivo JAR que ele executa. Extrai ele do instalador,..]]></description>
				<content:encoded><![CDATA[<p>Precisei do programa IOR Tutorial para rodar alguns algoritmos da disciplina de Complexidade e Heurística, fui procurar na internet para download e encontrei somente versões antigas, sem a parte de heurísticas e <a title="Instalador exe IORTutorial " href="http://highered.mcgraw-hill.com/sites/0073017795/student_view0/ior_tutorial.html">um instalador <strong>.exe</strong></a>. Como o programa é feito em Java, resolvi procurar onde estava o arquivo JAR que ele executa. Extrai ele do instalador, resolvi meu problema e resolvi compartilhar com os amigos que talvez passem por este problema.</p>
<p>Basta baixar o <span style="color: #ff0000;"><span style="color: #0000ff;"><strong><span style="text-decoration: underline;"><a title="IOR Tutorial" href="IORTutorial.jar (8.5 MB) https://mega.co.nz/#!QlFlVQAB!WCOb8nYXsur_SqFvP-3vpgRsFptvBZjwtg4pDGImof4"><span style="color: #0000ff; text-decoration: underline;">IORTutorial.jar</span></a></span></strong></span> </span>e executar no terminal:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt">$</span> <span class="wp-shkshell-command">java</span> -jar IORTutorial.jar<br /></div>

]]></content:encoded>
			<wfw:commentRss>http://douglascamata.net/ior-tutorial-versao-outubro-2004-no-linux-e-mac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Passenger, Rails 3.2.6 (ou 3.1), rails_admin e URL relativa (prefixo)</title>
		<link>http://douglascamata.net/passenger-rails-3-2-6-ou-3-1-rails_admin-e-url-relativa-prefixo/</link>
		<comments>http://douglascamata.net/passenger-rails-3-2-6-ou-3-1-rails_admin-e-url-relativa-prefixo/#comments</comments>
		<pubDate>Sun, 29 Jul 2012 03:09:07 +0000</pubDate>
		<dc:creator>Douglas Camata</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://douglascamata.net/?p=60</guid>
		<description><![CDATA[Durante minha aventura de colocar uma aplicação Rails em produção em uma url com prefixo (www.sistemas.com/meu, por exemplo) quase tudo estava funcionando bem, até que eu visitei a interface gerada pelo rails_admin. Algumas imagens estavam perdidas, mas outras estavam no lugar, um verdadeiro pandemônio. Com uma verificada rápida no html, notei que algumas urls para imagens..]]></description>
				<content:encoded><![CDATA[<p>Durante minha aventura de colocar uma aplicação Rails em produção em uma url com prefixo (www.sistemas.com/meu, por exemplo) quase tudo estava funcionando bem, até que eu visitei a interface gerada pelo <a href="https://github.com/sferik/rails_admin"><strong>rails_admin</strong></a>. Algumas imagens estavam perdidas, mas outras estavam no lugar, um verdadeiro pandemônio. Com uma verificada rápida no html, notei que algumas urls para imagens não estavam com o prefixo da url, mas por que outras estavam? Um detalhe importante: somente as imagens definidas via CSS estavam com a url errada, todas as outras estavam normais.</p>
<p>Googleada aqui, googleada lá&#8230; encontrei <a href="http://stackoverflow.com/questions/7293918/broken-precompiled-assets-in-rails-3-1-when-deploying-to-a-sub-uri" target="_blank">uma ask no Stack Overflow</a> sobre tal problema no Rails 3.1. Não gostei muito do método utilizado pra resolver o problema, que era um bug na gem <strong>sass-rails</strong> e esperava que no 3.2 já estivesse resolvido. Atualizei minha versão do Rails para a 3.2.6, que era a 3.1 e nada. Aproveitei um link para a <a href="https://github.com/rails/sass-rails/issues/17" target="_blank">issue sobre este bug no projeto da gem</a>. Nesta issue é explicado muito bem o que causa o problema e é disponibilizado um <strong>monkey patch</strong> pra resolver no Rails 3.1. Também tem um link para uma pull request que resolve o problema no Rails 3.2, mas adiciona um passo extra para fazer deploy da aplicação: definir na variável de ambiente <strong>RAILS_RELATIVE_URL_ROOT</strong> a url usada como prefixo antes de compilar os assets. Então, na hora de compilar os assets ficaria assim:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt">$</span> <span class="wp-shkshell-command">RAILS_RELATIVE_URL_ROOT</span>='/meu_prefixo' rake assets:compile<br /></div>

<p>Quem usa o <a href="https://github.com/capistrano/capistrano/" target="_blank">Capistrano</a> para fazer deploy, como eu, basta adicionar esta linha em algum lugar do config/deploy.rb:</p>
<pre class="brush: ruby; title: ; notranslate">default_environment[&quot;RAILS_RELATIVE_URL_ROOT&quot;] = &quot;/meu_prefixo&quot;</pre>
<p>Se você usa Rails 3.1, além da variável da ambiente, você deverá criar um arquivo na pasta <strong>initializers</strong> (com o nome que quiser)<strong> </strong>e colocar o monkey patch nele:</p>
<pre class="brush: ruby; title: ; notranslate">
module Sass
  module Rails
    module Helpers
      protected
      def public_path(asset, kind)
        resolver = options[:custom][:resolver]
        asset_paths = resolver.context.asset_paths
        path = resolver.public_path(asset, kind.pluralize)
        if !asset_paths.send(:has_request?) &amp;&amp; ENV['RAILS_RELATIVE_URL_ROOT']
          path = ENV['RAILS_RELATIVE_URL_ROOT'] + path
        end
        path
      end
    end
  end
end
</pre>
]]></content:encoded>
			<wfw:commentRss>http://douglascamata.net/passenger-rails-3-2-6-ou-3-1-rails_admin-e-url-relativa-prefixo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando banco de dados utf8 no PostgreSQL</title>
		<link>http://douglascamata.net/criando-banco-de-dados-utf8-no-postgresql/</link>
		<comments>http://douglascamata.net/criando-banco-de-dados-utf8-no-postgresql/#comments</comments>
		<pubDate>Sun, 29 Jul 2012 01:58:32 +0000</pubDate>
		<dc:creator>Douglas Camata</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://douglascamata.net/?p=48</guid>
		<description><![CDATA[Ao colocar minha primeira aplicação Rails + PostgreSQL em produção no Ubuntu Server 12.04, me deparei com um problema de encoding ao tentar rodar as migrations. Depois de muita luta, raiva, vontade de usar MySQL e uma pesquisada no Google encontrei a causa e a solução do problema. Nas novas versões do Ubuntu, o PostgreSQL..]]></description>
				<content:encoded><![CDATA[<p>Ao colocar minha primeira aplicação Rails + PostgreSQL em produção no Ubuntu Server 12.04, me deparei com um problema de encoding ao tentar rodar as migrations. Depois de muita luta, raiva, vontade de usar MySQL e uma pesquisada no Google encontrei a causa e a solução do problema.</p>
<p>Nas novas versões do Ubuntu, o PostgreSQL está ajustando o <strong>encoding</strong> dos bancos de dados de acordo com a <strong>locale </strong>do sistema. No meu caso, instalei com o idioma Português do Brasil e ele estava forçando o encoding para <strong>latin1</strong>, enquanto a aplicação queria usar <strong>utf8 </strong>e mesmo alterando na configuração de banco de dados da minha aplicação a coisa não deu certo. A solução<strong> </strong>que eu encontrei força o PostgreSQL a criar o cluster com um determinado locale, assim podemos forçar ele a usar utf8.</p>
<p>Suponhamos que a versão do PostgreSQL seja a 9.1, basta executar no terminal:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt">$</span> <span class="wp-shkshell-command">sudo</span> pg_dropcluster --stop 9.1 main<br /><span class="wp-shkshell-prompt">$</span> <span class="wp-shkshell-command">sudo</span> pg_createcluster --locale=en_US.utf8 --start 9.1 main<br /></div>

<p>Se você quiser ver uma lista dos locales do seu sistema, execute:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt">$</span> <span class="wp-shkshell-command">locale</span> --all-locales<br /></div>

]]></content:encoded>
			<wfw:commentRss>http://douglascamata.net/criando-banco-de-dados-utf8-no-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como trocar a senha do usuário padrão (ou qualquer outro) do PostgreSQL</title>
		<link>http://douglascamata.net/como-trocar-a-senha-do-usuario-padraoou-qualquer-outro-do-postgresql/</link>
		<comments>http://douglascamata.net/como-trocar-a-senha-do-usuario-padraoou-qualquer-outro-do-postgresql/#comments</comments>
		<pubDate>Sun, 29 Jul 2012 01:26:19 +0000</pubDate>
		<dc:creator>Douglas Camata</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://douglascamata.net/?p=38</guid>
		<description><![CDATA[Muitas vezes ao fazer uma instalação do PostgreSQL (principalmente em servidores de produção) nós precisamos mudar a senha do usuário padrão (postgres) e isso não é algo trivial. Para trocar a senha do usuário do banco de dados, precisamos inicialmente logar como o usuário postgres no computador. Como faremos isso se não temos a senha..]]></description>
				<content:encoded><![CDATA[<p>Muitas vezes ao fazer uma instalação do PostgreSQL (principalmente em servidores de produção) nós precisamos mudar a senha do usuário padrão (postgres) e isso não é algo trivial. Para trocar a senha do usuário do banco de dados, precisamos inicialmente logar como o usuário postgres no computador. Como faremos isso se não temos a senha dele? Calma, amigo, não temos a senha dele mas temos o poder do <strong>SUDO</strong>.</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt">$</span> [<span class="wp-shkshell-command">sudo</span>] su postgres<br /></div>

<p>O próximo passo é abrir o interpretador do PostgreSQL:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt">$</span> <span class="wp-shkshell-command">psql</span><br /></div>

<p>Agora basta executar uma simples instrução pgSQL:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt">$</span> <span class="wp-shkshell-command">alter</span> user postgres with encrypted password <span class="wp-shkshell-string">'nova_senha_desejada'</span><span class="wp-shkshell-special">;</span><br /></div>

]]></content:encoded>
			<wfw:commentRss>http://douglascamata.net/como-trocar-a-senha-do-usuario-padraoou-qualquer-outro-do-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Começando com testes em Python</title>
		<link>http://douglascamata.net/comecando-com-testes-em-python/</link>
		<comments>http://douglascamata.net/comecando-com-testes-em-python/#comments</comments>
		<pubDate>Mon, 06 Dec 2010 00:01:00 +0000</pubDate>
		<dc:creator>Douglas Camata</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://douglascamata.net/?p=18</guid>
		<description><![CDATA[Olá pessoal, depois de muito tempo sem tempo (e idéias) para postar, eu finalmente tive uma boa idéia. Você ai, que programa em C ou até mesmo já em Python, como você testa seus programas? Fica conferindo a saída do terminal pra ver se está como deveria? E quando o seu programa se torna difícil..]]></description>
				<content:encoded><![CDATA[<p>Olá pessoal, depois de muito tempo sem tempo (e idéias) para postar, eu finalmente tive uma boa idéia. Você ai, que programa em C ou até mesmo já em Python, como você testa seus programas? Fica conferindo a saída do terminal pra ver se está como deveria? E quando o seu programa se torna difícil de testar visualmente? É um problema né? Apresento a você a SOLUÇÃO para os seus problemas: testes automatizados.</p>
<h2>Como eu faço isso tio?</h2>
<p>É simples! Usando bibliotecas próprias para testes, criamos nossos testes baseados em como o programa deve funcionar. Eles podem ser escritos depois do próprio código ou antes. A prática de escrever testes ANTES é extremamente útil. Com ela você já define como será a interface, a nível de código, das suas classes e funções, e precisa codificar somente o suficiente para passar nos testes criados.</p>
<h2>Falar é fácil né? Faz ai, quero ver!</h2>
<p>Então tá. Mostrarei um exemplo em Python, por ser simples, mas existem bibliotecas de testes para Java, C, C#, Ruby, etc&#8230; basta procurar. O intuito aqui não é comparar as ferramentas de testes de linguagens, mas sim mostrar como testes automatizados podem facilitar (muito) a sua vida. Suponhamos que temos o seguinte código a ser testado:</p>
<pre class="brush: python; title: ; notranslate">
class Calculadora(object):
    @staticmethod
    def soma(num1, num2):
        return num1 + num2
</pre>
<p>Podemos escrever os testes da seguinte maneira:</p>
<pre class="brush: python; title: ; notranslate">
import unittest # biblioteca responsável pela suíte de testes
from should_dsl import * # biblioteca que disponibiliza matchers mais legíveis
from calculadora import Calculadora # importando a nossa classe a ser testada

    class CalculadoraTest(unittest.TestCase):
        def testa_soma(self):
            calculadora.soma(1,1) |should| equal_to(2)

if __name__ == '__main__':
    unittest.main()
</pre>
<p>Para rodar os testes é só executar o arquivo que os contém. Não é LINDO? Este é um caso muito simples, mas existem casos de programas complexos que seria completamente inviável ficar testando no &#8220;olho&#8221;. Os testes automatizados te dão um feedback instantâneo (dependendo do que está testando e da quantidade de testes feitos) da aplicação. Em pouquíssimo tempo você sabe se aquela modificação que você acabou de fazer funciona ou não, com o simples uso de 1 comando e sem dor de cabeça.</p>
<h2>Python é lindo! Do que eu preciso para criar aplicações com testes no meu PC? *-*</h2>
<p>Primeiramente, precisa do Python instalado, claro. A biblioteca unittest já está incluída por padrão juntamente com o interpretador. Para instalar a biblioteca should_dsl é só executar:</p>
<pre id="terminal"> [sudo] pip install should_dsl</pre>
<p>Ou, se você o easy_install:</p>
<pre id="terminal"> [sudo] easy_install should_dsl</pre>
<p>Agora você já pode começar a parar de ficar imprimindo coisas na tela para &#8220;testar&#8221; e começar a fazer isso de verdade! Quando você começar a usar, nunca mais vai querer parar! É viciante e ajuda demais.</p>
<h2>Gostei, onde encontro mais informação sobre testes em Python?</h2>
<p>Na própria documentação do UnitTest: <a href="http://docs.python.org/library/unittest.html">http://docs.python.org/library/unittest.html</a><br />
No tutorial DiveIntoPython: <a href="http://diveintopython.org/unit_testing/">http://diveintopython.org/unit_testing/</a></p>
<p>E no Google. <img src='http://douglascamata.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Bom, por enquanto é só isso amigos&#8230; até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://douglascamata.net/comecando-com-testes-em-python/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Compilando o Python 2.6 com zlib e sqlite no Debian 5</title>
		<link>http://douglascamata.net/compilando-o-python-2-6-com-zlib-e-sqlite-no-debian-5/</link>
		<comments>http://douglascamata.net/compilando-o-python-2-6-com-zlib-e-sqlite-no-debian-5/#comments</comments>
		<pubDate>Thu, 30 Sep 2010 02:56:00 +0000</pubDate>
		<dc:creator>Douglas Camata</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://douglascamata.net/?p=17</guid>
		<description><![CDATA[Olá pessoal, faz um tempinho que eu havia decidido fazer um post sobre isso e acabei esquecendo, mas hoje me lembrei e não me perguntem a razão. Eu tive uma grande dor de cabeça quando tive que compilar o Python 2.6 no Debian 5 com a zlib e suporte a sqlite3. Agora ensinarei a vocês..]]></description>
				<content:encoded><![CDATA[<p>Olá pessoal, faz um tempinho que eu havia decidido fazer um post sobre isso e acabei esquecendo, mas hoje me lembrei e não me perguntem a razão. Eu tive uma grande dor de cabeça quando tive que compilar o Python 2.6 no Debian 5 com a zlib e suporte a sqlite3. Agora ensinarei a vocês para que não passem pelo mesmo que eu passei.</p>
<p>Primeiramente instale os pacotes de desenvolvimento que serão necessários para que tudo seja compilado sem problemas:</p>
<pre id="terminal"> sudo apt-get install build-essential linux-headers-`uname -r` build-essential libncursesw5-dev libreadline5-dev libssl-dev libgdbm-dev libbz2-dev libc6-dev libsqlite3-dev libdb-dev tk-dev</pre>
<p>Agora seu sistema já está apto a compilar o Python 2.6 com zlib e sqlite3. Baixe o código fonte do Python 2.6, extraia-o e na pasta dele execute o seguinte comando para configurar:</p>
<pre id="terminal"> ./configure USE="sqlite" –with-zlib=/usr/include</pre>
<p>Depois para compilar:</p>
<pre id="terminal"> make</pre>
<p>E finalmente, para instalar:</p>
<pre id="terminal"> sudo make install</pre>
<p>Qualquer dúvida ou sugestão é só comentar minha gente! <img src='http://douglascamata.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://douglascamata.net/compilando-o-python-2-6-com-zlib-e-sqlite-no-debian-5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Proriedades de Objetos e Metaprogramação em Ruby</title>
		<link>http://douglascamata.net/proriedades-de-objetos-e-metaprogramacao-em-ruby/</link>
		<comments>http://douglascamata.net/proriedades-de-objetos-e-metaprogramacao-em-ruby/#comments</comments>
		<pubDate>Sun, 26 Sep 2010 06:46:00 +0000</pubDate>
		<dc:creator>Douglas Camata</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://douglascamata.net/?p=16</guid>
		<description><![CDATA[Olá pessoal. Hoje mais cedo, um amigo (Pedro Henrique) me veio perguntar criar propriedades para objetos em Ruby e então eu decidi fazer esse post para ajudar a galera que ta começando com a linguagem. Criar propriedades em Ruby não é muito complicado, mas para a primeira vez exige um pouco de pesquisa. Vamos começar..]]></description>
				<content:encoded><![CDATA[<p>Olá pessoal. Hoje mais cedo, um amigo (<a title="Twitter do Pedro" href="http://www.twitter.com/henriqeeee" target="_blank">Pedro Henrique</a>) me veio perguntar criar propriedades para objetos em Ruby e então eu decidi fazer esse post para ajudar a galera que ta começando com a linguagem. Criar propriedades em Ruby não é muito complicado, mas para a primeira vez exige um pouco de pesquisa.</p>
<p>Vamos começar então. Primeiramente espero que você saiba definir uma classe (olha lá hein!). Criaremos uma classe Pessoa que deve receber um nome no momento da criação, por exemplo.</p>
<pre class="brush: ruby; title: ; notranslate">

class Pessoa

  def initialize(nome)
    @nome = nome
  end

end

</pre>
<p>A partir dessa classe, se você criar um objeto Pessoa com qualquer nome e tentar acessar a propriedade nome você terá um NoMethodError. Existem duas maneiras de criar essa propriedade nome. Vamos começar pela mais bruta (setter e getter). Se quando você chamou a propriedade nome o Ruby disse que o método não existe, vamos criá-lo:</p>
<pre class="brush: ruby; title: ; notranslate">

class Pessoa

  def initialize(nome)
    @nome = nome
  end

  def nome
    @nome
  end

end

</pre>
<p>Desta maneira você já conseguirá criar um objeto da classe Pessoa e acessar sua propriedade nome. Porém ao tentar mudá-la, novamente, será lançado NoMethodError para a função &#8220;nome=&#8221;. Então vamos criá-la.</p>
<pre class="brush: ruby; title: ; notranslate">

class Pessoa

  def initialize(nome)
    @nome = nome
  end

  def nome
    @nome
  end

  def nome=(novo_nome)
    @nome = novo_nome
  end

end

</pre>
<p>Ótimo! Agora podemos acessar e modificar a propriedade nome dos objetos criados a partir da classe Pessoa. Mas essa maneira de fazer isso é bem feia e trabalhosa. Existe um &#8220;açucar sintático&#8221; que torna a criação de propriedades bem mais simples. São as funções attr_reader, attr_write e attr_accessor. A classe Pessoa poderia ser reescrita, com o mesmo funcionamento, da seguinte maneira:</p>
<pre class="brush: ruby; title: ; notranslate">

class Pessoa

  attr_accessor :nome

  def initialize(nome)
    @nome = nome
  end

end

</pre>
<p>A linha 3 do código tem um funcionamento interessante. Ela transforma o símbolo passado como parâmetro para string, chama a função define_method, que define um método na classe onde ela é chamada. Ela passa então, via bloco de código, instance_variable_get, que por sua vez, recebe uma string como parâmetro e retorna o valor da variável com esse nome na instância da classe onde a função foi chamada. E para permitir a mudança as coisas não mudam muito, porém o método passa para o bloco de código uma variável, que seria o novo valor, e chama a função instance_variable_set que além da variável a ser mudada recebe o seu novo valor. Cabuloso, não?</p>
<p>Quanto aos outros dois métodos &#8220;mágicos&#8221;: o attr_reader, como seu nome diz, cria um método de acesso à propriedade e o attr_writer cria um método de escrita.</p>
<p>Ai vai uma implementação dos 3 para você entender melhor como funciona:</p>
<pre class="brush: ruby; title: ; notranslate">

def new_attr_reader(attr)
  define_method(&quot;#{attr}&quot;) { instance_variable_get(&quot;@#{attr}&quot;) }
end

def new_attr_writer(attr)
  define_method(&quot;#{attr}=&quot;) { |new_value| instance_variable_set(&quot;@#{attr}&quot;, new_value) }
end

def new_attr_accessor(attr)
  new_attr_reader(attr)
  new_attr_writer(attr)
end

</pre>
<p>Isso nos mostra um pouco (?) do poder da metaprogramação em Ruby, que nos permite modificar classes em runtime e adicionar a elas: métodos, propriedades, variáveis&#8230; tudo que você pode imaginar! É código que modifica código. Praticamente 80% da facilidade, graça e poder do Ruby On Rails só pode existir graças a essa poderosa ferramenta que vale a pena ser estudada com paciência e atenção.</p>
<p>Bom, agora vocês já devem estar experts nisso (ou não). Até a próxima pessoal&#8230; e qualquer problema ou dúvida é só comentar! <img src='http://douglascamata.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://douglascamata.net/proriedades-de-objetos-e-metaprogramacao-em-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ForkInCampos: O começo</title>
		<link>http://douglascamata.net/forkincampos-o-comeco/</link>
		<comments>http://douglascamata.net/forkincampos-o-comeco/#comments</comments>
		<pubDate>Sun, 05 Sep 2010 07:41:00 +0000</pubDate>
		<dc:creator>Douglas Camata</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://douglascamata.net/?p=15</guid>
		<description><![CDATA[Bom, alguns de vocês (pessoas que eu conheço fisicamente) já devem estar sabendo disso, outros não. Nessa sexta-feira passada (03/09) estava eu trabalhando normalmente quando Tarsis Azevedo, após ver um tweet do Israel sobre ForkInRio e reclamar que não tinhamos Fork em Campos dos Goytacazes, resolve me chamar para junto com ele organizar um Fork..]]></description>
				<content:encoded><![CDATA[<p>Bom, alguns de vocês (pessoas que eu conheço fisicamente) já devem estar sabendo disso, outros não. Nessa sexta-feira passada (03/09) estava eu trabalhando normalmente quando <a title="Twitter do Tarsis" href="http://www.twitter.com/tarsisazevedo" target="_blank">Tarsis Azevedo</a>, após ver um <a href="https://twitter.com/israelst/status/22543894237" target="_blank">tweet do Israel sobre ForkInRio</a> e <a href="https://twitter.com/tarsisazevedo/status/22544083269" target="_blank">reclamar que não tinhamos Fork em Campos dos Goytacazes</a>, resolve me chamar para junto com ele organizar um Fork pra gente. Como eu so muito doido (e ele também) demos um jeito nisso rapidinho&#8230; e nasceu o ForkInCampos!<br/><br />
<h2><strong>O que é ForkInCampos? O que é um Fork?</strong></h2>
<p><br/>Calma gente, uma pergunta de cada vez. Primeiro explicarei brevemente o que é um Fork.<br/><br/>Fork é uma reunião de pessoas determinadas a aprender algo em comum, que assim como o <a title="Sobre Coding Dojo" href="http://pet.inf.ufsc.br/dojo/o-que-eh-dojo/" target="_blank">Coding Dojo</a>, prega não só o aprendizado mas também o compartilhamento do mesmo. Foi idealizado pelo pessoal do <a title="Site do #horaextra" href="http://horaextra.org/" target="_blank">#horaextra</a> inicialmente com o <a title="Grupo do ForkInRio" href="http://groups.google.com/group/forkinrio" target="_blank">ForkInRio</a>.<br/><br/>De maneira mais expressiva, o Fork é mais uma opção para encontrar seus amigos, conhecer gente nova, aprender coisas novas e ainda se divertir. Não existe pressão alguma, pessoas te cobrando&#8230; é aprendizado na essência! Apesar deste ter uma dinâmica que alguns achem meio individualista no começo, no fim verão que é bem interessante e proveitoso.<br/><br/>Mas eu não vou explicar aqui TUDO sobre um Fork. Para isso eu e Tarsis criamos um <a title="Documento explicando mais sobre Forks." href="https://docs.google.com/document/edit?id=1E-K0MU8SoL5LFzm0ctn52hutsb5oH-E9DHHwrhz9aSI&amp;hl=pt_BR&amp;authkey=CNGE_a4J&amp;pli=1#" target="_blank">documento no Google Docs explicando o máximo possível sobre Fork&#8217;s e sua dinâmica</a>.<br/><br />
<h2><span style="text-decoration: line-through;">Fodaaaaa!!111!1!!</span> Quero participar, #comofas?</h2>
<p><br/>Se você tem interesse em participar, é simples! Basta participar do <a title="Grupo do ForkInCampos" href="http://groups.google.com.br/group/forkincampos" target="_blank">grupo de discussão do ForkInCampos</a>. E enviar um email ou ficar atento aos já enviados. Caso você queira iniciar um Fork sobre qualquer assunto de seu interesse basta contatar o grupo propondo o assunto. Logo os interessados irão responder e assim vocês poderão combinar local de encontro, exercícios, compartilhar material de estudo, etc. Simples assim! Tudo fácil e acessível a todos, basta que haja comunicação que tudo se resolve.<br/><br />
<h2>Por que diabos vocês resolveram fazer isso cara? :/</h2>
<p><br/>Resolvemos fazer isso porque podemos ver através dos Coding Dojo&#8217;s que não exista uma maneira melhor de adquirir conhecimento do que conversando com outras pessoas. Juntos podemos aprender muito mais&#8230; cada um colaborando com o pouco que sabe para termos um conhecimento cada vez mais completo sobre o mais números de coisas possíveis.<br/><br/>Qualquer dúvida ou sugestão é só deixar um comentário gente, até a próxima! <img src='http://douglascamata.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://douglascamata.net/forkincampos-o-comeco/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando e configurando virtualenv(wrapper)</title>
		<link>http://douglascamata.net/instalando-e-configurando-virtualenvwrapper/</link>
		<comments>http://douglascamata.net/instalando-e-configurando-virtualenvwrapper/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 23:55:00 +0000</pubDate>
		<dc:creator>Douglas Camata</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://douglascamata.net/?p=14</guid>
		<description><![CDATA[Se você programa em Python, principalmente em projetos que tem várias dependências, já deve ter pensando duas vezes antes de instalar vários pacotes Python no seu sistema. Imagine como seria bom se você pudesse ter um interpretador de Python separado para cada projeto seu, com as devidas dependências deles instaladas e o Python do seu..]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><a href="www.python.org"><img class="aligncenter" title="Python's Logo" src="http://zetcode.com/tutorials/pythontutorial/images/pythonlogo.png" alt="Python Logo" width="149" height="148" /></a></p>
<p><br/>Se você programa em <a title="Site do Python" href="http://www.python.org" target="_blank">Python</a>, principalmente em projetos que tem várias dependências, já deve ter pensando duas vezes antes de instalar vários pacotes Python no seu sistema. Imagine como seria bom se você pudesse ter um interpretador de Python separado para cada projeto seu, com as devidas dependências deles instaladas e o Python do seu sistema limpinho, só com o que ele realmente precisa ter.<br/><br/><br />
<hr /><br/><br />
<h1><a title="Site do Virtualenv " href="http://pypi.python.org/pypi/virtualenv" target="_blank">VirtualEnv</a></h1>
<p><br/>Pare de imaginar coisas, isso EXISTE! E se chama virtualenv. A instalação é simples. Antes de tudo, caso não tenha o pip instalado, instale-o com:<br/>
<pre id="terminal"> sudo easy_install pip</pre>
<p><br/>E depois, o virtualenv propriamente dito:<br/>
<pre id="terminal"> sudo pip install virtualenv</pre>
<p><br/>Agora você já pode criar e ativar ambientes Python virtuais usando a sintaxe:<br/>
<pre id="terminal">virtualenv --no-site-packages nomedoambiente</pre>
<p><br/>
<pre id="terminal">source nomedoambiente/bin/activate</pre>
<p><br/>O primeiro comando cria um ambiente virtual numa pasta chamada &#8220;nomedoambiente&#8221; totalmente independente do Python do sistema e o segundo ativa o mesmo. Para desativar é só usar:<br/>
<pre id="terminal">deactivate</pre>
<p><br/><br />
<hr /><br/><br />
<h1><a title="Site do Virtualenvwrapper" href="http://www.doughellmann.com/projects/virtualenvwrapper/" target="_blank">VirtualEnvWrapper</a></h1>
<p><br/>O único problema do virtualenv, pelo menos na minha opinião, é a localização dos ambientes e a maneira como eles são ativados. É muito chato ter que ficar lembrando disso toda hora. E existe uma solução pra isso, chamada virtualenvwrapper. Ele organizar seus ambientes virtuais em uma única pasta e você pode ativar qualquer um deles apesar usando o comando: workon nomedoambiente. A instalação dele também é simples como a do virtualenv.<br/>
<pre id="terminal">sudo pip install virtualenvwrapper</pre>
<p><br/>Porém, você precisará definir em qual pasta vão ficar os ambientes virtuais criados com ele. Além de carregá-lo sempre que abrir o terminal. Para isso, execute:<br/>
<pre id="terminal"> echo source /usr/local/bin/virtualenvwrapper.sh &gt;&gt; ~/.bashrc</pre>
<p><br/>
<pre id="terminal"> echo export WORKON_HOME=~/.pythonenvs &gt;&gt; ~/.bashrc</pre>
<p><br/>Obs.: Lembre-se de criar o diretório .pythonenvs na home do seu usuário.<br/><br/>Agora é só fechar e abrir o terminal novamente e você já poderá criar um ambiente virtual usando o comando:<br/>
<pre id="terminal"> mkvirtualenv teste</pre>
<p><br/>Você também poderá copiar e deletar um ambiente usando, respectivamente:<br/>
<pre id="terminal"> cpvirtualenv teste teste_copia</pre>
<p><br/>
<pre id="terminal"> rmvirtualenv teste_copia</pre>
<p><br/>E para instalar bibliotecas nos ambientes virtuais é só usar normalmente o pip (sem sudo).<br/><br/>Agora você pode ter um interpretador para cada projeto totalmente independente do seu Python global e com suas próprias bibliotecas.<br/><br/><br />
<hr /><br/><br />
<h1><a title="Site do Virtualenvwrapper.project" href="http://www.doughellmann.com/projects/virtualenvwrapper.project/" target="_blank"> VirtualEnvWrapper.Project</a> (bônus)</h1>
<p><br/>Como se manipular ambientes virtuais com o virtualenvwrapper não fosse absurdamente fácil, existe um plugin para ele chamado virtualenvwrapper.project que além de manipular os Pythons virtuais também manipula projetos e liga eles com os ambientes virtuais. Os projetos ficam organizados em uma pasta definida no script e executando o comando &#8220;workon&#8221; com um projeto criado nele (usando o comando &#8220;mkproject&#8221;) ativa automaticamente o ambiente virtual e a pasta do projeto criado.<br/><br/>A instalação é NOVAMENTE muito simples e parecida com a do virtualenvwrapper:<br/>
<pre id="terminal">sudo pip install virtualenvwrapper.project</pre>
<p><br/>
<pre id="terminal">echo export PROJECT_HOME=$HOME/Devel &gt;&gt; ~/.bashrc</pre>
<p><br/>Substitua &#8220;$HOME/Devel&#8221; para a pasta onde você queira que fiquem os projetos e lembre-se de criá-la antes de usar o virtualenvwrapper.project. E lembre-se de reiniciar o terminal também.<br/><br/>Criei novos projetos com o comando:<br/>
<pre id="terminal">mkproject nomedoprojeto</pre>
<p><br/>Uma pasta com o nome &#8220;nomedoprojeto&#8221; será criada, assim como um ambiente virtual com o mesmo nome. Quando você usar o comando &#8220;workon nomedoprojeto&#8221; além de ativar o novo interpretador, o seu diretório corrente mudará automaticamente para a pasta do projeto, que está dentro da pasta definida logo acima.<br/><br/>O virtualenvwrapper.project só tem um pequeno problema: ainda não existe um comando para deletar um projeto inteiro. Eu mesmo farei isso assim que tiver tempo. \o/<br/><br/>Qualquer problema ou sugestão é só comentar!<br/><br/>Obrigado pessoal e até a próxima. <img src='http://douglascamata.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://douglascamata.net/instalando-e-configurando-virtualenvwrapper/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
