martedì 11 marzo 2014

Cambiare diapositiva su Impress mediante gesture a webcam

Un amico mi ha chiesto se era possibile sviluppare una piccola applicazione interattiva per il museo di Scienze Geologiche del Dipartimento di Scienze della Terra di Firenze
L'idea di base era quella di usare Kinect per cambiare la slide ad una presentazione a video

L'idea mi sembrava carina ma piuttosto costosa in quanto necessita di un Kinect e di un computer discretamente potente per fare processare i dati (Kinect di suo non interpreta le gesture, e' solo un insieme di sensori)..volevo vedere se era possibile fare la stessa cosa usando solo una Raspberry ed una normale Webcam




L'idea di base e' stata rubata a questo sito semplificando di molto per cio' che non mi occorre. In pratica sull'immagine della Webcam sono state create due aree sensibili (i due cerchietti in alto, per essere precisi vengono letti solo due pixel), se l'utente passa la mano sui cerchietti (o meglio se viene individuata una variazione dell'immagine in corrispondenza dei pixel sensibili) viene generato un evento.
Per evitare falsi allarmi e' stato impostato una distanza minima di 1.5 secondi tra due eventi
Il programma processa i dati della webcam, crea una immagine differenza tra le immagini in sequenza e crea una immagine maschera dei pixel che risultano cambiati (si puo' vedere premendo il tasto d durante l'esecuzione). La condizione di pixel non cambiato e' 0, la condizione di cambiato e' 255

Se viene generato un evento allora mediante il programma xdotool viene inviato un segnale Freccia Destra/ Freccia Sinistra alla finestra che ha per nome "'presentazione.odp - LibreOffice Impress"

Ovviamente ci sono dei limiti all'utilizzo (del tipo la webcam non deve essere orientata verso il corridoio del museo altrimenti vengono generati eventi ogni volta che passa una persona) ma considerando il costo dell'applicazione e le possibili applicazioni (si puo' fare per esempio un quiz interattivo per bambini) direi che e' abbastanza interessante

-----------------------------------------------------------------------------
#!/usr/bin/env python

import cv
import time

from scipy import *
from scipy.cluster import vq
import numpy
import sys, os, random#, hashlib

from math import *


class Target:
def __init__(self):

if len( sys.argv ) > 1:
self.writer = None
self.capture = cv.CaptureFromFile( sys.argv[1] )
frame = cv.QueryFrame(self.capture)
frame_size = cv.GetSize(frame)
else:
fps=15
is_color = True


self.capture = cv.CaptureFromCAM(0)
cv.SetCaptureProperty( self.capture, cv.CV_CAP_PROP_FRAME_WIDTH, 640 );
cv.SetCaptureProperty( self.capture, cv.CV_CAP_PROP_FRAME_HEIGHT, 480 );
frame = cv.QueryFrame(self.capture)
frame_size = cv.GetSize(frame)

self.writer = None

frame = cv.QueryFrame(self.capture)
cv.NamedWindow("Museo", 1)



def run(self):

frame = cv.QueryFrame( self.capture )
frame_size = cv.GetSize( frame )

contatore = 0
tempo_d = 0
tempo_s = 0

# Capture the first frame from webcam for image properties
display_image = cv.QueryFrame( self.capture )

# Greyscale image, thresholded to create the motion mask:
grey_image = cv.CreateImage( cv.GetSize(frame), cv.IPL_DEPTH_8U, 1 )

# The RunningAvg() function requires a 32-bit or 64-bit image...
running_average_image = cv.CreateImage( cv.GetSize(frame), cv.IPL_DEPTH_32F, 3 )
# ...but the AbsDiff() function requires matching image depths:
running_average_in_display_color_depth = cv.CloneImage( display_image )

# The difference between the running average and the current frame:
difference = cv.CloneImage( display_image )

#t0 = time.time()

# For toggling display:
image_list = [ "camera", "difference", "threshold"]
image_index = 0   # Index into image_list


# Prep for text drawing:
text_font = cv.InitFont(cv.CV_FONT_HERSHEY_COMPLEX, .5, .5, 0.0, 1, cv.CV_AA )


while True:
# Capture frame from webcam
camera_image = cv.QueryFrame( self.capture )

frame_t0 = time.time()

# Create an image with interactive feedback:
display_image = cv.CloneImage( camera_image )

# Create a working "color image" to modify / blur
color_image = cv.CloneImage( display_image )

# Smooth to get rid of false positives
cv.Smooth( color_image, color_image, cv.CV_GAUSSIAN, 19, 0 )

# Use the Running Average as the static background
# a = 0.020 leaves artifacts lingering way too long.
# a = 0.320 works well at 320x240, 15fps.  (1/a is roughly num frames.)
cv.RunningAvg( color_image, running_average_image, 0.320, None )

# Convert the scale of the moving average.
cv.ConvertScale( running_average_image, running_average_in_display_color_depth, 1.0, 0.0 )

# Subtract the current frame from the moving average.
cv.AbsDiff( color_image, running_average_in_display_color_depth, difference )

# Convert the image to greyscale.
cv.CvtColor( difference, grey_image, cv.CV_RGB2GRAY )

# Threshold the image to a black and white motion mask:
cv.Threshold( grey_image, grey_image, 2, 255, cv.CV_THRESH_BINARY )
# Smooth and threshold again to eliminate "sparkles"
cv.Smooth( grey_image, grey_image, cv.CV_GAUSSIAN, 19, 0 )
cv.Threshold( grey_image, grey_image, 240, 255, cv.CV_THRESH_BINARY )

grey_image_as_array = numpy.asarray( cv.GetMat( grey_image ) )




c = cv.WaitKey(7) % 0x100
if c == 27 or c == 10:
break

# Toggle which image to show
if chr(c) == 'd':
image_index = ( image_index + 1 ) % len( image_list )

image_name = image_list[ image_index ]


# Display frame to user
if image_name == "camera":
image = camera_image
cv.PutText( image, "O", (50,50), text_font, cv.CV_RGB(255,0,0) )
cv.PutText( image, "O", (590,50), text_font, cv.CV_RGB(0,255,0) )
elif image_name == "difference":
image = difference
cv.PutText( image, "O", (50,50), text_font, cv.CV_RGB(255,0,0) )
cv.PutText( image, "O", (590,50), text_font, cv.CV_RGB(0,255,0) )

elif image_name == "threshold":
# Convert the image to color.
cv.CvtColor( grey_image, display_image, cv.CV_GRAY2RGB )
image = display_image  # Re-use display image here
cv.PutText( image, "O", (50,50), text_font, cv.CV_RGB(255,0,0) )
cv.PutText( image, "O", (590,50), text_font, cv.CV_RGB(0,255,0) )

cv.PutText( image, str(contatore), (320,50), text_font, cv.CV_RGB(0,0,255) )

cv.ShowImage( "Museo", image )

#print grey_image_as_array.item((50,50))

if ((grey_image_as_array.item(50,50) == 255) and ((time.time()-tempo_d) > 1.5)):
#print time.time()-tempo_d
tempo_d = time.time()
contatore = contatore + 1
#print "destra"
os.system("xdotool key --window $(xdotool search --name 'presentazione.odp - LibreOffice Impress') Left")


if ((grey_image_as_array.item(50,590) == 255) and ((time.time()-tempo_s) > 1.5)):
#print time.time()-tempo_s
tempo_s = time.time()
contatore = contatore - 1
#print "sinistra"
os.system("xdotool key --window $(xdotool search --name 'presentazione.odp - LibreOffice Impress') Right")



if self.writer:
cv.WriteFrame( self.writer, image );



if __name__=="__main__":
t = Target()
t.run()




Xdotool

In questa prova viene presentato un semplice software per interagire con il Desktop  grafico direttamente da script
il programma si chiama xdotool


con questo semplice script in Python per  esempio si fa disegnare un cerchio sullo schermo al cursore del mouse (attenzione che si perde il controllo del mouse, per bloccare lo script si deve agire da tastiera)
--------------------------------------------------------------
import os,math

angolo = 0.0


while 1:

angolo = angolo+0.01

os.system("xdotool mousemove "+str((math.cos(angolo)*100)+300)+" " str((math.sin(angolo)*100)+300))


Prove di IBS PocketBook Basic Touch

Sono sempre stato curioso di provare i dispositivi E-Ink come il Kindle e quando ho visto che la mia biblioteca ne dava alcuni in prestito (come se fossero libri) ho noleggiato il PocketBook Basic Touch della IBS

Si tratta di un dispositivo da 6 pollici a 16 livelli di grigio 800x600 con 4 Gb di memoria (espandibile da SD Card) che ha un costo di circa 75 euro
Le impressioni di uso sono abbastanza scoraggianti.
Ad esclusione della plastica del case, di qualita' non eccelsa, la cosa piu' fastidiosa e' il refresh dello schermo E-Ink. Come si puo' vedere dal mini video sottostante lo scroll e' tutto fuorche' fluido e lo schermo diventa in negativo ad ogni azione



Per confronto ho effettuato le stesse operazioni con il medesimo pdf sul Nexus 7 2012 usando MoonReader e l'usabilita' e' decisamente differente



Certo che i consumi di un ebook reader  sono ridicoli rispetto ad un vero tablet


ma mi risulta difficile pensare a cosa possa servire un browser ed un visualizzatore di foto su uno schermo a 16 colori


In conclusione la chicca. Sono andato a letto e volevo leggere un po'...niente retroilluminazione. Il modello con retroilluminazione costa 125 euro. A questo punto la partita, anche economica, e' vinta dai tablet


Keepod vs Tails

Recentemente e' uscita una pagina intera su Repubblica ed un servizio al TG sul progetto Keepod,finanziato tramite IndieGoGo, con l'obbiettivo di garantire l'accesso al Personal Computing a quel 70% della popolazione mondiale che adesso non puo' permetterselo.


Progetto con finalita' sicuramente nobili che richiedeva un finanziamento di 38.000 dollari per creare un sistema operativo leggero e sicuro su chiave USB da affidare a ciascuna persona compresa nel progetto.

Al di la' della pagina intera di Repubblica la cosa mi sembrava di averla gia' vista diverse volte e di averla anche usata ed alla fine mi e' venuto in mente il progetto Tails, una distribuzione Linux avviabile da chiave USB fortemente orientata alla privacy con protezione sia del traffico dati che dei dati sulla penna USB


A cosa servono quindi i 38.000 dollari??? A sviluppare il sistema ?? Direi di no in quanto ci sono molte soluzioni gia' funzionanti oltre allo stesso Tail. A comprare il solo supporto fisico,ovvero la chiavetta, e a finanziare il costo di spedizione ??? Non c'e' traccia di cio' nel sito.

Mi sa che il progetto OLPC, anche se decisamente piu' ambizioso, era decisamente piu' trasparente

lunedì 10 marzo 2014

SSH Client su Mac Os X

Per ottenere un client SSH su Mac Os X si puo', una volta aperto Terminale, andare nel menu Shell ed creare Nuova Connessione Remota dove impostare i parametri del server SSH

altrimenti rimane sempre valido da shell di Terminale digitare

ssh luca@xxx.xxx.xxx.xxx

Ubuntu su MacBook Late 2007 A1151

Seguendo il post precedente ho provato ad installare Linux su una macchina Apple piu' recente ed in particolare un MacBook Late 2007 A1151.
Si tratta di due macchine completamente differenti in quanto l'A1151 e' praticamente un PC con un architettura Intel completa




L'installazione e' iniziata partizionando da Disk Utility (ovvero sotto OS X) il disco fisso per fare spazio alla partizione Linux ed alla Swap Linux.
A questo punto e' stato inserito un CD x86 32 bit di Ubuntu 12.04 ed e' stato effettuato il boot da CD tenendo premuto il tasto C in partenza. L'installazione e' avvenuta in modo identico a come si farebbe su normale PC. L'unica accortezza e' il posto dove salvare il grub che deve essere la partizione in cui e' stata installato Linux

A questo punto pero' Ubuntu non e' ancora avviabile in quanto e' neccario installare il software rEFind semplicemente scaricando il pacchetto e lanciando lo script ./install
Al successivo riavvio si mostrera' la schermata sottostante che permette di scegliere quale sistema avviare




Cosa non funziona subito:
ISight
La webcam non funziona di default con Ubuntu. Come indicato da questo link, Ho cercato su Google la parola AppleUSBVideoSupport, scaricato il file Isight.fw e successivamente installato il pacchetto

sudo apt-get install isight-firmware-tools

a questo punto si indica al programma dove trovare il file .fw e si riavvia.
A questo punto la webcam funziona normalmente

Trackpad
al termine dell'installazione il trackpad non sembra funzionare. In realta' il driver e' caricato ma sono sballate le configurazioni. E' sufficiente inserire nel file .bashrc i seguenti settaggi

synclient FingerLow=10
synclient FingerHigh=20

o valori simili a seconda del gusto per rendere utilizzabile il trackpad

Altri problemi
1) in alcuni casi non viene effettuato lo shutdown completo. L'utente deve spengere manualmente la macchina
2) in avvio in alcuni casi si ha il messaggio "impossibile montare la directory /tmp". Non ho capito cosa genera l'errore ma il sistema si avvia comunque normalmente

Documentario sui Frattali

Frugando su Internet ho trovato questo video ed e' stato un salto nel passato.
Correvano i primi anni 90 (non ricordo bene ma doveva essere 91-92) quando con due amici matematici lo comprammo via posta da LeScienze


Ci capii poco allora (come adesso) ma ricordo bene i tentativi di fare musica frattale con Olivetti M24 (e prima con un Commodore 64)

Target Mode su Mac

Ancora una volta mi sono trovato a dover passare dati tra il Mac Mini ed un altro computer.
In precedenza avevo utilizzato una Debian Box su cui avevo montato un FTP Server ed avevo scaricato i dati via rete mediante cavo cross (su PPC e' disponibile Transmission)

(ps sconsigliatissimo anche solo provare a copiare 100 Giga di dati usando dischi esterni USB)

Stavolta pero' il passaggio era Mac2Mac (da MacMini a MacBook late 2007) per cui ho voluto provare il trasferimento via cavo FireWire


Mediante il Target Mode e' possibile infatti che il computer sorgente dei dati venga avviato solo come se fosse un disco esterno. La procedura prevede di accendere la macchina target tenendo premuti i tasti CTRL+T. Se il comando e' riconosciuto a monitor si osserva l'icona dell'immagine sovrastante e compare una nuova unita' nel Finder

La velocita' di trasmissione e' stata di leggermente superiore ad 1Gigabyte/minuto

Nota bene: di solito non uso tastiera Apple connesse a Mac. Nel caso in esame, ho sempre utilizzato una tastiera Logitech Internet Navigator connessa al Mac Mini

Con questa tastiera mi e' stato impossibile entrare in Target Mode. Sostituendo con una tastiera USB con funzionalita' di base invece tutto ha funzionato

lunedì 3 marzo 2014

Linux su IBook A1054

Giusto per divertimento ho voluto provare a montare Linux su un IBook G4 A1054 che attualmente monta Mac OS X 10.4 e che svolge ancora decentemente il suo lavoro

Per rendere la cosa piu' semplice mi sono indirizzato su una distribuzione LUbuntu


Gia' dai primi passi iniziano i problemi. Il live CD entra in errore e stalla completamente con l'errore Fixing recursive fault but reboot is needed


Dopo qualche ricerca il sistema si e' avviato digitando al boot la seguente strina

live video=radeonfb:1024x768-32 snd-powermac.blacklist=yes

la prima parte rende utilizzabile X (altrimenti parte in modalita' 8 colori e l'installer si blocca) mentre la seconda risolve il problema sulla scheda audio che blocca il boot

Arrivati al momento di effettuare le partizioni si vede che non c'e' il supporto per il ridimensionamento delle partizioni HFS+. Sono ripartito sotto Mac OS X ed ho cercato di dividere il disco mediante Disk Utility ma con Mac OS X 10.4 non e' prevista questa opzione (presente sicuramente su 10.6)



Alla fine dei conti ne vale la pena formattare un disco di un calcolatore funzionante di cui non ho i dischi di reinstallazione (ho perso il DVD di installazione di 10.4) solo per provare una Ubuntu sicuramente poco supportata....diciamo di no. Mi sono tenuto il Mac funzionante con Os X anche se fa un certo effetto Linux anche su hardware Apple

giovedì 13 febbraio 2014

"Unable send data to printer" dopo aggiornamento

Dopo un aggiornamento di Cups ho perso il controllo della stampante Samsung ML-2160


L'unica soluzione che ho trovato e' stata quella di entrare nell'amministrazione di CUPS http://localhost:631/admin) e ricreare una nuova stampante. A questo punto e' stato possibile stampare ed eliminare la precedente stampante che risulta bloccata

lunedì 10 febbraio 2014

Kinect su Debian


Grazie ad un amico che e' passato su XBoxOne ho potuto provare la vecchia versione di Kinect da XBox360.

Per interagire con il dispositivo si deve usare (su computer non Windows) la libreria OpenKinect che ho compilato dai sorgenti mediante i comandi

apt-get install cmake libglut3-dev pkg-config build-essential libxmu-dev libxi-dev libusb-1.0-0-dev

git clone https://github.com/OpenKinect/libfreenect.git 
cd libfreenect
mkdir build
cd build
cmake .. 
make
sudo make install
sudo ldconfig /usr/local/lib64/

per verificare che il tutto funzioni si puo' lanciare il comando glview



Il sistema funziona ma l'aspetto piu' interessante e' quello delle interpretazioni delle gesture in modo da rendere veramente interattivo il kinect.
La soluzione piu' semplice e' quella di usare Processing con la libreria Simple OpenNI (che si installa dall'interno di Processing con il menu Sketch->Import Library->Add Library. Esistono molti esempi in questo campo ed anche un libro (sull'interazione tra Kinect ed Arduino) ma con la versione 2 della libreria gli sketch non sembrano funzionare ed e' bene usare gli esempi legati alla libreria scaricata)





Funziona tutto tranne il fatto che viene mostrato questo errore

Listening for transport dt_socket at address: 8276
libEGL warning: failed to create a pipe screen for i965
Smooth is not supported by this hardware (or driver)

per questo motivo non e' possibile vedere il tracking delle mani nel video sottostante (esempio Hands3D)


venerdì 7 febbraio 2014

Trasduttore lineare potenziometrico con Arduino Uno e ADS1115


La prova effettuata in questo post e' stata ripetuta con uno strumento della ditta Controls model 82 P0330, questo perche' il calibro centesimale e' specifico per questo strumento



Il trasduttore presenta un connettore a 6 poli come quello dello schema sottostante. Di fatto i poli utili sono solo 3 


e questa e' la pedinatura dei colori
5V = colore rosso
Segnale = marrone
GND = blu

lo strumento e' stato collegato ad una Arduino Uno mediante un ADC a 16 bit ADS1115
A differenza del precedente strumento il segnale oscilla tra 5 V (pistone completamente esteso) a 0 V (pistone completamente compresso)




lo sketch impiegato e' stato il seguente (gain a 2/3) vista l'uscita dello strumento
-----------------------------------------------
#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads;  /* Use this for the 16-bit version */

void setup(void) 
{
  Serial.begin(9600);
  //                                                                ADS1015  ADS1115
  //                                                               -------  -------
  ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV
  
  ads.begin();
}

void loop(void) 
{
  int16_t adc0, adc1, adc2, adc3;

  adc0 = ads.readADC_SingleEnded(0);
  Serial.print("AIN0: "); Serial.println(adc0);
  delay(100);
}

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

questa e' la tabella delle misure


Le misure erano stabili fino alle decine mentre le unita' non possono considerate rappresentative

Ed ecco i grafici (una serie in compressione, l'altra in distensione)



In conclusione si e' vista una ottima linearita' dei dati. Considerando che per un millimetro cambiano circa 2645 DN e dato che le unita' sono poco significative si puo' dire che la minima variazione letta con sicurezza e' 1mm/264 = 0.004 mm. Dato che il calibro e' di tipo centesimale si ha che il traduttore legge tranquillamente dati precisi al centesimo di millimetro

venerdì 31 gennaio 2014

Phonegap-Cordoba 3.0 con Android/Ios/FirefoxOS

Visto che oramai ho terminali Android, Ios e FirefoxOs ho voluto riprovare ad usare Phonega e nel frattempo le procedure di installazione sono decisamente cambiate


Phonegap/Cordoba si installa mediante Node.js per cui si deve prima installare il pacchetto Node.Js
Su Windows e MacOs c'e' un semplice installare mentre su Linux Node.js si installa scaricando direttamente i sorgenti e con la classica procedura
./configure
make
make install
(la procedura non e' rapidissima)

successivamente si inizia ad installare Phonegap con il comando
npm install -g phonegap
(forse e' inutile ma ho installato anche Cordova)
npm install -g cordova


si crea quindi il progetto
phonegap create hello com.example.hello HelloWorld
cd hello

e qui iniziano le differenze che ho trovato con le istruzioni ufficiali del sito

per creare il progetto Phonegap Android si deve dare direttamente il comando
phonegap build android
(devono essere setttata la Path per trovare la directory tools e platform-tools dell'SDK di Android altrimenti il comando fallisce con il comando
)
oppure
phonegap build ios

per lanciare l'esecuzione sul telefono
phonegap run android

oppure
phonegap run ios
(se non viene trovato il telefono fisico viene lanciato in automatico l'emulatore.

Nel caso di IOS deve essere prima installato il pacchetto ios-sim con i comandi
sudo su
xcodebuild -license
npm install -g ios-sim
)
Lanciato il comando l'emulatore parte ma si arriva a questo errore

Di fatto la directory www del progetto creato su Ios risulta vuota (c'e' solo un file .xml). Per risolvere il problema l'unica soluzione che ho trovato e' stata quella di copiare la directory www da un progetto Phonegap creato su Linux. Fatto cio' tutto inizia a funzionare perfettamente

A questo per aggiungere funzionalita' legate all'hardware dei telefoni si devono installare i plugin per le varie funzionalita'. Per test e' stato scaricato ed attivato il 

cordova plugin add org.apache.cordova.device

Ed ecco lo stesso programma di esempio che funziona, senza modifiche, sulle due piattaforme Android ed Ios

Phonegap su Ios

Phonegap su emulatore Android in Ios

si puo' aggiungere al progetto anche FirefoxOs mediante
cordova platform add firefox

il problema e' che l'emulatore di Firefox Os non funziona sotto Mac Os X (almeno al momento in cui scrivo questa riga). Parte e si chiude dopo qualche secondo. Per ovviare al problema ho spostato tutta la cartella della piattaforma Firefox sull'emulatore di Windows e selezionato il file manifest.
Si osserva che il supporto di Phonegap a Firefox e' ancora poco maturo in quanto le API ancora non funzionano (almeno quelle dell'esempio)









Installazione Arch Linux

E' da un po' di tempo che sento un gran parlare di Arch Linux e volevo provare ma la procedura di installazione e' cosi' antiquata (mi sembra di essere tornato nel 1998) che mi ero sempre scoraggiato....ma sembra che i vantaggi siano ricompensati dalla fatica di installazione



Per la prova ho installato Arch Linux su Virtualbox partendo con boot da Cd (nessun network install per adesso)

Si arriva ad una shell bash con privilegi di root
Per prima cosa si imposta la tastiera italiana
loadkeys it

si edita quindi il file locale.gen
nano /etc/locale.gen

togliendo il cancelletto alla riga di interesse
it_IT.UTF-8 UTF-8

si lancia poi il comando
locale-gen 

e si esporta la variabile LANG
export LANG=it_IT.UTF-8

la rete e' stata configurata mediante DHCP senza troppi problemi.
A questo punto si inizia il partizionamento del disco fisso (semplice, una partizione piu' una swap)

fdisk /dev/sda
n - p - 1 
l'inizio della partizione e' confermata come default
la dimensione della partizione e' fissata in 7 Giga con il comando
+7G

per la swao
n - p - 2
conferma tutto
con t si cambia il tipo della seconda partizione da Linux (83) a Linux Swap (82)

p per verificare
w per scrivere ed uscire

si formatta la prima partizione come ext4
mkfs.ext4 /dev/sda1
si attiva la seconda partizione come swap
mkswap /dev/sda2

lsblk /dev/sda
mount /dev/sda1 /mnt

Adesso c'e' bisogno della rete. Se c'e' un proxy si devono effettuare i settaggi
export http_proxy=http://mioproxy:8080
export https_proxy=http://mioproxy:8080

si aggiornano i pacchetti e si installa il sistema base
pacstrap -i /mnt base
si conferma vengono scaricati circa 140 Mb

si effettua il chroot
arch-chroot /mnt /bin/bash

si ripetono i settaggi locali
nano /etc/locale.gen
it_IT.UTF-8 UTF-8
locale-gen
echo LANG=it_IT.UTF-8 > /etc/locale.conf # export LANG=it_IT.UTF-8
loadkeys it 
setfont Lat2-Terminus16

per renderlo definitivo
nano /etc/vconsole.conf
KEYMAP=it FONT=Lat2-Terminus16


per settare la timezone
ln -s /usr/share/zoneinfo/Europe/Rome /etc/localtime

per settare l'orologio
hwclock --systohc --utc

abilitazione del DHCP per la rete
systemctl enable dhcpcd.service

a questo punto si mette la password per root
passwd

e si installa Grub
pacman -S grub
grub-mkconfig -o /boot/grub/grub.cfg
grub-install --target=i386-pc --recheck /dev/sda

si termina quindi la prima fase dell'installazione
exit
umount -R /mnt
reboot

a questo punto e' meglio creare un utente non amministratore per l'uso normale
useradd -m luca
passwd luca

abilitazione del comparto sonoro
pacman -S alsa-utils

Installazione di XOrg ed LXDE
pacman -S xorg-server xorg-server-utils xorg-xinit mesa lxde dbus xf86-video-fbdev

prima di lanciare il comando startx si deve creare il file .xinitrc nella propria home
nano .xinitrce si  aggiunge la seguente riga
exec startlxde


adesso si puo' lanciare
startx

Installazione di Slim
pacman -S slims
ystemctl enable slim

Purtroppo per Arch non c'e' supporto semplice per Virtualbox per cui c'e' da fare un po' di lavoro a mano
pacman -S virtualbox-guest-utils

si crea e si edita il file virtualbox.conf
nano/etc/modules-load.d/virtualbox.confaggiungendo su ogni riga
vboxguest
vboxsf
vboxvideo

e da linea di comando si lancia
VBoxClient-all
systemctl enable vboxservice


alla fine il sistema e' decisamente performante (anche perche' ridotto all'osso) ma penso che si possa arrivare a conclusioni simili (e con minor fatica) facendo una installazione manuale di Debian da Netinstall

Midnight Commander su Os X

Dove c'e' una shell ci dovrebbe essere Midnight Commander ..ed Os X non fa eccezione
Il programma si puo' installare da questo link
Essendo un programma da shell alla fine dell'installazione non si trova niente nella cartella Applicazioni, ma basta aprire un terminale e digitare mc che si apre Midnight Commander
Ci sono un po' di problemi di ambientazioni da Linux/PC a OsX in quanto nelle tastiere Apple non e' presente il tasto Ins, per selezionare si preme la combinazione CTRL+T

Di default inoltre i tasti funzione delle tastiere Apple hanno altre funzioni. Per abilitare il comportamento classico da Impostazioni Tastiera si deve spuntare "Utilizza tutti i tasti F1,F12 come tasti funzione" e nel tab successivo (Abbreviazioni da tastiera) si deve togliere la scorciatoia di F9 ed F10 (in particolare F10 che serve ad uscire da mc)






Piena del Mugnone


Attraversamento depuratore Pian del Mugnone

Attraversamento a monte di Pian del Mugnone


mercoledì 29 gennaio 2014

Seti@home

Dopo oltre 10 anni sono ritornato a far lavorare il calcolatore per Seti@home (oltre ad un progetto per la struttura 3D delle proteine)



In attesa di dire WOW.....

Mandelbrot su IPhone/IOS

Per disegnare Mandelbrot su un Iphone per prima cosa si deve trovare una superficie su cui disegnare.
Scartata l'ipotesi di OpenGL (troppo complicata), la cosa piu' semplice e' utilizzare la libreria Quartz 2D facendo un subclass di UIView (per il dettaglio seguire questo link)




Questo puo' essere effettuato con i seguenti comandi (partendo da un progetto vuoto con View-Based Application)
File -> Add Files to 
si seleziona Objective-C Class e in basso si seleziona SubClass of UIView
Si seleziona un nome per la nuova classe e si conclude

In seguito dall'Interface Builder (il creatore di interfacce visuali) si seleziona tutta la finestra (UIView), si preme Command+4 e si modifica la classe da UIView con il nome precedentemente selezionato

Fatto cio' si trova che nel file miaclasse.m un scheletro vuoto di una funzione drawRect.Qui si puo' inserire il codice per la generazione dell'insieme di Mandelbrot

------------------------------------------------------------
//
//  Draw2D.m
//  Mand
//
//  Created by Luca Innocenti on 27/01/14.
//  Copyright (c) 2014 Luca Innocenti. All rights reserved.
//

#import "Draw2D.h"

@implementation Draw2D

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, 2.0);
    CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);

    
    int SCREEN_WIDTH = 480;
    int SCREEN_HEIGHT = 320;
    
    float re_min = -2.0;
    float im_min = -1.2;
    float re_max = 1.0;
    float im_max = 1.2;
    int iterazioni = 60;
    float a,b;
    float x,y,x_new,y_new;
    int test;
    int k,j,i;
    
    float re_factor = (re_max-re_min);
    float im_factor = (im_max-im_min);
    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)
                    {
                        CGContextMoveToPoint(context, i, j);
                        CGContextAddLineToPoint(context, i+1,j);
                        CGContextStrokePath(context);
                    }
                    break;
                }
                x = x_new;
                y = y_new;
            }
        }
    }
}

