Da un regime all'altro
Guardiamoci in faccia, siamo sicuri di esserci liberati di un "dittatore"?
O più semplicemente ci siamo infilati nelle fauci di chi la dittatura (quella vera) in Italia l'ha sempre foraggiata, gestita e spalleggiata?
Crisis Management
Quando offri un servizio online può capitare di avere dei problemi (bug, DDoS, guasti hardware, router impazziti, ecc.) che precludono l'accesso al servizio a buona parte dell'utenza (se non tutta).
Ci sono almeno due modi per affrontare la comunicazione con gli utenti durante una crisi:
- far finta di nulla;
- ammettere che si sta verificando un problema.
Il primo modo di replicare - a mio personalissimo parere - è inutile, a meno che non si stia affrontando una crisi che potrebbe avere ripercussioni gravissime sulla sicurezza degli utenti. In quel caso, è sempre buona norma dispensare le informazioni col contagocce e spiegare solo a problema risolto.
Il secondo modo, invece, porterà inevitabilmente alla domanda da un milione di dollari:
Quando risolverete il problema?
E qui scatta a chiunque la molla del VAFFANCULOPEZZODIMERDANONMIROMPERELEPALLECHEGIAHOIMIEICASINIDARISOLVERECIMANCHISOLOTU, specialmente se il servizio è gratuito. Reazione comprensibilissima, per carità, ma che non deve durare più di 5 millisecondi e che non deve assolutamente diventare di pubblico dominio.
A mio avviso, in una situazione di crisi bisogna osservare alcune semplici regole:
- spiegare onestamente all'utenza quale problema si sta verificando e quali sono i tempi previsti per la risoluzione (se ce ne sono, altrimenti ammettere tranquillamente di non sapere quanto tempo ci vorrà);
- mordersi le dita prima di rispondere male ad un utente, anche al più insistente;
- staccarsi le dita prima di limitare l'accesso ad un utente che chiede spiegazioni (questa è in assoluto la peggior cazzata che si possa fare);
- se non si è in grado di reggere la pressione lasciare che siano altri ad occuparsi del crisis management;
- risolvere il problema nel minor tempo possibile :-)
Anomalie statistiche
Da qualche giorno finalmente sono in giro i famigerati elenchi degli affittuari degli alloggi del Fondo Immobiliare, dopo mesi di "silenzio" da parte di Comune e SGE.
Perché elenchi e non elenco? Semplice, perché Aquilatv.it ne ha pubblicato uno estratto da non-si-sa-bene-dove, con tanto di date di firma del contratto e termine di locazione, canoni di affitto ecc., mentre a stretto giro il Comune dell'Aquila ne ha pubblicato un altro in cui erano assenti molti dei dati di cui sopra.
Ovviamente, visti i miei precedenti con elenchi di beneficiari (e non) di alloggi, potevo esimermi dal rompere le scatole? Ma ovviamente no :-)
Caricando entrambi gli elenchi in Google Refine (dopo averli trasformati in CSV con pdftotext, vim e tanto olio di gomito) salta subito all'occhio una discrepanza: l'elenco del Comune ha 299 voci, mentre quello di Aquilatv ne ha 308 (escludendo duplicati e voci "anonime").
C'è un'altra cosa che salta all'occhio: nella colonna relativa alla composizione dei nuclei familiari di entrambi gli elenchi fa spesso capolino il numero 2. Potrebbe essere solo una coincidenza, quindi prima di trarre conclusioni affrettate sarebbe il caso di analizzare i dati con strumenti adeguati.
Esportando entrambi i dataset e dandoli in pasto a R si ottengono questi istogrammi relativi alla distribuzione statistica delle dimensioni dei nuclei familiari:

Fondo immobiliare - Distribuzione componenti nucleo familiare (fonte: Comune dell'Aquila)

Fondo immobiliare - Distribuzione componenti nucleo familiare (fonte: Aquilatv.it)
Che cosa si può dedurre dai grafici?
Innanzi tutto, entrambi gli elenchi hanno la stessa distribuzione statistica, quindi i dati di Aquilatv.it sono reali. Nello specifico, i nuclei familiari con due componenti rappresentano oltre il 40% dei beneficiari degli alloggi del Fondo Immobiliare, seguiti a ruota da persone singole e nuclei di 4 componenti.
Non ci sarebbe nulla di strano in tutto questo, se non fosse che (cito testualmente il comunicato stampa del Commissario delegato per la Ricostruzione - l'enfasi è già presente nel documento originale):
– I nuclei familiari numerosi – da quattro componenti in su – potranno chiedere l’assegnazione di un map disponibile sia nel comune dell’Aquila che in quelli dell’intero cratere, o di un alloggio del fondo immobiliare, anche se avevano espresso la preferenza per il contributo di autonoma sistemazione nel censimento dello scorso agosto.
(Per i curiosi, qui potete trovare la sessione di R utilizzata per produrre i grafici.)
Pretendo i diritti d'autore!
Il primo aprile ho scritto una mail vagamente surreale in mailing list amministrativa di Azzurra, annunciando un improbabile passaggio ad un ircd basato su .NET/WCF.
Beh, sappiate che pretendo i diritti d'autore.
Caro Onorevole Ceroni
Si faccia una cultura, visto che è un po' carente in materia.
17520
Cosa si fa in 17520 ore?
In 17520 ore un cucciolo di gatto diventa adulto.
In 17520 ore una matricola diventa un prossimo laureando.
In 17520 ore si scrivono 5256000 LOC in C (ammettendo di scrivere ininterrottamente 300 LOC/ora).
In 17520 ore nascono e muoiono due generazioni di smartphone.
In 17520 ore (a partire da ora) potrebbe finire completamente la disponibilità di indirizzi IPv4.
In 17520 ore si fanno tante cose. Ma non a L'Aquila.
6 aprile 2009, 17523:32
Nell'eventualità di elezioni anticipate...
... qualcuno nel PDL si sta già preparando al cambio di nome definitivo: Partito Nazionale Fascista.
Lenza, amo, esca e... PESCI!
Visto che su Azzurra non si faceva più un pesce d'aprile come si deve all'utenza da anni, ho deciso di farne uno io ai miei "colleghi" inviando una mail un tantino improbabile in mailing list amministrativa:
Date: Fri, 01 Apr 2011 18:56:55 +0200
From: Matteo 'morph' Panella <...@azzurra.org>
To: <OMISSIS>
Subject: Nuovo software di rete
Salve lista.
Dati i recenti sviluppi e le positive esperienze raccolte sul campo da un'altra
rete irc italiana, ho il piacere di annunciarvi le specifiche tecniche del
nuovo ircd e dei nuovi services.
Il linguaggio scelto è C# e il runtime .NET/Mono (in modo tale da permettere il
ritorno di server basati su Windows e quindi maggiori opportunità di link).
ircd.conf sarà sostituito da un comodo file XML per la configurazione, mentre
per il protocollo server-to-server verrà utilizzato Windows Communication
Framework per non reinventare la ruota e ridurre i tempi di sviluppo.
I services saranno integrati in uno degli ircd e utilizzeranno MongoDB come
backend.
Per quanto riguarda le feature visibili agli utenti, sono in programma le
più richieste, ovvero:
a) protect/owner
b) vhost
c) notifica in caso di whois estesa a tutti gli utenti
d) botserv
Lo sviluppo verrà condotto in maniera totalmente chiusa (per adeguarci al
modello tipico di .NET) fino al completamento della prima release stabile e
alla sua messa in rete. Salvo complicazioni, la data per il deploy del nuovo
stack di rete ed il rilascio dei sorgenti è fissata al 21 dicembre 2012.
Sono sicuro di avere la vostra totale approvazione.
Saluti,
--
Matteo 'morph' Panella
Azzurra IRC Network
"Java is a DSL for converting large XML files into stack traces"
--Someone on Twitter
"Java. Write Once; Hog 80% of CPU Everywhere."
--Merlin Mann
Pesce #1 - Raynk:
[19:07:02] <@rnk> morph, ma avevi già pensato a un ircd da cui partire?
[19:07:17] <@rnk> (in merito alla mail sul nuovo software)
Pesce #2 - CYbER:
[19:31:36] <@CYbER> morph ma è un pesce d'aprile???
[19:32:17] <@CYbER> ma li mortacci tua mi hai fatto prendere un colpo!
Pesce #3 - IRC Operator anonimo (mail privata):
Date: Fri, 1 Apr 2011 19:34:29 +0200
From: <OMISSIS>
To: Matteo 'morph' Panella <...@azzurra.org>
Subject: Re: Nuovo software di rete
mi hai fatto prendere un colpo :P
Che dire? Buon primo aprile, pesciolini :D
Fuck Facebook
To cut a long story short, Facebook admins apparently consider more offensive a photo of a pair of naked boobs than some retarded jerks trolling the victims of the 6.3 earthquake in L'Aquila.
So, fuck them.
Update (2011/04/05): fB finally removed that shit.
Migrate this
After reading a lot of confusing and conflicting statements on the status of OpenVZ in Debian, I finally found out that both linux-vserver *AND* OpenVZ are deprecated and may not even make it for squeeze+1. I can live without linux-vserver since I won't touch that thing with a pole, but OpenVZ has been my choice for container-based virtualization.
The migration path is replacing OpenVZ with virtualization solutions merged with mainline, and it looks really awful:
- Xen: overhead, overhead, overhead. I want a container-based solution, not an hypervisor;
- KVM: same as before, plus my server doesn't support VT-x/SVM;
- LXC: COME THE FUCK ON, the userspace doesn't support squeeze guests on squeeze, it is not even near to production quality and you can't really control memory usage of each container - unless you rebuild a kernel (what??) with memory cgroup enabled, which means a lot of CPU-time overhead for each memory access (WHAT THE FUCK!?!?!?!).
To summarize, my only option would be migrating from a proven and working solution (OpenVZ) to a virtualization system with an incomplete and buggy userspace and with a reduced kernel feature set because it would negatively impact performance on the whole system, only because it is not merged with mainline.
Guess what? If squeeze+1 (or wheezy) dumps OpenVZ, I'll dump Debian - better yet, Linux altogether.
FreeBSD, anyone?
RFC 4226 implementation in Python
Straight from RFC 4226, Appendix C:
import hmac
import hashlib
import struct
# Copyright (C) 2011, Matteo Panella. All rights reserved.
#
# This software is licensed under the same terms as the original
# Java reference code in RFC 4226.
#
# This is a work derived from OATH HOTP Algorithm.
#
# The author makes no representations concerning either
# the merchantability of this software or the suitability of this
# software for any particular purpose.
#
# It is provided "as is" without express or implied warranty
# of any kind and THE AUTHOR EXPRESSLY DISCLAIMS ANY
# WARRANTY OR LIABILITY OF ANY KIND relating to this software.
#
# These notices must be retained in any copies of any part of this
# documentation and/or software.
# Copyright notice for original Java code:
# Copyright (C) 2004, OATH. All rights reserved.
#
# License to copy and use this software is granted provided that it
# is identified as the "OATH HOTP Algorithm" in all material
# mentioning or referencing this software or this function.
#
# License is also granted to make and use derivative works provided
# that such works are identified as
# "derived from OATH HOTP algorithm"
# in all material mentioning or referencing the derived work.
#
# OATH (Open AuTHentication) and its members make no
# representations concerning either the merchantability of this
# software or the suitability of this software for any particular
# purpose.
#
# It is provided "as is" without express or implied warranty
# of any kind and OATH AND ITS MEMBERS EXPRESSaLY DISCLAIMS
# ANY WARRANTY OR LIABILITY OF ANY KIND relating to this software.
#
# These notices must be retained in any copies of any part of this
# documentation and/or software.
__all__ = ['hotp']
# Checksum algorithm defined in RFC4226
_doubleDigits = (0, 2, 4, 6, 8, 1, 3, 5, 7, 9)
def _calcChecksum(num, digits):
doubleDigit = True
total = 0
while digits > 0:
digits -= 1
digit = num % 10
num /= 10
if doubleDigit:
digit = _doubleDigits[digit]
total += digit
doubleDigit = not doubleDigit
result = total % 10
if result > 0:
result = 10 - result
return result
def hotp(secret, movingFactor, codeDigits=6, addChecksum=False, truncationOffset=None):
"""
Perform RFC4226 HOTP generation from given secret (shared secret) and movingFactor.
secret: the shared secret
movingFactor: a counter, current time or other value that changes on a per-use basis (64 bit integer)
codeDigits: number of digits in the OTP, not including the checksum (if any)
addChecksum: True if a checksum digit should be appended to the OTP, False otherwise (default: False)
truncationOffset: the offset into the MAC output to begin truncation. If this value is out of the
range 0 .. 15 or is None, then dynamic truncation will be used.
Returns a numeric string in base 10 (the OTP).
Test vectors (RFC4226, Appendix D):
>>> hotp("12345678901234567890", 0)
'755224'
>>> hotp("12345678901234567890", 1)
'287082'
>>> hotp("12345678901234567890", 2)
'359152'
>>> hotp("12345678901234567890", 3)
'969429'
>>> hotp("12345678901234567890", 4)
'338314'
>>> hotp("12345678901234567890", 5)
'254676'
>>> hotp("12345678901234567890", 6)
'287922'
>>> hotp("12345678901234567890", 7)
'162583'
>>> hotp("12345678901234567890", 8)
'399871'
>>> hotp("12345678901234567890", 9)
'520489'
"""
digits = codeDigits + 1 if addChecksum else codeDigits
movingFactor = struct.pack('!q', movingFactor)
hs = hmac.new(secret, movingFactor, hashlib.sha1).digest()
if truncationOffset is None or truncationOffset < 0 or truncationOffset > 15:
# Perform dynamic truncation (per RFC4226)
# The offset is taken from the lowest 4 bits of hs[19]
truncationOffset = ord(hs[19]) & 0xf
# Starting from the offset, 4 bytes are extracted and converted to an
# unsigned 32 bit integer (big endian) and then masked with 7fffffff
bin_code = struct.unpack('!I', hs[truncationOffset:truncationOffset+4])[0] & 0x7fffffff
# OTP is the value modulo 10^codeDigits
otp = bin_code % 10**codeDigits
if addChecksum:
otp = (otp * 10) + _calcChecksum(otp, codeDigits)
result = '%d' % (otp,)
return '0' * (len(result) - digits) + result
Dear macports gnome-doc-utils maintainers...
variant python25 conflicts python26 python27 description {Use python 2.5} {
depends_lib-append port:python25 port:py25-libxml2
configure.args-append am_cv_python_pythondir=${frameworks_dir}/Python.framework/Versions/2.5/lib/python2.5/site-packages/
configure.python ${prefix}/bin/python2.5
}
variant python26 conflicts python25 python27 description {Use python 2.6} {
depends_lib-append port:python26 port:py26-libxml2
configure.args-append am_cv_python_pythondir=${frameworks_dir}/Python.framework/Versions/2.6/lib/python2.6/site-packages/
configure.python ${prefix}/bin/python2.6
}
variant python27 conflicts python25 python26 description {Use python 2.7} {
depends_lib-append port:python27 port:py27-libxml2
configure.args-append am_cv_python_pythondir=${frameworks_dir}/Python.framework/Versions/2.7/lib/python2.7/site-packages/
configure.python ${prefix}/bin/python2.7
}
if {![variant_isset python25] && ![variant_isset python26]} {
default_variants +python27
}
Is it so fucking difficult?
Happy PI day
$$ \pi = \sum_{k = 0}^{\infty}\frac{1}{16^k} \left(\frac{4}{8k + 1} - \frac{2}{8k + 4} - \frac{1}{8k + 5} - \frac{1}{8k + 6}\right) $$
Happy PI day, everyone!
Insomma...
... s'è dimesso o no?
Debian squeeze: fuckup non documentati
Durante l'aggiornamento da lenny a squeeze, tenete presente quanto segue (e che non è presente nella documentazione):
- quando installate il nuovo kernel fate attenzione ai warning sul firmware, se ve ne spunta uno abilitate subito la sezione
non-free, installate il pacchetto necessario (non è semprefirmware-linux-nonfree) e date un beldpkg-reconfigure linux-image-vostra-versioneper forzare il rebuild di initramfs prima di rebootare; - se usate PostGIS, l'unica maniera sana di mente per migrare da PostgreSQL 8.3 a 8.4 è effettuare un dump e restore dei db, non provate neanche ad usare
pg_upgradeclusterperché non funzionerà; - per default,
mysql-server-5.0verrà sostituito damysql-server-core-5.1che non è sufficiente per far girare il DBMS, quindi alla fine dell'aggiornamento avviate aptitude, selezionatemysql-server-5.1e risolvete tutti i conflitti.




