Visualizzazione post con etichetta Bash. Mostra tutti i post
Visualizzazione post con etichetta Bash. Mostra tutti i post

venerdì 15 marzo 2024

FTP Bash script

 Uno script rubato su stack overflow per fare l'upload automatico su FTP senza criptazione

 

#!/bin/sh
HOST='ftp.xxxxx.altervista.org'
USER='xxxxxxx'
PASSWD='xxxxxxxxxxxxxxxxxxx'
FILE='luca.jpg'

ftp -n $HOST <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
binary
put $FILE
quit
END_SCRIPT
exit 0

giovedì 17 novembre 2022

Download script per Sentinel

Alcune volte ho avuto problemi nello scaricare dataset da SciHub a causa di connessioni interrotte a meta'

Per ovviare al problema mi sono scritto questo script bash che verifica la correttezza del file zip

#!/bin/bash
# yes | mv ./immagini/*.zip ./backup
#./dhusget_0.3.8.sh -u username -p password -m Sentinel-2 -t96 -o product -c 10.6,43.5:11.3,44 -n 1 -w 5 -O ./immagini

for file in `ls ./immagini/*.zip`
do
#echo $file
if unzip -t $file > /dev/null 2>&1
then
echo "Archivio $file OK"
#unzip $file
else
echo "Archivio $file corrotto"
rm -f $file
fi
done

venerdì 11 novembre 2022

Sentinel 2 da SciHub

Nel precedente post avevo provato a scaricare i dati Sentinel da un bucket Google Cloud
In realta' ho trovato una procedura piu' lineare usando OpenHub di https://scihub.copernicus.eu/ 
E' necessario un account ma non e' legato a nessuna carta di credito ed il download e' libero




Per effettuare la selezione ed il download si usa lo script dhusget (Altre istruzioni a questo link )

una stringa di richiesta e' del tipo

./dhusget_0.3.8.sh -u username -p password -m Sentinel-2 -T S2MSI2A -t96 -o product -c 10.6,43.5:11.3,44 -n 1 -w 5 -O ./immagini

