Um domingo com Verilog

Bom pessoal, estou oficialmente iniciando meus estudos numa nova HDL: o Verilog.
A um tempo atrás fiz um seminario sobre HDL onde eu mostrei algumas das mais conhecidas HDL's. Para quem tiver interesse os slides da minha apresentação estão aqui:

http://pet.inf.ufsc.br/node/265

Para quem não sabe, HDL significa Hardware Description Language, ou, Linguagem de Descrição de Hardware.
Elas servem, como o próprio nome sugere, para descrever hardware.
A algum tempo eu mencioneu a VHDL (VHSIC HDL ou Very Large Scalable  Integrated Circuit HDL) em dois dos meus posts:

http://tarcisiof.blogspot.com/2010/04/sistemas-digitais-vhdl-quartus-2.html
Onde eu declaro estar iniciando estudos na linguagem VHDL.

http://tarcisiof.blogspot.com/2010/04/vhdl-projeto-componentenbits.html
Onde eu comento sobre a criação de um componente N bits em VHDL.

Agora, estou tirando um tempo para aprender um pouco de Verilog, por, principalmente, 3 motivos simples:

  • Alguns amigos indicaram, dizendo que é mais simples de se trabalhar.
  • Aprender uma nova linguagem, já que verilog é, também, muito usada pelo mundo afora.
  • Pela diversão :D

Estou atualmente usando o Ubuntu Linux 10.04 (ainda não atualizei para o 10.10), para proceder com os testes eu instalei o iVerilog (Icarus Verilog) e o gtkwave. Para instalar esses programas pode-se usar o Synaptic do ubuntu
ou abrir o terminal, virar root e digitar:

apt-get install iverilog - Para instalar o Icarus Verilog
apt-get install gtkwave  - Para instalar o GTKWave

Para quem usa windows provavelmente o Altera Quartus ou o Xilinx Ise são boas opções. Existe uma versão gratuita para estudante de cada um deles.

http://www.altera.com/products/software/quartus-ii/web-edition/qts-we-index.html
http://www.xilinx.com/tools/webpack.htm

Finalmente, mãos a massa!
Estou usando gedit e/ou o vim para escrever os códigos.
Farei meu trabalho em dois posts, na tentativa de organizar as coisas.
Nesse, irei deixar registrado passo a passo de como criar um projeto da forma que eu achei mais simples e organizada.
Até porque, se daqui a uns dias eu esquecer, posso eu mesmo consultar meu post a fim de obter alguma ajuda.

Em primeiro lugar, criei uma pasta chamada PortasLogicas. Dentro dela criei os arquivos PortasLogicas.v e PortasLogicas_tb.v.
Onde .v é a extensão de um arquivo do verilog. PortasLogicas.v é a descrição do hardware em si e o PortasLogicas_tb.v é o "test bench" ("bancada de testes", daí o "tb") do hardware, onde iremos gerar algumas saídas de teste.

Importante dizer que, até agora, ao que me parece, as ferramentas que eu escolhi são meramente comportamentais, ou seja, não levam em conta o atraso das portas logicas. Portanto, não teremos como saber qual o atraso real dos sistemas digitais que criarmos. Até porque, não sabemos onde esse hardware vai ser colocado (FPGA?). Mas de qualquer forma, isso é um detalhe para o futuro.

Voltando ao PortasLogicas.v, nossa brincadeira vai ser simples: criar um pequeno componente que se comporta da seguinte forma:

Entradas: A e B
Saidas: C e D, onde C = "A ou B" e D = "A e B"
Obviamente estou contando que o leitor saiba o basico de lógica booleana, caso contrario, leia isso:
http://pt.wikipedia.org/wiki/L%C3%B3gica_bin%C3%A1ria

Para escrever o que queremos em Verilog, precisamos primeiro definir um "module":

module PortasLogicas(a, b, c, d);

Isso, até onde eu entendi, significa que temos um componente chamado "PortasLogicas" que conhece "a, b, c e d".
Agora, precisamos definir o que são a, b, c e d. Assim:

input a, b;
output c, d;
   
Ou seja, estamos dizendo que a e b são ENTRADAS do nosso componente e c e d são SAIDAS.
Devemos agora descrever o comportamento interno do componente, para que ele conheça que valores colocar nas saídas c e d:

assign c = a | b;
assign d = a & b;

c = a | b significa que c vai ter o valor do resultado da operação lógica "a ou b".
d = a & b significa que d vai ter o valor do resultado da operação lógica "a e b".

Finalmente, terminamos nosso "module" escrevendo:

endmodule

Pronto :)
O verilog completo está abaixo:

module PortasLogicas(a, b, c, d);
    input a, b;
    output c, d;

    assign c = a | b;
    assign d = a & b;
endmodule

Mas... E agora? Como sabemos se isso está funcionando?
Agora entra aquele outro arquivo, PortasLogicas_tb.v.
É nele que descreveremos a bancada de testes para esse componente.
É simples, iniciamos com:

module PortasLogicas_tb;

Então descrevemos as variaveis que vamos usar:

reg a, b;
wire c, d;

Fui obrigado a usar "reg" para a e b, para poder "jogar" valores na entrada do componente.
O Verilog não permite fazer a = 1 ou a = 0 num "bloco" quando se trata de um "wire".
Logo falarei sobre "blocos".
Continuando, temos:

PortasLogicas dut (a, b, c, d);

Que instancia um componente do "tipo" PortasLogicas (aquele que criamos agora a pouco) com o nome dut.
Dut significa "Device Under Test", me pareceu um padrão pelos sites que consultei na internet.
Dentro dos parenteses coloca-se, na ordem correspondente, as entradas e saidas do componente.
No caso, as entradas são meus "reg"s a e b e as saidas meus "wire"s c e d.
Agora criamos um bloco "initial". Um "bloco" contém uma sequencia de comandos que serão executados em ordem. O bloco "initial" será executado apenas uma vez.

initial
begin
    $dumpfile("saida.vcd");
    $dumpvars;
   
    a = 0;
    b = 0;
    #10
   
    a = 0;
    b = 1;
    #10
   
    a = 1;
    b = 0;
    #10
   
    a = 1;
    b = 1;
    #10
   
    $finish;
end

Os comandos $dumpfile("saida.vcd") e $dumpvars preparam o verilog para jogar as saídas para um arquivo VCD, que, posteriormente, será usado com o programa GTKWave para mostrar as formas de onda.
(VCD = Value Change Dump - http://en.wikipedia.org/wiki/Value_Change_Dump).
Comandos #10 significam "aguarde 10 unidades de tempo".
O que eu estou fazendo alí é setar a e b como 0, esperar 10 unidades de tempo, trocar os valores, esperar mais 10 unidades de tempo, trocar os valores, e assim por diante, até alcançar $finish.

Temos então nosso test banch completo como segue:

module PortasLogicas_tb;

reg a, b;
wire c, d;

PortasLogicas dut (a, b, c, d);

initial
begin
    $dumpfile("saida.vcd");
    $dumpvars;
   
    a = 0;
    b = 0;
    #10
   
    a = 0;
    b = 1;
    #10
   
    a = 1;
    b = 0;
    #10
   
    a = 1;
    b = 1;
    #10
   
    $finish;
end

endmodule

Tudo pronto :D
Para testar, no linux, fazemos assim:

"Compilar" os arquivos:
iverilog PortasLogicas.v PortasLogicas_tb.v
Executar os testes
./a.out
Mostrar formas de onda no GTKWave
gtkwave saida.vcd
Excluir arquivos
rm -f a.out saida.vcd

Claro que fazer tudo isso é um pouco trabalhoso. Imagine ter que ficar digitando esses quatro comandos a cada vez que for testar alguma coisa.
Por isso é muito mais facil fazer isso (no linux) com um Makefile :D
Makefile, pra quem não sabe, é um arquivo "especial" linux que, se vc estiver no terminal em uma pasta que tenha um arquivo chamado Makefile, vc pode escrever "make" e apertar enter e os comandos do makefile vão ser executados.
Pra quem tiver interesse: http://orion.lcg.ufrj.br/compgraf1/downloads/MakefileTut.pdf

Meu Makefile ficou assim:

PortasLogicas:
    iverilog PortasLogicas.v PortasLogicas_tb.v
    ./a.out

onda:
    gtkwave saida.vcd
   
clean:
    rm -f a.out saida.vcd   

Então quando eu executo

make PortasLogicas onda clean

ele compila, executa, me mostra as formas de onda e limpa a pasta atual :)
Por enquanto é só, pessoal. Esse post ficou maior do que eu pensei que ficaria, então não tenho certeza se posto outro ainda hoje. Mas já adiantando, no próximo post eu vou mostrar um SomadorNBits e algumas coisas mais legais que pode-se fazer nas bancadas de teste. Pra quem quiser, vou deixar o arquivo zipado com a pasta PortasLogicas e seus arquivos logo abaixo, além de uma imagem com o meu resultado do GTKWave.


