Posts arquivos para janeiro, 2010

31jan2010

food for thought

(0) comentários

How can we ignite somewhat sleepy/lazy brains?

I just had an insane idea - no guarantees - you'll need:

  • a small dev team
  • a whiteboard
  • a sudoku puzzle generator/magazine/whatever

Instructions:

  1. Write down the sudoku puzzle on the whiteboard and cover it with something.
  2. Mark the time
  3. Let the team solve it
  4. Mark the time elapsed
  5. Profit

Would it work? Any neat ideas to share?

Inspiration shamelessly taken from softwarebyrob.com

31jan2010

Node.js and COMET

(0) comentários
Today I started to study node.js, for these last days there was a lot of interesting posts about it. So to begin understanding it, I setup to port two COMET based examples I did back when I started using twisted to do it. Note that this may contain javascript misconceptions, as I’m not experienced with [...]
31jan2010

Notes about Redis

(0) comentários
I’ve come up with some notes about Redis, RestMQ and mongodb. Uploaded them to slideshare.
30jan2010

Configurando um servidor de openvpn parte 2

(0) comentários
Dando continuidade a parte 1 do artigo, vamos configurar o lado do cliente. Chaves e certificados para a filial server:~/easy-rsa# ./build-key filial1 Generating a 2048 bit RSA private key ......................+++ ..........+++ writing new private key to 'filial1.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. [...]
29jan2010

Configurando timezone (/etc/localtime)

(0) comentários

O timezone configurado através do /etc/localtime pode ser utilizado em qualquer distribuição Linux e normalmente todos os utilitários e ferramentas disponíveis nas distros para este fim simplesmente fazem a manipulação correta deste arquivo e mantém a lista de timezones atualizada. O arquivo /etc/localtime na maioria das vezes é um link simbólico para o arquivo correto de timezone dentro da pasta com os timezones disponíveis no sistema.

Para alterar o timezone atual, primeiramente entre no diretório /etc:
# cd /etc

Crie/recrie o link simbólico localtime fazendo referência ao arquivo correto:
# ln -sf /usr/share/zoneinfo/EST localtime

Em algumas distribuições (Red Hat like) o path dos arquivos de timezone é:
/usr/share/zoneinfo/dirname/zonefile.

Segue um exemplo para configurar o timezone da máquina para São Paulo / Brasil:
# cd /etc
# ln -sf /usr/share/zoneinfo/America/Sao_Paulo localtime

Você pode utilizar a variável de ambiente TZ para setar a data correta nas aplicações:
$ export TZ=America/Sao_Paulo
$ date

29jan2010

Configurando Timezone em Red Hat Linux

(0) comentários

Dando continuidade ao último post, agora é a vez da configuração de timezone em sistemas baseados em Red Hat Linux. Em sistemas Red Hat / CentOS / Fedora temos o utilitário system-config-date que pode ser utilizado para automatizar todo o processo através de uma interface bem simples e amigável.

Para instalar e configurar o timezone através do utilitário, simplesmente prossiga com:
# yum install system-config-date
# system-config-date

Após finalizar as configurações de timezone elas entrarão em vigor imediatamente.

Além da configuração realizada através do utilitário também é possível utilizar o método genérico de configuração de timezone através do /etc/localtme, que assim que possível irei disponibilizar no próximo e último post da série de timezone.

29jan2010

NoSQL brief (gentle) intro and some SQL anti patterns

(0) comentários
Yesterday I’ve presented this at Locaweb/Brazil as part of our NoSQL cycle. Many other people presented interesting new ideas and I’ve opted for this intro and a piece about Redis which I may publish soon. NoSql Introduction View more presentations from gleicon.
29jan2010

Mais um pouco de CouchDB e CouchRest

(0) comentários

Se você já leu meu post anterior CouchDB – Resolvendo Problemas Reais saiba que esse é um post complementar, ou seja, se não leu pode le-lo agora!
No post anterior mostrei duas formas de modelar algo comum nos cenarios de softwares corporativo atuais.
Tá mais e ai, como utilizar as propostas? E possivel implementa-las?
Eu respondo, sim, é possivel! E para mostrar como eu vou usar o CouchRest uma gem do Ruby extremamente instalar e usar.
Não serei repetitivo, se quiser saber como usa-la utilize 5 minutos para isso ou um pouco mais que isso se preferir.
Chega de papo e vamos para o código!
Para ter nosso documento Cliente contendo seus Pedidos o modelo ficaria assim:

require 'rubygems'
require 'couchrest'

SERVER = CouchRest.new
SERVER.default_database = 'comercio2'
DB = SERVER.default_database

