Eseguire uno script al boot di Linux


Per fare lo start di uno script all'avvio di Linux aggiungere il proprio script nella directory:

/ect/init.d/myscript

e dargli i permessi di esecuzione

chmod +x myscript

Lo script dovrà rispettare il seguente tracciato:

#!/bin/bash 
#chkconfig: 2345 20 80 
#description: Description comes here.... 
#Source function library. 
. /etc/init.d/functions 

start() { 
   # code to start app comes here 

stop() { 
   # code to stop app comes here 


case "$1" in 

start) 
   start 
   ;; 
stop) 
   stop 
   ;; 
restart) 
   stop 
   start 
   ;; 
*) 
   echo "Usage: $0 {start|stop|restart}" 
esac 

exit 0


La riga #chkconfig: 2345 20 80 definisce il runlevel al quale lo script deve essere fatto partire (sul 2°, 3°, 4° e 5° livello) e le priorità di start (20) e di stop (80).
Per verificare il runlevel al quale sta girando la vostra macchina date il comando in un terminale:
runlevel
 I runlevel sono così definiti:
  • 1 Single user (super user)
  • 2 multi user
  • 3 multi user + network
  • 4 (non utilizzato)
  • 5 multi user, network + X11

I runlevel 0 e 6 servono rispettivamente per il system halt e per il reboot.

Una volta copiato lo script nella directory di init.d dare i seguenti comandi per testare lo start dello script: /ect/init.d/myscript start oppure chkconfig myscript start.

Infine aggiungere lo script al chkconfig:
$ chkconfig --add myscript
$ chkconfig --level 2345 myscript on 
e verificarne l'abilitazione:
$ chkconfig --list | grep myscript

Il troppo spesso dimenticato nohup

Per lanciare un comando da shell e farlo girare in background anche se chiudiamo il terminale:
$ nohup ./fooName &
In questo modo è possibile seguire l'output del comando lanciato sul file nohup.out:
$ tail -f nohup.out
Il comando continuerà a girare fintanto che il processo non verrà "killato":
$ ps -ef | grep fooName $ kill -9

Dalla OpenJDK alla Oracle JDK: andata e ritorno



Per installare la JDK di Oracle in alternativa alla OpenJDK installata per default sugli ambienti GNU/Linux, scaricare la versione desiderata da
http://www.oracle.com/technetwork/java/index.html
Per quanto segue si è optato per la JavaSE. Per verificare la versione attualmente attiva:
$ java -version
Dopo aver scaricato il l'archivio compresso tar.gz scompattarlo:
# tar xvf jdk-7u4-linux-x64.tar.gz -C /usr/lib/jvm/
# update-alternatives --install /usr/bin/java java  /usr/lib/jvm/jdk1.7.0_04/bin/java 1065
# update-alternatives --install /usr/bin/javac javac  /usr/lib/jvm/jdk1.7.0_04/bin/javac 1065
dove 1065 è una data priorità.
Per verificare l'avvenuto update:
$ java -version
oppure per cambiare nuovamente JVM ad un'altra versione:
# update-alternatives --config java



[Fonte: http://alexander.holbreich.org/2011/11/java-7-on-debian/]

Arduino sketchbook #3 - LDR di prossimità

Un test interessante sull'utilizzo di restistori LDR come "sensori di prossimità a basso costo". L'idea: sfruttare la variazione della luminosità in base alla riflessione della luce emessa da un LED prossimo al sensore LDR. Sostanzialmente vorrei utilizzare i resistori LDR per avere un feedback sull'avvicinarsi di un ostacolo: avvicinandosi la luce riflessa del LED sul LDR subirà una variazione.


Il feedback in questo caso è dato da due LED che si accenderanno solo nel caso in cui si rileva un "ostacolo".
Un paio di appunti:
1) il valore in risposta dei due LDR deve essere il più simile possibile;
2) i LED affiancati al LDR devono possibilmente non interferire con l'altro resistore LDR.
Per garantire una funzionalità apprezzabile del tutto bisogna tener presente che la risposta della resistenza dei due LDR non sarà mai uguale. Per questo ho previsto un valore di errore del 5% sul confronto fra le risposte dei due resistori entro il quale non succede nulla:
int max = R_val > L_val ? R_val : L_val;
if(R_val < max*(1+0.05) && R_val > max*(1-0.05))
    digitalWrite(R_LED, LOW);
