Quarta-feira, 7 Julho 2010

Dicas Thunderbird

Duas dicas sobre o cliente de email thunderbird

Mensagens de notificação em preto

Fiz o upgrade para a versão 3.1 e as mensagens de alerta do thunderbird no linux, aparecem sem conteúdo, tudo preto, como abaixo.


Vi que é um bug do thunderbird, onde o problema é enviar mensagens de notificação sem um título.

Para corrigir, abra o arquivo thunderbird-3.1/modules/activity/alertHook.js e altere a linha abaixo, para incluir a palavra "Alert" (2o argumento)

this.alertService.showAlertNotification("chrome://branding/content/icon48.png", "Alert",aMessage);

Reinicie o thunderbird, para valer a alteração.

Então as mensagens irão aparecer corretamente.


Indexação de mensagens

O thunderbird tem uma opção que realiza a indexação de todas as mensagens, onde é possível efetuar buscas nos textos de todas as mensagens e exibir de uma maneira mais organizada em uma tela  só.

No entanto o arquivo de índice vai ficando bem grande e percebi que o thunderbird dá um crash toda vez que saio dele. Seguindo uma recomendação que vi em alguns fórums, desabilitei esta indexação e não ocorreu mais crash e o arquivo de índice não é usado mais.

Note que isso não prejudica em nada a pesquisa que o thunderbird já faz.

Para desabilitar vá na opção abaixo e desative-a.

Preferências -> Avançado -> Geral -> Ativar pesquisa global e indexação

Escrito por claudio at 11:20 PM categorizado por

Tags: linux dicas

Travamentos na conexão SSH

Recentemente instalei um Red Hat Enterprise Linux 5.5 (RHEL) headless, um servidor para servir de experimentos.

Este é um servidor headless, keyboardless, mouseless, a única maneira de trabalhar com ele é pela rede, onde uso o SSH.

Logo após a instalação percebi que as conexões ora congelavam, o terminal travava, qualquer output de dados maior do que um pagedown, já travava, não era possível que um problema deste tipo ocorria com o RHEL, mas me irritava muito, isso era tanto para conexões SSH, como para HTTP, etc.

As configurações do SSH, rede, sem firewall, sem SELinux, o que poderia ser...

Nas investigações, percebi que o driver da placa de rede estava incorreto.

A minha placa de rede é uma "Realtek Semiconductor Co., Ltd. RTL8111/8168B" e a versão do driver instalado pelo RHEL era para outro modelo.

Então a solução foi copiar o driver do fabricante, compilar e instalar.

Dicas adicionais podem ser vista no website do CentOS.

Fica a dica, se o seu servidor linux remoto começar a congelar no resultado dos comandos, após uma instalação ou atualização, verifique se o driver da placa de rede confere com a placa real.


Cortesia de XKCD.com

Escrito por claudio at 11:06 PM categorizado por

Tags: linux dicas

Segunda-feira, 29 Março 2010

Instalação Oracle 10.2.0.1 no Kubuntu 9.10 (32bits)

Segue um tutorial de instalação do banco de dados Oracle 10.2.0.1 no Ubuntu 32 bits. Apesar de existir uma versão Express Edition, precisei instalar o 10.2.0.1 no meu laptop. Veja que este é um artigo que visa linux 32 bits, para 64 bits os parametros podem ter outros valores. Esta instalação é apenas para desenvolvimento, se você procura por uma instalação do oracle que irá servir muitos usuários, procure por maiores informações na internet.

O Ubuntu não é listado como uma distribuiçao suportada, mas isso não quer dizer que não pode instalar no ubuntu. Tem alguns ajustes manuais, veja quais são.

Como o Oracle DB não é uma instalação next, next, nem é um serviço trivial, recomendo ler o Quick Install Guide onde é explicado em detalhes algumas instruções.

1) Pre-requisitos e preparação do ambiente

 1.1) SWAP

Na instalação o oracle deverá checar o tamanho da área de swap de acordo com as regras abaixo:

 Memória RAM
Tamanho do SWAP
 Até 1 GB
2 x RAM
 De 1 a 2 GB
1,5 x RAM
 De 2 a 8 GB
Igual a RAM
 Maior que 8 GB
0,75 x RAM
 

 


 


No meu caso, tenho 3 GB RAM e 1 GB de swap, para não precisar redimensionar o tamanho do swap e gastar muito tempo, é possível criar um arquivo de swap e adicionar isso no kernel em runtime, quando a instalação terminar, pode remover o arquivo. Veja como fazer isso.

1.2) Criação de grupos e usuário, diretório 

sudo groupadd oinstall
sudo groupadd dba
sudo groupadd nobody

sudo usermod -g nobody nobody
sudo mkdir -p /opt/oracle
sudo useradd -g oinstall -G dba  -d /opt/oracle -s /bin/bash oracle
sudo chown -R oracle:oinstall /opt/oracle

Coloque uma senha para o usuário oracle

sudo passwd oracle

1.2) Atualização dos parametros do kernel

Preste muita atenção nesta tarefa.

Antes faça um backup dos valores atuais do kernel

sudo sysctl -a > ~/sysctl_bkp

Edite o arquivo /etc/sysctl.conf e altere os seguintes parametros

# Oracle
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 32768 65000
kernel.shmmax=1073741824
net.core.rmem_default = 1048576
net.core.rmem_max = 1048576
net.core.wmem_default = 262144
net.core.wmem_max = 262144
Coloquei apenas 1 GB para memória compartilhada no Oracle, apesar da documentação pedir a metade.

Chame o comando abaixo, para colocar em efeito os parametros alterados.

sudo sysctl -p

1.3) Alterar os limites

sudo vi /etc/security/limits.conf
# Oracle
oracle           soft    nproc   2047
oracle           hard    nproc   16384
oracle           soft    nofile  1024
oracle           hard    nofile  65536

1.4) Instalação de pacotes adicionais

É necessário instalar alguns programas adicionais

m4
autoconf
autotools-dev
automake
gsfonts-x11
lesstif2
libaio1
sysstat
zlibc
libstdc++5
dpkg-dev
html2text
gettext
intltool-debian
po-debconf
debhelper
librpmio0
librpm0
librpmbuild0
rpm
alien
libstdc++6-4.4-dev
g++-4.4
g++
build-essential
fakeroot
libsys-hostname-long-perl
libmail-sendmail-perl

É necessário instalar o libstdc++5, que pode ser copiado de

http://mirrors.kernel.org/ubuntu/pool/universe/g/gcc-3.3/libstdc++5_3.3.6-17ubuntu1_i386.deb

O Oracle espera alguns comandos em um caminho que não existe no ubuntu, então vamos arrumar

sudo ln -s /usr/bin/awk /bin/awk
sudo ln -s /usr/bin/rpm /bin/rpm
sudo ln -s /usr/bin/basename /bin/basename

Crie um arquivo de profile para o usuário oracle

su - oracle
vi ~/.bashrc

Informe

umask 022

Esteja certo de que o hostname responde com um IP, faça um ping no nome do computador.

Reinicie o seu sistema operacional 

2) Instalação do Oracle

Configure a permissão para que outros usuários possam iniciar programas gráficos

xhost +
Faça o login com o usuário oracle
su - oracle
export DISPLAY=:0

Chame o instalador do oracle

./runInstaller -ignoreSysPrereqs

A opção  -ignoreSysPrereqs desabilita a verificação de compatibilidade do sistema operacional.

Durante a instalaçã

3) Pós instalação

A instalação GUI aconteceu sem maiores problemas,  demorou cerca de 20min.

Segue alguns ajustes para bom funcionamento do ambiente

3.1) /etc/oratab

Foi gerado um arquivo em /etc/oratab, mas não foi colocado o local da instalação do oracle, e isso é importante para iniciar e parar o oracle.

Coloque uma linha como o formato. Se desejar que o oracle seja iniciado com o sistema operacional, deixeo Y caso contrário, coloque N

$ORACLE_SID:$ORACLE_HOME:Y

No meu caso é assim:

APPS:/opt/oracle/oracle/product/10.2.0/db_1:Y 

3.2) Ambiente oracle

Configure no /etc/profile as váriaveis de ambiente. As variáveis serão globais para o sistema operacional.

export ORACLE_HOME=/opt/oracle/oracle/product/10.2.0/db_1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
export PATH=$PATH:$ORACLE_HOME/bin
export NLS_LANG=english

Coloquei o NLS_LANG para inglês para as mensagens de interface do sqlplus serem em inglês, o que facilita muito o trabalho. Veja minha opinião sobre a tradução de sistemas.

Edite o $ORACLE_HOME/bin/dbstart e altere a declaração da variável ORACLE_HOME_LISTENER  (linha 78 aproximadamente) para $ORACLE_HOME, como o exemplo

ORACLE_HOME_LISTNER=$ORACLE_HOME

3.3) Inicialização do oracle

Faça o login como usuário oracle e inicie o servidor

lsnrctl start
dbstart

 

3.4) rlwrap e sqlplus (opcional)

Para quem já usou o sqlplus sabe que ele não mantém um histórico dos comandos, como o bash. Seria muito útil ter um comportamento semelhante o bash, onde no console do sqlplus o usuário possa buscar no histórico (ctrl+r) ou navegar com as setas.

Isso é possível como rlwrap

sudo apt-get install rlwrap

Então chame

rlwrap sqlplus usuario/senha@oracle_sid

3.4.5) Uma dica a parte, ao usarem o sqlplus para conectar em um serviço que não esteja configura o tnsnames.ora, é possível passar o servidor e porta.

sqlplus usuario/senha@//nome_servidor:porta/oracle_sid

Para parar o Oracle

dbshut
lsnrctl stop

 

M

