GpxPlot : premier aperçu

GpxPlot est un petit logiciel pour:

  • afficher des traces GPS en 3D (à partir d’un fichier .gpx)
  • les éditer (couper une liaison, supprimer un point, déplacer un point, fusionner des traces, voir et modifier des waypoints…)
  • Afficher un modèle numérique de terrain
  • afficher des photos satellite/aériennes plaquées sur le terrain 3D
  • afficher des données vectorielles OpenStreetMap mappées sur la surface 3D (et peut-etre des tuiles de type Mapnik)

GpxPlot est la continuation de mon exploration des données OSM et SRTM avec python.

GpxPlot-2014-09-21GpxPlot-2014-09-21b

C’est une image du Mont Rachais en 3D, avec :

  • la surface 3D issue de SRTM
  • Une photo satellite/aérienne (Bing Maps) plaquée sur cette surface, mais plus large. L’altitude 0 en dehors de la surface SRTM explique la « falaise » visible tout autour de la surface 3D. Un bug provoque un décalage de la photo par rapport aux autres données (voir le tracé de l’Isère qui croise les routes à gauche)
  • En rouge, un tracé GPX correspondant à une randonnée
  • Les autres traces sont des chemins et routes issues d’OpenStreetMap

Les choix techniques utilisés ne sont pas stables (affichage 3D complexe, un peu lent…) :

Python, PyQt4 pour l’interface, Mayavi Mlab pour l’affichage 3D, gpxpy pour la lecture des GPX, l’API OpenStreetMap Python, l’API Bing Maps, les données SRTM

J’espère que j’aurai un peu de temps pour développer ceci, et y ajouter les données ouvertes issues du groupe GreLibre pour Grenoble et sa région (orthophotos, modèles de terrain plus précis…)

Publié dans Divers | Laisser un commentaire

Sciences en Marche

Le mouvement Sciences en marche est parti !

Voici la carte finale pour le trajet en vélo Grenoble-Lyon samedi 4 octobre:

Voir en plein écran

Publié dans Politique & société | Laisser un commentaire

Drobo après une coupure de courant : statut 98304

Après une coupure de courant au cours du week-end, les deux Drobo FS au boulot ont redémarré quand le courant est revenu (21 heures plus tard). Par contre, les dossiers partagés amba/windows n’étaient pas accessibles.

Quand j’ai essayé mon script droboStatus, tout était affiché normalement, mis à part une ligne :

Overall status of the device 98304 = 11000000000000000b -> UNKNOWN STATUS – please see http://code.google.com/p/drobowebdashboard/wiki/ESATMUpdate#ESATMUpdate/mStatus

Comme la page en lien ne donne pas de réponse pour ce code, il semble que le status 98304 correspond à un état où tout fonctionne bien mais où les partages de fichier sont désactivés après uné vérification du disque (fsck).

Un simple redémarrage des drobos à l’aide du bouton arrière a suffit à revenir à un fonctionnement normal.

Publié dans Notes Info | Laisser un commentaire

IRM de noix de coco

Au cours de la construction d’un modèle de tête pout l’IRM, j’ai fait des essais avec des noix de coco.

Voici quelques images produites avec BrainVisa/Anatomist des acquisitions d’une noix de coco à moitié pleine de liquide.

coco1-c coco2-c coco3-c coco4-c coco5-c

Publié dans Divers | 2 commentaires

WordPress ne détecte pas les mises à jour derrière un proxy

WordPress est utilisé pour un petit site web de mon boulot. Le serveur web qui l’héberge doit utiliser un proxy pour accéder au web, ce qui est nécessaire pour certains plugins et pour les mises à jour.

Le proxy est déclaré (comme spécifié dans la documentation) dans le fichier wp-config.php

define('WP_PROXY_HOST', 'myCache.fr');
define('WP_PROXY_PORT', '3128');

Depuis la version 3.8.1, le tableau de bord n’affiche aucune mise à jour disponible, alors que la version 3.9.1 est sortie. Idem pour les plugins. Aucun message d’erreur n’est affiché, y compris en forçant la vérification des mises à jour, et en activant les messages de debug de WordPress.
J’ai dû utiliser wireshark pour comprendre ce qu’il se passe :

  1. WordPress envoit une requête POST vers https://api.wordpress.org/plugins/info/1.0
  2. Le serveur proxy Squid répond avec une erreur 501 : « Unsupported Request Method and Protocol »