else
     digitalWrite(R_LED, HIGH);
if(L_val < max*(1+0.05) && L_val > max*(1-0.05))
     digitalWrite(L_LED, LOW);
else
     digitalWrite(L_LED, HIGH);
In questo modo si riesce ad ottenere un feedback ad una distanza di < 10cm (non male!).
Lo schema circuitale leggermente complesso prevede:
- 2 resistenze da 220 Ohm
- 4 resistenze da 10 KOhm
- 2 LED Rosso (il feedback)
- 2 LED Blu
- 2 LDR


Di seguito il codice per Arduino:

/**
 * LDRsensor.ino
 * -----------------
 * LDR as cheap sensor of proximity
 *
 * <sabageek.blogspot.com>
**/

const int R_LED = 9;
const int L_LED = 10;
const int digitRled = 2;
const int digitLled = 4;
const int L_LDR = 0;
const int R_LDR = 1;
//methods
void activeLight(int R_val, int L_val);
void setup(){
  pinMode(R_LED, OUTPUT);
  pinMode(L_LED, OUTPUT);
  pinMode(digitRled, OUTPUT);
  pinMode(digitLled, OUTPUT);
}
void loop(){
  //LED check
  digitalWrite(digitRled, HIGH);
  digitalWrite(digitLled, HIGH);
  activeLight((int)analogRead(R_LDR),(int)analogRead(L_LDR));
}
void activeLight(int R_val, int L_val){
  int max = R_val > L_val ? R_val : L_val;
  if(R_val < max*(1+0.05) && R_val > max*(1-0.05))
    digitalWrite(R_LED, LOW);
  else
    digitalWrite(R_LED, HIGH);
  if(L_val < max*(1+0.05) && L_val > max*(1-0.05))
    digitalWrite(L_LED, LOW);
  else
    digitalWrite(L_LED, HIGH);
}

Arduino sketchbook #2

Il "sunday project" di questo fine settimana è stato un modo utile per capire il funzionamento della comunicazione seriale fra Arduino e il sistema operativo. Il funzionamento è semplice: i LED vengono illuminati convertendo il codice esadecimale passato attraverso la porta seriale in segnale analogico. Ad esempio per generare il colore giallo:

#FFFF00  -->  red = 255, green = 255, blue = 0

I componenti utilizzati per il circuito sono pochissimi:
- 3 resistenze da 220 Ohm;
- 3 LED (rosso, verde, blu)



Lo schema cicuitale e il codice utilizzato:




/**
 * color.ino
 * -----------------
 * Fetch a RGB hex color code and forward to Arduino
 *
 * <sabageek.blogspot.com>
**/

const int R_LED = 9;
const int G_LED = 10;
const int B_LED = 11;

char buffer[6] = {0,0,0,0,0,0};
int rgb[3] = {0,0,0};
int idx = 0;

int hex2dec(char c);

void setup(){
  Serial.begin(115200);
}

void loop(){
  if(Serial.available()){
    if((char)Serial.read()=='#')
      while(idx<6)
        buffer[idx++]=toupper((char)Serial.read());
  } else {
    idx=0;
    for(int i=0; i<6; i+=2)
      rgb[i/2] = hex2dec(buffer[i+1])+hex2dec(buffer[i])*16;
    analogWrite(R_LED, rgb[0]);
    analogWrite(G_LED, rgb[1]);
    analogWrite(B_LED, rgb[2]);
    delay(100);
  }
}

int hex2dec(char c){
  if(c>='A' && c<='F')
    return (int)(c - 'A')+10;
  else if (c >= '0' && c<='9')
    return (int)(c - '0');
}