Pillole di Unix/Linux: programmare in bash

Bash  (acronimo per bourne again shell) è una shell testuale del progetto GNU usata nei sistemi operativi Unix e Unix-like, specialmente in GNU/Linux, ma disponibile anche per sistemi Microsoft Windows (vedi ad esempio Cygwin).

Essa è chiamata anche Bourne shell dal nome del suo autore originario Stephen Bourne. L’espansione dell’acronimo bash, Bourne again shell, letteralmente significa un’altra shell Bourne, ma Bourne again ha la stessa pronuncia di born again, cioè rinata creando la definizione finale shell rinata.

Una shell è, fondamentalmente, un processore di macro-istruzioni per eseguire comandi. Le macro-istruzioni sono delle funzionalità dove testo e simboli possono essere messi insieme per creare espressioni complesse.

Ma una shell di Unix/Linux è, allo stesso tempo, un interprete e un linguaggio di programmazione.

(Fonti: Wikipedia, GNU)

Nel Wiki trovate qualche appunto di programmazione in linguaggio di shell per Linux nella shell del progetto GNU bash

Laravel, The PHP Framework For Web Artisans

laravel-logo

Come Yii, anche Laravel arriva per aiutarci a scrivere applicazioni PHP in modo agile.

Documentazione, esempi e appunti on progress nel Wiki.

Binary Money e Bitcoin – le origini

Mi intriga da morire il denaro.

Nel senso: cos’è il denaro?

Si OK banconote, monete, bancomat, e-commerce… ma mentre è chiaro che il denaro sia una rappresentazione del valore reale delle cose da scambiare nelle transazioni, meno chiaro può essere il perché un pezzo di carta da pochi euro (fatto conto delle materie prime e le lavorazioni, come stampa, filigranatura, inserimento di ologrammi, …) vale in realtà 500 euro, perché solo i governi possano battere moneta, perché lo fanno, quando devono astenersi dal farlo, o farlo in sovrabbondanza e perché i falsari vanno in galera e perché tutti ci crediamo.

Questa riflessione arriva a puntino mentre ho iniziato a leggere il saggio di David Wolman, The End of Money, Laterza.

Un’idea originale è stata quella del matematico cinese Wei Dai che descrisse così il bmoney (denaro binario o digitale) in questo post in un forum nel 1998 che qui traduco integralmente in italiano.

 

Sono affascinato dalla cripto-anarchia di TIm May. Diversamente dalle comunità tradizionalmente associate alla parola “anarchia”, in una cripto-anarchia il governo non viene distrutto temporaneamente, bensì è permanentemente proibito e permanentemente non necessario. E’ una comunità nella quale la minaccia della violenza non impotente, perché la violenza è impossibile e la violenza è impossibile perché i suoi partecipanti non possono essere ricondotti ai lori veri nomi o alla loro posizione fisica.

FInora non è chiaro, nemmeno in teoria, come una comunità del genere possa funzionare. Una comunità è definita dalla cooperazione dei suoi partecipanti e una cooperazione efficiente richiede un mezzo di scambio (denaro) e un modo per applicare i contratti. Tradizionalmente questi servizi sono stati erogati dai governi o da istituzioni riconosciute dal governo e solo verso entità legali. In questo articolo descrivo un protocollo per mezzo del quale questi servizi posso essere erogati da e verso entità non tracciabili.

In effetti descriverò due protocolli il primo è poco pratico, perché fa un uso massiccio di un canale boradcast che è sincrono e non intasabile. In ogni caso motiverò il secondo protocollo, più pratico. In ambo i casi assumerò l’esistenza di una rete non tracciabile, nella quale mittenti e riceventi sono identificati solo attraverso pseudonimi digitali (ad esempio: chiavi pubbliche) e ogni messaggio è firmato dal suo mittente e cifrato con la chiave pubblica del ricevente.

Primo protocollo

