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

Quinta-feira, 17 Junho 2010

RedHatter convicto

Estou de casa nova !

Vejam meu novo email



Estou no time JBoss / Red Hat do Brasil com um super time, e para mim isso representa uma viagem que começou há mais de 12 anos, quando peguei o cd de incríveis 650 MB para instalar no meu Pentium (comprado com muito suor), o Sistema Operacional Red Hat Linux Marumbi da Conectiva. Depois comprava CDs na cheapbytes.com, tempos interessantes.

E foi em 1998 que começei a estudar e trabalhar com Java e Linux, tudo linha de comando, aquele programa gerenciador gráfico X, uau que fantástico, tinha o xeyes de entretenimento. E isso era um UNIX servidor rodando no meu Pentium. Opa, claro que tinha o windows NT server, que é acompanhado por alguns virus e falhas de segurança homéricas. E eu com meu linux, compilando meu próprio kernel, altos desafios para fazer o winmodem funcionar no linux. Isso após migrar serviços de FTP, SMTP, POP, etc de clientes que usavam novell para linux. Yeah !

Em 2000 em um projeto com EJB precisava testar o projeto, mas não tinham licença do weblogic 5 na época, então achei um tal de EJBoss com um logo de ET no site, que depois de muita configuração de xml funcionou na minha maquininha. Esse EJBoss (Coding the future) é bom mesmo.

E agora estou nesta companhia, fundada com os princípios de código livre e com tecnologias que uso há muito tempo (I am NOT the Mac guy).

O estado atual, a Red Hat é uma das empresas de TI no mundo que mais crescem, com 18% em 2008, 46% em 2009 e neste 1o trimestre cresceu mais do que no 1o trimestre de 2009.

Jim Whitehurst (Red Hat CEO) escreveu "Show me the money" onde diz que uma das maiores contribuições que a Red Hat fez é mostrar que é possível ganhar dinheiro com open source. Afinal de contas, todos temos contas para pagar.

Acredito que tenho um bom caminho a trilhar na Red Hat, com seus projetos e produtos líderes de mercado.

Tenho amigos com quem já trabalhei na Summa que estão na Red Hat como o Clebert Suconic, Edgar Silva, Bruno Rossetto e Rafael Benevides.

Falando em Summa, quero dizer o quanto particpar desta companhia foi gratificante para mim. Pude participar ativamente de trabalhos que hoje são projeção nacional e exemplos do uso de Java no mundo. Projetos como loterias (sistema de processamento de lotérico e financeiro), ADSL Brasil Telecom, DDA (Débito Direto Autorizado), entre outros.

Foram 8 anos onde trabalhei com um time de profissionais competentes e dedicados, onde fiz amigos e partilhei tantos bons momentos e happy hours :)

Digo muito obrigado por terem me aceitado a participar deste incrível time e acredito que consegui contribuir para alavancar não só novas oportunidades, mas também conquistar amigos.



Escrito por claudio at 3:17 AM categorizado por Linux e F/OSS

Tags: linux java

Sábado, 30 Janeiro 2010

Upgrade para o KUbuntu 9.10

Finalmente fiz o upgrade para o Kubuntu 9.10

De fato fiz uma instalação do zero, pois usava a versão 8.04 ainda.

Demorei tanto para fazer o upgrade pois uso o KDE a muito tempo, e percebi que a versão KDE 4.x ainda não estava estável ou similar ao KDE 3.5.x (última versão).

Engraçado ter demorando tanto para instalar uma versão recente tanto do KDE como do Kubuntu, pois uso Linux desde 1997, e até alguns anos atrás estava na crista da onda quanto ao uso de softwares recentes do mundo unix, podendo ser kernel, X, samba, aplicativos, módulos, etc. Fiz muitos builds do kernel, somente para selecionar os módulos desejados (kernel 2.2.x ou 2.4.x) e assim deixar o sistema otimizado, tanto para laptop como desktop. Consegui fazer hibernação (suspend to disk e ram) funcionar ainda em 2003 (demorava era na hora do restore). Tem até uma comunidade no orkut que o  Edgar criou, somente para homenagear pessoas como eu que gostam de recompilar :)

Também costumo usar muito sistema em beta, trunk, alpha incluindo Java SDK, Netbeans, servidores, etc.

Na medida que foram saindo as distribuições com o KDE 4, percebi que o KDE 4 ainda não estava nem beta, faltavam muitas funcionalidades, ruim de performance (até hoje), e coisas desnecessárias.

Vou citar algumas delas, para não ficar no vazio:

  • o tempo de inicialização do KDE 4 era bem maior do que o KDE 3
  • Frescurinhas, como os efeitos de girar as janelas, mover, minimizar, etc. Isso só é legal nas apresentação, fora isso, é perda de tempo da CPU. Neste caso já vi diversos colegas se perederem no monte de janelas e seus efeitos.
  • Uso muito uma aplicação de gerenciador de arquivos Krusader. Para mim, a melhor ferramenta neste segmento. Está ficando boa, aogra com o porta para o KDE 4.
  • Baixa performance, no gerenciamento das janelas, ao fazer um ALT+TAB, por exemplo ou navegar no sistema de arquivos por uma aplicação gráfica.
  • Porcarias como nepomuk, strigi, akonadi, que servem apenas consumir preciosos recursos (neste caso é só remover ou desabilitar).

Resumo da ópera, desde quando começei a usar Linux, tinha de fazer muito tweak, compilar, tunar o sistema, hoje isso já não é (tão) necessário, muita coisa já vem pronta  e sai funcionando. E eu tinha tempo de fazer isso, hoje esse tempo diminuiu.

Ontem instalei o Kubuntu 9.10, como sempre coloco as partições importantes fora do / (como o /home /usr/local /opt) então foi uma instalação tranquila. Mas para deixar o sistema do meu jeito, vou relatar abaixo os probleminhas.

Ao iniciar o sistema, a interface eth0 não pegava o IP do roteador, de jeito nenhum apesar de o ifconfig mostrar (quase) tudo certo, exceto que o IPv6 estava habilitado. No /var/log/messages, mostrava

Jan 29 22:38:07 foxhound dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 7
Jan 29 22:38:07 foxhound avahi-daemon[809]: Registering new address record for fe80::210:13ff:fe50:a343 on eth0.*.
Jan 29 22:38:14 foxhound dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 11
Jan 29 22:38:16 foxhound kernel: [ 4782.660039] eth0: no IPv6 routers present

Que caca é essa ?

O problema é que eu não tinha conexão com a internet neste computador, tive de arrumar outra conexão em outro computador e desabilitar o IPv6.

Então passei a personalizar o sistema

  • Desabilitar os efeitinhos frufru de janela
  • Desabilitar/remover nepomuk, strigi, akonadi, coisas que ficam indexando meu disco. não quero isso.
  • Coloquei as fontes true type que mais uso e são ótimas como Bitstream Vera e Tahoma. E podem ser colocadas em tamanho de 8 pixels sem distorção.
  • Desabilitei vários serviços do sistema KDE que são inicializados mas não necessários. Eles podem ser encontrados em /usr/share/autostart/
  • Desabilitei serviços do /etc/init.d que não são necessários

No geral ainda pretendo descobrir algumas otimizações, visto que o plasma consome mais memória. Fiquei satisfeito, talvez por ter um objetivo de uso diferente de home ou business office, mas com forte uso de desenvolvimento de aplicações e testes, com longos períodos de uso, preciso de algo que funcione extremamente bem, como estava funcionando. Prova disso é que que a instalação do Kubuntu 8.04 já tinha 2 anos.


Fun

Escrito por claudio at 4:49 PM categorizado por Linux e F/OSS

Tags: linux

Quarta-feira, 29 Julho 2009

Stop do DB2 sem stop

Script init.d do DB2 Express-C 9.5 para linux.

Não entendo para que colocam um argumento stop, se o script não faz nada ao invocar o stop.

Podiam colocar um echo "stop command not supported".

DB2 0wn3d !!!

case "$1" in

  start)
        log_action_begin_msg "Starting $DESC"
        /opt/ibm/db2exc/V9.5/instance/db2istrt
        if running ; then
                log_action_end_msg 0
        else
                log_action_end_msg 1
        fi
        ;;

  stop)
        ;;

  status)
    echo -n "$DESC is "
    if running ;  then
        echo "running"
    else
        echo " not running."
        exit 1
    fi
    ;;

  *)


Escrito por claudio at 11:33 AM categorizado por Linux e F/OSS

Tags: linux

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

Quinta-feira, 2 Outubro 2008

Geração de heap dump no linux 64 bits

Estou em um trabalho para um cliente envolvendo melhorias de performance na aplicação e no ambiente operacional (appserver, sistema operacional, jvm).

O ambiente é Linux 64 bits (RedHat, kernel 2.6.18 SMP), JDK 5 e Glassfish v2 ur2.

Em um dado momento, precisei gerar um heap dump, mas ocorreu um erro  sun.jvm.hotspot.debugger.UnmappedAddressException.

# /usr/local/jdk/jdk1.6.0_07/bin/jmap -J-d64 -F -dump:file=java_dump_10791.hprof  10791
Attaching to process ID 10791, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 10.0-b23
Dumping heap to java_dump_10791.hprof ...
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at sun.tools.jmap.JMap.runTool(JMap.java:178)
        at sun.tools.jmap.JMap.main(JMap.java:110)
Caused by: sun.jvm.hotspot.debugger.UnmappedAddressException
        at sun.jvm.hotspot.debugger.PageCache.checkPage(PageCache.java:208)
        at sun.jvm.hotspot.debugger.PageCache.getData(PageCache.java:63)
        at sun.jvm.hotspot.debugger.DebuggerBase.readBytes(DebuggerBase.java:205)
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.readCInteger(LinuxDebuggerLocal.java:471)
        at sun.jvm.hotspot.debugger.DebuggerBase.readAddressValue(DebuggerBase.java:442)
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.readOopHandle(LinuxDebuggerLocal.java:431)
        at sun.jvm.hotspot.debugger.linux.LinuxAddress.getOopHandleAt(LinuxAddress.java:115)
        at sun.jvm.hotspot.oops.Oop.getKlassForOopHandle(Oop.java:222)
        at sun.jvm.hotspot.oops.ObjectHeap.newOop(ObjectHeap.java:348)
        at sun.jvm.hotspot.utilities.HashtableEntry.literal(HashtableEntry.java:53)
        at sun.jvm.hotspot.memory.SymbolTable.symbolsDo(SymbolTable.java:106)
        at sun.jvm.hotspot.utilities.HeapHprofBinWriter.writeSymbols(HeapHprofBinWriter.java:830)
        at sun.jvm.hotspot.utilities.HeapHprofBinWriter.write(HeapHprofBinWriter.java:396)
        at sun.jvm.hotspot.tools.HeapDumper.run(HeapDumper.java:56)
        at sun.jvm.hotspot.tools.Tool.start(Tool.java:221)
        at sun.jvm.hotspot.tools.HeapDumper.main(HeapDumper.java:77)

Tentei gerar o dump através de:

  • -XX:+HeapDumpOnCtrlBreak and kill -3
  • jmap -heap:format=b
  • gcore utility

Com isso decidi usar o JDK 6 u7 (changelog), mas ocorreu o mesmo problema.

UPDATE: A stacktrace mostrada acima, mostra a invocação de um comando jmap do JDK 6 u7, para uma VM 6 u7.
UPDATE: Anteriormente, quando estava com JDK 5 u12, tentei rodar o jmap a partir de uma VM 5 u12, mas o mesmo erro ocorreu
UPDATE: A VM não está com a opção -Xrs option.
UPDATE: O usuário que iniciou o processo é o mesmo que usei para invocar o comando jmap, root.

UPDATE: Alan Bateman, explicou sobre o uso da opção -F "A opção -F faz como que a ferramenta se conecte no processo de uma maneira não colaborativa e pode causa a geração de um dump inconsistente. Em outras palavras, não há garantia de que será um bom heap dump ao usar a opção -F", veja este comentário em inglês na seção de comentários abaixo.

Então encontrei um bug corrigido "Throws UnmappedAddressException while reading address from core file in shared area.", entao decidi usar o JDK 6 u10 RC.

Coloquei a opção -Xshare:off

E funcionou muito bem,o processo não foi derrubado e a aplicação funcionou normalmente.

Não esqueça que no momento do heap a JVM paralisa todas as threads e o arquivo gerado será tão grande (ou um pouco menor) como a memória RSS usada pelo processo.

Então, se for gerar heap dump em linux 64 bits, use o JDK 6 u10 RC com a opção -Xshare:off.

Ao final da geração do heap dump, as mensagens abaixo foram impressas

"Finding object size using Printezis bits and skipping over..."

Obrigado Tony, pelo seu trabalho no HotSpot.

Escrito por claudio at 1:28 AM categorizado por Java

Tags: java performance linux

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, 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

Quarta-feira, 20 Fevereiro 2008

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, 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

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

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

 
     Navegue no histórico de mensagens: « First  « Prev   1 2 3 4 5   Next »  Last »