Dica: CouchDB no Mac OS X

Posted by Alberto Leal on December 11th, 2008

Para aqueles que estiverem tentando instalar o CouchDB no Mac OS X, aí vai uma dica.

Eu instalei utilizando o MacPorts:

sudo port install couchdb

Após a instalação, execute “sudo couchdb” no seu terminal para iniciar o serviço. No meu caso, a saída foi a seguinte:

Apache CouchDB 0.8.1-incubating (LogLevel=info)

Apache CouchDB is starting.

Config Info /opt/local/etc/couchdb/couch.ini:

CurrentWorkingDir=/Users/Alberto

DbRootDir=/opt/local/var/lib/couchdb

BindAddress=”127.0.0.1″

Port=”5984″

DocumentRoot=/opt/local/share/couchdb/www

LogFile=/opt/local/var/log/couchdb/couch.log

UtilDriverDir=/opt/local/lib/couchdb/erlang/lib/couch-0.8.1-incubating/priv/lib

DbUpdateNotificationProcesses=

FullTextSearchQueryServer=

javascript=/opt/local/bin/couchjs /opt/local/share/couchdb/server/main.js

Se você tentar acessar a pasta de log e  couchdb, verá que elas não foram criadas. Com isso, o serviço não é inicializado corretamente. Crie as pastas (sudo mkdir -p /opt/local/var/log/couchdb/ e sudo mkdir -p /opt/local/bin/couchdb ) e tente iniciar o serviço novamente.

UPDATE 1: Recebi uma dica do Marcos Tapajós falando para não instalar o CouchDB usando o ports, já que ele instala uma versão ultrapassada e cheia de bugs. Se quiser instalar, pegue direto do trunk do projeto.

UPDATE 2: Para desinstalar o couch instalado com o MacPorts, execute no seu terminal:

sudo port uninstall couchdb @0.8.1_0

Feito isso, agora é hora de pegar e compilar o projeto que está no trunk:

$ svn co http://svn.apache.org/repos/asf/incubator/couchdb/trunk couchdb
$ cd ~
$ cd couchdb
$ ./bootstrap
$ ./configure
$ make
$ sudo make install

E, isso é tudo! Execute “couchdb -V” e veja se tudo saiu como o esperado. Se você notar, verá que realmente a versão do trunk é mais nova!Para aqueles que estiverem tentando instalar o CouchDB no Mac OS X, aí vai uma dica.

Eu instalei utilizando o MacPorts:

sudo port install couchdb

Após a instalação, execute “sudo couchdb” no seu terminal para iniciar o serviço. No meu caso, a saída foi a seguinte:

Apache CouchDB 0.8.1-incubating (LogLevel=info)

Apache CouchDB is starting.

Config Info /opt/local/etc/couchdb/couch.ini:

CurrentWorkingDir=/Users/Alberto

DbRootDir=/opt/local/var/lib/couchdb

BindAddress=”127.0.0.1″

Port=”5984″

DocumentRoot=/opt/local/share/couchdb/www

LogFile=/opt/local/var/log/couchdb/couch.log

UtilDriverDir=/opt/local/lib/couchdb/erlang/lib/couch-0.8.1-incubating/priv/lib

DbUpdateNotificationProcesses=

FullTextSearchQueryServer=

javascript=/opt/local/bin/couchjs /opt/local/share/couchdb/server/main.js

Se você tentar acessar a pasta de log e  couchdb, verá que elas não foram criadas. Com isso, o serviço não é inicializado corretamente. Crie as pastas (sudo mkdir -p /opt/local/var/log/couchdb/ e sudo mkdir -p /opt/local/bin/couchdb ) e tente iniciar o serviço novamente.

UPDATE 1: Recebi uma dica do Marcos Tapajós falando para não instalar o CouchDB usando o ports, já que ele instala uma versão ultrapassada e cheia de bugs. Se quiser instalar, pegue direto do trunk do projeto.

UPDATE 2: Para desinstalar o couch instalado com o MacPorts, execute no seu terminal:

sudo port uninstall couchdb @0.8.1_0

Feito isso, agora é hora de pegar e compilar o projeto que está no trunk:

$ svn co http://svn.apache.org/repos/asf/incubator/couchdb/trunk couchdb
$ cd ~
$ cd couchdb
$ ./bootstrap
$ ./configure
$ make
$ sudo make install

