segunda-feira, setembro 27, 2010

JasperServer: Bad version number in .class file

Este blog estava a muito tempo parado, mas hoje resolvi postar aqui a solução para um problema que me tirou de combate quase três dias.
 
Estou testando e implementando o JasperServer na empresa em que trabalho como alternativa free ao Microsoft Reporting Services.
 
Tudo ocorreu bem nos testes no ambiente de desenvolvimento (leia-se localhost).
Criei um relatório que acessa uma base Oracle e um acessando uma outra base de dados SQL Server.
 
No ambiente de desenvolvimento estava usando o JasperServer 3.7.0 e para isso eu instalei o MySQL, o Tomcat 6 e rodei os arquivos Ant do JasperServer para gerar o .war que depois instalei no Tomcat. Tudo isso rodando com a versão 1.6.0_20 do JDK.
 
Para o ambiente de produção o JDK já era mais atual, o 1.6.0_21 e o JavaServer também era mais atual, a versão 3.7.1 que é uma distribuição all-in-one com o Tomcat 5.5, MySQL, etc.
Ai começaram meus problemas! :)
 
O relatório que eu desenvolvi para SQL Server não funcionava em produção acusando o seguinte erro:
 
    org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.UnsupportedClassVersionError: Bad version number in .class file
 
Bati cabeça atrás do erro fazendo várias perguntas nas listas do RIOJUG, Sou Java, RSJUG, etc e fazendo muitos despachos para Pai Google e a conclusão apontada era que a versão do JDK que foi compilado o relatório era diferente da versão do JDK em produção.
Lá fui eu atualizar o JDK no ambiente de desenvolvimento e o erro persistia em produção.
 
Até, que um camarada em uma lista de discussão deu a dica para eu checar se o Tomcat estava realmente usando o JDK que eu queria que ele usasse.
Comecei a catar o usuário e senha para acessar a área administrativa do Tomcat 5.5 que vem na distribuição do JasperServer 3.7.1 e não achei o arquivo tomcat-users.xml no diretório C:\Program Files\JasperServer-ce-3.7.1\apache-tomcat\conf, então fui ver como o bat jasperctl (C:\Program Files\JasperServer-ce-3.7.1\jasperctl.bat) inicializa o Tomcat e achei a seguinte pérola:
 
set JAVA_HOME= C:\Program Files\JasperServer-ce-3.7.1\java
set JRE_HOME= C:\Program Files\JasperServer-ce-3.7.1\java
 
Opa! O cara está apontando para um JDK e uma JRE que não é a que eu instalei no servidor, e ela está desatualizada! Beleza, foi só trocar os valores para apontar para os locais certos que o relatório passou a funcionar. ;)
 
Aqui está como ficou.
 
set JAVA_HOME=C:\Program Files\Java\JDK1.6.0_21
set JRE_HOME=C:\Program Files\Java\JRE6
 
Fica a dica.

sexta-feira, julho 02, 2010

Simulação de um semáforo de trânsito com Arduino



Vídeo demostrando a simulação de um semáforo de trânsito com Arduino.

Hoje dia de jogo da seleção brasileira na copa do mundo da África, dia de folga, dia de arrancar os cabelos com a desclassificação e de aprender mais e mais sobre o meu novo brinquedinho, meu Arduino.
 
Como eu já tinha demonstrado antes aqui no blog, eu já tinha feito algumas brincadeiras com PICs, escrevendo código em Assembly. Mas tem muita coisa que realmente é chato nisso, como ficar trabalhando com os malditos registradores da linguagem, estouro de timer, estouro de variáveis, bit clear, etc. Então fui fazer meu semáforo no Arduino que eu ganho mais ;)
 
A idéia era simular o que vemos nas ruas. Para isso consideremos duas hipotéticas avenidas chamadas A e B.
 
O programa inicia liberando o tráfego de veículos (LED verde) na avenida A e bloqueando-o na avenida B (LED vermelho). O que se segue é o que conhecemos bem: sinal amarelo na avenida A, sinal vermelho na avenida A e verde na B e depois o contrário, amarelo na avenida B, vermelho na avenida B e verde na A novamente.
 
