24 de abril de 2007

Palestras sobre JSF

Nas duas ultimas semanas tive a oportunidade de apresentar duas palestras sobre Javaserver Faces.
A primeira foi realizada e parceria com um amigo (é nois Bruno) que falou sobre Netbeans e eu falei sobre JSF. Durante a palestra fiz um pequeno demo utilizando o Exadel, um plugin para o Eclipse que recentemente passou para o controle do Jboss/Red Hat e vai se chamar RedHat Developer Studio.
Aqui vocês vão poder baixar o PDF da apresentação, esquero que gostem ;-)

E na semana passada o Jug-Petropolis, do qual sou um dos coordenadores, em parceria com o Laboratório Nacional de Computação Cientifica, Projeto Tecnopolis, Funpat e CDG realizou em Petropolis o Sun Tech Days, transmitindo as palestras do Sun Tech Days que ocorria em São Paulo e tambem com alguns palestrantes locais, e pra variar eu não podia ficar de fora :P. Neste dia falei tambem sobre JSF mas com foco no ambiente de desenvolvimento Netbeans Visual Web Pack.
Aqui você pode baixar o PDF da apresentação.

Estou preparando alguns tutoriais pra postar no http://cafebatizado.googlepages.com assim que eles estiverem prontos vou postando aqui.

9 de abril de 2007

Palestra sobre Netbeans e Javaserver Faces

No dia 11 de abril a partir das 19 horas no Laboratório Nacional de Computação Científica, LNCC, serão realizadas duas palestras envolvendo a tecnologia java promovidas pelo Jug-Petrópolis:


Netbeans
* O que é o Netbeans
o Explicar sobre tecnologias suportadas na IDE
o Gratuito e código aberto

* Matisse GUI Builder
o O que você precisa saber para usar swing
o As dificuldades de layout usando swing
o O que o Matisse faz para você
o Demo

* Developer Collaboration
o Desenvolvimento de aplicações em ambiente colaborativo
o Chat
o Edição de arquivos de ambas as partes
o Demo

* Iniciativa Acadêmica SUN (SAI)
o Treinamento gratuito via web
o Como se inscrever
o Certificações SUN
o Exames práticos gratuitos, e taxas de inscrição para a certificação com descontos

Será ministrada por Bruno Bastor atualmente cursando o curso de Sistemas de Informação da UNESA, Certificação SCJP 1.5. A 2 anos atuando na área de desenvolvimento java SE, EE e ME, com foco maior em java SE. Trabalhando no projeto MoGrid (LNCC) e como Campus Ambassadro da empresa Sun Microsystems.

Javaserver Faces
* Modelos de desenvolvimento web Java
o Arquitetura Model 1
o Arqutetura Model 2
o JSR 127 - Javaserver Faces

* Expecificação X Produto

* Implementações da JSF
o RI - Reference Implementation
o Myfaces
o Smile
o Keel

* Principais características da JSF
o Compoentes
o Java Beans
o Conversão e Validação
o Pontos de extensão

* Guia para criação de uma aplicação JSF
o Exemplo de uma pequena aplicação JSF

* Componentes desenvolvidos por terceiros
o Myfaces
o RichFaces
o IceFaces

* Ajax e JSF
o IceFaces
o DynamicFaces
o Ajax4Faces

* Templates
o Tiles
o Facelets

* IDEs
o Netbeans
- Web Pack – Studio Creator
o Eclipse
- Webtools + jsftoos (a ser liberado em julho)
- Red Hat Developer Studio
o Rational Application Developer – WSAD
o JDeveloper

Será ministrada por Luis Henrique Muniz de Carvalho, membro do Jug-Petropolis, formado em Ciencias da Computação na UCP, Certificação SCJP e SCWCD. Há 16 anos atuando na área de desenvolvimento, sendo os ultimos 7 anos com Java/JEE. Desenvolveu sistemas para Merck, Compania Vale do Rio Doce, Petrobras, GovBR e atualmente alocado na TVGlobo.


O Laboratório Nacional de Computação Científca se encontra na Av. Getulio Vargas, 333, Quitandinha, Petrópolis - Rio de Janeiro, proximo ao Hotel Quitandinha, na entrada de Petrópolis.



Após as palestras pretendo publicar o material aqui no blog.

[]s Bula

27 de março de 2007

Ubuntu 7.04 Beta review

Na minha máquina tenho dois sistemas linux instalados: o Frugalware (default) e o Ubuntu 7.04 Beta, que tenho testado. No futuro pretendo testar o FreeBSD.

A respeito do Ubuntu, como muitos têm lido, ele vai passar a ter Compiz instalado, instalação de codecs por demanda, e um melhor suporte aos drivers proprietários da ATI e da nVidia, fora outros detalhes menos aparentes ao usuário.

O sistema inicia sem Compiz ou Beryl, mas tem uma opção para habilitar o Compiz (Beryl só instalando via aptitude ou apt-get) semelhante a encontrada em outras distros como a Fedora. Ao habilitar o Compiz, ele sugere a instalação dos drivers da placa de vídeo (ATI ou nVidia). Os efeitos do Compiz são legais, mas não se equiparam aos do Beryl. Contudo, o Compiz é bem mais leve.