in cui viene effettuata la richeista delle immagini che contengano Firenze (vedi coordinate) acquisite nelle ultime 96 ore della missione Sentinel 2
Si possono specificare anche intervalli temporali tramite intervalli di date (in questo caso tra il 10/8/2022 ed il 12/8/2022

./dhusget_0.3.8.sh -u c1p81 -p xxxxxx@xxxxx -m Sentinel-2 -T S2MSI2A -S 2022-08-10T00:00:00.000Z -E 2022-08-12T00:00:00.000Z -n 1 -w 5 -c 10.6,43.5:11.3,44 -o product  -O ./immagini


Si possono scaricare sia il livello L1C che L2A .. di seguito si riporta il contenuto del file zip
I file zip vanno da circa 800 Mb ad oltre 1.1 Gb
Per selezionare solo un prodotto si puo' usare lo switch 
-T S2MSI1C per L21C
-T S2MSI2A per L2A

Ho notato che il sistema spesso tronca la connessione e non termina in modo corretto il download...se si abilita la funzione di checksum al termine non funziona mai..disabilitandolo invece si ottengono dei download corretti

LEVEL 1C
tutte le bande ognuna alla sua risoluzione nativa + truecolor a 10 m

LEVEL 2A 
risoluzione 10 m
AOT : Aerosol Optical Thickness
WVP : Water vapor 
TCI : Truecolor
Bande B2,B3,B4,B8

risoluzione 20 m
AOT : Aerosol Optical Thickness
WVP : Water vapor 
TCI : Truecolor
SCL : Scene classification map
Bande B1,B2,B3,B4,B5,B6,B7,B11,B12,B8A

risoluzione 60 m
AOT : Aerosol Optical Thickness
WVP : Water vapor 
TCI : Truecolor
SCL : Scene classification map
Bande B1,B2,B3,B4,B5,B6,B7,B9,B11,B12,B8A

con il medesimo sistema si possono ottenere i dati di Sentinel 1 SLC, OCN, GRDH e RAW

giovedì 17 dicembre 2020

Salvare dati seriali orari in Linux

 Per salvare i dati da una porta seriale (nello specifico un GPS) e dividerli in blocchi orari ho trovato comodo il comando timeout che uccide un processo dopo un tempo definito dall'utente

per esempio si puo' creare un file come il seguente

file sig.sh

================================

timeout -sHUP 59m cat /dev/ttyUSB0 > "/$(date +"%Y%m%d_%H_%M").ubx"

================================

a questo punto si puo' mettere il tutto in cron con esecuzione oraria per riavviare  

@hourly /sig.sh

(ho impostato il timeout a 59 minuti in modo da essere sicuro che quando parte il cron con cadenza oraria la porta seriale non sia bloccata dal processo in esecuzione in precedenza)


venerdì 21 febbraio 2020

ConnManCtl Command line network manager

Cercando di mettere su una macchina dalle risorse ridotte ho installato una Debian netinst con I3
Per ridurre il carico volevo un network manager da linea di comando ed ho trovato connmanctl


per utilizzarlo si digita connmanctl e si apre un prompt

enable wifi
scan wifi
services
agent on
connect (si deve copiare la stringa accanto al nome del proprio AP vedi immagine)

Nell'uso mi sono accorto che il DNS non viene gestito dal DHCP ma viene preso quello inserito in resolv.conf

Una volta connessi ad una rete wifi al successivo riavvio non e' necessario ripetere la procedura di autenticazione

venerdì 15 novembre 2019

Preparare i dati per Tensorflow

Questo spero si tratti l'inizio di alcuni post sulla possibilita' di usare Tensorflow per stimare la concentrazione di alcune specie chimiche partendo da spettri IR

Per questo scopo c'e' bisogno di un database in cui sono presenti spettri IR ed analisi composizionali del materiale. L'unico database pubblico che conosco e' usgs_splib07 da questo link

Per semplicita' sono stati selezionati gli spettri a 480 bande


SiO2Al2O3MgO
1Actinolite HS11657,80,2222,4
2Actinolite HS22 54,51,6421,69
3Actinolite HS315 57,71,3824,58
4Albite NMNHC5390 68,1820,070,02
5Almandine HS114 40,422,970,53
6Almandine WS475 37,9822,147,35
7Almandine WS476 39,8422,0410,69
8Almandine WS478 39,0922,055,74
9Almandine WS479 37,3421,938,83
10Andradite NMNH113829 35,50,290,14
11Andradite WS474 35,850,0850,67
12Annite WS661 33,4814,510,006
13Antigorite NMNH96917a41,31,5936,3
14Augite NMNH120049 48,938,4414,37
15Biotite WS660 39,5211,0514,45
16Chlorite SMR-13 3117,330,2
17Clinochlore GDS158 27,519,824,7
18Clinochlore GDS159 31,319,434,7
19Clinochlore NMNH83369 321633,9
20Diopside NMNHR18685 54,770,4918,26
21Elbaite NMNH9421736,8340,560,03
22Epidote GDS26 37,1423,050,06
23Grossular NMNH155371 38,8417,950,15
24Grossular WS484 39,7122,580,019
25Halloysite CM13 46,335,20,31
26Hectorite SHCa-134,70,6915,3
27Hydrogrossular NMNH120555 31,4421,40,17
28Hypersthene NMNHC2368 51,324,8926,09
29Illite GDS4 (Marblehead)51,6223,963,83
30Illite IMt-152,121,92,39
31Kaolinite CM5 44,437,90,11
32Kaolinite CM7 44,636,40,14
33Kaolinite CM9 47,137,40,16
34Kaolinite KGa-1 (wxl)45380,02
35Kaolinite KGa-2 (pxl) 44,237,20,04
36Lizardite NMNHR4687 40,97040,43
37Marialite NMNH126018-259,8820,590
38Meionite WS701 49,625,450,06
39Mizzonite NMNH11377549,625,430,03
40Montmorillonite CM20 5218,363,32
41Montmorillonite CM26 63,418,22,26
42Montmorillonite CM27 57,620,92,66
43Montmorillonite+Illite CM37 46,522,72,74
44Montmorillonite+Illite CM42 54,8213,4
45Montmorillonite SAz-160,417,66,46
46Montmorillonite SCa-2 52,4156,68
47Montmorillonite STx-169,616,33,56
48Montmorillonite SWy-162,919,32,8
49Muscovite GDS108 44350,57
50Nontronite NG-18020,42
51Nontronite SWa-174,67,693,32
52Olivine GDS70 Fo89 41,09049,29
53Olivine GDS71 Fo91 40,06050,7
54Olivine KI3005 Fo11 30,1104,42
55Olivine KI3054 Fo66 36,3032,62
56Olivine KI3188 Fo51 34,34023,8
57Olivine KI3189 Fo60 35,47029,49
58Palygorskite CM46a 5610,68,56
59Pectolite NMNH94865 53,370,030,03
60Phlogopite GDS20 40,314,326,4
61Phlogopite WS496 43,01511,629,62
62Quartz HS117 Aventurine 10000
63Rhodonite NMNHC6148 46,30,050,41
64Richterite NMNH150800 54,871,9722,92
65Saponite SapCa-151,93,660,88
66Sepiolite SepNev-1.AcB 50,90,4522,3
67Talc HS21 60,470,1230,29
68Talc WS659 58,380,1831,9
69Thuringite SMR-1524,721,116,8
70Tremolite NMNH117611 54,61,8823,13
71Vermiculite VTx-1.a19,51,5327,7

I dati sono stati estratti dalla directory ASCIIData/ASCIIdata_splib07a/ChapterM_Minerals selezionando gli spettri denominati BECKb_AREF.
Un esempio di file e'

---------------------------------------
 splib07a Record=120: Actinolite HS116.3B           BECKb AREF
-1.2300000e+034
 3.3700544e-002
 3.5717472e-002
 3.5481069e-002
 3.5344660e-002
 3.4786128e-002
 3.3701397e-002
 3.3403333e-002
 3.3196956e-002
 3.3779550e-002
 3.2682978e-002
 3.3049587e-002
 3.4390874e-002
 3.4718834e-002
 3.6168687e-002
...............................................
---------------------------------------

Si iniziano quindi a preparare i dati per inserirli in un array compatibile con NumPy,formato idoneo al successivo utilizzo con Tensorflow

per prima cosa si toglie la prima riga di intestazione con sed

for f in *.txt ; do sed -i '1d' $f; done

viene quindi eseguito uno script python che legge i dati riga per riga e restituisce una stringa lineare con i dati separati da un punto e virgola

converti.py
=================================
with open("1.txt",'r') as f:
while True:
buf = f.readline()
if not buf:
break
print (buf.strip()),
print ';',
=================================

for f in *.txt ; do python converti.py > a$f; done

i nuovi file avranno il carattere a anteposto al precedente nome file

for f in *.txt ; do python converti.py > a$f; done

si tolgono quindi gli spazi bianchi

for f in a*.txt ; do cat $f  | tr - d "[:space:]" > b$f ; done

i nuovi file avranno il carattere b anteposto al precedente nome file
siamo quasi arrivati alla fine. Ogni file dello spettro e' costituito da un riga, si deve quindi creare un unico file in cui ogni riga rappresenta uno spettro

for f in ba*.txt; do (cat "${f}"; echo) >> completo.txt; done
from numpy import genfromtxt
data = genfromtxt('completo.txt', delimiter=',')


Da notare bene che tensorflow non funziona su macchine con processori non recenti perche' vengono usate delle istruzioni cpu recenti (AVX and AVX2 instruction sets)

Per installare Tensorflow su Debian con virtualenv si usa la sequenza (ripresa da questo sito)

si installa python3
apt-get install python3-venv python3 
mkdir spectra
cd spectra
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install --upgrade tensorflow

per verificare l'installazione si usa 

python -c 'import tensorflow as tf; print(tf.__version__)'
per terminare virtualenv si digita

deactivate

A questo punto ho diviso il file di 71 spettri in una serie di train di 60 spettri ed una serie di test di 11 spettri (x_train,x_test) . Per quanto riguarda le concentrazioni il file delle concentrazioni (y_train, y_test) i valori di concentrazioni sono stati divisi in 10 classi con la seguente regola

0-9.9% : classe 0
10-19.9% : classe  1
20-29.9% : classe  2
30-39.9% : classe  3
40-49.9% : classe  4
50-59.9% : classe  5
60-69.9% : classe  6
70-79.9% : classe  7
80-89.9% : classe  8
90-100% : classe  9

per prova ho usato le concentrazioni di SiO2 (uno dei parametri piu' difficili da determinare da uno spettro IR nel rilevamento iperspettrale)

Prima di procedere i valori No data contenuti negli spettri e indicati dal valore -1.2300000e+034 sono stati convertiti in 0

provando con un rete neurale con delle impostazioni  non ottimizzate

==============================================================
import numpy as np
from numpy import genfromtxt

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

x_train = genfromtxt("x_train.txt",delimiter=';',usecols=np.arange(0,479))
x_test = genfromtxt("x_test.txt",delimiter=';',usecols=np.arange(0,479))

y_train = genfromtxt("y_train.txt",delimiter=';',usecols=np.arange(0,1))
y_test = genfromtxt("y_test.txt",delimiter=';',usecols=np.arange(0,1))

y_train = y_train.transpose()

#print (x_train)


y_train = y_train.astype(int)
y_test = y_test.astype(int)
#print (y_train)

print ("====================")
print ("X trains" + str(x_train.shape))
print ("Y trains" + str(y_train.shape))
print ("X test" + str(x_test.shape))
print ("Y test" + str(y_test.shape))
print ("====================")

model = tf.keras.Sequential()
model.add(layers.Dense(128,activation='relu'))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(10,activation='softmax'))

model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])