Nel primo protocollo, ogni partecipante gestisce un proprio separato database su quanti soldi appartengono ad ogni pseudonimo, e l’oggetto di questo protocollo è il modo nel quale questi conti correnti vengono aggiornati.

  1. Creazione di denaro.

    Chiunque può creare denaro rendendo pubblica (broadcasting) la soluzione di un problema computazionale fino a quel momento irrisolto. La sola condizione è che deve essere facile determinare quanto sforzo computazionale occorre per risolvere il problema e, in caso contrario, la soluzione non deve avere un valore né pratico né intellettuale. Il numero di unità monetarie creato è uguale al costo dello sforzo computazionale in termini di un paniere di beni. Per esempio, se un problema richiede 100 ore ad essere risolto nel computer che lo risolve più convenientemente, e ci vogliono 3 panieri standard per acquistare 100 ore di funzionamento di quel computer nel mercato libero, allora sulla diffusione della soluzione di quel problema ognuno accrediterà al mittente 3 unità nel proprio database.

  2. Trasferimento di denaro.

    Se Alice (il detentore dello pseudonimo K_A) vuole trasferire X unità d denaro a Bob (detentore dello pseudonimo K_B), essa diffonde il messaggio “Io K_A consegno X unità di denaro a K_B”.
    In seguito a questo messaggio broadcast, ciascuno sottrae nel proprio database X unità dall’account di K_A e somma X unità al conto di K_B, a meno che questo non crei un bilancio negativo peer K_A, nel qual caso il messaggio viene ignorato.

  3. Applicazione dei contratti.

    Un contratto valido deve includere un massimo di risarcimento in caso di fallimento di ogni parte contrattuale. Deve anche contemplare una (terza) parte che eseguirà un arbitrato nel caso di contestazioni.  Tutte le parti di un contratto, incluso l’arbitro, devono inviare in rete le loro firme digitali del contratto prima che questo possa essere considerato valido. Al momento della diffusione in rete del contratto e delle firme digitali, ogni partecipante addebita nel proprio daabase al conto di ciascun partecipante il massimo del sua qyuota massiam di risarcimento e accredita su un conto speciale che si identifica con l’hash sicuro del contratto, la somma dei risarcimenti massimi di tutte le parti. Il contratto diviene efficace se gli addebiti funzionano su tutte le parti contrattuali senza che si verifichi un bilancio negativo per nessuno, caso nel quale il contratto viene ignorato e tutti i conti correnti vengono ripristinati al valore precedente (rollback). Un esempio di contratto dovrebbe essere simile a questo:

    K_A acconsente di consegnare a K_B la soluzione del problema P prima delle 00:00:00 del 01/01/2100,
    K_B acconsente di pagare K_A 100 bitcoin (UM, unita di moneta) prima delle 00:00:00 del 01/01/2100,
    K_C acconsente di svolgere un arbitrato in caso di contestazione.
    K_A acconsente di pagare a K_B un massimo di 1000 bitcoin in caso di fallimento [non consegna]
    K_B acconsente di pagare a K_A un massimo di 200 bitcoin in caso di fallimento [non vuole più la soluzione].
    K_C acconsente di pagare [a chi?] un massimo di 500 bitcoin in caso di fallimento [non raggiunge l’accordo].

  4. Conclusione dei contratti.

    Se un contratto di conclude con una disputa, ogni parte invia in rete un messaggio firmato “Il contratto con firma digitale SHA-1 H si conclude senza risarcimenti” o anche “Il contratto con firma digitale SHA-1 H si conclude con i seguenti risarcimenti…”. In seguito alla diffusione di tutte le firme, ogni partecipante accredita nel proprio database nel conto corrente di ogni parte l’importo del suo massimo risarcimento, cancella l’account (fittizio) del contratto, quindi accredita o addebita al conto di ciascuna delle parti contrattuali secondo lo schema di risarcimento, se ce n’è uno.

  5. Applicazione dei contratti.

    Se le parti contrattuali non trovano un accordo su una conclusione appropriata anche con l’aiuto di un arbitro, ogni parte invia in rete una proposta di risarcimento/sanzione e ogni argomento o evidenza che deponga in suo favore. Ogni partecipante fa una determinazione in merito agli effettivi risarcimenti / sanzioni e modifica di conseguenza i conti correnti delle parti nel proprio database,

Secondo protocollo

Nel secondo protocollo, i conti correnti di ciascuno sono localizzati in un sottoinsieme di partecipanti (che chiameremo server d’ora in poi) invece che nel database di ciascun partecipante. Questi server sono collegati da una rete di trasmissione di tipo Usenet. Il formato dei messaggi di transazione trasmessi su questo canale rimane lo stesso del primo protocollo, ma i partecipanti ai quali è arrivato il messaggio broadcast devono verificare che il messaggio è stato ricevuto e correttamente elaborato su un sottoinsieme casuale di questi server.