A instalação de codecs por demanda é muito interessante, e facilitam a vida do usuário, mas eu só vi funcionar com vídeo, com outros formatos a coisa não funcionou da mesma forma. Eu ainda encontrei alguns problemas com os codecs. Basicamente, eu continuo precisando do MPlayer para assistir a vídeos nos padrões mais novos do formato WMV.

O sistema como um todo está funcionando melhor. Corrigiram diversos bugs, incluindo o do framebuffer, que não funcionava bem, mas a interface do terminal (fora do X11) continua estranha. A Canonical ainda tem um bom caminho para trilhar, mas o tem feito de maneira admirável.

Em suma, ainda não é a distro perfeita, e nunca vai ser, uma vez que somos criaturas imperfeitas, e nada perfeito pode advir de nossos trabalhos, mas é a distribuição perfeita para usuários iniciantes, inexperientes, ou que não querem ter dor-de-cabeça ou mesmo perder tempo com configurações. Tudo funciona out-of-the-box. É instalar e usar. Para os demais, só vocês são capazes de dizer o que é melhor para vocês.

Novidades

Muita coisa aconteceu nessas duas semanas que não enviei um só post para cá.

Participei do SAP Fórum em São Paulo, onde vi as "últimas" novidades do que se está desenvolvendo em termos de ERP/CRM comercial: a comunidade SAP "descobriu" as facilidades das interfaces web (aleluia!), com SAP Netweaver.

Obviamente não é necessário comprar o Netweaver para fazer uma interface web com o SAP; já existem conectores para diversas linguagens, incluindo Ruby, .Net, e Java. Cheguei a assistir uma palestra de uma empresa chamada Matec que criou todo um sistema de interface com o SAP usando plataforma .Net. Excelente!

E na última semana, resolvi me auxiliar no desenvolvimento da distribuição linux Frugalware. Tive uma calorosa acolhida, e a equipe parece ter a mente aberta para mudanças e novas idéias. Muito bom! Nada como trabalhar com algo que se gosta em um ambiente agradável.

Uma curiosidade: eu não vi o uso de notações húngaras no código-fonte do setup de instalação da distro, apesar de boa parte dos desenvolvedores ser húngara. Nem tudo é perfeito. Rsrs!

12 de março de 2007

Frugalware Linux 0.5 - Review

Nesse final de semana testei a versão 0.5 do Frugalware Linux, uma distribuição baseada no Slackware e no Arch Linux, com versão para x86_64. O Frugalware pode ser instalado em CDs (9), em DVD, ou em USB (Net Install). Optei pela versão em DVD.

Instalação

O instalador é feito em ncurses, mas não deixa nada a desejar para o Anaconda. A instalação é bastante straight forward. Até um pouco demais, pois não há como voltar atrás. Ou seja, um erro significa recomeçar. Ponto negativo aqui.

O instalador oferece opção de escolher cada pacote a ser instalado na máquina, mas para "agilizar" o processo, optei pela instalação padrão, que vem com quase todos os pacotes do DVD. Algo em torno de 1138 pacotes.

Utilização

Depois de instalado o sistema, o início é (muito) bastante rápido (mesmo), mas não consegui entrar na interface gráfica. Por algum motivo o xorg.conf estava ajustado para usar o driver "nvidia", mas esse não veio instalado. Outro ponto negativo. Mudando para "nv" entrei no KDE sem problemas.

Além do KDE, a instalação padrão traz o Gnome, o XFCE, FVWM, e vários outros. Vale ressaltar que eu só entrei no KDE.

Outros problemas foram a falta de som, e plugins para o Firefox, mas não posso dizer que foram realmente problemas, porque não me esforcei muito para ajustá-los.

Uma curiosidade: o Frugalware vem com 11 terminais por padrão. Assim, o X11 é acessado no Ctrl+Alt+F12. Estranho, mas indiferente.

Atualização

Tive problemas para atualizar o sistema para a versão mais nova (0.6rc2). Aparentemente o processo é simples, mas o gerenciador de pacotes (pacman) apresentou dependências circulares. Não foi difícil resolvê-las, mas contei isso como um ponto negativo.

Depois de 2h baixando os pacotes novos, o sistema ficou atualizado bleeding edge. Excelente! Contudo, continuei sem conseguir instalar os drivers da nVidia. Passei pelo mesmo problema do openSuse. Só consegui acesso aos recursos da placa instalando o driver baixado do site da nVidia.

Não me arrisquei a instalar grandes coisas no sistema, mas fiquei muito satisfeito com o resultado.

Resumo

Pontos negativos: a falta de opção para rever os passos no instalador gráfico; as dependências circulares nos pacotes; o X11 ter sido configurado para um driver não instalado; e o driver da nVidia do repositório não funcionar.

Pontos positivos: o instalador gráfico simplificado; a velocidade do início de sessão, e do gerenciador de janelas; o gerenciador de arquivos (pacman) e a forma simples e rápida com que se atualiza o sistema; e os pacotes atuais e compilados para x86_64. Algumas distribuições usam pacotes compilados para 686 em arquitetura x86_64.

Conclusão

Enfim, uma grande distribuição em desenvolvimento. Provavelmente, a nova versão não terá boa parte desses erros, apresentando performance ainda melhor. Mal posso esperar pelo Frugalware 0.6.

7 de março de 2007

Java e o povo brasileiro

No outro dia eu estava conversando com um colega de trabalho a respeito de porque o Java se tornou tão popular no Brasil, chegando esse a ter uma, senão a, maior comunidade Java do planeta.

Ora, se há algo que brasileiro gosta de fazer é mudar o que vem padronizado para algo que atenda aos seus interesses ou gostos. Um exemplo disso são os fast foods (Mc Donald's, Bob's, etc). Somente no Brasil (até bem pouco tempo atrás) se podia pedir um número 1 com mais ou menos queijo, e com suco de laranja e nuggets, ao invés de refrigerante e batatas fritas.

Outro exemplo claro de como o brasileiro gosta de "personalizar" é o SAP. Em nenhum outro país do mundo se criou tantas extensões (melhorias ou user exits) para os programas do SAP como se faz no Brasil.

Caso ainda não tenha feito a relação, raciocine comigo. O Java traz em si, desde a primeira versão, um quê de "faça você mesmo", fora ser livre, e, atualmente, código aberto. Ou seja, tudo o que um brasileiro gosta de ouvir: Java é pra personalizar.

Hoje em dia, obviamente, já existem diversas outras linguagens que oferecem as mesmas características, mas nenhuma tão sólida quanto o Java. Sólida no sentido de documentada (livros, manuais, referência, etc), com amplo suporte, e estável, tanto no que se refere ao funcionamento, quanto a mudanças.

Obviamente, não foi só isso, a Sun fez um excelente trabalho de marketing, e aproveitou o tempo certo. Falando nisso, acredito ser esse o momento certo de se investir em marketing no Linux, agora que o Windows Vista está se mostrando um sistema operacional não viável.

Quem sabe um dia essa idéia ganha maturidade...

Em busca da distribuição perfeita (parte 3)

O script que eu escrevi para instalar o sistema está sendo atualizado conforme a instalação prossegue. Quando tiver uma versão final eu ajusto o post onde o descrevi pela primeira vez.

Bom, ontem instalei o Gnome, os drivers da nVidia, e o Beryl. Rodou tudo muito bem, inclusive o framebuffer (sendo simplório, é aquela tela colorida de carregamento do sistema). Ainda não terminei de "tunar" ("no pain no game") o driver de vídeo, mas já está muito excelente!

Agora falta instalar o sistema de áudio (ALSA), e os aplicativos que vou usar (OpenOffice, players de mídia, etc).

Parece que minha busca acabou. Gentoo é o cara!

Mas, como tenho um filesystem disponível para instalar sistemas operacionais, podem esperar por reviews.

6 de março de 2007

Stored Procedures: usá-las ou não usá-las, eis a questão!

O pessoal que ja trabalha com java sabe que alem de ser multiplataforma, java pode ser multi-banco (sei lá se existe esta expressão). A tecnologia JDBC permite que utilizemos a mesma interface para acessar da mesma maneira vários bancos diferentes (Oracle, DB2, SQLServer, MySQL, etc...).

Isto é muito bom para facilitar o desenvolvimento e melhor ainda para que nossa aplicação fique independente de banco de dados. Bastando apenas mudar o driver JDBC de um banco para outro, sem que seja necessário nenhuma alteração na aplicação (no máximo em arquivos de configuração se a aplicação for bem feita ;-) ).

Para que isto funcione 100% devemos utilizar SQL Ansy e não podemos utilizar nenhuma feature que não seja comum a todos os bancos de dados.

Este seria um mundo perfeito de desenvolvimento para banco de dados, mas todos sabemos que "mundos perfeitos" não existem. Muitos bancos de dados possuem features que podem aumentar em muito a performance da aplicação. E dependendo da aplicação ela pode não existir sem estas features.

O que fazer neste caso? Usar ou não usar estas features do banco?

É neste ponto que entra uma expressão muito importante na informática, o bom-senso.

Se a aplicação tiver realmente a necessidade de trabalhar com vários bancos diferentes não tem muita opção. O máximo que pode ser feito é se a aplicação for utilizar procedures, criar scripts diferentes para cada banco (o que é muito trabalhoso e sujeito a falhas).

Mas se sua aplicação vai rodar em um único banco, acho que é uma boa idéia considerar utilizar estas features, pois na maioria das vezes o ganho de prerformance pode ser considerável (como exemplo eu trabalhei num projeto onde algumas querys demoravam mais de 60 minutos para serem executadas, e criando procedures com tabelas temporarias, etc... o tempo caio para menos de 30 segundos).

Mas lembre-se mesmo que não haja previsão de troca de banco de dados, o futuro é incerto, e passar toda a regra de negócio para procedures pode não ser uma boa estratégia.

Se foque na relação custo x benefício que as features do banco podem trazer para sua aplicação. No final das contas o que importa mesmo é o bom-senso.

Em busca da distribuição perfeita (parte 2)

Conforme falei, resolvi reinstalar o Gentoo na minha máquina. Para isso, planejei apagar o openSuse (HD SATA2) e instalar o Ubuntu (HD IDE), e então instalar o Gentoo (HD SATA2).

Assim, eu tentei, mas o instalador do Ubuntu 6.10 para x86_64 deu erro na hora de definir a tabela de partições. Ele dizia que eu não tinha definido o diretório raiz ("\"), apesar de eu o ter feito. Vai entender...

Resultado: instalei o openSuse no HD IDE sem nem mesmo me preocupar em instalar nada além do que vinha no DVD de instalação, e instalar o Gentoo no HD SATA2. Para isso fiz um script em bash (myGentooInstall.sh) de instalação que se tornou a listagem logo abaixo.

Espero que quando eu chegar em casa já tenha terminado tudo, e o sistema esteja funcionando bem. Está sendo bom me sentir dono do sistema operacional mais uma vez. Com o Gentoo, se ocorre um erro, é bem fácil resolvê-lo ou contorná-lo.

[EDIT: O script foi movido para o fórum do Gentoo ]

5 de março de 2007

Em busca da distribuição perfeita (parte 1)

Recentemente comprei uma nova máquina. Parti de um AMD Athlon XP 2400+ (IDE, AGP, FX 5200 128MB) para um AMD Athlon X2 4200+ AM2 (SATA2, PCI-X, 7900 GS DDR2 256MB), e como toda mudança, preciso reinstalar o sistema operacional (na verdade não precisaria, mas eu acidentalmente apaguei o SO antigo).

Eu já tinha idéia que uma boa parte dos aplicativos é desenvolvida pensando em arquiteturas de 32bits, ou seja, apesar de rodá-los em um processador de 64bits, provavelmente eles não aproveitam todo o potencial do processador. Em outras palavras, distribuições com pacotes binários precisam ter pacotes específicos para a arquitetura em questão (x86_64) para se ter uma resposta condizente na interface.

Não vou entrar em detalhes a respeito do uso e das facilidades de cada distribuição, uma vez que esse tipo de material tem pela rede aos montes. Então vou focar nos problemas encontrados, e na minha percepção de power user (RÁ!).

Minha jornada começou onde quase terminou a de 32bits, com o Ubuntu.

O Ubuntu instalou tudo o que pedi facilmente (usei o Automatix), mas o framebuffer ficou um lixo! O bootsplash ficou cinza e pixelado. A interface gráfica funcionou direito, sem maiores problemas, mas a resposta do sistema não ficou condizente com o upgrade de hardware. Desconfio que os pacotes não são específicos para 64bits.

Depois disso, resolvi tentar o openSuse, onde minha jornada de 32bits terminou.

Utilizei um script para agilizar a instalação de codecs e drivers no openSuse (o driver da nVidia instalado foi o dos repositórios). O framebuffer estava OK, mas a inicialização do sistema é muito lenta, e a interface gráfica não entrou. Problemas com o driver da nVidia. Instalei o driver direto do site do fabricante, mas mesmo assim continuei sem direct rendering, e o sistema não reconheceu a placa, e fiquei também sem beryl.

Atualmente estou testando o Gentoo 2006.1 para x86_64. Cheguei a instalá-lo pelo live DVD. O sistema não ficou como eu queria, mas a velocidade apresentada é muitas vezes superior às outras distros. Não testei ainda a interface gráfica com os drivers da nVidia, mas o farei em breve. Também não instalei bootsplash.

Penso em testar o Frugalware, distribição baseada no Slackware, mas que segue linha própria. Vamos ver no que dá.

23 de fevereiro de 2007

Blog a 4 mãos

Galera, não sei se perceberam mas agora tem outro "cabra" postando aqui no blog. O Cláudio é um grande amigo meu e vai falar principalmente sobre linux e opensource. Provavelmente ele vai postar muito mais coisa do que eu, e isso é bom porque vai me forçar a correr atraz do prejuízo ;-)

Em breve vou postar mais umas coisas interessantes aqui no blog, e tambem vou dar uma variada, estou preparando um post sobre Oracle Text e uns testes que eu fiz, e aproveitar e falar da instalação do 10g express no ubuntu, aguardem.

22 de fevereiro de 2007

Acessando um servidor Citrix via Linux

O procedimento a seguir é indicado para instalar o Citrix Client no linux, e acessar um servidor. O SAP R/3 de treinamento será utilizado como exemplo.

  1. Baixar o ICA Client última versão para linux, e o certificado TC Trust Center Class 2 CA no Download Center do site http://mywts.sap.com .
  2. Executar com o root o comando rpm -i ICAClient-9.0-1.i386.rpm .
    Obs.: No momento de criação deste manual, a versão mais nova do Citrix Client era a 9.0-1.
  3. Copie com o root o arquivo TCTrustCenterClass2CA.crt para o diretório /usr/lib/ICAClient/keystore/cacerts.

    Obs.: Certifique-se que os usuários comuns tenham permissão de leitura desse arquivo. Execute o comando abaixo com o root:
    chmod +r /usr/lib/ICAClient/keystore/cacerts/TCTrustCenterClass2CA.crt
  4. Acesse o site http://mywts.sap.com/ e, após se logar no sistema de treinamento e clicar no link Common Training, indique o programa /usr/lib/ICAClient/wfica para tratar o arquivo de extensão ICA.

A partir de agora, sempre que clicar um link com extensão ICA, o Citrix Client será acionado.

Atenção: dependendo do servidor a ser acessado, um novo arquivo de certificado deverá ser armazenado no diretório indicado no passo 3 do procedimento acima.

Instalando o Wine pelo código-fonte

Este processo é útil para quem pretende criar um arquivo .deb do zero.