Il semble que le proxy ne supporte pas les requêtes POST en https. J’ai donc recherché où était définie l’URL https dans le code de WordPress. Elle se trouve dans wp-includes/update.php. Mais les URLs sont définies en http, et le code suivant transforme le protocole en https si ssl est disponible (à trois endroits différents):

if ( $ssl = wp_http_supports( array( 'ssl' ) ) )
                $url = set_url_scheme( $url, 'https' );

J’ai donc commenté ces lignes :

/**if ( $ssl = wp_http_supports( array( 'ssl' ) ) )
 $url = set_url_scheme( $url, 'https' );*/

La mise à jour a été détectée et elle s’est installée correctement. Bien sûr, je vais devoir refaire cette modification après chaque mise à jour…

Publié dans Notes Info | 3 commentaires

Disque dur mourant : récupérer mes données (GNU/Linux)

I y a 5 ans j’ai sauvegardé mes données vers 3 disques durs externes. Quand mon PC fixe est mort, j’ai utilisé un petit portable sur lequel je ne pouvais pas copier le Téraoctet de données de mes sauvegardes.

La semaine dernière, j’ai essayé de récupérer les données du portable et les anciennes sauvegardes sur un nouveau PC.
Sur les 3 disques de sauvegarde, un était complètement mort (il ne tourne plus quand on le branche), le second fonctionnait mais ne contenait qu’une sauvegarde partielle (disque plus petit que les autres), et le dernier n’était apparemment pas lisible.

Au branchement du disque, ‘dmesg’ affiche des dizaines d’erreurs de lecture, et Linux ne détecte aucune partition sur le disque. J’ai cru avoir perdu 1To de données…

Puis j’ai trouvé ça, ça et ça.

Et voilà comment j’ai presque tout récupéré :

  1. Brancher le disque mourant (/dev/sdi)
  2. Dans dmesg, il y avait des centaines de lignes comme ceci :
    [200135.764454] Buffer I/O error on device sdi, logical block 9464
    [200160.490454] sd 9:0:0:0: [sdi] Unhandled sense code
    [200160.490457] sd 9:0:0:0: [sdi]  
    [200160.490458] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
    [200160.490460] sd 9:0:0:0: [sdi]  
    [200160.490461] Sense Key : Medium Error [current] 
    [200160.490463] sd 9:0:0:0: [sdi]  
    [200160.490465] Add. Sense: Data phase error
    [200160.490466] sd 9:0:0:0: [sdi] CDB: 
    [200160.490467] Read(10): 28 00 00 01 27 c0 00 00 08 00
    [200160.490472] end_request: I/O error, dev sdi, sector 75712
  3. Faire une image du disque, en ignorant les erreurs de lecture (remplacées par des 0 dans le fichier). Ceci a pris 5 jours pour le disque de 1To.
    sudo dd if=/dev/sdi of=/home/myself/backupdisk.bin conv=noerror,sync
  4. Réparer la table de partition en utilisant testdisk (sudo apt-get install testdisk)
    I a trouvé une partition Linux (Ext3fs) remplissant l’image de disque, a proposé de réécrire la table de partition et a sauvé le résultat.

    testdisk /home/myself/backupdisk.bin
  5. Afficher la table de partition de l’image du disque
    sudo fdisk -lu /home/myself/backupdisk.bin
    Disk /home/myself/backupdisk.bin: 1000.2 GB, 1000204886016 bytes
    255 têtes, 63 secteurs/piste, 121601 cylindres, total 1953525168 secteurs
    Unités = secteurs de 1 * 512 = 512 octets
    Taille de secteur (logique / physique) : 512 octets / 512 octets
    taille d'E/S (minimale / optimale) : 512 octets / 512 octets
    Identifiant de disque : 0x00000000
    Périphérique Amorçage  Début         Fin      Blocs    Id. Système
    /home/myself/backupdisk.bin1   *          63  1953520064   976760001   83  Linux
  6. Définir la partition avec le périphérique loopback (« rebouclage »)
    D’après la table de partition, la partition commence au bloc 63 and l’unité est de 512 octets. Donc le début de la partition dans l’imageest à 32256 = 63*512 octets. On peut maintenant définir la partition /dev/loop0 pour qu’elle pointe vers la première partition de l’image du disque

    sudo losetup -o 32256 /dev/loop0  /home/myself/backupdisk.bin
  7. Vérifier et réparer la partition
    L’option -y est utilisée pour forcer fsck à corriger les erreurs sans poser de question (sinon il demande des milliers de fois de confirmer, par exemple « Le décompte des i-noeuds libres est erroné pour le groupe n°7448 (16384, décompté=16334). Corriger ? »)

    sudo fsck  -y /dev/loop0
    
    #  Ca se termine par:
    /dev/loop0: ***** LE SYSTÈME DE FICHIERS A ÉTÉ MODIFIÉ *****
    /dev/loop0 : 968660/122109952 fichiers (3.9% non contigus), 234454083/244190000 blocs
  8. Monter la partition
    sudo mkdir /mnt/backupdisk
    sudo mount /dev/loop0 /mnt/backupdisk
  9. Accéder aux fichiers et les copier depuis /mnt/backupdisk
  10. Démonter la partition et détacher le périphérique loopback
    sudo umount /mnt/backupdisk
    sudo losetup -d /dev/loop0
Publié dans Notes Info | Laisser un commentaire

IRM d’Ananas

Vers 2010, au cours d’un développement de séquences IRM pour le cerveau, nous avons utilisé un ananas pour tester les effets de certains paramètres sur les images.

Voici quelques-unes de ces images visualisées avec Anatomist (à partir d’une IRM Philips 3 Tesla). La plupart sont pondérées des séquences 3D pondérées en T1, les plus belles (plus haute résolution) sont des T2 multi-coupes.T2yellowred3-c T2red-c T2blackwhite2-c T2actif-ret-c T1blackwhite3-c T1blackwhite2-c T1blackwhite1-c

 

Publié dans Divers | Laisser un commentaire

Pour en finir avec le vote utile

Vote utile

A chaque élection en France, les grands partis incitent les électeurs à « voter utile » dès le premier tour, pour ne pas risquer, par exemple, l’élimination de la gauche du deuxième tour (élection présidentielle de 2002 par exemple), ou l’élection de la gauche par division du vote de droite.
Dernièrement aux municipales de 2014, une autre variante de la même idée a été affichée partout, en particulier par le parti socialiste : le « désistement républicain« . En cas de présence de l’extrême droite au second tour, les partis républicains devraient se désister en faveur de celui d’entre eux qui a obtenu le plus de voix au premier tour. Ce principe a par ailleurs été fortement remis en cause par le refus de l’UMP de l’appliquer, ce qui a signifié que le PS s’est désisté en faveur de l’UMP, mais sans la réciproque.
On arrive ainsi à un chantage envers les électeurs : si vous ne votez pas pour nous, vous risquez d’obtenir le pire (l’extrême droite). Quel paradoxe pour l’idée même de démocratie ! Les électeurs ne seraient donc pas libres de voter pour le parti qui leur convient le mieux, mais devraient par sens des responsabilités soutenir les plus gros partis, donc « voter contre » plutôt que « voter pour ». Mais d’où vient ce paradoxe ?

Mode de scrutin : le problème et une solution

Dans notre système de vote actuel s’il y a deux listes de gauche G1 et G2, une liste de droite D et une liste d’extrême droite ED au second tour, si elles obtiennent respectivement 25.9%(G1), 26.1%(G2), 21%(D), 27%(ED) des voix, c’est l’extrême droite qui gouvernera même si 52% des électeurs voulaient des élus de gauche !
La solution est simple : changer de mode de scrutin !
Il existe de nombreux modes de scrutins qui n’ont pas ce problème.
J’en présenterai un ici : le vote unique transférable.

  1. Chaque électeur classe dans son bulletin les candidats selon son ordre de préférence (il n’est pas obligatoire de lister tous les candidats) :
    • le bulletin d’un électeur de gauche pourrait par exemple contenir G1, G2, D
    • le bulletin d’un électeur de droite qui refuse l’extrême droite pourrait être D, G2, G1
    • le bulletin d’un électeur de droite qui préfère l’extrême-droite à la gauche D, ED
  2. Pour compter les résultats, c’est assez simple : on commence par compter le premier choix de tous les bulletins. On obtient alors le même résultat qu’avec le type de scrutin actuel : 25.9%(G1), 26.1%(G2), 21%(D), 27%(ED)
  3. On élimine alors le candidat le plus mal placé, ici D avec 21%. On reprend alors les bulletins du candidat éliminé, et on répartit les bulletins vers les candidats restants en lisant le second choix des électeurs de D (s’il n’y en a pas, on élimine le bulletin).
    On a alors un nouveau résultat : 35.9% (G1), 30.1% (G2), 32% (ED). Le total ne fait pas 100% car certains électeurs de D n’avaient pas fait de second choix.
  4. On élimine alors le parti G2 minoritaire, et on procède de la même façon : les voix comptées pour G2 sont redistribuées en fonction du choix suivant dans les bulletins (si le choix suivant est D qui a déjà été éliminé, on passe au suivant dans la liste).
    On obtient alors le résultat suivant :
    61% (G1) et 33% (ED).
    Le parti vainqueur est donc le parti G1.

Ainsi, en permettant aux électeurs de préciser leur ordre de préférence, on peut leur permettre de s’exprimer en toute liberté, sans craindre que leur vote soit inutile, c’est-à-dire non compté car leur parti préféré a été éliminé.
Il est bien sûr possible de rajouter le vote blanc dans la liste, et ainsi d’exprimer qu’aucun candidat ne nous convient vraiment, tout en précisant dans les choix suivants l’ordre de préférence pour ne pas « laisser passer » un parti qu’on refuse plus que les autres.

Pour quand ce changement ?

Pourquoi donc, s’il y a des solutions, ne sont-elles pas mises en place ? En fait, ces solutions sont déjà en place dans plusieurs pays (Australie, Nouvelle Zélande, Irlande…). Les principaux bénéficiaires de ce système sont les grands partis (PS et UMP en France),  et il serait donc surprenant que leurs représentants, voulant garder leur place ultra majoritaire à l’Assemblée Nationale et au Sénat, se risquent à proposer un changement. Et c’est ainsi qu’on transforme la diversité des opinions en quasi bipartisme !

 

En conclusion, un extrait approprié du « Guide du voyageur galactique » de Douglas Adams :
Dans ce monde, le peuple est composé de gens, et les chefs sont des lézards. Le peuple déteste les lézards et les lézards dirigent le peuple »
« Bizarre » dit Arthur, « J’ai cru que tu disais que c’était une démocratie. »
« C’est ce que j’ai dit » dit Ford. « C’en est une »
« Alors, » dit Arthur […] « pourquoi le peuple ne se débarrasse pas des lézards ? »
« Honnêtement ça ne leur vient pas à l’esprit, » dit Ford. « Ils ont le droit de vote, alors ils supposent plus ou moins que le gouvernement qu’ils ont élu est approximativement le gouvernement qu’ils veulent. »
« Tu veux dire qu’ils votent réellement pour les lézards ? »
« Oh oui, » dit Ford en haussant les épaules, « bien sûr. »
« Mais, » dit Arthur […] « pourquoi ? »
« Parce que s’ils ne votaient pas pour un lézard, » dit Ford, « le mauvais lézard pourrait être élu ! »

Publié dans news, Politique & société | Laisser un commentaire

Version alpha de PyVotons! (web)

Enfin je mets en ligne la version web de PyVotons!.

C’est un logiciel en phase alpha, difficile à installer, et dont beaucoup de fonctions ne sont pas encore implémentées.

Vous devriez lire la page Documentation avant de tenter de l’installer.
Il vous faut Python et python-openssl, sur un système GNU/Linux.

Voici le logiciel :

pyvotons-2014-04-15.tar.bz2

Publié dans Development, news | Laisser un commentaire

Sauvegarde de bases MySQL

Objectif : Sauver les bases de données MySQL vers un « partage windows » (ici un serveur Samba) depuis un serveur Ubuntu Linux.

On conservera une sauvegarde par jour avec trente jours d’historique.
C’est quelque chose de relativement simple mais que je garde sous la main ici au cas où je devrai le refaire… Voici le code d’un petit script bash script fait rapidement (pas optimal, je sais). Mais pour commencer, il faut :

# Créer un utilisateur de la base de données avec accès en lecture pour les sauvegardes
mysql -u root -p
mysql> GRANT SELECT,RELOAD,LOCK TABLES ON *.* TO ‘backup_user’@’localhost’;

# Ajouter root au groupe mysql (car cron lance les tâches en tant que root)
sudo usermod -a -G mysql root

# Autoriser l’accès en lecture aux fichiers de mysql pour les utilisateurs du groupe mysql
sudo find /var/lib/mysql -maxdepth 1 -type d -exec chmod g+r \{\} \;
# Lister les bases de données
mysql -u backup_user -B -e ‘show databases;’
# En sauvegarder une (pour tester)
mysqlhotcopy -u backup_user databaseName /TheBackupDir/
# Sauver toutes les bases -> Ca ne marche pas car certaines bases listées ne sont pas accessibles
for i in `mysql -u backup_user -B -e ‘show databases;’`; do echo $i; mysqlhotcopy -u backup_user « $i » /TheBackupDir/ ; done

# Sur le partage samba, créer un répertoire WebServerBackup et ajouter un fichier vide autoBackup pour que le script puisse détecter qu’il a accès au bon répertoire, et qu’il a été monté correctement avant de lancer la sauvegarde.

Le partage windows utilisé ici n’a pas besoin de login et de mot de passe, mais dans le cas contraire, il suffit d’ajouter user= »myuser »,password= »mypassword » à la liste des options de la commande « mount ».

Le répertoire /var/www dir sera sauvé (sans conserver d’anciennes versions) dans le même répertoire, et sera mis à jour avec rsync. Un log sera écrit dans /var/log/backup.log

Voici le script :

#!/bin/bash
echo >> /var/log/backup.log
echo >> /var/log/backup.log
day=$(date +%d-%m-%Y_%Hh%M)
# List of databases to backup. Unfortunately, 
#   mysql -u backup_user -B -e 'show databases;'
#   lists system databases that cannot be saved. Using manual list instead in the for loop
echo "-------------------------------------------------" >> /var/log/backup.log
echo "Beginning WebServer Backup -> Launching backupWebsite.sh" >> /var/log/backup.log
date -R >> /var/log/backup.log
mount -t cifs -o iocharset=utf8,file_mode=0777,dir_mode=0777 //MySambaServer/MySambaShare  /backupDisk
if [ -f "/backupDisk/WebServerBackup/autoBackup" ]
then
  rsync -rltp --del --stats  /var/www /backupDisk/WebServerBackup/www >> /var/log/backup.log # --del
  mkdir "/backupDisk/WebServerBackup/mysql_$day"
  # Backup all databases
  for i in 'mybase' 'wordpress' 'mysql'; 
    do 
      echo $i; mysqlhotcopy -u backup_user "$i" "/backupDisk/WebServerBackup/mysql_$day" >> /var/log/backup.log ;
    done
  # Remove the old database backups (more than 30 days)
  find /backupDisk/WebServerBackup -maxdepth 1 -type d -name "mysql_*" -mtime +30 -exec rm -rf \{\} \;
else
  echo "Echec du montage ! ***Pas de sauvegarde du serveur web !***" >> /var/log/backup.log
fi

umount /backupDisk

echo "WebServer BACKUP FINISHED (in //MySambaServer/MySambaShare/WebServerBackup )" >> /var/log/backup.log
date -R >> /var/log/backup.log
echo "**************************************************" >> /var/log/backup.log

Enfin, on met un lien vers ce script (rendu exécutable par un sudo chmod a+x /usr/bin/backupWebsite.sh) dans le dossier /etc/cron.daily/ pour qu’il se lance une fois par jour, mais sans l’extension .sh car certaines versions de cron ignorent les fichiers en .sh :

sudo ln -s /usr/bin/backupWebsite.sh /etc/cron.daily/backupWebsite

Publié dans Notes Info | Laisser un commentaire