Pesquisa personalizada

2009/01/27

Lixo: Kubuntu Intrepid 8.10 e KDE 4

Até o presente momento, apesar de diversos problemas, tenho optado por usar KDE por causa de sua interface rica (agradável, amigável e para noobs vindos do Windows como eu) e da biblioteca QT. De todas as distribuições que testei ao longo de quase nove anos, período que trabalho com Linux, a que mais me agradou foi a Ubuntu; razão do que, por gostar do KDE, optei por usar sua variante Kubuntu.

Uso o Kubuntu com meu notebook HP Pavilion zv6000. No início tive muitoooosssss problemas para deixar tudo funcionando, mas após a versão 6 do Ubuntu e a melhora do suporte da ATI ao Linux, as coisas melhoraram bastante. Chegou ao ponto de conseguir deixar tudo funcionando 100% (exceto IR).

Sempre tive resistência às mudanças de versões, pois, prefiro perder meu tempo com outras coisas que ficar me extressando com os problemas advindos dos upgrades de distribuições. No entanto, um dito conhecedor e colaborador do Linux, com o qual trabalhei no MAPA (Min. Agricultura aqui do Brasil), me conveceu de que era muito seguro os upgrades do Ubuntu e que não teria problemas ao fazê-lo - sempre, enfatizando a estabilidade e conservadorismo do Debian; base do Ubuntu. Desde então (creio que a versão do Kubuntu 6), tenho feito os upgrades regularmente.

A última versão do Kubuntu que instalei, foi a 8.10, AKA: Intrepid. Nessa versão pude ter a péssima experiência de usar o KDE 4.1.X e 4.2. Que porcaria! Lixo! Desgraça! So aborrecimentos, como:

  • Short cuts globais com diversos problemas ao ponto de não funcionar na prática... além de redesignação de inumeras shortcuts que já estavam estabelecidas anteriormente. E se tentasse redesigná-las, 99.9% das vezes não funcionava...
  • Redesign de todo o desktop ao ponto de eu ficar totalmente perdido e sem saber onde fica e como usa um zilhão de coisas - até me fez lembrar a transição Windows XP para Windows Vista, mas acredite: a transição KDE 3 para KDE 4 é muito pior!
  • A consagração do Dolphin (que lástima) como gerenciador de arquivos em detrenimento do (bom) Konqueror
  • A constante impressão de que todo mudou, que você não sabe de mais nada, que era melhor nem ter feito o upgrade e que tudo ficou pior do que era e a questão que se repete em mente: Por que fizeram isso?!
  • Detonaram com o Adept ao ponto de ficar quase imprestável.
A única coisa que funcionou bem no Kubuntu Intrepid para minha surpresa foi o KDENetworkManager o WiFi do meu notebook. Funcionou de primeira e como nunca antes aconteceu! Fora isso, um completo lixo, perda de tempo e desempenho!

Sim, meu notebook é velho pra caramba! Com o KDE 4 ficou tudo mais lento e consideravelmente irritante para um desenvolvedor impaciente como eu.

Downgrade, não, Reinstalação mesmo

Após usar a cada do KDE 4 por uns três meses e tentar me enteder com ele, hoje, finalmente, resolvi reinstalar por completo o bom e nem tão velho Kubuntu Hardy 8.04! Ah, que alívio! Mas como nem tudo eram flores, e realmente fiz uma reinstalação do zero, tive que resolver os antigos problemas. Por sorte, alguns deles, cheguei a registrar aqui no blog, mas outros, eram novos.

NDISWrapper e Firmware do Wifi do HP Pavilion zv6000

Para quem tem um notebook como o meu ou um chipset WiFi como o Broadcom Corporation BCM4306 802.11b/g Wireless LAN Controller (rev 03) de identificador PCI 14E4:4320 ou compatível, deixo aqui a firmware que consegui fazê-lo funcionar. Faço isso, para mim mesmo já que sou extremamente desorganizado e não é a primeira vez que tenho que sair catando uma porção de drivers e sair testando um-por-um. Download do driver para Windows XP 64 para uso com Ubuntu de 64 bits (e variantes).

Por algum motivo o KDENetworkManager não funciona adequadamente no Hardy. Por isso, pode ser que você tenha problemas com os programas que fazem uso do NetworkManager, incluindo o Konquero e Firefox.

Firefox

Por falar em Firefox, já estou usando o Firefox 64 bits com o respectivo plugin do Flash. A versão do Firefox 3.0.X para 32 bits não está estável no Hardy 64 bits. Mas a versão 64 bits do Firefox está funcionando plenamente, inclusive, com a instalação padrão realizada no repositório do Ubuntu. Recomendo também a instalação do pacote ubufox. A instalação do plugin Flash já pode ser feita diretamente pelo próprio Firefox, coisa que antes não acontecia na versão 64 bits.

Dessa vez foi mais simples resolver os problemas de acentuação do C-Cedilha. Isso, tanto do KDE, quanto da GTK. De qualque forma, ainda assim foi útil o post Ć (C Acentuado) vs. Ç (C Cedilha) no Firefox32 rodando num AMD64 com Kubuntu 64 Bits.

Por causa do NetworkManager eu tive um problema com o Firefox. Ele sempre iniciava em modo "off-line". Por isso, após pesquisar, descobri que esse era um problema específico do Firefox 3.0.5 com o Hardy (ao menos foi o que li/entendi) conforme reportado no Bug #232243 do Ubuntu. De nada adianta desabilitar o item de menu "Work Offline", pois ao reiniciar o Firefox, novamente este se encontraria em modo offline. Como eficiente paliativo (workarround), nas configurações do Firefox (na barra de endereços digite: about:config), procure por toolkit.networkmanager.disable e atribua-o o valor true para desabilitar o gerenciador de rede e acabar com o problema para o Firefox.

Outra novidade é que já é possível rodar o plugin 64 bits com a JVM da SUN no Firefox 64 bit. Para mais informações, vide: 64 bit Sun Java Browser Plugin.

Até o presente momento, de forma geral, o Firefox 64 Bit está se comportado muito bem e com todos os recursos; sinal de amadurecimento da plataforma 64 bit que até pouco tempo atrás colecionava inúmeros programas dependentes de execução em modo 32 bit.

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