lundi 15 juillet 2013

Voir les données : longueurs, surfaces, volumes.

Donner à voir des données, des abstractions, n'est pas toujours chose simple. Le passeur est souvent coincé entre l'indigence des grapheurs intégrés aux tableurs, lesquels se limitent grossièrement à des histogrammes et des camemberts, et la virtuosité dont un David McCandless donne un bel exemple, pas encore accessible au vulgus pecum scribouillardis.

Un écran, un bout de papier, donnent pourtant tout un éventail de moyens d'expression simples. Mais peut-être, comme en physique on ne peut comparer des longueurs et des masses, il faudrait s'efforcer de garder alignés le réel et sa représentation graphique. Bon, des exemple peut-être ?

On constate généralement qu'une longueur peut toujours être exprimée par une autre.

Distance réalisée avec 5 litres de carburant, pour une tonne, suivant le mode de transport.



Après, pour des notions plus complexes, ça se corse un peu. La tonne.kilomètre, en multipliant une masse et une distance, exprime le travail nécessaire à un transport quelconque et ainsi compare des réalités aussi différentes qu'un livre d'une livre expédié en express par vol transatlantique et une barge de 1000 t de gravier traversant le Rhône. Ce genre travail devrait pouvoir être exprimé par une surface.

Les transports en France, en 2011, suivant le mode (Ministère du développement durable).

 

Enfin, pour représenter le CO2 craché par divers modes de transport par tonne.kilomètre (tk) transportée, c'est carrément le dilemme. On pourrait dire de cette masse (volume) de gaz émis (après élimination du facteur commun 1/tk) qu'il serait juste de la montrer sous forme de ballons ou de cubes. L'ennui de ce choix, c'est que l'arête des cubes serait proportionnelle à la racine cubique de la valeur, ce qui aurait pour effet d'écraser les rapports entre les valeurs, surtout si on n'a pas les moyens graphiques de donner l'impression de volume. Bref, pour moi, la surface n'est pas à exclure.

Et puis, on parle d'empreinte écologique, non ? Encore une surface.

Bon, promis, la prochaine fois j'essaierai avec des volumes.

 


lundi 1 juillet 2013

1 kWh à vélo

Un kilowatt-heure. L'unité d'énergie de la facture d'électricité. C'est l'énergie dépensée par un appareil d'une puissance de 1 kW pendant une heure de fonctionnement. D'accord mais ça fait combien concrètement ?
Soulever 100 kg d'une hauteur de 3670 mètres, par exemple. En vélo, ça fait un trajet d'environ 110 km en terrain essentiellement plat. En fait, ce trajet demande probablement moins de 1000 watt-heure, et sans doute plus près de 700 Wh.


Agrandir le plan
Combien ça coûte ? Au tarif EDF, c'est moins de 16 centimes d'euro. A combien se montait votre dernière facture ?
Cet exemple donne une idée des quantités d'énergie que nous avons pris l'habitude d'utiliser. Autre exemple, la combustion d'un litre de carburant pétrolier dégage 13 kWh. Une automobile consomme environ 7 litres au 100 km, soit 91 kWh, l'effort collectif d'environ 150 cyclistes sur cette distance.
Quand l'énergie sera rare, il faudra apprendre à suer.

La bonne nouvelle, c'est qu'un vélo est un moyen de transport très efficace. Si on part de l'hypothèse 700 Wh pour 110 km, il faut 636 Wh pour 100 km, énergie contenue dans 0,05 litres de carburant. Avec un litre, on ferait 2000 km. Pas mal, non ?

vendredi 29 mars 2013

La Chine ratisse large

La Chine est la source de balayages sytématiques de ports, une méthode employée pour repérer les machines vulnérables et les utiliser à l'occasion. C'est ce que montre l'analyse des tentatives de connexion sur un serveur ordinaire. La méthode pour tirer cette information de données brutes est expliquée ici.

Mettre en ligne un serveur sur internet et examiner les journaux du pare-feu (le filtre qui arrête les connexions indésirables) procure un certain plaisir, une forme d'émerveillement qui tiendrait de l'excitation du chercheur penché sur sa boîte de Pétri. On y voit un bouillonnement fait des bavardages de machines mal configurées, d'erreurs diverses et d'attaques automatiques lancées par des armées de machines zombies ou des bots d'info-guerre.
La difficulté est de faire parler ces données et d'en extraire une information moins brute que les millions de signes qui la composent.

Feb 21 10:41:33 errai ipmon[145]: 10:41:33.330374 sn0 @0:2 b 125-224-200-153.dynamic.hinet.net[125.224.200.153],ftrapid-1 -> errai.mentrek.org[192.168.0.5],http-alt PR tcp len 20 48 -S IN
Feb 21 10:53:33 errai ipmon[145]: 10:53:32.381675 sn0 @0:2 b teamtv.ser.netvision.net.il[212.143.105.84],mdtp -> errai.mentrek.org[192.168.0.5],ms-wbt-server PR tcp len 20 48 -S IN
Feb 21 10:53:35 errai ipmon[145]: 10:53:35.418402 sn0 @0:2 b teamtv.ser.netvision.net.il[212.143.105.84],mdtp -> errai.mentrek.org[192.168.0.5],ms-wbt-server PR tcp len 20 48 -S IN
Feb 21 11:39:26 errai ipmon[145]: 11:39:26.163474 sn0 @0:2 b 193.142.62.156,60479 -> errai.mentrek.org[192.168.0.5],https PR tcp len 20 40 -S IN
...


Pour ce faire, on va recourir dans un premier temps à la ligne de commande Unix qui offre une palette d'outils de manipulation de texte ainsi qu'un langage de programmation élaboré mais accessible. Le but de cette étape sera d'élaguer le texte du journal et de créer un tableau contenant les élements suivants: la date et l'heure, l'IP d'origine, le port de destination.

Un premier élagage du fichier brut est réalisé avec la commande unix "cut".

cut -d " " -f1-3,10,14 donnees_brutes.txt |  unexpand -a - > fichier2

L'option -d " " signifie que l'espace est le caractère délimiteur et -f indique les colonnes que l'on veut extraire, désignées par leur numéro d'ordre ou par intervalle. Ici, on a les colonnes de 1 à 3, la 10ème et la 14 ème. Le résultat est chaîné avec la commande unexpand qui substitue tous les espaces du fichier par des tabulations. Le résultat est envoyé vers un nouveau fichier, avec l'opérateur >.

On nettoie ensuite le nouveau texte des divers motifs indésirables. Dans notre cas, on va effacer les adresses IP entre crochets qui suivent les noms de domaine, en passant le fichier à la moulinette des expressions rationnelles.

cat fichier2 | sed 's/\[.*\]//' > fichier3

La raison est que l'on souhaite passer les noms de domaines à la commande geoiplookup, qui renvoie le pays d'origine. La ligne suivant extrait l'information "nom de domaine", l'envoie à geoiplookup et passe le résultat à paste qui assemble les informations dans un nouveau fichier.

for i in `cut fichier3 -f2` ; do geoiplookup $i | head -n 1 ; done | paste - fichier3 > fichier4

Le résultat est un beau texte avec des champs biens séparés par des tabulations, prêt à être importé dans un tableur. Dans Gnumeric, on peut finir de mettre en forme ce tableau, notamment avec les tris.
Pour faire apparaître d'où viennent les tentatives de connexion, on crée un graphique à partir des colonnes des pays et du nombre de connexions.

Le camenbert fait apparaître que les deux tiers du trafic non désiré proviennent de quatre pays : Chine, France, Fédération de Russie, Etats-Unis. On a, presque au complet, le conseil permanent de sécurité des Nations-Unies. Les autres sont extrêmement discrets, y compris des pays peuplés et riches comme l'Allemagne ou le Royaume-Uni.
La carte obtenue avec Google Fusion Tables souligne cette concentration de l'origine du trafic tandis que les autres sources sont assez également réparties dans le monde. Comme l'échantillon est assez faible, certains pays ne sont pas représentés.
De retour dans Gnumeric, on peut créer une autre table de fréquences pour les ports.
 Ce bagel coloré montre l'importance des connexions sur le port 445 (microsoft-ds). Elles proviennent sans doute de machines Windows mal configurées ou infectées par des vers essayant de se propager.
Telnet est un ancien protocole d'accès distant sur des machines Unix. Il a été le plus souvent remplacé par SSH, en général beaucoup plus sûr, et ne devrait pas montrer autant d'activité. Peut-être que des pirates comptent sur le fait qu'il a été installé par mégarde ou oublié sur un vieux serveur.
MS-wbt-server est le port tcp 3389, porte d'entrée pour le service d'accès à distance sur Windows (Terminal Server). Des failles permettant un accès non autorisé sont régulièrement constatées. Les pirates cherchent les machines où Terminal Server n'a pas été mis à jour.
VNC-Server est un logiciel équivalent qui fonctionne sur Windows et Linux.
Epmap est un autre service lié à Windows.
MS-Sql ou MySQL sont des serveurs de bases de données où l'on recense régulièrement des vulnérabilités à des attaques dites d'injection SQL, lesquelles ouvrent souvent un accès total à la machine.
Les ports indiqués par des numéros ne sont pas alloués à un service particulier. Ils peuvent être utilisés par n'importe quel logiciel ou peut-être des botnets.

