Skynet

  • Aumentar tamanho da fonte
  • Tamanho da fonte padrão
  • Diminuir tamanho da fonte
Home Oscar Konno Sampaio

Oscar Konno Sampaio


18.01.2010 02:53:52

Derrepente ocorre a exceção 'groovy.lang.MissingPropertyException: No such property: save for class XXXX' do nada quando rodando um aplicativo grails. XXXX é uma classe de dominio e portando deveria ter o método save. Ainda mais ele diz 'property' e não 'method' !!!

Parece que é um bug do grails e dizem que já foi resolvido na versão 1.2.

Como resolver? 

Um workwrround: no arquivo BootStrap.groovy (em grails-app\conf) adicionar a linha:

XXXX.get(-1)

 


Tags:



07.01.2010 03:22:23

Para abrir um link em uma nova janela:

<a href="http://www.google.com" target="_blank">Goggle</a> 

 

Para abrir um link em uma janela pop-up:

<!-- Codigo Java Script para criação do popup -->
<script type="text/javascript">
// Popup window code
function newPopup(url) {
    popupWindow = window.open(url,'popUpWindow','height=700,width=800,left=10,top=10,
       resizable=yes,scrollbars=yes,toolbar=yes,menubar=no,location=no,
       directories=no,status=yes')
}
</script>

<!-- Trecho HTML pra chamar a janela pop-up -->

<a href="JavaScript:newPopup('http://www.goggle.com');">Abrir um pop-up</a>

 

 


Tags: html | popup | windows | howto



04.10.2009 03:25:41

Para manipular BLOBs via SQL no Firebird utilize a função string2blob que vem com a UDF FBUDF (instalação do firebird). Para registrar a função use o script:

declare external function string2blob varchar(300) by descriptor, 
blob returns parameter 2 
entry_point 'string2blob' module_name 'fbudf'; 

 

Para utilizar a função veja o exemplo abaixo:

update relatorios set rel_sentenca= string2blob('select cast(j.jpc_dataexecucao as date) as data, 
i.itf_descricao as item,        
i.itf_valor as valor 
from job_processamentos j, cortes c, faturas f, itens_faturas i, contas cnt, pessoas pes where j.res_id=c.cor_id and f.cor_id=c.cor_id and i.fat_id=f.fat_id and cnt.cnt_id=f.cnt_id and pes.par_id=cnt.ref_id and cast(j.jpc_dataexecucao as date)>=:inicio and cast(j.jpc_dataexecucao as date)<=:fim order by j.jpc_dataexecucao, f.fat_id ') where rel_id=14;
 




03.09.2009 21:43:03

Versões:

Ubuntu: 9.01
Apache: 2.2
Tomcat: 6.0
Conector mod_j: 1.3

Instale o Apache, se ainda não estiver instalado, o Tomcat e o mod_jk (conector)  usando o apt-get ou o synaptic.

Configuração Tomcat

Para habilitar a comunicação via conector ao tomcat, edite o arquivo de configuração server.xml (em /etc/tomcat6) e descomente a linha onde é feita a declaração do conector ajp:


 Salve e restart o tomcat:

sudo /etc/init.d/tomcat6 restart

Configuração Apache

1. Criar arquivo de workers (onde são definidos os servidores tomcat para os quais serão redirecionados as requisições):

Crie o arquivo worker.properties em /etc/apache2

Adicione as linhas abaixo e salve:

worker.list=tomcat

worker.tomcat.host=127.0.0.1
worker.tomcat.port=8009
worker.tomcat.type=ajp13

A primeira linha ( worker.list=tomcat ) define a lista de servidores (tomcat), pode ser definido mais de um, separados por virgula.

As demais é onde é feita a configuração dos mesmos (worker.[nome do worker].[propriedade])

2. Configurando o redirecionamento para o worker (tomcat)

Edite o arquivo httpd.conf ( em /etc/apache2 )  e adicione as seguintes linhas:

# caminho onde encontrar o arquivo de definição de workers
JkWorkersFile /etc/apache2/worker.properties    

# ponto de montagem e para onde é direcionada a requisição
JkMount /examples/* tomcat 

Salve (tudo deve ser feito com permissão de su)

3. Configurando o VirtualHost

Provavelmente a sua configuração do apache vem com um virtual host para a porta 80. As configurações feitas anteriormente são válidas para o host principal. Para que sejam válidas para os host virtuais é necessario copiá-las. Para isso, edite o arquivo /etc/apache2/sites-enabled/default e adicione a linha abaixo (em negrito):

 

...
       JkMountCopy On

4. Restart o apache 

/etc/init.d/apache2 restart

Esta configuração irá redirecionar as requisições com o padrão /examples/* para o servidor tomcat:

http://localhost/examples/  →  http://localhost:8009/examples/  (equivalente a acessar http://localhost:8080/examples - tomcat)

Locais de logs:

Em caso de problemas vc pode ver os logs, tanto do apache quanto do conector em /var/log/apache2

 





20.08.2009 04:13:49

Normalmente o Grails vem configurado para a formatação americana, assim todas as entradas e saidas de ponto flutuante são no formato 999,999.99 ou seja, a virgula como separador de milhar e o ponto como o separador de decimais.

Com isso podem ocorrer alguns problemas, a digitação do número 1,30 pode não ser interpretada corretamente e o valor lido se tornar 130 e os valores decimais serão mostrados com ponto (.) ao inves de vígula (,).

Para mudar a formatação default do grails basta alterar o arquivo resources.groovy em grails-app\conf\spring e adicionar as linhas abaixo:

// Place your Spring DSL code here
beans = {
    localeResolver(org.springframework.web.servlet.i18n.SessionLocaleResolver) {
       defaultLocale = new Locale("pt","BR")
       java.util.Locale.setDefault(defaultLocale)
    }
  
}

 Com isso estaremos setando o Locale pt-br como o padrão para o aplicativo Grails.

Agora todas as entradas serão tratadas adequadamente e 1,30 será convertido internamente para o valor correto.

Mas mesmo assim os valores continuarão a serem mostrados no formato americano. Isso porque ao utilizamos a saida padrão, via EL ( ${alguma_coisa} ) o Grails não usa o formatador para gerar a saida. Para que os valores decimais seja corretamente mostrados de acordo com o locale escolhido a saida deve ser feita utilizando a tag <g:formatNumber>, por ex.:

<g:formatNumber number="${contratoInstance?.valorMaximoTransferencia}" format="###.00" />

 

 

 





12.07.2009 15:27:52

Modelo

Modelo

Classes

 class User {
    String userId
    String password
    String homepage
    Date dateCreated
    Profile profile
    
    static hasMany = [ posts : Post, tags : Tag ]
    
    static constraints = {
        userId(size:3..20, unique: true)
        password(size: 6..8, validator: { passwd, user -> return passwd != user.userId})
        homepage(url: true, nullable: true)
        dateCreated()
        profile(nullable:true)
        posts(sort:'dateCreated')
    }
    static mapping = {
        profile lazy:false
    }
    
}
class Profile {
    static belongsTo = User
    byte[] photo
    String fullName
    String bio
    String homepage
    String email
    String timezone
    String country
    String jabberAddress
    static constraints = {
        fullName(nullable: true)
        bio(nullable: true, maxSize: 1000)
        homepage(url: true, nullable: true)
        email(email: true, nullable: true)
        photo(nullable: true)
        country(nullable: true)
        timezone(nullable: true)
        jabberAddress(email: true, nullable: true)
    }
}

class Post {
    String content
    Date dateCreated
    static constraints = {
        content(blank: false)
    }
    static belongsTo = [ user : User ]
    static hasMany = [ tags : Tag ]
}
class Tag {
    String name
    User user
    static constraints = {
    name(blank: false)
    }
    static hasMany = [ posts : Post ]
    static belongsTo = [ User, Post ]
}

 

belongsTo e cascateamento

 

Somente os objetos marcados com belongsTo são cascateados. No exemplo acima Profile pertence a (belongsTo) User, assim se um objeto User for deletado, o Profile correspondente (relação 1:1) será deletado também. Sem o belongsTo, o profile correspondente não será deletado. Este comportamento também ocorre em relacionamentos 1:n - ao apagar um user todos os posts dele serão deletados.

 

Métodos addTo

O belongsTo também informa ao GORM onde ele deve disponibilizar os métodos addTo*(). No exemplo, em User seá possivel chamar user.addToTags() pois Tag belongsTo User. Da mesma forma podemos chamar Post.addToTags() (Tag belongsTo Post). Mas post não possuirá um método Tag.addToPosts() já que Pos não possui uma declaração de belongsTo  Tag.

 

Duas formas de belongsTo

 

Na classe Profile existe uma referencia direta a classe pai (belongsTo =User) . Isto cria um relacionamento unidirecional: é possível obter um profile a partir de User (user.profile) mas não é possível obter o user dono de profile (o atributo profile.user não existe).

 

Já na classe Post o belongsTo referencia um atributo (belongsTo = [user:User]). Assim é possível não somente acessar os posts de user bem como a partir de post encontrar o user (post.user).

 


Tags: belongsTo | grails | gorm



12.07.2009 06:29:22

Muitas vezes é interessante obter os erros decorrentes de validação de um objeto de dominio, sem no entanto passar para a camada de visualização (onde os erros são mostrados via tag <g:message>).Para isso podemos utilizar o código abaixo:

def foo=new Foo()
foo.validate()
if (foo.hasErrors()) {
    foo.errors.allErrors.flatten().each{   
        println it
    }
}


Tags: gorm | grails | errors



05.07.2009 03:36:15

I am working in porting of ScaffoldTag plugin to Grails 1.1. The plugin is already functional, but the disponible version in the plugin repository still is the 0.7 (when you use the grails-install-plugin commad). To obtain the new (trunk) version that work with Grails 1.1 is necessary to download from svn and generate the plugin.

Download the svn trunk version

You can use any subversion client tools, including the subeclipse if you are using eclipse.

The svn url is:  https://svn.codehaus.org/grails-plugins/grails-scaffold-tags/trunk

If you are using the svn client, create a directory where you will put the project, go there and type in the prompt:

svn -co https://svn.codehaus.org/grails-plugins/grails-scaffold-tags/trunk

Creating the ScaffoldTag plugin

Goto the directory where you put the project and type:

grails generate-plugin

This will generate a zip file with the plugin packed. You can install the plugin in a Grails project using the command:

 grails install-plugin


Tags: grails | plugin | scaffold | svn | install



14.06.2009 05:13:47

Vamos usar um grupo chamado admin para permitir que os usuarios deste grupo possam usar o comando sudo.
Verifique se existe um grupo chamado admin:

grep admin /etc/group

Se voltar algo parecido com:

admin:1006: ...

É porque já existe um grupo com este nome. Caso não volte nada crie o grupo:

sudo groupadd admin

Vamos adicionar o usuario para o grupo admin.
Caso ainda não exista o usuario crie o novo usuario adicionando-o ao grupo admin:

sudo useradd -G admin luiz

Neste caso estamos criando o usuario luiz e tb adicionando-o ao grupo admin

Caso o usuario já exista e deseja adicioná-lo ao grupo admin use;

sudo usermod -G admin luiz

Agora vamos adicionar o grupo admin ao arquivo /etc/sudoers fazendo com que os usuários deste grupo possam utilizar o comando sudo

Para fazer isso use o comando:
sudo visudo

Ele abrirá o vi com o conteúdo do arquivo /etc/sudoers. É melhor usar o comando visudo, ao invés de editar diretamente o arquivo sudoers porque ele faz uma validação do conteudo do arquivo editado impedindo que o mesmo seja salvo caso haja algum erro no mesmo.

Adicione a seguinte linha no final do arquivo:

admin ALL=(ALL) ALL

Podemos tambem fazer algumas alterações para melhorar a usabilidade do sudo. Caso queiramos que alguns usuario possam usar o sudo sem a necessidade de senha podemos incluir no arquivo algo assim:

sudo ALL=NOPASSWD: ALL

Neste caso todos os usuarios que pertençam ao grupo sudo não precisarão passar a senha quando usar o comando sudo


Tags: sudo | linux | ubuntu | user | permission



14.06.2009 04:57:52

Toda vez que vou instalar um serviço acabo tendo de procurar (googlar) na internet, ler vários sites, manuais e blogs. Para reduzir o trabalho das futuras gerações vou postar algumas receitas de conforme for instalando os serviços da Skynet. A primeira receita é de como instalar o servidor SVN (svnserve).

Esta receita serve para instalar o Subversion no Linux Ubuntu, 8.04.

Para instalar o Subversion vamos usar o apt-get:

sudo apt-get install subversion

Agora vamos criar e configurar um usuario para ser usado pelo subversion

sudo adduser svn

Vamos agora atribuir uma senha vazia para o usuario:

sudo passwd -d svn

Para permitir login com senha vazia é necessario configurar o arquivo /etc/pam.d/common-auth:

sudo sed -i 's/nullok_secure/nullok/' /etc/pam.d/common-auth

Vamos agora criar o diretorio onde serão colocados os repositorios do svn (pode ser em qualquer lugar). No caso criei em /var/lib

sudo mkdir /var/lib/svn

Vamos agora criar um repositorio (chamado 'repository' no exemplo) usando o svnadmin


cd /var/lib/svn
sudo svnadmin create repository


Mude o dono do repositorio para svn (use a opção -R para que o comando seja aplicado para todos os arquivos e diretórios abaixo recursivamente):
sudo chow -R svn.svn repository

Vamos agora setar o arquivo de configuração do repositorio. Para isso edite o arquivo /var/lib/srv/repository/conf/svnserve.conf

Descomente a linha:
password-db = passwd

Com isso o subversion irá utilizar o arquivo passwd em /var/lib/svn/repository/conf para configurar as senhas do usuario.
Edite o arquivo  /var/lib/svn/repository/conf/passwd adicionando as senhas dos usuarios


Para Startar automaticamente o svn criar um arquivo para iniciar e parar via init.d

Crie um arquivo chamado 'svnserve' em /etc/init.d (como super usuario)

==============================================================
#!/bin/sh -e
#
# svnserve - brings up the svn server so anonymous users
# can access svn
#

# Get LSB functions
. /lib/lsb/init-functions
. /etc/default/rcS

SVNSERVE=/usr/bin/svnserve
SVN_USER=svn
SVN_GROUP=svn
SVN_REPO_PATH=/var/lib/svn

# Check that the package is still installed
[ -x $SVNSERVE ] || exit 0;

case "$1" in
    start)
        log_begin_msg "Starting svnserve..."
        umask 002
        if start-stop-daemon --start \
        --chuid $SVN_USER:$SVN_GROUP \
        --exec $SVNSERVE \
        -- -d -r $SVN_REPO_PATH; then
            log_end_msg 0
        else
            log_end_msg $?
        fi
    ;;

    stop)
        log_begin_msg "Stopping svnserve..."
        if start-stop-daemon --stop --exec $SVNSERVE; then
        log_end_msg 0
        else
        log_end_msg $?
        fi
    ;;

    restart|force-reload)
        "$0" stop && "$0" start
    ;;

    *)
    e    cho "Usage: /etc/init.d/svnserve {start|stop|restart|force-reload}"
        exit 1
    ;;
esac

exit 0
======================================================================

As variáveis SVNSERVE, SVN_USER, SVN_GROUP configuram onde se encontra o svnserve .

A variável SVN_REPO_PATH deve conter o diretorio raiz onde serão adicionados os repositórios. Normalmente para operar o svn é necessário informar todo o path até o repositorio. P.ex. svn -o svn://nome.do.host/var/lib/svn/repository
Para evitar que o usuário tenha acesso ao path completo onde estão os repositorios pode-se iniciar o serviço svnserve com a opção -r que informa ao subversion que ele deve procurar os repositórios a partir do path informado.

Agora para iniciar o serviço basta digitar:
sudo /etc/init.d/svnserve start

Para para ou restartar use os parametros 'start' e 'restart'





14.06.2009 04:37:08

O objetivo deste blog é acompanhar o andamento dos varios projetos, divulgar idéias e notícias, permitir a troca de informação, tanto técnica quanto de negócios entre os membros da Skynet.

Sinta-se a vontade para fazer posts, toda informação que for util deve ser compartilhada. As idéias e novidades são bem vindas.

 

hasta la vista baby !

 


Tags: