Pesquisa personalizada

2008/07/31

Facelets com o Netbeans 6.1

Para quem deseja usar o Facelets com o Netbeans 6.1, finalmente (faz até algum tempinho) saiu o plugin do Facelets para Netbeans. Tem um artigo bem básico para quem deseja saber como isso pode ser feito, veja: Introduction to Facelets. Bem, para quem tentou instalar a última versão do Facelets, seja a FCS 6.1 ou 6.1 ML (eu uso a primeira, pois prefiro usar minhas ferramentas de desenvolvimento em inglês), terá uma linda resposta, como esta (a data 200804211638 pode até estar ligeiramente diferente):
Missing required modules for Plugin Facelets Support:
JSP Parser [module org.netbeans.modules.web.jspparser/3 = 200804211638]

Para solucionar a questão, após descompactar o arquivo nbfaceletssupport-6.1.zip ou nbfaceletssupport-6.1ml.zip, você deve também descompactar o módulo org-netbeans-modules-web-frameworks-facelets.nbm (que foi extraído do anterior) e editar o arquivo que está em Info/info.xml de modo a trocar o ponto onde se faz menção a data por uma versão (eu use 1.0.0 :).

Meu arquivo original estava assim:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//NetBeans//DTD Autoupdate Module Info 2.5//EN" "http://www.netbeans.org/dtds/autoupdate-info-2_5.dtd">
<module codenamebase="org.netbeans.modules.web.frameworks.facelets" distribution="" downloadsize="0" homepage="https://facelets.dev.java.net" license="AD9FBBC9" moduleauthor="Petr Pisl &amp; Po-Ting Wu" needsrestart="false" releasedate="2008/06/04">
    <manifest AutoUpdate-Show-In-Client="true" OpenIDE-Module="org.netbeans.modules.web.frameworks.facelets" OpenIDE-Module-Display-Category="Web" OpenIDE-Module-Implementation-Version="080604" OpenIDE-Module-Java-Dependencies="Java &gt; 1.5" OpenIDE-Module-Long-Description="This module serves as a basic support for Facelets." OpenIDE-Module-Module-Dependencies="org.jdesktop.layout/1 &gt; 1.3.23, org.netbeans.api.java/1 &gt; 1.10.22, org.netbeans.api.web.webmodule &gt; 1.7.21, org.netbeans.api.xml/1 &gt; 1.13.21, org.netbeans.libs.facelets &gt; 1.0.1, org.netbeans.modules.editor/3 &gt; 1.26.21, org.netbeans.modules.editor.completion/1 &gt; 1.6.22, org.netbeans.modules.editor.lib/1 &gt; 1.9.21, org.netbeans.modules.html.editor/1 &gt; 1.5.20, org.netbeans.modules.html.editor.lib/1 &gt; 1.5.21, org.netbeans.modules.j2ee.dd/1 &gt; 1.8.20, org.netbeans.modules.java.project/1 &gt; 1.8.21, org.netbeans.modules.project.ant/1 &gt; 1.12.22, org.netbeans.modules.project.libraries/1 &gt; 1.13.21, org.netbeans.modules.projectapi/1 &gt; 1.9.21, org.netbeans.modules.projectuiapi/1 &gt; 1.13.21, org.netbeans.modules.servletjspapi/1 &gt; 1.0.20, org.netbeans.modules.web.core.syntax/2 = 1, org.netbeans.modules.web.jsf/1 &gt; 1.3.28, org.netbeans.modules.web.jspparser/3 = 200804211638, org.netbeans.modules.web.project &gt; 1.6, org.netbeans.modules.xml.core/2 &gt; 1.12.21.4, org.netbeans.modules.xml.xam/1 &gt; 1.2, org.netbeans.modules.xml.xdm/1 &gt; 1.2, org.netbeans.spi.palette/1 &gt; 1.6.1, org.openide.awt &gt; 6.7.22, org.openide.dialogs &gt; 6.5.21, org.openide.explorer &gt; 6.5.21, org.openide.filesystems &gt; 6.4.21, org.openide.loaders &gt; 5.9.21, org.openide.modules &gt; 6.5.22, org.openide.nodes &gt; 6.7.21, org.openide.options &gt; 6.7, org.openide.text &gt; 6.9.21, org.openide.util &gt; 6.8.21, org.openide.windows &gt; 6.5.21" OpenIDE-Module-Name="Facelets Support" OpenIDE-Module-Requires="org.openide.modules.ModuleFormat1" OpenIDE-Module-Short-Description="Support for development of web applications based on Facelets." OpenIDE-Module-Specification-Version="1.0.6"/>
    <license name="AD9FBBC9">[NO LICENSE SPECIFIED]
</license>
</module>

Ao invés de se fazer menção a um release de uma data específica, devemos fazer com que o módulo seja, digamos, um pouco menos exigente (ou menos estúpido!) e para isso devemos fazer com que ele utilize como referência uma versão mínima, por exemplo. Ao fim, o meu ficou assim:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//NetBeans//DTD Autoupdate Module Info 2.5//EN" "http://www.netbeans.org/dtds/autoupdate-info-2_5.dtd">
<module codenamebase="org.netbeans.modules.web.frameworks.facelets" distribution="" downloadsize="0" homepage="https://facelets.dev.java.net" license="AD9FBBC9" moduleauthor="Petr Pisl &amp; Po-Ting Wu" needsrestart="false" releasedate="2008/06/04">
        <manifest AutoUpdate-Show-In-Client="true" OpenIDE-Module="org.netbeans.modules.web.frameworks.facelets" OpenIDE-Module-Display-Category="Web" OpenIDE-Module-Implementation-Version="080604" OpenIDE-Module-Java-Dependencies="Java &gt; 1.5" OpenIDE-Module-Long-Description="This module serves as a basic support for Facelets." OpenIDE-Module-Module-Dependencies="org.jdesktop.layout/1 &gt; 1.3.23, org.netbeans.api.java/1 &gt; 1.10.22, org.netbeans.api.web.webmodule &gt; 1.7.21, org.netbeans.api.xml/1 &gt; 1.13.21, org.netbeans.libs.facelets &gt; 1.0.1, org.netbeans.modules.editor/3 &gt; 1.26.21, org.netbeans.modules.editor.completion/1 &gt; 1.6.22, org.netbeans.modules.editor.lib/1 &gt; 1.9.21, org.netbeans.modules.html.editor/1 &gt; 1.5.20, org.netbeans.modules.html.editor.lib/1 &gt; 1.5.21, org.netbeans.modules.j2ee.dd/1 &gt; 1.8.20, org.netbeans.modules.java.project/1 &gt; 1.8.21, org.netbeans.modules.project.ant/1 &gt; 1.12.22, org.netbeans.modules.project.libraries/1 &gt; 1.13.21, org.netbeans.modules.projectapi/1 &gt; 1.9.21, org.netbeans.modules.projectuiapi/1 &gt; 1.13.21, org.netbeans.modules.servletjspapi/1 &gt; 1.0.20, org.netbeans.modules.web.core.syntax/2 = 1, org.netbeans.modules.web.jsf/1 &gt; 1.3.28, org.netbeans.modules.web.jspparser/3 = &gt; 1.0.0, org.netbeans.modules.web.project &gt; 1.6, org.netbeans.modules.xml.core/2 &gt; 1.12.21.4, org.netbeans.modules.xml.xam/1 &gt; 1.2, org.netbeans.modules.xml.xdm/1 &gt; 1.2, org.netbeans.spi.palette/1 &gt; 1.6.1, org.openide.awt &gt; 6.7.22, org.openide.dialogs &gt; 6.5.21, org.openide.explorer &gt; 6.5.21, org.openide.filesystems &gt; 6.4.21, org.openide.loaders &gt; 5.9.21, org.openide.modules &gt; 6.5.22, org.openide.nodes &gt; 6.7.21, org.openide.options &gt; 6.7, org.openide.text &gt; 6.9.21, org.openide.util &gt; 6.8.21, org.openide.windows &gt; 6.5.21" OpenIDE-Module-Name="Facelets Support" OpenIDE-Module-Requires="org.openide.modules.ModuleFormat1" OpenIDE-Module-Short-Description="Support for development of web applications based on Facelets." OpenIDE-Module-Specification-Version="1.0.6"/>
    <license name="AD9FBBC9">[NO LICENSE SPECIFIED]
</license>
</module>

Além disso, você terá que editar o arquivo META-INF/manifest.mf que se encontra dentro de netbeans/modules/org-netbeans-modules-web-frameworks-facelets.jar (novamente extraia o contéudo do arquivo, pois está dentro dele) e fazer a mesma coisa que fizemos com o arquivo info.xml. Após isso, monte novamente o arquivo org-netbeans-modules-web-frameworks-facelets.jar e coloque-o em netbeans/modules/ e finalmente monte o arquivo org-netbeans-modules-web-frameworks-facelets.nbm. E pronto! Isso será suficiente para o usarmos com o Netbeans 6.1!

Módulo Já Corrigido

Por comodidade, talvez você queira usar o pacote já pronto com as alterações que relato acima; baixe-o aqui: nbfaceletssupport-6.1.zip. Com as alterações que fizemos, ele irá (em princípio) funcionar em qualquer versão do Netbeans 6.xxx.

Thanks To

The JJ Blogger - Java, Oracle, PostgreSQL, and More... - If you need help installing Facelets with netbeans 6.1 or later and don't understand portuguese, see this post.
Po-Ting Wu's Weblog

Labels: ,

2008/07/30

Ć (C Acentuado) vs. Ç (C Cedilha) no Firefox32 rodando num AMD64 com Kubuntu 64 Bits

Eu uso um Kubuntu Hardy (Ubuntu 8.04.1) 64 bits rodando numa máquina AMD64 e opto preferencialmente por programas 64 bits, pois não vejo o menor sentido em ficar usando software 32 bits em máquinas de 64 - totalmente nosense. No entanto, devido as limitações do Firefox 64 bits (falta de plugins, incluindo suporte a applets Java, Flash e alguns add-ons Firefox), fui obrigado (após muito relutar!) usar o Firefox 32 Bits. Pois só nele encontro o suporte aos recursos que normalmente utilizo.

Instalação do Firefox 32 Bits

Já faz muito tempo que utilizo essa solução, mas sempre que preciso instalar o Firefox 32 bits com seus plugins e tudo mais desejável, opto por um script que automatiza o processo de instalação (sim sou newbie, e daí?!). O script de instalação do Firefox32 (para várias versões e sabores) pode ser encontrado, em: Howto Install 32 bit Firefox with Flash w/sound and Java for AMD64.

Praga: Ć ao invés de Ç

Meu sistema está configurado para a língua inglesa, ou mais precisamente, inglês estadunidense. Meu teclado não tem a tecla com Ç e realmente odeio teclados ABNT/ABTN 2. Meu teclado é no formato americano internacional e ao invés do cedilha, tem uma tecla com vírgula.

Quem tem essa configuração, sabe que é um desafio acentuar corretamente com o c cedilha. Normalmente teclariamos a tecla com a aspa simples (ou apóstrofo, ou ainda o acento agudo) e em seguida teclariamos o C. Bem, no meu caso isso não resolve e tive que sair em busca de uma solução. Aos poucos fui soluciando o problema em diferentes lugares.

Aplicações: QT (e KDE)

Ao contrário de quem usa o Ubuntu, a galera do Kubuntu vai querer configurar o QT (e KDE) de modo que suas aplicações possam usar o ' + c para fazer o ç. Para isso, edite o arquivo que se encontra em /usr/share/X11/locale/en_US.UTF-8/Compose e substitua todos os Ć por Ç e ć por ç. Se preferir, use o script abaixo:

sudo -i
cd /usr/share/X11/locale/en_US.UTF-8
cp Compose Compose.original
cat Compose.original | sed -e 's/Ć/ć/' -e 's/Ç/ç/' > Compose
exit

Se você estiver usando ISO-8859-1 ao invés de UTF8, provavelmente a modificação acima não será necessária no arquivo Compose equivalente, pois ao menos na minha máquina ele está mapeado corretamente (entenda "corretamente" como: correto para o uso que se espera aqui no Brasil, pois em muitos paises da Europa se utiliza o c com acento agudo). No meu caso, a variável de ambiente LANG está configurada para en_US.UTF8.
E antes que alguém indague: sim, prefiro usar meu OS em inglês que em português e até pagaria para não ter meu OS em português!

Configurando o GTK

Antes de mais nada: ODEIO GTK e IGUALMENTE, ODEIO GNOME.

Para usar o ç (c cedilha) em aplicações GTK, e isso inclui o Gnome, você terá que alterar o arquivo /usr/lib/gtk-2.0/2.10.0/immodule-files.d/libgtk2.0-0.immodules de modo a acrescentar a lingua inglesa na lista de linguagens do módulo cedilla. Para isso, altere a linha:

"cedilla" "Cedilla" "gtk20" "/usr/share/locale" "az:ca:co:fr:gv:oc:pt:sq:tr:wa"

De modo que fique assim:
"cedilla" "Cedilla" "gtk20" "/usr/share/locale" "en:az:ca:co:fr:gv:oc:pt:sq:tr:wa"

Isso dirá a GTK que o módulo cedilla - responsável pelo reconhecimento do pressionamento '+c como ç - se aplique, também, a língua inglesa. Obviamente, isso só é necessário se você estiver usando inglês como língua em seu OS ou aplicativo. Para saber qual a sua configuração atual, vá no console (konsole) e digite:
locale
No meu caso, está configurado para:
LANG=en_US.ISO-8859-1
LANGUAGE=en_US:en
LC_CTYPE=en_US.utf8
LC_NUMERIC=en_US.utf8
LC_TIME=pt_BR
LC_COLLATE=en_US.utf8
LC_MONETARY=pt_BR
LC_MESSAGES=en_US.utf8
LC_PAPER=pt_BR
LC_NAME=pt_BR
LC_ADDRESS=en_US.utf8
LC_TELEPHONE=pt_BR
LC_MEASUREMENT=pt_BR
LC_IDENTIFICATION=en_US.utf8
LC_ALL=
Você pode controlar esses valores por intermédio do arquivo de configuração /etc/environment. No meu caso, o arquivo está configurado, como:
JAVA_HOME=/opt/jdk1.6.0_06/jre

KDE_NO_IPV6=true
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"

LANGUAGE="en_US:en"
LANG="en_US.UTF-8"
Esse valores também podem ser controlados pelo arquivo de configuração /etc/default/locale.

Você deve forçar a GTK a carregar o módulo cedilla. Para isso, você terá que ter uma variável de ambiente chamada GTK_IM_MODULE e ela deverá ter o valor cedilla. Se essa variável não explicitar o módulo cedilla, ele não será carregado e você não terá o c cedilha, mas sim o c acentuado, mesmo que tenha acrescentado o "en" no arquivo libgtk2.0-0.immodules.
Essa variável de ambiente pode ser configurada em qualquer um de vários lugares, como:

/etc/environment
~/.profile
/etc/profile.d/
Se quiser, simplesmente rode:
sudo -i
echo "export GTK_IM_MODULE=cedilla" >> /etc/environment
exit

O Teste

Após fazer as alterações para a correta acentuação do sistema, você deverá reiniciar o X (interface gráfica), para isso, pode simplesmente reiniciar a máquina ou pressionar: CTRL + ALT + BACKSPACE. Você verá que as aplicações estão acentuando corretamente, tanto as QT, quanto GTK.

Firefox32 num Linux 64 bits

Quando você entrar no seu Firefox 32 bits ficará muito surpreso ao ver que somente ele não acentua corretamente! Se você iniciá-lo do console, verá uns avisos, assim:

usuario@maquina:~$ firefox

(firefox-bin:11868): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libqtengine.so: wrong ELF class: ELFCLASS64

(firefox-bin:11868): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libqtengine.so: wrong ELF class: ELFCLASS64
FoxyProxy settingsDir = /home/usuario/.mozilla/firefox/rb9nj3cx.default

(firefox-bin:11868): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/immodules/im-cedilla.so: wrong ELF class: ELFCLASS64

(firefox-bin:11868): Gtk-WARNING **: Loading IM context type 'cedilla' failed

(firefox-bin:11868): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/immodules/im-cedilla.so: wrong ELF class: ELFCLASS64

(firefox-bin:11868): Gtk-WARNING **: Loading IM context type 'cedilla' failed

(firefox-bin:11868): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/immodules/im-cedilla.so: wrong ELF class: ELFCLASS64

(firefox-bin:11868): Gtk-WARNING **: Loading IM context type 'cedilla' failed

Eu perdi muito tempo tentando entender o porquê disso. Pois conforme se vê acima, a GTK tenta carregar uma biblioteca 64 bits para uma aplicação que é 32 bits... Ao invés de carregar /usr/lib/gtk-2.0/2.10.0/immodules/im-cedilla.so, ela deveria carregar: /usr/lib32/gtk-2.0/2.10.0/immodules/im-cedilla.so. Obviamente ela não vai conseguir carregar o módulo de 64 bits, pois o Firefox que usamos é 32 bits. Só que isso é consequência, não é a razão do problema. E eu não consegui descobrir o porquê e se você pesquisar muito na Internet, verá que ninguém conseguiu, também.

Bem, compreendendo o fato dele estar tentando carregar uma biblioteca de 64 bits ao invés da que deveria e que essa biblioteca é o módulo que desejamos que seja carregado, pois ele fará nosso ç e que também:

  • O módulo a ser carregado pela GTK é informado na variável de ambiente GTK_IM_MODULE;
  • Há uma versão da GTK para 64 bits e outra para 32 bits. Logo, haverá dois arquivos de configuração desses módulos e para cada módulo uma versão de acordo com a arquitetura;
  • O Firefox32 está, por alguma razão desconhecida, carregando o módulo de 64 bits. Após testes, verifiquei que a GTK também só lia o arquivo /usr/lib/gtk-2.0/2.10.0/immodule-files.d/libgtk2.0-0.immodules - que é de 64 bits -, mas não o arquivo para a configuração de 32 bits /usr/lib32/gtk-2.0/2.10.0/immodule-files.d/libgtk2.0-0.immodules;
  • Sei que ao menos aplicações GTK de 64 bits estão formando o c cedilha corretamente. Isso graças as configurações que foram realizadas anteriormente. Sendo assim, é desejável preservá-las;

Como não encontrava nenhuma solução para o problema e observado o já exposto, pensei em fazer o Firefox32 ao invés de usar o módulo GTK cedilla de 64 bits, usar o equivalente para 32 bits. Tudo preservando as configurações para as outras aplicações.

A Solução para Ç no Firefox32

O que fiz foi copiar a biblioteca im-cedilla.so de 32 bits para a pasta de módulos IM de 64 bits da GTK e, claro, a renomeei - dei o nome im-cedil32.so. Também, alterei o arquivo da configuração de 64 bits da GTK dos módulos IM para contemplar o "novo" módulo im-cedil32.so. O módulo internamente faz referência a seu próprio nome e por isso, tive que editar o arquivo (usei o khexedit, mas você poderia usar qualquer editor binário) e alterar no braço as referências a cedilla para cedil32.
Pronto. Funcionou! Isso foi o "suficiente".

Abaixo o script para reproduzir o que realizei:
sudo -i
cd /usr/lib/gtk-2.0/2.10.0/immodules/
cp /usr/lib32/gtk-2.0/2.10.0/immodules/im-cedilla.so /tmp/im-cedilla.32bits.so
apt-get install bbe
bbe -e s/edilla/edil32/ /tmp/im-cedilla.32bits.so | sudo bbe -e s/type_cedil32/type_cedilla/ -o im-cedil32.so
cd ../immodule-files.d/
echo "\
\"/usr/lib/gtk-2.0/2.10.0/immodules/im-cedil32.so\"
\"cedil32\" \"Cedil32\" \"gtk20\" \"/usr/share/locale\" \"az:ca:co:fr:gv:oc:pt:sq:tr:wa:en:us\"
" >> libgtk2.0-0.immodules
exit

Se precisar, pode pegar o binário que foi criado no passo acima, aqui: im-cedil32.so

E finalmente alteramos o script de inicializaćão (e de agora em diante escrevermos inicialização) do Firefox 32 bits para que ele sempre inicialize a variável de ambiente GTK_IM_MODULE para cedil32 ao invés de cedilla. Para isso, localize o script de inicialização do Firefox32 e modifique-o de modo a acrescentar a variável de ambiente que precisamos. Coloque isso logo no início do script.

Após, seu script de inicialização do Firefox32 conterá a seguinte linha em destaque:
## the mozilla-bin binary to work.
##

export GTK_IM_MODULE=cedil32

moz_pis_startstop_scripts()
{
  MOZ_USER_DIR=".mozilla/firefox"
  # MOZ_PIS_ is the name space for "Mozilla Plugable Init Scripts"

Uma forma diferente de fazer Ç ccedilha

Para fazer o C cedilha em qualquer aplicação, mesmo sem ter que fazer nada do que relato anteriormente, basta usar: ALT_DIR + , + c. Só serve a tecla ALT da direita, não serve a da esquerda.

Eu ainda prefiro: ´ + c
;)

Labels: ,

2008/07/24

Radiohead: Karma Police

2008/07/22

Java: Sound at my Linux machine... It's ridiculous!

All right... Where is the sound?
I love my Kubuntu box, but I'm unable to play any sound from Java. Why? I think that the JVM needs exclusive access to the sound system, otherwise, nothing is played, or, other times, errors of kind LineUnavailableException are throwed. And, yes, I'm already using ALSA. It's serious, 'cause, except when I have exclusive access to the sound system, nothing bellow are working:

  • Toolkit.getDefaultToolkit().beep()
    No beep...
  • File file=new File("/opt/jdk1.6.0_06/demo/applets/JumpingBox/sounds/danger.au");
    AudioClip audioClip = Applet.newAudioClip(file).toURI().toURL();
    audioClip.loop();
    audioClip.play();

    No sound (or error)... nothing
  • System.out.print("\007");
    System.out.flush();

    No beep here, too..
  • String[] cmd = {"sh", "-c", "printf \"\\7\""};
    Runtime.getRuntime().exec(cmd);

    Again, nothing..

After search about this, I check that the current Java version (Hotspot 1.6.0_06) has some limitations about the sound. To Java share (and play) the sound system with others applications, the sound board needs to have mixer feature by hardware - software emulation isn't supported by Java. If another application is using the sound system, Java cannot play nothing. It's very displeasure.. because to listen a simple "beep" from my Java application, I must disable all other application that do sound usage.

Workaround = Gambiarra or Cat (brazilian ;)

To play some audio file with my Java application, I can do:
String path = "/opt/jdk1.6.0_06/demo/applets/JumpingBox/sounds/danger.au";
String[] cmd = {"sh", "-c", "aplay " + path};
Runtime.getRuntime().exec(cmd);
To generate some kind of noise (sound), uses:
String data = "09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azAZ";
data += "09aZAz09aZAz09aZAz09aZAz09aZAz";
data += "09aZAz09aZAz09aZAz09aZAz09aZAz";
String[] cmd = {"sh", "-c", "echo " + data + " | aplay -r 4"};
Runtime.getRuntime().exec(cmd);

Also we can use the festival to "say" "Beep, Beep, Beep" (or anything else). See:

String text = "Beep, Beep, Beep";
String[] cmd = {"sh", "-c", "echo \"" + text + "\" | festival --tts" };
Runtime.getRuntime().exec(cmd);

But now, if we want to create our wav sound data and play it on the fly, just do:

/** 
 * Sound utility class. 
 * @author Marcio Wesley Borges marciowb@gmail.com
 * @version 0.001, 2008-07-22
 */
public final class SoundUtil {
        
private static final AudioFormat AF = new AudioFormat(8000f, 8, 1, true, false);

public static boolean isSoundWorking() {
    SourceDataLine sdl = null;
    try {
        sdl = AudioSystem.getSourceDataLine(AF);
        sdl.open(AF);
    } catch (LineUnavailableException ex) {
        return false;
    } finally {
        if (sdl!=null)
            sdl.close();
    }
    return true;
}

public static void beep() {
    if (isSoundWorking())
        Toolkit.getDefaultToolkit().beep();
    else
        mimeBeep();
}

private static void mimeBeep() {

    final int SAMPLE_RATE = 8000; // sample per second
    final int SAMPLE_PER_MS = SAMPLE_RATE/1000; // sample per ms

    //make your adjustments here
    final int HZ = 400; // Frequency in hertz
    final int MSECS = 50; // Duration        

    final byte[] raw = new byte[MSECS * SAMPLE_PER_MS]; //duration_ms * (sample per ms)
    for (int i = 0; i < raw.length; i++) {
        double angle = i / (SAMPLE_RATE / (double) HZ) * 2.0d * Math.PI;
        raw[i] = (byte) (Math.sin(angle) * 81.11d);
    }

    final String[] cmd = {"sh", "-c", "aplay -c1 -fU8 -r" + SAMPLE_PER_MS };

    Process p = null;
    try {
        p = Runtime.getRuntime().exec(cmd);
        p.getOutputStream().write(raw);
        p.getOutputStream().close();
        Thread.sleep(MSECS+30); //Wait the outer process to play.
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        if (p!=null)
            p.destroy();
    }
}

public static void main(String[] args) {
    beep();
}

}//end class SoundUtil