http://www.makina-corpus.org/blog/how-install-oracle-10g-full-64-bits-version-not-xe-and-tora-gnu-linux-ubuntu-karmic-910-64-bits
http://www.pythian.com/news/968/installing-oracle-11g-on-ubuntu-804-lts-hardy-heron/
 

Escrito por claudio at 2:14 AM categorizado por Dicas e Scripts

Tags: dicas

Quarta-feira, 2 Dezembro 2009

O que o google acha que os sites não acham ?

Quando autores não provam de seu próprio trabalho, o resultado não deve ser bom.

Quantos sites você já não visitou e usou a pesquisa para tentar encontrar algo no site e não encontrou o que procurava ?

Eu já passei por diversas vezes essa situação, infelizmente.

Mas, é possível encontrar muitas outras informações que a busca convencional não mostra.

Uso alguns parametros de pesquisa e resolvi blogar sobre isso, acho que pode ajudar alguém. Vou falar sobre isso logo em seguida.

O problema pelo que passei, foi por procurar no site dos correios pela modalidade de registro módico.

O site dos correios, tem um mecanismo de busca. Tente buscar pela palavra módico. Nenhum resultado.

Agora peça para nosso indexador mundial, buscar para você. E aparece um resultado, ótimo. Obrigado google.

Basta usar o parametro "site:dominio.com.br"  e as palavras que deseja pesquisar, que o google vai pesquisar somente no dominio informado.

Outra dica interessante, que conteúdo que os sites desejam esconder dos mecanismos de pesquisa ? Basta acessar o dominio.com/robots.txt

Um exemplo interessante, veja o que os deputados tem a esconder dos mecanismos de busca.


Escrito por claudio at 12:33 AM categorizado por Dicas e Scripts

Tags: dicas google

Segunda-feira, 19 Outubro 2009

Geração de dumps (thread e memory) no WebSphere 6.x

Segue uma dica de como extrair um dump de threads e memória do WebSphere, funciona tanto em unix como em windows.

Acessar a interface administrativa e configurar os parametros

Navegação

Servers -> Application Servers -> Server1 -> Process Definition -> Java Virtual Machine -> Generic JVM arguments
Parâmetro:
-Xdump:system+heap+java:events=gpf+throw+user,filter=java/lang/OutOfMemoryError,request=exclusive+prepwalk
Navegação:
Servers -> Application Servers -> Server1 -> Process Definition > Environment Entries
Parâmetros:
IBM_HEAPDUMP=true
IBM_HEAPDUMP_OUTOFMEMORY=true
IBM_HEAPDUMPDIR=c:\temp

Agora criar um atalho para facilitar o acesso ao script wsadmin, no diretório WAS_HOME/bin.

Windows

* _wsadmin_comm.bat
wsadmin -conntype SOAP -user admin -password senha_do_admin %*

Unix

* _wsadmin_comm.sh
wsadmin -conntype SOAP -user admin -password senha_do_admin $*

Crie scripts JACL (script baseado em TCL) para invocação dos comandos.

Memory Dump

* heapdump.jacl
set jvm [$AdminControl queryNames type=JVM,*]
$AdminControl invoke $jvm generateHeapDump
Thread dump
* threaddump.jacl
set jvm [$AdminControl queryNames type=JVM,*]
$AdminControl invoke $jvm dumpThreads

Para gerar os dumps basta invocar os comandos

_wsadmin_comm.sh -f heapdump.jacl

Veja no diretório especificado em IBM_HEAPDUMPDIR ou no AppServer01 se os arquivos foram gerados em um deles.

Depois use ferramental adequado para analisar os dumps (Eclipse Memory Analyzer, IBM Thread Dump Analyzer).

Escrito por claudio at 4:49 PM categorizado por Java

Tags: dicas java

Sexta-feira, 24 Julho 2009

Admin sem segurança

Vejam alguns consoles do JBoss em instalações na internet.

http://www.google.com/search?hl=all&q=inurl%3A%22%2Fjmx-console%2F%22+%22JMX+MBean+View%22

Esta pesquisa no google irá procurar por todas as urls que tenham "/jmx-console/" e a string completa "JMX MBean View".

Se quiserem ver sites brasileiros, adicionem a opção site:com.br ou site:gov.br

O console do JBoss tem esta String no console de administração, que visualiza os nomes JNDI.

Os administradores de sistema dos sites resultados da pesquisa deveriam habilitar a segurança do console de administração.

Vejam como habilitar o console de segurança.

Já usei o JBoss em diversos projetos desde 2002 e sempre que o projeto é colocado em produção, o console admin é removido ou é habilitado a segurança na autenticação.

Leiam isso apenas como aviso de como melhorar as instalações de sistemas. Acessei alguns consoles admin, para ver se a segurança estava realmente desabilitada. Não fiz nenhuma alteração no sistema. Recomendo que vocês também não o façam.

Escrito por claudio at 4:34 PM categorizado por Dicas e Scripts

Tags: dicas java

Terça-feira, 21 Julho 2009

Abrir programa gráfico com su - / sudo

Ao usar linux/unix é comum usar outro login de usuário para inicializar um programa gráfico.

Repetidas vezes passei pela situação seguinte:

sudo su -
root@foxhound:~# xeyes
Error: Can't open display:
root@foxhound:~# export DISPLAY=:0
root@foxhound:~# xeyes
No protocol specified
Error: Can't open display: :0

Como fazer com que o programa gráfico seja iniciado e exibido ?

Em outro console é necessário dar permissão para um login localhost usar o servidor gráfico.

xhost local:claudio

Então pode lançar o programa gráfico no console anterior.

Note, deve trocar o nome de usuário acima, para o usuário de sua máquina.

A explicação para isso é que no mundo unix existe o "X Server", um servidor gráfico que gerencia as aplicações GUI.

Com isso é possível, por exemplo acessar uma máquina unix remota e de lá iniciar um firefox, onde a exibição gráfica é mostrada no seu computador local.

Escrito por claudio at 3:51 PM categorizado por Linux e F/OSS

Tags: dicas linux

Sexta-feira, 6 Março 2009

Como reduzir espaço em disco do JDK em ambiente servidor

No decorrer dos anos, as novas versões do JDK estavam acompanhadas de novas funcionalidades, bibliotecas, etc.

E sempre existiram comentários na comunidade, sobre o tamanho do JDK e o espaço ocupado pelo JDK, após a instalação.

Pois vou dar uma dica de como remover arquivos desnecessários do JDK em ambiente servidor. Na maioria das vezes, isso só será necessário se uma economia de 100MB for importante. Ou instalações em rede com imagem, para poupar tempo de download para outras estações.

A dica é baseada em um ambiente Linux 32 bits, com uma instalação padrão do JDK 6 update 12.

A instalação padrão ocupa um espaço de 239 MB. Veja a ocupação de espaço nas versões anteriores do JDK.

82M     j2sdk1.4.2_18
141M    jdk1.5.0_16
239M    jdk1.6.0_12

Uma boa evolução no espaço ocupado.

Veja os arquivos que podem ser removidos, e o tamanho que será economizado em disco.

7.9M    sample/
20M     demo/
19M     src.zip
4.3M    db/demo/
18M     db/docs/
2.1M    db/javadoc/
96K     db/lib/derbyLocale_cs.jar
100K    db/lib/derbyLocale_de_DE.jar
92K     db/lib/derbyLocale_es.jar
100K    db/lib/derbyLocale_fr.jar
96K     db/lib/derbyLocale_hu.jar
92K     db/lib/derbyLocale_it.jar
108K    db/lib/derbyLocale_ja_JP.jar
104K    db/lib/derbyLocale_ko_KR.jar
96K     db/lib/derbyLocale_pl.jar
92K     db/lib/derbyLocale_pt_BR.jar
120K    db/lib/derbyLocale_ru.jar
96K     db/lib/derbyLocale_zh_CN.jar
96K     db/lib/derbyLocale_zh_TW.jar
23M     lib/visualvm/
94M     total

Uma economia de 94 MB

Estes arquivos não são necessários em ambiente servidor. Com exceção de alguns arquivos do visualvm, que possui as bibliotecas nativas para efetuar profiling remoto, mas isso geralmente não é necessário em ambiente servidor de testes ou produção, ou alguém faz prifiling em produção ?

No caso dos arquivos de i18n do derby, prefiro usar os termos em inglês, pois acho conveniente que os termos técnicos sejam em inglês (meu ponto de vista sobre o caso).

Escrito por claudio at 1:22 AM categorizado por Java

Tags: dicas java

Terça-feira, 24 Fevereiro 2009

Voltei e algumas dicas

Apenas avisando que não morri, apenas fiquei preguiçoso para escrever.

Idéias não faltam, então para você não perder mais tempo, vou colocar algumas dicas e outras coisas que tenho feito

O projeto ainda precisa de algumas melhorias, que vou escrever aqui, com alguns screenshots e explicações.

  • Em um projeto passado, usei o Oracle SQL Plus, e cansado de pressionar a tecla para cima, na esperança de ter o histórico de comandos e o sqplus não suportar, então arrumei uma solução que funciona para qualquer aplicação console com prompt. É o rlwrap, veja a sintaxe do comando

rlwrap /usr/local/instantclient_10_2/sqlplus $*

Onde o histórico fica armazenado em ~/.sqlplus_history e a tecla para cima funciona.

O rlwrap é facilmente encontrado em qualquer distribuição linux.

 

  • Tenho instalado o mysql 5.0.51 instalado pelo apt-get no ubuntu. Precisei instalar a versão mais recente 5.1.31. Não queria perder muito tempo instalando e configurando arquivos de configuração com paths, portas, etc. Então encontrei um projeto mysql_sandbox, que consegue instalar várias versões do mysql em diferentes configurações e isoladas uma das outras.
