mercoledì 27 febbraio 2013

Telecomando Infrarosso HP su Debian via Lirc

Questo e' il classico argomento che ti  fa odiare Linux ed in particolare Debian

Mi e' stato regalato il ricevitore infrarosso HP ed il relativo telecomando in fotografia. Connessi ad un computer con XP entrambi sono stati riconosciuti senza problemi senza la necessita' di installare driver


Connessa la porta usb del ricevitore la risposta in dmesg e' la seguente
--------------------------------------
Feb 26 15:59:41 debian kernel: [  134.156199] usb 5-1: new full-speed USB device number 2 using uhci_hcd
Feb 26 15:59:41 debian kernel: [  134.325313] usb 5-1: New USB device found, idVendor=0471, idProduct=0815
Feb 26 15:59:41 debian kernel: [  134.325328] usb 5-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Feb 26 15:59:41 debian kernel: [  134.325338] usb 5-1: Product: eHome Infrared Transceiver
Feb 26 15:59:41 debian kernel: [  134.325347] usb 5-1: Manufacturer: Philips
Feb 26 15:59:41 debian kernel: [  134.325354] usb 5-1: SerialNumber: PH00Whgx
Feb 26 15:59:41 debian mtp-probe: checking bus 5, device 2: "/sys/devices/pci0000:00/0000:00:1d.3/usb5/5-1"
Feb 26 15:59:41 debian mtp-probe: bus: 5, device: 2 was not an MTP device
Feb 26 15:59:41 debian kernel: [  134.456823] IR NEC protocol handler initialized
Feb 26 15:59:41 debian kernel: [  134.475076] IR RC5(x) protocol handler initialized
Feb 26 15:59:41 debian kernel: [  134.479146] IR RC6 protocol handler initialized
Feb 26 15:59:41 debian kernel: [  134.484878] IR JVC protocol handler initialized
Feb 26 15:59:41 debian kernel: [  134.488290] Registered IR keymap rc-rc6-mce
Feb 26 15:59:41 debian kernel: [  134.488876] input: Media Center Ed. eHome Infrared Remote Transceiver (0471:0815) as /devices/pci0000:00/0000:00:1d.3/usb5/5-1/5-1:1.0/rc/rc0/input12
Feb 26 15:59:41 debian kernel: [  134.489504] rc0: Media Center Ed. eHome Infrared Remote Transceiver (0471:0815) as /devices/pci0000:00/0000:00:1d.3/usb5/5-1/5-1:1.0/rc/rc0
Feb 26 15:59:41 debian kernel: [  134.493005] IR Sony protocol handler initialized
Feb 26 15:59:41 debian kernel: [  134.499517] input: MCE IR Keyboard/Mouse (mceusb) as /devices/virtual/input/input13
Feb 26 15:59:41 debian kernel: [  134.499964] IR MCE Keyboard/mouse protocol handler initialized
Feb 26 15:59:41 debian kernel: [  134.513576] lirc_dev: IR Remote Control driver registered, major 251 
Feb 26 15:59:41 debian kernel: [  134.516637] rc rc0: lirc_dev: driver ir-lirc-codec (mceusb) registered at minor = 0
Feb 26 15:59:41 debian kernel: [  134.516647] IR LIRC bridge handler initialized
Feb 26 15:59:42 debian kernel: [  134.712239] mceusb 5-1:1.0: Registered Philips eHome Infrared Transceiver with mce emulator interface version 1
Feb 26 15:59:42 debian kernel: [  134.712254] mceusb 5-1:1.0: 2 tx ports (0x0 cabled) and 2 rx sensors (0x1 active)
Feb 26 15:59:42 debian kernel: [  134.712356] usbcore: registered new interface driver mceusb
--------------------------------------
Come si vede chiaramente (anche dalla foto) il dispositivo e' compatibile con Windows Media Center (MCE)


Per controllare il dispositivo sotto Linux e' necessario installare il software lirc per cui mi sono attrezzato con 
apt-get install lirc
il demone pero' non riesce a partire e la soluzione e' abbastanza banale.Se si guarda nella directory /etc/lirc/ si puo' vedere che tutti i file di configurazione sono vuoti per cui ho cercato su Internet le corrette configurazioni sulla base delle informazioni ricavate dai log

alla fine il demone insiste a non partire e la soluzione e' ancora una volta chiara
il file di configurazione richiede il modulo mceusb2 ma digitando da linea di comando
modprobe mceusb2 
il modulo non viene trovato

sono ripartito quindi da capo rimuovendo il pacchetto deb di lirc
apt-get remove lirc
e scaricando da internet il sorgente di lirc 

in fase di ./configure viene richiesta la presenza libusb-dev per cui ho aggiunto
apt-get install libusb-dev


