lunedì 31 gennaio 2011

Virtualizzazione

Il primo articolo scritto in italiano il cui tema sia la virtualizzazione che merita di essere citato: Emulazione e Virtualizzazione.

domenica 30 gennaio 2011

Italiani vs Tedeschi (... nei comportamenti sociali)

Un post che mi e' piaciuto molto, post che propone principalmente un'analisi emozionale/comportamentale/... differenziale tra italiani e tedeschi.
Qui il link.

sabato 29 gennaio 2011

Uccidere... premia

Chi uccide un uomo e' un assassino.
Chi ne uccide migliaia, un conquistatore.
Chi li uccide tutti, un Dio.
    Edmond Rostand

Nota: Dexter e' un mito :-)

venerdì 28 gennaio 2011

Bufala sugli interpreti (2)

Questa e' la seconda puntata sugli interpreti. Qui la prima.
Ci siamo lasciati con un po' di teoria, quindi ora passiamo ad un piccolo test.
Ho scelto di scrivere uno stesso script con diversi linguaggi di programmazione. Ho scelto C, C++, Perl, PHP, Python.

script C (hello.c)

#include <stdio.h>
main() {
  int j,i;
  j=10000000;
  while (j>0) {
    printf ("Hello world! $j\n");
    j = j-1;
  }
}
compilato tramite gcc hello.c -o hello_c.o

script C++ (hello.cpp)

#include <iostream>
int main() {
  int j,i;
  j=10000000;
  while (j>0) {
    std::cout << "Hello world! " << j << std::endl;
    j = j-1;
  }
  return 0;
}
compilato tramite g++ hello.cpp -o hello_cpp.o

script Perl (hello.pl)

$j=10_000_000;
while ($j>0) {
    print "Hello world! $j\n";
    $j -= 1;
}

script PHP (hello.php)

<?php
$j=10000000;
while ($j>0) {
    print "Hello world! $j\n";
    $j -= 1;
}
?>

script Python (hello.py - no bytecode)
j=10000000
while j>0:
    print 'Hello world! ', j;
    j = j-1;
script Python (hello.pyc - bytecode)
import py_compile
py_compile.compile("hello.py")
Produce il byte code dello script precedente.

Tempi di esecuzione
Di seguito sono riassunti i tempi di esecuzione:
C -> time ./hello_c.o > /dev/null
real 0m0.818s
C++ -> time ./hello_cpp.o > /dev/null
real 0m5.885s
Perl -> time perl hello.pl > /dev/null
real 0m4.311s
PHP -> time php hello.php > /dev/null
real 0m10.390s
Python (no bc) -> time python hello.py > /dev/null
real 0m13.282s
Python (bc) -> time python hello.pyc > /dev/null
real 0m13.533s
Note:
Ovviamente questo e' soltanto un benchmark grossolano. Consiglio di non ritenerlo esaustivo, solo indicativo.

giovedì 27 gennaio 2011

Voto Fiat a Mirafiori

Post che fornisce una lettura interessante sul voto e la vittoria dei si' a Mirafiori. Qui il link.

mercoledì 26 gennaio 2011

Bufala sugli interpreti (1)

Se chiediamo  al 99% degli operatori IT la differenza tra compilatori ed interpreti, l'accento sara' sicuramente sulla differenza prestazionale.
Ancora oggi sento (e leggo) che c'e' un fattore 10 nei tempi di esecuzione a favore dei compilati.

Purtroppo (anzi, fortunatamente) e' una bufala.

L'interpretazione preistorica funzionava in questo modo:
traduzione linea di codice
esecuzione linea
traduzione linea di codice
esecuzione linea
...
Nei compilati, invece, l'esecuzione puo' procedere senza interruzioni da parte di traduzioni:
esecuzione linea
esecuzione linea
...
poiche' la fase di traduzione e' effettuata (manualmente) prima dell'esecuzione.

In quell'era informatica, la differenza prestazionale nell'esecuzione tra i compilati e gli interpretati era notevole.

Ma poi i tempi sono cambiati!!

Successivamente, si sono fatti passi avanti dal punto di vista prestazionale nei meccanismi degli interpreti. Sintetizzando al massimo, una delle tecniche prevede la produzione di bytecode, il quale puo' essere direttamente eseguito. Dal punto di vista schematico, il processo e' simile ai linguaggi compilati, quindi in questo caso lo script e' tradotto con produzione di bytecode (una volta), ed esecuzione del bytecode (quante volte si vuole).

Lo stato dell'arte e' la just-in-time compilation, anche conosciuta come dynamic translation, che consiste in un approccio ibrido, idealmente suddivisa in 3 step:
  • traduzione continua;
  • riempimento di una cache con il tradotto;
  • esecuzione del tradotto.
La degradazione della performance e' fortemente ridotta poiche' il processo di traduzione produce continuamente del codice che e' inserito in un buffer, e questo a sua volta permette un processo continuo di esecuzione.
Esistono altre varianti, in particolare cito il pre-compiling. Tale tecnica dell'interprete prevede a run-time:
  • il processo di compilazione del sorgente (in memoria);
  • al termine dello step precedente, l'esecuzione del compilato.
Alla prossima puntata per qualche esempio comparativo.

martedì 25 gennaio 2011

Grafici con RRD

Questi giorni sto lavorando massicciamente con il tool RRD. Per chi non lo conoscesse, qui la pagina di presentazione, e qui una galleria.

venerdì 21 gennaio 2011

Syslog Messages to MySQL

Nello staff in cui lavoro attualmente gestiamo i messaggi di log di diversi server centralizzandoli su un logserver. Quest'ultino scrive tramite rsyslogd diverse decine di file al giorno, ma un domani si potrebbe sperimentare la scrittura su database via MySQL[1].
Link:  Writing Syslog Messages to MySQL with rsyslogd, Why does world need another syslogd?


Note:
[1] -> in realta' era gia' stata sperimentata, ma democraticamente lo staff ha preferito vie piu' tradizionali. Chissa' se domani la scelta non cambiera'...

mercoledì 19 gennaio 2011

L’interferenza di elettroni singoli

Una simpatica spiegazione del fenomeno dell'interferenza di elettroni singoli.


Per curiosita', il fenomento fu teorizzato nel 1925, realizzato nel 1976 da 3 fisici bolognesi, e nel 2002 e' stato votato tramite sondaggio come l'esperimento piu' bello della fisica dalla rivista internazionale Physics World.

lunedì 17 gennaio 2011

Raid 1 vs LVM mirror

Solitamente (cioe' sempre, escludendo un momentaneo memory leak) configuro i server di backup con uno strato di raid software[1] e uno strato lvm.
Il primo mi mette al sicuro da eventuali corruzioni hardware, il secondo mi e' utilissimo per gli snapshot.

La domanda e': posso condensare sia il mirroring sia gli snapshot tramite un unico strato?

La risposta e' ni (o so, fate voi).

Si' perche' tramite LVM e' possibile creare volumi logici con mirroring.
No perche' non si e' piu' salvaguardati da eventuali crash hardware.

In prima approssimazione, se condensiamo tutto nello strato LVM demandiamo all'LVM la replicazione dei dati, che avverranno nei modi scelti dalla tecnolgia stessa. Cio' implichera' un vantaggio prestazionale, ma la replicazione non sincrona (quindi eventualmente posticipata) implichera' la non affidabilita' del mirroring.
Da questo link, trovo interessante il seguente commento:

LVM mirrors are for replication of a logical volume to a different physical volume. It's essentially meant to "move the data to a different disk". The mirror is then broken and the old location of the data freed for use; the existing data is utilized at the new location instead.
RAID mirrors are for providing a safeguard against single-drive hardware failures. It's essentially meant to "keep your data from being lost if a disk dies".
Per essere piu' precisi, si dovrebbe introdurre il concetto di barriers, ben presentato a questo link.
Ancora dall'url precedente:
Barriers are a kernel techniue to try and improve the chances of data getting to disk. Up until 2.6.29 LVMs ignored them. Now LVM honours barriers (if and only if you have a linear target and a new enough kernel) so if you want the flexibility of LVM and barrier support your best bet is barrier-on-md RAID
Quindi anche LVM onorera' il mirroring (dai kernel successivi al 2.6.29), se il barrier e' impostato (si veda qui).

Note:
[1] -> se fosse disponibile il raid hardware... non avrebbe senso questo post

martedì 11 gennaio 2011

Il gatto di Schrodinger

Molti sanno che fine abbia fatto il gatto di Schrodinger. Per chi non lo sapesse, questa immagine e' molto esplicativa.

lunedì 10 gennaio 2011

Url shortener

Per coloro che non li conoscessero, questi semplici strumenti permettono di inserire una url e restituirne una seconda che e' un redirect alla prima.
L'utilita' e' maggiore quanto piu' lunga e' la url inserita, essendo quella restituita molto breve. Ad oggi, conosco tre servizi[1] di questo tipo:
Personalmente li utilizzo principalmente per inserire url brevi nelle email.


Note:
[1] -> in realta' il servizio offerto da google e' una new entry

domenica 9 gennaio 2011

Borderline man

Un post che mi piace parecchio, particolarmente per due frasi che condivido pienamente. Di seguito le cito:

Che cosa insegna questa cosa? Insegna che quando un sistema diventa irriformabile, ovvero quando il riformismo diventa cosi' conservativo verso le parti da non far cambiare mai nulla, l'unica mossa davvero vincente e' quella distruttiva. Inoltre, insegna che tali mosse arrivano dalle figure "borderline" del sistema, quelle cioe' che non dipendono (come Marchionne per l'industria o Cossiga per il consenso partitico) piu' dal sistema di relazioni politiche esistenti, ma sono ancora abbastanza addentro al sistema da poterlo colpire con le proprie azioni.
e
Un tempo si diceva "addaveni' er baffone" per indicare questo genere di eventi, cioe' qualcuno che da fuori del sistema ne distrugga delle parti. Mano a mano che il mondo si globalizza, cresceranno sempre di piu' le figure capaci di fare quello che ha fatto Marchionne, potendo colpire senza venire colpite, essendo dentro al sistema abbastanza da distruggerlo ma non abbastanza da temere rappresaglie. In una guerra di posizione, i cecchini si divertono un sacco.

Solitamente non riporto frasi cosi' lunghe inserendo solo link ai post... ma queste le ho riportate perche' meritano veramente

sabato 8 gennaio 2011

Non perdere l'occasione...

Non c'e' mai una seconda occasione
per fare una buona impressione
la prima volta.
    Anonimo

mercoledì 5 gennaio 2011

Come contattarmi

Se a qualcuno viene in mente di contattarmi, spero ne abbia fondata volonta'.
Comunque vi segnalo i link come da oggetto: Obfuscated Code e Codici a barre.

Politica

La politica e' l'abilita' di prevedere in anticipo
cosa accadra' domani, la settimana prossima,
il prossimo mese e il prossimo anno [...]
e comprende anche la capacita' di spiegare,
a posteriori, perche' tutto cio' che era stato
previsto non e' accaduto.
    Winston Churchill

martedì 4 gennaio 2011

lunedì 3 gennaio 2011

Codici a barre

Tutti conosciamo i codici a barre. Ad esempio, l'immagine seguente


riporta la scritta Wikipedia sia in maniera alfabetica, sia tramite codice a barre[1].

Di recente e' stata rilasciata l'evoluzione del codice a barre, il codice QR, il quale aggiunge una dimensione all'ordinario codice a barre, passando quindi da una a due dimensioni. Un esempio e':
il quale riporta il mio indirizzo email.
Per approfondimenti, ecco il link della wikipedia sul Codice QR e un  esempio di applicazione su un cartello stradale.

Inoltre i link di alcuni generatori, uno per il classico monodimensionale  e due per quelli bidimensionali: QR_1 e QR_2.


Note:
[1] -> per generare tale codice a barre e' stata utilizzata la codifica Code-128