./make_sandbox /usr/local/mysql_bits/unpacked/mysql-5.1.31-linux-i686-glibc23.tar.gz 
--db_user=claudio --db_password=blah123 --sandbox_port=3310

Pronto, tudo funcionando.
 

  • Ajudo a moderar algumas listas do SouJava, e no sistema atual do ezmlm (gerenciador de listas de email) cada mensagem moderada é enviada um email com um cabeçalho gigante para o meu email, então se eu tivesse 15 mensagens para moderar, é um pé no saco entrar em cada mensagem, rolar ao final para ver o conteúdo, copiar o endereço de aceite/rejeição, depois agregar tudo e enviar. Então cansado disso, gastei algumas horas e criei um sistema de moderação, ezmod.

Usei Wicket, JPA e Jetty, e está funcionando muito bem. Se alguém precisar fazer um test-drive posso enviar o link para moderar alguma lista. Por falar em Wicket, já lançaram o 1.4 RC2.
 

  • Quando pesquiso no google, algum resultados de outros mecanismos de pesquisa aparecem (tel3listas, etc.), outro comportamento foi o google adicionar uma espécie de customização de resultados, não gostei, e aproveitei para adicionar um parâmetro de busca por data. Coloquei isso nas configurações de pesquisa do firefox, no caminho
/usr/local/firefox/searchplugins/google.xml

Como está hoje

<Param name="q" value="{searchTerms}+-site:site.que.nao.quero.net+-site:outrosite.que.nao.quero.com.br"/>
<Param name="ie" value="utf-8"/>
<Param name="as_qdr" value="y5"/>
<Param name="hl" value="all"/>
<Param name="oe" value="utf-8"/>
<Param name="aq" value="t"/>

Basicamente alterei os parametros hl e as_qdr, que significam respectivamente o idioma e o resultado será direcionado para o idioma inglês (default); o as_qdr informa o uma faixa de tempo em meses ou anos.

Maiores informações sobre o significado dos parametros.

Escrito por claudio at 7:27 PM categorizado por Dicas e Scripts

Tags: dicas

Quinta-feira, 21 Agosto 2008

HotSpot Internals

Encontrei um tempo atrás, um site wiki no endereço da Sun.com com informações interessantes para quem quer entender mais sobre HotSpot, mas não tem tempo para ler o código fonte, é o HotSpot Internals.

Como exemplo cito uma página sobre otimizações em código java, onde o HotSpot consegue tirar melhor proveito.

Escrito por claudio at 12:55 AM categorizado por Java

Tags: dicas java performance

Sexta-feira, 8 Agosto 2008

Novo serviço de hosting VPS

Durante alguns anos user o serviço de VPS (Virtual Private Hosting) de uma empresa na Inglaterra, SparseZone. Onde usava um zone solaris e estava muito contente com o serviço deles.

Ocorre que o o SparseZone não vai mais oferecer o serviço (não sei o motivo), então tive de procurar outro lugar, um VPS com preço semelhante.

Então encontrei um serviço tão bom, é um VPS Linux, onde é possível escolher qual distribuição vai usar (Debian, Ubuntu, RedHat) em 32 ou 64 bits.

O serviço é oferecido pela empresa TekTonic, onde eles tem algumas categorias de serviços e planos. Eu peguei o Unmanaged em um plano básico, para usar neste site que está vendo agora.

No plano básico oferecem:

  • 294 MB de memória RAM
  • 13 GB de disco
  • 500 GB de taxa de transferência mensal
  • 1 endereço IP
  • 25% de uso de toda a CPU

Esta mensagem serve mais para incentivar a galera que quer ter sua própria maquina na internet, onde o preço não é caro e a experência é bem bacana.

De nenhuma maneira sou afiliado a esta empresa, nem vou ganhar desconto algum. Apenas acho que se o serviço é bom e barato, merece ser recomendado.

Eu Recomendo !

Escrito por claudio at 11:30 PM categorizado por Dicas e Scripts

Tags: dicas linux solaris

Quarta-feira, 16 Julho 2008

Jetty no Solaris 10


Segue uma contribuição que fiz para o projeto Jetty, para inicializar/parar/reiniciar o Jetty, usando o serviço nativo SMF do Solaris 10.

Os softwares necessários

Outra versão do Jetty irá funcionar, basta adaptar o script jetty.sh

Essa contribuição está no OpenSolaris e no Jetty, pelo patch 639.

A vantagem do uso do SMF que fiz

  • Uso de portas privilegiadas por usuário não root (permissão de privilégios)
  • Restar do serviço automaticamente (watchdog)
  • Padronização para o ambiente Solaris no uso do serviço


Sobre o Jetty

Para quem não conhece o Jetty, é um servidor Java, como o Tomcat. Ele é muito bom, uso-o há muito tempo, inclusive ele foi o servidor web que acompanhava o JBoss antes do tomcat. Vejam alguns usuários do Jetty.

O Jetty é reconhecido por ter baixo consumo de memória e recursos, permitir o uso da API de maneira embutida (Embedded), já usei em projetos profissionais.

De fato o Jetty é usado neste site (claudius.com.br)  e no do SouJava (soujava.org.br).


Escrito por claudio at 2:10 PM categorizado por Java

Tags: dicas java solaris

Sábado, 19 Abril 2008

Tradução de aplicações

Você conhece termos como "bean de ligação", "gerenciador de cronometro", "ligação ao espaço de nomes JNDI", "Aplicativos corporativos" (este talvez seja mais fácil), relacionados a plataforma Java Enterprise Edition ?

Pois para mim, são termos novos para incorporar ao festival de palavras difusas.

Isso não é nada mais que a tradução da da interface web de administração de um servidor Java EE.

Veja um exemplo abaxo: 


Clique na imagem para ampliar 

Nesta situação, acredito que a tradução irá causar mais problemas do que ajudar, no longo prazo.

Problemas

  • Maior custo do produto (exige uma equipe para tradução)
  • Maior tempo para releases
  • Termos não são apropriados para buscas na internet (tente efetuar uma busca por "gerenciador de cronometro")
  • Confusão de termos para quem usou outro fornecedor
  • Documentação suplementar, estará em inglês
  • Produtos de terceiros em inglês

Vantagens

  • Capacidade de usar a ferramenta, para quem não entende de inglês básico

Não consegui encontrar outras vantagens, por favor, escreva no comentário se encontrar alguma outra vantagem.

Na seção de problemas, o que verifico ser o pior deles, é quando o usuário da interface de administração, encontra alguma exceção e efetua a busca na internet, vai encontrar nada ou pouca informação.

E em outras telas da interface, termos em inglês são usados, causando confusão para os que não possuem inglês básico. (Como seria a tradução do termo "listener" ?)

Colocando um contexto na situação.

Considere um profissional para usar a ferramenta. Ele é um profissional que irá lidar com conceitos e conhecimento em:

  • cluster
  • balanceamento de carga
  • topologia
  • instalação de aplicação
  • components e módulos
  • criptografia
  • configuração de rede
  • classpath e classloader
  • mapeamento de nomes
  • etc.

E para entender isso e ser responsável pelo pleno funcionamento do ambiente, certamente É uma pessoa com bons conhecimentos técnicos em diversas áreas de informática, e com certeza um profissional que deve ter lido algum livro em inglês e/ou artigos na internet em inglês. Logo a interface web de um servidor Java, é necessário apenas inglês instrumental e ainda assim relacionado a área de informática.

Na situação onde precisei usar a interface de administração, uma das primeiras coisas que fiz, foi alterar o idioma da interface, pois estava complicado em demasiado, tentar decifrar o que significava a tradução do termo.

Javaum e feijões corporativos

O que lembro ainda hoje e é motivo de risadas, foi no evento Sun Tech Days em 2002, durante uma palestra em inglês, quando um colega que estava com o fone da tradução simultânea, perguntou para mim o que significava javaum, mas não precisei explicar, após ele escutar o termo feijões corporativos.

 

Crítica

Note que isso não é uma crítica ao incrível trabalho dos profissionais de tradução, que tem de lidar com esta situação de construir um dicionários de itens que não são passíveis de tradução, e não são pessoas técnicas.

Existem diversas ferramentas que precisam ser traduzidas, estas são as ferramentas para o usuário comum, usuário iniciante, ou pessoas que realmente não tem o inglês instrumental, mas desejam usar o sistema. Exemplo disso são os sistemas desktop (navegadores de internet, email, ferramentas desktop em geral).

Cito o NetBeans, como exemplo (onde tenho alguns colegas que participam da tradução), que é uma ferramenta que jovens que conhecem poucos termos em inglês e de informática, então diminue bastante a barreira de introdução à tecnologia.

Mas no longo prazo, o iniciante passa pelo intermediário e depois mais experiência, o que nesta fase, já passou pelo aprendizado da língua inglesa. O que vejo muito comum em fóruns e conversas de informática, é que sem o entendimento do idioma inglês na área de informática, o profissional terá poucas chances de sobreviver à evolução na carreira.

A minha crítica é para as empresas que querem traduzir este tipo de sistema, que como expliquei acima, não traz vantagens.

 

Escrito por claudio at 12:14 AM categorizado por Java

Tags: dicas java

Quarta-feira, 2 Abril 2008

Conferência no Skype

O Skype suporta chamadas em conferência, onde é possível conversar (em áudio) com vários colegas, existe um manual sobre isso.

Mas o problema é que uso linux, então a interface visual mencionada no artigo, não é para linux, então procurei um pouco por essa informação e não encontrei nada.

Então fiz a tentativa, de selecionar os contatos do skype, segurando a tecla CTRL e clicar com o botão inverso do mouse, então surgiu a opção "Start conference with selected contacts", muito bom.

