Archivi tag: bash

diversamenteArte

Diversamente Arte (Parte II)

Partendo dalle specifiche del formato file per la trascrizione musicale dettate nel precedente post costruire un programma (script) capace di trasformare la nostra partitura in sequenze di comandi beep (o sequenza di argomenti per lo stesso) é cosa assai semplice.

La scelta del linguaggio di programmazione é ovviamente orientata alla omogeneità con l’ambiente di utilizzo del risultato, ovvero shell (in particolare bash >4.0), ma nulla vieta di realizzare il nostro programma per BeepMusic con altra tecnologia.

II nostro prototipo é capace di produrre varie forme di BeepMusic secondo la compatibilità con le possibili implementazioni del comando beep (Linux e FreeBSD).

Il cuore del software è il calcolo della durata delle note in ragione delle impostazioni metriche della partitura:

duration_in_millisec = n * 60000 / BPM / x;

dove n è il numeratore della frazione che indica la divisione di tempo (time signature) ed x è il denominatore della frazione che rappresenta la singola durata della nota. Questo viene calcolato per tutte le possibili durate di nota, ossia 1 2 4 8 16 32 64 128.

Le frequenze per le note sono semplicemente estratte da un array
pre-calcolato e posto in un file accessorio (potete “accordare” a piacimento lo “strumento” beep).

Qualche accorgimento per produrre output compatibile con le differenti implementazioni di beep ed il gioco é fatto!

Il software completo é scaricabile da GitHub (https://github.com/andrea-tassotti/beepmusic).

Buon ascolto!

cilindro2

crypt-à-porter

Tutti usano SSL nella vita digitale quotidiana: nell’utilizzo della posta elettronica, nell’accesso ai siti web, nei propri certificati digitali e, perfino a nostra insaputa, in mille altre appliances del nascente campo “internet-of-things”, quindi facilmente recuperabile onboard sui diversi sistemi embedded (O_o).

Se hai bisogno di crittografare velocemente un file on-the-fly in maniera simmetrica, non è necessario ricorrere a complesse architetture o a programmi addizionali, o impazzire con le migliaia di salse in cui è possibile interagire con openssl. Basta digitare da semplice riga di comando:

$ openssl enc -in <fileA> -out <fileB> -e -aes256 -k <mypass>

e, altrettanto semplicemente, decrittografare con:

$ openssl enc -in <fileB> -out <fileA> -d -aes256 -k <mypass>

Ovviamente, funziona anche sul tuo Mac  😉

tux-banner

BASH: il problema del costrutto while e OpenSSH

Capita spesso in BASH di realizzare un costrutto che iteri il comando OpenSSH; capita spesso che questo avvenga a partire da una WHILE READ in quanto questo non è altrimenti sostituibile con un FOR o con un parallel-ssh (es. il file di forma tabellare fornisce più di un parametro a OpenSSH).

Esempio

while read HOST USER CMD; do ssh $USER@$HOST "$CMD"; done < lista

Ebbene, quello che otteniamo è l’esecuzione dell’OpenSSH solo in corrispondenza della prima riga del file senza alcun tipo di evidenza di errore. Nella magiorparte dei casi viene data la colpa al costrutto WHILE o al comando READ.
Nulla di più falso!

Cosa accade in realtà?

Nella realtà accade che il comando OpenSSH legge da STDIN, e il corpo istruzioni del costrutto WHILE READ non maschera lo standard input del costrutto, pertanto i comandi all’interno del corpo istruzioni possono attingere al medesimo STDIN. Quindi alla prima esecuzione di OpenSSH, questo consuma l’intero STDIN, lasciando la successiva iterazione priva di altri dati, portandola conseguentemente a corretta conclusione.

Soluzione 1
Utilizzare l’opzione -n del comando OpenSSH

while read HOST USER CMD
do
ssh -n $USER@$HOST "$CMD"
done < lista

Soluzione 2 (valida per somandi anche differenti da OpenSSH)

while read HOST USER CMD
do
ssh $USER@$HOST "$CMD" < /dev/null
done < lista
big_data

Raccolta differenziata di foto digitali

apple ios
Ormai ognuno porta con sé una potente fotocamera integrata nel proprio telefono, con la quale si prendono appunti, si condividono situazioni divertenti, si lavora. Inoltre, applicazioni come Whatsapp rendono ancora più frequente l’uso della fotocamera e, soprattutto, rendono ancora più affollata la memoria del telefono con le innumerevoli foto (spesso ripetute) che ci inviano i nostri amici.

L’operazione di backup, che già normalmente richiede delle noiose attività di sincronizzazione, diventa ancora più odiosa quando ci rendiamo conto che:

  1. non possiamo sincronizzare su un computer qualsiasi, ma abbiamo bisogno di quello sul quale abbiamo predisposto/autorizzato il software;
  2. abbiamo lasciato a casa il disco esterno dove archiviamo le nostre foto, quindi dobbiamo rimandare a quando avremo tutto l’occorrente;
  3. nella migliore delle ipotesi, ci rendiamo conto che almeno il 70% della memoria è costituita da foto di cui non ce ne può fregare di meno, però come facciamo a isolarle da quelle realmente scattate dal nostro telefono?

Ci sono tanti software che effettuano selezioni e organizzazioni del software, ma un prodotto freeware e uno open source ci aiutano a fare ordine in maniera gratuita: ifunbox per iPhone e l’estensione Perl “exiftool“, che ci permette di leggere i metadati contenuti nelle nostre foto.

Il primo strumento ci consente di salvare il “rullino fotografico” su una qualsiasi memoria senza particolari autorizzazioni o sincronizzazioni. Il secondo strumento, invece, ci permette di discriminare le foto in base ai dati EXIF contenuti al loro interno, basandoci sul concetto che le foto pervenute tramite App non contengono il marchio Apple (ragionamento analogo per la controparte Android, seppur non verificato).

A questo punto, basta eseguire un semplice script per raccogliere i dati omogenei e archiviarli secondo la loro reale natura.

#!/bin/bash

# Find and collect in the Apple dir what Apple did (or who you want)
exiftool '-Directory<Make' -if '$Make eq "Apple"' -r *.JPG
exiftool '-Directory<Make-ita' -if '$Make-ita eq "Apple"' -r *.MOV

# PNGs are being moved if any
if [ $(ls -1 *.PNG 2>/dev/null | wc -l) != 0 ]; then
mkdir -p Screenshot
mv *.PNG ./Screenshot
fi

# All the other stuff remains where it was
echo "Job done."

In tal modo avremo una cartella Apple (uguale al valore della proprietà Exif.Image.Make, ossia del costruttore dell’apparecchiatura) dove confluiranno foto e video creati dalla fotocamera, una cartella Screenshot con tutti i nostri file PNG, e tutto il resto transitato via App e via rete, rimarrà nella cartella da cui è stato lanciato lo script.

Infine, per ottimizzare ulteriormente la cartella contenente le foto ricevute e individuare, quindi, tutti i file immagine duplicati, anche di dimensioni diverse, suggerisco l’impiego di software open source (es: DupeGuru), facilmente reperibili in rete.