Primeiro se deve incluir os repositórios em seu arquivo /etc/apt/sources.list. É interessante verificar primeiro se os repositórios do Ubuntu já não atendem essa necessidade.

sudo echo deb http://wine.budgetdedicated.com/apt dapper main >> /etc/apt/sources.list
sudo echo deb-src http://wine.budgetdedicated.com/apt dapper main >> /etc/apt/sources.list

A seguir, atualizar as informações de pacotes disponíveis pelo APT, baixar os pacotes necessários para compilar o wine, e efetuar a compilação propriamente dita:

sudo apt-get update
sudo apt-get build-dep wine
sudo apt-get --build source wine

Ao terminar a compilação, execute o comando abaixo para instalar o pacote criado:

sudo dpkg -i wine*.deb

Uma outra forma de compilar o wine é, ao invés de usar o apt-get para compilar os fontes, compilá-los usando make:

sudo apt-get update

sudo apt-get build-dep wine

cd wine*

./configure CFLAGS=-fno-stack-protector
make && sudo make install

O gcc no Ubuntu agora tem stack-protector habilitado, ocasionando falhas de segmentação no wine-preloader. A configuração -fno-stach-protector deve ser utilizada para evitar falhas de segmentação.

Para desinstalar o wine instalado dessa forma:

cd wine*

sudo make uninstall