Escrito por claudio at 8:25 PM categorizado por Dicas e Scripts

Tags: dicas linux

Plugin NetBeans para configuração de inicialização

Escre vi um plugin para o NetBeans 6, que permite configurar as propriedade de inicialização, como: argumentos da JVM, diretório de usuário (user dir) e qual JDK usar. 

O JDK a ser usado e diretório do usuário, podem ter vários valores, bastando escolher um deles.

Veja o site do projeto no javaforge.com com maiores informações sobre o plugin.

A página do plugin no portal de plugins do NetBeans

Segue um screenshot


Escrito por claudio at 12:07 PM categorizado por NetBeans

Tags: dicas java netbeans

Quarta-feira, 20 Fevereiro 2008

Ir trabalhar de bicicleta

Dicas

Esta dica é para o pessoal que quer ir de bicicleta ao trabalho, mostro aqui a minha experiência de iniciante neste modelo de transporte. 

Desde o fim de janeiro decidi que quero ir de bicicleta ao meu trabalho, então houve várias considerações que tive de fazer, entre custos, segurança, tempo, etc. Então escrevo as minhas recomendações pelo que já passei até agora.

Custos

Se você pensa em usar a bicicleta para economizar no carro ou transporte coletivo, é relativo. É necessário pensar em longo prazo, para gerar economia no uso do carro. Já no transporte coletivo, a bicicleta vai ter um custo igual ou maior.

Veja quais são os custos:

  • Aquisição de uma bicicleta boa => R$ 800
    Tem de ser uma bicicleta boa, para não te dar dor de cabeça com cambio porcaria; os equipamentos devem ser de boa qualidade, para aguentar o trajeto

  • Itens de segurança => R$ 50
    É importante o capacete, refletores (dianteiro e traseiro)

  • Mochila para carregar os cacarecos => R$ 70
    Uma mochila grande de 60 litros, impermeável e com vários bolsos, e amarras na cintura. De fato elas não são 100% impermeável, pois pode entrar água pelo zíper, pelo que entendi as mochilas completamente impermeáveis somente a de mergulho.

  • Bagageiro de transporte => R$ 20
    Este preço pode variar muito, até R$ 120 (nos modelos que são presos no canote do banco). O que tenho é o tradicional que é parafusado no quadro (perto do eixo traseiro)

  • Cadeados e correntes => R$ 40
    3 ou 3 cadeados com 2 correntes de 1 metro cada, para proteger o quadro e as 2 rodas.

  • Local para banho (opcional) => R$ 20
    Pode ocorrer que o seu local de trabalho não tenha chuveiros, então é necessário pagar em alguma academia próxima para usar o banheiro.

  • Medidores (opcional) => R$ 60
    Ter um medidor de velocidade, tempo médio, distância percorrida, cronometro, timer, etc. é muito bom pois permite acompanhar a tua evolução no uso da magrela.

  • Equipamento de manutenção (opcional) => R$ 50
    Imprevistos acontecem, pode ser um pneu furado, parafuso solto, etc., então é importante estar preparado para isso. No meu caso não carrego estes equipamentos, pois aumenta o peso. Mas tenho em casa, quando for percorrer algum trecho maior e em lugar afastado.

Isso totaliza R$ 1110

Perceba que esse é o custo inicial. Ainda existe o custo de manutenção da bicicleta.

Geralmente o custo da bicicleta está associado ao quadro e agrupamento de cambio (passador de marcha, coroa e cambio dianteiro, catraca e cambio traseiro e pé de vela), pelas minhas pesquisas o agrupamento Shimano Altus ou Alívio são muito bons.

A qualidade da bicicleta é proporcional ao tipo de terreno onde ela vai passar e seus obstáculos, e o quanto de dor de cabeça é possível aguentar com algo de qualidade inferior. E lembre-se que você irá confiar sua vida e seus pertences nela, quando estiver em alta velocidade, tudo tem de funcionar muito bem.

Tempo

Veja em antecipação qual o trajeto a ser percorrido e percorra este trajeto para ter uma estimativa de tempo. Note que deve ser considerado o peso da bagagem e o tráfego de veículos que pode diminuir o seu tempo. Com isso fica fácil criar uma agenda para não chegar atrasado naquela reunião às 9h da manhã.

Também considere o tempo usado para tomar um banho, trocar de roupa e guardar a bicicleta e mochila apropriadamente, no meu caso esse tempo demora uns 20 minutos.

Use o Google Maps para criar o trajeto (tem uma opção no gmaps que permite criar o trajeto com setas e pontos).

Segurança

Na criaçao do seu trajeto evite as ruas movimentadas, principalmente onde existem retornos, entradas de carros que entram e saem da avenida principal. Isso pode causar grande demora para encontrar uma brecha e atravessar. Outro problema em pedalar por ruas movimentadas, são as necessidades de se desviar de algum obstáculo (buraco, elevações, objetos, etc.), neste desvio repentino pode ocorrer um acidente.

Tente usar ruas de pouco movimento ou parques, mesmo que demore um pouco mais, pois diminui o risco de ser acidente.

No local de trabalho verifique com antecedência, quem são os seguranças que trabalham lá, verifique se existe alguma norma para estacionamento de bicicletas e informe-os que você vai estacionar a bicicleta em lugar adequado.

Fique esperto quando andar de bicicleta, pois sempre existem malandros esperando o momento certo para te derrubar da bicicleta e roubá-la.

Conveniência

Entenda que sempre haverá situações de inconveniência:

  • Ao usar a mochila para guardar sua roupa de trabalho, irá dar uma boa amassada nela.
  • Pode ser que o banheiro onde irá tomar banho e trocar de roupa, não tenha o seu padrão costumeiro.
  • Ao chover muito e não tiver abrigo, tem o risco de entrar água na mochila. Ou um carro te dar um banho de água suja.

Benefícios

  • Os benefícios de andar de bicicleta contribuem para sua saúde física e mental
  • Insignificantemente reduz a poluição por gás carbonico
  • Contribui para diminuir tráfego de veículos
  • Reduz os custos de transporte do seu veículo

No meu caso, é um trajeto de 40 km diários, no tempo total demoro 1h aproximadamente para percorrer os 20 km de ida ou volta.

Como eu também pratico corridas de atletismo, já percebi que minha performance melhorou, pois no ciclismo outro grupo de musculos foram fortalecidos, melhorando o desempenho no atletismo.

Se essa dica foi importante para você, deixe um comentário.

Segue outras referências:
http://z004.ig.com.br/ig/22/22/112022/blig/freeride/2006_06.html
http://www1.folha.uol.com.br/folha/equilibrio/noticias/ult263u3822.shtml
http://pedaleiro.wordpress.com/2007/08/25/40-benefcios-vantagens-das-bicicletas/

Escrito por claudio at 11:38 AM categorizado por Diversos

Tags: dicas

Resolvendo memory leak - Identificando o comedor de memória

Resolvendo memory leak - Procurando o devorador de memória - parte 1


Algo que vejo recorrente em fóruns e listas de discussão, colegas que perguntam para mim, é "como detectar e resolver o memory leak ?"

Começarei uma série de dicas voltados a encontrar e resolver o problema de retenção de memória (memory leak) em aplicações Java. Posteriomente, será feito um tutorial para resolver problemas de CPU.

Estas dicas podem ser úteis para programadores que ainda não passaram por este problema ou não conhecem as ferramentas. Mesmo para profissionais experientes, espero que possa contribuir.

Isso é baseado em minha experiência, em ambiente linux e solaris. Será dado ênfase no uso de ferramentas gratuitas ou de código livre, para ajudar neste processo. Para ambiente windows, onde possível colocarei as dicas aplicáveis para este SO, mas devo dizer que não tenho especialidade neste SO, portanto desconheço as ferramentas mais adequadas.

Ambiente de produção e desenvolvimento

Também será mostrado como resolver esse problema, tanto em ambiente de produção como em ambiente de desenvolvimento, com as ferramentas disponíveis em cada amviente (exemplo: invocar profiler ou debug em ambiente de produção é bastante caro em termos de performance).

É importante endender que a aplicação pode sofrer monitoramento de maneira intrusiva e não intrusiva.

  • Intrusivo: quando é necessário modificar as configurações de inicialização da aplicação para permitir uma introspecção de suas chamadas de sistemas e quando ocorre uma interceptação destas chamadas de sistemas pelo esquema de monitoramento intrusivo. Um exemplo disso são os profilers e debuggers. Isso gera penalidade em performance, modificação da configuração do ambiente e instalação de ferramentas, o que em ambiente de produção pode ser um grande problema
  • Não intrusivo: Quando é usado ferramentas de monitoramento, que não geram interceptação das chamadas do sistema, não geram impacto negativo em desempenho e não precisam de instalação de software adicional.

Existem uma série de passos, começando por descobrir onde ocorre problema de retenção, até sua resoluçao.

Qual processo do sistema operacional consome memória em demasiado ?


Este é o 1o passo, para identificar se o programa (desktop ou servidor) consome memória sem manter estável.

É importante entender que a aplicação deve ter passado por todas as etapas de criação de objetos e recursos, que já tenha passado por um ciclo de vida. Isso pode ser alcançado, navegando pela aplicação, consultando relatórios, etc.

É necessário usar apenas o SO e suas ferramentas, para descobir qual o processo está neste estado.

Ferramentas:

  • Linux: top, htop, ps
  • Solaris: prstat, ps
  • Windows: gerenciador de tarefas

Segue um exemplo de um programa que consome memória (propositadamente), e sua medição pelos respectivos utilitários do SO.

Vejam que existe um processo java que consome muita memória. O que neste caso interessa saber o PID (process ID) e a linha de comando.