Arquivos
Pacote PortasLogicas

Bibliografia (Na verdade perdi alguns links :( Mas ta tudo no google)
http://www.icarus.com/eda/verilog/
http://gtkwave.sourceforge.net/
http://www.asic-world.com/tidbits/wire_reg.html
http://www-inst.eecs.berkeley.edu/~cs150/Documents/Nets.pdf
http://www.asic-world.com/verilog/vbehave1.html
http://en.wikipedia.org/wiki/Verilog#Initial_and_Always
http://en.wikipedia.org/wiki/Value_Change_Dump
http://orion.lcg.ufrj.br/compgraf1/downloads/MakefileTut.pdf

Configurando Apache + PHP + MySQL no Slackware

Primeiramente devo ressaltar que esse post não é um tutorial. É apenas a minha saga na instalacão desses pacotes no meu Slackware.

Eu ainda não configurei o teclado direito no Slackware também, então, não fiquem assustados se eu escrever coisas como "instalacão", "acão", etc... Pois o meu Slackware ainda não sabe o que é cedilha hehehe... Talvez num próximo post eu faca isso.

Informacões talvez (ir)relevantes:
OS: Slackware 13.1
Linux: 2.6.33.4-smp

Na tentativa mais basica, fui até o slackbuilds.com e procurei por Apache. Não encontrei o que eu queria. Tudo bem, fui até o google, digitei apache e achei isso:

http://httpd.apache.org/download.cgi

Fiz o download, extrai o pacote (tar -xvf nomedopacote), dei um ./configure, um make e um make install. Deve ter instalado, mas tentei excecutar e não consegui.
Ai de mim, fui até o google novamente e achei esse tutorial:

http://www.vivaolinux.com.br/artigo/Instalando-o-Apache-+-PHP-+-MySQL-no-Slackware/

Baixei os pacotes, pensei "mas eu já instalei o Apache. Devo instalar denovo?"
Fiquei em dúvida. sim? não? pensei em desinstalar o outro primeiro, mas aí fiquei com preguica. Entrei em tentacão e... su... installpkg ./apache-1.3.28....

Juro que nunca mais faco isso.

Bom, instalei os outros pacotes e segui o tutorial para a parte 2: configuracão.
Acredito que o MySQL esteja OK, mas ao tentar iniciar o apache eu recebo:

apachectl start
/usr/sbin/httpd: error while loading shared libraries: libdb.so.2: cannot open shared object file: No such file or directory
/usr/sbin/apachectl start: httpd could not be started

Lá vamos nós atrás da libdb.so.2 u,u
Primeira opcão do google é essa:

http://www.rpmfind.net/linux/rpm2html/search.php?query=libdb.so.2

Mas quando tento baixar, ganho uma mensagem de "550 failed to change directory" na cara :(

Ok, depois de algumas tentativas... Hora da gambiarra!
Encontrei esse blog

http://support.zeus.com/zws/faqs/2005/09/19/libdb

Que sugeriu esse link

http://hany.sk/~hany/RPM/doors2.4/jr/db1-1.85-0.3.i386.html

Que tem um RPM do libdb.
Baixei ele, dei um

rpm2tgz ./db1-1.85-0.3.i386.rpm
installpkg db1-1.85-0.3.i386.tgz
apachectl start

e.... Mesmo erro.
Ok, vamos entrar num nível ainda maior de gambiarrice:

tar -xvf ./db1-1.85-0.3.i386.tgz
cd ./usr/lib/
ls
libdb1.so.2

Aí está o desgracado!

ln ./libdb1.so.2 /usr/lib/libdb.so.2
apachectl
[Thu Aug 5 21:31:55 2010] [warn] module mod_php4.c is already added, skipping
/usr/sbin/apachectl start: httpd started

Seila que diabo é esse warning, mas vou no meu firefox e digito 127.0.0.1 e ganho um "It Works!"

Beleza, agora um teste de verdade:

cd /var/www/htdocs
vim teste.php

$nome = "Tarcisio";
echo "Ola mundo. Meu nome é " . $nome;
?>

firefox > 127.0.0.1/teste.php

Ola mundo. Meu nome é Tarcisio

Coisa linda :D
Agora vamos "limpar" as coisas:

apachectl stop
/usr/sbin/apachectl stop: httpd stopped
rm /usr/lib/libdb.so.2
cp /home/tarcisio/downloads/usr/lib/libdb1.so.2 /usr/lib/libdb.so.2
apachectl start
[Thu Aug 5 21:43:21 2010] [warn] module mod_php4.c is already added, skipping
/usr/sbin/apachectl start: httpd started

Tudo bem. Dei uma pesquisada e dizem que esse warning é "normal". Eu não gostei muito dele, mas por hoje chega. Agora posso brincar com PHP no meu slackware em paz :)

Fui.

VHDL - Projeto ComponenteNBits

Objetivo
Estudar uso de GENERIC e PROCESS


ComponenteNBits
Circuito Combinacional Com 3 entradas e 1 saída. Se comporta como a tabela que segue:

SEL S
00 a+b
01 a-b
10 a>>1
11 b>>1



Interface










ENTITY ComponenteNBits IS
GENERIC (N : INTEGER := 4);
PORT (a, b: IN STD_LOGIC_VECTOR (N-1 DOWNTO 0);
sel: IN STD_LOGIC_VECTOR (1 DOWNTO 0);
s: OUT STD_LOGIC_VECTOR (N-1 DOWNTO 0));
END ComponenteNBits;


Arquivos

ComponenteNBits.vhd
http://www.4shared.com/file/k10UOjlw/ComponenteNBits.html


Simulação

force a 0000 0ns, 0101 20ns, 0100 40ns, 0000 60ns
force b 0001 0ns, 1100 20ns, 0010 40ns, 0000 60ns
force sel 00 0ns, 01 40ns, 10 60ns, 11 80ns
run 100ns













Links

http://www.eng.auburn.edu/~nelson/courses/elec5250_6250/VHDL%203%20Sequential.pdf
http://pldworld.biz/_hdl/2/esd.cs.ucr.edu/labs/tutorial/
http://vhdlguru.blogspot.com/

Sistemas Digitais - VHDL - Quartus 2 + ModelSim

Antes de iniciar os posts sobre experiencias com VHDL, deixo registradas algumas informações importantes:

http://pt.wikipedia.org/wiki/FPGA
http://pt.wikipedia.org/wiki/VHDL
http://pt.wikipedia.org/wiki/Altera

Download do Quartus II [WEB Edition] e ModelSim
https://www.altera.com/support/software/download/sof-download_center.html

O objetivo do ou dos posts não é ensinar a usar as ferramentas, mas sim deixar registrado os experimentos.

GERANDO PDF`s EM JAVA

GERANDO PDF`s EM JAVA

Hoje precisei gerar PDF em JAVA, numa pesquisa rápida pela internet encontrei a biblioteca iText
http://itextpdf.com/

É bem simples, com ela, criar os PDF`s!
Em http://www.roseindia.net/java/itext/index.shtml tem uma série de exemplos bem explicados de como usar a ferramenta.
Aqui também tem alguns exemplos: http://www.ibm.com/developerworks/br/library/os-javapdf/

Outra solução, que eu achei bem mais elegante, foi a proposta por esse cara
"Converta HTML para PDF com 06 linhas de Código"
http://javafree.uol.com.br/artigo/866449/Converta-HTML-para-PDF-com-06-linhas-de-Codigo.html

E funcionou mesmo! :D

JAVA | WEB-CRAWLERS DIA 1

POST 1:
Não vou reinventar a roda, pesquisei na internet possíveis web-crawlers.
No site a seguir existe uma lista com alguns crawlers open-source.

http://java-source.net/open-source/crawlers

---

POST 2:
Bom, pelo visto não vou ter que reinventar a roda... vou ter que INVENTA-LA mesmo!
Não encontrei nenhum crawler que seja só uma biblioteca que me permita trabalhar em cima :(
Mas, seguindo as recomendações desse cara http://lembra.wordpress.com/tag/crawler/
eu posso usar esse tal de httpunit (http://sourceforge.net/projects/httpunit/files/httpunit/1.7/httpunit-1.7.zip/download)
pra catar as informações dos sites... Vamos ver como funciona...

---

POST 3:
Em primeiro momento, o httpUnit se mostrou realmente muito bom! em poucas linhas de código ele conseguiu me retornar
quantos links um determinado site tem.

try {
// create the conversation object which will maintain state for us
WebConversation wc = new WebConversation();

// Obtain the main page on the meterware web site
String url="http://www.meterware.com";
WebRequest request = new GetMethodWebRequest( url );
WebResponse response = wc.getResponse( request );

// find the link which contains the string "HttpUnit" and click it
WebLink httpunitLink = response.getFirstMatchingLink( WebLink.MATCH_CONTAINED_TEXT, "HttpUnit" );
response = httpunitLink.click();

// print out the number of links on the HttpUnit main page
System.out.println( "The HttpUnit main page '"+url+"' contains " + response.getLinks().length + " links" );

} catch (Exception e) {
System.err.println( "Exception: " + e );
}

Se bem que ele demorou quase 3 segundos pra fazer isso... Mas tudo bem...

---

POST 4:
É, parece que o mar não está para peixe... Tentei iniciar um crawler pro site do terra. Ou eu não estou sabendo fazer direito ou o httpUnit
não é tão bom assim. Ele da erro ao tentar executar o código:

try {
// create the conversation object which will maintain state for us
WebConversation wc = new WebConversation();

// Obtain the main page on the meterware web site
String url="http://www.terra.com.br";
WebRequest request = new GetMethodWebRequest( url );
WebResponse response = wc.getResponse( request );

// find the link which contains the string "HttpUnit" and click it
//WebLink httpunitLink = response.getFirstMatchingLink( WebLink.MATCH_CONTAINED_TEXT, "HttpUnit" );
//response = httpunitLink.click();

System.out.println(response.getLinks().length);

//for(int i = 0; i < response.getLinks().length; i++){
// System.out.println(response.getLinks()[i].getURLString());
//}

} catch (Exception e) {
System.err.println( "Exception: " + e );
}

---

POST 5:
Bom, acho que encontrei a explicação aqui: http://httpunit.sourceforge.net/doc/faq.html#norhino
O httpunit não vem com essa biblioteca no pacote, acho que vou ter que baixa-la a parte.
Link para download do Rhino: http://www.mozilla.org/rhino/download.html
Agora é só colocar o arquivo js.jar no classpath e testar...

---

POST 6:
Não funcionou.
Mas esse link http://httpunit.sourceforge.net/doc/faq.html#disable%20scripting me deu uma luz:

HttpUnitOptions.setScriptingEnabled( false );

e o código agora funciona corretamente:

try {
HttpUnitOptions.setScriptingEnabled( false );
// create the conversation object which will maintain state for us
WebConversation wc = new WebConversation();

String url="http://www.terra.com.br";
WebRequest request = new GetMethodWebRequest( url );
WebResponse response = wc.getResponse( request );

// find the link which contains the string "HttpUnit" and click it
//WebLink httpunitLink = response.getFirstMatchingLink( WebLink.MATCH_CONTAINED_TEXT, "HttpUnit" );
//response = httpunitLink.click();

//System.out.println(response.getLinks().length);

for(int i = 0; i < response.getLinks().length; i++){
System.out.println(response.getLinks()[i].getURLString());
}

} catch (Exception e) {
System.err.println( "Exception: " + e );
}

Ele mostra todos os links do site do terra :D

---

POST 7:
Ok, agora que sei que é possível fazer isso, quero pegar algum dado de verdade.
Vamos ao site da iMasters. Quero pegar todas as noticias do site referentes a JAVA.
Primeiramente, pegaremos uma noticia qualquer:

Eu percebi que o conteudo do artigo fica em strConteudo e o titulo na tag title mesmo. então:

try {
HttpUnitOptions.setScriptingEnabled( false );
// create the conversation object which will maintain state for us
WebConversation wc = new WebConversation();

String url="http://imasters.uol.com.br/artigo/15674/java/jpa_com_jboss_tools_no_eclipse/";
WebRequest request = new GetMethodWebRequest( url );
WebResponse response = wc.getResponse( request );

// find the link which contains the string "HttpUnit" and click it
//WebLink httpunitLink = response.getFirstMatchingLink( WebLink.MATCH_CONTAINED_TEXT, "HttpUnit" );
//response = httpunitLink.click();

//System.out.println(response.getLinks().length);

System.out.println(response.getTitle());

HTMLElement[] divs = response.getElementsByTagName("div");
for(int i=0; i < divs.length; i++) {
if(divs[i].getID().equals("strConteudo"))
System.out.println(divs[i].getText());
}

for(int i = 0; i < response.getLinks().length; i++){
//System.out.println(response.getLinks()[i].getURLString());
}

} catch (Exception e) {
System.err.println( "Exception: " + e );
}

Funcionou corretamente :D
Próximo passo é, a partir da primeira página (http://imasters.uol.com.br) ele tem que me dar uma lista de links.
Depois de pegar a lista de links, ele vai link a link procurando a palavra JAVA no LINK, no TITULO e no CORPO do artigo.
Se encontrar, quero que o artigo seja retornado, senão, não :)

Programação de Jogos usando C++ & OpenGL - Dia 1

Programação de Jogos usando C++ & OpenGL

Primeiros Passos: Configurando

Para meus experimentos, vou utilizar S.O. Ubuntu 9.10 com o Eclipse para C++ (http://www.eclipse.org/downloads/).
Após instalar o Eclipse e fazer um Olá Mundo, chegou a hora de pegar as bibliotecas p/ trabalhar com o openGL.
Segui as recomendações desse blog: http://www.ferdychristant.com/blog/articles/DOMM-72MPPE
Entrei no Synaptic e procurei o pacote freeglut3-dev ( o freeglut3 já etava instalado para mim ).
No Eclipse, fui em Project > Properties > C/C++ Builder > Settings > GCC C++ Linker > Libraries e adicionei nas libraries ( -l ) "glut".
Compilei, então, o código proposto pelo próprio blog.


Entendendo o openGL. 1ª Parte: O Básico

Como eu sou novato no openGL, vou primeiro fazer uns testes para saber do que ele é capaz.
Eu sei que ele tem capacidade para programação 3D com super efeitos e etc, mas o meu objetivo aqui é começar de baixo.
De acordo com o GameDev (http://www.gamedev.net/reference/design/features/makegames/page2.asp) um bom jogo para iniciar
é TETRIS.
Talvez eu esteja me subestimando, mas quero algo ainda mais simples. Acho que um jogo estilo SNAKE é mais fácil que TETRIS.

Bom, meu primeiro teste funcionou normalmente. Desenhei um TRIANGULO numa janela.
Estranhamente eu tive que usar esse método glutInit(&argc, argv);
Acho que só é necessário no Linux.

glutDisplayFunc(void)
Seta o metodo que vai desenhar as coisas na janela.
O legal é que, sem isso, vc roda o programa e nao acontece nada.

glutMainLoop
http://www.opengl.org/documentation/specs/glut/spec3/node14.html#SECTION00041000000000000000
Loop principal. Evita o programa de ser finalizado.

openGlTest001


Entendendo o openGL. 2ª Parte: Fullscreen

Eu pretendo fazer todos os meus jogos serem FULLSCREEN, portanto, esse tópico é de grande importancia.
O tutorial http://www.swiftless.com/tutorials/opengl/fullscreen.html ensina bem como resolver isso.
Basicamente, vc tem o glutGameModeString com o parametro a larguraxaltura:colordepth@hertz
Exemplo:
glutGameModeString( "990x768:32@75" );
990x760 pixel
32bits de cores
75hz

Para aplicar usa-se glutEnterGameMode(); e para sair usa-se glutLeaveGameMode();
Claro que, se eu fizer o meu jogo fullscreen eu nao vou ter como FECHAR o aplicativo.
Sendo assim, preciso setar um método que me garanta que, ao pressionar ESC, o programa vá fechar:

NOTA: PARA USAR O exit(0) É NECESSARIO #include

void keyboard(unsigned char key, int x, int y) {
if (key == 27) {
glutLeaveGameMode();
exit(0);
}
}

e depois dizer ao openGL que esse método existe:

glutKeyboardFunc (keyboard);

Bom, parece que com o freeGlut3 as coisas não saem como planejado. Eu não consegui que meus aplicativos ficassem
fullscreen corretamente :(
Com SDL eu consegui o truque. É bem provavel, entao, que eu prefira aderir ao SDL por essa limitação do openGL.

Hello World - Sony Ericsson W580i + J2ME

Problema
Por algum motivo o aplicativo "Hello World" padrão do NetBeans não roda no Sony Ericsson 580i

Solução
Para solucionar o problema, deve-se, ao criar um novo projeto, modificas as versões do CLDC e MIDP para 1.0 e 2.0 respectivamente. Apenas assim consegui executar no meu celular o aplicativo de Hello World.

Instalando J2ME + NetBeans no Ubuntu

Problema
Instalar, configurar e testar J2ME no UBUNTU 9.10 - Karmic Coala

Downloads
[ Java JDK 6 ]

Download do NetBeans para J2ME
http://netbeans.c3sl.ufpr.br/6.8/bundles/netbeans-6.8-ml-java-linux.sh

Download do JWT 2.5.2
https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=sun_java_wireless_toolkit-2.5.2_01b-oth-JPR@CDS-CDS_Developer

Solução
Pelo terminal, dar permissões para executar o arquivo e executa-lo em seguida:

chmod 0777 ./sun_java_wireless_toolkit-2.5.2_01-linuxi486.bin
sudo ./sun_java_wireless_toolkit-2.5.2_01-linuxi486.bin



Após ler toda o contrato devera aparecer

No suitable Java interpreter was detected

0) Specify a path to a Java interpreter directory.
1) Cancel this installation.
Select a choice [0-1]: 0

This application requires Java 2 SDK, Standard Edition (1.5 or later). Enter a path to a Java 2 SDK (For example: /user/jdk1.5/bin). You can type "exit" to cancel installation.
Enter a path to the Java 2 SDK: /usr/lib/jvm/java-6-openjdk/bin
/usr/lib/jvm/java-6-openjdk/bin/java
Testing /usr/lib/jvm/java-6-openjdk/bin/java...

Please enter a directory into which you would like to install the Sun Java(TM) Wireless Toolkit, 2.5.2 for CLDC.
[ default is /home/tarcisio/Área de Trabalho/WTK2.5.2 ]:/home/tarcisio/wtk
Installation directory is /home/tarcisio/wtk.

Check for Product Updates

Sun Java(TM) Wireless Toolkit for CLDC includes Check for Product Update feature.
This feature will be active every 7 days and will inform you about the new Product Updates.
No personally identifiable data such as name, address, or e-mail address will be collected. You can disable this feature later in Preferences.
The information collected by Product Update includes the following:

* Operating system
* Country and Language setting on your computer
* Date and version of the Wireless Toolkit that you are about to install
* Unique random user ID generated by the Wireless Toolkit

Collected data will be used for future improving of the product.
Please read Sun's Privacy Policy at http://www.sun.com/privacy/index.html

Check for Product Updates? [yes or no] yes

Setup has enough information to start copying the program files.
Current Settings:
Destination Directory
/home/tarcisio/wtk/
JVM Folder
/usr/lib/jvm/java-6-openjdk/bin/
Check for Program Updates
Enabled

Please choose one of the following options:
0) Begin copying files if you are satisfied with the settings .
1) Cancel the installation.
Select a choice [0-1]: 0
Checksumming...

Extracting the installation files...
Documentation for the Sun Java(TM) Wireless Toolkit
2.5.2 for CLDC is in the file
/home/tarcisio/wtk/index.html
In order to start using the Sun Java(TM) Wireless Toolkit 2.5.2 for CLDC, please run
/home/tarcisio/wtk/bin/ktoolbar

PARA TESTAR:

tarcisio@PASCAL:~/Área de Trabalho$ /home/tarcisio/wtk/bin/ktoolbar
OTA server emulation started ...
HTTPS server emulation started ...

Instalando o NetBeans

chmod 0777 ./netbeans-6.8-ml-java-linux.sh
sudo ./netbeans-6.8-ml-java-linux.sh



Testando tudo:

Abra o NetBeans ( ele deve ter feito um atalho em aplicativos > desenvolvimento > netbeans, se não, vá pelo terminal:

/bin/sh "/usr/local/netbeans-6.8/bin/netbeans"

Vá em Arquivo > Novo Projeto escolha Java Me e clique em Próximo
Pode deixar tudo padrão ( certificar que esteja checado em "criar midlet olá" )



Agora é só apertar no icone de "play" ou apertar F6 para ver o aplicativo rodando.

O arquivo JAR é gerado em /home/tarcisio/NetBeansProjects//dist