31jan2010
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:
- Write down the sudoku puzzle on the whiteboard and cover it with something.
- Mark the time
- Let the team solve it
- Mark the time elapsed
- Profit
Would it work? Any neat ideas to share?
Inspiration shamelessly taken from softwarebyrob.com
Link deste post
31jan2010
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 [...]
Link deste post
30jan2010
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. [...]
Link deste post
29jan2010
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
Link deste post
29jan2010
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.
Link deste post
29jan2010
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!
Link deste post
28jan2010
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
Link deste post