E, isso é tudo! Execute “couchdb -V” e veja se tudo saiu como o esperado. Se você notar, verá que realmente a versão do trunk é mais nova!

Prazer, Ruby

Posted by Alberto Leal on December 8th, 2008

Pessoal,

nos últimos meses intensifiquei os meus estudos em Ruby e Rails. Como podem perceber, meus últimos posts foram emcima dessas tecnologias. E, ao longo da última semana, resolvi pegar alguns dos meus resumos e dar uns “tapas” na formatação e no conteúdo, tentando transformá-los em uma espécie de apostila para aqueles que estão começando com a linguagem e preferem material em português.

Gostaria de convidar a comunidade para contribuir com o trabalho. O projeto está no Github,  portanto, aqueles que quiserem contribuir, basta acessar o link do projeto no Github

 

Abraços

Trabalhando com Ranges

Posted by Alberto Leal on December 8th, 2008

É bastante comum trabalharmos com números sequênciais. E, para isso, não é necessário criarmos uma estrutura de iteração para incrementar um contador, por exemplo.

A melhor forma de se ter número sequênciais, em ruby, é utilizar os ranges

 

Criando um range

Exitem duas maneiras de se criar um range: a primeira é utilizando 2(dois) pontos (..) e a segunda utilizando 3(três) pontos (…) . A diferença entre eles é que quando utilizamos “..” estamos incluindo o último número informado, já com “…” estamos excluindo o último número informado.

numeros = 1..10
numeros2 = 1...10

 

Iterando um range

(1..10).each{|num| puts num}

(1.0..5.0).each{|num| puts num}#error

 

Embora seja permitido se criar um range de Float, não é permitido iterá-lo, visto que a classe Float não possui um método succ

Convertendo para Array

num_array = numeros.to_a #[1,2,3,4,5,6,7,8,9,10]
num2_array = numeros2.to_a #[1,2,3,4,5,6,7,8,9]

Conversão implícita e explícita de Numéricos

Posted by Alberto Leal on December 4th, 2008

Falei sobre conversão implícita/explícita quando estamos trabalhando com String. Agora, chegou a vez de falar um pouco sobre conversões com classes numéricas.

A mesma confusão que encontramos quando falamos sobre os métodos to_s e to_str, encontramos quando nos deparamos com to_i, to_int, to_f, to_flt. Vamos valer da mesma regra que foi apresentada para a classe String: Conversão explícita é para os métodos curtos e implícita para os métodos longos.

Assim como o método to_str, muitas classes não definem os métodos implícitos to_int e to_flt.

Vamos ver um exemplo:

class MeuNumero
  def to_i
    5
  end

  def to_int
    10
  end
end

meu_numero = MeuNumero.new
puts meu_numero.to_i

 

O código acima imprime “5″, visto que chamamos o método explicitamente. Agora, quando o meu método de conversão implícita é executado? Vejamos outro exemplo:

meu_numero = MeuNumero.new
array_meu_numero = Array.new(meu_numero)

 
Ao executarmos o código acima, constatamos que foi criado um array com 10 posições. Isso porque quando passamos o nosso objeto (meu_numero) ele foi implicitamente convertido para um valor numérico para ser passado como parâmetro para a criação de um Array.

Mapeando rotas com with_options

Posted by Alberto Leal on December 3rd, 2008

Muitas vezes, nossos controllers possuem diversas actions. Às vezes customizamos a URL e criamos uma rota para cada um, e, de forma repetida. Por exemplo:

ActionController::Routing::Routes.draw do |map|
  map.connect “/blog/list,  :controller => “blog”,
                             :action => “list”
  map.connect “/blog/view/:id,  :controller => “blog”,
                                 :action => “find_post”
end

Note que, todos os mapeamentos acima fazem referência ao mesmo controller, porém para actions diferentes. O método with_options nos permite criar um bloco com mapeamentos para o mesmo controller de forma a não ter que repetir sempre o nome do controller para todos os mapeamentos:

ActionController::Routing::Routes.draw do |map|
  map.with_options (:controller => “blog”) do |blog_map|
    blog_map.connect “/blog/list”, :action => “list”
    blog_map.connect “/blog/show/:id,   :action => “show”
  end
end

Copyright © 2007 Alberto Leal. All rights reserved.