Poiché i server devono possedere un certo grado di affidabilità, è necessario un meccanismo per mantenere la loro onestà. Ad ogni server viene richiesto di accreditare una certa quantità di denaro su un conto corrente speciale, denaro potenziale per ricompense o multe in caso di buona o cattiva condotta. Inoltre, ogni server periodicamente deve periodicamente pubblicare i propri database e registrare su di essi le operazioni di creazione di denaro e le attribuzioni di denaro ai partecipanti. Ogni partecipante deve verificare che il bilancio del proprio conto corrente sia esatto e che la somma dei bilanci non sia maggiore della quantità di denaro creata. Questo impedisce ai server, anche in caso di collusione totale, di aumentare l’immissione di denaro costantemente e senza costi. Nuovi server possono anche usare i database pubblicati per sincronizzarsi con gli altri server.

Il protocollo proposto in questo articolo permette a entità pseudonime non identificabili (non rintracciabili) di cooperare tra loro più efficientemente fornendo loro un mezzo di scambio e un metodo per applicare i contratti. Il protocollo può probabilmente essere reso più efficiente e sicuro, ma io spero che questo sia un passo verso la realizzazione della cripto anarchia come possibilità pratica come anche teorica.

 

Appendice A: una creazione di denaro elettronico alternativa

Uno degli aspetti più problematici nel protocollo di b-money è la creazione del denaro. Questa parte del protocollo richiede che tutti i detentori di un conto si accordino e decidano sul costo di computazioni particolari. Sfortunatamente, poiché la tecnologia dei computer tende ad avanzare rapidamente e non sempre pubblicamente, questa informazione potrebbe essere non disponibile, inaccurata o obsoleta, circostanze che possono causare seri problemi al protocollo.

Così, vi propongo un’alternativa al subprotocollo di creazione del denaro, nel quale ogni proprietario di un conto (tutti, nel primo protocollo, oppure i server, nel secondo protocollo) si accordino e decidano invece sulla quantità di denaro da creare una volta ogni periodo, con il costo che viene determinato a mezzo di un’asta. Ogni periodo di creazione di denaro viene così suddiviso in quattro fasi:

  1. Pianificazione

    I possessori di un conto calcolano e negoziano con gli altri una somma ottimale di denaro da fornire per il prossimo periodo. Sia che raggiungano o meno il consenso, essi inoltrano nella rete (broadcast) la loro quota di denaro creata e ogni calcolo macroeconomico fatto a supporto delle previsioni

  2. Offerta.

    Chiunque voglia creare denaro binario immette nella rete un’offerta nella forma <x, y>, dove x è la quantità di denaro che vuole creare e y è un problema irrisolto appartenente ad una predeterminata classe di problemi. Ogni problema in questa classe deve avere un costo nominale (ad esempio in MIPS/anno) sul quale ci sia un consenso generale.

  3. Calcolo

    Dopo aver visto le offerte,  coloro che le hanno lanciate possono ora risolvere i problemi e pubblicare in rete le soluzioni

  4. Creazione del denaro

    Ogni possessore di un conto, accetta le offerte più alte (tra coloro che le hanno effettivamente pubblicate in rete) in termini di costo nominale per unità di denaro binario creato, e le accredita sui conto degli offerenti corrispondenti.

 

Onde gravitazionali misurate per la prima volta

Albert Einstein, early 1900'sGli scienziati del Laser Interferometer Gravitational-Wave Observatory (LIGO), nato da una collaborazione tra MIT e Caltech, hanno annunciato la scoperta nella conferenza di ieri, 11 febbraio 2016. La rilevazione delle onde gravitazionali risale però al 14 settembre 2015.

Dopo 100 anni, le previsioni di Einstein a riguardo si sono ancora una volta dimostrate esatte.

Le onde gravitazionali sono previste dalle soluzioni di una equazione (equazione di Einstein, una equazione tensoriale in cui l’incognita è il tensore di curvatura dello spaziotempo) che tipicamente rappresentano onde, allo stesso modo delle onde elettromagnetiche: Maxwell infatti scoprì che mettendo assieme le equazioni di elettricità e magnetismo si ottenevano delle equazioni d’onda, equazioni classiche che i fisici conoscevano molto bene, come quelle delle corde o delle membrane vibranti. E Hertz confermò l’esistenza di queste onde, che da principio furono chiamate onde hertziane. Gli esperimenti di Hertz furono poi di ispirazione a Marconi nel telegrafo senza fili.

Quindi possiamo fare un parallelo storico: Einstein sta a Maxwell come LIGO sta a Hertz.

Come si perviene all’equazione delle onde a partire dall’equazione di Einstein.

È impressionante il numero di questioni che il Grande Vecchio ha colto nel segno: dalla curvatura della luce, dovuta alla curvatura dello spaziotempo, alla esistenza di onde gravitazionali, alla spiegazione dell’effetto fotoelettrico usando la teoria dei quanti (che gli valse il Nobel) alla scoperta degli effetti non locali nella Meccanica Quantistica (a cui però non volle credere). Reiner Weiss, un membro del team LIGO del MIT di Boston, ha dichiarato

Sarebbe stato fantastico poter vedere la faccia che avrebbe fatto Einstein se avessimo potuto dirglielo.

Dettagli sull’esperimento LIGO a questo link.

La home page dell’esperimento LIGO, una collaborazione scientifica tra ricercatori e istituzioni situati in USA, Brasile, Russia, Europa, Cina, India e Australia.

La lista completa delle università e degli altri esperimenti che partecipano alla collaborazione, tra cui c’è l‘esperimento Virgo, una analoga collaborazione europea in cui il detector è situato a Cascina (Pisa) e condotto dal CNR. Virgo e LIGO collaborano in questa ricerca delle onde gravitazionali e nella analisi dei dati rilevato dai due eseprimenti. Anche Virgo ha allestito una conferenza stampa in contemporanea a LIGO per dare al mondo la grande notizia.

La prossima frontiera

Un altro tassello che manca è l’osservazione dei quanti di gravità. Per analogia con la teoria elettromagnetica, nella quale la Meccanica Quantistica postulò il dualismo onda particella (onda elettromagnetica – fotone), esiste un capitolo Gravità Quantistica in cui la controparte del fotone è la versione quantica dell’onda gravitazionale, il cosiddetto gravitone.

La questione però qui è ancora più complessa, in quanto Meccanica Quantistica e Relatività Generale non sono compatibili, e anche la stessa definizione teorica di gravitone è problematica (la gravitazione quantistica a loop per esempio non ne contempla nemmeno l’esistenza).

Un’ottima introduzione alla Gravità Quantistica ad opera di Carlo Rovelli nell’archivio.

Ma cos’è un’onda gravitazionale?

E’ un’onda che sfugge ad ogni tipo di onda con cui abbiamo a che fare quotidianamente:

  • onde meccaniche che sono “increspature” della materia: ad esempio le onde sonore sono fluttuazioni della densità dell’aria (attenzione: se nei fil sci-fi sentite un’astronave esplodere, è una balla, nel vuoto non si propagano le onde elastiche). I migliori sensori che abbiamo a bordo per ricevere queste onde sono la pelle e l’apparato uditivo, questo ha una banda passante dai 20 Hz ai 20 kHz.
  • onde elettromagnetiche che sono “increspature” del campo elettromagnetico: qui abbiamo uno spettro molto ampio: dalle onde lunghe a pochi Hertz, ai raggi gamma generati dai decadimenti nucleari (siamo nell’ordine dei exahertz EHz, 1 seguito da 18 zeri Hz). Un’onda elettromagnetica molto popolare è la luce, che ha la stessa natura delle onde radio e dei raggi gamma ma ha una frequenza che si situa attorno ai 500 THz (terahertz, 1 seguito da 12 zeri). Il sensore migliore che abbiamo a bordo sono gli occhi, che però hanno una curva di risposta limitata dai 400 nm (viola) ai 750 nm (rosso), quindi non vediamo dagli infrarossi in giù e dagli ultravioletti in su).
  • onde gravitazionali che sono “increspature” dello spaziotempo, fluttuazioni locali nella lunghezza dei metri e nella durata dei secondi. Generalmente queste fluttuazioni sono evidenti solo in corrispondenza a eventi cosmici catastrofici, come la collisione dei due buchi neri che ha prodotto l’onda misurata. Cosa che esula completamente dal nostro sentire quotidiano e per il quale non abbiamo avuto la necessità di sviluppare dei sensori biometrici come occhi e orecchie.

Fonti:

LIGO

Virgo

Audio Ubuntu

MI usciva, nel’impostazione audio, volume di uscita nullo con impossibilità di muovere la barra del volume.

Ubuntu 15.10 su HP ProBook 440

Qui:

Ora la barra si è sbloccata ma eseguendo il test audio (pulsante “Suono di prova”) non funziona nulla.

Quindi proseguo coi suggerimenti, rimuovo tutto e reinstallo:

sudo apt-get remove --purge alsa-base pulseaudio
sudo apt-get install alsa-base pulseaudio
sudo alsa force-reload
Unloading ALSA sound driver modules: snd-seq-midi snd-seq-midi-event snd-seq snd-rawmidi snd-seq-device snd-hda-intel snd-hda-codec-hdmi snd-hda-codec snd-hda-core snd-hwdep snd-pcm snd-timer.
Loading ALSA sound driver modules: snd-seq-midi snd-seq-midi-event snd-seq snd-rawmidi snd-seq-device snd-hda-intel snd-hda-codec-hdmi snd-hda-codec snd-hda-core snd-hwdep snd-pcm snd-timer.

Rifaccio il test e ora funziona tutto.

 

Anche la casella “Riproduci suono come” ora riporta Cuffie Analogiche (Audio Interno) (prima visualizzava “Riproduci con Dummy Output”)

 

Colord-sane

Problema all’avvio di stamattina:

Feb 8 08:18:29 jsbach whoopsie[612]: [08:18:29] Parsing /var/crash/_usr_lib_colord_colord-sane.111.crash.
Feb 8 08:18:29 jsbach whoopsie[612]: [08:18:29] Uploading /var/crash/_usr_lib_colord_colord-sane.111.crash.

Soluzione in questo forum

I don’t really use scanner, so I decided to simply remove buggy packages:

sudo apt-get remove sane-utils
sudo apt-get remove colord

 

Fine 2015

Termino quest’anno un po’ in discesa dal punto di vista lavorativo.

Non sono molto soddisfatto.

Ma ho un progetto che l’anno venturo sarà in grado di cambiare tutto in meglio.

Buon 2016, Lettore!

Oracle e sequence

logo-oracle-largeMi è capitato un caso in cui un record inserito in una tabella intorno alle 12.00 porta un valore di chiave primaria, ottenuto leggendo una sequence, superiore del valore ottenuto dalla stessa sequence dopo circa mezzora:
        ID TEMPO
---------- -------------------
     65304 02/12/2015 10:55:27 
     65297 02/12/2015 12:37:38
Il mio DBA di fiducia mi ricorda che lo scopo della sequence è quella di fornire valori UNIVOCI, più che valori ordinati nel tempo, ma la cosa succede perché, nella definizione della sequence, ho dichiarato la direttiva NOORDER.
Questa direttiva, nel caso di DB in cluster a più nodi (nel mio caso la macchina che contiene il DB è bilanciata con 2 nodi: significa che c’è tra il database ed il client c’è un bilanciatore che decide se smistare le chiamate verso un nodo o verso il suo gemello identico a seconda del carico computazionale dei sottonodi), può portare a comportamenti di questo tipo (le sequence vengono staccate un po’ di qua un po di là ma il DB al momento della generazione non le ordina tra i vari nodi – questo il significato del NOORDER).
Per converso, non dichiarare la clausola NOORDER, affinché Oracle si preoccupi distribuire le sequenze in ordine, potrebbe portare a situazioni ben più gravi, come quella di mettere in LOCK il database (vedi ad esempio http://www.dba-oracle.com/t_rac_proper_sequence_usage.htm).
Una possibile soluzione, se si vuole che venga ricordato l’ordine di inserimento, sarebbe quella di prevedere un campo data valorizzato a sysdate al momento della creazione del record ed usare quello per l’ordinamento.

PHP e gli operatori boolean

800px-PHP-n_logo PNG

Vedi Wiki per un piccolo inciso sugli operatori booleani (|| e &&) e la differenza con gli operatori “bit a bit” o bitwise (| e &).

Mortara Instruments Europe Mirthconnect course 2015

mortara_logo

Il 20 e 21 ottobre scorso ho tenuto un corso base per l’utilizzo di Mirthconnect come middleware per la comunicazione tra piattaforme eterogenee, tramite scambio di messaggi XML, HL7, testo semplice e altro.

IMG_7444

Il corso, organizzato dal Servizio Supporto Vendite Estero di Mortara Instruments Europe (con sede a Casalecchio di Reno, Bologna), ha visto una ventina di partecipanti tecnici, ingegneri e responsabili vendite provenienti da tutto il mondo (Inghilterra, Portogallo, Romania, Spagna e Nuova Zelanda) e ha riguardato l’architettura complessiva del middleware e la sua gestione e programmazione, terminando con esempi di applicazione a semplici task di loro immediata necessità.