Coletânea de Links

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 :D )

Outra coisa, vocês acham úteis estas coletâneas de links que posto de vez em quando?

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

JRuby On Rails + JPA

Eu ja estava pensando em fazer um exemplo assim a algum tempo, mas sairam na minha frente :D
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

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Notebook para que? PortableApps.com!

portableapps1.PNG

Tudo bem, isto não é realmente uma substituição para um Notebook, mas é bem útil, e pode ate´ser divertido :D
A imagem que vocês podem ver aqui, é do Menu do PortableApps do meu Pendrive, em qualquer maquina que eu coloco o pendrive o menu aparece, e eu ja tenho disponíveis as aplicações que eu escolhi …
No meu caso, as seguintes:

  • OpenOffice 2.0 - bastante útil em palestras e cursos (no caso estou utilizando agora para mostrar os slides do curso de Ruby On Rails)
  • 7-Zip
  • GVim - Bastante útil para correções rápidas em algum código fonte, ou até para programar em Ruby mesmo, pena que não compilaram com suporte a code completion (omnifunc)
  • Firefox - Simplesmente por que eu não suporto utilizar o IE
  • Putty
  • WinSCP
  • VNC Viewer
  • Sumatra PDF (um leitor de PDF bem leve e útil)
  • VLC
  • MPlayer

Ou seja, quase tudo o que eu preciso em quase todos os lugares que eu estiver (nos outros ainda preciso do note mesmo :D )

Se gostaram da dica, é só dar uma passada em PortableApps.com

English Version Here

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Ruby Quebra Cuca - Olha só como da para complicar …

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 :D
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 :D

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 :D
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 :D

Bom, acho que era isto por enquanto, se alguem conseguir uma explicação mais clara destes exemplos seja bem vindo :D

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Supreme Nerd God!

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 :D

I am nerdier than 95% of all people. Are you a nerd? Click here to find out!

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Contagem regressiva para o curso de Ruby On Rails

Bom, daqui a 15 minutos to indo para o local do curso,
se alguem ainda quiser se inscrever, tem 1h antes do inicio do curso :D
http://www.techoffice.com.br/ruby/flyer_ruby.htm
Só o manual do curso tem quase 80+ páginas (só pra terem uma idéia do conteúdo :D )

Até daqui a pouco então!

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Grupo de Usuárias de Programadores!

É 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 :D

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

NetBeans 6.0 Beta 1 disponível (noticia quase 3 dias atrasada :D )

netbeans6.jpg

A versão Beta 1 do Netbeans 6.0 ja esta disponível para download para quem quiser testar.
O Netbeans esta ficando cada vez melhor, o editor de código esta muito bom, e o que estou gostando mais ainda são os “sabores” diferentes da IDE para baixar, deem uma olhada na tabela abaixo:
netbeans_comps.png

Tem disponívels configurações diferentes para uma IDE para:

  • Java EE
  • Java ME
  • Java SE
  • Ruby
  • C/C++
  • Todas as Anteriores

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 :D
(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 :D )

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Twitter

Até que o tal do Twitter é bem legal :D



Resolvi experimentar semana passada e gostei, não é algo realmente útil, mas é divertido …
As vezes funciona até como uma reunião via IM, só que publica :D
Se alguem quiser em algum momento acompanhar as inutilidades que escrevo la de vez em quando é só clicar aqui.

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Estendendo o Ruby com DSL (Domain Specific Languages – Linguagens Especificas de Domínio)

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 :D

PS.: Espero que o Shoes veja isto aqui e diga que eu to falando besteira, assim eu aprendo um pouco mais sobre DSL :D

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 :D


O melhor curso de Ruby On Rails de porto alegre começa dia 24, ainda da tempo de se inscrever

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Queima de Estoque! (Livros de grátis, ou quase :D )

Sun Certified Enterprise Arqhitect for J2EE

16092007053.jpg
SCWCD Study Kit

16092007054.jpg
Segurança de Dados Criptografia em Redes de computador

16092007055.jpg
Desenvolvendo Aplicações com UML

16092007056.jpg
Segurança Máxima Para Linux

16092007057.jpg


Estes livros ai de cima estão parados na minha casa, e acredito que não exista probabilidade nenhuma de eu lê-los novamente …
Então achei que seria interessante dar eles para quem va fazer bom uso, só que não acho que valha a pena fazer algum tipo de sorteio, então as regras para quem se interessar pelos livros são as seguintes:

  1. Deixar um comentário aqui dizendo por qual dos livros se interessou
  2. Limite de 1 (um) livro por pessoa
  3. Postar um link em seu próprio blog se o tiver para este post ou para a home do meu blog (prefiro para a home :D )
  4. Esrever 1 tutorial sobre algum assunto atual e me enviar para que seja postado aqui no blog

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 :D )

Sugestões de assunto para os tutoriais:

  • Ruby
  • Rails
  • Groovy
  • Grails
  • Recursos de integração com a JVM do JRuby
  • Flex + Java
  • Flex + Ruby
  • Wicket
  • Tapestry
  • JSF + JPA + EJB3
  • Escrevendo testes unitários, de integração e de aceitação (em Java ou Ruby)

Estas são só idéias, praticamente qualquer coisa atual relacionada com desenvolvimento, ou melhor ainda com desenvolvimento ágil ta valendo :D

PS.: espero que alguem se interesse pelos livros :D


O melhor curso de Ruby On Rails de porto alegre começa dia 24, ainda da tempo de se inscrever

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

