Bom, acho que era isto, desculpem pelo tempo sem postar, é que a semana foi corrida com o Curso de Rails, mas agora vou voltar a postar com mais frequência!
Amanha ou segunda devo escrever alguma coisa sobre o Curso, que na minha opinião foi bem legal, acho que todos os alunos aproveitaram bastante! (Hoje não vou escrever mais por que é meu aniversário de casamento e tenho que dar mais atenção para a esposa se eu quiser chegar no segundo aniversário
)
Outra coisa, vocês acham úteis estas coletâneas de links que posto de vez em quando?
Tags: Dia a Dia, dia-dia, Java, Java EE, Mobile, produtividade, Ruby
Eu ja estava pensando em fazer um exemplo assim a algum tempo, mas sairam na minha frente ![]()
então segue o link para o excelente post sobre como passar trabalho usando JPA e não ActiveRecord em sua aplicação Rails:
http://weblogs.java.net/blog/bleonard/archive/2007/09/rails_and_jpa_i.html
Ou seja, quase tudo o que eu preciso em quase todos os lugares que eu estiver (nos outros ainda preciso do note mesmo
)
Se gostaram da dica, é só dar uma passada em PortableApps.com
Estes exemplos são baseados em exemplos que mostrei ontem durante o curso de Rails, e mostram bem o que não se deve fazer com Ruby (fora sobrescrever o método “+” de um Fixnum para que ele calcule “-”).
Um destes exemplos acho até que o Thiago ja postou no RubyOnBr ontem ![]()
Mas seguem eles com algumas explicações …
def ambiguo puts "teste" end => nil ambiguo teste => nil ambiguo = 5 => 5 ambiguo => 5 ambiguo() teste => nil
Primeiro definimos um método de nome “ambiguo”, e logo depois chamamos este método para ter certeza que esta tudo bem, depois definimos uma variável de mesmo nome, e toda vez que escrevemos apenas “ambiguo” o Ruby lê o valor da variável, pois é uma variável de escopo local e tem precedência na tabela de localização …
Mas logo depois, tentamos novamente chamar o método passando parâmetro nenhum “()”, e o Ruby sabe que uma variável não pode receber parâmetros (OK, exceto no caso de uma Proc, mas vamos deixar isto para mais adiante), então ele traduz o comando “ambiguo()” para algo parecido com:
if self.respond_to? "ambiguo"
self.send("ambiguo")
else
ambiguo.call
end
Neste caso ja podemos também ver o que aconteceria se o exemplo fosse feito com uma proc, ela só seria chamada caso não existisse o método, para chamar a proc, precisaríamos digitar algo como “ambiguo.call”
Este tipo de situação só é possível por que no Ruby é impossível chamar um método de um objeto como acontece na maior parte das linguagens, o que acontece é que o Ruby manda mensagens para os Objetos
Mas podemos também complicar um pouco mais a história …
Vejam o exemplo abaixo, que mostra mais ou menos a mesma coisa que antes mais complicando um pouco mais a leitura, pois passa a variável “ambiguo” como parâmetro para a mensagem de nome “ambiguo”
irb(main):008:0> def ambiguo(par)
irb(main):009:1> puts %Q|só imprime #{par}|
irb(main):010:1> end
=> nil
irb(main):011:0> ambiguo "teste"
só imprime teste
=> nil
irb(main):012:0> ambiguo = "mesmo nome"
=> "mesmo nome"
irb(main):013:0> ambiguo ambiguo
só imprime mesmo nome
=> nil
irb(main):014:0>
Agora vamos passar para a parte realmente maluca ![]()
Vejam este exemplo …
irb(main):008:0>class Teste
irb(main):008:0> def qualquer(param)
irb(main):008:0> %Q{param = #{param}}
irb(main):008:0> end
irb(main):008:0>end
=> nil
irb(main):008:0>t = Teste.new
=> #<Teste:0x2e675c4>
irb(main):008:0>t.qualquer "coisa"
=> "param = coisa"
irb(main):008:0>Teste = "coisa"
(irb):21: warning: already initialized constant Teste
=> "coisa"
irb(main):008:0>t.qualquer Teste
=> "param = coisa"
irb(main):008:0>t1 = Teste.new
NoMethodError: undefined method 'new' for "coisa":String
from (irb):23
irb(main):008:0>class Teste
irb(main):008:0>end
TypeError: Teste is not a class
from (irb):24
irb(main):008:0>Teste = t.class
(irb):26: warning: already initialized constant Teste
=> Teste
irb(main):008:0>t1 = Teste.new
=> #<Teste:0x2e59b04>
Agora deem uma olhada neste código …
Principalmente os erros depois de “t1 = Teste.new” e “class Teste end”
O que isto quer dizer? que os nomes de classes que tanto utilizamos no Ruby, são apenas constantes que apontam para o objeto que representa aquelas classes …
O que prova mais uma vez, que tudo no Ruby são objetos, até mesmo as classes são objetos
Bom, acho que era isto por enquanto, se alguem conseguir uma explicação mais clara destes exemplos seja bem vindo
Tags: Ruby
Depois de ler este post no Grupo e Usuárias de Programadores, e postar um comentário corrigindo alguns pontos do post, eu resolvi fazer o test de nerdice indicado no final do post, e como eu ja imaginava, o resultado não podia ser muito diferente disto ![]()

É isto mesmo que vocês leram no título …
Ontem a noite, ocorreu aqui em Porto Alegre, o primeiro encontro informal do Grupo Rails-RS (acho que vai ser este mesmo o nome), no meio de muito chop e papo furado, as esposas e namoradas começaram a conversar (Eu e mais 3 fomos acompanhados com as respectivas), e como elas não estavam entendendo muito bem do que conversávamos (Começamos com Ruby, Rails, caimos no Python, um pouco de Haskel, IO, Delphi, Bancos de dados, Sistemas Operacionais, enfim papos de Nerds), elas formaram um grupo próprio:
O Grupo de Usuárias de Programadores.
O blog tem tudo para ser no mínimo engraçado
Tags: Diversão


E claro que a qualquer momento isto pode ser alterado utilizando o gerenciador de plugins.
Não sei se é por que eu estou acostumado com o Mundo Java EE, mas uma IDE para Ruby com um code completion excelente, suporte a break points com inspeção de variáveis, praticamente todos os comandos integrados na IDE, …
Para mim parece excelente ![]()
(Tudo bem que tenho utilizado GEdit ou Komodo Edit par programar mesmo, mas quando o bixo pega corro pro NetBeans, e só não uso ele fulltime por que tenho pouca memória no meu notebook, espero que isto mude até o inicio do próximo ano
)
Até que o tal do Twitter é bem legal ![]()
O Marcus Sá, acabou de ganhar o livro Desenvolvendo Aplicações com UML por escrever este tutorial:
DLS é uma maneira simular no ruby outra linguagem. Ou seja, uma sintaxe diferente para um problema em mente…
Por exemplo, digamos que existe algo que você faz diversas vezes… Como uma espécie de mapa… Eu desenvolvi esse código para o curso que estou fazendo na e – Genial, que por sinal está ótimo… Ai vai uma breve descrição…
Farei um mapa para chegar até a minha casa…
Mapa Minha Casa
- “caminho “Virar a direita”,” no Posto “
- caminho “Seguir reto”,” ate o Campo do Barnabé “
- caminho “Virar a esquerda”,” na Madeireira “
- distancia “quatro Kilometros”
- tempo “30 minutos”
Achei bem legal o tutorial dele, eu apenas faria algumas modificações no exemplo, mais ou menos assim:
class Mapa
#Inicialização da classe, recebe o nome do mapa e um bloco com os dados dele
def initialize(nome, &bloco)
#Atribui o nome do mapa
@nome = nome
#Atribui os dados do mapa
@dados = {
#Note que poderemos ter mais de uma instrução, estão criaremos um Hash
:instrucao => {},
# Os demais campos do bloco dados serão campos normais
:distancia => nil,
:tempo => nil
}
#Invoca o bloco como se o mesmo fosse parte de um instancia de objeto
instance_eval(&bloco)
end
def virar(direcao,onde)
caminho("virar a #{direcao}"," n(o/a) #{onde}")
end
def seguir(opcoes = {})
if opcoes[:ate]
caminho "seguir", "até #{opcoes[:ate]}"
elsif opcoes[:por]
caminho "seguir", "por #{opcoes[:por]}"
end
end
# Atribui os dados
def caminho(acao, instrucao)
@dados[:instrucao][acao] = instrucao
end
def distancia(distanciakm)
@dados[:distancia] = distanciakm
end
def tempo(tempomin)
@dados[:tempo] = tempomin
end
# Exibição dos dados
def to_s
resultado = ""
resultado << "Mapa #{@nome}\nCaminho:\n"
@dados[:instrucao].each do |ordem|
resultado << "\t - #{ordem}\n"
end
resultado << "Distancia: #{@dados[:distancia]}\n"
resultado << "Tempo: #{@dados[:tempo]}\n"
resultado
end
end
# Instancia a classe Mapa
def mapa(nome, &bloco)
Mapa.new(nome, &bloco)
end
# Monta o mapa "Minha Casa"
m = mapa "Minha Casa" do
virar :direita, "no posto"
seguir :ate => "o campo grande"
virar :esquerda, "madeireira"
seguir :por => "aproximadamente 15 kilometros"
virar :direita, "frente do bar do zé"
distancia "20 Kilometros"
tempo "30 minutos"
# Mostra o conteúdo da string resultado que é retorno de to_s
puts to_s
end
Percebam os métodos especializados novos que foram adicionados …
A idéia de uma DLS é que seja possível explicar facilmente utilizando jargões do domínio ao qual aquela DSL se aplica, por exemplo, para melhorar mais ainda este exemplo a utilização dele teria que ser mais ou menos assim:
# Monta o mapa "Minha Casa" m = mapa "Minha Casa" do virar :direita, "posto", 500.metros seguir :ate => "o campo grande", :por => 200.metros virar :esquerda, "madeireira" seguir :por => 15.kilometros virar :direita, "frente do bar do zé" # Mostra o conteúdo da string resultado que é retorno de to_s puts to_s end
Neste caso fora as referencias a locais, todo o resto seriam comandos da linguagem especifica para montagem de mapas, mas fora esta pequena alteração no exemplo, o tutorial ficou muito bom, o livro vai ser entregue na sexta feira no encontro dos nerds de RoR aqui de porto alegre
PS.: Espero que o Shoes veja isto aqui e diga que eu to falando besteira, assim eu aprendo um pouco mais sobre DSL
PS2.: Este foi o primeiro vou deixar assim, mas se vocês prestarem atenção, os tutoriais escritos para ganhar o livro, são para serem postados aqui neste blog, e não no do autor
Tags: Ruby
O primeiro interessado em cada um dos livros que cumprir os itens acima leva o livro, o único custo vai ser o frete (se quiser pegar pessoalmente ai não paga nem isto
)
Sugestões de assunto para os tutoriais:
Estas são só idéias, praticamente qualquer coisa atual relacionada com desenvolvimento, ou melhor ainda com desenvolvimento ágil ta valendo
PS.: espero que alguem se interesse pelos livros