Enfin, il est intéressant de rechercher quel pays émet quoi. Avec Gnuméric, on réalise une table de fréquences qui donne le nombre d'attaques d'un type donné attribuable à chaque pays.
Le résultat est assez intéressant.
Chaque pays présente comme une signature. De France viennent des tentatives de connexions presque exclusivement concentrées sur le protocole CIFS de partage de fichiers Windows. C'est la grand pointe qui domine toutes les autres. A voir les logs, il s'agit de particuliers abonnés à Free. Sans doute des machines Windows infectées par un ver.
De la Fédération de Russie (souvent d'Ukraine en fait), on a un trafic important sur les ports élevés, peut-être utilisés par des botnets.
Les USA envoient beaucoup d'attaques sur Windows (epmap, microsoft-ds) et sip, un protocole d'établissement de connexions de voix sur IP.
Quant à la Chine, elle ratisse large. Les tentatives de connexion nombreuses visent la plupart des ports de l'intervalle de façon assez égale. Ca ressemble beaucoup à un balayage systématique de ports, pour repérer des machines vulnérables. Impression corroborée par le fait que de nombreuses tentatives proviennent de la même adresse IP (58.218.199.250) avec le port source 12200.
Pour un cracker, même un PC de particulier est intéressant dès lors qu'il lui fournit une plate-forme d'observation et de lancement de nouvelles attaques.

dimanche 10 février 2013

Fullsitebackup for Drupal, enhanced

Lately, I wrote a short script to help backup a Drupal site I'm in charge. It worked reliably for some times now and may be useful for someone else. I derived it from Fullsitebackup.sh, an example script provided in the drupal documentation and created by BristolGuy.
The new script is splitted in two. The first part works on the drupal sever. It dumps the MySQL database and makes a tarball of it, along the site's files. If all goes right, it erases the archive X days old, X being an integer of your choice. This is just what the original Fullsitebackup.sh does, plus a few lines to ensure that the disk quota on the server isn't reached too quickly.

The first script.
#!/bin/bash
# Database connection information
dbname="dbname"             # (e.g.: dbname=drupaldb)
dbhost="dbhost"      # Usually not localhost
dbuser="dbuser"             # (e.g.: dbuser=drupaluser)
dbpw="dbpasswd"             # (e.g.: dbuser password)

# Website Files

webrootdir="/path/to/web/root/"  # (e.g.: webrootdir=/home/user/public_html)

# Variables

# Default TAR Output File Base Name
tarnamebase=sitebackup-
datestamp=`date +'%m-%d-%Y'`
trashafter="6 day" # a number of days or weeks you like after which you want an archive to be trashed
timelimit=`date -d "-$trashafter" +'%m-%d-%Y'`
tartobeswept=$tarnamebase$timelimit.tgz
# Execution directory (script start point)
startdir="/path/to/backup/dir"
cd $startdir
logfile=$startdir"/logsite.log"     # file path and name of log file to use
# Temporary Directory
tempdir=$datestamp
# Input Parameter Check
if test "$1" = ""
 then
 tarname=$tarnamebase$datestamp.tgz
 else
 tarname=$1
fi
# Begin logging
echo "Beginning drupal site backup using fullsitebackup.sh ..." >> $logfile
# Create temporary working directory
echo "   Creating temp working dir ..." >> $logfile
mkdir $tempdir
# TAR website files
echo "TARing website files into $webrootdir ..." >> $logfile
cd $webrootdir
tar cf $startdir/$tempdir/filecontent.tar .
# sqldump database information
echo "   Dumping drupal database, using ..." >> $logfile
echo "      user:$dbuser; database:$dbname host:$dbhost " >> $logfile
cd $startdir/$tempdir
mysqldump --user=$dbuser --password=$dbpw --host=$dbhost --add-drop-table $dbname > dbcontent.sql 2>>$logfile
if [ $? -ne 0 ] ; then
 echo "Echec du dump de $dbname. " > $logfile
 exit 1
fi
# Create final backup file
echo "Creating final compressed (tgz) TAR file: $tarname ..." >> $logfile
tar czf $startdir/$tarname filecontent.tar dbcontent.sql 1>>$logfile 2>&1
if [ $? -ne 0 ] ; then
 endtime=`date`
 echo "Echec de l'archivage $endtime de $tarname. " >> $logfile
 exit 1
else
 echo "Archivage effectue $endtime de $tarname. " >> $logfile
 if [ -e $startdir/$tartobeswept ] ; then
  chmod 600 $startdir/$tartobeswept 
  rm $startdir/$tartobeswept 1>> $logfile 2>&1 ; echo "Purge de $tartobeswept effectue $endtime " >> $logfile
 fi
fi
# Reduction des droits
echo " archive en lecture seule " >> $logfile
chmod 400 $startdir/$tarname
# Nettoyage
echo "   Removing temp dir $tempdir ..." >> $logfile
cd $startdir
rm -r $tempdir
# The End
endtime=`date`
echo "Backup completed $endtime, TAR file at $tarname. " >> $logfile
##
##
Obviously, read and execute rights only for the owner of this file are enough. Here you may object that, if the web server is compromised or fails completely, you loose all the hard work, as the backup sits on the server itself. You would be right.
Hence a second script, that duplicates the freshly created archive onto a distant machine, where it is installed. For this one script to work, you need an ssh account on the web server and to add in its ~/.ssh/authorized_keys file the public ssh key of your account on the local machine. Thus, the ssh transfer script won't have any account password in it, a potential security issue. It keeps the Y last days/weeks/months.

#!/bin/sh

# Variables

tarnamebase=sitebackup- # prefix of tarballs
datestamp=`date +'%m-%d-%Y'`
backupdir="backupdir_path_on_web_server"  # where backups are found on distant server
localdir="/path/to/local/backup/dir"  # where they are copied on local machine
sshhost="hostname"
sshuser="username"
keepitem="n"  # n - an integer - being the number of daily/weekly/monthly archives kept
logfile=$localdir"/logfilename.log"
weeklybackupdir="$localdir/semaine"  # semaine is french for "week" (create that directory !)
monthlybackupdir="$localdir/mois"  # mois is french for "month" (create that directory !)

admin="webmaster@yourdomain.tld"

# Input Parameter Check

if test "$1" = ""
then
 tarname=$tarnamebase$datestamp.tgz
else
 tarname=$1
fi

# Secure copy from the server
# A public key of the host must be present in the authorized keys file on the server side

cd $localdir
scp $sshuser"@"$sshhost:$backupdir/$tarname $localdir/$tarname 1> $logfile 2>&1

# If previous operation fails, the script doesn't touch older backups

if [ $? -ne 0 ] ; then
 endtime=`date`
 echo "Echec du transfert $endtime de $tarname. Fin du script. " >> $logfile
else
 endtime=`date`
 echo "Transfert effectué $endtime de $tarname. " >> $logfile

# Else, it looks if the count of past backups is greater than a defined number
# In case of which it copies the oldest as a monthly backup if the day of the month is 1
# And trims the monthly backups to a number specified in a variable

 if [ `ls -1t $tarnamebase* | wc -l` -gt $keepitem ] ; then
  if [ `date +%d` = "01" ] ; then
   cp `ls -1t $tarnamebase* | tail -n 1` $monthlybackupdir 1>> $logfile 2>&1
   cd $monthlybackupdir
   while [ `ls -1t $tarnamebase* | wc -l` -gt $keepitem ] ; do
    chmod 600 `ls -1t $tarnamebase* | tail -n 1`
    rm `ls -1t $tarnamebase* | tail -n 1` 1>> $logfile 2>&1
   done
   cd $localdir
  else

# Or, if the day is wednesday, copies the oldest as a weekly backup 
# and does some cleanup in the weekly backup directory

   if [ `date +%u` = "5" ] ; then
    cp `ls -1t $tarnamebase* | tail -n 1` $weeklybackupdir 1>> $logfile 2>&1
    cd $weeklybackupdir
    while [ `ls -1t $tarnamebase* | wc -l` -gt $keepitem ] ; do
     chmod 600 `ls -1t $tarnamebase* | tail -n 1`
     rm `ls -1t $tarnamebase* | tail -n 1` 1>> $logfile 2>&1
    done
   cd $localdir
   fi
  fi
# In any case, it makes sure there are only the defined number of daily backups left

  while [ `ls -1t $tarnamebase* | wc -l` -gt $keepitem ] ; do
  chmod 600 `ls -1t $tarnamebase* | tail -n 1`
  rm `ls -1t $tarnamebase* | tail -n 1` 1>> $logfile 2>&1
  done
 fi
fi

# Reports home what went wrong

mail -s "logfile" $admin < $logfile

exit 0
These scripts need to be executed at a fixed interval you will specify in the crontab (crontab -e). From my experience, they work reasonably well with different shells (sh, ksh and bash), different systems (Debian, NetBSD) and on different hardware architectures (MacPPC64, Mac68k, x86_64). Anyway, hardware shouldn't be of any concern with a high level langage.

mardi 21 août 2012

Améliorer l'ergonomie de GNOME 3

Depuis la sortie de la version 3 de GNOME, le débat sur la direction prise par ce projet d'interface graphique propre à divers systèmes libres, dont Linux, continue de faire rage. Les leaders du projet poussent dans le sens d'une simplification allant jusqu'au dépouillement et laissent à leurs détracteurs l'impression qu'il ne doit subsister qu'une seule manière d'accomplir une tâche donnée. C'est le principe informaticien d'orthogonalité, très prisé lorsqu'il est appliqué aux jeux d'instructions de processeurs, idéal rarement atteint.

Les raisons du comité de direction de GNOME sont parfaitement louables. L'interface doit être adaptée aux populaires terminaux mobiles, pilotés au doigt et dont les écrans sont de petite taille. Cette voie vers l'essentiel rejoint des aspirations plus anciennes du projet, toucher un public plus large que les hackers et les libristes convaincus, aller sur le bureau - les tablettes - des cols blancs et pourquoi pas du grand public.

Sur GNOME 3, ça se traduit entre autres par la disparition du bureau et de ses icônes en vrac, un menu d'accès aux applications qui occupe toute la surface de l'écran (Voir l'interface Modern UI sur Windows 8). Cet environnement quasi cistercien, le Gnome-shell, hérisse les amateurs du baroque GNOME 2 qui, avec ses options, panneaux et menus en tous sens, est pour le coup une antithèse du principe d'orthogonalité. Mais je leur donnerais raison sur un point : la bascule entre applications sur GNOME 3 est disons perfectible.

Pour lancer une application ou basculer vers un programme en cours, on passe en un clic (ou un doigt) par le mode Activités. Les fenêtres ouvertes sont exposées au centre de l'écran, un dock (appelé Dash) rassemble les icônes des programmes favoris et en cours d'exécution à gauche, les bureaux virtuels sont à droite. Ensuite, on clique sur le programme désiré. La bascule entre programmes comprend donc deux étapes :

1) Bascule vers le mode Activités
2) Choix de l'appli à lancer/amener à l'avant-plan à l'aide du dock ou des fenêtres mises à plat.