Linux top

Percebe-se uma visualização com cores, linha de comando completa e ordenação diferentes, isso pode ser alcançado por atalhos

z => modifica o esquema de cores

c => mostra a linha de comando completa

shit M => ordena pelo consumo de memória

W => Torna esta configuração o padrão nas próximas invocações do comando top

O top tem uma vantagem, que ele já vem instalado em qualquer linux, então não é necessário efetuar download e instalá-lo. Já o htop, fornece uma visualização melhorada, mas é necessário efetuar download e instalar.

Para saber o consumo da memória por processo, veja na coluna RSS (ou RES), este é o valor de memória física consumido pelo processo (de fato, existem algumas discussões em fórums sobre o comando RSS ser bem uma aproximação do valor real, mas fico devendo uma explicação melhorada sobre isso em outro blog)

Linux htop

Este utilitário, fornece uma visualização melhorada sobre os processos e os recursos.

Linux ps

$ ps -eo pid,user,%cpu,rss,vsz,etime,nlwp,args
  PID USER     %CPU   RSS    VSZ     ELAPSED NLWP COMMAND
 7642 claudio   0.7 343536 658804      05:23   12 java TestReferences

A diferença do comando ps e top, é apenas a visualização, já que o ps recupera um snapshot do sistema.

O diferencial deste comando, é que mostra também a quantidade de threads por processo, na coluna NLWP.

Solaris prstat

$ prstat -s rss
   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
   617 claudio   102M   78M sleep   59    0   0:00:01 2.1% java/9
   554 root      106M   32M sleep   59    0   0:00:01 0.2% ns-httpd/71
     7 root       11M   10M sleep   59    0   0:00:03 0.0% svc.startd/12
     9 root       11M 9384K sleep   59    0   0:00:07 0.0% svc.configd/17
   308 root       12M 8528K sleep   59    0   0:00:01 0.0% fmd/16
   553 root       27M 8088K sleep   59    0   0:00:00 0.0% ns-httpd/2
   618 root     8936K 4416K sleep   59    0   0:00:00 0.0% sshd/1

Foi usada a opção prstat -s rss para ordenar a apresentação baseada no consumo de memória. Outra informação é a quantidade de threads por processo, na coluna NLWP

Windows task manager


Então foi identificado qual é o sistema que consome mais memória. Com isso é possível ter um ponto de partida na análise do processo.

No próximo blog, que pretendo escrever em dois dias (espero), será mostrado como detectar se existe memory leak.

Escrito por claudio at 12:45 AM categorizado por Java

Tags: dicas java linux performance solaris

Sexta-feira, 16 Novembro 2007

Ler arquivos do office com Java

Dicas

No passado existiu uma situação no projeto, em que existiam vários documentos de projeto (guia, arquitetura, requisitos, manual, etc.), vindo de diferentes fontes (diretório de backup, cdrom), e são documentos office (doc, xls, ppt), e vários documentos repetidos, mas de origens diferentes.

Então como saber qual é o último arquivo e remover os antigos ?

Uma maneira é abrir cada arquivo e olhar nas propriedades do mesmo, mas fazer isso manualmente com cerca de 300 arquivos, poxa não sou mais estagiário para isso :-D (nada contra os estagiários).

Então fiz um programa em java, que usa a API SDK do OpenOffice para ler estas propriedades e mostrar as datas da última modificação e o autor.

Claro que é possível usá-lo para ler qualquer outra propriedade ou expandir para outros usos.

Atualmente a pesquisa é efetuada nos seguintes arquivos com extensão: sxw doc xls odt ods pps odt odp ppt 

Altere o DocViewer.java para adicionar outras extensões. 

Faça o download do código fonte: DocViewer.java
(remova a extensão .txt)

Requerimentos: 

Em tempo de compilação é necessário as seguintes bibliotecas:

$OO_HOME/program/classes/juh.jar
$OO_HOME/program/classes/jurt.jar
$OO_HOME/program/classes/jut.jar
$OO_HOME/program/classes/ridl.jar
$OO_HOME/program/classes/unoil.jar

A variável OO_HOME aponta para o diretório de instalação do OpenOffice. No meu caso uso o BrOffice, que está instalado em /opt/broffice.org2.3

Em runtime:

  • Instalação do OpenOffice
  • X Virtual Frame Buffer (Xvfb)
  • Java (testei com a versão 5)

Compilação

Essa parte é simples, use sua IDE favorita ou o javac

javac -classpath /opt/broffice.org2.3/program/classes/\* src/claudius/DocViewer.java

Usei o classpath wildcards, válido apenas para o Java 6

Uso

Para colocar o openoffice em modo servidor, usei um servidor X virtual, isso é para ambiente servidor, onde não é necessário ter um monitor nem interface gráfica. No caso foi instalado o X Virtual Frame Buffer.

Se não puder instalar um servidor X virtual e iniciar a aplicação openoffice manualmente, tudo bem, basta não informar qual o servidor X a ser usado. Veja o exemplo abaixo:

Com servidor X virtual 

Xvfb :5 -screen 0 800x600x16 & 
/opt/broffice.org2.2/program/soffice -accept="socket,host=127.0.0.1,port=8100;urp;" -display :5 -headless -norestore -invisible &

Sem servidor X virtual

/opt/broffice.org2.2/program/soffice -accept="socket,host=127.0.0.1,port=8100;urp;" -headless -norestore -invisible &

Invocar o programa Java

A sintaxe para invocar é

java -classpath $CP claudius.DocViewer <path do arquivo ou diretório>

O classpath $CP é o mesmo usado na compilação, em adição ao diretório da classe DocViewer compilada.
O path, pode ser um arquivo único ou diretório, que neste último caso irá pesquisar nos subdiretórios também. 

Exemplo 

java -classpath build/classes/:/opt/broffice.org2.3/program/classes/\* claudius/DocViewer arquivo-projeto.odt

O resultado:

dir  = /home/claudio/resources/palestras/2007/10_justjava
file = diagnostico2.odp
Modified by: Claudio Miranda 5/10/2007 17:46:8

Se essa dica foi útil para você, deixe uma mensagem comentando como isso lhe ajudou.

Escrito por claudio at 3:36 PM categorizado por Java

Tags: dicas java linux

Quarta-feira, 7 Novembro 2007

Conversão de charset para UTF-8, modo gráfico

Dicas

Segue uma maneira fácil de converter arquivos ou nome de arquivos para UTF-8. Um exemplo é quando copia-se arquivos acentuados em windows para linux, o nome de arquivo não é convertido, ficando um nome ilegível. Então deve-se converter o nome do arquivo para UTF-8.

Na dica anterior, foi mostrado como modificar o conteúdo do arquivo para UTF-8. O uso da ferramenta konwert por linha de comando é útil quando se tem muitos arquivos a serem verificados. Quando se tem poucos arquivos e estão visíveis na interface gráfica, torna-se mais prático usar alguns cliques para resolver isso.

Então a dica fica com o uso de um script específico para o Konqueror (KDE) que abre um menu de contexto com opções de conversão. O script é o ToUTF-8, encontrado no kde-apps.org, as instruções de instalação estão no site.

Requisitos

  • Linux
  • KDE
  • Konqueror
  • recode

Eu uso o gerenciador de arquivos krusader, que acho bem mais prático do que o konqueror.

Clique na imagem abaixo, para ver como ele funciona. 

Clique na imagem para ampliar

Escrito por claudio at 5:26 PM categorizado por Dicas e Scripts

Tags: linux dicas

Segunda-feira, 5 Novembro 2007

Conversão de charset para UTF-8

Em ambientes de desenvolvimento heterogêneos, onde existem diferentes sistemas operacionais e IDEs, é comum encontrar problemas de caracteres com encoding diferentes, como ISO-8859-1, UTF-8, etc.

No projeto que trabalho atualmente, existem windows e linux (por enquanto não tem apple), então é comum existirem arquivos com ISO-8859-1, ASCII e UTF-8.

Então não é uma boa idéia gravar arquivos .java, vogais com acentos e gravar em ISO-8859-1 e outro colega abrir esse arquivo em seu linux com UTF-8, uma bagunça.

Então segue um script para linux que verifica os encodings dos arquivos e outro que converte para UTF-8. Note que o script não mostra o arquivo se ele já estiver em UTF-8.

É necessário o utilitário konwert. Já usei anteriormente o recode e iconv, mas achei o konwert mais prático. E ele oferece uma opção interessante, onde ele tenta descobrir qual o encodingo do arquivo, através da opção any/pt/all-test

Script 1 - checagem do encoding

#!/bin/sh

