quinta-feira, abril 28, 2011

Groovy: anotacao @delegate



Para ir direto ao ponto, segue abaixo exemplo de uso da annotation delegate,
que resumidamente é um atalho para metodos e propriedades...

import groovy.lang.Delegate;

/**
 * Main 
 */
class Main {

 static main(args) {
  def pessoa = new Pessoa()
  pessoa.nome = "rafael"
  pessoa.carro = new Carro()
  pessoa.carro.marca = "fiat"
  
  // antes de existir o delegate
  println pessoa.nome // "rafael"
  println pessoa.carro.marca // "fiat"
  println pessoa.carro.getMarca() // "fiat"
  
  // após uso do delegate
  println pessoa.marca // "fiat" - eita! pessoa nao tem essa propriedade diretamente...
  println pessoa.getMarca() // "fiat" eita! pessoa nao tem esse metodo...
 }

}

/**
 * Class Pessoa
 */
class Pessoa {
 def nome
 
 @Delegate
 def Carro carro 
}

/**
 * Class Carro
 */
class Carro {
 def marca
 def getMarca() {
  return marca
 }
}


Brinque no GroovyConsole.

terça-feira, abril 26, 2011

Dicas Rápidas de Grails para quem vem do Java - Controllers




Segue abaixo exemplo contendo várias informações sobre controllers.
Para ver documentação oficial, visite grails.org.

Se lhe foi útil, deixe um comentário (pode ser anônimo).


1. Basico de actions
class ToperaController {
def teste = {
render "Hello World"
}
}

Acessado via: http://localhost/minha-app/topera/teste


2. Tipos de encerramento de actions

class ToperaController {

// retornar HTML cru
def html = {
render "Hello World"
}

// requestDispatcher pra view gsp (traducao: manda os dados prum html externo)
// o gsp que será procurado pelo server é o views/topera/html2.gsp
def html2 = {
[msg: "Hello Crazy World!!"]
}
// e o gsp poderia ser "A mensagem recebida foi ${msg}"

// renderiza JSON, criando obj na hora
def json1 = {
render(contentType:"text/json") {
[nome: "rafael", idade:29]
}
}

// renderiza JSON, usando objeto pre-existente
def json2 = {
def pessoa = new Pessoa([nome: "rafael", idade:29])
render(contentType:"text/json") {pessoa}
}

// renderiza JSON (outra forma)
def json3 = {
render new Pessoa([nome: "rafael", idade:29]) as JSON
}  

/*
* Obs: os retornos em JSON podem ser lidos direto pelo javascript. Com jQuery seria assim:
* 
* $.getJSON("http://localhost/minha-app/topera/b2", function(pessoa){
*    alert("Nome pego no servidor foi " + pessoa.nome);
* });   
*/

// renderiza de acordo com tipo de url
// "topera/varios.json" pega json e "topera/varios.html" pega html
def varios = {
def pessoa = new Pessoa([nome: "rafael", idade: 29]);
withFormat {
html {render "Nome:  $pessoa.nome
Idade:  $pessoa.idade"}
json {render pessoa as JSON}
}
}

// monta html via objeto
def htmlObj = {
render {
div(id:"meuId"){
b ("Mensagem")
}
}
}

// retorna stream de arquivo binario
def figura = {
response.setContentType("image/jpeg")
response.outputStream << new File("D:/foto.jpg").readBytes()
}

// redireciona pra ToperaController.html() (dá um sendRedirect, isto é, browser recebe informacao para redirecionar)
def redirect1 = {
redirect controller: 'topera', action: 'html'
}

// redireciona pra action a, no mesmo controller
def redirect2 = {
redirect action: 'html'
}

// encaminha para outra action, SEM envolver client (browser)
def forward = {
forward action: 'html'
}

}

class Pessoa {def nome, idade}

sexta-feira, abril 22, 2011

Dicas Rápidas de Groovy para quem vem do Java




1. Basico

a) Nao precisa de ponto-e-virgula;
b) A ultima linha de um metodo é o que ele retorna. Mas botar o return ajuda a entender melhor;
2. Collections


// List
a = [1, 2, 2]
a.each {println it}
println a.class // imprime java.util.ArrayList
a = []; a << "foo"; (adiciona "foo" na lista)

// Set
a = [1, 2, 2] as Set
a.each {println it}
println a.class // imprime java.util.HashSet

// Map
a = ["um":1, "dois":2]
a.each {println "$it.key = $it.value"}
println a.class // retorna null (?)




3. Loops

l = 'a'..'c' // define array [a, b, c]

l.each {print it.toUpperCase()} // imprime ABC

l = l.collect {it = "x"}
// mesmo que each, mas RETORNA objeto alterado. O each nao.

l.eachWithIndex {item, i -> println "$i) $item"} // imprime 0) a 1) b 2) c

def linhas = """
rafael,29
joao
maria, 24
"""
linhas.eachLine {println it}

5.upto(10) {print it} // 5678910

5.downto(1) {print it} // 54321

3. Asserts/Try/Catch

try {
def quadrado = {it * it}(3)
quadrado-- // adicao de bug...
assert quadrado == 9: "o quadrado de 3 deve ser nove!!"
} catch (AssertionError e) {
print "Erro na asserção..."
}


-1. Bônus...

// pega ultimo elemento
print a[-1]

// Imitando JSON (quase-json, hehe)
def pessoas = [
['nome':'rafael', 'idade':29],
['nome':'joao', 'idade':23]
]
pessoas.each { p ->
println "$p.nome tem $p.idade anos"
}

// regex basico com if ternario
print "rafael" ==~ /r.*/ ? "Fez Match!" : "Nao fez..."

// operador elvis (?)
def a = "foo"
print a?.toUpperCase() // imprime FOO
a = null
print a?.toUpperCase() // imprime null, mas nao da nullpointer

// executa coisa no SO nativo (linha de comando)
print "ls".execute().text

// chama construtor e já poupula objeto
def p = new Pessoa([nome: "joao", idade: 23])

// metodo call()
def chamaPassandoQuatro (minhaClosure) {  minhaClosure.call(4) }
chamaPassandoQuatro({  print it * it })






Se lhe foi útil, deixe um comentário...não precisa de login...

Leis Fundamentais do Backup

Reza a lenda que durante o ataque terrorista de 11/09, o gerente de infra de um grande banco financeiro viu um avião acertando a torre em que ficava os servidores da empresa. Enquanto a primeira torre ardia, seu colega de trabalho, ainda abalado com a tragédia disse:

"Nossa!! Perdemos todos os dados dos clientes! A empresa vai falir!"

Nisso o gerente respondeu:

"Calma, man. Acha que sou tonto? Faço backup todo dia na outra torre!"





Leis Fundamentais do Backup

Aproveitei o feriado de páscoa pra ficar divagando sobre backup enquanto acordava... segue o resumo...

I) Farás Backup
II) Seus Backups serão Periódicos
III) Testarás seus Backups
IV) Seus Backups ficarão Distantes dos Originais


I) Farás Backup

Parece óbvio, mas ainda tem gente que não faz isso. Eu mesmo, mesmo fuçando em pcs desde 1995, as vezes esqueço... hehe. Nada como refazer o trabalho de uma semana para gravar isso no mais profundo do cérebro...

II) Seus Backups serão Periódicos

Se vc atualiza seu livro ou programa todo dia, de que adianta fazer backup a cada 6 meses?

III) Testarás seus Backups

Este é mais sutil. Novamente, de que adianta fazer backup a cada 6h e nunca ter testado se ele funciona? Ex: certa pessoa que prefiro manter em segredo(!) fazia backup semanal de seus arquivos mais importantes, planilhas, etc. Um dia as coisas deram pau e ele precisou pegar os arquivos do backup. Na hora deszipar o famoso bkp.zip, PAN!, erro! Ele estava fazendo backup do ATALHO da pasta, não do conteúdo dela. Assim, a unica coisa que ia pro zip era o link da pasta.... Tá! Confesso! Fui eu! :)

IV) Seus Backups ficarão Distantes dos Originais

Essa é a que faltou ao gerente de TI do início da história. Claro que tem vários graus de distância:

Distâncias Lógicas:
  • Arquivos na mesma pasta (nada distantes, por sinal)
  • Arquivos em pastas diferentes
  • Arquivos em partições diferentes
  • Arquivos em HDs diferentes
  • Arquivos em computadores diferentes
  • Arquivos em meios diferentes (arquivo original=conectado, hd externo=off-line)
Distâncias Geográficas:
  • Backup no mesmo pc
  • Backup em cima do pc (hd externo em cima dele, nada inteligente)
  • Backup no mesmo cômodo (se pegar fogo no quarto?)
  • Backup na mesma casa (e se desmoronar tudo?)
  • Backup na mesma cidade (e se alagar tudo?)
  • Backup no mesmo pais (e se rolar uma guerra e bombardearem tudo?)
  • Backup no mesmo continente (e se rolar a terceira guerra, com ogivas dizimando tudo?)
  • Backup no mesmo hemisferio (e se acabarem a mesma metade da Terra?)
  • Backup no mesmo planeta (preciso escrever "e se?")
  • Backup no mesmo sistema solar (Ex: backup em marte....Zzzzzzzzzzzzz)