model.fit(x_train,y_train,epochs=16)
model.evaluate(x_test,y_test,verbose=2)
==============================================================

il risultato e' il seguente

====================
X trains(60, 479)
Y trains(60,)
X test(11, 479)
Y test(11,)
====================
2019-11-15 13:35:58.075622: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2019-11-15 13:35:58.099810: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2294770000 Hz
2019-11-15 13:35:58.100500: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x38bfc90 executing computations on platform Host. Devices:
2019-11-15 13:35:58.100551: I tensorflow/compiler/xla/service/service.cc:175]   StreamExecutor device (0): Host, Default Version
Train on 60 samples
Epoch 1/16
60/60 [==============================] - 0s 8ms/sample - loss: 2.2551 - accuracy: 0.1000
Epoch 2/16
60/60 [==============================] - 0s 85us/sample - loss: 1.7444 - accuracy: 0.3833
Epoch 3/16
60/60 [==============================] - 0s 90us/sample - loss: 1.6373 - accuracy: 0.3333
Epoch 4/16
60/60 [==============================] - 0s 83us/sample - loss: 1.6465 - accuracy: 0.3167
Epoch 5/16
60/60 [==============================] - 0s 96us/sample - loss: 1.5436 - accuracy: 0.3833
Epoch 6/16
60/60 [==============================] - 0s 127us/sample - loss: 1.6167 - accuracy: 0.3667
Epoch 7/16
60/60 [==============================] - 0s 92us/sample - loss: 1.4574 - accuracy: 0.3833
Epoch 8/16
60/60 [==============================] - 0s 100us/sample - loss: 1.5219 - accuracy: 0.3500
Epoch 9/16
60/60 [==============================] - 0s 81us/sample - loss: 1.4713 - accuracy: 0.4000
Epoch 10/16
60/60 [==============================] - 0s 81us/sample - loss: 1.4284 - accuracy: 0.3500
Epoch 11/16
60/60 [==============================] - 0s 105us/sample - loss: 1.4529 - accuracy: 0.4167
Epoch 12/16
60/60 [==============================] - 0s 107us/sample - loss: 1.3913 - accuracy: 0.4167
Epoch 13/16
60/60 [==============================] - 0s 92us/sample - loss: 1.4574 - accuracy: 0.4000
Epoch 14/16
60/60 [==============================] - 0s 82us/sample - loss: 1.4370 - accuracy: 0.3500
Epoch 15/16
60/60 [==============================] - 0s 80us/sample - loss: 1.4666 - accuracy: 0.3667
Epoch 16/16
60/60 [==============================] - 0s 88us/sample - loss: 1.3726 - accuracy: 0.4500
11/1 - 0s - loss: 3.1148 - accuracy: 0.0000e+00




Impiegando i dati di concentrazione di Mg0 le cose migliorano

60/60 [==============================] - 1s 9ms/sample - loss: 1.8941 - accuracy: 0.3833
Epoch 2/16
60/60 [==============================] - 0s 194us/sample - loss: 1.4062 - accuracy: 0.6500
Epoch 3/16
60/60 [==============================] - 0s 167us/sample - loss: 1.1572 - accuracy: 0.6500
Epoch 4/16
60/60 [==============================] - 0s 187us/sample - loss: 1.1490 - accuracy: 0.6333
Epoch 5/16
60/60 [==============================] - 0s 173us/sample - loss: 1.0612 - accuracy: 0.6333
Epoch 6/16
60/60 [==============================] - 0s 195us/sample - loss: 1.0615 - accuracy: 0.6500
Epoch 7/16
60/60 [==============================] - 0s 193us/sample - loss: 1.0023 - accuracy: 0.6333
Epoch 8/16
60/60 [==============================] - 0s 164us/sample - loss: 1.0067 - accuracy: 0.6667
Epoch 9/16
60/60 [==============================] - 0s 221us/sample - loss: 0.9609 - accuracy: 0.6667
Epoch 10/16
60/60 [==============================] - 0s 185us/sample - loss: 0.9922 - accuracy: 0.6333
Epoch 11/16
60/60 [==============================] - 0s 163us/sample - loss: 0.9188 - accuracy: 0.6333
Epoch 12/16
60/60 [==============================] - 0s 234us/sample - loss: 0.9704 - accuracy: 0.6333
Epoch 13/16
60/60 [==============================] - 0s 176us/sample - loss: 0.9234 - accuracy: 0.6833
Epoch 14/16
60/60 [==============================] - 0s 202us/sample - loss: 0.9051 - accuracy: 0.6833
Epoch 15/16
60/60 [==============================] - 0s 181us/sample - loss: 0.8635 - accuracy: 0.7167
Epoch 16/16
60/60 [==============================] - 0s 171us/sample - loss: 0.8449 - accuracy: 0.7000
11/1 - 0s - loss: 2.3372 - accuracy: 0.2727