Thanks to

Labels: , ,

2008/07/21

Java: Better Performance

I was searching about some flags to pass to my Sun Hotspot JVM (I'm using Java HotSpot(TM) 64-Bit Server VM (build 10.0-b22, mixed mode) at Kubuntu Hardy with an AMD64) and I found a most complete reference that I found until now; see in the page: jdk6options.html.

Assorted Java performance tips can be found at Java Performance Tuning.

Labels: ,

2008/07/16

Stardict: A alternativa Linux para o Babylon

Babylon

Não sei você, mas eu não vivo sem o Babylon. Para quem não sabe o Babylon, em minha opinião, é o programa mais versátil de tradução que existe para Windows. Acredite, ou não, eu pago por ele desde a versão 3.2. E já adquiri alguns glossários premium, como o Michaelis e os da Oxford. A questão é que em meu notebook, eu só uso Linux, mais propriamente o Kubuntu e só tenho Windows via VMWare - que só uso quando extritamente necessário. Apesar de já usar Linux diariamente desde 2005, tem certos programas que realmente fazem falta: Adoro o Dreamweaver, por exemplo; e em contrapartida odeio (queimem vivos os desenvolvedores dele) o Quanta Plus. Mas se tem um programa que realmente faz falta para mim, é o Babylon.

A cada seis meses eu pesquiso por alguma solução de dicionário semelhante ao Babylon, não quero nada diferente. Se igual, melhor. Quero com um simples clique selecionar uma palavra ou texto e ver a tradução imediatamente, tudo de forma simples, rápida e sem me atrapalhar.
Até ontem, desconhecia tal solução, mas hoje, eis que descobri o Stardict.

Bem, agora sim meu nix está completo! (Ou quase... mas ainda chega lá!)

Stardict

Stardict - dicionário em um clique para Linux

O Stardict é um programinha que é bem similar ao bem afamado Babylon, só que o Stardict é open source e gratuito! Funciona em Linux, (a galera é boazinha) Windows e Mac OSX.

Para instalá-lo no Ubuntu ou Kubuntu, use:

sudo apt-get install stardict stardict-common stardict-gnome stardict-plugin stardict-plugin-espeak stardict-plugin-festival stardict-plugin-spell stardict-tools

Eu imagino que nem todos os pacotes acima sejam necessários, mas da primeira vez eu instalei somente os pacotes que eu julguei necessário, e após instalar os dicionários, a definição do termo não aparecia, ao invés era exibida a seguinte mensagem: "HTML data parsing plug-in is not found". Por isso, instalei todos os pacotes, conforme dica que segui no forum do Ubuntu italiano.

Há uma versão online do Stardict, tanto html, quanto AJAX, em: www.stardict.org.

Dicionários

O Stardict permite usar glossários oriundos de várias fontes, tanto de arquivos locais, quanto via TCP (usando o dictd, por exemplo). Além disso, há vários utilitários que podem ser usados para converter glossários em outros formatos que não os usados diretamente pelo Stardict. É possível (e usual) até converter glossários inteiros do próprio Babylon para o Stardict.

Há vários glossários para stardict, prontos para serem usados. Acho interessante a seguinte série: stardict-dict-babylon - dicionários já convertidos do Babylon para o Stardict.
Quer ter a Wikipedia inteira e usá-la quando bem entender, mesmo offline? Bem, tá lá. Tem a Wikipedia e muito, muito, muito mais. São centenas de dicionários prontos para serem usados. Acesse o repositório de arquivos do Stardict no Sourceforge.net.

O processo de instalação dos dicionários Stardict, é bem simples (obviamente falo para o padrão Linux... e não Windows), veja:

  1. Baixe o dicionário que deseja;
  2. Descompacte o arquivo e você terá um diretório com arquivos de extensão, como: .ifo, .dict.dz, .syn, .idx, não necessariamente todos estes.
  3. Cópie o diretório do passo anterior, para: /usr/share/stardict/dic/.
Exemplo:

cd /tmp
wget http://sourceforge.net/project/downloading.php?groupname=stardict&filename=stardict-babylon-Concise_Oxford_Thesaurus-2.4.2.tar.bz2&use_mirror=ufpr
cd /usr/share/stardict/dic
tar -xvvjf /tmp/stardict-babylon-Concise_Oxford_Thesaurus-2.4.2.tar.bz2

Após instalar os dicionários, é necessário reiniciar o Stardict para que ele reconheça os dicionários que foram instalados.

Convertendo dicionários do Babylon

Para realizar a conversão de um dicionário qualquer do Babylon, você vai precisar de uma ferramenta chamada dictconv - ela realiza a conversão dos dicionários no formato Babylon (.BGL) para o Stardict. Você terá que baixá-la e compilá-la. Siga:

cd /tmp
wget http://downloads.sourceforge.net/ktranslator/dictconv-0.2.tar.bz2
tar -xvvjf dictconv-0.2.tar.bz2
cd dictconv-0.2
./configure
make
sudo make install

No exemplo abaixo, nós iremos baixar um dicionário no formato Babylon, extrair seus dados, corrigir o arquivo gerado, criar o dicionário para o Stardict, corrigir a flag de html e copiá-lo para o diretório de dicionários do Stardict. Veja:

cd /tmp
mkdir convertdict
cd convertdict

wget http://www.babylon.com/files/premium/michaelis/michaelis_ptg_ptg.bgl
dictconv -o michaelis_ptg_ptg.dic michaelis_ptg_ptg.bgl
cat michaelis_ptg_ptg.dic | sed 's/\$[0-9][0-9]*\$\t/\t/' > michaelis_ptg_ptg_fixed.dic
/usr/lib/stardict-tools/tabfile michaelis_ptg_ptg_fixed.dic
cat michaelis_ptg_ptg_fixed.ifo | sed 's/sametypesequence=m/sametypesequence=h/' > michaelis_ptg_ptg_fixed.ifo.html
mv michaelis_ptg_ptg_fixed.ifo.html michaelis_ptg_ptg_fixed.ifo

sudo mkdir /usr/share/stardict/dic/michaelis_ptg_ptg
sudo cp michaelis_ptg_ptg_fixed.* /usr/share/stardict/dic/michaelis_ptg_ptg/

O exemplo acima já modifica o arquivo .ifo setando a flag que informa se há ou não html no texto do dicionário. Em se tratando de dicionários do Babylon, sempre há html em meio ao texto e nós iremos querer renderizá-la adequadamente. Por isso, setamos a flag de forma que fique, assim sametypesequence=h. O default (que não queremos) é sametypesequence=m e torna bastante desagradável a leitura do dicionário.

Festival: Habilitando TTS Sintetizado

Se você instalou o Festival e ainda não consegue sintetizar o som, talvez seja melhor você forçá-lo a usar ALSA ao invés de OSS. Eu não conseguia reproduzir sons com o Festival (ele é usado pelo Stardic) e recebia a seguinte mensagem de erro:
Linux: can't open /dev/dsp
Após muito pesquisar, encontrei a solução num forum. Use o seguinte comando:

cd ~ && printf ";use ALSA\n(Parameter.set 'Audio_Method 'Audio_Command)\n(Parameter.set 'Audio_Command \"aplay -q -c 1 -t raw -f s16 -r \$SR \$FILE\")\n" > .festivalrc

RealPeopleTTS

O Stardic permite que se utilize um banco de wavs com sons pronunciados (falado e gravado) por pessoas reais, ao invés da sintetização. São mais de 21000 palavras, cada uma gravada em um arquivo .wav correspondente.

Para instalar esse banco de wavs, use:
cd /tmp
wget http://ufpr.dl.sourceforge.net/sourceforge/stardict/WyabdcRealPeopleTTS.tar.bz2
cd /usr/share
sudo tar -xvvjf /tmp/WyabdcRealPeopleTTS.tar.bz2

Eu estou usando o Kubuntu Hardy e tive que perder um pouco de tempo até descobrir o porquê do Stardic não estar reproduzindo as wavs com os sons das palavras. Era por causa do esd, conforme observei num forum. O Stardic utiliza-o em sua reprodução e por isso ele deve ser iniciado juntamente com a sessão do KDE - coisa que não estava sendo feita. Portanto, antes de iniciar o Stardic, certifique-se de que o esd está rodando.
Eu optei por colocá-lo para rodar automaticamente quando do início de uma sessão do KDE, e para isso, fiz:

cd ~/.kde/Autostart
ln -s /usr/bin/esd esd

Babylon ou Stardict?

Ainda não usei o Stardict no meu Vista (odeio Vista, prefiro XP), mas posso dizer que em todos os quesitos estou satisfeito com o Stardict; em nada fica devendo ao Babylon. Quer ver? Olhe as vantagens do Stardict:

  • Extensibilidade: suporte a plugins, e já sai do forno com vários;
  • TTF sintetizado e real;
  • Possibilidade de se usar qualquer TTF que se queira;
  • Pode-se usar qualquer banco de wavs;
  • Várias opções de pesquisa: simples, full text, parcial, curingas, fuzzy;
  • Sugestões fonéticas;
  • Rápido - até muito mais rápido que o Babylon - tanto para iniciar, quanto para pesquisar;
  • Tradução de textos inteiros ou de palavras;
  • Disponibilidade: pode ser usado em várias plataformas;
  • Imensurável número de dicionários: dos melhores e mais conhecidos aos mais específicos;
  • Integrável: compatível com webservices e com tecnologias já existentes, como o dict;
  • Farta disponibilidade de ferramentas para conversão de dicionários já existentes, inclusive os da própria Babylon, bem como de vários outros formatos, além, claro, da criação e edição de seus próprios dicionários;
  • open source;
  • gratuito;
Janela principal do Stardict

tee = Smartphones || Java Programmers

Para desenvolvedores Java, há um porte do Stardic de potencial interesse: TeeDict (AKA jStarDict). Há versões do jStarDict para diversos smartphones, Palms e desktop. E, acredite, você irá gostar de tê-lo instalado em seu celular. Tudo de graça e open source!

Babylon/Windows com Cleartype

O Babylon não funciona quando o ClearType está habilitado. O ClearType pode ser habilitado no Windows XP e já é padrão no Windows Vista. Portanto, onde é necessário que o Babylon utilize o OCR, ele irá falhar se o ClearType estiver ativo.

Outra lastima (ao menos para mim que sou um trouxa e pagou pelo Babylon 3/4 e 7) é que ele não captura textos do Firefox e uma tonelada de outros programas. Para mim, está quase imprestável! Pois sou obrigado a todas as vezes digitar manualmente o texto. Horrível!

Qualquer hora dessas me aventuro a dar uma melhorada no Stardict e não será difícil ter algo melhor que o Babylon no meu Windows Vista 64.

Referências

Labels: ,

2008/07/12

Satyagraha: O Bom Agente e o Paciente

Quem liga? Já estamos acostumados... Quem já está acostumado?! Absurdo!
Gil, ao refletir sobre o que iria colocar aqui, cheguei a conclusão que já foi colocado. Você foi colocado no topo, na ponta, no pico, do cume.. está sentado no topo da PI*$-râmide. Por isso, para você, do fundo do coração, quero dedicar esta música que ressoa em nossos corações:

Inspiração: Satyagraha

Satyagraha, vem do sânscrito e é a junção de: satya 'verdade' + āgraha 'obstinação'. Portanto poderiamos traduzir como busca pela verdade ou obstinação pela verdade. Termo muito apropriado para designar milhares de horas de gravação, investigação, infiltração, dedicação, inteligência e a persistência para se apurar a verdade no mais recente caso envolvendo um dos homens mais poderosos do Brasil e sua súcia. Grupo que segundo o que está sendo publicado nos meios de comunicação, lameia todo o sistema e de área de atuação indeterminada, sem escrúpulos e com facilidade, profissionalismo, acesso e meios para dificultar ao máximo a obtenção da verdade. Geralmente eu gosto dos nomes usados pela PF para batizar suas operações, mas esse foi mais que apropriado. E a resistência, neste caso, é por parte do "paciente".

Acusado = Paciente

Me surpreendi ao saber que o réu, segundo informações confiáveis, realmente é chamado de paciente nestes processos que se atolam pelo lodo do judiciário.
Bem, resolvi, portanto, procurar a definição de PACIENTE, pois em minha suprema e arrogante ignorância, este deveria ser aquele tratado por médicos ou coisa parecida. E segundo o "pai dos burros", se usado como adjetivo, pode significar:

  • Resignado, conformado.
  • Que espera serenamente um resultado; tranqüilo
Bem, realmente o adjetivo "paciente" não se aplica ao caso. As ações do Dantas em nada lembram as de alguém que esteja resignado ou que serenamente aguarda a conclusão das investigações e o conseqüente (quero acreditar) julgamento.

Já, como substantivo, poderia significar:

  • Réu ou ré que vai padecer a pena capital; padecente;
  • Jur. Vítima;
  • Dir. Vítima de abuso ou de ilegalidade do poder;
  • Filos. O que sofre ou é objeto de uma ação.
Bem, sou contra pena de morte e felizmente nesse país não a temos, mas o Dantas, ao que tudo indica (provas já apuradas), não é vítima, exceto de suas próprias escolhas ou ações. Não há ainda um processo formal contra ele advindo da operação Satiagraha.

O cara é acusado de tanta coisa, mais tantas, que dizem que se somadas dão mais da metade do código penal. Imagino que só não tenha estupro, porque em se tratando de sexo, ele deve ter dinheiro para pagar, assim como tem para pagar pelos custos dos reiterados Habeas Corpus que conseguiu até agora. Só para citar algumas acusações que consegui checar, encontrei:

  • uso de informações privilegiadas;
  • evasão de divisas;
  • lavagem de dinheiro;
  • gestão fraudulenta;
  • operar instituição financeira sem autorização;
  • formação de quadrilha;
  • empréstimos irregulares;
  • tráfico de influência;
  • incitação ao crime;
  • apologia ao crime;
  • corrupção ativa.

Mensalão

Quem procurar, verá que a operação Satyagraha é um desdobramento do caso Mensalão. Todo mundo sabe (e espera) que o governo, os governantes e o PT tem o rabo preso. De fato tem gente que diz, e Dantas é um deles, que essa investigação foi motivada por perseguição política. Bem, ainda não chegou a hora do PT ou de nossos governantes, mas chegou a hora deles, de Dantas e sua turma, e os indícios de crimes são muitos. De qualquer forma, para quem não se lembra, foi Dantas quem doou din-din para a empresa Gamecorp, de Fábio Luís Lula da Silva - sim, filho do Lula. Apesar disso, por algum motivo, a relação Dantas e PT não anda bem. Talvez pelo fato de ser próximo dos partidários de FHC e não ter contribuido com tanto quanto o governo Lula ou o PT esperavam - ao menos o Dantas acusa o governo Lula de tentativa de extorsão em diversos momentos.

Cagada no Supremo

Disso tudo, o que me deixa surpreso é saber que um presidente-ministro do STJ manda reiterada vezes soltar o Dantas, mesmo sob pedido da PF e Min. Público para que fique preso para maior apuração do(s) caso(s). Como é possível que uma pessoa chegue a tal posição e não tenho o dicernimento necessário para averiguar a real necessidade do cumprimento de tal pedido? É um absurdo!

O mesmo sujeito que manda soltar o Dantas, tem a capacidade de chamar a PF e seu corpo de agentes - que neste caso, merece elógios pela sua atuação na operação - de "canalhas" e "gângsteres". E também realiza um absurdo e covarde ataque contra um juiz de instância inferior, em tom de intimidação e perseguição pública.

Existem pessoas sensatas nestes país. Sei que há um jogo, um tabuleiro e os interessados jogam conforme favoreçam sua própria sorte e interesses, mas ainda assim, acredito que exista uma democrácia, uma constituição e o ideal fazer e manter um país livre, com soberânia, responsabilidade e a esperada ordem e progresso. Até acredito que se atinja a ordem pelo caos absoluto, mas isso seria demasiadamente destrutivo para uma sociedade.

Sei que os procuradores, delegados e juizes manifestaram - e meus aplausos pela iniciativa - repúdio total pela atitude do ministro chefe do STF em liberar em poucas horas de cana um potencial agente agressor e contaminante global do sistema.

Sei também que o cara até tem motivos para estar puto com a PF, pois recentemente achou (e deve ter se desesperado) seu nome em uma lista de criminosos, mas, como se observou depois, era, infelizmente, um homônimo. Mas, por estar puto ou não, já há quem diga que "O ministro perdeu a serenidade". Afinal ele manda soltar um cara após a polícia ter feito o flagrante (e filmado) de corrupção ativa de dois agentes que estariam a mando de Dantas a um delegado pelo pequeno valor de USD$ 1 milhão. Depois, o que se diz é clichê: "só vai preso neste país quem é pobre". Na verdade o rico até vai preso, mas aí se algum juiz não soltar, o STF solta, nem que seja pelas mãos do próprio presidente do STF.

Para não dizerem que sou criador de demônios, ao menos eu parabenizo o famigerado presidente do STF pelo fato de se manifestar contra a prisão de uma jornalista que agiu no exercício de sua profissão e que por isso teve pedido de prisão decretado. Ao menos nisso concordamos: liberdade de informação.

Vergonha

Viver num país com bandidagem profissional, de primeiro nível. Coisa que adentra as veias de nossa sociedade, passa pelo povo, pelos poderes e adentra nossas mentes nos tornando insensíveis imorais.

Pior que ser algemado, é ser preso; pior que ser preso, é ser preso e acusado de uma imensidão de crimes; pior que tudo isso, é não poder contar com a esperada justiça, pois ela falha e se corrompe.

O brasileiro quer ver o colarinho branco em cana, quer saber que a polícia existe e está trabalhando, quer ver o rico em cana, também. É "show" ver um rico indo em cana, algo excêntrico, inexperado, mas desejado e apreciado, e bacana.

Que país é este?
- Brasil, uma nação de descrentes em políticos, polícia e justiça.

Leia mais:

Labels:

2008/07/10

Cuidado! Há um DEMENTE no Senado e ele vai acabar com sua liberdade

A todos peço desculpas pelas asneiras que escrevo abaixo, mas, sinceramente, essas coisas destes tempos recentes, me dão vontade de cagar!

A merda

Há um louco no senado brasileiro que deseja muito acabar com a minha e a sua liberdade. Ele quer te privar da Internet e toma para si o exemplo chinês de censura e policiamento que se pratica lá por aqueles lados.

Não sei o que fazer, vou ter que mudar de casa, mudar de nome e provavelmente até de planeta se as coisas continuarem assim.

No senado brasileiro O Idiota quixotesco se esforça muito para te fuder, me fuder e fuder a todos da sociedade brasileira, um crime contra a liberdade na Internet.
Polícia para quem precisa! Cana para você, ladrão!
Seu fedor me enoja!
O tenho como larápio profissional, mas não esperava que fosse nos roubar a todos.

Nossa liberdade se esvai pelas mãos de um Senador (que nojo!) Azedo. Até Quixote consegue ser recompensado pelo seu esforço e aí, nesse ponto, sua aventura deixa de ter graça.

Por acaso alguém conhece algum criminoso de verdade que esteja disposto a se apresentar pessoalmente ao imoral Quixote regulador da moralidade da rede? Talvez assim ele aprenda a diferença entre um hacker e um fora da lei...

Sou contra!

Mais informações, em:

Labels: ,

2008/07/04

J2ME: Using CommConnection at Linux with an USB Serial Port Adapter

I use an USB Serial Adapter with my Linux (Kubuntu - Hardy) notebook. I'm developing a midlet to run into an Automatic Vehicle Locator (aka AVL) hardware Linux based and with MIDP 2.0 CLDC 1.1 support. To comunicate with the AVL I can use a standard RS-232 port or Internet (via GPRS). To program the AVL I prefer to use the serial port to transfer the JAR to it, but to debug, I want to use my full IDE features (I use Netbeans with full Sun mobility pack installed).

The AVL has three serial ports:

  • /dev/ttyS0 - to the standard console;
  • /dev/ttyS1 - to communicate with its GPS module (standard NMEA 0183);
  • /dev/ttyS2 - to communicate with its GSM/GPRS module (to transfer data and send/receive AT Commands).

Instead always transfer the JAR file to the AVL (I'm using screen + zmodem to do it), I wanted to debug it in my notebook and only after test it locally is that I would turn it in the AVL. To do it I attached a GSM/GPRS modem via an USB serial adapter to my notebook and also a GPS with another serial adapter. In Ubuntu the two USB serial port adapters appears as:

  • /dev/ttyUSB0
  • /dev/ttyUSB1

However, after trying to open the serial port from the J2ME midlet running in the emulator, I got exceptions:

set attr failed(00000005): Input/output error
java.io.IOException: Input/output error
at com.sun.midp.io.j2me.comm.Protocol.connect(Protocol.java:285)
at com.sun.midp.io.ConnectionBaseAdapter.openPrim(ConnectionBaseAdapter.java:103)
at javax.microedition.io.Connector.openPrim(Connector.java:329)
at javax.microedition.io.Connector.open(Connector.java:222)
at javax.microedition.io.Connector.open(Connector.java:198)
at javax.microedition.io.Connector.open(Connector.java:180)
at net.marciowb.cldc.avl.comm.ATCommand.(ATCommand.java:38)
at net.marciowb.cldc.avl.vt850.Rastreador.openIO(Rastreador.java:123)
at net.marciowb.cldc.avl.vt850.Rastreador.(Rastreador.java:69)
at java.lang.Class.runCustomCode(+0)
at com.sun.midp.midlet.MIDletState.createMIDlet(+34)
at com.sun.midp.midlet.Selector.run(Selector.java:150)
Unable to create MIDlet net.marciowb.cldc.avl.vt850.Rastreador
java.lang.IllegalArgumentException: Missing device name
at com.sun.midp.io.j2me.comm.Protocol.connect(Protocol.java:247)
at com.sun.midp.io.ConnectionBaseAdapter.openPrim(ConnectionBaseAdapter.java:103)
at javax.microedition.io.Connector.openPrim(Connector.java:329)
at javax.microedition.io.Connector.open(Connector.java:222)
at javax.microedition.io.Connector.open(Connector.java:198)
at javax.microedition.io.Connector.open(Connector.java:180)
at net.marciowb.cldc.avl.comm.RS232.(RS232.java:40)
at net.marciowb.cldc.avl.vt850.Rastreador.(Rastreador.java:70)
at java.lang.Class.runCustomCode(+0)
at com.sun.midp.midlet.MIDletState.createMIDlet(+34)
at com.sun.midp.midlet.Selector.run(Selector.java:150)

It happens when I try:

String cnnGsmStr = "comm:COM1;baudrate=115200;bitsperchar=8;stopbits=1;parity=none;blocking=off";
CommConnection cnnGsm = (CommConnection)Connector.open(cnnGsmStr);

If I try:

String cnnGsmStr = "comm:/dev/ttyUSB0;baudrate=115200;bitsperchar=8;stopbits=1;parity=none;blocking=off";
CommConnection cnnGsm = (CommConnection)Connector.open(cnnGsmStr);

I get:

Unable to create MIDlet net.marciowb.cldc.avl.vt850.Rastreador
java.lang.IllegalArgumentException: Illegal device name
at com.sun.midp.io.j2me.comm.Protocol.connect(Protocol.java:258)
at com.sun.midp.io.ConnectionBaseAdapter.openPrim(ConnectionBaseAdapter.java:103)
at javax.microedition.io.Connector.openPrim(Connector.java:329)
at javax.microedition.io.Connector.open(Connector.java:222)
at javax.microedition.io.Connector.open(Connector.java:198)
at javax.microedition.io.Connector.open(Connector.java:180)
at net.marciowb.cldc.avl.comm.ATCommand.(ATCommand.java:38)
at net.marciowb.cldc.avl.vt850.Rastreador.openIO(Rastreador.java:123)
at net.marciowb.cldc.avl.vt850.Rastreador.(Rastreador.java:69)
at java.lang.Class.runCustomCode(+0)
at com.sun.midp.midlet.MIDletState.createMIDlet(+34)
at com.sun.midp.midlet.Selector.run(Selector.java:150)

After search, try, read, try, think, try, read, search, try and no success, I find in /WTK2.5.2/lib/system.config references to COM1 and COM2, but after modify for several times this values I saw that it doesn't apply to my question. So, after do a full find in WTK directory I found the /WTK2.5.2/bin/libzayit.so file that contains hard code references to /dev/ttyS0 and /dev/ttyS1 but don't have any reference to /dev/ttyUSB0 or /dev/ttyUSB1. Half problem solved!

Then to do my midlet works with the Sun Mobility Pack in my Linux machine with the USB serial port adapter, just I do:

su
rm /dev/ttyS[01]
ln -s /dev/ttyUSB0 /dev/ttyS0
ln -s /dev/ttyUSB1 /dev/ttyS1
chmod a+w /dev/ttyS[01]

Done! Now You can use:

CommConnection cnnGsm = (CommConnection)Connector.open("comm:COM1;baudrate=115200");

That it works!

Labels: , ,