lanciando ./configure appare la seguente finestra (puo' essere necessario prima fare apt-get install dialog) e si deve selezionare nessun driver

a questo punto si puo' terminare la compilazione secondo il classico configure/make/make install
la novita' e' che il modulo mceusb e' presente e lanciando il demone 
/etc/init.d/lirc start 
il comando va a buon fine

i file di configurazione sono

hardware.conf
---------------------------------------

REMOTE="Windows Media Center Remotes (new version Philips et al.)"
REMOTE_MODULES="lirc_dev lirc_mceusb"
REMOTE_DRIVER="devinput"
REMOTE_DEVICE="/dev/input/event12"
REMOTE_LIRCD_CONF="lircd.conf"
REMOTE_LIRCD_ARGS=""
TRANSMITTER="None"
TRANSMITTER_MODULES=""
TRANSMITTER_DRIVER=""
TRANSMITTER_DEVICE=""
TRANSMITTER_LIRCD_CONF=""
TRANSMITTER_LIRCD_ARGS=""
START_LIRCD="true"
START_LIRCMD=""
LOAD_MODULES=""
LIRCMD_CONF=""
FORCE_NONINTERACTIVE_RECONFIGURATION="false"

---------------------------------------
lircd.conf

---------------------------------------

#
# brand:                        HP/Philips/Microsoft/Other
# model no. of remote control:  Media Center Edition remote
# devices being controlled by this remote: HP Slimline S3100y and a
# myriad of devices with Media Center Edition receivers
#
# RC-6 config file
#
# source: http://home.hccnet.nl/m.majoor/projects_remote_control.htm
#         http://home.hccnet.nl/m.majoor/pronto.pdf
#
# used by: Philips
#
#########
#
# Philips Media Center Edition remote control
# For use with the USB MCE ir receiver
#
# Dan Conti  dconti|acm.wwu.edu
#
# Updated with codes for MCE 2005 Remote additional buttons
# *, #, Teletext, Red, Green, Yellow & Blue Buttons
# Note: TV power button transmits no code until programmed.
# Updated 12th September 2005
# Graham Auld - mce|graham.auld.me.uk
#
# Radio, Print, RecTV are only available on the HP Media Center remote control
#
#
# Updated with codes for MCE 2007 Remote additional buttons
# Visualization, Aspect, SlideShow, Eject
# Note: 
# Renamed some buttons: DVD->DVDMenu, More->MoreInfo, Star->Asterisk, Hash->Pound
# Note: 
# Blue, Yellow, Green, Red, and Teletext buttons do not exist on the HP remote

begin remote

  name        mceusb
  bits                 16
  flags  RC6|CONST_LENGTH
  eps                  30
  aeps                100

  header       2667   889
  one           444   444
  zero          444   444
  pre_data_bits        21
  pre_data        0x37FF0
  gap              105000
  toggle_bit           22
  rc6_mask    0x100000000


      begin codes

#seen on HP Pavilion dv3t remote  --Tim Mann, 3 Nov 2009
Media         0x00007b7f
PlayPause     0x00007b91


#unused by HP remote
KEY_BLUE      0x00007ba1
KEY_YELLOW      0x00007ba2
KEY_GREEN      0x00007ba3
KEY_RED      0x00007ba4
Teletext      0x00007ba5

#ba6 - bae unused 
        BA6           0x00007ba6
        BA7           0x00007ba7
        BA8           0x00007ba8
        BA9           0x00007ba9
        BAA           0x00007baa
        BAB           0x00007bab
        BAC           0x00007bac
        BAD           0x00007bad
        BAE           0x00007bae

        KEY_RADIO         0x00007baf
        Print         0x00007bb1

#bb2 - bb4 unused  
        BB2           0x00007bb2
        BB3           0x00007bb3
        BB4           0x00007bb4

        KEY_VIDEO        0x00007bb5
        Pictures      0x00007bb6
        RecTV         0x00007bb7
        KEY_AUDIO         0x00007bb8
        KEY_TV            0x00007bb9

#bba - bbf unused 
        BBA           0x00007bba
        BBB           0x00007bbb
        BBC           0x00007bbc
        BBD           0x00007bbd
        BBE           0x00007bbe
        BBF           0x00007bbf
#bc1 - bca unused 
        BC1           0x00007bc1
        BC2           0x00007bc2
        BC3           0x00007bc3
        BC4           0x00007bc4
        BC5           0x00007bc5
        BC6           0x00007bc6
        BC7           0x00007bc7
        BC8           0x00007bc8
        BC9           0x00007bc9
        BCA           0x00007bca

        KEY_EJECTCD         0x00007bcb
        SlideShow     0x00007bcc
        Visualization 0x00007bcd

#bce - bcf unused 
        BCE           0x00007bce
        BCF           0x00007bcf
#bd1 - bd7 unused 
        BD1           0x00007bd1
        BD2           0x00007bd2
        BD3           0x00007bd3
        BD4           0x00007bd4
        BD5           0x00007bd5
        BD6           0x00007bd6
        BD7           0x00007bd7

        Aspect        0x00007bd8
        Guide         0x00007bd9
        LiveTV        0x00007bda
        KEY_DVD           0x00007bdb
#NoGap
        KEY_BACK          0x00007bdc
        KEY_OK            0x00007bdd
        KEY_RIGHT         0x00007bde
        KEY_LEFT          0x00007bdf
        KEY_DOWN          0x00007be0
        KEY_UP            0x00007be1
#NoGap
        Star          0x00007be2
        Hash          0x00007be3
#NoGap
        KEY_AGAIN        0x00007be4
        KEY_NEXT          0x00007be5
        KEY_STOP          0x00007be6
        KEY_PAUSE         0x00007be7
        KEY_RECORD        0x00007be8
        KEY_PLAY          0x00007be9
        KEY_REWIND        0x00007bea
        KEY_FORWARD       0x00007beb
#NoGap
        KEY_CHANNELDOWN      0x00007bec
        KEY_CHANNELUP        0x00007bed
        KEY_VOLUMEDOWN       0x00007bee
        KEY_VOLUMEUP         0x00007bef
#NoGap
        More          0x00007bf0
        KEY_MUTE          0x00007bf1
        KEY_HOME          0x00007bf2
        KEY_POWER         0x00007bf3
#NoGap
        KEY_ENTER         0x00007bf4
        KEY_CLEAR         0x00007bf5
#NoGap
        KEY_9          0x00007bf6
        KEY_8         0x00007bf7
        KEY_7         0x00007bf8
        KEY_6           0x00007bf9
        KEY_5          0x00007bfa
        KEY_4          0x00007bfb
        KEY_3         0x00007bfc
        KEY_2           0x00007bfd
        KEY_1           0x00007bfe
        KEY_0          0x00007bff
      end codes

end remote
#
# this config file was automatically generated
# using lirc-0.8.4a(default) on Mon Feb 23 23:55:04 2009
#
# contributed by 
#
# brand:                       Hauppauge
# model no. of remote control: 
# devices being controlled by this remote: PVR-150 Remote (MCE kit)
# SMK dongle 0609:031d
#

begin remote

  name  mceusb_hauppauge
  bits           13
  flags RC6|CONST_LENGTH
  eps            30
  aeps          100

  header       2674   870
  one           455   427
  zero          455   427
  pre_data_bits   24
  pre_data       0x1BFF82
  gap          106288
  min_repeat      1
  toggle_bit_mask 0x8000
  rc6_mask    0x100000000

      begin codes
          TV                       0x1BB9
          Music                    0x1BB8
          Pictures                 0x1BB6
          Videos                   0x1BB5
          Power                    0x1BF3
          Stop                     0x1BE6
          Record                   0x1BE8
          Pause                    0x1BE7
          Play                     0x1BE9
          Rewind                   0x1BEA
          Foward                   0x1BEB
          Replay                   0x1BE4
          Skip                     0x1BE5
          Back                     0x1BDC
          More                     0x1BF0
          Up                       0x1BE1
          Left                     0x1BDF
          Right                    0x1BDE
          OK                       0x1BDD
          Down                     0x1BE0
          VolUp                    0x1BEF
          VolDown                  0x1BEE
          Home                     0x1BF2
          ChanDown                 0x1BED
          ChanUp                   0x1BEC
          Mute                     0x1BF1
          RecTV                    0x1BB7
          Guide                    0x1BD9
          LiveTV                   0x1BDA
          DVD                      0x1BDB
          One                      0x1BFE
          Two                      0x1BFD
          Three                    0x1BFC
          Four                     0x1BFB
          Five                     0x1BFA
          Six                      0x1BF9
          Seven                    0x1BF8
          Eight                    0x1BF7
          Nine                     0x1BF6
          Star                     0x1BE2
          Zero                     0x1BFF
          Hash                     0x1BE3
          Clear                    0x1BF5
          Enter                    0x1BF4
      end codes

end remote


#
# this config file was automatically generated
# using lirc-0.8.4a(default) on Tue Mar 10 19:27:09 2009
#
# contributed by 
#
# brand:  SIIG Vista MCE remote
# model no. of remote control: 
# devices being controlled by this remote:
#

begin remote

  name  vista_mce
  bits           16
  flags RC6
  eps            30
  aeps          100

  header       2654   889
  one           427   427
  zero          427   427
  pre_data_bits   21
  pre_data       0x37FF0
  gap          69850
  toggle_bit_mask 0x8000
  rc6_mask    0x100000000

      begin codes
          Power                    0xEBF3
          Pictures                 0x6BB6
          Radio                    0xEBAF
          Videos                   0x6BB5
          Music                    0xEBB8
          Rec                      0x6BE8
          Pause                    0xEBE7
          Stop                     0x6BE6
          Skipback                 0xEBE4
          Play                     0x6BE9
          Skipfwd                  0xEBE5
          Rwd                      0x6BEA
          Fwd                      0xEBEB
          Start                    0x6BF2
          Back                     0xEBDC
          More                     0x6BF0
          Volup                    0xEBEF
          Voldown                  0x6BEE
          Chup                     0xEBED
          Chdown                   0x6BEC
          Up                       0xEBE1
          Down                     0x6BE0
          Left                     0xEBDF
          Right                    0x6BDE
          Mute                     0xEBF1
          Rectv                    0x6BB7
          Guide                    0xEBD9
          Livetv                   0x6BDA
          Dvdmenu                  0xEBDB
          1                        0x6BFE
          2                        0xEBFD
          3                        0x6BFC
          4                        0xEBFB
          5                        0x6BFA
          6                        0xEBF9
          7                        0x6BF8
          8                        0xEBF7
          9                        0x6BF6
          *                        0xEBE2
          0                        0x6BFF
          #                        0xEBE3
          Clear                    0x6BF5
          Enter                    0xEBF4
      end codes

end remote
---------------------------------------


lanciando il comando ir-keytable si ottiene che il ricevitore e' su /dev/input/event12

-------------------------------------------------------------------

Found /sys/class/rc/rc0/ (/dev/input/event12) with:
Driver mceusb, table rc-rc6-mce
Supported protocols: NEC RC-5 RC-6 JVC SONY LIRC other 
Enabled protocols: RC-6 
Repeat delay = 500 ms, repeat period = 125 ms
-------------------------------------------------------------------

a questo punto si lancia
inputlircd /dev/input/event12

per controllare che tutto e' andato a buon fine ho quindi lanciato il comando
irw
ottenendo come risposta
-----------------------------------------------------
root@debian:/home/luca# irw 
182 0 KEY_TUNER /dev/input/event12
72 0 KEY_VOLUMEDOWN /dev/input/event12
193 0 KEY_CHANNELDOWN /dev/input/event12
16d 0 KEY_EPG /dev/input/event12
71 0 KEY_MUTE /dev/input/event12
e2 0 KEY_MEDIA /dev/input/event12
197 0 KEY_NEXT /dev/input/event12
77 0 KEY_PAUSE /dev/input/event12
a8 0 KEY_REWIND /dev/input/event12
19c 0 KEY_PREVIOUS /dev/input/event12
160 0 KEY_OK /dev/input/event12
197 0 KEY_NEXT /dev/input/event12
71 0 KEY_MUTE /dev/input/event12

dopo tanto lavoro finalmente funziona


martedì 26 febbraio 2013

Mandelbrot in OpenGL su Linux/Debian

In questo post viene presentato un programma per creare l'insieme di Mandelbrot in OpenGL.
Questa specifica permette di scrivere codice astraendosi dai differenti acceleratori grafici con API uniformi tra le varie piattaforme in cui e' implementata OpenGL ed e' necessario avere una scheda grafica abilitata per poter funzionare

In Debian, per programmare in OpenGL, si deve installare FreeGlut (Glut e' una estensione ad OpenGL che permette di gestire la creazione delle finestre e gli eventi da tastiera anche questa indipendente tra varie piattaforme)

apt-get install freeglut3-dev


Mandelbrot in OpenGL


Per compilare il codice sottostante si usa la seguente stringa

g++ -Wall -O3 mandel.cpp -o mandel -lglut -lGLU

il codice utilizzato e' sempre quello di base gia' presentato nei precedenti esempi e sono evidenziate in giallo le direttive tipiche di OpenGL
Si deve evidenziare che in questo caso viene utilizzato un Double Buffering RGB
La cosa curiosa utilizzando OpenGL (rispetto all'esperienza con altre librerie) e' il modo di mappare i pixel
In pratica il numero di pixel non e' per definizione quella massima della finestra creata ma deve essere esplicitamente definito da gluOrtho2D(0.0,640.0,0.0,480.0);
Nel caso in cui non si glVertex2i (che accetta come input coordinate intere) ma glVertex2f (coordinate float) lo spazio delle coordinate e' compreso tra -1.0 e 1.0
--------------------------------------------------
#include <GL/gl.h>
#include <GL/glut.h>

#include <stdio.h>

#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480


float re_min = -2.0;
float im_min = -1.2;

float re_max = 1.0;
float im_max = 1.2;

int iterazioni = 1024;


float a,b;
float x,y,x_new,y_new;

int test;

int k,j,i;
 

void disegna()
{

    float re_factor = (re_max-re_min);
    float im_factor = (im_max-im_min);
   
    glColor3f(1, 1, 1);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();


    glClear(GL_COLOR_BUFFER_BIT);
    glBegin (GL_POINTS);


    for (i=0;i<SCREEN_HEIGHT;i++)
     {
     for (j=0;j<SCREEN_WIDTH;j++)
      {
      a = re_min+(j*re_factor/SCREEN_WIDTH);
      b = im_min+(i*im_factor/SCREEN_HEIGHT);
     
      x = 0;
      y = 0;
      test = 0;
     
      for (k=0;k<iterazioni;k++)
       {
       x_new = (x*x)-(y*y)+a;
       y_new = (2*x*y)+b;
       if (((x_new*x_new)+(y_new*y_new))>4)
        {
        test = k;
        if (k%2 == 0) glVertex2i(j,i);        

        break;
        }
       x = x_new;
       y = y_new;
       }
            
      }
   
     }
    glEnd();            

    glutSwapBuffers();   
}

int main(int argc, char* argv[])
{
    glutInit (&argc, argv);
    glutInitDisplayMode (GLUT_RGB|GLUT_DOUBLE);
    glutInitWindowSize(SCREEN_WIDTH, SCREEN_HEIGHT);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Mandelbrot");
    gluOrtho2D(0.0,640.0,0.0,480.0);
    glutDisplayFunc(disegna);
    glutMainLoop();

    return 0;
}

lunedì 25 febbraio 2013

Freeglut su Virtualbox

Per fare qualche prova ho deciso di provare FreeGlut su una macchina virtuale
Per prima cosa si deve abilitare il supporto di accelerazione 3D alla macchina virtuale (altrimenti le librerie FreGlut si rifiutano di funzionare)òl



per il test ho provato ad usare il codice presente a questo link compilando mediante la riga di comando
g++ test.cpp -o test -lglut

lanciando l'eseguibile viene risposto con il seguente errore

-------------------------------------------

luca@debian:~$ ./test 
OpenGL Warning: XGetVisualInfo returned 0 visuals for 0x8b484e8
OpenGL Warning: Retry with 0x8002 returned 0 visuals
Errore di segmentazione
-------------------------------------------

la soluzione a questo errore, ripresa da questo sito, e' la seguente
-------------------------------------------
export LIBGL_ALWAYS_INDIRECT=1
-------------------------------------------

una volta modificata questa variabile di ambiente rilanciando l'eseguibile il risultato e' quello atteso



venerdì 22 febbraio 2013

Offuscare il codice Java di Android con ProGuard

All'interno dell SDK di Android e' contenuto uno strumento per offuscare il codice Java in modo da evitare quando descritto nel precedente post Decompilare un apk

Un file di configurazione generale e' riportato in sdk/tools/proguard/proguard-android.txt mentre un altro file di configurazione, specifico per ogni progetto, e' nella root del progetto come proguard-project.txt. La configurazione di base solitamente e' sufficiente

Per attivare l'offuscamento del codice si deve togliere il commento alla riga di Proguard in project.properties

project.properties
-----------------------------------------

# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
------------------------------------------

Una volta esportata il progetto creando il file .apk si osserva la creazione della directory proguard; importante conservare il contenuto perche' con questi file e' possibile effettuare il deoffuscamento del codice




provando ad effettuare la decompilazione dell'apk mediante il metodo del precedente post utilizzando la stessa applicazione si ha che la MainActivity risulta essere

Ralink RA5370 in Linux Debian

Per un vecchio portatile con una Debian Testing, sprovvisto di antenna WiFi, mi sono comprato per pochi euro su un sito cinese l'antenna Ralink RA5370 che supporta fino a 802.11N


Il supporto per Debian e' garantito mediante l'installazione di
apt-get install firmware-ralink

per caricare il modulo manualmente si usa il comando
modprobe rt2800usb

Decompilare un APK

Ebbene si', ho perso i sorgenti di un mio programma (nello specifico Well DrawDown Test)
Purtroppo ho formattato il portatile e non mi sono accorto che il progetto non risiedeva in "workspace" (la directory di default per i progetti di Eclipse) ed ho perso il sorgente del progetto


Pero' ho ancora l'apk (o meglio e' ancora sul Play Store)
Per recuperare il codice ho proceduto cosi'

Si mette in una directory il file .apk e lo si rinomina in .zip, a questo punto di decomprime come un normale zip e si ottiene quanto segue

a questo punto si scarica il programma dex2jar e si esegue
dex2jar classes.dex

e' arrivato quindi il momento di decompilare il codice con java decompiler 
si scompatta il pacchetto e si esegui
jd-gui

si apre quindi il file classes.dex.dex2jar e come per magia si ha il codice sorgente 


non e' esattamente come lo ho scritto io perche' alcune variabili sono diventate identificativi numerici ma e' decisamente leggibile
A questo punto rimangono da estrarre i file xml utilizzando il programma apktool
Si digita 
apktool d nome_file.apk nome_file

verra' generata una sottodirectory in cui sono contenuti tutti i file xml e il contenuto della directory /res



giovedì 21 febbraio 2013

Connessione seriale HP 48GX

In questo post viene descritto come effettuare una connessione seriale con una calcolatrice HP48GX per effettuare l'upload di programmi

Non verra utilizzata la calcolatrice reale ma il suo emulatore Linux (x48) dato che non possiedo il cavo e dato che il simulatore si comporta esattamente come l'oggetto reale

Per prima cosa si deve settare la calcolatrice in Server Mode. Cio si ottiene premendo Shift Destro + tasto 1 (modalita' I/O) e selezionando con le frecce l'opzione Start Server dal menu


terminata questa operazione lo schermo sara' di questo tipo

 Si passa quindi al lato client
La comunicazione avviene mediante il protocollo Kermit per cui si deve scaricare il pacchetto  ckermit

apt-get install ckermit

si deve poi individuare sulla schermata dell'emulatore la porta di connessione (nel caso /dev/pts/1)


e si deve inserire la seguente serie di comandi
-------------------------------------------------------------------
/home/luca/) C-Kermit>set modem type direct
(/home/luca/) C-Kermit>set port ?No keywords match - oport
(/home/luca/) C-Kermit>set port /dev/pts/1 
(/home/luca/) C-Kermit>set speed 9600
/dev/pts/1, 9600 bps
(/home/luca/) C-Kermit>set carrier-watch off
(/home/luca/) C-Kermit>set flow none
(/home/luca/) C-Kermit>set parity none
(/home/luca/) C-Kermit>set block 3
(/home/luca/) C-Kermit>set control prefix all
(/home/luca/) C-Kermit>set file type binary
(/home/luca/) C-Kermit>send /home/luca/BENO
(/home/luca/) C-Kermit>finish

-------------------------------------------------------------------
con il comando send si definisce il file del programma che si intende caricare sul calcolatore

con il comando finish la calcolatrice esce dal Server Mode e si puo' lanciare il programma secondo la normale procedura

Il programma in esecuzione



Compilatore Pascal su Android

Non e' molto utile ma molto geek utilizzare un compilatore Pascal su un terminale Android anche perche' a me ricorda i tempi del Turbo Pascal 5

Una scelta puo' essere PePe Compiler che eredita molti aspetti dal Turbo Pascal ed in generale i sorgenti per TP girano anche su PePe

Tra gli esempi vi sono alcuni superclassici come il calcolo dei numeri primi e Pi Greco


Al momento non e' pero' implementata la gestione della grafica (ad onore del vero la versione per PalmOS e' decisamente piu' avanzata e gestisce la GUI) e non e' possibile generare un file eseguibile svincolata dal compilatore...in conclusione si tratta di un gran bel giochino...ma un giochino

Privilegi di root su GT-S5570i

Le istruzioni per avere i permessi di root sul Samsung GT-S5570i sono stati ripresi da questo link

per prima cosa si salva questo file nella SD Card, dopo di cio' (a telefono spento) si premuno i tasti Accensione+Volume Su+Home fino a quando appare il menu

A questo punto si sceglie l'opzione Update from SD Card e si attende il reboot


Come si puo' vedere il programma Root Checker conferma il possesso dei privilegi di root

mercoledì 20 febbraio 2013

Emu84 Emulatore HP48GX

Ho voluto provare, avendo a disposizione l'originale, l'emulatore della calcolatrice HP48GX

Il programma si chiama Emu48 e, per quanto ne so, non ha una versione Linux
Una volta scaricato l'emulatore e' necessario reperire una ROM per l'emulatore da sito hpcalc.org (io ho usato questa) ed un file KML che corrisponde all'aspetto grafico dell'emulatore stesso (a questo indirizzo il KML per la 48GX)


fatto cio' si avvia l'emulatore e ci si trova davanti la schermata della figura precedente
Ovviamente trattandosi di un emulatore basato su una ROM estratta da una calcolatrice reale il comportamento sara' esattamente quello reale...l'unica differenza e' nel modo di caricare i dati (sarebbe stupido usare la porta seriale virtuale)

Sempre su hpcalc.org e' possibile scaricare programmi per tutta una serie di calcolatrici programmabili HP.
Una volta ottenuto il programma in formato binario (il file inizia con  un header del tipo HPHP48...) si puo' semplicemente trascinare il file sul diplay LCD dell'emulatore oppure da menu Edit/Load Object

Si vede apparire parte del codice del programma
A questo punto si clicca il pulsante alla estrema sinistra della terza fila dall'alto ('), poi doppio clic sul pulsante alpha e si inserisce il nome del programma (che sara' tra apici). Terminato si preme STO per salvarlo

Per recuperare il programma dalla memoria ed eseguirlo si preme poi il tasto VAR e si vede apparire nella riga del menu in basso al display il nome scelto (in questo caso e' MAND come Mandelbrot)



premuto il tasto funzione bianco sottostante il menu di interesse il programma viene messo in esecuzione


Lo stesso programma e' disponibile (Droid48) anche su Android (di una lentezza disarmante..piu' per colpa del telefono/Android  che dell'emulatore)


Frugando un po' ho trovato un emulatore per HP48 per Linux che si chiama X48
Si installa direttamente da pacchetto deb (non e' presente nei repository) e si deve inserire la rom nella directory .hp48

A differenza di Emu48, per caricare i programmi sull'emulatore si deve usare la porta seriale virtuale mediante il protocollo kermit come se fosse una calcolatrice fisica (un po' fastidioso)



martedì 19 febbraio 2013

Zoom estremo sull'insieme di Mandelbrot

Questa non e' ovviamente opera mia ma e' troppo bello per non pubblicarlo

Angoli di inclinazione in PhoneGap/HTML5

Sempre utilizzando PhoneGap e' possibile in modo molto semplice ottenere gli angoli di rotazione del dispositivo mobile nello spazio mediante la notazione di Eulero
Angoli di Eulero (Wikipedia)
Gli angoli sono anche definiti come
alfa = yaw (imbardata) in giallo
beta = roll (rollio) in rosso
gamma =  pitch (beccheggio) in viola

Fonte Wikipedia

il codice e' semplicemente autoesplicativo
----------------------------------------------------

<!DOCTYPE html>
<html>
  <head>
    <title>Angoli</title>

    <script type="text/javascript" charset="utf-8" src="cordova-2.3.0.js"></script>
    <script type="text/javascript" charset="utf-8">

    
    window.addEventListener('deviceorientation', function(event) {

    var alpha = 360 - event.alpha;
    var beta = event.beta;
    var gamma = event.gamma;

    // Display Euler angles
    document.getElementById("alpha").innerHTML = "Alpha : " + alpha;
    document.getElementById("beta").innerHTML = "Beta  : " + beta;
    document.getElementById("gamma").innerHTML = "Gamma : " + gamma;

}, false);
    </script>
  </head>

  <body>
<p id="alpha">Alpha : </p><br>
<p id="beta" >Beta  : </p><br>
<p id="gamma">Gamma : </p><br>
    
  </body>
</html>


----------------------------------------------------

Chrome su Linux dietro ad un proxy server



Nella versione per Linux di Google Chrome non e' presente il menu di configurazione del proxy server. Al suo posto vi e' un messaggio che cerca di indirizzare l'utente alla soluzione

Se si usano Kde o Gnome in pratica vengono assunti i settaggi del Window Manager...ma cosa fare con Lxde???

La soluzione piu' semplice e valida per tutte le distribuzioni e' lanciare Chrome da linea di comando con il seguente parametro

google-chrome --proxy-server=http://mioproxy.com:8080/

Aldebaran, Giove e Luna

Con l'arrivo della nuova macchina digitale le foto sono un po' migliorate

In questa ripresa (18/2/2013 alle 22:21 da Firenze) si vede Aldebaran (a sinistra), la Lune (chiaramente al centro) e Giove (a destra) nella stessa porzione di cielo


Qui la simulazione in Stellarium


C4Droid

C4Droid e' la prima applicazione in assoluto che abbia acquistato (2.29 euro) e devo ammettere che ne vale la pena

L'applicazione permette di programmare all'interno di un terminale Android in C/C++ con Gcc come compilatore ed con alcune librerie di uso comune all'interno di Linux come SDL e Qt. In questo modo ci si svincola dall'impiego di Java e dalla macchina virtuale Dalvik per fare applicazione di livello piu' basso come e' possibile fare con l'NDK

Per mettere alla prova il compilatore ho preso il sorgente del post che permette di disegnare l'insieme di Mandelbrot




Il codice e' stato copiato ed incollato senza nessuna modifica, quindi compilato ed eseguito

Il risultato e' riportato nella immagine sottostante


Come si puo' osservare il risultato e' quello atteso. Il tempo di esecuzione, che su un pc attuale non e' quasi misurabile dato che il risultato e' quasi istantaneo, nel telefono Samsung GT-S5570i e' di circa 18 secondi

Con lo stesso compilatore si puo' usare Ncurses. Sempre prendendo a prestito da un precedente post si puo' ottenere


La cosa divertente e' che con questo compilatore si riesce a superare il controllo della latenza di Dalvik. In pratica di norma Android interrompe una applicazione se questa per circa 30 secondi non restituisce la possibilita' di interazione all'utente

L'immagine sottostante e' stata effettuata mediante un calcolo di circa 2 minuti e 25 secondi ed e' stata terminata senza nessuna segnalazione di anomalia da parte del sistema operativo





Un buon acquisto in fine dei conti anche se in fine dei conti si tratta di un giochino piu' che di uno strumento di produzione

venerdì 15 febbraio 2013

Riportare il firmware originale un Samsung Galaxy Next Turbo (GT-5570i)

Un po' scocciato dalle varie Rom custom ho deciso di riportare il telefono in oggetto al firmware originale
(la Optimus e' carina ma con tre launcher installati e non rimuovibili lascia ben poco spazio per altre applicazioni)

La procedura per ritornare al firmware originale e' il seguente

1) Scaricare l'ultimo firmware disponibile per il telefono (nel caso S5570IXILG1_S5570IITVLG2_ITV)

2) Scaricare il programma Odinatrix e inserire il file del firmware scompattato nella directory di Odinatrix (S5570IXILG1_S5570iITVLG2_S5570IXXLF3_HOME.tar.md5)

3) lanciare Odinatrix ed attendere il termine delle operazioni. Il risultato saranno 3 file (CSCxxx, MODEMxxx e PDAxxx) dentro la sottodirectory output

4) recuperare il file tassve_0623.pit

5) Mettere il telefono in Download Mode (ovvero accenderlo tenendo premuto il tasto Home+Volume Giu' e Accensione). Si deve confermare di voler procedere premendo il tasto Volume Su al primo menu

5) Collegare il telefono e lanciare il programma Odin 1.83 con le impostazioni della schermata nell'immagine


Il risultato e' il seguente

giovedì 14 febbraio 2013

Rotazione di immagine in CSS3


Un altro metodo per ruotare una immagine e' quello di utilizzare CSS3 con le proprieta' di rotazione delle immagini.
Questo metodo ha il problema che non tutti i browser supportano il medesimo set di modificatori (nell'esempio e' stato usato il metodo per i browser derivanti da WebKit)


-----------------------------------------------
<!DOCTYPE html>
<html>
<head>
<style> 
div
{
width:160px;
height:160px;
background-image:url('http://junefabrics.com/images/android160.jpg');

-webkit-transform:rotate(45deg); /* Safari and Chrome */
}
</style>
</head>
<body>

<div></div>

</body>
</html>
-------------------------------------------------

Accelerazioni in HTML5/PhoneGap

Un esempio di come registrare le accelerazioni su un dispositivo mobile senza utilizzare le API native

In questo caso e' stata usata la libreria PhoneGap ... la stessa cosa sarebbe stata possibile anche con il solo HTML5 con il problema di dover gestire le differenti implementazioni sui differenti browsers

-----------------------------------------
<!DOCTYPE html>
<html>
  <head>
    <title>Accelerazione</title>

    <script type="text/javascript" charset="utf-8" src="cordova-2.3.0.js"></script>
    <script type="text/javascript" charset="utf-8">

    document.addEventListener("deviceready", onDeviceReady, false);

    function onDeviceReady() {
    var options = { frequency: 100 };
        navigator.accelerometer.watchAcceleration(onSuccess, onError);
    }

    // onSuccess: Get a snapshot of the current acceleration
    //
    function onSuccess(acceleration) {
    
    var accx = document.getElementById('accx');
    var accy = document.getElementById('accy');
    var accz = document.getElementById('accz');
   
    accx.innerHTML = 'Accelerazione X :  '     +acceleration.x;
    accy.innerHTML = 'Accelerazione Y :  '     +acceleration.y;
    accz.innerHTML = 'Accelerazione Z :  '     +acceleration.z;
   
  
    }

    // onError: Failed to get the acceleration
    //
    function onError() {
        alert('onError!');
    }

    </script>
  </head>
  <body>
    <p id="accx">Accelerazione X : </p><br>
    <p id="accy">Accelerazione Y : </p><br>
    <p id="accz">Accelerazione Z : </p><br>

    
  </body>
</html>


-----------------------------------------

Angoli di tilt in HTML5

Anche con il solo utilizzo di HTML5 (con un browser moderno) e' possibile determinare gli angoli di tilt di un dispositivo mobile. Un esempio puo' essere trovato a questo link




Attenzione: questo metodo non funziona con il browser stock di Android 2.3.6 perche' il browser non gestisce queste API di HTML5

-----------------------------

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
  
  
  <div align=center id="gamma">Left Right (Gamma) </div>
  <div align=center id="beta">Front Back (Beta)</div>
  <div align=center id="alpha">Direzione (Alpha)</div>

<script type="text/javascript">
if (window.DeviceOrientationEvent) {
  console.log("DeviceOrientation is supported");
  window.addEventListener('deviceorientation', function(eventData) {
        var LR = eventData.gamma;
        var FB = eventData.beta;
        var DIR = eventData.alpha;
var gamma_element = document.getElementById('gamma');
var beta_element = document.getElementById('beta');
var alpha_element = document.getElementById('alpha');
       gamma_element.innerHTML = 'Left Right (Gamma) : ' + LR;
beta_element.innerHTML = 'Front Back (Beta) : ' + FB;
alpha_element.innerHTML = 'Direzione (Alpha) ' + DIR;
        
}, false);
} else {
alert("Not supported on your device or browser.  Sorry.");
}

</script>

</body>
</html>

-----------------------------

DriveDroid

Ho provato ad usare DriveDroid, una applicazione per Android che maschera l'unita' di memorizzazione del telefono come una chiavetta USB con montata sopra una distribuzione Live di Linux

Puo' essere utile per avviare un livecd quando si e' dimenticata a casa la propria chiavetta USB ma ci sono un po' di problemi

1) la applicazione richiede privilegi di root per avviarsi
2) e' necessario il cavetto USB da telefono a PC e per esperienza e' piu' semplice dimenticare il cavetto che non una chiavetta USB (il telefono e' sempre in tasca...il cavo no)
3) ho provato su tre portatili ed in nessun caso sono riuscito ad avviarli da DriveDroid mentre il computer fisso si avvia normalmente...non ho capito bene il motivo ma sembra il bios dei portatili sia talmente veloce in partenza da non riuscire a vedere il telefono (che da quando sente la corrente sulla porta USB a quando rende disponibile il live cd ci mette piu' di un secondo)

DriveDroid in esecuzione su Samsung SG-5570i con Debian Testing Live

Esperimento interesssante ma sostanzialmente inutile

mercoledì 13 febbraio 2013

Bussola in HTML5/PhoneGap

Usando il codice del post precedente e PhoneGap e' possibile realizzare una semplice applicazione in HTML5 per visualizzare una bussola su un dispositivo mobile

Il codice per generare l'esempio e' il seguente
------------------------------------------------------------

<!DOCTYPE html>
<html>
  <head>
    <title>Bussola</title>

    <script type="text/javascript" charset="utf-8" src="cordova-2.4.0.js"></script>
    <script type="text/javascript" charset="utf-8">

var surface;
var android;
var angle = 0;

function drawCanvas() {
    surface = document.getElementById("myCanvas");

    if (surface.getContext) {
        android = new Image();
        android.onload = loadingComplete;
        android.src = "./img/compass.jpg";
    }
}

function loadingComplete(e) {
    var surfaceContext = surface.getContext('2d');
    surfaceContext.fillStyle = "rgb(255,255,255)";
    surfaceContext.fillRect(0, 0, surface.width, surface.height);
    surfaceContext.save();
    surfaceContext.translate(android.width * 0.5, android.height * 0.5);
    surfaceContext.rotate(angle* 0.0174532925199432957);
    surfaceContext.translate(-android.width * 0.5, -android.height * 0.5);
    surfaceContext.drawImage(android, 0, 0);
    surfaceContext.restore();
}


    var watchID = null;
    document.addEventListener("deviceready", onDeviceReady, false);

    function onDeviceReady() {
        bussola();
    }

    function bussola() {
        var options = { frequency: 300 };
        watchID = navigator.compass.watchHeading(onSuccess, onError, options);
    }

    function onSuccess(heading) {
        var element = document.getElementById('heading');
        element.innerHTML = 'Heading: ' + heading.magneticHeading;
angle = heading.magneticHeading;
drawCanvas();

    }

    function onError(compassError) {
        alert('Compass error: ' + compassError.code);
    }
</script>
</head>

<body onload="drawCanvas();">
<div align=center>
        <canvas id="myCanvas" width="256" height="256">
            <p>Your browser doesn't support canvas.</p>
        </canvas>
</div>
    
    <div align=center id="heading">Waiting for heading...</div>
   
  </body>
</html>

------------------------------------------------------------

Per visualizzare il comportamento dell'applicazione e' stato utilizzato Ripple


La cosa positiva e' che, essendo stata sviluppata con PhoneGap ,questa applicazione puo' essere utilizzata su Android, Iphone e molti altri dispositivi

Rotazione di immagine in HTML5

Di seguito in questo post viene descritto come e' possibile ruotare una immagine contenuta in un Canvas attorno al suo centro in HTML5
(il codice e' stato adattato da esempi che si trovano su forum)


-----------------------------------------------

<body onload="drawCanvas();">
    <div>
        <canvas id="myCanvas" width="256" height="256">
            <p>Your browser doesn't support canvas.</p>
        </canvas>
    </div>
</body>

<script type="text/javascript">
var surface;
var happy;
var angle = 0;

function drawCanvas() {
    surface = document.getElementById("myCanvas");

    if (surface.getContext) {
        android = new Image();
        android.onload = loadingComplete;
        android.src = "./android.jpg";
    }
}

function loadingComplete(e) {
    var surfaceContext = surface.getContext('2d');
    surfaceContext.fillStyle = "rgb(255,255,255)";
    surfaceContext.fillRect(0, 0, surface.width, surface.height);
    surfaceContext.save();
    surfaceContext.translate(android.width * 0.5, android.height * 0.5);
    surfaceContext.rotate(45* 0.0174532925199432957); //45 e' l'angolo di rotazione
    surfaceContext.translate(-android.width * 0.5, -android.height * 0.5);
    surfaceContext.drawImage(android, 0, 0);
    surfaceContext.restore();
}

</script>

-----------------------------------------------

martedì 12 febbraio 2013

Grafici in HTML5

Sempre per sperimentare HTML5 ho provato la libreria FLOT

Si tratta di un metodo molto semplice di implementare nel Web grafici di gradevole visualizzazione ed anche dinamici con poche linee di codice

L'esempio che riporto di seguito e' per uno scatterplot XY in cui e' possibile zommare ed effettuare pan in modo dinamico


il codice completo che genera l'esempio e' il seguente
--------------------------------------------------------------

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link href="layout.css" rel="stylesheet" type="text/css">
    <!--[if lte IE 8]><script language="javascript" type="text/javascript" src="../excanvas.min.js"></script><![endif]-->
    <script language="javascript" type="text/javascript" src="./lib/jquery.js"></script>
    <script language="javascript" type="text/javascript" src="./lib/jquery.flot.js"></script>
<script language="javascript" type="text/javascript" src="./lib/jquery.flot.navigate.js"></script>
 </head>
    <body>
    
    <div id="placeholder" style="width:600px;height:300px;"></div>

   <script type="text/javascript">
$(function () {
    var d1 = [];
    for (var i = 0; i < 14; i += 0.5)
        d1.push([i, Math.sin(i)]);

    var d2 = [[0, 3], [4, 8], [8, 5], [9, 13]];

var options = {
        series: { lines: { show: true }, shadowSize: 0 },
        xaxis: { zoomRange: [0.1, 20], panRange: [-20, 20] },
        yaxis: { zoomRange: [0.1, 20], panRange: [-20, 20] },
        zoom: {
            interactive: true
        },
        pan: {
            interactive: true
        }
    };

        
    $.plot($("#placeholder"), [ d1, d2],options);
});
</script>

 </body>
</html>
---------------------------------------------------------------
il grafico e' definito dal div placeholder e qui sono descritte anche le dimensioni del grafico stesso.
Ci sono due serie di dati, una definita da una funzione e l'altra da punti, e sono descritte anche le caratteristiche del grafico mediante la variabile option.
La dinamicita' del grafico e' data dai settaggi di zoom e pan come interactive (per questa funzione si deve aggiungere il riferimento a jquery.flot.navigate.js)

semplice, veloce e di effetto

Impronte di lupo sulla neve

Questa foto non c'entra nulla con il contenuto di questo blog ma fotografare le impronte di lupo sulla neve sopra Vallombrosa  non puo' lasciare indifferenti


Debugging HTML5

Una delle cose che ho sempre trovato fastidiose di Javascript era l'assenza di un metodo di debugging step by step

Attualmente la soluzione e' semplice ed integrata in Chrome
Attivando il menu' Strumenti/Strumenti per sviluppatori si apre una finestra al di sotto della pagina visualizzata nel quale sono riassunti i dettagli

In particolare andando al tab Scripts si osserva il codice Javascript ed e' possibile effettuare una sessione di debugging step by step inserendo dei breakpoint cosi' come il qualsiasi altra IDE moderna (ovvero cliccando sul numero di riga all'estrema sinistra del codice)


Veramente molto utile

Adb e Root su Mk808b

Ieri stavo cercando disperatamente di guadagnare i privilegi di root sull' MK808 usando tutte le informazioni sui vari forum
Per ottenere il risultato il primo passo era quello di ottenere un accesso alla macchina mediante Adb
Purtroppo tutti i consigli (tipo collegarsi mediante il cavo OTG scollegando il cavo di alimentazione e le altre Usb) non hanno portato i frutti desiderati... non sono mai riuscito ad ottenere un collegamento Adb

Alla disperazione ho provato a lanciare Root Checker e con mia grande sorpresa ho scoperto che non era necessario nessun unrooting perche' il sistema operativo gia' disponeva dei privilegi di amministratore



Debian su MK808

In questo post un breve video sull'utilizzo di una immagine Debian Complete in Linux Complete Installer su un MK808



come si puo' vedere il processore dual core da 1.2 Ghz fa la sua differenza rispetto alla precedente prova sul Samsung Galaxy Next Plus con processore da 800 MHz single Core

Per la cronaca l'MK808 e' collegato ad un televisore 720p con una risoluzione di 1024x768 che costringe a scrollare a mano in quanto lo schermo e' piu' grande della finestra reale del televisore

giovedì 7 febbraio 2013

Autenticazione su Linux con chiave USB

Ognuno di noi ha qualche chiavetta USB vecchia e poco capiente abbandonata in qualche cassetto ... perche' non usarla??




Nel mio caso ho usato una vetusta chiave Lexar Media da 32 Mb (!!!!) per usare una autenticazione automatica su Linux

per prima cosa si devono scarica i pacchetti pam

apt-get install pamusb-tools libpam-usb

successivamente si inserisce la chiave che si intende configure e si lancia

pamusb-conf --add-device my-usb-stick

seguito da 

pamusb-conf --add-user luca

(dove luca e' il nome dell'utente da configurare)

gia' finito almeno usando una Debian Testing....si puo' vedere il video allegato per verificare il funzionamento. In pratica alla finestra di login si inserisce la chiavetta e si digita il solo username (nel caso in cui non si ha la chiavetta il login e' automatico)



Eventualmente (se si usa Gnome) si puo' settare il comando che all'estrazione della chiavetta fa partire lo screensaver con il lock del monitor modificando il file /etc/pamusb.conf come segue
----------------------------------------------------------------------
<user id="ubuntu-user">
 <device> my-usb-stick </device> 
<agent event="lock">gnome-screensaver-command -l</agent> 
<agent event="unlock">gnome-screensaver-command -d</agent> 
</user>
----------------------------------------------------------------------

Testare PhoneGap con Ripple

Uno dei problemi maggiori di PhoneGap e' quello di non poter usare il debugger integrato nell'Android SDK in quanto tutto il codice e' Javascript

Per questo motivo puo' essere utile testare il solo codice HTML5 e PhoneGap in un ambiente esterno e la soluzione puo' essere utilizzare Ripple, una estensione per Chrome che permette questo tipo di operazione

Per prova e' stato utilizzato il codice del post precedente ed e' stato configurato un web server locale nel quale sono stati inseriti i file della cartella assets del progetto



Come si puo' vedere e' possibile simulare le accelerazioni e si osserva il programma in esecuzione come se fosse su un telefono reale

PhoneGap



PhoneGap e' un insieme di API che permette di interagire con l'hardware dei dispositivi mobile (Android, IPhone, WebOs ed altri) direttamente da HTML5 ed e' quindi sostanzialmente indipendente dal linguaggio nativo del sistema operativo di ogni telefono


Windows
installare Java JDK (non JRE)
installare Eclipse
installare Android SDK ed ADT
installare Ant
aggiungere alla path le directory platform-tools e tool dell'Android SDK
aggiungere alla path la directory bin del pacchetto ant
eseguire i comandi sottostanti
--------------------------------
C:\>set JAVA_HOME="C:\Programmi\Java\jdk1.7.0_09\bin"
C:\>set PATH=%JAVA_HOME%\bin;%PATH%
--------------------------------


Linux
in Linux (Debian Testing) l'unico problema e' relativo al fatto che stranamento ant non e' incluso in openjdk-7 ma nella versione 6 per cui deve essere scaricato il pacchetto precedente


Una volta configurato il sistema si procede andando nella directory
/phonegap/lib/android/bin
e si lancia il comando
create /directory_lavoro  com.prova.test phonegap

che creera' un nuovo progetto nella directory di lavoro.
A questo punto si apre Eclipse e si crea un nuovo progetto da Android Project From Existing code e si punta alla directory create

Il risultato sara' qualcosa di questo tipo




si vede subito che la funzione main e' piuttosto stupida in quanto crea un WebView che punta al contenuto di assets

phonegap.java
-------------------------------------------------------

public class phonegap extends DroidGap
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        super.loadUrl("file:///android_asset/www/index.html");
    }
}
----------------------------------------------------------
quindi il codice da mofidicare e' index.html.


Nel seguente esempio ho provato a vedere il risultato dell' accelerometro
Index.html
-------------------------------------------------------

<!DOCTYPE html>
<html>
  <head>
    <title>Accelerazione</title>

    <script type="text/javascript" charset="utf-8" src="cordova-2.3.0.js"></script>
    <script type="text/javascript" charset="utf-8">

    document.addEventListener("deviceready", onDeviceReady, false);

    function onDeviceReady() {
    var options = { frequency: 3000 };
        navigator.accelerometer.watchAcceleration(onSuccess, onError);
    }

    // onSuccess: Get a snapshot of the current acceleration
    //
    function onSuccess(acceleration) {
    
    var accx = document.getElementById('accx');
    var accy = document.getElementById('accy');
    var accz = document.getElementById('accz');
    
    accx.innerHTML = 'Accelerazione X :  '     +acceleration.x;
    accy.innerHTML = 'Accelerazione Y :  '     +acceleration.y;
    accz.innerHTML = 'Accelerazione Z :  '     +acceleration.z;
    
  
    }

    // onError: Failed to get the acceleration
    //
    function onError() {
        alert('onError!');
    }

    </script>
  </head>
  <body>
    <p id="accx">Accelerazione X : </p><br>
    <p id="accy">Accelerazione Y : </p><br>
    <p id="accz">Accelerazione > : </p><br>
    
  </body>
</html>
-------------------------------------------------------

Qui il risultato di 5 minuti di lavoro. I dati vengono riaggiornati ogni 3 secondi


Considerando che ci ho messo meno di 5 minuti a capire come funziona il gioco direi che e' decisamente interessante

ADB in Virtualbox

In alcuni casi puo' essere necessario installare una macchina virtuale per sviluppare in Android senza particolari controindicazione
Qualche problema potrebbe venire dall'utilizzo di Adb con un telefono reale a causa del livello di isolamento derivante dalla macchina virtuale

Nel caso in cui si usi Virtualbox la soluzione e' costuita da installare i driver adb nella macchina host (questo per Windows, in Linux il problema non si pone) e successivamente di aggiungere mediante l'icona con il segno + il device alla macchina virtuale (vedi immagine sottostante)




A questo punto si puo' accendere la macchina virtuale e configurare il dispositivo nella macchina guest

HF WSPR Protocol

Il protocollo WSPR ( che ricorda Whisper ma in realta' significa Weak Signal Propagation Reporter) e' adatto ad inviare Callsign, G...