L'uso di questo sito
autorizza anche l'uso dei cookie
necessari al suo funzionamento.
(Altre informazioni)

Wednesday, December 23, 2015

Using Linux LVM snapshots to run "experiments" on VMs

I am going to show how to create a LVM (Logical Volume Manager) snapshot and use it to return its base to a previous state.

This is useful for experiments, e.g on a LVM-based virtual machine (VM):
  • take a partition snapshot of the FS where the VM lives.
  • experiment with the VM (make config changes etc.)
  • if your tests are successful, lvremove the snapshot and keep the experiment's results
  • if you want to discard the tests, stop the VM then lvconvert –merge -v <snapshot> will restore the partition to its snapshot state.

Check required capabilities

# dmsetup targets
zero             v1.1.0
mirror           v1.13.2
snapshot-merge   v1.3.0
snapshot-origin  v1.9.0
snapshot         v1.13.0
striped          v1.5.1
linear           v1.2.1
error            v1.3.0

For the rest of the tutorial to work, we need the snapshot-merge target to exist.
If (as it happened to me) you run this on a machine with no kernel support for merging, you will be stumped in the last passage (lvcreate –merge). You can get out of this pickle by either:
  1. Grabbing a Live DVD of a distribution that has merge support
  2. run the last step from the live environment
  1. Boot rescue from a distribution that has merge support
  2. Do not mount the LV partitions involved when/if asked
  3. run the last step from the rescue environment
While the first course of action worked perfectly in my case, it is the second one that redhat reccommends. When I tried it, however, the rescue environment was missing the required device files /dev/SataGroup and I could not proceed.

Create volume, make a filesystem, mount it.

# lvcreate --size 100m -n test SataGroup01
# mkfs.ext2 /dev/SataGroup01/test
# mkdir /tmp/test
#  mount /dev/SataGroup01/test /tmp/test
# cd /tmp/test
# ls
# mkdir a{0..2}
# ls
a0  a1  a2   lost+found
# for i in {0..2}; do touch a$i/b$i ; done
# ls a0

Create a snapshot on the base volume, then mount it.

When the snapshot is created, care must be taken to make a large enough snapshot to avoid filling it. If the snapshot fills up, you will end up with a stuck snapshot and you'll have to go to hell and back to get rid of it (I may show how in a followup post).

# lvcreate --snapshot --size 100m -n test-snap /dev/SataGroup01/test
# mkdir /tmp/test-snap
# mount /dev/SataGroup01/test-snap /tmp/test-snap
The contents of the volumes are identical:
# ls /tmp/test
a0  a1  a2 lost+found
[root@cane test]# ls /tmp/test-snap/
a0  a1  a2 lost+found
Change them in different ways:
# mkdir /tmp/test/b0
# rm -rf  /tmp/test/a1
# mkdir /tmp/test-snap/c0
# ls /tmp/test*
a0  a2  b0  lost+found

a0  a1  a2 c0  lost+found

Now unmount them:

# umount /tmp/test
# umount /tmp/test-test snap

End the experiment

If we now throw away test-snap, we'd be left with the changes done in test. If we want to back up our changes, and keep what was done in snap instead, do:

# lvconvert --merge -v /dev/SataGroup01/test-snap 
    Using logical volume(s) on command line.
    Archiving volume group "SataGroup01" metadata (seqno 41).
    Loading SataGroup01-test-real table (253:14)
    Suppressed SataGroup01-test-real (253:14) identical table reload.
    Loading SataGroup01-test--snap-cow table (253:15)
    Suppressed SataGroup01-test--snap-cow (253:15) identical table reload.
    Loading SataGroup01-test table (253:16)
    Loading SataGroup01-test--snap table (253:17)
    Not monitoring SataGroup01/snapshot0
    Suspending SataGroup01-test (253:16) with filesystem sync with device flush
    Suspending SataGroup01-test--snap (253:17) with filesystem sync with device flush
    Suspending SataGroup01-test-real (253:14) with filesystem sync with device flush
    Suspending SataGroup01-test--snap-cow (253:15) with filesystem sync with device flush
    Loading SataGroup01-test-real table (253:14)
    Suppressed SataGroup01-test-real (253:14) identical table reload.
    Loading SataGroup01-test--snap-cow table (253:15)
    Suppressed SataGroup01-test--snap-cow (253:15) identical table reload.
    Resuming SataGroup01-test-real (253:14)
    Resuming SataGroup01-test--snap-cow (253:15)
    Resuming SataGroup01-test (253:16)
    Resuming SataGroup01-test--snap (253:17)
    Creating volume group backup "/etc/lvm/backup/SataGroup01" (seqno 42).
  Merging of volume test-snap started.
    Checking progress before waiting every 15 seconds
  test: Merged: 100.0%
  Merge of snapshot into logical volume test has finished.
    Archiving volume group "SataGroup01" metadata (seqno 42).
    Removing snapshot test-snap
    Loading SataGroup01-test table (253:16)
    Loading SataGroup01-test--snap table (253:17)
    Suspending SataGroup01-test (253:16) with device flush
    Suspending SataGroup01-test--snap (253:17) with device flush
    Suspending SataGroup01-test--snap-cow (253:15) with device flush
    Suspending SataGroup01-test-real (253:14) with device flush
    Resuming SataGroup01-test--snap-cow (253:15)
    Resuming SataGroup01-test-real (253:14)
    Resuming SataGroup01-test (253:16)
    Removing SataGroup01-test-real (253:14)
    Removing SataGroup01-test--snap (253:17)
    Removing SataGroup01-test--snap-cow (253:15)
    Releasing logical volume "test-snap"
    Creating volume group backup "/etc/lvm/backup/SataGroup01" (seqno 44).
  Logical volume "test-snap" successfully removed

We have kept the changes originally in the snapshot volume (which as been removed by lvconvert); a1 has come back, b0 is gone, c0 - from test-snap - is now in place:

# ls  /tmp/test/ /tmp/test/a1
a0  a1  a2 c0  lost+found


Thursday, November 26, 2015

Mojibake and the horrors of database encoding.

I gave several sound and wise advices  (If I say so myself) in the past when writing about character encodings, whle stopping on the threshold of DBMS encodings with some smartass comment like "God helps you if you must".

So it was just appropriate that I should go into that same task and that it bit me in the arse in revenge. (Background: my company hosts several legacy LAMP sites which had originally been set up with very little thought given to character encodings and all that).

And so it was that - having read a few StackOverflow posts on the subject - I started handling a multilingual, latin1 encoded, MySql database with what turned out to be a very hazy understanding of the subject, took a several misguided turns and  ended with a character soup. In truth, the character soup was probably there to begin with, and I just made it worse, although the changes I made in the (panicked) attempts to fix it just concurred to make it quite hard to sort out.

Of course, all this happened before I ran across two (1 and 2) wise posts on the subject by Joni Salonen. He knows his stuff, and, had I known it in advance, I would have toiled less. So most of what follows was learned the hard way (trial and error). I am presenting it here compounded with what I learned from Joni's posts.

Mojibake (a japanese word, and not by chance: asians I guess have a lot of encoding fun) was for me entirely out of the equation - I know better now. For europeans, this is a common form of mojibake (courtesy of Richard Tobin's useful tool:

Character:                        è
Hex code point:     00E8
Decimal code point:    232
Hex UTF-8 bytes:    C3 A8
Octal UTF-8 bytes:    303 250
UTF-8 bytes as Latin-1 characters bytes: Ã ¨

Mojibake (in one of its simplest forms) is when you start with a UTF8 encoded character top row which is (at one point of its life) mistaken as two latin1 chars (bottom row). This is usually compounded by something (someone) taking the two not-quite-latin1 characters and encoding them back to UTF8 (for european alphabets this normally means you now have four bytes).

Oh, and let's not forget about Windows-1252, helpfully using bytes 128-159 for characters the are UTF8-encoded in three byte sequences (most sighted as single/double quotes, often a result of copy-paste from word). Eg:

Character                  „
Character name         DOUBLE LOW-9 QUOTATION MARK
Hex code point         201E
Decimal code point        8222
Hex UTF-8 bytes         E2 80 9E
Octal UTF-8 bytes        342 200 236
UTF-8 bytes as Latin-1 characters bytes      â [80] [9E]

This is just the beginning of the story, though. When trying to understand just what is going on with your DBMS (mysql, in this case) you should bear in mind that each link of the chain has its own idea of what encoding is being used and may (or may not) decide to make it "easier" for you by converting, from the encoding it thinks are your strings in, to the one it is using. It may get it wrong: if it does not, you will - if you believe to the characters you see - and will end up with egg on your face (mojibake, scrambled).

The links you should be aware of are:
  • the server (holds the truth, but won't tell)
  • the client (it lies: it has a default encoding that won't tell)
  • the terminal (may be lying: check your $LANG)
  • the operating system (probably an innnocent bystander)
  • your editor (It lies. Maybe. See later.)

The server. Mysql has what it calls 'default encodings': they exist for the database, for the table, for the single column of the database. If you tell it nothing, mysql defaults to latin1 (there are good reasons for this: holding a multilingual catalog, however is not one). The clients, meanwhile, have their own idea of the encodings that the incoming/outgoing characters are in. The most typical SNAFUs: UTF8 characters stored as couples of latin1 chars in a latin1 table. It will display as character soup, and if now you ALTER TABLE to change the encoding (mysql doing automatic conversions for you), you will end up with the double encoded mojibake I mentioned above.

You can have even more fun if you have the (not) brilliant idea (advocated by several posts on the 'net) to do the DB conversion by dumping the databas to a file (mysqldump), edit it to change the default latin1 encodings to utf8, and then run a conversion tool the like of iconv/uconv to modify the (supposedly) latin1 characters to utf8, and then feed the result to mysql. Don't. What you are not realising here is that - when dumping - the characters are being output in the encoding that the client is using - which these days is most often utf8, if the client is the command line mysql tool and your terminal is using a .utf8 locale. Running iconv on the dump, then, accomplishes the "fine" result of doubly encoding all the characters which are already utf8.

What to do then? There is a good a case, and a host of bad cases.

Regardless of the situation you are in, you should try your best to know what you are exactly looking at - when in doubt reach for an hex editor/viewer (bvi, emacs' hexl, hexdump, xxd). This seems silly but consider that, when you see the sequence 'è', your instinct will be telling you that you are looking at a UTF8 char displayed on a latin1 device. But throw mojibake in, and you may well have two UTF8 characters as displayed by a UTF8 device. Looking at the actual bytes will give you certainty.

Also locking every chain of your environment in utf8 will help, and will also prevent future mixups. This is how I do it. For mysql, I put this in my.cnf:

; this inhibits start on v5.5 (a bug)
; default-character-set=utf8
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'

This alone should be enough. However you always want to be explicit so be sure that (wher you are in charge of this things) the db connection strings specify the encoding eg. (php,PDO):


In your terminal, be sure that locale-related variables are utf8 aware (e.g: LANG=en_US.UTF-8). Your editor should be modern, UTF8 aware, and prefer the UTF8 encoding when in doubt (e.g., for emacs, run versione greater than 21.3, and ‘M-x prefer-coding-system utf-8' or have (prefer-coding-system 'utf-8) in your .emacs)

With this, you will be sure that every link of your chain is thinking UTF8 - for CLI mysql, you can confirm it with:

mysql> SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%';
| Variable_name            | Value                      |
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
8 rows in set (0.00 sec)

| Variable_name        | Value           |
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
3 rows in set (0.00 sec)

I also put

AddDefaultCharset UTF-8
AddCharset utf-8 .html .css .php .txt .js 

In Apache's config for the involved web sites.

And note, here I am talking about small DBs, therefore giving little, if any, consideration to performance, conversion times, and somesuch. If you have multiGB DBs with full text indexes that take days to rebuild or somesuch, you should research the topic for your specific requirements.

In the good case, you have a coherent latin1 encoding environment. If so, just issuing


should do the deed. Watch out that


(notice the missing "convert to"?) will change the default encoding, but will do no conversion, leave the encoding of the existing columns as it is and confuse the hell out of you.

And, if you already are in this unfortunate situation, this may sort of help you (assuming your column is CHAR(50)):


This snippet - http://stackoverflow.com/questions/8906813/how-to-change-the-default-charset-of-a-mysql-table - will cobble the queries for your entire table set:

SELECT concat('alter table ', table_name, ' 
     CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') 
     FROM information_schema.tables WHERE table_schema='your_database_name' 
           AND table_collation != 'utf8_general_ci' GROUP BY table_name;

As an alternative, you may mysqldump your (smallish) database, edit the resulting file, change all latin1 occurrences to utf8 and reload into a fresh database (defaulting to utf8, of course).

Bad cases are plentiful, but from my experience, have mostly to do with double-encodings (see above) or mixed encodings. Because I do not think my personal struggles with them are of great interest, I will refer you again to the excellent posts of Joni on the subject. Print them. Study them. And may mojibake never cme close to your DBs.


The following bash script reports on the encodings in effect on a particular (or all) database, table.

author="Alessandro Forghieri "
name=`basename $0`
sa_usage () {  echo "usage: $0 [-l] [-t] [-c] [db [table [column]" ; }
usage () {
 echo "$name $ver $author"
 echo $(sa_usage)
 echo "        -l   like dbname "
 echo "        -t   like tablename"
 echo "        -c   like columnname"
 echo "report on database encodings"

 # getopts optstring name [args]
while getopts dvltc opt ; do
 case "$opt" in
  d) set -v ;;
         v) opt_v=1 ;;
         l) opt_l=1 ;;
         t) opt_t=1 ;;
         c) opt_c=1 ;;
  ?) usage; exit ;;

shift `expr $OPTIND - 1`


echo "======================"

echo "SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%';" | mysql

echo "======================"


if [[ x$1 == x ]]; then
    if [[ x$opt_l == x ]]; then
 CLAUSE_DB="WHERE schema_name = '$1'"
 CLAUSE_DB="WHERE schema_name like '$1'"
echo "SELECT $CSET_DB  FROM information_schema.schemata $CLAUSE_DB" | mysql

[[ x$1 == x ]] && exit 0;
[[ x$opt_l  != x ]] && exit 0;

echo "======================"

if [[ x$opt_l == x ]]; then
    CLAUSE_DB=" AND  T.table_schema='$1' "
    CLAUSE_DB=" WHERE T.table_schema like '$1' "

if [[ x$2 != x ]] ; then
    if [[ x$opt_t == x ]]; then
 CLAUSE_TABLE=" AND T.table_name = '$2' "
 CLAUSE_TABLE=" AND T.table_name like '$2' "

CSET2="T.TABLE_SCHEMA, T.TABLE_NAME, CCSA.character_set_name"

echo "SELECT $CSET2 FROM information_schema.TABLES T,information_schema.COLLATION_CHARACTER_SET_APPLICABILITY CCSA WHERE CCSA.collation_name = T.table_collation  $CLAUSE_DB $CLAUSE_TABLE" | mysql

echo "======================"

if [[ x$opt_l == x ]]; then
    CLAUSE_DB=" WHERE table_schema='$1' "
    CLAUSE_DB=" WHERE table_schema like '$1' "

if [[ x$2 != x ]] ; then
    if [[ x$opt_t == x ]]; then
 CLAUSE_TABLE=" AND table_name = '$2' "
 CLAUSE_TABLE=" AND table_name like '$2' "

if [[ x$3 != x ]] ; then
    if [[ x$opt_c == x ]]; then
 CLAUSE_COLUMN=" AND column_name = '$3' "
 CLAUSE_COLUMN=" AND column_name like '$3' "



Monday, October 12, 2015

Di un libro quasi comperato (grazie al cane). Quasi una recensione, quindi.

Ritratto di Marie salvatrice
In una delle mie puntate in libreria del Sabato mattina, ho preso in  mano il libro di Yanis Varoufakis, "E' l'economia che cambia il mondo". Mi dirigevo verso la cassa, deciso ad acquistarlo, quando Marie (il mio cane di 5 anni, e compagna delle mie passeggaite di Sababto mattina. Illustrata a sinistra), ha deciso, come fanno quelli della sua specie che non avrebbe mai e poi mai potuto abbandonare il negozio senza avere prima placato la sua sete di conoscenza annusando un odore - quasi certamente  rivoltante - che proveniva dall'angolo opposto a quello dove si trova la cassa. Ve beh, è Sabato per me e anche per il cane - mi sono detto assecondandola. Mentre lasciavo che annusasse a sazietà, ho adocchiato una poltroncina modello IKEA che la provvidenza libraia aveva messo proprio a portata delle mie terga, e mi ci sono accomodato iniziando  a sfogliare il libro, mentre Marie si posizionava strategicamente nel punto di massimo ingombro, in modo da far inciampare tutti quelli che passassero nel raggio di una ventina di metri dalla mia postazione.

Questo contrattempo in forma di cane ha fatto sì che mi rendessi conto che Yanis:

  • Scrive con l'abusato e ormai quasi insopportabile artificio retorico di "X spiegato a mia figlia";
  • Ritiene che l'agricoltura sia stata inventata dagli europei perché avevano depauperato l'ambiente...
  • ...ma non dagli australiani che "vivevano in armonia con la natura" creando miti e opere d'arte "di rilevantissimo valore culturale"...
  • ...mentre gli africani (che  avevano anch'essi l'agricoltura: perché, Yanis non lo spiega) non sono riusciti a dominare l'Europa perchè per motivi cliematici non potevano trapiantare le loro colture da Sud a Nord;
  • Ritiene che la rivoluzione industriale britannica sia stata causata dai proprietari feudali per riciclare il surplus di manodopera nelle industrie, e che questo abbia disgraziatamente distrutto la millenarie tradizioni agricole feudali. Questo viene scritto con una vena di rimpianto - I kid you not - mentre il fatto che in altre regioni d'Europa il permanere di quelle millenarie tradizioni risultasse oin crisi alimentari e (orribili) carestie periodiche pare non turbare più di tanto il Nostro.
  • Ritiene che tutta la storia umana sia una di sopraffazione in perpetuo inseguimento del surplus, che solo pochi saggi gruppi umani evitano. Gli aborigeni australiani sono l'unico esempio in cui mi sono imbattuto.
  • Generalmente pensa che il modo migliore di risolvere ogni problema economico sia attraverso una legge impositiva creata dal "Governo" la cui (del Governo) bontà è sempre data per certa.
A queso punto Marie ha visto un beagle uscire dalla libreria e ha dato chiari segni di volerlo seguire, strappandomi dalla marea di insulsaggini in cui Varoufakis mi stava avviluppando. Ho riposto il libro nello scaffale, e, decidendo che stava molto meglio lì, sono uscito dal negozio. Grazie al cane.

Wednesday, October 7, 2015

La biblioteca, incarnata

Un programmatore umanista di genio - e mio fratello spirituale - ha realizzato in concreto il vasto edificio intellettuale che fino ad ora si poteva solo contemplare nel racconto "La biblioteca di Babele", contenuto nella raccolta "Finzioni"  dell'immenso autore argentino Jorge Luis Borges.

Si tratta di un sito che mi tocca particolarmente da vicino, perché ricordo ancora come(*) scoprii questo capolavoro, e lo stupore e la meraviglia di cui mi riempì.

Come previsto da Borges la Biblioteca contiene anche la propria descrizione espressa con le stesse parole usate dall'autore nel racconto omonimo.

Gli attuali limiti dell'algoritmo usato fanno sì che la descrizione che si può trovare oggi sia spezzettata in sei parti (i link del paragrafo precedente) e la mia pigrizia che la traslitterazione dallo spagnolo sia imperfetta specie nelle accentate. Ma è certo che una traslitterazione impeccabile, in unico brano continuo e conforme all'originale, vi è contenuta, così come la sua traduzione in Italiano, ed in ogni altra lingua concepibile.

Il sito permette di cercare qualsiasi combinazione di 3200 caratteri  di ricordarne la collocazione, che è immutabile.

Questo testo, naturalmente, è superfluo - la biblioteca lo contiene già.

(*) Il racconto era in appendice alla bellissima antologia, curata da Fruttero e Lucentini "Il secondo libro della fantascienza"che, a 11 anni,  avevo divorato dopo avere scoperto la non meno bella antologia di cui quella era il seguito, "Le meraviglie del possibile"Einaudi, 1959.


L'universo (che altri chiama la Biblioteca) si compone d'un numero indefinito, e forse infinito, di gallerie esagonali, con vasti pozzi di ventilazione nel mezzo, bordati di basse ringhiere. Da qualsiasi esagono si vedono i piani superiori e inferiori, interminabilmente. La distribuzione degli oggetti nelle gallerie è invariabile. Venticinque vasti scaffali, in ragione di cinque per lato, coprono tutti i lati meno uno; la loro altezza, che è quella stessa di ciascun piano, non supera di molto quella d'una biblioteca normale. Il lato libero dà su un angusto corridoio che porta a un'altra galleria, identica alla prima e a tutte. A destra e a sinistra del corridoio vi sono due gabinetti minuscoli. Uno permette di dormire in piedi; l'altro di soddisfare le necessità fecali. Di qui passa la scala spirale, che si inabissa e s'innalza nel remoto. Nel corridoio è uno specchio, che fedelmente duplica le apparenze. Gli uomini sogliono inferire da questo specchio che la Biblioteca non è infinita (se realmente fosse tale, perché questa duplicazione illusoria?), io preferisco sognare che queste superfici argentate figurino e promettano l'infinito... La luce procede da frutti sferici che hanno il nome di lampade. Ve ne sono due per esagono, su una traversa. La luce che emettono è insufficiente, incessante.

Come tutti gli uomini della Biblioteca, in gioventù io ho viaggiato; ho peregrinato in cerca di un libro, forse del catalogo dei cataloghi; ora che i miei occhi quasi non possono decifrare ciò che scrivo, mi preparo a morire a poche leghe dall'esagono in cui nacqui. Morto, non mancheranno mani pietose che mi gettino fuori della ringhiera; mia sepoltura sarà l'aria insondabile; il mio corpo affonderà lungamente e si corromperà e dissolverà nel vento generato dalla caduta, che è infinita. Io affermo che la Biblioteca è interminabile. Gli idealisti argomentano che le sale esagonali sono una forma necessaria dello spazio assoluto, per lo meno, della nostra intuizione dello spazio.

Ragionano che è inconcepibile una sala triangolare o pentagonale. (I mistici pretendono di avere, nell'estasi, la rivelazione d'una camera circolare con un gran libro circolare dalla costola continua, che fa il giro completo delle pareti; ma la loro testimonianza è sospetta; le loro parole, oscure. Questo libro ciclico è Dio). Mi basti, per ora, ripetere la sentenza classica: «La Biblioteca è una sfera il cui centro esatto è qualsiasi esagono, e la cui circonferenza è inaccessibile».

A ciascuna parete di ciascun esagono corrispondono cinque scaffali; ciascuno scaffale contiene trentadue libri di formato uniforme; ciascun libro è di quattrocentodieci pagine; ciascuna pagina, di quaranta righe; ciascuna riga, di quaranta lettere di colore nero. Vi sono anche delle lettere sulla costola di ciascun libro; non, però, che indichino o prefigurino ciò che diranno le pagine. So che questa incoerenza, un tempo, parve misteriosa. Prima d'accennare alla soluzione (la cui scoperta, a prescindere dalle sue tragiche proiezioni, è forse il fatto capitale della storia) voglio rammentare alcuni assiomi.

Primo: La Biblioteca esiste ab aeterno. Di questa verità, il cui corollario immediato è l'eternità futura del mondo, nessuna mente ragionevole può dubitare. L'uomo, questo imperfetto bibliotecario, può essere opera del caso o di demiurghi malevoli; l'universo, con la sua elegante dotazione di scaffali, di tomi enigmatici, di infaticabili scale per il viaggiatore e di latrine per il bibliotecario seduto, non può essere che l'opera di un dio. Per avvertire la distanza che c'è tra il divino e l'umano, basta paragonare questi rozzi, tremuli simboli che la mia fallibile mano sgorbia sulla copertina d'un libro, con le lettere organiche dell'interno: puntuali, delicate, nerissime, inimitabilmente simmetriche.

Secondo: Il numero dei simboli ortografici è di venticinque. Questa constatazione permise, or sono tre secoli, di formulare una teoria generale della Biblioteca e di risolvere soddisfacentemente il problema che nessuna congettura aveva permesso di decifrare: la natura informe e caotica di quasi tutti i libri. Uno di questi, che mio padre vide in un esagono del circuito quindici novantaquattro, constava delle lettere M C V, perversamente ripetute dalla prima all'ultima riga. Un altro (molto consultato in questa zona) è un mero labirinto di lettere, ma l'ultima pagina dice Oh tempo le tue piramidi. È ormai risaputo: per una riga ragionevole, per una notizia corretta, vi sono leghe di insensate cacofonie, di farragini verbali e di incoerenze. (So d'una regione barbarica i cui bibliotecari ripudiano la superstiziosa e vana abitudine di cercare un senso nei libri, e la paragonano a quella di cercare un senso nei sogni o nelle linee caotiche della mano... Ammettono che gli inventori della scrittura imitarono i venticinque simboli naturali, ma sostengono che questa applicazione è casuale, e che i libri non significano nulla di per sé. Questa affermazione, lo vedremo, non è del tutto erronea). Per molto tempo si credette che questi libri impenetrabili corrispondessero a lingue preterite o remote. Ora, è vero che gli uomini più antichi, i primi bibliotecari, parlavano una lingua molto diversa da quella che noi parliamo oggi; è vero che poche miglia a destra la lingua è già dialettale, e novanta piani più sopra è incomprensibile. Tutto questo, lo ripeto, è vero, ma quattrocentodieci pagine di inalterabili M C V non possono corrispondere ad alcun idioma, per dialettale o rudimentale che sia. Altri insinuarono che ogni lettera poteva influire sulla seguente, e che il valore di M C V nella terza riga della pagina 71 non era lo stesso di quello che la medesima serie poteva avere in altra riga di altra pagina; ma questa vaga tesi non prosperò. Altri pensarono a una crittografia; questa ipotesi è stata universalmente accettata, ma non nel senso in cui la formularono i suoi inventori.

Cinquecento anni fa, il capo d'un esagono superiore trovò un libro tanto confuso come gli altri, ma in cui v'erano quasi due pagine di scrittura omogenea, verosimilmente leggibile.

Mostrò la sua scoperta a un decifratore ambulante, e questo gli disse che erano scritte in portoghese; altri gli dissero che erano scritte in yiddish. Poté infine stabilirsi, dopo ricerche che durarono quasi un secolo, che si trattava d'un dialetto samoiedo-lituano del guaraní, con inflessioni di arabo classico. Si decifrò anche il contenuto: nozioni di analisi combinatoria, illustrate con esempi di permutazioni a ripetizione illimitata. Questi esempi permisero a un bibliotecario di genio di scoprire la legge fondamentale della Biblioteca. Questo pensatore osservò che tutti i libri, per diversi che fossero, constavano di elementi eguali: lo spazio, il punto, la virgola, le ventidue lettere dell'alfabeto.

Stabilí, inoltre, un fatto che tutti i viaggiatori hanno confermato: non vi sono, nella vasta Biblioteca, due soli libri identici. Da queste premesse incontrovertibili dedusse che la Biblioteca è totale, e che i suoi scaffali registrano tutte le possibili combinazioni dei venticinque simboli ortografici (numero, anche se vastissimo, non infinito) cioè tutto ciò ch'è dato di esprimere, in tutte le lingue. Tutto: la storia minuziosa dell'avvenire, le autobiografie degli arcangeli, il catalogo fedele della Biblioteca, migliaia e migliaia di cataloghi falsi, la dimostrazione della falsità di questi cataloghi, la dimostrazione della falsità del catalogo autentico, l'evangelo gnostico di Basilide , il commento di questo evangelo, il commento del commento di questo evangelo, il resoconto veridico della tua morte, la traduzione di ogni libro in tutte le lingue, le interpolazioni di ogni libro in tutti i libri.

Quando si proclamò che la Biblioteca comprendeva tutti i libri, la prima impressione fu di straordinaria felicità. Tutti gli uomini si sentirono padroni di un tesoro intatto e segreto.

Non v'era problema personale o mondiale la cui eloquente soluzione non esistesse: in un qualche esagono. L'universo era giustificato, l'universo attingeva bruscamente le dimensioni illimitate della speranza. A quel tempo si parlò molto delle Vendicazioni: libri di apologia e di profezia che giustificavano per sempre gli atti di ciascun uomo dell'universo e serbavano arcani prodigiosi per il suo futuro.

Migliaia di ambiziosi abbandonarono il dolce esagono natale e si lanciarono su per le scale, spinti dal vano proposito di trovare la propria Vendicazione. Questi pellegrini s'accapigliavano negli stretti corridoi, profferivano oscure minacce, si strangolavano per le scale divine, scagliavano i libri ingannevoli nei pozzi senza fondo, vi morivano essi stessi, precipitativi dagli uomini di regioni remote. Molti impazzirono... Le Vendicazioni esistono (io ne ho viste due, che si riferiscono a persone da venire, e forse non immaginarie), ma quei ricercatori dimenticavano che la possibilità che un uomo trovi la sua, o qualche perfida variante della sua, è sostanzialmente zero.

Anche si sperò, a quel tempo, nella spiegazione dei misteri fondamentali dell'umanità: l'origine della Biblioteca e del tempo. È verosimile che di questi gravi misteri possa darsi una spiegazione in parole: se il linguaggio dei filosofi non basta, la multiforme Biblioteca avrà prodotto essa stessa l'inaudito idioma necessario, e i vocabolari e la grammatica di questa lingua. Già da quattro secoli gli uomini affaticano gli esagoni... Vi sono cercatori ufficiali, inquisitori. Li ho visti nell'esercizio della loro funzione: arrivano sempre scoraggiati; parlano di scale senza un gradino, dove per poco non s'ammazzarono; parlano di scale e di gallerie con il bibliotecario; ogni tanto, prendono il libro più vicino e lo sfogliano, in cerca di parole infami. Nessuno, visibilmente, s'aspetta di trovare nulla.

Alla speranza smodata, com'è naturale, successe una eccessiva depressione. La certezza che un qualche scaffale d'un qualche esagono celava libri preziosi e che questi libri preziosi erano inaccessibili, parve quasi intollerabile. Una setta blasfema suggerí che s'interrompessero le ricerche e che tutti gli uomini si dessero a mescolare lettere e simboli, fino a costruire, per un improbabile dono del caso, questi libri canonici. Le autorità si videro obbligate a promulgare ordinanze severe. La setta sparì, ma nella mia fanciullezza ho visto vecchi uomini che lungamente s'occultavano nelle latrine, con dischetti di metallo in un bossolo proibito, e debolmente rimediavano al divino disordine.

Altri, per contro, credettero che l'importante fosse di sbarazzarsi delle opere inutili. Invadevano gli esagoni, esibivano credenziali non sempre false, sfogliavano stizzosamente un volume e condannavano scaffali interi: al loro furore igienico, ascetico, si deve l'insensata distruzione di milioni di libri. Il loro nome è esecrato, ma chi si dispera per i «tesori» che la frenesia di coloro distrusse, trascura due fatti evidenti. Primo: la Biblioteca è cosí enorme che ogni riduzione d'origine umana risulta infinitesima. Secondo: ogni esemplare è unico, insostituibile, ma (poiché la Biblioteca è totale) restano sempre varie centinaia di migliaia di facsimili imperfetti, cioè di opere che non differiscono che per una lettera o per una virgola.

Contrariamente all'opinione generale, credo dunque che le conseguenze delle depredazioni commesse dai Purificatori siano state esagerate a causa dell'orrore che quei fanatici ispirarono. Li sospingeva l'idea delirante di conquistare i libri dell'Esagono Cremisi: libri di formato minore dei normali; onnipotenti, illustrati e magici. Sappiamo anche d'un'altra superstizione di quel tempo: quella dell'Uomo del Libro. In un certo scaffale d'un certo esagono (ragionarono gli uomini) deve esistere un libro che sia la chiave e il compendio perfetto di tutti gli altri: un bibliotecario l'ha letto, ed è simile a un dio. Nel linguaggio di questa zona si conservano tracce del culto di quel funzionario remoto.

Molti peregrinarono in cerca di Lui, si spinsero invano nelle più lontane gallerie. Come localizzare il venerando esagono segreto che l'ospitava? Qualcuno propose un metodo regressivo: per localizzare il libro A, consultare previamente il libro B; per localizzare il libro B, consultare previamente il libro C; e cosi all'infInito... In avventure come queste ho prodigato e consumato i miei anni.

Non mi sembra inverosimile che in un certo scaffale dell'universo esista un libro totale; prego gli dèi ignoti che un uomo - uno solo, e sia pure da migliaia d'anni!, - l'abbia trovato e l'abbia letto. Se l'onore e la sapienza e la felicità non sono per me, che siano per altri. Che il cielo esista, anche se il mio posto è all'inferno. Ch'io sia oltraggiato e annientato. ma che per un istante, in un essere, la Tua enorme Biblioteca si giustifichi.

Affermano gli empi che il nonsenso è normale nella Biblioteca, e che il ragionevole (come anche l'umile e semplice coerenza) è una quasi miracolosa eccezione.

Parlano (lo so) della “Biblioteca febbrile, i cui casuali volumi corrono il rischio incessante di mutarsi in altri, e tutto affermano, negano e confondono come una divinità in delirio”. Queste parole, che non solo denunciano il disordine, ma lo illustrano. testimoniano generalmente del pessimo gusto e della disperata ignoranza di chi le pronuncia. In realtà, la Biblioteca include tutte le strutture verbali, tutte le variazioni permesse dai venticinque simboli ortografici, ma non un solo nonsenso assoluto. Inutile osservarmi che il miglior volume dei molti esagoni che amministro s'intitola Tuono pettinato, un altro Il crampo di gesso e un altro Axaxaxas mlo.

Queste proposizioni, a prima vista incoerenti. sono indubbiamente suscettibili d'una giustificazione crittografica o allegorica; questa giustificazione è verbale, e però, ex hypothesi, già figura nella Biblioteca. Non posso immaginare alcuna combinazione di caratteri


che la divina Biblioteca non abbia previsto, e che in alcuna delle sue lingue segrete non racchiuda un terribile significato. Nessuno può articolare una sillaba che non sia piena di tenerezze e di terrori; che non sia, in alcuno di quei linguaggi, il nome poderoso di un dio. Parlare è incorrere in tautologie. Questa epistola inutile e verbosa già esiste in uno dei trenta volumi dei cinque scaffali di uno degli innumerabili esagoni - e cosi pure la sua confutazione. (Un numero n di lingue possibili usa lo stesso vocabolario, in alcune, il simbolo biblioteca ammette la definizione corretta di sistema duraturo e ubiquitario di gallerie esagonali, ma biblioteca sta qui per pane, o per piramide, o per qualsiasi altra cosa, e per altre cose stanno le sette parole che la definiscono. Tu che mi leggi, sei sicuro d'intendere la mia lingua?) Lo scrivere metodico mi distrae dalla presente condizione degli uomini, cui la certezza di ciò, che tutto sta scritto, annienta o istupidisce. So di distretti in cui i giovani si prosternano dinanzi ai libri e ne baciano con barbarie le pagine, ma non sanno decifrare una sola lettera. Le epidemie, le discordie eretiche, le peregrinazioni che inevitabilmente degenerano in banditismo, hanno decimato la popolazione.

Credo di aver già accennato ai suicidi, ogni anno più frequenti. M'inganneranno, forse, la vecchiezza e il timore, ma sospetto che la specie umana - l'unica - stia per estinguersi, e che la Biblioteca perdurerà: illuminata, solitaria, infinita, perfettamente immobile, armata di volumi preziosi, inutile, incorruttibile, segreta.

Aggiungo: infinita. Non introduco quest'aggettivo per un'abitudine retorica; dico che non è illogico pensare che il mondo sia infinito. Chi lo giudica limitato, suppone che in qualche luogo remoto i corridoi e le scale e gli esagoni possano inconcepibilmente cessare; ciò che è assurdo. Chi lo immagina senza limiti, dimentica che è limitato il numero possibile dei libri. Io m'arrischio a insinuare questa soluzione: La Biblioteca è illimitata e periodica. Se un eterno viaggiatore la traversasse in una direzione qualsiasi, constaterebbe alla fine dei secoli che gli stessi volumi si ripetono nello stesso disordine (che, ripetuto, sarebbe un ordine: l'Ordine). Questa elegante speranza rallegra la mia solitudine.

Saturday, September 12, 2015

Building a query string with the Smarty template engine

Curse the pesky "?" and "&"!" The first one separates the query string part from its url, the second separates the various parameters as in the very well known idiom:


So why did the HTML creators, in their wisdom, decide to have two different  separators, rather than one? Go read the W3C docs, if you feel like it (I don't). Regardless, it sucks like a tornado. Because you cannot now very well do things like:


because, depending on what's in $url, you may and up with things like:

/bar/baz.php?sna=foo"  //right
/bar/baz.php??sna=foo"    //wrong
/bar/baz.php?b=1?sna=foo" //wrong

sucky sucky, as stated. Wanna see which browsers will puke (and which will digest) the above wrong instances and write a nice table? I don't. But you go ahead, if you feel so inclined.

Having solved the problem in oomph languages and currently involved in Smarty+php development, I give you, elusive reader, this (rather involved) solution. Basically, tear apart query_string in an array, add your thingies to the array, glue it back together with "&"s, tack it to the end of your $smarty.server.SCRIPT_NAME variable. Unless, of course, you also have PATH_INFO. Stick these antics in a smarty plugin, use to your heart content in templates. Usage and credits are in the code comments.

//  href="{$smarty.server.SCRIPT_NAME}?{add_to_query_string q="foo=bar&sna=fu"}}
// also:
//{capture name="qstring" assign="qstring"}{$pfield}={$ct->id}&sna="foo"{/capture}
//  href="{$smarty.server.SCRIPT_NAME}?{add_to_query_string q=$qstring}"
// OR
// {$qsedit="edit=1&id=`$product->id`"}
//  href="{$smarty.server.SCRIPT_NAME}?{add_to_query_string q=$qsedit}"
// See: http://www.smarty.net/forums/viewtopic.php?p=608&sid=5601319f7015ef49edaca38455c2517e
// https://cameronspear.com/blog/smart-query-strings/
function smarty_function_add_to_query_string($param, $smarty) 
  // turn current query string and changes into arrays  
  parse_str($_SERVER['QUERY_STRING'], $return);
  parse_str($param['q'], $new);

  foreach ($new as $key => $value) $return[$key] = $value;
  return http_build_query($return, '', '&'); 

Friday, July 31, 2015

Efficient CKeditor tabbing with bootstrap and jquery

The Problem

Ok, so you are back in web coding and want to add the nifty CKeditor to your site, so some admin will be edit to add, say descriptions or notes in crisp, nicely formatted HTML (or maybe crufty, luridly formatted HTML - it really makes no difference).

More than that, you need to do that in a form, want to keep your elements as textareas, and you need more than one editor - in fact, you want one per language on a multilanguage site. Also you would like to keep not in use editors tucked away from view.

So you gather a tabbing widget, put textareas where they belong, deploy your editors in their place (no, not going into details here, but they will be shown momentarily).

And behold! Everything is painfully slow, even  with a paltry 4 editors on your page (four europeans languages, is that asking too much?). Ouch.

The idea. The recipe

Of course, what's needed is:
  • lazy creation of the editors
This is OK, since most of them are already out of view when the page starts up - that's because we're tabbing, remember?

This also means that the admirably short:


provided by CKeditor's jquery plugin won't cut it, as it will do everything at once, and your page will pop back up to consciousness only after it's finished - several seconds later.

This is not enough, however. CKeditor's 'classic' view, sitting in its own iframe, is quite hefty in itself - and even with lazy instantiation, mapping the GUI takes forever. So I'll also need:

That's lingo meaning that CKeditor will be attached to an element until it is clicked, when it springs into existence. That turns out to be much lighter.

CKeditor will inline a lot of elements which set the HTML5 attribute contenteditable to true - DIVs, notably .  I am an old timer, however, and I want this to happen in a form's textarea, so I can enjoy the automatic variable population that happens when my little lusers hit the "Submit" button. (Aside: can this also be made to happen with DIVs, I wonder? Comment if you know it.)

Critically, CKeditor allows to do inline on textareas  since V4.2. And this is another reason why the jquery plugin for CKeditor cannot be used - its .ckeditor() method appears to force 'classic' view on textareas (a feature request that appears to be promising on the CK's blog gave me no joy whatsoever).

What else? Oh, right, I'm gonna need

unless, that is, one wants to do the  click-hide-show wiring and dance by hand. (Which I did, on first iteration. Darn me, for not knowing my manuals - but I'm old, did I already mention it? So never mind me). Not to worry, bootstrap (which makes everything oh, so 2.0 not to mention, responsive) has a perfectly fine tabbing widget camped on an appropriatedly marked up UL section. Be sure to read up on it carefully, or you will be liable to miss (as I did) the critical part on javascript plumbing that makes  the tabbing automatic.

And because it's bootstrap, and 2015 to boot,  I'm going to spruce it all up by adding:

to the mix - after all, bootstrap needs jquery, and will everybody wanting to do browser sniffing  on their own please raise their hands? I thought so. Which of course also implies we will want a last ingredient:

anything above IE8 will do, but surely you have that - you are not still supporting IE6 and Netscape 4.7, are you? Or, God forbid, IE7.

And voilà. Sounds easy? It's not.

The reasearch

And so, google and stackoverflow to the rescue, you start looking for the solution's pieces, and put them together , and it takes a day or more. Unless of course you stumbled on this page, where I laid it all down for you, my trusty reader. (It took more than a day, thank you very much - show your gratitude by sending money - lots  of it - in a stamped envelope. Yes, I'm that greedy.)

The execution

Markup: the header

<!DOCTYPE html>
 <meta charset="utf-8">
 <title>CKEditor ALF</title>
 <link href="/core/jquery-ui-1.11.4/jquery-ui.min.css" rel="stylesheet" type="text/css">
 <script type="text/javascript" src="/core/jquery/jquery-1.11.1.min.js"></script>
 <script type="text/javascript" src="/core/jquery-ui-1.11.4/jquery-ui.min.js"></script>

 <!-- Bootstrap -->
 <script type="text/javascript" src="/core/bootstrap/js/bootstrap.min.js"></script>

 <!-- Bootstrap core CSS -->
 <link href="/core/bootstrap/css/bootstrap.min.css" rel="stylesheet">
 <!-- Optional Bootstrap Theme -->
 <link data-href="/core/bootstrap/css/bootstrap-theme.min.css" rel="stylesheet" id="bs-theme-stylesheet">
 <script src="../ckeditor.js"></script><!-- the editor -->
 <script type="text/javascript" src="../adapters/jquery.js"></script>
 <script src="tab4.js"></script>

Here I'm pulling all of my ingredients - plus  my own code - on board, html5-style.
Not much to see, here - we're loading the CKeditor jquery plugin for the heck of it, since we are not going to use it.

Markup: the body

<body id="main">
  <div style="width:100%; height:400px; border: 3px solid red;">
    <!--First tabset -->
    <ul class="nav nav-tabs">
      <li><a data-target="#oita" data-toggle="tab" class="editor">Italiano</a></li>
      <li><a data-target="#oeng" data-toggle="tab" class="editor">English</a></li>
      <li><a data-target="#oesp" data-toggle="tab" class="editor">Spagnolo</a></li>
      <li><a data-target="#odeu" data-toggle="tab" class="editor">Deutsch</a></li>
    <span style="border:3px solid #0f0;">Seleziona il testo per editare</span>
    <div class="tab-content" style="box-shadow: inset 0 0 10px #999999;border:3px solid yellow;" >
      <div id="oita" class="tab-pane" style="height:300px"><textarea id="ita" name="ita">Ciao!</textarea></div>
      <div id="oeng" class="tab-pane" style="height:300px"><textarea id="eng" name="eng"><i>Hello!</i></textarea></div>
      <div id="oesp" class="tab-pane" style="height:300px"><textarea id="esp" name="esp"><b>Hola!</b></textarea></div>
      <div id="odeu" class="tab-pane" style="height:300px"><textarea id="deu" name="deu"><b>Guten tag!</b></textarea></div>

The meat and potato of the UI, these is textbook stile bootstrap JS tabbing, with all its data-xxx thingies wired up just right. I am also adding an 'editor' class to seize upon later with a jquery selector, and a few containers and visual cues that will tell the user that yes - click the text and editing will happen.

Javascript: the wiring

It is now time to sprinkle our  jquery magic ppowder, tucked away in tab4.js (yes, the fourth iteration):

$(document).ready( function() {    
    CKEDITOR.config.height = 150;
    CKEDITOR.config.width = 'auto';
  $('.editor').on('shown.bs.tab', function (e) {
 var target = $($(this).data("target"));
 target.find('textarea').each(function () {
     if(!CKEDITOR.instances[this.id]) {
 return 1;

A bit of explanation is in order, here.

  1. $(document).ready(): wrap everyhting inside this. No need to worry, I can register as many ready- handlers as you like and they will fire on a first-defined, first-served basis.
  2.  $('.editor'): seize the editor-classed elements . These are the anchors that compose the links on the tabs
  3. .on('shown.bs.tab', function (e) {:  attach a callback to the "expose" event . the funky event name took me forever to locate
  4. $($(this).data("target")): select the target that will be exposed (it is one of the divs, see markup). Is this syntax bit ugly, or what?
  5. target.find('textarea').each(function () {: iterate on the descended textares (better have one per container, or there goes  your efficiencies
  6. if(!CKEDITOR.instances[this.id]) { CKEDITOR.inline(this): if it does not already contain an editor, create it.
Six easy pieces.


And there you have it. Efficient CKeditor tabbing

Tuesday, July 7, 2015

Cicale Greche, formiche Europee?

"Le conseguenze finanziarie di un'uscita Grecia dall'Euro oggi possono essere valutate con più tranquillità che in passato perché il rischio di contagio è molto inferiore a di quanto non fosse in passato [...]
Il sistema bancario europeo, che è il più probabile portatore di contagio nel corso delle crisi finanziarie, è in uno stato migliore che non all'inizio della crisi. Le banche dell'Eurozona hanno accumulato 250 miliardi di capitale dal 2008, rafforzando una situazione contabile poco solida. Le banche che erano pesantemente esposte al debito Greco hanno avuto tutto il tempo di riordinare i propri bilanci. Secondo Deutsche Bank,  l'esposizione dei i creditori (privati, NdR) Europei, un tempo pari a quasi 300 miliardi,  è ora di circa 54 miliardi. La maggior parte del debito greco è ora nelle mani dei governi e di istituzioni internazionali, che sono in grado di sopportare i costi di un'insolvenza greca, cosa che le banche non potrebbero fare.  Il costo dell'uscita della Grecia dall'euro potrebbe essere 230 miliardi di Euro, secondo le stime di Alberto Gallo di RBS - un bella cifra, ma solo il 2% del PIL Europeo"

"The financial consequences of Greece leaving the euro can now be considered with much more equanimity than previously because the risk of contagion looks much smaller than it used to. [...]Europe’s banking system, a likely vector for contagion in any financial crisis, is in better shape than at the outset of the crisis. Euro-zone banks have raised some €250 billion in capital since 2008, bolstering once-shaky balance sheets. And banks once heavily exposed to Greece have had ample time to reorder their affairs. European lenders’ claims on Greece, which once topped €300 billion, now stand at just €54 billion, according to Deutsche Bank. Most of the outstanding Greek debt is now owed to governments and international institutions, which could handle the cost of default, rather than to banks, which would struggle to do so. The overall cost of Grexit might be €230 billion, according to Alberto Gallo of RBS, another bank: hefty, but only about 2% of euro-zone GDP."

(Tratto da "The Greek crisis-There comes up a day" The Economist, 4/07/2015 - sottolineature aggiunte) 

Chi crede che la crisi Greca sia solo una favola morale in cui una cicala (greca) chiede alle formiche (europee) di pagare per i propri vizi estivi può dare un'occhiata al brano citato poco sopra.  In sintesi: nel 2012 la Grexit era impensabile perché il debito Greco era in gran parte in mani private,ora si può pensare perché in questi tre anni il suo costo è stato trasferito dalle banche (Goldman Sachs, tra le altre) ai governi - cioè a noi.

Non c'è da scandalizzarsene più di tanto, visto che nonostante le perplessità di alcuni commentatori ("Ma zio, se non brucio una banca...sono un coglione!") senza banche si sta tutti maluccio. Ma questo non significa che alle banche si debba condonare qualunque comportamento rischioso - ad esempio suggerire ad un governo i modi di truccare il proprio bilancio, cosa che la Grecia ha fatto, con il complice silenzio-assenso di tutti, fino al 2010. Si possono pewrò mettere in prospettiva i discorsi sulla responsabiltà e le spiegazioni semplificate del tipo "i debiti  vanno pagati".  

Poi i debiti vanno pagati, e la crisi Greca è anche  una favola morale di cicale greche  - solo che le formiche, se ci sono e se sono europee, non sono probabilmente tra quelli che decidono oggi cosa fare, e se ci sono, sono anche più odiose che nella favola originale.

Thursday, June 18, 2015

Tutta colpa della ggente

Supponete di essere un commentatore 2.0, ma con idee radicali 1.0 maturate essenzialmente nell'area movimentista degli anni 1970, tra Roma, Bologna, Indiani Metropolitani & co.

Supponiamo (non è difficile, è successo poche settimane fa) che un gruppo di post-adolescenti, con ormoni in eccesso, cervello in difetto ("Zio, se non bruci una banca non sei nessuno!") e un Sabato pomeriggio libero decida di vandalizzare un quartiere centrale di Milano "in opposizione all'Expo 2015" (Huh? wut).

Non siete abbastanza ipocriti da prendere le distanze dagli imbecilli e da condannarne le azioni ("La galera, la galera ci vuole") che neanche troppo segretamente, in fondo, condividete. Ma siete troppo sgamati per prendere le loro parti apertamente rovinando la vostra immagine equilibrata. Che fare? Ignorare l'evento è impossibile.

Allora seguite i commenti che la pubblicazione dell'evento ha sui social. Qualcuno che dice "Io li gaserei, quei terroristi" ci sarà - probabilmente molti, e molti diranno di peggio. Qualche signora in età che mette alla finestra un cartello d'incitamento alla Celere ("Sparategli!") ci sarà. Laggente verrà in vostro aiuto, e il vostro commento è bell'e pronto:

"Più dei Black  Bloc mi fanno paura quelli che scrivono 'sprangateli, massacrateli, fateli a pezzi' "

Mettete un link, e il gioco è fatto. Visto? Basta dare la colpa a laggente. Il vecchio benaltrismo, certo ("Il problema è ben altro"), armi di distrazione di massa,  certo, ma con quel fascino blasé di chi ben conosce le vie di internet "e i i pericoli della demagogia, signora mia, che pericoli".

Ma se siete di destra, leghisti, Salvinisti? Chi vi aiuterà a non prendere le distanze con l'aria di prenderle?

Nessun problema, laggente è anche di sinistra, pronta a minacciare di orrende rappresaglie ("Sappiamo come ti chiami e dove vivi, pezzo di merda") il minus habens che esulta perchè una barca di migranti affonda in alto mare (ed è uno/una che passa il resto del suo tempo a postare a favore dei gatti e a difendersi dalle scie chimiche, per intenderci sul livello).

Fidatevi de laggente, amici 2.0.

Thursday, May 7, 2015

Nostalgy corner: ED

If you don't get this, you're:

  1. Not into UNIX
  2. Not old.

  From: patl@athena.mit.edu (Patrick J. LoPresti?)
  Message-ID: <1991jul11 .031731.9260="" athena.mit.edu="">
  Sender: news@athena.mit.edu (News system)
  Subject: The True Path (long)
  Date: 11 Jul 91 03:17:31 GMT
  Path: ai-lab!mintaka!olivea!samsung!zaphod.mps.ohio-state.edu!think.com!snorkelwacker.mit.edu!bloom-picayune.mit.edu!athena.mit.edu!patl
  Newsgroups: alt.religion.emacs,alt.slack
  Organization: Massachusetts Institute of Technology
  Lines: 95
  Xref: ai-lab alt.religion.emacs:244 alt.slack:1935

  When I log into my Xenix system with my 110 baud teletype, both vi
  *and* Emacs are just too damn slow.  They print useless messages like,
  'C-h for help' and '"foo" File is read only'.  So I use the editor
  that doesn't waste my VALUABLE time.

  Ed, man!  !man ed

  ED(1)  UNIX Programmer's Manual  ED(1)

 ed - text editor

 ed [ - ] [ -x ] [ name ]
 Ed is the standard text editor.

  Computer Scientists love ed, not just because it comes first
  alphabetically, but because it's the standard.  Everyone else loves ed
  because it's ED!

  "Ed is the standard text editor."

  And ed doesn't waste space on my Timex Sinclair.  Just look:

  -rwxr-xr-x  1 root       24 Oct 29  1929 /bin/ed
  -rwxr-xr-t  4 root  1310720 Jan  1  1970 /usr/ucb/vi
  -rwxr-xr-x  1 root  5.89824e37 Oct 22  1990 /usr/bin/emacs

  Of course, on the system *I* administrate, vi is symlinked to ed.
  Emacs has been replaced by a shell script which 1) Generates a syslog
  message at level LOG_EMERG; 2) reduces the user's disk quota by 100K;
  and 3) RUNS ED!!!!!!

  "Ed is the standard text editor."

  Let's look at a typical novice's session with the mighty ed:

  golem> ed

  eat flaming death

  Note the consistent user interface and error reportage.  Ed is
  generous enough to flag errors, yet prudent enough not to overwhelm
  the novice with verbosity.

  "Ed is the standard text editor."

  Ed, the greatest WYGIWYG editor of all.


  When I use an editor, I don't want eight extra KILOBYTES of worthless
  help screens and cursor positioning code!  I just want an EDitor!!
  Not a "viitor".  Not a "emacsitor".  Those aren't even WORDS!!!! ED!


  When IBM, in its ever-present omnipotence, needed to base their
  "edlin" on a UNIX standard, did they mimic vi?  No.  Emacs?  Surely
  you jest.  They chose the most karmic editor of all.  The standard.

  Ed is for those who can *remember* what they are working on.  If you
  are an idiot, you should use Emacs.  If you are an Emacs, you should
  not be vi.  If you use ED, you are on THE PATH TO REDEMPTION.  THE


Wednesday, May 6, 2015

Glutine! Arghhhh! Glutine!!!!!

Nel giro di poco tempo, pare che il glutine si sia trasformato da una delle proteine più consumate dall'uomo in una specie di succedaneo dell'arsenico. per uno come me, che del glutine sapeva solo che è la benefica sostanza che permette la lievitazione del pane questo violento attacco al glutine faceva un effetto un po' strano.

La paura è tanta, la consapevolezza poca, visto che ho sentito dire  "Ho un'amica celiaca e vegetariana, praticamente non mangia nient'altro che seitan" (seitan è il nome che in Aisa, si dà al glutine puro).

Ho cercato allora di informarmi e ho trovato un articolo, bello ed esauriente, pubblicato dal New yorker qualche mese fa e intitolato "Against the grain".
Tutti quelli che s'interessano di quello che mangiano per più del tempo necessario a mangiarlo dovrebberlo leggerlo. Siccome però è in inglese e lunghetto, ne riassumo i punti principali di seguito.

  • Il glutine fa sicuramente male ai celiaci, che costituiscono circa l'1% della popolazione;
  • L'incidenza della celiachia negli ultimi 70 anni è  quintuplicata passando dallo 0.2% all'1% e non per una migliore capacità diagnostica. Però nessuno sa perché: quasi certamente si tratta di un fattore ambientale, ma nessuno ne ha finora proposto uno plausibile
  • Negli ultimi anni si è diffusa (soprattutto negli USA) l'opinione che esista una forma di tolleranza non-celiaca al glutine di cui una grande percentuale di persone (fino al 40%) è convinta di soffrire.
  • Uno studio medico standard (effettuato col metodo doppio cieco) che ha mostrato l'esistenza della intolleranza non-celiaca al glutine (2011, Dr. Peter Gibson Monash University)
  • Ma le conclusioni dello studio di cui sopra sono poi state messe in questione da un altro studio  - che invece ha attribuito l'intolleranza ai FODMAP - fermentable oligosaccharides, disaccharides, monosaccharides, and polyols, in pratica un gruppo di carboidrati che tendono a fermentare nell'intestino e che sono spesso associati a cibi che contengono anche glutine;
  • Ma gli studi clinici sull'alimentazione sono lunghi e difficili.
  • Spesso una dieta priva di glutine fa star meglio chi la fa perché elimina anche molti altri nutrienti in eccesso nelle nostre diete (grassi zuccheri, FODMAPs - q.v.)
  • In ogni caso i medici sono convinti che l'intolleranza non-celiaca al glutine sia vastamente sovradiagnosticata un po' si mette in mezzo gente che non dovrebbe proprio fare diagnosi (psicologi, personal trainer...) e perchè il gluten-free è ormai una moda e un business
  • E' però anche vero che l'industria alimentare utilizza il glutine come addittivo in dosaggi ben lontani da quelli presenti nelle diete tradizionali e l'effetto di questi dosaggi non è noto (e non è escluso che possa sensibilizzare alcuni).
  • La margarina fa peggio del burro.
  • Nathan Myrvold ha definitivamente più interessi che capelli
Stretta la foglia, larga via...

Thursday, April 9, 2015

Taking the fun out of trolling: the killfile (a.k.a. plonking)

Instructions: the following form is provided for your plonking comfort. You may use it on internet boards, forums, etc. any time you meet our old friend Dick from the internet. Just copy and paste to let Dick know that whatever residual interest you had in him is exhausted, and you'll no longer be able to hear him making an ass of him/herself. My rule of thumb is: 
  1. Send a violation notice and disengage from direct interaction on first offence  
  2. Send a further notice and plonk on repeat violation (that's two strikes, and you're out - you don't really need three for this kind of scum)
Obviously, you don't have to warn trolls that you're plonking them, but doing it gives a nice closure feeling, and explicitly classifies as childish and useless further attempts of the trolls to contact you. Just be sure to never resume contact with the plonked individual unless a very long time has passed (and even then, I wouldn't, but that's me). Don't overdo this or you'll soon run out of people to talk to.
Above all, don't be like Dick, and  be sure to follow the house rules yourself. Always follow the house rules.

License: CC-BY-NC-ND

Welcome to my killfile!

I am writing this to inform you that you finally made it: you have been plonked. Most people never get even close to this place, but you are such a special person, and this place fits you to a T. This a moment to celebrate both as an achievement and as the last time we get a chance to talk (actually, that last chance is already gone for you).

This place has many names: the bitbucket, /dev/null, the ignore list... but I love our internet traditions, and I like its grim original name: killfile.

So,now you're here, look around. 

Make yourself at home. 

Have conversations (with yourself).

If you feel like it, feel free to behave like a jerk (I know that's a natural to you).

Or, just keep trolling away as you usually do.

Don't worry, I won't mind. As a matter of fact, I won't be even able to hear you - that's what killfiles are for.

Please note: this is a form letter.

Wednesday, April 8, 2015

Taking the fun out of trolling: violation notice

Instructions: the following form is provided for your comfort. You may use it on internet boards, forums, etc. any time you meet our old friend Dick from the internet. Just copy, paste and customize as applicable, any time you sense the trolling is beginning (be hip to the subtler forms of this dark art). After that, disengage from any followup discussion (that's the whole point, really) and enjoy the ensuing peace of mind. Don't overdo it, and trim the form to the actual offense(s). My rule of thumb is: 
  1. Send this violation notice and disengage from direct interaction on first offence  
  2. Send a further notice, followed by a killfile notice and a plonk on repeat violation (that's two strikes, and you're out - you don't really need three for this kind of scum)
Above all, don't be like Dick, and  be sure to follow the house rules yourself. Always follow the house rules.

License: CC-BY-NC-ND

Unfortunately, you have been found in violation of the house rules.

Your specific violations are : (check all that apply)

1.1 Being a troll
1.2 Being a dick
1.3 Being a jerk
2.1 Insulting people
2.2 Making personal remarks
2.3 Making a nuisance of yourself
2.4 Behaving like a juvenile while not being one (If you are younger than 15, please declare it and this violation will be struck from your record.)
3.1 Being irrational
3.2 Being rude

In addition, you have aggravated your position by: (check all that apply)

being asinine beyond belief
writing statements that would be best addressed in a court of law
exhibiting extremely low literacy and reading-comprehension skills
behaving in the volatile manner typical of sufferers of a major neurological damage or disorder
proving, beyond reasonable doubt, of being incapable of coherent (let alone, rational) thought
displaying appalling amounts of ignorance and intellectual inadequacy, even for an internet post (quite a feat).

This user abides by the house rules, and will therefore terminate this thread and disable further notifications, so you can safely engage in writing pathetic parting shots (usual with your kind) without bothering him/her any further. At this user's discretion, you may, now or in the future, with or without warning, be added to the user's kill file/ignore list (Wikipedia search: plonk) where you'll be able to make an ass of yourself, without being heard.

Have a nice day.

Please note: this is a form letter

Thursday, April 2, 2015


Non molto tempo fa, è stato chiesto su facebook:

"Ma perché (vi) dà tanto fastidio Laura Boldrini?"

In effetti più che una domanda era un quiz, e la risposta esatta (come era facile immaginare, per chi conosce il pulpito  - che non rivelerò - da cui viene la predica) era:

"Perchè LB è una donna intellligente, preparata, di successo e di sinistra che dice cose femministe, e chi non l'ha in grande simpatia è  uno scarafaggio sessista."

La domanda però, se presa alla lettera, ha una sua forza maieutica, e mi ha fatto pensare al perchè anch'io sono nel novero degli scarafaggi di cui sopra.

Laura Boldrini, in sintesi, non mi piace perchè ha uno dei  difetti cardine dei politici italiani: ogni volta che immagina il suo intervento nella società è per imporre una regola, creare una fattispecie di reato, inventare un meccanismo o un organismo di controllo. Per "tutelare" un diritto passivo, purché sia  caro alla Sig. Boldrini, si possono tranquillamente limitare, regolare pesantemente, o sopprimere,  diritti attivi (ad esempio, il diritto di scegliere le parole che si preferiscono, il diritto di libera associazione, quello di espressione del proprio pensiero anche se, magari, odioso o odiante).

Mai una volta che Boldrini si esprima ipotizzando una nuova possibilità, una nuova libertà o auspicando la rimozione di un controllo, obbligo, imposizione  (che in questo BelPaese sono in numero tale da indurmi a ringraziare la nostra inefficienza nell'applicarli; se li applicassimo tutti, temo diventeremmo istantaneamente uno stato di polizia)

Questo basterebbe, ma la nostra Presidentessa della Camera vi aggiunge il sussiego e la stentoreità propria di chi ha la verità in tutte le tasche del tailleur.

Tutto questo, unito al presenzialismo connaturato al ruolo istituzionale che la Signora ricopre, mi impedisce di apprezzarne le prese di posizione, e fa di me uno scarafaggio - e sessista  per di più.

Tuesday, March 24, 2015

The parable of SELinux - A sunday reading from the Book of Tar

From the Book of Tar, 1:14:

And it came to pass that, in a town in Galilee, a SysAdmin could not stomach SELinux.

And he went to talk to a security.guru, and he said unto him:

"Because of SELinux, there is much crashing amongst my daemons, and my log files are void and empty, and my data center is silent"

And the security.guru replied:

 "You have only your ignorance to blame, as SELinux will not yield  its enlightenment to those who do not pursue its intimate knowledge".

And the SysAdmin, chastened, hung his head in shame, and returned to his datacenter cave, and began studying the SELinux wisdom in earnest. But instead of enlightenment, he felt the study was growing the doubt in his heart. And it came to pass that one of the sacred books read:

"You will learn the details of the SELinux policy for your distribution". 

Ando so the SysadMin browsed its server policy and lo, the rules were thousands and their lot meaningless, and the kernel in its binary form was  crystal clear by comparison.

And the SysAdmin, with much doubt in his heart, returned to the security.guru dwelling and said unto him:

 "Surely you knew that intimate knowledge of thousands of rules is not possible and you were trying to test my resolve. Pray tell me what should I do now."

And the security.guru smiled, and told him, sternly:

 "You fool! Why do concern yourself with questions that are beyond thee? Don't you know that SELinux policies are brought to you by higher powers which you never may hope to stare upon? Return therefore to your keyboard, and relax."

But the sysadmin was sad in his heart, thinking:

"The guru advises me to study, but when study brings chaos and nonsense, he tells me to relax. But still my servers are down, and my logs are void and my datacenter suffers."

And  turning in anger to the security.guru he saith unto him:

"Surely you have been smoking bad stuff, or ate the weed that brings madness"

But the guru replied:

"Your heart is evil and your soul is now lost, because you did not abide to the Principle of least privilege." 

But the SysAdmin arose and explained to the guru, with several interesting details, what he should do with the Principle of least privilege and SELinux and its accursed lot, and advised him that returning to write windows ACLs would have brought several blessings unto him.

And the guru left with great anger and disdain, but as he left he fell in the group policies Gehenna, were there was much wailing and teeth grinding.

But the SysAdmin returned to his console and typed:

# for h in $(serverlist) ; do ssh $h setenforce 0; done 

And lo, he felt a great peace in his heart, and a soft light shone on his black and green monitor, and a sweet scent filled the cave and the buzz of the servers was loud, and the daemons were running and the logs were full and the diagnostics again meaningful, and joy returned to the datacenter.