Scriptini-ini-ini

Sprezzante del pericolo (non so, si dice così, anche se qui non c’entra niente) continuo a pasticciare con bash cercando di trasformare in script ogni scemenza possibile. La bieca scusa che continuo a ripetere è che “sto imparando”, come recitano gli adesivi sulle macchine della scuola guida.

Stavolta però niente canzoncine, avvertite i bimbi.


Generatori Automatici (via Anonimoconiglio)

Qualche tempo fa Santiago alias Anonimoconiglio ha pubblicato alcuni generatori automatici di frasi sul proprio blog. Quando l’HTML confina con il LOL e si mischia con un pizzico di nerdaggine, ecco venire fuori il “Generatore Automatico di Significati di Ubuntu“.

Ispirato ed in pieno trip “trasformo-qualunque-cosa-in-uno-script”, ho raffinato l’ironia del Coniglio trasformando il suo generatore in uno script bash: quale sottile perculamento è insito nel prendere in giro Ubuntu e Marchino “Ubuntu è mio e lo gestisco io” Shuttleworth con (K)Ubuntu stesso? Previa benedizione di Santiago, ecco a voi il G.A.S.bu.SH. (Generatore Automatico di Significati di Ubuntu scritto in Bash)! Il nome è appositamente orrendo:

#!/bin/bash
# Generatore automatico di significati di Ubuntu (G.A.S.Ubuntu)
# http://anonimoconiglio.blogspot.it/2011/01/generatore-automatico-di-significati-di.html
wordsa=("espressione" "parola" "maledizione" "usanza" "sostanza" "volgarità" "bestemmia" "preghiera" "verità" "bugia" "sostanza psicoattiva" "metanfetamina" "malattia nerd")
wordsb=("zulu" "inventata da un multimilionario africano" "ideale per essere venduta" "inventata da me" "africana" "omeopatica" "al gusto di mele" "del Nord Carolina" "inventata al Cocoricò" "distillata senza zuccheri aggiuntivi" "piena di ideologia finta" "fatta di promesse vuote")
wordsc=("sta a significare" "significa" "se non ho capito male significa" "se non sbaglio significa" "a grandi linee significa" "dovrebbe, in teoria, significare" "viene usata per farti credere che" "viene strumentalizzata per dire")
wordsd=("sono" "potrei essere" "probabilmente sono" "sono senz'altro")
wordse=("tuo padre" "un alieno" "come sono" "uno che vede linux in qualunque film" "ciò che sono" "un tantino asociale" "un fanboy" "una persona che importuna ai suoi amici" "uno che parla di linux in continuazione" "uno spammer","Batman" "insopportabile" "Chuck Norris sotto acidi" "astronauta dei miei coglioni")
wordsf=("i developer di GNOME" "Miguelito de Icaza" "Wayland e i sette nani" "la comunità di developer che perdona tutto al Parroco Shuttleworth" "George Lucas e Yoda" "le stronzate che spara Shuttleworth" "Bill Gates, Canonical e i sette nani" "Canonical e ai grafici del team privato" "Stallman, ma non lo riconoscerò mai" "Irene Grandi" "Nicolas Cage" "i bimbiminkia di Canonical" "Wayland che però sta sviluppando mio nonno" "Emanuele Filiberto e Pupo" "David Bowie" "non importa, la cosa importante è che il proprietario/a (del buco) respiri" "mio cognato che mi ha installato Ubuntu con Unity sul portatile l'altro giorno" "sta minchia")
a=$(($RANDOM%${#wordsa[@]}))
b=$(($RANDOM%${#wordsb[@]}))
c=$(($RANDOM%${#wordsc[@]}))
d=$(($RANDOM%${#wordsd[@]}))
e=$(($RANDOM%${#wordse[@]}))
f=$(($RANDOM%${#wordsf[@]}))
#echo Ubuntu è una antica ${wordsa[$a]} ${wordsb[$b]} che ${wordsc[$c]}
#echo -e io ${wordsd[$d]} ${wordse[$e]} grazie a ${wordsf[$f]}.\\n
msg="Ubuntu è una antica ${wordsa[$a]} ${wordsb[$b]} che ${wordsc[$c]} io ${wordsd[$d]} ${wordse[$e]} grazie a ${wordsf[$f]}."
kdialog --passivepopup "$msg" 15
exit 0
kdialog_popup_GAS_Ubuntu

Poppapp

Non contento di visualizzare banalmente il “significato” generato nel terminale, ho giocherellato con KDialog, il sistema di notifiche di KDE, per far apparire un elegante pop-up. Kdialog è decisamente il futuro dei miei smanettamenti con bash!

La frase risultante, al primo tentativo, è abbastanza epic win!

Per chi non utilizzasse KDE, l’alternativa GTK è Notify-OSD oppure zenity / dialog / ncurses per le interfacce pseudo-grafiche. Googlate, gente, googlate!

Rapido spiegone: la frase è composta da vari “pezzi”, ciascuno estratto da un array (wordsa, wordsb, etc.) tramite un indice (a, b, c, etc.) generato casualmente: ${wordsa[$a]}, ${wordsb[$b]}, etc… Dentro gli array gli elementi della frase sono tra virgolette per racchiudere gli spazi; allo stesso modo si possono aggiungere nuove varianti tratte dalla vostra fervida fantasia.

Le ultime righe contengono le due alternative per la visualizzazione: terminale (commentate) e kdialog, inglobando tutta la frase nella variabile $msg e passandola al sistema di notifiche.

Se volete cimentarvi nella creazione di un simile generatore adesso avete un’idea di come fare. A proposito, sempre da Santiago vengono il Generatore Automatico di Necrologi Virtuali ed il Generatore Automatico di Risposte Grilline alle Critiche Verso il M5S.


Pasticciare con un NAS

frankenstein-256x256In ufficio è arrivato un piccolo NAS (QNAP TS-239 ProII) del quale sono stato istantaneamente nominato (mio malgrado!) amministratore. In realtà la cosa non mi dispiace, ma non posso farlo sapere in giro🙂, anche perché posso mettere le mani come “admin” su questo scatolotto con dentro un piccolo pinguino.

Il NAS dispone di una comoda interfaccia di configurazione via web (http:// o https://IP.DEL.NAS:porta). Il suo sistema operativo è giustamente ridotto all’osso in quanto a comandi disponibili, dato che l’interfaccia grafica è pensata per consentire la completa amministrazione.

Da qui ho creato gli utenti (circa 20), le relative password ed i gruppi (5) corrispondenti ai diversi “team” di lavoro. L’idea è che ciascun utente disponga di una cartella personale, con tutti i permessi (rwx), ed abbia inoltre accesso alla cartella del proprio gruppo con gli stessi permessi. In tutte le altre cartelle i permessi saranno di sola lettura ed esecuzione (r-x); il permesso di esecuzione è necessario per poter almeno visualizzare il contenuto delle cartelle degli altri utenti.

Fin qui tutto bene, salvo il fatto che i permessi impostati dalla “comoda” interfaccia grafica non erano applicati. Magari è solo colpa mia ma, per quanto ci smanettassi, alla fine tutti potevano fare tutto nelle cartelle di tutti. E ciò è male.

Il sysadmin remoto (nel senso che è proprio in un’altra nazione) nella sua infinita saggezza sosteneva che forse non si possono impostare i permessi per singolo utente e forse si può fare solo a livello di gruppi. Una rapida ricerca su un traduttore online mi ha permesso di mandarlo a quel paese (non il suo, un altro) nella sua lingua madre. Robe da “Non te(ch) support“!

Ho scelto quindi di fare le cose alla vecchia maniera da riga di comando con uno scriptino rozzo ma funzionale (con tanto di commenti per i futuri sysadmin):

#!/bin/sh
# The script reads user names from file "userlist" and group
# For each user it performs the following actions:
# 1) Create the folder "username" (if not existing)
# 2) Change ownership of folder to username:group (evaluated from groups command)
# 3) Set permissions for folder to rwxr-xr-x
for usname in $(cat userlist)
do
if [ -e "$usname/" ]
then
echo Folder for $usname already exists: skipped creation
else
mkdir $usname
fi
SECGRP=$(groups $usname | cut -d' ' -f2)
chown -R $usname:$SECGRP $usname/
chmod -R 755 $usname/
done
exit 0

Ho adattato lo script al formato dell’output dei comandi, leggermente diverso da quello che ho ottenuto su Debian/Kubuntu. In particolare groups (elenca i gruppi a cui appartiene un utente) sul NAS fornisce:

# groups mioutente
everyone miogruppo

mentre l’output standard è

# groups mioutente
mioutente : mioutente miogruppo altrogruppo etc

dunque con due campi in più (nome utente e “:”): da qui l’opzione di estrarre il campo 2 (“cut -d' ' -f2“) piuttosto che il 4. Inoltre di default sul NAS non viene creato un gruppo con lo stesso nome dell’utente.

Il resto è storia (e commenti nel codice :-)).


“Alea iacta est, de bashibus non disputandum est”

Concludo con un’ideuzza scema, tanto per ribadire l’aura di follia che mi avvolge. Vi serve un dado? Non so, magari per giocare a Monopoli o al Gioco dell’Oca? Guarda un po’ la sfiga, il dado si è perso ma fortunatamente c’è un terminale a portata di mano.

Quindi:

#!/bin/bash
#dadi
# +-------+
# | 1 2 3 |
# | 4 5 6 |
# | 7 8 9 |
# +-------+
# Le posizioni 2 e 8 saranno sempre vuote ma consentono di
# semplificare il codice
riga="+-------+"
dado=$(($RANDOM%6))
comb9=("    0    " "0       0" "0   0   0" "0 0   0 0" "0 0 0 0 0" "0 00 00 0")
echo $riga
for i in 0 3 6
do
echo -e "| ${comb9[$dado]:$i:1} ${comb9[$dado]:$(($i+1)):1} ${comb9[$dado]:$(($i+2)):1} |"
done
echo $riga
exit 0

Per la solita insolita convergenza cosmica, Ralph aveva recentemente scritto delle sue esperienze giovanili con un dado elettronico “hardware”, ricordandomi che avevo questo scriptillo sepolto nei meandri di un qualche hard disk.

Reddice6Prima lo spiegone, poi le chiacchiere. Sulle facce dei dadi i puntini hanno 7 posizioni possibili su 3 righe e 3 colonne che, combinate, definiscono il valore. Ma 7 non quadrava bene con 3 *3 = 9. Per quadrare il cerchio (o il dado) ho quindi considerato la griglia completa con le posizioni 2 e 8 sempre vuote.

A questo punto ho definito le combinazioni con 6 stringhe (nell’array comb9) nelle quali lo “0” e lo spazio indicano rispettivamente la presenza o meno del puntino. Ad esempio il 6, numerando le posizioni come si vede nelle prime righe dello script, ha le posizioni 1, 3, 4, 6, 7 e 9 “piene”, 2, 5 e 8 vuote.

Estratto il solito valore random (il lancio del dado!), pesco la corrispondente combinazione dall’array e poi estraggo dalla stringa singolarmente lo “stato” (vuoto/pieno) delle 9 posizioni.

La sintassi ${comb9[$dado]:$i:1} indica di prendere 1 carattere a partire dalla posizione $i della variabile comb9[$dado]. Incrementando la posizione ottengo gli altri valori nella stringa (mi muovo “in orizzontale”) mentre il ciclo for mi fa ripetere l’operazione sulle 3 righe (mi muovo in “verticale”). La $riga apre e chiude la rappresentazione della faccia di questa piccola “ASCII art”.

La prima versione, basata sugli effettivi 7 punti presenti, era meno elegante dato che le righe superiore ed inferiore avrebbero avuto solo 2 punti, la centrale 3, rompendo la possibilità di usare il ciclo ricorsivo (riporto solo le differenze con lo script precedente):

# +-------+
# | 1   2 |
# | 3 4 5 |
# | 6   7 |
# +-------+
comb7=("   O   " "O     O" "O  O  O" "OO   OO" "OO O OO" "OOO OOO")
[...]
echo -e "| ${comb7[$dado]:0:1}   ${comb7[$dado]:1:1} |"
echo -e "| ${comb7[$dado]:2:1} ${comb7[$dado]:3:1} ${comb7[$dado]:4:1} |"
echo -e "| ${comb7[$dado]:5:1}   ${comb7[$dado]:6:1} |"
[...]

C’è probabilmente un modo migliore di farlo, ma per ora mi è riuscito questo.


E questo è quanto.😀 Alla prossima, ché le minch… sorprese non mancheranno!

Informazioni su Man from Mars

https://extendedreality.wordpress.com/

  1. Sul primo sono schiantata da ridere! E mi preoccupo sempre quando succede sui tuoi post nerd. Temo il contagio! Devo cambiare bocciofila…

    Mi piace

    • Devi ringraziare soprattutto l’autore del post originale per l’idea. Io l’ho solo tradotta. Comunque sappi che la mia missione segreta è portare te e gli altri non-ancora-abbastanza-nerd sotto la piccola grande pinnetta protettiva del Pinguino. Il giorno in cui dirai che hai personalmente lanciato uno script Egli, nella sua infinita pinnitudine, manderà una mail a tutti gli adepti per celebrare l’evento (hai presente “Il Tagliaerbe”?).
      E la Bocciofila? Bei ricordi, ma che fine ha fatto? Bisognerebbe rifondarla, con nuovi soci.

      Mi piace

      • Hai ragione… La bocciofila è un po’ decimata… Ma i migliori restano😉 Comunque la tua missione segreta non è segreta poprio per nulla! Lo sappiamo tutti che il Sommo Pinguino ti passa delle sostanziose mazzette per diffonderlo e distruggere la Mela Morsicata!

        Mi piace

        • Mai per denaro, solo per la gloria del Sommo. Oltretutto è noto che i pinguini sono ghiotti di pesce, dunque che attrattiva può avere un banale frutto incompleto? Egli lo disdegna e non si cura della sua sorte. Fossero aringhe, allora…

          Mi piace

  2. obo

    Ahahaha il dado mi piace un sacco😄 quando sono indeciso su qualcosa faccio prendere le decisioni a lui

    Mi piace

    • Buona idea, un uso in più a cui non avevo pensato! A questo punto si potrebbe fare allo stesso modo la classica monetina per decidere con un “testa o croce”. Magari al prossimo post a tema…

      Mi piace

  3. Pingback: S.S.S.S.S.S.S.S.: Semplici Script Senza Senso Supportati Sonoramente dal Suonatore Silvestri | Extended Reality

  4. Pingback: Non te(ch) support! vol. 4: Insupportabile! | Extended Reality

Dimmi che ne pensi o fai "Ciao ciao!" con la manina // Share your thoughts or just say "Hello!"

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: