Groovy, o melhor dos mundos

Add comment setembro 22nd, 2008 10:06pm admin

groovy

groovy


Uma das coisas que mais interessante na plataforma Java é a capacidade de expandir e adaptar-se às novas necessidades do mercado.
Nestes últimos anos a plataforma Java tem crescido e atraído para perto de comunidades tradicionais e sólidas como PHP, Ruby, Python devido a novos recursos de Scripting. Paralelo a essa revolução, a comunidade Groovy já estava um passo à frente pois se antecipava nos conceitos e introduzia na plataforma um novo modelo de programação cujos principais objetivos era ser simples, dinâmica, eliminar a burocracia sintática, mas aproveitar todo o poder da plataforma.
Nasceu então o Groovy uma linguagem de script espetacular sendo inspirada em outras bem sucedidas como Python, Ruby e Smalltalk.

Instalação
A instalação do Groovy é bastante simples faça o download da versão estável e descompacte o zip numa pasta desejada. Na página de downloads você também encontrará versões empacotadas para distribuições OpenSuse, Ubuntu e para quem usa Windows há um instalador próprio.
Você precisa ter o java previamente instalado e a variável JAVA_HOME configurada. Após descompactado o pacote, configure a variável GROOVY_HOME apontando para a pasta recém criada. Adicione à variável PATH a pasta bin de sua pasta $GROOVY_HOME/bin

Executando
Se tudo foi feito certinho, quando você for ao console e digitar groovyConsole você terá uma tela semelhante a esta

Você poderia também usar o groovysh, uma ferramenta interativa e muito leve. Mas groovyConsole é mais amigável

Hello Word
Abra o groovyConsole e digite área reservada ao script:

def hw = "Hello, World!"
“Sobre Isso: ${hw}”
“Sobre Isso: ${hw}”.center(40,’+')

A primeira linha define a variável hw com o conteúdo “Hello, World!”, a segunda demonstra a utilização de GStrings que são Strings com recursos adicionais. Por fim, o mesmo texto é centralizado e num comprimento de 40 caracteres plus.

Num próximo post veremos o poder do Groovy em coisas mais interessantes.

GWT - basico, mas funcional

2 comments setembro 2nd, 2008 09:37pm admin

O GWT é um tecnologia extraordinária. Ela possibilita que aplicações sejam criadas em java e após compilado, transformado em JavaScript gerando assim uma aplicação dinâmica e bastante flexível.
A internet está cheia de tutorias e o próprio site do GWT somado ao grupo oficial de usuário é uma fonte excelente de informação para tirar dúvidas e melhorar o conhecimento.

Um problema que é muito comum nos vários tutoriais que vemos pela internet é que eles não são completos o suficientes para o usuário mais iniciante ter um compreensão da tecnologia e muitas vezes até desmotiva a continuidade em busca de um maior entendimento ante os primeiros desafios.

Para quem está iniciando uma boa alternativa é utilizar o Netbeans com seu plugin gwt4nb para GWT pois ele permite criar uma aplicação completa inclusive fazer deploy para seu servidor de aplicação.
Para o Eclipse, entretanto, não existe nenhuma boa alternativa livre (que eu conheça) para se trabalhar com o GWT, mas isso pode ser contornado de forma simples. Vamos lá:

Faça o download:
wget http://google-web-toolkit.googlecode.com/files/gwt-linux-1.5.2.tar.bz2
veja opções para outras plataformas em http://code.google.com/webtoolkit/versions.html

Descompacte o arquivo:
tar -xjvf gwt-linux-1.5.2.tar.bz2

download

Edite suas variáveis de ambiente criando a variavel para GWT_HOME e atualizando a variável PATH.
Em sistemas no padrão Linux basta editar o arquivo oculto chamando .profile em sua pasta pessoal adicionando as seguintes linhas

export GWT_HOME=/home/paulo/gwt-linux-1.5.2
export PATH=$PATH:$GWT_HOME

Lógico que você precisará substituir /home/paulo/gwt-linux-1.5.2 pela pasta onde você descompactou o gwt.
Em sistemas Windows o procedimento é realizado editando-se as propriedades do sistema conforme imagem abaixo:

variaveisWin

Criando um projeto para teste

O objetivo do nosso teste é apenas criar um esqueleto de uma aplicação padrão, acrescentando a ela uma serviço RPC e por
fim fazer o deploy num conteiner web, no nosso caso, para simplificar, o Tomcat, mas não é preciso nenhuma mudança para que este rode no Glassfish

no console digite:

cd workspace/
applicationCreator -out gwtWebMode -eclipse gwtWebMode br.com.sample.client.GwtWebMode

o gwt criou uma estrutura básica para trabalharmos. Normalmente usaríamos um outro recurso do gwt que é criar um projeto para o eclipse, com o comando projectCreator importando-o em seguida mas não vamos fazê-lo pois o projeto criado não gera os artefatos para uma aplicação web coisa que uma aplicação gwt é por natureza.

applicationCreator

O que vamos fazer é pedir para o Eclipse criar um novo projeto web justamente na pasta recém criada, isso aproveitará os arquivos criados pelo applicationCreator e nos dará os artefatos adicionais.

Abra o Eclipse e escolha File/New/Other/Dynamic Web Project
newProject

Digite o nome do projeto igual ao nome ao informado ao applicationCreator.
nameApplication

Sua aplicação já deverá funcionar em hosted mode. Experimente executar GwtWebMode-shell (está na pasta recém criada).

hostmode

O hostmoded é uma opção rápida para utilização durante a fase de desenvolvimento, mas nem todos os recursos que sua aplicação irá precisar são suportados.

Executando em WebMode

O que vamos fazer é criar um mecanismo capaz de compilar nossa aplicação e fazer o deploy dela em nosso servidor web. A melhor opção ainda é utilizar um script Ant

salve o arquivo abaixo na raiz de seu projeto com o nome build.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project name="gwtWebMode" default="deploy" basedir=".">
  3.  
  4.     <property environment="env" />
  5.     <property file="build.properties" />
  6.  
  7.     <path id="classpath">
  8.         <pathelement location="build" />
  9.         <pathelement location="src" />
  10.         <pathelement location="${gwt.dir}/gwt-user.jar" />
  11.         <pathelement location="${gwt.dir}/gwt-dev-linux.jar" />
  12.         <pathelement location="${gwt.dir}/gwt-servlet.jar" />
  13.         <fileset dir="${web.dir}/WEB-INF/lib/">
  14.             <include name="*.jar" />
  15.         </fileset>
  16.  
  17.     </path>
  18.  
  19.     <target name="clean" depends="clean.test" description="deletes all generated files">
  20.         <delete dir=".gwt-cache" />
  21.         <delete dir="build" />
  22.         <delete dir="dist" />
  23.         <delete dir="log" />
  24.  
  25.         <delete dir="container" />
  26.     </target>
  27.  
  28.     <target name="clean.test" description="deletes all generated test files">
  29.         <delete dir="test" />
  30.     </target>
  31.  
  32.     <target name="compile" depends="prepare" description="compiles Java source files to bytecode">
  33.         <javac srcdir="src" destdir="build" classpathref="classpath" debug="false">
  34.         </javac>
  35.     </target>
  36.  
  37.     <target name="compile.gwt" depends="compile" description="compiles Java source files to JavaScript">
  38.         <!-- Consider adding -Xms256m -Xmx512m to improve performance. -->
  39.         <java classname="com.google.gwt.dev.GWTCompiler" classpathref="classpath" fork="true" maxmemory="768m">
  40.             <arg line="-out build/www" />
  41.             <arg line="-style ${gwt-security}" />
  42.             <arg value="${package}.${module}" />
  43.         </java>
  44.         <move todir="build/www">
  45.             <fileset dir="build/www/${package}.${module}" />
  46.         </move>
  47.     </target>
  48.  
  49.     <target name="clean_www">
  50.         <delete dir="build/www" />
  51.     </target>
  52.  
  53.     <target name="hosted" depends="compile" description="runs the application in hosted mode">
  54.         <java classname="com.google.gwt.dev.GWTShell" classpathref="classpath" fork="true">
  55.             <jvmarg value="-XstartOnFirstThread" />
  56.             <arg line="-out ./www" />
  57.             <arg line="${package}.${module}/${module}.html" />
  58.         </java>
  59.     </target>
  60.  
  61.     <target name="prepare" depends="clean" description="creates output directories">
  62.         <mkdir dir="build" />
  63.         <mkdir dir="dist" />
  64.         <mkdir dir="log" />
  65.     </target>
  66.  
  67.     <target name="test" depends="clean.test,compile" description="runs all JUnit tests">
  68.         <mkdir dir="test" />
  69.         <junit fork="yes" printsummary="yes">
  70.             <!-- next line is only for Mac OS X -->
  71.             <jvmarg value="-XstartOnFirstThread" />
  72.             <classpath refid="classpath" />
  73.             <batchtest todir="test">
  74.                 <fileset dir="src" includes="**/${test}Test.java" />
  75.             </batchtest>
  76.             <formatter type="xml" />
  77.         </junit>
  78.         <junitreport toDir="test">
  79.             <fileset dir="test" />
  80.             <report format="frames" todir="test" />
  81.         </junitreport>
  82.         <exec os="Windows" executable="cmd.exe">
  83.             <arg line="/c start test/index.html" />
  84.         </exec>
  85.  
  86.  
  87.  
  88.  
  89.         <exec os="Mac OS X" executable="open">
  90.             <arg line="-a /Applications/Safari.app test/index.html" />
  91.         </exec>
  92.     </target>
  93.  
  94.     <target name="deploy" depends="clean_www, war,undeploy" description="deploys the war file to Tomcat">
  95.         <copy file="dist/${war}" todir="${app.server.deploy.dir}" />
  96.     </target>
  97.  
  98.     <target name="undeploy" description="undeploys the web app. from Tomcat">
  99.         <delete file="${app.server.deploy.dir}/${war}" />
  100.     </target>
  101.  
  102.     <target name="war" depends="compile, compile.gwt" description="builds the war file">
  103.         <delete file="dist/${war}" />
  104.        
  105.         <war destfile="dist/${war}" webxml="${web.dir}/WEB-INF/web.xml">
  106.  
  107.             <!-- bytecode from your Java code -->
  108.             <classes dir="build" includes="**/*.class" />
  109.            
  110.             <classes dir="src" includes="**/*.properties" />
  111.             <classes file="log4j.properties" />
  112.  
  113.             <manifest>
  114.                 <attribute name="Created-By" value="${user.name}" />
  115.                 <attribute name="Manifest-Version" value="1.0" />
  116.                 <attribute name="Ant-Version" value="${ant.version}" />
  117.             </manifest>
  118.  
  119.             <!-- generated HTML/JavaScript plus your CSS -->
  120.             <fileset dir="build/www"/>
  121.             <!-- supplied JAR -->
  122.             <lib dir="${web.dir}/WEB-INF/lib"/>
  123.             <lib file="${gwt.dir}/gwt-servlet.jar"/>
  124.         </war>
  125.     </target>
  126.  
  127. </project>

salve também esse arquivo de propriedades na mesma pasta com o nome build.properties

  1. gwt.dir=/home/paulo/gwt
  2. web.dir=${basedir}/WebContent
  3. module=GwtWebMode
  4. package=br.com.sample
  5. url=http://localhost:8080/${ant.project.name}/${package}.${module}/${module}.html
  6. war=${ant.project.name}.war
  7.  
  8. app.server.dir = /home/paulo/bin/apache-tomcat
  9. app.server.deploy.dir = ${app.server.dir}/webapps
  10. app.server.lib.dir = ${app.server.dir}/lib
  11. gwt-security=OBFUSCATE

Não vou entrar nos detalhes dos arquivos.
O Eclipse deve está se "queixando" que não conhece as classes do GWT. Para resolver este problema copie os arquivos
$GWT_HOME/gwt-user.jar
$GWT_HOME/gwt-dev-linux.jar
$GWT_HOME/gwt-servlet.jar

para a pasta: gwtWebMode/WebContent/WEB-INF/lib e dê um refresh em seu projeto.

Certifique-se que o Tomcat esteja instalado e em execução.
Abra o arquivo build.properties e altere as variáveis gwt.dir e app.server.dir para refletir sua instalação
gwt.dir=/home/paulo/gwt-linux-1.5.2
app.server.dir = /home/paulo/bin/apache-tomcat

Edite seu arquivo web.xml modificando a tag welcome-file

welcome

Clique com botão direito no arquivo build.xml e escolha Run As/Ant Build. Após concluindo abra o browse no seguinte endereço:

http://localhost:8080/gwtWebMode/

webmode

Incluindo um Serviço RPC

Um outro importante recurso do GWT é a possibilidade de executar serviços remotos. Esses serviços são servlets especiais que fazem ponte entre o javascript gerado e a parte servidora, possibilitando assim um completa integração com outras aplicações e os mais variados frameworks que somos dependentes.

O nosso serviço apenas receberá uma String e retornará a quantidade de caracteres deste.
inicie criando a interface StringLengthService. Ela precisa estender a interface RemoteService.

interface

  1. package br.com.sample.client;
  2.  
  3. import com.google.gwt.user.client.rpc.RemoteService;
  4.  
  5. public interface StringLengthService extends RemoteService {
  6.       public Integer length(String string);
  7. }

Em seguida você precisa de uma outra interface que permitirá invocar os serviços de forma assíncrona, ou seja ele será executado em background e comunicado assim que houver uma "resposta" da execução do serviço.

  1. package br.com.sample.client;
  2.  
  3. import com.google.gwt.user.client.rpc.AsyncCallback;
  4.  
  5. public interface StringLengthServiceAsync {
  6.       void length(String string, AsyncCallback async);
  7. }

Por fim criaremos a classe responsável por implementar o serviço: Ela deve estender RemoteServiceServlet, implementar a interface StringLengthService anteriormente criada e deve ficar no

  1. package br.com.sample.server

serviceimpl

  1. package br.com.sample.server;
  2.  
  3. import br.com.sample.client.StringLengthService;
  4.  
  5. import com.google.gwt.user.server.rpc.RemoteServiceServlet;
  6.  
  7. public class StringLengthServiceImpl extends RemoteServiceServlet implements
  8.         StringLengthService {
  9.  
  10.     @Override
  11.     public Integer length(String string) {
  12.         if (string != null)
  13.             return string.length();
  14.         return 0;
  15.     }
  16.  
  17. }

Declando os Serviços

Aqui está um ponto crucial na execução de serviços RPC. Caso seu interese seja apenas executar seu serviço em hosted mode basta editar o arquivo GwtWebMode.gwt.xml declando nele seu serviço:

  1. <servlet path="/StringLength/StringLengthService" class="br.com.sample.server.StringLengthServiceImpl" />

Só que não bastará isto para utiliza-lo em webmode. Você precisará declara-lo no arquivo web.xml como se faz com qualquer servlet.

servletmap

Utilizando o Serviço

Por fim faremos agora a utilização do serviço. Crie uma referência ao serviço da seguinte forma:

  1. this.lengthService = (StringLengthServiceAsync) GWT.create(StringLengthService.class);
  2.         ((ServiceDefTarget) lengthService).setServiceEntryPoint(GWT.getModuleBaseURL()+ "/StringLength/StringLengthService");

Veja o código completo: GwtWebMode.java

  1. package br.com.sample.client;
  2.  
  3. import com.google.gwt.core.client.EntryPoint;
  4. import com.google.gwt.core.client.GWT;
  5. import com.google.gwt.user.client.rpc.AsyncCallback;
  6. import com.google.gwt.user.client.rpc.ServiceDefTarget;
  7. import com.google.gwt.user.client.ui.Button;
  8. import com.google.gwt.user.client.ui.ClickListener;
  9. import com.google.gwt.user.client.ui.DialogBox;
  10. import com.google.gwt.user.client.ui.Image;
  11. import com.google.gwt.user.client.ui.Label;
  12. import com.google.gwt.user.client.ui.RootPanel;
  13. import com.google.gwt.user.client.ui.TextBox;
  14. import com.google.gwt.user.client.ui.VerticalPanel;
  15. import com.google.gwt.user.client.ui.Widget;
  16.  
  17. /**
  18. * Entry point classes define <code>onModuleLoad()</code>.
  19. */
  20. public class GwtWebMode implements EntryPoint {
  21.  
  22.     private StringLengthServiceAsync lengthService;
  23.  
  24.     /**
  25.      * This is the entry point method.
  26.      */
  27.     public void onModuleLoad() {
  28.  
  29.         // prepara o serviço
  30.         this.lengthService = (StringLengthServiceAsync) GWT.create(StringLengthService.class);
  31.         ((ServiceDefTarget) lengthService).setServiceEntryPoint(GWT.getModuleBaseURL()+ "/StringLength/StringLengthService");
  32.  
  33.         Image img = new Image("http://code.google.com/webtoolkit/logo-185x175.png");
  34.         Button button = new Button("length");
  35.         img.getElement().setId("pc-template-img");
  36.  
  37.         final TextBox textBox = new TextBox();
  38.         final Label lengthLabel = new Label();
  39.  
  40.         VerticalPanel vPanel = new VerticalPanel();
  41.         vPanel.setWidth("100%");
  42.         vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
  43.         vPanel.add(img);
  44.         vPanel.add(textBox);
  45.         vPanel.add(button);
  46.         vPanel.add(lengthLabel);
  47.  
  48.         // Add image and button to the RootPanel
  49.         RootPanel.get().add(vPanel);
  50.  
  51.         button.addClickListener(new ClickListener() {
  52.             public void onClick(Widget sender) {
  53.                 lengthService.length(textBox.getText(),
  54.                         new AsyncCallback<integer>() {
  55.  
  56.                             public void onFailure(Throwable arg0) {
  57.                                 lengthLabel.setText("foi mal! deu erro!");
  58.                             }
  59.  
  60.                             public void onSuccess(Integer arg0) {
  61.                                 lengthLabel.setText("length = " + arg0.toString());
  62.                             }
  63.                         }
  64.  
  65.                 );
  66.             }
  67.         });
  68.     }
  69. }

final

Se deseja faça o download dos fontes gwtWebMode.zip

script para backups - parte 2

Add comment setembro 2nd, 2007 11:40pm admin

Num post anterior eu mostrei um script genérico para realização dos backups de projetos, mas que é flexível pois permite a personalização das informações que se deseja backupear em cada projeto, a partir de arquivos de configurações.

Neste post faremos algumas pequenas modificações nele e configuraremos o agendamento para que o backup seja feito automaticamente.

As modificações consistem em remover as mensagens e diálogos gerados pelo kdialog e outras simplificações.
O novo script ficará assim:

backup.sh

  1. #!/bin/bash
  2. ############################################
  3. # backup de projetos
  4. # deve ser usado em conjuto com algum arquivo de
  5. # definicoes de backup
  6. # por Paulo Cordeiro (paulo@link3.com.br)
  7. # 02/09/2007
  8. # versao 1.2
  9. ############################################
  10.  
  11. if [ "$#" -eq 0 -o ! -e "$1" ];
  12. then
  13. echo "execute: backup.sh arqConfig.bpk"
  14. exit 2
  15. else
  16. defBackup=$1
  17. fi
  18.  
  19. projeto=$(cat $defBackup | grep projetoNome | cut -d "=" -f 2)
  20. descricao=$(cat $defBackup | grep descricao | cut -d "=" -f 2)
  21. fonte=$(cat $defBackup | grep fonte | cut -d "=" -f 2)
  22. destino=$(cat $defBackup | grep destino | cut -d "=" -f 2)
  23. pastasPorData=$(cat $defBackup | grep pastasPorData | cut -d "=" -f 2)
  24. data=$(date +%Y%m%d-%H%M%S)
  25. includefile=$(mktemp /tmp/$projeto.in.XXXXXX)
  26. excluirfile=$(mktemp /tmp/$projeto.ex.XXXXXX)
  27.  
  28. if [ "$pastasPorData" == "sim" ]
  29. then
  30. destino="$destino/$projeto/$(date +%Y)/$(date +%B)/$(date +%d)"
  31. else
  32. destino=$destino/$projeto
  33. fi
  34. backup_name=$destino/$projeto-$data.tar.gz
  35.  
  36. cd $fonte
  37.  
  38. for infile in $(sed '/incluir-ini/,/incluir-fim/! d; ' $defBackup | sed '1d;$d')
  39. do
  40. echo $infile&gt;&gt; $includefile
  41. done
  42.  
  43. sed '/excluir-ini/,/excluir-fim/! d; ' $defBackup | sed '1d;$d'&gt; $excluirfile
  44. mkdir "$destino" -p
  45. tar -cvzf $backup_name --exclude-from=$excluirfile $(cat $includefile)&gt; /dev/null
  46.  
  47. rm $includefile
  48. rm $excluirfile
  49. echo $backup_name
  50. exit 0

crie também esse pequeno script que será usado no agendamento:

agendamento.sh

  1. #!/bin/bash
  2. ############################################
  3. # agendamento de backups
  4. # por Paulo Cordeiro (paulo@link3.com.br)
  5. # 02/09/2007
  6. # versao 1.0
  7. ############################################
  8.  
  9. arqConfig=arqConfiguracao.bkp
  10. servidor=server
  11. usuario=user
  12. pastaRemota=/backups
  13. # gera o backup
  14. backupGerado=$(dpbackupAgendamento $arqConfig)
  15.  
  16. # tranfere para servidor remoto
  17. scp -p $backupGerado $usuario@$servidor:$pastaRemota
  18.  
  19. exit 0

É importante observar é que o comando scp faz a transferência do arquivo de forma segura por SSH. Para que ele não solicite a senha durante a transferência é preciso que previamente você gere um par de chaves com o ssh-keygen e exporte-a para o servidor. Veja como fazer isso em http://freebsd.ag.com.br/sessao10_7.html

Por fim registre o agendamento no cron. Digite "crontab -e " e adicione as linhas abaixo:

  1. # agendamentoBackup
  2. 0 13 * * *    agendamento.sh

Pronto, seu backup será feito todos os dias às 13h00.

script para backups

1 comment julho 24th, 2007 05:45pm admin

Uma das primícias que qualquer desenvolvedor precisa aprender é que o backup é um grande companheiro.

Seja nas horas trágicas em que seu hd queima ou até lhe roubam o laptop ou simplesmente quando você percebe que as ultimas modificações realizadas em determinado projeto ficaram pior que a versão anterior. Nessas horas não tem jeito, recorra ao backup.

Quanto se tem muitos projetos para acompanhar fica ainda mais complicado por isso é comum se utilizar scripts para automatizar esse processo. Entretanto, cada projeto tem suas particularidades de forma que ou você armazena todas as pastas do projeto ou cria um script para cada um.

O script abaixo é bastante simples e tem por diferencial utilizar um arquivo com as configurações para o projeto que se deseja backupear permitindo a personalização do backup e facilitando a manutenção do script.

backup.sh

  1. #!/bin/bash
  2. ############################################
  3. # backup de projetos
  4. # deve ser usado em conjuto com algum arquivo de
  5. # definicoes de backup
  6. # por Paulo Cordeiro (paulo@link3.com.br)
  7. # 20/07/2007
  8. # versao 1.1
  9. ############################################
  10. clear
  11.  
  12. if [ "$#" -eq 0 -o ! -e "$1" ]
  13. then
  14. kdialog --yesno "O arquivo com as definições do backup não existe ou não foi informado. \n Deseja informa-lo agora?"
  15. resposta=$?
  16. if [ "$resposta" = "0" ]
  17. then
  18. defBackup=$(kdialog --getopenfilename "$HOME" \ "*.bkp |Definicoes de Backup")
  19. if ["$defBackup" == ""]; then exit 2; fi
  20. else
  21. exit 2
  22. fi
  23. else
  24. defBackup=$1
  25. fi
  26.  
  27. projeto=$(cat $defBackup | grep projetoNome | cut -d "=" -f 2)
  28. descricao=$(cat $defBackup | grep descricao | cut -d "=" -f 2)
  29. fonte=$(cat $defBackup | grep fonte | cut -d "=" -f 2)
  30. destino=$(cat $defBackup | grep destino | cut -d "=" -f 2)
  31. pastasPorData=$(cat $defBackup | grep pastasPorData | cut -d "=" -f 2)
  32. data=$(date +%Y%m%d-%H%M%S)
  33.  
  34. echo "projeto ---&gt; $projetoNome"
  35. includefile=$(mktemp /tmp/$projeto.in.XXXXXX)
  36. excluirfile=$(mktemp /tmp/$projeto.ex.XXXXXX)
  37.  
  38. echo include = $includefile
  39.  
  40. if [ "$pastasPorData" == "sim" ]
  41. then
  42. destino="$destino/$projeto/$(date +%Y)/$(date +%B)/$(date +%d)"
  43. else
  44. destino=$destino/$projeto
  45. fi
  46. backup_name=$destino/$projeto-$data.tar.gz
  47.  
  48. cd $fonte
  49.  
  50. echo "==========================================================================================="
  51. echo "Backup do $projeto - $descricao"
  52. echo "==========================================================================================="
  53.  
  54. for infile in $(sed '/incluir-ini/,/incluir-fim/! d; ' $defBackup | sed '1d;$d')
  55. do
  56. echo $infile&gt;&gt; $includefile
  57. done
  58.  
  59. sed '/excluir-ini/,/excluir-fim/! d; ' $defBackup | sed '1d;$d'&gt; $excluirfile
  60.  
  61. echo pasta $destino
  62. mkdir "$destino" -p
  63.  
  64. xterm -e tar -cvzf $backup_name --exclude-from=$excluirfile $(cat $includefile)
  65.  
  66. echo "==========================================================================================="
  67. echo "Backup gerado em $backup_name"
  68. echo "==========================================================================================="
  69.  
  70. kdialog --msgbox "Backup gerado em $backup_name"
  71.  
  72. rm $includefile
  73. rm $excluirfile
  74.  
  75. exit 0

Cada projeto precisa ter um arquivo com as os dados para backup:

projeto1.bkp

  1. projetoNome=projeto1
  2. descricao=Descricao para o projeto1
  3. fonte=/home/paulo/projetos/projeto1
  4. destino=/backup/projetos/projeto1
  5. pastasPorData=sim
  6.  
  7. [incluir-ini]
  8. pasta1
  9. pasta2
  10. docs
  11. pasta3
  12. [incluir-fim]
  13.  
  14. [excluir-ini]
  15. *.exe
  16. *.zip
  17. *.svn
  18. *.class
  19. *.~*
  20. [excluir-fim]

a utilização é: backup.sh projeto1.bkp

O script utiliza duas chamadas ao kdialog do KDE que podem ser trocadas pelo xdialog ou simplesmente ser removidas.

Depois explicarei alguns detalhes do script e mostrarei como agendar backup automático para um servidor remoto.

ICEFaces, Ajax e JSF 1.2

Add comment julho 11th, 2007 01:43pm admin

O pessoal da ICESoft anunciou o release 1.6 do ICEFaces. O ICEFaces é um conjunto de componentes ricos para desenvolvimento web com JSF e AJAX.

Há alguns meses atrás tentei usa-lo em um novo projeto, mas desisti ao perceber que não poderia usa-lo junto com o glassfish. Essa incompatibilidade deve-se ao fato de o glassfish usar o JSF 1.2 por padrão e o ICEFaces a versão 1.1. Agora essa incompatibilidade acaba pois uma das novidades dessa nova versão é justamente a compatibilização com o JSF 1.2. Além desta, outras melhorias foram feitas como integração ao JBoss Seam 1.2.1, Liferay Portal, Webtide Jetty, dentre outras.

Recuperando um datasource no Glassfish a partir de um cliente desktop

Add comment maio 30th, 2007 05:58pm admin

No post anterior falei como recuperar um datasource no Glassfish a partir de um client web. Hoje faleremos como fazer a mesma coisa. só que a partir de um client desktop.

O processo consiste em iniciar o contexto com atributos adicionais que auxiliem a aplicação a procurar de forma correta e encontrar o recurso solicitado.

  1. public javax.sql.DataSource getDataSource() {
  2. try {
  3. Properties props = new Properties();
  4. props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
  5. props.setProperty(Context.URL_PKG_PREFIXES, "com.sun.enterprise.naming");
  6. props.setProperty(Context.STATE_FACTORIES, "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
  7. // servidor
  8. props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
  9. // porta do servidor
  10. props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
  11. InitialContext initialContext = new InitialContext(props);
  12. DataSource datasource = (DataSource) initialContext.lookup("jdbc/seuDataSource");
  13. return datasource;
  14. } catch (NamingException ex) {
  15. ex.printStackTrace();
  16. return null;
  17. }
  18. }

Os atributos:

  1. props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
  2. props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

são opcionais e só precisam ser utilizados se o servidor estiver em um endereço diferente do cliente ou porta for diferente da padrão.

Algo que é importante observar é que é necessário que o classpath da aplicação client esteja configurado com os seguintes pacotes:

  1. $GLASSFISH_HOME/lib/appserv-admin.jar
  2. $GLASSFISH_HOME/lib/appserv-rt.jar
  3. $GLASSFISH_HOME/lib/install/applications/jmsra/imqjmsra.jar
  4. $GLASSFISH_HOME/lib/javaee.jar

além, é claro, do pacote com o driver JDBC para banco de dados que você está tentando acessar.

Recuperando um datasource no Glassfish

Add comment maio 25th, 2007 05:03pm admin

Quando se está trabalhando com um servidor de aplicações, é comum a necessidade de se acessar diretamente os recursos do banco de dados.

Mesmo quando se está usando frameworks de persistência como JPA ou mesmo Entities Beans pode-se haver a necessidade de fazer alguma consulta direta ao banco de dados. Nesse caso a melhor opção recuperar o datasource registrado no servidor.

Os passos são os seguintes:
No arquivo web.xml registre o recurso que deseja recuperar:

  1. <resource-ref>
  2. <res-ref-name>jdbc/seuDataSource</res-ref-name>
  3. <res-type>javax.sql.DataSource</res-type>
  4. <res-auth>Container</res-auth>
  5. <res-sharing-scope>Shareable</res-sharing-scope>
  6. </resource-ref>

Após isso só é necessário buscar no contexto seu datasource. Alguma coisa mais ou menos assim:

  1. public javax.sql.DataSource getDataSource() {
  2. InitialContext initialContext;
  3. try {
  4. initialContext = new InitialContext();
  5. DataSource datasource = (DataSource) initialContext.lookup("java:comp/env/jdbc/seuDataSource");
  6. return datasource;
  7. } catch (NamingException e) {
  8. e.printStackTrace();
  9. }
  10. return null;
  11. }

e para usar a conexão basta:

  1. datasource.getConnection()

Sobre Isso

Add comment maio 21st, 2007 09:24pm admin

Sobre Isso é um espaço que disponibilizo com o objetivo de compartilhar vários assuntos do dia-a-dia de cada um de nós que está de alguma forma ligado à tecnologia. Especialmente na área de programação, falaremos sobre a plataforma Java e eventualmente outras linguagens, sempre que oportuno.

Falarei também de Linux, tentando trazer dicas que poderão facilitar a vida daqueles que por opção ou não, migraram para o mundo do Pinguim.

Outros temas que me parecerem interessantes também serão compartilhados sempre que pertinentes.

até mais.

Paulo Cordeiro


Pesquisa

Calendário

julho 2009
D S T Q Q S S
« set    
 1234
567891011
12131415161718
19202122232425
262728293031  

Categorias

Tags

Divulgue o Nerdson