class Cliente < CouchRest::ExtendedDocument
  use_database DB

  property :nome
  property :email
  property :telefone
  property :pedidos, :cast_as => ['Pedido'], :default => []

  timestamps!
end

class Pedido < CouchRest::ExtendedDocument
  use_database DB

  property :numero
  property :valor
  property :data
end

Agora utilizando o modelo:

cliente = Cliente.new :nome => "Alan Rafael", :email => "alanbatista@gmail.com", :telefone => "9999-9999"
cliente.pedidos << Pedido.new(:numero => 1, :valor => 10, :data => Time.new)
cliente.pedidos << Pedido.new(:numero => 2, :valor => 105, :data => Time.new)
cliente.pedidos << Pedido.new(:numero => 3, :valor => 140, :data => Time.new)
cliente.save

puts cliente.id

#obtendo o cliente
clienteReloaded = Cliente.get cliente.id

puts "Pedidos do cliente #{clienteReloaded.nome}, são: "
clienteReloaded.pedidos.each do |pedido|
  p pedido
end

Saida do console:

Identificador do Cliente: 43d78f21600a60bd3371e02455aff980
Pedidos do cliente Alan Rafael, são:
{"data"=>"2010/01/29 01:42:24 +0000", "valor"=>10, "couchrest-type"=>"Pedido", "numero"=>1}
{"data"=>"2010/01/29 01:42:24 +0000", "valor"=>105, "couchrest-type"=>"Pedido", "numero"=>2}
{"data"=>"2010/01/29 01:42:24 +0000", "valor"=>140, "couchrest-type"=>"Pedido", "numero"=>3}

Vejam que o Cliente possui uma coleção de Pedidos, então agora vamos ver como o CouchDB armazena isso:

{
   "_id": "43d78f21600a60bd3371e02455aff980",
   "_rev": "1-97794fcd383ba246fc68ee0908621cc2",
   "created_at": "2010/01/29 01:42:24 +0000",
   "telefone": "9999-9999",
   "updated_at": "2010/01/29 01:42:24 +0000",
   "nome": "Alan Rafael",
   "pedidos": [
       {
           "data": "2010/01/29 01:42:24 +0000",
           "valor": 10,
           "couchrest-type": "Pedido",
           "numero": 1
       },
       {
           "data": "2010/01/29 01:42:24 +0000",
           "valor": 105,
           "couchrest-type": "Pedido",
           "numero": 2
       },
       {
           "data": "2010/01/29 01:42:24 +0000",
           "valor": 140,
           "couchrest-type": "Pedido",
           "numero": 3
       }
   ],
   "couchrest-type": "Cliente",
   "email": "alanbatista@gmail.com"
}

Simples né, um documento cliente contém os seus pedidos!

Bem agora vamos para o outro exemplo, um documento de Cliente com um ou mais documentos de Pedido.

require 'rubygems'
require 'couchrest'

SERVER = CouchRest.new
DB = SERVER.database('comercio')

class Cliente < CouchRest::ExtendedDocument
  use_database DB

  property :nome
  property :email
  property :telefone

  timestamps!

  def pedidos
    Pedido.by_cliente_id :key => id
  end
end

class Pedido < CouchRest::ExtendedDocument
  use_database DB

  property :numero
  property :valor
  property :data

  view_by :cliente_id

  def cliente= cliente
    self['cliente_id'] = cliente.id
  end
  def cliente
    Cliente.get(self['cliente_id']) if self['cliente_id']
  end
end

Vamos as novidades, não sei se contei, mas todo o CouchRest::ExtendedDocument é um Hash, então nessa parte:

  def cliente= cliente
    self['cliente_id'] = cliente.id
  end
  def cliente
    Cliente.get(self['cliente_id']) if self['cliente_id']
  end
end

Eu estou adicionando o atributo cliente_id ao documento pedido, assim podemos relacionar o documento Cliente ao documento Pedido.

Vamos usar esse modelo:

cliente = Cliente.new(:nome => "Alan Rafael", :email => "alanrrb@gmail.com", :telefone => "9999-9999")
cliente.save

pedido = Pedido.new
pedido.numero= 1
pedido.valor= 20000
pedido.data = Time.new
pedido.cliente= cliente
pedido.save

pedido = Pedido.new
pedido.numero= 2
pedido.valor= 1000
pedido.data = Time.new
pedido.cliente= cliente
pedido.save

puts "Identificador do Cliente #{cliente.nome}, id: #{cliente.id}"