@end
--------------------------------------------------------------


martedì 28 gennaio 2014

ADS1115 ADC 16Bit su Arduino Uno

Per il progetto di acquisizione dati del Laboratorio Terre del Dipartimento di Scienze della Terra e' necessario utilizzare un convertitore analogico digitale migliore di quello presente su Arduino (10 bit =1024 livelli per Arduino Uno e 12 bit=4096 livelli per Arduino Due)

La soluzione piu' semplice e' stata utilizzare l'ADS1115, un integrato che dialoga su canale I2C con quattro ingressi analogici (in multiplex) con un ADC da 16 bit montato su una BreakOut della AdaFruit


http://learn.adafruit.com/assets/2675
Le connessioni sono semplici

Vdd = 5 V Arduino
GND = GND Arduino
SDA = A4 Arduino
SCL = A5 Arduino

non sono necessarie le resistenze di PullUp sui pin A4,A5
L'integrato ADS1115 contiene al suo interno sia l'oscillatore che la tensione di riferimento per cui non e' necessaria ulteriore elettronica di contorno. E' possibile anche settare il valore del guadagno

Per i vari valori di guadagno si hanno differenti valori di fondo scala e differente sensibilita'

Gain 2/3 : fondo scala 6.144V 1bit = 0.1875 mV
Gain 1 : fondo scala 4.096V 1bit = 0.125 mV
Gain 2 : fondo scala 2.048V 1bit = 0.0625 mV
Gain 4 : fondo scala 1.024V 1bit = 0.03125 mV
Gain 8 : fondo scala 0.512V 1bit = 0.015625 mV
Gain 16 : fondo scala 0.256V 1bit = 0.0078125 mV

(attenzione: se si setta un guadagno e si eccede il fondo scala si rischia di bruciare l'ADC)

Considerando le tensioni di lettura della strumentazione del laboratorio di geotecnica il Gain ottimale e' il 4

Per controllare questo componente si usa la libreria scaricabile a questo indirizzo 

Di seguito un semplice esempio ovvero la misura della tensione su un potenziometro variabile (montato su A0 dell'ADS1115)


ed ecco il semplice codice per la lettura
----------------------------------------------------------
#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads;  /* Use this for the 16-bit version */

void setup(void) 
{
  Serial.begin(9600);
  //                                                                ADS1015  ADS1115
  //                                                               -------  -------
  ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV
  
  ads.begin();
}

void loop(void) 
{
  int16_t adc0, adc1, adc2, adc3;

  adc0 = ads.readADC_SingleEnded(0);
  Serial.print("AIN0: "); Serial.println(adc0);
  delay(100);
}


Bussola non funzionante su Alcatel One Touch Fire 4012X

Aggiornamento
Dopo un mese e 20 giorni il telefono e' rientrato dall'assistenza Alcatel con il medesimo problema
Nonostante quanto riportato dai siti vedi per esempio qui, e qui  mi viene il forte sospetto che il telefono non abbia un sensore per la bussola
---------------------------------------------------------

Alla fine non ho resistito e mi sono comprato l'unico terminale attualmente disponibile in Italia che monta Firefox Os, ovvero l'Alcatel One Touch Fire.
Lo scopo dell'acquisto era quello di effettuare il porting di Geocompass anche per Firefox OS (e nel frattempo imparare un po' di HTML5)

Con mia grande sorpresa pero' la bussola non risulta funzionante. Mediante programma sono riuscito a leggere i valori di inclinazione ma non quelli dell'azimuth (la API e' la medesima quindi non e' un problema di programmazione). Ho provato quindi a scaricare dal Market delle applicazioni di bussola con il medesimo risultato. Nessun segnale dal sensore magnetico

Ho riportato quindi il telefono in assistenza con due scenari possibili:
1) il sensore e' rotto
2) non e' stato implementato il driver all'interno del sistema operativo

Nel negozio era disponibile un altro esemplare in vetrina e grazie al venditore e' stato possibile accenderlo ed installare applicazioni per bussola scaricate sempre dal Market. Medesimo risultato. La bussola non funziona
Attendo speranzoso che torni dall'assistenza ma il sospetto di aver comprato un oggetto per niente testato e' forte


Problemi su bussola di smartphone

Alcune persone del Dipartimento di Scienze Geologiche dell'Universita' di Firenze mi hanno segnalato che la mia applicazione Geocompass non funziona. Il primo istinto e' stato dire: non e' possibile, l'applicazione e' stata scaricata da oltre 2500 persone non ho mai avuto segnalazioni in merito
Sono andato quindi a verificare di persona ed in effetti durante le prove il valore di Dip rimaneva fisso mentre il valore di Strike oscillava sensibilmente. Nelle mie prove non avevo osservato il fenomeno e sono rimasto perplesso. Una volta tornato a casa ho riprovato l'applicazione ed il difetto non si mostrava


A questo punto ho condotto la prova mostratta nel video. Con la stessa applicazione (la mia Geocompass), sullo stesso telefono (il mio Nexus S) ho fatto una prova di misura presso l'ufficio e dopo mezz'ora presso il DST ad Arcetri. Come si vede ad Arcetri le misure oscillano in un range di +- 20° (le misure sono state effettuate il piu' distante possibile da eventuali fonti di interferenza)

Si vede anche chiaramente che il sensore affetto e' il solo sensore magnetico infatti la misura di Dip e' eseguita solo tramite l'accelerometro (e' un calcolo in base alla scomposizione del vettore della forza di gravita') ed e' stabile mentre varia il valore di Strike e' che funzione sia dell'accelerometro sia della bussola digitale

Il sospetto e' che il sensore magnetico sia ingannato da qualche interferenza localizzata

ps: il fenomeno non sembra ascrivibile a cattiva calibrazione del sensore

giovedì 16 gennaio 2014

Arduino nano ed interruttore al mercurio

Un amico mi ha richiesto un sistema basato su Arduino che fosse alimentato da una batteria, che fosse il piu' piccolo possibile e che fosse sempre spento a meno di un evento (il rovesciamento della scheda)

La soluzione piuttosto stupida e' stata quella di usare come fonte di alimentazione una pila V4034PX della Varta da 6 V ed una Arduino micro (hanno piu' o meno le stesse dimensioni)