Sur un petit écran, c'est une bonne solution. Mais sur un poste de travail, c'est une opération de trop. Sur Mac OS ou Windows 7, le dock permet de lancer/basculer les applications courantes d'un clic sans quitter au préalable la fenêtre active. Pour retrouver ce comportement logique et familier, il suffirait que le dock de GNOME 3 soit visible en permanence et peut-être aussi puisse être adapté à la taille de l'écran. Sortir le Dash du mode Activité où il est enterré.

Et bien, c'est possible grâce à une extension officielle, Dash-to-Dock. Dash a les mêmes fonctions que ses homologues sur Mac ou Windows, un lanceur doublé d'une barre de tâches. Sa disposition verticale tire mieux parti des écrans de PC au format large qui sont devenus majoritaires. Avec Gnome-shell-extension-pref, on règle la taille, le comportement et l'apparence de Dash.

Le mécanisme d'extensions du bureau est un trait unique de l'environnement GNOME. Il permettra sans doute de l'adapter aux exigences les plus diverses.

samedi 16 juin 2012

Miroir à renversement de temps



Un miroir à renversement de temps est un dispositif qui réfléchit une onde (acoustique ou lumineuse) tout en gardant sa direction incidente et sa forme. C'est un renversement total, spatial et temporel. L'onde est focalisée vers sa source, comme le montrerait un film passé à l'envers.
Je ne sais pas quelle image un appareil photo saisirait de ce miroir. Ce qu'on voit ici n'est pas une image de la rue une heure avant le cliché ni une image du photographe plus jeune. Juste une armoire "Miroir à retournement temporel" vue à travers une vitre renvoyant l'image d'un reflet du ciel.