puts "Pedidos do cliente #{cliente.nome}"
cliente.pedidos.each do |pedido|
  pedido.each do |chave, valor|
    puts "#{chave}: #{valor}"
  end
  puts
end

Saída do console:

Identificador do Cliente Alan Rafael, id: 019d581b142bfc059b7810694fcda012
Pedidos do cliente Alan Rafael
data: 2010/01/29 02:47:11 +0000
_rev: 1-af7e81f30c7fb4a379a053b929bd9cc8
_id: 0ea8803ebfb714d3ec47f93e0d33bac7
cliente_id: 019d581b142bfc059b7810694fcda012
valor: 1000
couchrest-type: Pedido
numero: 2

data: 2010/01/29 02:47:11 +0000
_rev: 1-bc1cbce13bbf65bfaeaaf193ef33cf28
_id: fa8ad3dd1f962a567ccf7e7c50f135c3
cliente_id: 019d581b142bfc059b7810694fcda012
valor: 20000
couchrest-type: Pedido
numero: 1

Voltando ao CouchDB vamos ver como ele salvou essa brincadeira:

Cliente:
{
   "_id": "019d581b142bfc059b7810694fcda012",
   "_rev": "1-5bb47e58256553b6fa2accca4f8475ba",
   "created_at": "2010/01/29 02:47:10 +0000",
   "telefone": "9999-9999",
   "updated_at": "2010/01/29 02:47:10 +0000",
   "nome": "Alan Rafael",
   "couchrest-type": "Cliente",
   "email": "alanrrb@gmail.com"
}
Pedidos:
{
   "_id": "0ea8803ebfb714d3ec47f93e0d33bac7",
   "_rev": "1-af7e81f30c7fb4a379a053b929bd9cc8",
   "data": "2010/01/29 02:47:11 +0000",
   "cliente_id": "019d581b142bfc059b7810694fcda012",
   "valor": 1000,
   "couchrest-type": "Pedido",
   "numero": 2
}

{
   "_id": "fa8ad3dd1f962a567ccf7e7c50f135c3",
   "_rev": "1-bc1cbce13bbf65bfaeaaf193ef33cf28",
   "data": "2010/01/29 02:47:11 +0000",
   "cliente_id": "019d581b142bfc059b7810694fcda012",
   "valor": 20000,
   "couchrest-type": "Pedido",
   "numero": 1
}

Como eu mostrei no post anterior, nesse forma de modelo, temos que ter um tipo em cada documento e o CouchRest “tipou” cada documento com o atributo “couchrest-type”, ficando assim muito simples obter cada registro e seu relacionamento.

Para finalizar, valor total de pedidos por cliente:

class Pedido
view_by :valor_total_pedidos,
              :map =>
                "function(doc) {
                    if(doc['couchrest-type'] == \"Pedido\")
                       emit(doc['cliente_id'], doc['valor']);
                 }",
              :reduce =>
                "function(keys, values, rereduce) {
                    return sum(values);
                 }"
end

total =  Pedido.by_valor_total_pedidos :key => cliente.id, :reduce => true
p "Valor total de pedidos para cliente: #{cliente.nome}, Total: #{total['rows'][0]['value']}"

Saída do console:

"Valor total de pedidos para cliente: Alan Rafael, Total: 21000"

O CouchRest nos dá muita flexibilidade e simplicidade para trabalhar com Ruby e CouchDB, espero te-los motivado para experimentar os dois.

Não se esqueçam de deixar seus comentários!


28jan2010

Treasure the past

(0) comentários
Just a quick one: I’ve found code from my old repository, more than 10 years old. Uploaded it along with VideoDog to my github repository: http://github.com/gleicon/archive . Gotta love old stuff.
28jan2010

Esqueçam o que eu disse: o RVM é melhor

(0) comentários

Sei que parece coisa de ex-presidente mas é isto mesmo: por favor, desconsiderem o que eu disse no post anterior.

Depois do comentário do Levy, resolvi instalar o RVM (Ruby Version Manager). Passei o comecinho da noite brincando com ele e realmente é uma opção melhor do que a proposta inicialmente.

Eu tinha a preocupação de ser obrigado a fazer alterações grandes e complicadas no meu bash_profile ou bashrc. Entretanto, a instalação do RVM se mostrou extremamente simples:

Com a ferramenta instalada, é necessário somente adicionar o seguinte ao bash_profile:

A partir de agora, qualquer novo terminal bash (ou zsh) que você abrir terá acesso ao RVM. E para saber como instalar as versões do Ruby ou alternar entre elas:

O projeto está no Github, caso queiram dar uma olhada http://github.com/wayneeseguin/rvm

Switch to our mobile site