Como pode ver, seu custo com backup depende de duas variáveis:

  1. O quão importante são os dados
  2. Qual seu nível de PARANÓIA!

Abraços e boa páscoa.
Que o backup na mesma casa seja o suficiente.

obs: sim, já ouvi falar de cloud computing. Só não quero dar poder de mais pro Google...

quinta-feira, abril 21, 2011

Montando console do groovy no Eclipse

Se você quer ter um console do groovy no eclipse rapidamente, sem fazer download de plugins/IDEs, segue abaixo a dica.
Não precisa nem fechar o workspace, hehe...

1) Adicione o groovy no sistema se não tiver
No ubuntu basta digitar:

$ sudo apt-get install groovy

2) Crie novo projeto java no eclipse

Ctrl + N > Java Project > Next
Em Project Name digitei "console"
(nao precisa de printscreen disso né?)


3) Crie seu arquivo "console.java"

Ctrl + N > Class
Digite "console para o nome da classe. Sim, minusculo mesmo, pois isso não será uma classe...
Marque pra criar o metodo main, pra facilitar.
(tbm nao precisa de print disso...esse artigo é pra programadores java que estao indo pro grails...)

4) Adicione o groovy como ferramenta externa no eclipse

Menu: Run > External Tools > External Tools Configurations


No lado esquerdo, selecione Program e clique no icone de novo

Name: põe o que quiser... botei "groovy"
Location: /usr/bin/groovy (no caso do Ubuntu..no windows é só apontar pro groovy.exe)
Working Directory: ${workspace_loc:/console} (clique em "Browse Workspace" e selecione o projeto java)
Arguments: console.groovy
Apply pra não perder tudo

Por enquanto fizemos o seguinte: ao chamar a app externa groovy, o eclise fará o mesmo que:

$ cd {caminho-do-seu-workspace}/console
$ /usr/bin/groovy console.groovy


Importante: o groovy só executa arquivos .groovy. Entao precisamos criar
o link para o console.java

$ ln -s {caminho-do-seu-workspace}/console/console.java {caminho-do-seu-workspace}/console/console.groovy

No meu caso:

topera@topera-desktop:/dados/topera/workspace/console/src$ ls -l /home/topera/topera/workspaceteste/console/
total 8
-rw-r--r-- 1 topera topera 364 2011-04-21 12:18 console.class
lrwxrwxrwx 1 topera topera 55 2011-04-21 12:28 console.groovy -> /home/topera/topera/workspaceteste/console/console.java
-rw-r--r-- 1 topera topera 136 2011-04-21 12:18 console.java

Blz, voltando ao eclipse, devemos ter a mesma tela:

Pra ficar mais facil de chamar o groovy, na aba "Common", marque o check em "Display in favorites menu"
Apply > Close > Save
(se nao guardar este check, é bug do eclispe, faca novamente, hehe)

Vamos testar

Clique na seta setinha do botao do print abaixo ou va em:
Run > External Tools > groovy
Não aconteceu nada...imprima algo no console e tente novamente.
Pronto! Já estamos fazendo o eclipse chamar o groovy e este está lendo nosso arquivo java!
(obs: se nao funcionar pode ser pq a variavel de ambiente JAVA_HOME nao esta setada...)

5) Adicionando atalho de teclado

Pra nao ficarmos clicando toda hora, vamos adicionar o atalho

Window > Preferences > Filtre "keys > Na direita filtre por "run last"
Selecione "Run last launched external Tool" e adicione o atalho de sua preferencia.
Eu botei o Ctrl+Enter, pra ficar igual ao GroovyConsole / SQLDeveloper

6) Desligando erros de sintaxe

Vamos tranformar esse java em groovy.
Troque o codigo-fonte por isso.

print "hello groovy"
Execute. Blz. Tudo ok. Agora vamos desligar o validador java (*)
(*) Lembre-se da regra basica:

"Todo codigo java funciona em groovy, mas nem todo codigo groovy funciona em java".

Por este motivo o validador está acusando erro.
Para desliga-lo, e ficarmos apenas com o auto-complete do java (muito util por sinal), faça:

a) Botao Direito no codigo-fonte > Preferences > Report Problemas as you Type (desmarque)

Depois:

b) Botao Direito na pasta do projeto > Properties > Filtre por "validation" > Marque "Enable project specific settings" e "suspen all validators"

E por ultimo

c) Botao Direito na pasta do projeto > Properties > Filtre por "builders" > Desmarque o java


Obs1: neste ultimo item 6) nao sei qual combinacao das 3 coisas resolve o problema. Sei que as tres dão certo :)
Obs2: se ainda assim nao funcionar, apague o console.java e crie novamente.