if [ $# -lt 1 ] ; then
    echo ""
    echo " Informe um diretório para pesquisar os arquivos .java "
    exit 1
fi

find $1 -name \*.java -exec file {} \; | egrep -v 'ASCII|UTF' | while read s; do 
	ff=`echo $s | awk -F ':' '{print $1}'`;  
	file $ff; 
	echo " charset   "; konwert any/pt/all-test  $ff; 
done

Script 2 - Conversão para UTF-8

#!/bin/sh

if [ $# -lt 1 ] ; then
    echo ""
    echo " Informe um diretório para converter os arquivos .java para UTF-8"
    exit 1
fi

find . -name \*.java -exec file {} \; | grep 8859 | while read s; do 
	ff=`echo $s | awk -F ':' '{print $1}'`;   
	konwert cp1252-utf8 -O  $ff; 
done                      

No script de conversão é usado a opção -O, que faz com que o arquivo original seja trocado pelo arquivo com encoding UTF-8 

Escrito por claudio at 1:46 PM categorizado por Dicas e Scripts

Tags: linux dicas java

Sexta-feira, 26 Outubro 2007

Descobrindo senha de banco de dados

Dicas

Você já passou por aquela situação de desconfiança, onde ao informar a senha de acesso ao banco de dados e pensou "poxa, tenho de informar a senha em texto limpo ?", desejando que a senha estivesse cifrada.

Isso por padrão ocorre em alguns servidores de aplicativos, onde a senha de acesso ao banco de dados é informada em texto limpo, em outros servidores de aplicativos a senha ecoa em asteriscos, deixando o usuário confortável que a senha está segura. Bem, não acredite nisso, a senha não está segura.

O que quero mostrar é que a senha pode ser extraida de outras maneiras, como inspecionar os pacotes de mensagens IP. O que pode garantir a senha é uma combinação de práticas e configurações para deixar o ambiente mais seguro.

Passo aqui um exemplo de como obter a senha do oracle configurado em um servidor de aplicativos conhecido no mercado.

Vejam abaixo na configuração da conexão, que a senha esta protegida por asteriscos


Faça os seguintes passos, para ver a senha no log

  1. Usar a biblioteca JDBC de debug da oracle: ojdbc14_d.jar
  2. Usar o driver XA oracle.jdbc.xa.client.OracleXADataSource
  3. Incluir as seguintes propriedades de JVM
    -Doracle.jdbc.Trace=true
    -Doracle.jdbc.LogFile=/var/tmp/oracle-trace/trace1
    
  4. Reiniciar o servidor de aplicativos

Basta acompanhar o log de trace do oracle ou do servidor de aplicativos, que a senha será impressa desta maneira

INFO: OracleXADataSource.getXAConnection()
03/10/2007 15:33:16 oracle.jdbc.xa.client.OracleXADataSource getXAConnection
INFO: OracleXADataSource.getXAConnection(user = claudio, passwd = admin123)
03/10/2007 15:33:16 oracle.jdbc.driver.PhysicalConnection setAutoCommit

Bonito não é ?

Para o Oracle é usado uma funcionalidade documentada, que é o trace das chamadas. Mas infelizmente, a senha é impressa junto. E vejam que nem com SSL, a senha é protegida.

E é necessário ter privilégios de administração do servidor de aplicativos.

Quando que isso pode ser útil ?

Já trabalhei em lugares onde a senha do banco de dados, era digitada no console do appserver, pelo próprio pessoal da equipe de DBA, e em algumas situações era necessário realizar alguma pesquisa no BD, então essa dica vale a pena.

Em banco de dados de código livre fica mais fácil, basta usar o código fonte do driver JDBC, modificar o código fonte para imprimir a senha e pronto.

Em banco de dados que não são de código livre, basta criar sua classe que estende DataSource e sobrecarregar o método getConnection e fazer um proxy para o DataSource do driver JDBC.

Então, percebam que os asteriscos no textfield não significam segurança para a senha do banco de dados.

Tenho essa dica há uns 3 anos e percebi que não escrevi sobre ela ainda.

Se essa dica foi útil para você, deixe um comentário, informando como ela lhe ajudou ! 

Escrito por claudio at 7:17 AM categorizado por Dicas e Scripts

Tags: java dicas

Quinta-feira, 18 Outubro 2007

Controle sua apresentação OO pelo seu telefone celular

Em palestras, é muito comum o palestrante controlar o avanço e retrocesso dos slides, pressionando o botão do teclado ou mouse.

Mas sempre tem uma galera que não fica contente com as coisas convencionais, então que tal usar seu telefone celular para controlar o avanço/retrocesso dos slides ?

É exatamente isso que faz a aplicação Mobile OpenOffice Controller, de autoria do Bruno Ghisi e Lucas Torri.

Testei e funcionou de primeira, recomendo a todos. Isso serve de uma boa demostração de tecnologias diferentes.

A aplicação usa

Faça você o teste também e dê um feedback sobre o funcionamento.

Escrito por claudio at 5:09 AM categorizado por Java

Tags: java dicas

Sexta-feira, 10 Agosto 2007

Dicas de SSH (v2)

Dicas Em junho publiquei uma dica no uso de ssh, sem solicitar a senha do servidor. Isso envolve criar uma chave privada/pública e colocar a chave pública no servidor.

Ocorre que essa chave pode ter uma senha para proteger contra acesso não autorizado (passphrase), que é diferente da senha de login ssh.

Ao usar a dica que coloquei anteriormente, mas informando um passphrase, em cada conexão com o ssh, é necessário informar a senha do passphrase, o que invalida toda a dica, onde não é necessário informar senha nenhuma. Dai o motivo de não informar um passphrase.

Então conversando com o colega Bruno Borges da Summa (aka Miojo), ele disse que usou o ssh-agent para proteger o passphrase.

Então complementado a minha dica anterior,

  1. Geração de chave RSA de 2048 bits
    ssh-keygen -b 2048 -t rsa
    

    Desta vez informe um passphrase

  2. Use o ssh-agent para guardar o acesso ao passphrase
    $ eval `ssh-agent`
    $ ssh-add <private key file> # e.g. ~/.ssh/id_RSA
    $ ssh-add -l

A dica de como usar o ssh-agent, peguei de outro site.

­

Agora pode seguir o restante da dica anterior a partir do passo 2

Escrito por claudio at 9:26 PM categorizado por Dicas e Scripts

Tags: linux dicas

Segunda-feira, 30 Julho 2007

Como encontrar uma classe ?

Dicas Nesta dica mostrarei duas dicas que me ajudam muito no dia a dia.

1) Encontrar em qual biblioteca está uma classe 

Existem diversas situações onde é necessário encontrar em qual biblioteca encontra-se uma determinada classe Java.

Em 2004 coloquei uma dica de um script bash que resolve isso. Esse script mostra todos os arquivos que ele vasculhou para procurar a classe, mesmo que a classe não estivesse no arquivo, ele seria mostrada mesmo assim, causando desperdício de tempo e de tela.

Então aproveitei um tempinho e arrumei o script, onde é mostrado apenas o arquivo que contém a classe procurada e ainda arrumei a impressão da tela.

#!/bin/sh

usage="Uso:        findJavaClass directory ClassName   "

if [ $# -lt 2 ] ; then
    echo $usage
    exit 1
fi

if [ -d $1 ] ; then
    FIND_CMD="find $1"
else 
    echo "Diretorio nao existe"
    exit 1    
fi

$FIND_CMD -name \*.jar | while read jar_file ; 
do
    found_class=`unzip -l $jar_file | awk '{print $4}' | grep  $2`
    num_classes=`echo $found_class | wc -c`
    if [ $num_classes -gt 1 ] ; then 
        echo ""
        echo "Arquivo:"
        echo "    $jar_file"
        echo "Classes:"
        echo $found_class | sed 's/\ /\n/g' | sed 's/^.*/\ \ \ \ &/g'
    fi
done

  

E o um resultado como exemplo:

$ findJavaClass ~/javaSoftware/netbeans-5.5.1/ide7/modules/ext/jaxws21/ Task

Arquivo:
    /home/claudio/javaSoftware/netbeans-5.5.1/ide7/modules/ext/jaxws21/http.jar
Classes:
    sun/net/httpserver/ServerImpl$ServerTimerTask.class

Arquivo:
    /home/claudio/javaSoftware/netbeans-5.5.1/ide7/modules/ext/jaxws21/jaxb-xjc.jar
Classes:
    com/sun/istack/tools/ProtectedTask$AntElement.class
    com/sun/istack/tools/ProtectedTask.class
    com/sun/tools/jxc/AptBasedTask$1.class
    com/sun/tools/jxc/AptBasedTask$AptAdapter.class
    com/sun/tools/jxc/AptBasedTask$InternalAptAdapter.class

  

2) Como mostrar o conteúdo de um arquivo que está compactado ?

Quantas vezes por dia você descompacta um arquivo só para olhar o conteúdo do manifest ?

Então segue mais uma dica, onde não é necessário descompactar o arquivo.

$ unzip -c /home/claudio/javaSoftware/netbeans-5.5.1/ide7/modules/ext/jaxws21/jaxb-xjc.jar META-INF/MANIFEST.MF
  

Escrito por claudio at 2:56 AM categorizado por Dicas e Scripts

Tags: linux dicas java

Sábado, 28 Julho 2007

Completar números com zeros a esquerda

Ao lidar com impressão de números em relatórios, geralmente é necessário preencher todas as posições com o número zero a esquerda.

Exemplo:

É necessário preencher um campo de 10 posições, onde dado um número qualquer, que seja menor do que a quantidade de posições, então as posições do lado esquerdo devem ser preenchidos com o número zero.

Número Impressão
382 0000000382
450018 0000450018


Uma das técnicas mais comuns é usar a quantidade total de números do campo e adicionar com zeros a esquerda e depois remover os zeros excedentes.

int n = 38002;
String zeros = "0000000000";
String numero = zeros + n;
System.out.println(numero.substring(numero.length() - 10));

No Java 5 existe um método printf, copiado da linguagem C que permite formatar a impressão do resultado. 

int n = 38002;
System.out.printf("%010d", n);

Esta é apenas uma das funcionalidades adicionadas ao Java 5 que aos poucos são incorporadas no dia a dia dos projetos.

Atualização em 28/julho:

Nem tudo é impresso no console, mas manipulações de variáveis, então basta usar outro método que retorna uma String. No exemplo abaixo, a variável f, contém o número formatado.

String f = String.format("%010d", n);
System.out.printf(f);

Escrito por claudio at 5:07 AM categorizado por Dicas e Scripts

Tags: java dicas

Segunda-feira, 23 Julho 2007

Como usar openssl e md5sum para verificar integridade de arquivos

Kernel Panic

Sempre preciso copiar arquivos entre solaris, linux e windows. Para verificar se o arquivo foi copiado com sucesso, uso um algoritmo aplicado no arquivo que faço a cópia, que efetua um cálculo único. Esse algoritmo é o MD5. Para invocar o cálculo desse algoritmo uso uma ferramenta no linux chamado md5sum.

Essa ferramenta, efetua o cálculo e a verificação de integridade de um arquivo.

Por que usar verificação de integridade na cópia de arquivos ?
Pois a cópia pode ter sido corrompida na transferência.

Então segue um exemplo de usar o md5sum

Criar o hash

md5sum arquivo.tar > arquivo.tar.md5

Verificar o hash

md5sum -c arquivo.tar.md5

A verificação do hash, usa o seguinte formato para verificação

534a15536aa0152e178361983c678cc0  arquivo.tar.md5

O motivo desta dica, não é necessariamente sobre o md5sum, mas porque essa ferramenta não está disponível nativamente no solaris, onde uso o openssl.

No solaris, para criar o hash, uso openssl da seguinte maneira

openssl dgst -md5 <arquivo>

Que gera um resultado da seguinte maneira

$ openssl dgst -md5 list.conf
MD5(list.conf)= e5c8ebe8e2113448fd318328cf5ca582

Que é diferente do md5sum, então não é possível realizar a verificação de integridade usando checksums md5.

Por isso criei um script bash, para solaris que faz uma tarefa semelhante do utilitário md5sum.

Download do script bash md5sum_solaris.sh

Dependências: openssl, awk, sed

O código é o seguinte:

#!/bin/bash

if [ "$1" ] ; then
    if [ $1 = '-c' ] && [ $2"x" != 'x'  ] ; then
        shift
        cat $1 | while read hash_line
        do
            hash_value=`echo $hash_line | awk '{print $1}'`
            filename=`echo $hash_line | awk '{print $2}'`
            echo -n $filename": "
            if [ -f "$filename" ] ; then
                hash_var=`openssl dgst -md5 $filename | awk '{print $2}'` ;
                if [ $hash_var == $hash_value ] ; then
                    echo "OK"
                else
                    echo "FAILED"
                fi
            else
                echo "FAILED: No such file or directory"
            fi
        done
    else
        openssl dgst -md5 $*  |  sed 's/[\(\)=]//g;s/MD5//g' | awk '{print $2"  "$1}'
    fi
else 
    echo "Usage:
    $0 -c hashs.md5      to verify checksums
    $0             to create checksums
    "
fi

Escrito por claudio at 3:56 AM categorizado por Dicas e Scripts

Tags: linux dicas

Quarta-feira, 13 Junho 2007

Dicas de SSH

Seguem duas dicas no uso de ssh que facilitam um pouco a sua vida. 

Para efetuar login sem solicitar senha

Essa dica é para SO linux, para windows eu não sei.

1. Geração de chave RSA de 2048 bits

ssh-keygen -b 2048 -t rsa

Não digite um passphrase (aperte a tecla enter)

Atualização em 10/Ago/2007: É possível usar um passphrase e o ssh-agent para ter a facilidade de não invocar a senha do passphrase em toda conexão e manter sua chave privada segura. 

2. Copiar a chave pública para o servidor desejado

scp ~/.ssh/id_rsa.pub usuario@10.0.0.5:/home/usuario/.ssh/

3. Colocar a sua chave pública como chave confiável

Acessar o servidor por ssh (informando a senha ainda) e colocar a sua chave pública na lista confiável

cd .ssh
cat id_rsa.pub >> authorized_keys

Essa dica eu tirei do site dicas-l, mas modifiquei algumas coisas.

Diminuir o tempo de login no SSH

Em algumas situações (desconhecidas) ao realizar um ssh para uma máquina, pode demorar cerca de 3 a 5s. Para diminuir esse tempo é necessário editar o arquivo /etc/ssh/sshd_config e configurar as seguintes opções:

GSSAPIAuthentication no
GSSAPICleanupCredentials yes

Escrito por claudio at 6:08 PM categorizado por Dicas e Scripts

Tags: linux dicas

Terça-feira, 5 Junho 2007

Quantidade de threads por processo

Regularmente preciso verificar a quantidade de threads em um processo. Tanto em solaris como em linux. Coloco primeiro a versão para linux e depois a versão para Solaris.

Linux

Então coloco aqui o comando ps completo e logo abaixo um script para facilitar o monitoramento.

O comando ps

ps -p PID -o pid,user,%cpu,rss,etime,nlwp,args

Exemplo de invocação

$ ps -p 5124  -o pid,user,%cpu,rss,etime,nlwp,args
  PID USER     %CPU   RSS     ELAPSED NLWP COMMAND
 5124 claudio   8.0 122160      39:37   11 /usr/local/firefox/firefox-bin

A quantidade de threads é mostrada na coluna NLWP, que neste exemplo mostra 11 threads.

A opção -o informa quais colunas devem ser mostradas. Veja o manual do comando ps para verificar outras opções.

Note que o comando ps tem apenas uma invocação, o que torna difícil o monitoramento. Então criei um script bash, que tem as seguintes vantagens:

  • Aceita uma quantidade de repetições.
  • Repete o cabeçalho em 15 linhas
  • Aceita uma string como argumento, ao invés do nome do processo. Para não ter de ficar procurando o PID a todo momento.

threads_per_process.sh

Solaris

No solaris o comando é mais fácil: prstat

Ele aceita um parametro de repetição, que é útil para monitoramento.

Comando

prstat -c -p PID 1 3

Exemplo de invocação

$ prstat -c -p 15409 1 3
   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
 15409 claudio   171M  120M sleep   59    0   4:22:25 6.6% java/29
Total: 1 processes, 29 lwps, load averages: 0.25, 0.27, 0.29
   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
 15409 claudio   171M  120M sleep   59    0   4:22:25 6.3% java/29
Total: 1 processes, 29 lwps, load averages: 0.26, 0.27, 0.29

A quantidade de threads é mostrada na última coluna, chamada de NLWP, ao lado do nome do binário, que neste exemplo, mostra 29 threads.

Este monitoramento permitiu que pudesse avaliar um teste de threads que precisei realizar um tempo atrás. 

Se isto é útil para você, deixe um comentário sobre como isso lhe ajudou.

Escrito por claudio at 8:25 PM categorizado por Dicas e Scripts

Tags: java solaris dicas performance linux

Sábado, 2 Junho 2007

Mudança nas aparências do blog

Modifiquei algumas coisas neste blog para refletir uma melhor usabilidade e visual (na minha opinião)

Deu um pouco de trabalho, mas isso começou na semana passada, onde atualizei a infraestrutura do meu site:

  • Upgrade do Jetty 6.1.1 para o 6.1.3
    Pois estava havendo problemas no POST para URLs HTTPS
  • Upgrade do sistema de blog (Blojsom) para 3.2
  • Upgrade do JSPWiki 2.4.47 para 2.4.102

Como tenho o meu domínio, estima-se um trabalho para manter tudo funcionando: web, email, blog, banco de dados, firewall, filtro de spam, etc. Sou grato que parte disso não tenho de me preocupar (por enquanto), pois uso o Google Apps para email e calendário.

Dos serviços que tenho usado e recomendo:


Escrito por claudio at 5:25 PM categorizado por Diversos

Tags: dicas

Terça-feira, 15 Maio 2007

Qual é a quantidade máxima de threads suportada por um sistema ?

Tive de efetuar um teste para um cliente, onde é necessário verificar qual é a quantidade máxima de threads suportada por uma determinada máquina.

Parece simples não é ? Pois só parece, pois existem fatores que podem variar muito o resultado

  • Tamanho da pilha: -Xss
  • Tamanho máximo do heap: -Xmx
  • Capacidade computacional disponível, para funcionar o teste. Tome cuidado ao rodar isso na sua máquina de produção.
  • Em um ambiente de servidor real, o mesmo usa mecanismos de pool e prioridades, onde este teste não considera isso. Logo o sistema irá sempre suportar mais threads do que o resultado desta medição.
  • Cada thread efetua vários cálculos matemáticos, enquanto que em uma aplicação real cada thread faz operações diferentes.

Fiz um guia no ClaudiusWiki, onde as existem mais informações sobre isso e onde estão os arquivos para download, com as respectivas instruções.

Escrito por claudio at 7:49 PM categorizado por Java

Tags: java dicas performance

Quarta-feira, 21 Março 2007

Desabilitar o login gráfico no solaris 10

Tenho usado o Solaris em uma vmware, e como preciso apenas de aplicações servidoras, e poupar o uso computacional de minha maquina, então desabilito o que não preciso, como sendmail, ftp e o login gráfico.

No caso do login gŕafico, para desabilitar, basta invocar o comando svcadm, como abaixo:

svcadm disable svc:/application/graphical-login/cde-login:default

Veja outra dica para habilitar/desabilitar serviços no solaris 10 

Escrito por claudio at 1:00 PM categorizado por Dicas e Scripts

Tags: java solaris dicas

Quinta-feira, 8 Março 2007

Passaporte vencido e visto vigente

Tenho um passaporte vencido e um visto para o EUA que vence em 2012. Busquei informações de como devo proceder para ter um novo passaporte e permanecer com o visto.

Eis que para manter o visto, tenho de permanecer com o passaporte vencido, carregar junto com o novo, essa informação consta tanto no Departamento da Polícia Federal (item 15) e da Embaixada Americana (item 11).

Polícia Federal (item 15)
15) O que faço com os vistos que eu já tinha no passaporte antigo? Continuam válidos?
Os vistos contidos nos passaportes antigos ou passaportes com validade expirada continuam a valer normalmente. A única recomendação é que o passaporte antigo, com os vistos, seja apresentado juntamente com o novo, no momento da checagem migratória tanto no Brasil como no exterior.
Embaixada Americana (item 11)
11) What shall I do if my passport expires but my visa is still valid?
Attach the expired passport with the valid visa to the new one. Make sure that the visa was not damaged and always travel with both passports. Please note that your passport must be at least six months validity as of the date you anticipate entering the United States.

E para tirar o novo passaporte, sem entregar o anterior tenho de pagar o valor da taxa em dobro (item 6).

Polícia Federal (item 6)
6.0 - Apresentar o Passaporte anterior, quando houver (válido ou não). A não apresentação deste, por qualquer motivo, implica em pagamento da taxa em dobro;


Atualização: Tirei um novo passaporte e a taxa NÃO deve ser paga novamente.A apresentação a que se refere, é apenas para mostrar o passaporte antigo ao agente da PF, então você fica com ele.
Para quem não mostrar o passaporte , é que a taxa deve ser paga.



O preço do novo passaporte é R$ 156,07, então no meu caso, deverá ser pago R$ 312,14.

Fiz algumas buscas rápidas no google, mas não encontrei nenhuma informação relevante ao pagameno injusto da taxa em dobro.

Uma parte engraçada (ou trágica) é que o email de dúvidas sobre passaportes da Polícia Federal, tem resposta automática, onde a resposta é um FAQ que não existe no website da DPF.

Esse é um preço caro a ser pago por algo vencido, não é ?

Escrito por claudio at 5:00 PM categorizado por Diversos

Tags: dicas

Sexta-feira, 23 Fevereiro 2007

Quantos visitaram meu site ?

Em 2006 começei a usar o Google Analytics para medir as visitas ao meu website, escrevi sobre isso um tempo atrás. A ferramenta é fantástica com relatórios muito bons. Mas esse é um serviço que apenas administradores podem acessar os relatórios. Recomendo.

No entanto conheçi outro serviço de estísticas de visitas, muito bom, é o Mapstats do BlogFlux.

Coloquei este link na barra de informações ao lado, clicando nele é possível você acessar os relatório de visitas ao meu site. Acredito ser necessário, ter uma conta no blogflux para ver os relatórios de visitas.
 

Escrito por claudio at 5:29 PM categorizado por Dicas e Scripts

Tags: dicas

Terça-feira, 13 Fevereiro 2007

Encontrar o DN root de LDAP

Publiquei há alguns dias uma maneira de encontrar o DN raiz de um MS Active Directory, através de uma ferramenta windows.

Então verifiquei que existe uma maneira (mais fácil) de descobrir todos os DN root configurados:

ldapsearch -x  -h 199.199.199.180 -p 389 -s base -b "" "objectClass=*" namingContexts

Escrito por claudio at 6:17 PM categorizado por Dicas e Scripts

Tags: dicas java ldap

Quarta-feira, 7 Fevereiro 2007

VI, um mínimo de conforto

 

Escrevi no wiki, as configurações que uso no VI, pois como sempre uso este poderoso editor, então preciso ter algum conforto ao usá-lo.

Se você tem alguma dica adicional, por favor deixe um comentário.

Escrito por claudio at 8:43 PM categorizado por Dicas e Scripts

Tags: dicas

Terça-feira, 6 Fevereiro 2007

Passar o tempo e ver coisas incríveis

Existem dois website que contém muitas fotos de coisas, lugares e acontecimentos incríveis. Ótimo para passar o tempo. Recomendo!

Dark Roasted Blend

Este outro está com o Google Translate, pois é um website em russo. O uso de adblock é recomendado. 

Ochevidec.net

Escrito por claudio at 10:40 AM categorizado por Dicas e Scripts

Tags: dicas fotos

Segunda-feira, 5 Fevereiro 2007

3 Dicas: Encontrar o DN do AD - Download de conteúdo wiki - Firefox ler .zip

Como fiquei vários dias sem escrever nada, agora seguem 3 dicas, que são mais relacionadas ao meu trabalho. Mas como não foi fácil encontrar na internet, acredito que existam outras pessoas que possam precisar dessa informação.

  1. Normalmente o Microsoft Active Directory (AD) é usado como repositório de usuários em grandes organizações, considerando isso, os serviços de autenticações precisam ser configurados para acessar o AD.

    No caso de Java, então o acesso ao AD acaba sendo através de JNDI, através de um SPI LDAP. Então para isso é necessário saber qual o DN (Distinguished Name) de acesso ao AD.

    Para saber qual o DN do AD, procurei na ferramenta de administração do AD mas não encontrei nada sobre o DN. Então recorri a um colega da Sun (obrigado Marcos Belarmino), que me informou sobre o comando ldifde, para realizar exportação da árvore completa do AD (note que não há solicitação de senha). A sintaxe é: ldifde -f saida_ad.ldif

    Então basta abrir o arquivo saida_ad.ldif que os respectivos DNs e usuários estarão lá.

  2. A outra dica é com relação a uma facilidade de exportação do wiki Confluence, onde é possível exportar qualquer espaço do wiki para HTML e depois compactar em um arquivo .zip para realizar download e ler off-line.

    Para fazer isso, acesse qualquer wiki confluence, clique em "Browse Space" no canto superior direito
    Depois clique em "Export Space" no menu do lado esquerdo.

    Então, é só escolher as opções e clicar em download.

  3. No firefox é possível ler o conteúdo de um arquivo .zip, com isso não é necessário descompactar o arquivo. Basta informar uma URL da seguinte maneira.

    jar:file:///home/claudio/downloads/WW-20070204-18_16_03.zip!/WW/Site.html

    Essa dica pode ser mais bacana em situações onde é necessário ter vasta documentação HTML e economizar espaço, por exemplo em documentações que acompanham CDs. Essa dica eu peguei em um comentário de um blog.


 

Escrito por claudio at 3:21 PM categorizado por Dicas e Scripts

Tags: confluence dicas

Quinta-feira, 14 Dezembro 2006

Picasaweb no linux

Tenho uma conta no picasaweb, o serviço de fotos gratuito do google.

Mas o que me irritava era ter de fazer o upload manual de cada foto, pois o picasaweb para linux, versão 2.2 não suporta o picasaweb.

Bem, como o Picasa funciona por cima do wine, então é possível instalar o Picasaweb 2.6 no linux, com o wine.

Retirei a dica de uma mensagem do google groups do picasa linux

Veja o screenshot (clique na imagem para ampliar)

Veja os passos


Escrito por claudio at 3:52 AM categorizado por Dicas e Scripts

Tags: linux dicas

Sexta-feira, 16 Setembro 2005

Oracle e BLOB

Resolvi a pouco um problema que me importunava há alguns dias, era com o uso de BLOB em oracle.

Basicamente, o que tenho na aplicação é um objeto java que quero serializar em BLOB e depois lê-lo, mas resultava nos seguintes erros:

java.io.IOException: Message [ORA-4283276] not found in 'oracle.jdbc.dbaccess.Messages'.
        at oracle.jdbc.dbaccess.DBError.SQLToIOException(DBError.java:717)
        at oracle.jdbc.driver.OracleBlobInputStream.needBytes(OracleBlobInputStream.java:249)
        at oracle.jdbc.driver.OracleBufferedStream.read(OracleBufferedStream.java:158)
        at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2150)
        at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2163)
        at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2631)
        at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:734)
        at java.io.ObjectInputStream.(ObjectInputStream.java:253)
        at claudius.Serial56.writeAndReadSetBinary(Blob56.java:111)
        at claudius.Serial56.main(Blob56.java:399)
        # =========================================================
java.sql.SQLException: ORA-21608: duration is invalid for this function

        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
        at oracle.jdbc.oci8.OCIDBAccess.check_error(OCIDBAccess.java:2355)
        at oracle.jdbc.oci8.OCIDBAccess.createTemporaryLob(OCIDBAccess.java:3678)
        at oracle.jdbc.dbaccess.DBAccess.createTemporaryLob(DBAccess.java:1355)
        at oracle.sql.LobDBAccessImpl.createTemporaryBlob(LobDBAccessImpl.java:373)
        at oracle.sql.BLOB.createTemporary(BLOB.java:778)
        at claudius.SerialBase.buildBlob(SerialBase.java:205)
        at claudius.Serial56.writeAndReadBLOBCreateTemporary(Blob56.java:151)
        at claudius.Serial56.main(Blob56.java:405)
        # =========================================================
java.io.IOException: Message [ORA-4282764] not found in 'oracle.jdbc.dbaccess.Messages'.
        at oracle.jdbc.dbaccess.DBError.SQLToIOException(DBError.java:717)
        at oracle.jdbc.driver.OracleBlobInputStream.needBytes(OracleBlobInputStream.java:249)
        at oracle.jdbc.driver.OracleBufferedStream.read(OracleBufferedStream.java:158)
        at oracle.jdbc.driver.OracleBufferedStream.read(OracleBufferedStream.java:131)
        at claudius.Serial56.writeAndReadInsertEmpty(Blob56.java:284)
        at claudius.Serial56.main(Blob56.java:412)

A versão do Oracle era 9.2.0.6 (disponível apenas no metalink.oracle.com), entã o ambiente foi atualizado para o 9.2.0.7 (último da série 9.2.x), mesmo porque no release notes não indicava nenhuma correção específica do erro que apresentava para mim.

O conselho então é: atualize a versão do Oracle para a mais recente

Escrito por claudio at 3:58 PM categorizado por Java

Tags: dicas

« Setembro »
SegTerQuaQuiSexSábDom
  12345
6789101112
13141516171819
20212223242526
27282930   
       
Próxima página »     Última página »
 
     Navegue no histórico de mensagens: « First  « Prev   1 2 3 4 5   Next »  Last »