O vídeo está no YouTube para quem quiser ver. Eis a URL: http://www.youtube.com/watch?v=-bUbkyEs3CM
 
E aqui o código fonte:
 

/******************************************************************************;
; Processor: ATMEGA328 ;
; Function : This circuit simulates a typically operation of a traffic light. ;
; There is two sets of LEDs, one representing an hypothetical ;
; avenue "A" and the other set representing an hypothetical avenue ;
; "B". When the program starts the traffic on avenue "A" will be ;
; released and the traffic will be stopped on avenue "B". ;
; After 3s the traffic will be stopped on avenue "A" and will be ;
; released on avenue "B". Before this change, the alert light ;
; (yellow LED) will appear turned on for 1,5s on avenue's "A" ;
; traffic light. After this operation the circle will be reversed. ;
; Hardware : Arduino Duemilanove and an protoboard ;
; Filename : main.pde ;
; Author : Jean J. Míchel ;
; Website : http://www.jeanjmichel.blogspot.com ;
; Credit : ;
;******************************************************************************/

//Traffic light of avenue A
int avenueARed = 12;
int avenueAYellow = 11;
int avenueAGreen = 10;

//Traffic light of avenue B
int avenueBRed = 2;
int avenueBYellow = 3;
int avenueBGreen = 4;

void setup() { //This section will be performed just
pinMode(avenueARed ,OUTPUT); //once after the Arduino be energized
pinMode(avenueAYellow ,OUTPUT); //and sets the orientation of ATmega
pinMode(avenueAGreen ,OUTPUT); //ports

pinMode(avenueBRed ,OUTPUT);
pinMode(avenueBYellow ,OUTPUT);
pinMode(avenueBGreen ,OUTPUT);
}

void openAvenueA() { //Method for release the traffic on
digitalWrite(avenueARed ,LOW); //avenue A
digitalWrite(avenueAYellow ,LOW);
digitalWrite(avenueAGreen ,HIGH);
}

void closeAvenueA() { //Method for stop the traffic on
digitalWrite(avenueARed ,HIGH); //avenue A
digitalWrite(avenueAYellow ,LOW);
digitalWrite(avenueAGreen ,LOW);
}

void prepareToCloseAvenueA() { //Method to display the warning light
digitalWrite(avenueAYellow ,HIGH); //on avenue A
}

void openAvenueB() { //Method for release the traffic on
digitalWrite(avenueBRed ,LOW); //avenue B
digitalWrite(avenueBYellow ,LOW);
digitalWrite(avenueBGreen ,HIGH);
}

void prepareToCloseAvenueB() { //Method to display the warning light
digitalWrite(avenueBYellow ,HIGH); //on avenue B
}

void closeAvenueB() { //Method for stop the traffic on
digitalWrite(avenueBRed ,HIGH); //avenue B
digitalWrite(avenueBYellow ,LOW);
digitalWrite(avenueBGreen ,LOW);
}

void loop() { //This method will be performed over
openAvenueA(); //and over again as long as the
closeAvenueB(); //Arduino has energized

delay(3000);
prepareToCloseAvenueA();
delay(1500);
closeAvenueA();
openAvenueB();

delay(3000);
prepareToCloseAvenueB();
delay(1500);
closeAvenueB();
}

quinta-feira, julho 01, 2010

Arduino Duemilanove


See at jeanjmichel.blogspot.com
Arduino Duemilanove.

 
Depois de 22 dias de espera chegou meu Arduino Duemilanove que comprei no eBay (veio da China), mas por apenas US$ 12.00 valeu a pena a espera.
Comei cogitando a idéia de montar o meu Arduino em casa, para isso comecei a procurar os esquemas e o desenho da placa para uma versão não SMD. Só achei uma versão serial, e eu queria mesmo a USB.
Então fui procurar onde comprar um Arduino aqui no Brasil, e cogitei a versão "extendida" dele, da Globalcode, chamado Program-ME, mas por hora o meu orçamento não me permite desembolsar R$ 190.00 em um brinquedinho que eu posso nem mesmo gostar tanto assim, abandoná-lo e voltar para os PICs da Microchip que venho brincando e tenho o suporte de um colega de trabalho que conhece muito a respeito.
Então o negócio foi apelar para o Mercado Livre e lojas do ramo de eletrônica, mesmo assim um Arduino não sairia por menos de R$ 80.00. Deu aquele estalo e fui olhar o eBay, e lá encontrei um leilão começando em US$ 1.00 de um Arduino Duemilanove, bem o que eu queria ;), e arrematei por US$ 12.00. Coloca aí mais US$ 9.00 de frete internacional e temos um Arduino Duemilanove por R$ 37.00 ;)
 