Em ambas as opções, penso eu, é possível aplicar patches (http://wiki.winehq.org/InterestingPatches).

gunzip -c patch-file | patch -p1

Configuração de som

Rodar winecfg e ajustar o som para usar ALSA e OSS.

  • Para usuários de KDE, uma alternativa é usar aRts.
  • Para usuários de Gnome, uma alternativa é usar EsounD.
  • O uso de Jack e NAS é recomendado apenas para usuários avançados.

Utilizar emulação para DirectSound e para driver. Essa medida vai evitar erros de DSound underrun, ainda não solucionado na árvore principal do Wine.

Rodando programas em um novo display (exemplo com X-Men Legends 2: Rise of Apocalypse)

Arquivo xmen2.sh (game.sh):

#!/bin/sh

# Game parameters.
PROGRAM="c:/Arquivos de programas/Activision/X-Men Legends 2/Data/XMen2.exe -opengl"
SCREEN_RES="1024x768" # Must match screen identifier in XF86Config
SCREEN_BPP="24" # Must be defined for screen in XF86Config
GAMMA="1.75"

~/winerun.sh "$PROGRAM" $SCREEN_RES $SCREEN_BPP $GAMMA

Para cada jogo deve-se criar um arquivo como esse acima deve ser criado.


Arquivo winerun.sh:

#!/bin/sh

PROGRAM=$1
SCREEN_RES=$2
SCREEN_BPP=$3
GAMMA=$4

# Sensitivity works according to "xset mouse"
MOUSE_SENSITIVITY="1.15/15"
# Display number to use
DISPLAY_NUMBER=":1"
# Nice priority to give to wine. Note some games (ex Starcraft) do not like -20.
PRIORITY=-5

GAME_PLAYER=$USER

# extract
APPDIR=${PROGRAM%/*}
APPEXE=./${PROGRAM##*/}

SCRIPT="xgamma -gamma $GAMMA
xset mouse $MOUSE_SENSITIVITY
cd "$HOME/.wine/dosdevices/$APPDIR"
sudo -u $GAME_PLAYER nice $PRIORITY wine $APPEXE $*
wait"

# Run full screen on display 1.
export DISPLAY=$DISPLAY_NUMBER

# Make sure user is allowed to use display 1.
[ "`xauth list $DISPLAY_NUMBER`" ] || xauth add $DISPLAY_NUMBER . `mcookie`

sudo xinit /bin/sh -c "$SCRIPT" -- $DISPLAY -screen $SCREEN_RES -depth $SCREEN_BPP

Acrescentar as seções abaixo ao /etc/X11/xorg.conf:

Section "Screen"
Identifier "800x600"
# Ajuste essa parte conforme definido no seu /etc/X11/xorg.conf [início]
Device "NVIDIA Corporation NV34 [GeForce FX 5200]"
Monitor "SyncMaster"
# Ajuste essa parte conforme definido no seu /etc/X11/xorg.conf [fim]
DefaultDepth 24
SubSection "Display"
Depth 8
Modes "800x600"
EndSubSection
SubSection "Display"
Depth 16
Modes "800x600"
EndSubSection
SubSection "Display"
Depth 24
Modes "800x600"
EndSubSection
EndSection

Section "Screen"
Identifier "1024x768"
# Ajuste essa parte conforme definido no seu /etc/X11/xorg.conf [início]
Device "NVIDIA Corporation NV34 [GeForce FX 5200]"
Monitor "SyncMaster"
# Ajuste essa parte conforme definido no seu /etc/X11/xorg.conf [fim]
DefaultDepth 24
SubSection "Display"
Depth 8
Modes "1024x768"
EndSubSection
SubSection "Display"
Depth 16
Modes "1024x768"
EndSubSection
SubSection "Display"
Depth 24
Modes "1024x768"
EndSubSection
EndSection

Note que identifier e depth se adequam aos parâmetros dos scripts.

Atalhos de teclado:

...

CTRL+ALT+F7 accesses the desktop (display :0)
CTRL+ALT+F8 accesses the game display (assuming it stays on :1)
CTRL+ALT+F9 goes on :2

CTRL+ALT+BACKSPACE terminates desktop

Sugestão de uso: criar um diretório bin em $HOME, e mover os scripts (*.sh) para lá. Executar:

$sh ~/bin/xmen2.sh

Lembrar de ajustar os diretórios para adequar ao seu sistema.


12 de dezembro de 2006

Indo audaciosamente onde nenhum programador jamais esteve

A pouco tempo tive a oportunidade de assistir um dos episódios de Star Trek New Generation, especificamente o episódio final da segunda temporada. Neste episódio os tripulantes da Enterprise encontram uma nave do final do século vinte com 3 tripulantes conservados em animação suspensa. Eles resolvem reanimar os tripulantes, um deles é um roqueiro, outra é uma dona de casa e o ultimo um homem que foi rico e poderoso. Este ultimo exige ser tratado com mais respeito, por ser rico, exige entrar em contato com o banco, empresas que era dono, etc...

Neste ponto o capitão Picard explica que no futuro as pessoas não se importam mais com bens materiais, que as pessoas apenas tentam serem seres humanos melhores, como pode ser visto no diálogo:

Picard - Muito se mudou nos últimos 300 anos. As pessoas já não estão mais obcecadas com a acumulação de coisas. Eliminamos a fome, a miséria, a necessidade de posses. Deixamos atrás nossa infância.

Sr. Offenhouse - Não entendeu. Não se trata de posses. Trata-se de poder.

Picard - Poder para fazer que?

Sr. Offenhouse - Controlar sua vida, seu destino.

Picard - Essa classe de controle é uma ilusão.

Sr. Offenhouse - Que vou fazer? Como viverei?

.....

Picard - Estamos no século XXIV. Já não existem as necessidades materiais.

Sr. Offenhouse - Então, onde está o desafio?

Picard - O desafio, Sr. Offenhouse, é melhorar a si mesmo. Enriquecer-se.

Ver este episódio me fez refletir sobre o atual cenário que nos encontramos. Seguindo a linha do opensource temos que um desenvolvedor cria um software e o deixa disponível para que a comunidade participe do desenvolvimento do mesmo corrigindo erros e o melhorando ainda mais. Em sua grande maioria os softwares opensource são gratuitos, ou seja ninguém tem que pagar nada para usá-lo e quem lucra realmente é a comunidade como um todo. E todos os softwares (salvo raras excessões) tem como objetivo tornar mais fácil a vida do ser humano.

Cheguei a conclusão que o software opensource pode ser um dos fatores que nos permitirá chegar em um futuro semelhante ao proposto pela serie Star Trek, onde o ser humano não tem como objetivo os ganhos materiais, apenas almejar melhorar a si mesmo.

15 de novembro de 2006

ICEFaces agora é open source

Uma boa noticia pra quem desenvolve para web utilizando javaserver faces, a ICESoft resolver liberar o ICEFaces como opensource.

Anteriormente já existia uma versão free, chamada community e uma Enterprise que era paga. A principal diferença entre as duas era o suporte (que continua sendo pago).

Segue o link do comunicado: http://www.icesoft.com/corporate/press_release_11_06_open_source.html

E segue o link do projeto opensouce: http://www.icefaces.org/main/home/index.jsp

E neste link você pode ver uma amostra dos componentes disponíveis no ICEFaces: http://component-showcase.icefaces.org/component-showcase/

Eu cheguei a fazer um "testiculo" (pequeno teste) com o ICEFaces e posso garantir a vocês que ele é muito poderoso. É praticamente 100% ajax. Diferente de uma aplicação web que "renderiza" HTML, o ICEFaces se comunica com a página, enviando para ela os componentes que devem ser desenhados. Me pareceu que um código JS vai na página e fica conversando com o servidor perguntando quais componentes devem ser desenhados, isto permite que partes da página sejam alteradas/trocadas sem que seja necessário interação do usuário. Só pra se ter uma ideia, nos meus testes quando eu "parava" o servidor imediatamente aparecia uma mensagem na página informando que não havia mais conexão com o servidor e a página era bloqueada :P.

Se estiverem começando um projeto novo agora, recomendo darem uma olhadinha nesse camarada ;-)

26 de setembro de 2006

Primeiro teste com JEE5

Bom galera, depois de muuuuuito tempo sem postar nada, resolvi fazer um teste neste fim de semana e como ficou melhor do que o esperado achei melhor compartilhar com vocês.

Resolvi fazer um pequeno teste (tambem chamado testículo) com JEE5 e ver como ele se comporta na prática, já tinha ouvido e lido sobre o aumento da produtividade, que é mais facil, etc... Até agora eu só tinha visto exemplos de JPA, EJB 3.0, JSF 1.2, etc... mas não tinha visto um com tudo junto, então resolvi fazer o meu. É uma aplicação simples, apenas uma agenda de telefone/e-mail funcionando tudo numa tela, inclusão, alteração, exclusão e consulta, um CRUDizinho sem vergonha.