giovedì 3 gennaio 2019

Salvare dati da seriale in blocchi orari

Una soluzione semplice per un problema: lo scopo e' registrati i dati derivanti in continuo da un GPS via seriale su file di dimensioni in base ad un'ora di acquisizione



Per fare cio' viene in aiuto il comando bash timeout che permette di interrompere dopo un certo numero di secondi un comando di lunga (od infinita esecuzione). Dopo essere passata un'ora viene di nuovo riavviato il comando per creare il nuovo file orario

-----------------------------------------------------------------
#!/bin/sh
while true
do
        timeout -s 15 3600 /home/root/gps_data.sh
done
-----------------------------------------------------------------

con il seguente semplice comando si invia tutto il flusso dati dalla seriale su USB verso un file

gps_data.sh
-----------------------------------------------------------------
(stty raw; cat> /media/sdcard/`date +%y%m%d%H%M`.txt) < /dev/ttyACM0
-----------------------------------------------------------------

in generale ho visto che il GPS produce circa 150Kb al secondo

giovedì 22 novembre 2018

Bash script come cgi in Apache

Cosa succede quando scrivi uno script bash che funziona bene e non vuoi convertirlo in Php? Semplice...ritorni indietro di venti anni e lo fai diventare un cgi script

Per prima cosa si devono abilitare gli script CGI in Apache

a2enmod cgi

service apache2 restart

in Debian la directory di default per i CGI e' in /usr/lib/cgi-bin...si copia quindi lo script e lo si rende eseguibile
Per prima cosa c'e' da dire che lo script non deve rispondere in modo arbitrario (per esempio con un semplice testo) ma con un file html altrimenti verranno generati errori del tipo 500 di output non correttamente formattato

In Bash si possono leggere anche le variabile GET passate sulla URL e cio' mediante IFS
Nell'esempio sottostante e' prevista una sola variabile (che corrisponde ad un id numerico) e che e' stata salvata nell'array parm all'indice 1
----------------------------------------------------
#!/bin/bash

echo "Content-type: text/html"
echo ""

echo '<html>'
echo '<head>'
echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'
PATH="/bin:/usr/bin:/usr/opt/bin"
export $PATH

saveIFS=$IFS
IFS='=&'
parm=($QUERY_STRING)
IFS=$saveIFS


stringa="$(xidel --silent --extract "//img/@src" "http://xxxxxxxxxxxx.it/?utf8=true&size=micro&mode=double&idc=${parm[1]}" | grep idraulico | awk 'FNR==1')"


echo '</head>'
echo '<body>'
#echo ${parm[1]}
file="$(basename $stringa)"

echo $file

echo '</body>'
echo '</html>'

exit 0
----------------------------------------------------

Xidel

Xidel e' un comodo programma a linea di comando che permette di estrarre informazioni da un file HTML. Non esiste nei repository di Debian ma il pacchetto .deb puo' essere comodo scaricato da questo link http://www.videlibri.de/xidel.html

Nell'esempio sottostante viene richiamata una pagina html da cui estrarre un link (che varia in modo non predefinito) in modo automatico

in pratica xidel richiama il file dall'indirizzo xxxxx.wp, estrae tutti gli HRef incontrati, si estraggono solo quelli che hanno la stringa "filename", poi con awk si prende solo il primo della lista e con sed si eliminano dei caratteri (in questo caso ..)


#!/bin/bash
cd "$(dirname "$0")";

stringa="$(xidel --silent --extract "//a/@href" xxxxxxxxxxxx.wp | grep filename | awk 'FNR==1' | sed 's/..//')"
echo "${stringa}"

Geologi

  E so anche espatriare senza praticamente toccare strada asfaltata