Tutorial feito com Eclipse 3.5.2, Ubuntu 10.04


UPDATE 1:
Para o autocomplete do java funcionar, é preciso ter um minimo de classe montado.
Entao, deixe esse trecho de codigo no final do console.java

class a {
static {
"".isEmpty(); //teste o autocomplete aqui...
}
}

UPDATE 2:
Se não quiser ter todo este trabalho é só usar o GroovyConsole, na web.

quarta-feira, abril 20, 2011

Primeiros Erros no Grails - Dia 1

Vou listar aqui tudo o que deu de errado ao começar a usar o grails, caso lhe ajude algum dia...

Após algumas brigas com os correios, o livro de grails(*) chegou, mão na massa!
(*) "Em Busca do Grails", do Fernando Anselmo.

Abro terminalzinho linux e vamo lá:

$ cd /dados/topera/workspace/livrograils/
$ grails create-app olamundo

Primeiro comando, tudo ok, app criada.
Ok. Td certo.
(criou toda a estrutura necessaria)

1) HelloBug I

Botando a app pra rodar:
$ grails run-app

Tomei o erro:
/dados/topera/workspace/livrograils does not appear to be part of a Grails application.
The following commands are supported outside of a project: ...


Hm....quem sabe se eu ler a mensagem de erro....já sei!
Solucao: ENTRE na pasta da aplicacao primeiro, afinal ele nao vai adivinhar qual app vc quer rodar, hehe.
$ pwd
/dados/topera/workspace/livrograils/
$ cd olamundo
$ pwd
/dados/topera/workspace/livrograils/olamundo

2) HelloBug II

Tentativa numero 2!
$ grails run-app
(PAN! ERRO...pelo menos o erro mudou, já é algum progresso...hehe)
[native2ascii] Converting 13 files from /dados/topera/workspace/livrograils/olamundo/grails-app/i18n to /home/topera/.grails/1.3.7/projects/olamundo/resources/grails-app/i18n
Error executing script RunApp: : Error starting Sun's native2ascii:
...mais stacktrace...

Certo... sem desespero. Vamos adotar a tática da leitura...lá no final do stack aparece:

java.lang.ClassNotFoundException: sun.tools.native2ascii.Main


Certo. Uma classe java não foi encontrada. Quem sabe se eu parar de usar essa porcaria de
JVM que vem com o ubuntu 10.04 (java-6-openjdk), que já deu pau outras vezes, e trocar pra da sun...

Opa! Perae, meu JAVA_HOME ta setado pra:

$ export JAVA_HOME=/usr/lib/jvm/java-6-openjdk


Vou mudar pra JVM da sun:

$ export JAVA_HOME=/usr/lib/jvm/java-6-sun

Mesmo erro. Então, DESSA VEZ, a culpa não é da openjdk.
Outra tentativa:

$ export JAVA_HOME=/usr/lib/jvm/jdk1.6.0_24/

....
Server running. Browse to http://localhost:8080/olamundo


Aee! Conclusão: LEIA direito o livro. Na primeira página o autor já avisa que precisa de uma JDK (JRE não é suficiente).

Até a próxima.

APENDICE:

Aquilo que deu certo
1) Colocar variaveis de ambiente no final do /etc/profile

GRAILS_HOME=/pastaondebotouograils
PATH=$PATH:$GRAILS_HOME/bin
export GRAILS_HOME PATH
export JAVA_HOME=/usr/lib/jvm/jdk1.6.0_24/

sábado, abril 16, 2011

Configurando modem Thomson Gateway TG508 Speedy

Contratou speedy e te falam:
"Desculpe senhor, não damos suporte ao linux"
ou
"Desculpe senhor, não damos suporte a modem roteado"

Segue abaixo algumas dicas que podem ajudar:


Modelo do modem: Thomson Gateway TG508

1. Ligar tudo.

2. Acessar o painel de controle do modem, abrindo a página http://192.168.1.1 no seu navegador.

3. Ir em Thomson Gateway > Configuracao > Escolha uma tarefa > Configuracao


4. Vá em PVC1 e mude para disabled. Clique em aplicar.

5. Refaça o caminho, só que agora para mudar o PVC0.


6. Troque isso:


  • Descrição ATM: PVC0
  • Protocolo ATM: 1483 Bridging
  • VPI/VCI: 8/35
  • DHCP: Marcado

Por isso:


  • Descrição ATM: PVC0
  • Protocolo ATM: PPPoE
  • VPI/VCI: 8/35
  • Nome de usuário: cadastro@cadastrotelefonica.com.br
  • Senha: cadastro
  • Confirmar Senha: cadastro

7. Dê aplicar.

Se tudo deu certo, a internet já estará funcionando.