Tra il polo positivo della pila ed il Vcc dell'Arduino e' stato messo un interruttore a Mercurio (che normalmente e' in posizione aperta). Quando la scheda viene rovesciata il circuito si chiude e si accende l'Arduino


sdf




martedì 14 gennaio 2014

Da Os X 10.6 a 10.7 via USB - Errore su installazione

Mi sono trovato a dover aggiornare un MacBook (Intel Core Due Duo con 2 Giga di Ram) per il passaggio da Mac Os X 10.6 a 10.7. (fra parentesi ho pochissima esperienza con i Mac ed in particolari con la nuova generazione Intel)
Non avendo un supporto fisico (leggasi DVD) ho preparato una chiavetta USB con il metodo che ho riassunto nel video sottostante. In sintesi si prende una chiavetta da almeno 8 Giga, si apre Utility Disco, si formatta la chiavetta e poi si ripristina sulla stessa chiavetta il .dmg del sistema operativo



A questo punto ho fatto partire la macchina tenendo premuto il tasto Option (Alt) e selezionando la chiavetta come disco di avvio. In tutte le prove effettuate, dopo un po' di pensatoio da parte dell'installer, viene sempre generato questo errore. Ho provato a rimuovere la partizione bootcamp, provato a formattare tutto il disco ... niente da fare



Frugando per forum ho trovato l'indicazione di formattare la PRAM prima di tentare l'installazione. A questo punto ho proceduto accendendo il calcolatore e premendo subito la combinazione Option+Command+P+R, il Mac fa Boing e poi fa il reboot. A questo punto ho fatto ripartire l'installazione da Usb Key e tutto e' terminato in modo corretto


Mappa frane da news on line

Correva l'anno 2008 ed il mio direttore di Dipartimento mi aveva chiesto di lavorare sui Big Data per estrarre dati di geolocalizzazione...