Como IDE resolvi usar o NetBeans 5.5 beta 2, que tem suporte completo e ja vem com o Sun Java System Application Server que implementa a JEE5, e se eu não estiver enganado é a base do GlassFish. Cheguei até ver na net como fazer para o usar o GlassFish, mas acabei perdendo o link e não achei mais, e como eu tambem não tava com muita esperança de que tudo fosse funcionar, nem liguei, mas depois vou correr atraz ;-) (bem como vou ver se tem como fazer isso tudo no Eclipse tambem).

Bom então vamos lá, pra começar temos que baixar o NetBeans 5.5 beta 2 e instalá-lo. Depois de instalado, basta executá-lo (dããã) :)

A primeira coisa que vamos fazer é criar a base de dados e a tabela da nossa agenda. O NetBeans 5.5 beta 2 vem com Java DB, que é baseado no Derby que é baseado no Cloudscape (ufa), acredito que você possa usar quaquer banco de dados, eu usei este porque ja vinha com ele e como o foco era fazer o JEE5 funcionar ficou ele mesmo.

Para criar a base de dados, vá no menu Tools>Java DB Database>Create Java DB Database, na janela de diálogo basta preencher todos os campos com "agenda": database name, user e password. Assim a vida fica mais facil :P

Na "abinha" de runtime, em databases nossa base irá aparecer (se você for abrindo os nodes, claro). Clique com o botão direito sobre ela e selecione connect para abrir a conexão.

Agora vamos criar a nossa tabelinha, com a conexão aberta, clique com o botão direito novamente sobre a base e selecione Execute command, isto irá abrir uma janela para executarmos comandos SQL, entre com a instrução abaixo para criarmos nossa tabelinha:


create table tb_agenda (
id integer generated always as identity constraint id_pk primary key,
nome varchar(50) not null,
telefone varchar(30),
email varchar(30),
dtnascimento date
);



Agora ja temos que temos nossa base com nossa tabelinha, vamos criar o nosso projeto. Então vamos lá, menu File>New Project selecione Enterprise e Enterprise Application, para criarmos nosso EAR. Na janela basta entrar com o nome do Projeto Agenda, deve estar marcada como default a opção para JEE5, mas não custa nada confirmar, o restante deixe como default. Devem ter sido criadas 3 entradas na lista de projetos do NetBeans, Agenda (ear), Agenda-ejb e Agenda-war.

Precisamos agorar criar a configuração da persistencia do EJB 3.0, o persistence.xml. Para isso o NetBeans tem um wizard que quebra um galho, clique com o botão direito sobre o Agenda-ejb selecione New>Persistence Unit. Deixe as opções default (ate mesmo o nome), verifique se está apontando para o datasource correto, no meu teste eu deixei como Persistence Provider o Toplink, mas acredito que possa ser usado o Hibernate ou o Kodo, em todo caso isto pode ser alterado mais tarde sem maiores dificuldades, basta editar o persistence.xml.



Depois de terminarmos será criado o seguinte conteúdo para o arquivo:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="Agenda-ejbPU" transaction-type="JTA">
<jta-data-source>jdbc/agenda</jta-data-source>
<properties></properties>
</persistence-unit>
</persistence>


Chegou a hora de criarmos nosso objeto para representar os dados da agenda, que deve se chamar Agenda (oh!). Vamos colocar nossa classe no pacote agenda, do projeto Agenda-ejb, segue abaixo o código:


package agenda;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name="tb_agenda")
public class Agenda implements java.io.Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;

@Column(name="nome",length=50)
private String nome;

@Column(name="telefone",length=40)
private String telefone;

@Column(name="email",length=30)
private String email;

@Column(name="dtnascimento")
@Temporal(TemporalType.DATE)
private Date dtnascimento;

public int getId(){ return id; }

public void setId(int id) { this.id = id; }

public String getNome() { return nome; }

public void setNome(String nome) { this.nome =nome;}

public String getTelefone() { return telefone; }

public void setTelefone(String telefone) {this.telefone = telefone;}

public String getEmail() { return email; }

public void setEmail(String email) { this.email = email;}

public Date getDtnascimento() { return dtnascimento; }

public void setDtnascimento(Date dtnascimento){
this.dtnascimento = dtnascimento;
}
}

Não vou perder tempo explicando as annotations, porque isto já esta ficando grande e porque já tem um monte de site explicando isto :P (sem contar que na javamagazine deste mes tem uma materia sobre JPA).

Agora temos que criar nosso EJB de negócio, um stateless simples que sera acessado pela aplicação web e persistira o nosso Entity agenda usando JPA. Novamente clique com o botão direito sobre o Agenda-ejb selecione New>Session Bean, na janela de diálogo preencha o nome do EJB com Agenda, o pacote tambem pode ser agenda. Serão criados dois arquivos, a classe AgendaBean que é nosso ejb e a interface local AgendaLocal.

Agora vem o exercicio preferido: ctrl+c ctrl+v :) primeiro para o AgendaBean:


package agenda;
import java.util.List;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;

@Stateless
@TransactionManagement(value=TransactionManagementType.CONTAINER)
public class AgendaBean implements agenda.AgendaLocal {

@PersistenceContext
private EntityManager manager;

public void salvar(Agenda agenda) {
if (agenda.getId()>0)
manager.merge(agenda);
else
manager.persist(agenda);
}
public void excluir(Agenda agenda) {
Agenda ag =manager.merge(agenda);
manager.remove(ag);
}
public List consultar() {
Query q =manager.createQuery("select a from Agenda a");
return q.getResultList();
}
}


Agora é a vez da interface:


package agenda;
import java.util.List;
import javax.ejb.Local;

@Local
public interface AgendaLocal {
public void salvar(Agenda agenda);
public void excluir(Agenda agenda);
public List consultar();
}

Nossa camada de negócios está pronta agora temos que fazer a nossa camada web (e dalhe MVC).

A primeira coisa a ser feita é configurar a servlet do JSF no web.xml, para isso vá la no projeto Agenda-war e abra o web.xml e faça com que fique assim (e tome ctrl+c ctrl+v)




<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
</web-app>

Agora vamos criar o arquivo faces-config.xml, na pasta WEB-INF clique com o botão direito selecione New>XML Document nome do arquivo faces-config e deixe as opções default, o resto você ja sabe (mais ctrl+c ctr+v, afinal se chegou ate aqui você já deve estar craque nisso).


<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
version="1.2">
<managed-bean>
<managed-bean-name>agendaMB</managed-bean-name>
<managed-bean-class>agenda.AgendaMB</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>


E já que declaramos o agenda.AgendaMB, vamos então criá-lo, seguindo o mesmo ritual, botão direito, New>Java Class ........ ctrl+v.


package agenda;
import java.util.Date;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

public class AgendaMB {
private Agenda agenda;
private DataModel lista;

@EJB
private AgendaLocal agendaBean;

public void salvar(){
agendaBean.salvar(agenda);
this.agenda = null;
this.lista = null;
}
public void excluir(){
agendaBean.excluir(agenda);
this.agenda = null;
this.lista = null;
}
public DataModel getLista(){
if (lista==null) {
lista = new ListDataModel(agendaService.consultar());
}
return lista;
}
public void selecionar(){
agenda = (Agenda) lista.getRowData();
}
public Agenda getAgenda(){
if (agenda ==null)
agenda =new Agenda();
return agenda;
}
}


Agora vamos a parte chata, criar a pagina jsp para nossa agenda, afinal vamos ter que fazer mais ctrl+c ctrl+v. Mais uma vez botão direito..... O nome da página será agenda (dã!).


<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<f:view>
<head>
<title>Agenda</title>
</head>
<body>
<h1>Agenda</h1>
<h:form>
<h:panelGrid columns="2">
<h:outputLabel id="labelID" value="ID" />
<h:panelGroup>
<h:inputText id="id" value="#{agendaMB.agenda.id}"
disabled="true" label="labelID">
<f:convertNumber integerOnly="true"/>
</h:inputText>
<h:message for="id"
errorStyle="color:red"/>
</h:panelGroup>
<h:outputLabel id="labelNome" value="Nome"/>
<h:panelGroup>
<h:inputText id="nome" value="#{agendaMB.agenda.nome}"
label="labelNome" size="40" maxlength="50"
required="true"/>
<h:message for="nome"
errorStyle="color:red"/>
</h:panelGroup>
<h:outputLabel id="labelTelefone" value="Telefone"/>
<h:panelGroup>
<h:inputText id="telefone"
value="#{agendaMB.agenda.telefone}"
label="labelTelefone" size="20"
maxlength="30"/>
<h:message for="telefone"
errorStyle="color:red"/>
</h:panelGroup>
<h:outputLabel id="labelEmail" value="E-Mail"/>
<h:panelGroup>
<h:inputText id="email"
value="#{agendaMB.agenda.email}"
label="labelEmail" size="30" maxlength="30"/>
<h:message for="email"
errorStyle="color:red"/>
</h:panelGroup>
<h:outputLabel id="labelNascimento"
value="Data de Nascimento"/>
<h:panelGroup>
<h:inputText id="dtnascimento"
value="#{agendaMB.agenda.dtnascimento}"
label="labelNascimento" size="12" maxlength="10">
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:inputText>
<h:message for="dtnascimento"
errorStyle="color:red"/>
</h:panelGroup>
<f:facet name="footer">
<h:panelGroup>
<h:commandButton value="Salvar"
action="#{agendaMB.salvar}" />
<h:commandButton value="Excluir"
action="#{agendaMB.excluir}"
rendered="#{agendaMB.agenda.id>0}" />
</h:panelGroup>
</f:facet>
</h:panelGrid>
</h:form>
<hr/>
<h:form>
<h:dataTable value="#{agendaMB.lista}" var="linha">
<h:column>
<f:facet name="header">
<h:outputText value="ID"/>
</f:facet>
<h:commandLink action="#{agendaMB.selecionar}" >
<h:outputText value="#{linha.id}" />
</h:commandLink>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Nome"/>
</f:facet>
<h:outputText value="#{linha.nome}" />
</h:column>
</h:dataTable>
</h:form>
</body>
</f:view>
</html>


E por último vamos alterar a pagina index.jsp que é criada por default para que ela redirecione para nossa página, é só apagar tudo que tem la e incluir este bloco imenso de código (o maior ate agora):

<jsp:forward page="agenda.jsf" />

(pelo menos a fonte é a maior :)

Agora é só executar a aplicação e começar a cadastrar os contatos. Num próximo post vou comentar alguns passos (afinal isto aqui ja ta grande pacas).



E por favor comentem pra eu saber que não foi só a minha esposa que viu :P