Demorou mas chegou. Veio o Arduino mais o cabo USB. Eu já tinha baixado a IDE (acesse aqui para baixar) e lido alguns tutoriais bem simples, além de ter visto o pessoal da Globalcode aloprando com o Program-ME criando robôs, usando displays, etc.
 
Apenas ontem que tive tempo de testar o bichinho. Muito simples de usar, fio espertar o Arduino na USB e o Windows 7 já o detectou numa boa, depois foi colocar o código na IDE, compilar, fazer o up load para o Arduino, colocar o LED nas portas certas e ver o resultado ;) Foi este meu primeiro exemplo.
 

See at jeanjmichel.blogspot.com
Primeira montagem.

 
Recomendo a todos que tem o espírito "Professor Pardal" e gostam de ver as coisas acontecendo, etc.
 
Em breve posto mais coisas que irei fazendo até chegar no Daileon =P

quarta-feira, junho 30, 2010

Problemas com o blog

Estou editando o layout do blog por isso está tudo desconfigurado. Peço um pouco de paciência, em alguns dias eu resolverei o problema.

Fotos do meu último experimento

Aí estão as fotos da montagem do meu último experimento (nada científico) com o PIC 16F628A da Microchip.
 
Mas não se anime, pois não está funcionando :(
 
Vou dar uma debugada depois, com calma, pois no Proteus está funcionando. Devo ter feito alguma barberagem na hora de montar, sei lá.
 
O que acontece é que quando o botão é pressionado os dois LEDs vermelhos apagam e o verde não liga.
 
Eis as fotos:
 
See at http://www.flickr.com/photos/jeanjmichel
 
See at http://www.flickr.com/photos/jeanjmichel
 
See at http://www.flickr.com/photos/jeanjmichel
 
See at http://www.flickr.com/photos/jeanjmichel

quarta-feira, junho 09, 2010

Mais um experimento com PIC 16F628A e Assembly

Seguindo a minha saga pelo mundo dos microcontroladores, hoje fiz mais um exemplo em Assembly usando o PIC 16F628A da Microchip.
 
A brincadeira é permutar entre o acendimento de um ou outro LED via chave táctil.
 
O fluxo do programa é este:
 
Fluxo
 
Aqui estão as imagens da simulação do circuito feita no Proteus:
 
Circuito desligado
Circuito desligado.
 
Circuito ligado
Circuito ligado.
 
Chave pressionada
Chave pressionada.
 
E aqui está o código Assembly:
 
;******************************************************************************;
; Processor: PIC16F628 at 4 MHz using internal RC oscillator                   ;
; Function : When the circuit is energized two LEDs will turn on, the power    ;
;            indicator and LED_D1. Every time the button is pressed the LED_D1 ;
;            will turn off and the LED_D2 will turn on, the opposite occurs    ;
;            when the button is released, turning off the LED_D2 and turning   ;
;            on the LED_D1 again.                                              ;
; Hardware : Protoboard                                                        ;
; Filename : main.asm                                                          ;
; Author   : Jean J. Míchel <jeanjmichel-at-gmail.com>                         ;
; Website  : http://www.jeanjmichel.blogspot.com                               ;
; Credit   :                                                                   ;
;******************************************************************************;
; Wiring diagram                               +-/\/\/--|>|--o GND             ;
;                                  +---v---+   |  R2    LED_PWR                ;
;                                -<|º  1   |>--+                               ;
;                                -<|   6   |>----/\/\/--|>|--o GND             ;
;                                -<|   F   |>--+  R3    D1                     ;
;                                -<|   6   |>- |                               ;
;                                -<|   2   |>- +-/\/\/--|>|--o GND             ;
;                                -<|   8   |>-    R4    D2                     ;
;                                -<|   A   |>-                                 ;
;                                -<|       |>--+----o¯o----o VDD 5v            ;
;                                  +-------+   |    R1                         ;
;                                              +---/\/\/---o GND               ;
;******************************************************************************;
#include  <p16f628a.inc>
list p=16f628a
ERRORLEVEL 0, -302;, -224, -302, -305, -207
__config (_INTOSC_OSC_NOCLKOUT & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_OFF)
 
#define   select_bank0  bcf STATUS,RP0
#define   select_bank1  bsf STATUS,RP0
#define   LED_PWR  PORTA,1
#define   LED_D1   PORTA,0
#define   LED_D2   PORTA,7
#define   BUTTON   PORTB,4
 
                org       0x00
                goto      setup              ;Perform the initial settings     ;
                
main            btfsc     BUTTON             ;Monitors the action of the button;
                goto      turn_on_d2         ;Turns on LED_D2                  ;
                goto      turn_on_d1         ;Turns on LED_D1                  ;
                
turn_on_d1      bcf       LED_D2             ;Turns off LED_D2                 ;
                bsf       LED_D1             ;Turns on LED_D1                  ;
                goto      main
                
turn_on_d2      bcf       LED_D1             ;Turns off LED_D1                 ;
                bsf       LED_D2             ;Turns on LED_D2                  ;
                goto      main
                
setup           select_bank1
                movlw     B'00000000'        ;Defines all pins of the PORTA    ;
                movwf     TRISA              ;registrator as output            ;
                
                movlw     B'00010000'        ;Defines all pins of the PORTB    ;
                movwf     TRISB              ;registrator as output except the ;
                                             ;the pin 4 - push button          ;
                
                bsf       PCON, OSCF         ;Sets 16F628 to operate at 4MHz   ;
                
                select_bank0
                movlw     0x07
                movwf     CMCON              ;Turns off the comparator         ;
                
                clrf      PORTA              ;Clears all pins of the PORTA     ;
                                             ;registrator                      ;
                
                clrf      PORTB              ;Clears all pins of the PORTB     ;
                                             ;registrator                      ;
                
                bsf       LED_PWR            ;Turns on LED_PWR - power LED     ;
 
 
                goto      main               ;Loop forever ;)                  ;
 
end
 
Enjoy!

segunda-feira, junho 07, 2010

Pequeno jogo em JavaScript

Estava lendo o material do blog Elétron Livre sobre um dojo de programação com o Program-ME, onde o pessoal da Globalcode criou uma réplica do jogo Genius.
 
Parei para pensar como seria o algoritmo (sem antes ler o deles claro) e comecei a esboçar em JavaScript algo parecido.
 
Quando inicializa a tela são sorteados quatro números inteiros e positivos, esses números aparecem por 1,5 segundo nos quatro campos dispostos em forma de matriz 2x2 na tela e depois são apagados.
Ao jogador resta preencher os quatro campos novamente com os valores correspondente a cada um deles antes exibido. No final ao pressionar o único botão da tela, as respostas do usuário são confrontadas com os números sorteados e exibido o resultado indicando se o jogador acertou ou não a combinação de números.
 
Segue uma seqüência de imagens do jogo:
 

Números sorteados.
 

Hora de jogar :-)
 

Conferindo meu chute.
 

Jogar novamente?
 

Agora sim!
 

Jogar novamente?
 

Bye-bye
 
Claro que isso é uma bobeira, e para simular corretamente o jogo Genius eu deveria ter usado imagens nas cores que o jogo utilizava e não campos numéricos, mas como fiz isso somente para ver como seria... ta ai o resultado. :-) Foi uma hora de almoço gasta em nome da ciência :-)
 
Para aumentar a dificuldade bastas mudar o tempo em que permanecem exibidos os números sorteados.
 
Eis o fonte da página:
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Untitled</title>
    <script language="JavaScript" type="text/javascript">
      <!--
        var ramdom = new Array();
        var answers = new Array();
        var ports = new Array();
        
        function allocate() {
          ports[0] = document.getElementById("portA");
          ports[1] = document.getElementById("portB");
          ports[2] = document.getElementById("portC");
          ports[3] = document.getElementById("portD");
          
          for(i = 0; i < 4; i++) {
            ramdom[i] = Math.floor(Math.random()* 11);
            ports[i].value = ramdom[i]; 
          }
          
          setTimeout(clearForm, 1500);
          
          ports[0].focus();
        }
        
        function clearForm() {
          for(i = 0; i < 4; i++) {
            ports[i].value = ""; 
          }
        }
        
        function checkAnswers() {
          var result = true;
          var tryAgain;
          
          for(i = 0; i < 4; i++) {
            answers[i] = ports[i].value;
            
            if(answers[i] != ramdom[i]) {
              result = false;
            }
          }
          
          var message = "Ramdom numbers: " + ramdom + "\n" +
                        "Your answers: " + answers
          
          if(result) {
            alert("You win! :-) \n\n" + message);
          }
          else {
            alert("You lose! :-( \n\n" + message);
          }
          
          tryAgain = prompt("Do you would like play again?", "Type Y or N");
          
          if(tryAgain == "Y") {
            allocate();
          }
          else {
            document.getElementById("gameForm").style.display = "none";
            document.getElementById("message").style.display = "block";
          }
        }
      //-->
    </script>
  </head>
  <body>
    <div id="gameForm">
      <input type="text" id="portA" name="portA" size="2" />
      <input type="text" id="portB" name="portB" size="2" /> <br/>
      <input type="text" id="portC" name="portC" size="2" />
      <input type="text" id="portD" name="portD" size="2" /> <br/><br/>
      <input type="button" id="check" name="check" value="Check my answers!" onclick="checkAnswers()" />
    </div>
    <div id="message" style="display: none;">
      <p>Thanks for play my game! :-)</p>
    </div>
    <script>
      allocate();
    </script>
  </body>
</html>

sábado, junho 05, 2010

Eletrônica - micro controlador Microchip 16F628A + Assembly [fotos]

Tinha ficado devendo as fotos do meu experimento com o PIC 16F628A da Microchip, bem aqui estão elas:
 
Montagem na protoboard
 
Montagem na protoboard
 
Montagem na protoboard
 
Ficou bem legal, funcionou conforme o simulado, mas dei algumas mancadas na hora de construir o circuito, falta de prática :-D.

terça-feira, junho 01, 2010

Eletrônica - micro controlador Microchip 16F628A + Assembly

Quem, assim como eu, trabalha com TI está acostumado a ver sistemas transformando informações em informações =P, ou seja, dados vem daqui e vão para lá. Isso me deixa um pouco frustrado, pois não construo nada, não vejo nada acontecer, etc. (não me diga que ver um gráfico em um relatório é "ver" as coisas acontecerem em um sistema ;) ) então voltei para os meus primórdios sonhos infantis de construir alguma coisa (na verdade um robô) e para isso invoquei meus conhecimentos de quando tinha 15 anos e estudei na Escola Estadual Técnica Parobé (hoje Centro Tecnológico Estadual Parobé), onde cursei eletrônica.
 
Junte a vontade de fazer algo "se mexer" a ter um colega com skills do Professor Pardal a muitas conversas sobre automação na hora do almoço e um passeio pela Rua República do Líbano (onde estão as lojas de componentes eletrônicos aqui no Rio de Janeiro) e então terás nas mãos uma protoboard, um punhado de componentes e muita diversão ;)
 
Comecei leve: um micro controlador da Microchip (16F628A), dois LEDs, um botão e um programa escrito em Assembly. Assembly ao invés de C porque é o mais próximo que podemos chegar de ver os elétrons passando pela placa ;).
 
A brincadeira é muito simples, mas com ela tive contato com Assembly para micro controladores, o que não conhecia.
 
Vamos lá, o negócio é ter dois LEDs ligados no PIC, um ficará permanentemente aceso (indicando que o circuito está ligado) e o outro LED ficará desligado até que se pressione o botão, que o ligará.
 
Eis a simulação do circuito (as imagens podem ser vistas direto no Flickr: http://www.flickr.com/photos/jeanjmichel/sets/72157624156071640/):
 
Circuito desligado:
desligado
 
Circuito ligado:
ligado
 
Circuito em uso (botão pressionado):
ligado
 
Eis o código Assembly:
 
;******************************************************************************;
; Processor: PIC16F628 at 4 MHz using internal RC oscillator                   ;
; Function : Switch on two LEDs. The first LED (D1), conenected to RB0, turns  ;
;            on when the circuit is energized (power LED), while the second    ;
;            LED (D2), connected to RA1, just turns on when the push button    ;
;            (PB1) is pressed.                                                 ;
; Hardware : Protoboard                                                        ;
; Filename : main.asm                                                          ;
; Author   : Jean J. Míchel <jeanjmichel-at-gmail.com>                         ;
; Website  : http://www.jeanjmichel.blogspot.com                               ;
; Credit   : Eduardo Bekman                                                    ;
;******************************************************************************;
; Wiring diagram                                                               ;
;                                  +---v---+    R1    D1                       ;
;                                -<|º  1   |>--/\/\/--|>|--o GND               ;
;                                -<|   6   |>--+                               ;
;                                -<|   F   |>- +----o¯o----o VDD 5v            ;
;                                -<|   6   |>- |    PB1                        ;
;                     D2    R3   -<|   2   |>- |                               ;
;              GND o--|<|--/\/\/--<|   8   |>- +---/\/\/---o GND               ;
;                                -<|   A   |>-      R2                         ;
;                                -<|       |>-                                 ;
;                                  +-------+                                   ;
;                                                                              ;
;******************************************************************************;
#include  <p16f628a.inc>
list p=16f628a
ERRORLEVEL 0, -302;, -224, -302, -305, -207
__config (_INTOSC_OSC_NOCLKOUT & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_OFF)
 
#define   select_bank0  bcf STATUS,RP0
#define   select_bank1  bsf STATUS,RP0
#define   BUTTON  PORTA,0
#define   LED_D1  PORTA,1
#define   LED_D2  PORTB,0
 
                org       0x00
                goto      setup              ;Perform the initial settings     ;
 
main            btfsc     BUTTON             ;Monitors the action of the button;
                goto      turn_on_led        ;Turns on LED_D1                  ;
                goto      turn_off_led       ;Turns off LED_D1                 ;
 
turn_on_led     bsf       LED_D1             ;Turns on LED_D1                  ;
                goto      main
 
turn_off_led    bcf       LED_D1             ;Turns off LED_D1                 ;
                goto      main
 
setup           select_bank1
                movlw     B'00000001'        ;Defines all pins of the PORTA    ;
                movwf     TRISA              ;registrator as output except     ;
                                             ;pin 0 - push button              ;
 
                movlw     B'00000000'        ;Defines all pins of the PORTB    ;
                movwf     TRISB              ;registrator as output            ;
 
                bsf       PCON, OSCF         ;Sets 16F628 to operate at 4MHz   ;
 
                select_bank0
                movlw     0x07
                movwf     CMCON              ;Turns off the comparator         ;
 
                clrf      PORTA              ;Clears all pins of the PORTA     ;
                                             ;registrator                      ;
 
                clrf      PORTB              ;Clears all pins of the PORTB     ;
                                             ;registrator                      ;
 
                bsf       LED_D2             ;Turns on LED_D2 - power LED      ;
                goto      main               ;Loop forever ;)                  ;
 
end
 
Ainda não consegui monta-lo na protoboard para postar fotos e vídeos do projeto funcionando, mas assim que o fizer eu posto.

quarta-feira, abril 28, 2010

Glassfish v3 não instala, e agora?

Glassfish v3
Mistéééééério! E agora Mr. M?

Hoje estava tentando instalar o Glassfish v3 na minha estação de trabalho, que roda Windows XP, e a instalação não concluía, logo que aparecia a apresentação do instalador o mesmo se fechava sozinho.

Google daqui, Google de lá, e nenhum despacho para pai Google me dava à resposta... próximo passo: listas de discussão (RSJUG, RIOJUG, CEJUG, SouJava e JavaSF).

Eis que veio a luz que eu precisava! O Windows estava configurado para português do Brasil e por isso não instalava, foi somente trocar para inglês dos Estados Unidos e a instalação correu normalmente.

Valeu pela dica Alexandre Tavares.