JRuby + Glassfish = ?

rails.png + glassfish.png

O pessoal do JRuby esta melhorando cada vez mais a integração com o glassfish para facilitar o deployment de aplicações Ruy On Rails no Glassfish, até ai tudo perfeito …
O problema é que tem gente meio maluca por ai, e seguindo esta linha de raciocínio, olha só o que fizeram?
Instale o jRuby normalmente, depois execute os seguintes comandos:

gem install -y rails
gem install -y glassfish
rails testapp
cd testapp
jruby script/server

O que você conseguiu com isto?
A forma mais demorada da face da terra de rodar a sua aplicação Rails no mundo!

Claro que isto pode ter outras vantagens, como rodar os testes exatamente no mesmo ambiente que vai ser colocada em produção, mas sinceramente, alguem tem este tipo de problema com o rails? algo do tipo funcionar no WEBrik e não funcionar no Mongrel por exemplo?

Eu ainda acho muito melhor a alternativa “tradicional” que escrever tudo normalmente usando o WEBrick ou Mongrel para testar, e depois de tudo pronto criar o war com o Goldspike:

script/plugin install http://jruby-extras.rubyforge.org/svn/trunk/rails-integration/plugins/goldspike
rake war:standalone:create

ou então a versão “lite” com o Warble:

gem install warbler
warble
rake war

Bem melhor e não me obriga a ir tomar um café toda vez que eu for rodar a aplicação para testar …

Ajude este amigo que vos escreve na competição de programação “RailsRumble”, basta se registrar e depois votar na minha aplicação (Know Your Client), lembre-se que ela foi desenvolvida em 16h (não eu não fiquei as 48h do concurso na frente do computador)

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Frase do dia - Trabalho em equipe

Esta eu li no mural aqui da HP :D

TEAM = Together Everyone Achieves More

Gostei da frase :D

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Frases do Dia - Desenvolvimento ágil

Estas frases foram copiadas de um e-mail que recebi hoje na lista visão ágil:

Manifesto for Agile Software Development - http://agilemanifesto.org/ :

Estamos descobrindo maneiras melhores de desenvolver software fazendo-o nós mesmos e ajudando outros a fazê-lo. Através desse trabalho, passamos a valorizar:
Indivíduos e interação entre eles mais que processos e ferramentas
Software em funcionamento mais que documentação abrangente
Colaboração com o cliente mais que negociação de contratos
Responder a mudanças mais que seguir um plano

Ou seja, mesmo havendo valor nos itens à direita, valorizamos mais os itens à esquerda.

A Nova Metodologia - Martin Fowler

Tudo isso traz à tona algumas perguntas. A primeira é a questão do quão difícil é conseguir um design estilo UML em um estado que possa ser entregue aos programadores. O problema com um design UML é que ele pode parecer muito bom no papel, e ainda ser seriamente problemático quando você tem que traduzi-lo em código-fonte. Os modelos utilizados por engenheiros civis são baseados em diversos anos de prática adquirida em códigos de engenharia. Além disso, questões-chave, tais como o modo que forças físicas atuam no projeto, são triviais à análise matemática. A única checagem que podemos fazer em diagramas UML são revisões cuidadosas. Enquanto estas são úteis, levam a erros que são freqüentemente descobertos apenas durante a codificação e testes. Até mesmo designers habilidosos, como eu me considero , são freqüentemente surpreendidos quando transformamos tais designs em software.

Programação Extrema (XP) Explicado - pg. 53, 5 paragrafo

Programação Extrema (XP) Explicado - Escolha as Mudanças Kent Beck É a diferença entre jogar para ganhar e jogar para não perder. A maior parte do desenvolvimento de software que eu vejo por ai é jogado para não perder. Muito papel escrito, muitas reuniões feitas. Todos estão tentando fazer o desenvolvimento “pelo manual”, não porque ele faça algum sentido, mas porque eles querem poder dizer no final que não foi culpa deles, eles estavam seguindo o procedimento

Otimização prematura é a raiz de todo o mal - Não sei quem é o autor :(

Shoichiro Toyoda:

Hoje mais do que nunca, precisamos lembrar dos ensinamentos do Dr. Deming: Simplesmente coloque a qualidade em primeiro lugar e prossiga com a prática honesta de desenvolver produtos de qualidade.

Frades do Dr. Demin:

  • O processo não é apenas a soma de suas partes
  • Inovação vem do produtor-não do cliente
  • Falta de conhecimento…Este é o problema
  • Inovação vem de pessoas que se divertem com seus trabalhos
  • Os melhores esforços não irão substituir o conhecimento
  • Se você não sabe fazer a pergunta certa, não ira descobrir nada.
  • Sem teoria não existem perguntas
  • As pessoas precisam saber como seu trabalho contribui para o todo

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Primeiro encontro Rails-RS

Seguindo a onda do primeiro curso de Ruby On Rails de Porto Alegre, mas desta vez sem ligação com empresa nenhuma, o pessoal da lista rails-rs esta organizando o primeiro Encontro Rails-RS.

encontro_rails_rs.png

Que vai acontecer no dia 21 de setembro na Choperia em porto alegre a partir das 19h;

Endereço:

Rua General Lima e Silva, 776
Cidade Baixa - 3221-0211

Quem mais quiser ir sinta-se convidado :D

E quem estiver interessado em aprender Ruby On Rails, não se esqueça do melhor curso de Ruby On Rails de porto alegre, que começa dia 24 de setembro, logo depois do encontro :D

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!