Archives 2015

Dénote 0.1

Monday, 28 September 2015
|
Écrit par
Grégory Soutadé

Capture d'écran Dénote

Après le blog, on est à la limite du tutorial de base Django : une application de gestion de notes. D'ailleurs, un blog et un gestionnaire de note sont très proches au niveau structure du code et fonctionnalités.

Pourtant, c'est une application qui me manquait cruellement : Écrire des petites notes, pouvoir les stocker/organiser et y accéder de partout. Je n'ai pas trouvé ailleurs sur le web une appli open source en Python/PHP facilement installable chez soi.

Pourquoi ne pas utiliser le téléphone me direz-vous ? Et bien, quand on veut juste copier-coller un lien d'Internet, ajouter deux/trois commentaires pour y retourner plus tard, c'est bien plus pratique de le faire sur son PC. Je n'ai pas non plus envie d'être restreint aux seuls marque-pages.

Qu'en est-il de pastebin ? Je vous avais vanté les mérites de ce petit logiciel de copier-coller communautaire. Il faut reconnaître qu'il est bien pratique pour s'échanger des bouts de code (ou autre) pendant une courte durée. Mais, dès qu'ils s'agit de garder et d'organiser ses "pastes", et bien on atteint très vite ses limites.

Voilà donc "Dénote" en version 0.1. Ses fonctionnalités sont :

  • Ajout/suppression de note
  • Syntaxe markdown (avec support de la coloration de code)
  • Catégories

Que du très classique, avec un design simple, mais qui colle assez bien à l'application (de mon point de vue). J'ai eu la joie de réaliser tout le design (c'est quand même mieux que gPass), et, pour être honnête, je le trouve plutôt sympa.

Comme d'habitude les sources sont disponibles sur ma forge sous licence GPLv3. Il existe une instance ouverte (soumise à création de compte (un minimum d'info est demandé)) est disponible ici, c'est celle que j'utilise.

De mon point de vue, il manque encore la recherche ainsi que (éventuellement) un système de note publique/privée (actuellement tout est privé).

À défaut d'être révolutionnaire, cette petite m'a permis de remonter les soucis de conflit lorsque l'on fait tourner deux applications Django dans une même instance Apache.

Activité barbante : la course à pied

Wednesday, 16 September 2015
|
Écrit par
Grégory Soutadé

Ça y est, l'été est fini, il fait nuit à 16h, plus le temps ni l'envie d'aller courir... Non, c'est une blague ! Il faut faire du sport (surtout quand on a une activité quotidienne peu physique), c'est important pour le corps et l'esprit.

Encore plus important et satisfaisant quand on commence à avoir un niveau correct, qui permet de passer outre la seule douleur physique pour se concentrer sur l'effort. C'est aussi un bon moyen d'être prêt physiquement pour d'autres activités plus ludiques. Car, il faut bien le reconnaître, même si la course permet de faire un petit tour en plein air et ne dure pas trop longtemps, c'est quand même une activité barbante. Comme souvent, pour se motiver dans ce genre d'épreuve, il faut y aller à plusieurs, ou avoir des objectifs !

Personnellement, c'est une bonne année et aussi le début de ma "saison" avec Odyssea, la course des paroisses (si elle est reconduite), le téléthon, Amnesty International. Du coup, il est normal d'avoir certaines exigences. Même si ses propres exigences sont faibles, j'ai remarqué qu'avoir un objectif permettait de faire passer plus rapidement l'épreuve. Et quel plaisir de voir que l'on tient ses objectifs, voire qu'on les dépasse (pour en mettre des plus importants la fois suivante !).

Il n'y a pas de secret, en course à pied, on n'a que deux types d'objectifs : distance et/ou temps (allure). Le premier est facile à mesurer. Le second, un peu moins, surtout quand on n'a qu'une montre standard (mais néanmoins suffisante). Une fois que la distance est bien calibrée (selon un parcours sympathique), on peut augmenter l'allure, puis de nouveau la distance (et ainsi de suite).

Je viens de parler d'allure et non de vitesse. Ce terme est étonnant pour les néophytes, mais c'est ce qu'indique ma montre (Garmin Forerunner 210). La vitesse est égale au nombre de kilomètres parcourus en une heure (km/h), alors que l'allure est la durée (en minutes) pour parcourir un kilomètre (min/km). Il s'agit donc de "l'inverse". Naturellement, elles sont équivalentes :

 8 km/h = 7'30 /km
 9 km/h = 6'40 /km
10 km/h = 6'00 /km
11 km/h = 5'27 /km
12 km/h = 5'00 /km
13 km/h = 4'36 /km
14 km/h = 4'17 /km
15 km/h = 4'00 /km
16 km/h = 3'45 /km

On remarquera que la courbe d'effort est exponentielle par rapport à la courbe de l'allure (il faut faire beaucoup d'effort pour gagner peu de temps).

Cette allure est donnée en temps réel et enregistrée chaque kilomètre par la montre (avec une notification sonore). Quand on a un objectif de vitesse, il faut donc qu'en moyenne elle soit inférieure ou égale à l'objectif (on en vient au but de cet article !). Certaines montres avancées (donc chères) permettent de savoir si on est au-dessus ou au-dessous d'un objectif fixé (ou d'une moyenne des courses précédentes). Ce n'est pas le cas de la Forerunner 210. Je pense que certaines applications sur smartphone feraient l'affaire, mais sincèrement... pas envie.

Même si on a du temps de cerveau disponible, ce n'est pas évident de faire des calculs complexes pendant la course. Néanmoins, il existe une technique simple qui consiste à mémoriser le delta courant. Que de mots compliqués pour une notion simple. En réalité, il faut à chaque kilomètre regarder la différence (le delta) par rapport à notre objectif et l'additionner ou la soustraire à la différence précédente. En fin de parcours on divise le delta final par le nombre de kilomètres parcourus et on l'additionne à l'objectif pour avoir notre moyenne globale.

Un petit exemple vaut mieux qu'un grand discours. Prenons comme objectif 12km/h sur un parcours de 11km :

Objectif        Allure actuelle                  Delta              Delta total (à mémoriser)
  5'20           5'12               -8  ( 8 secondes d'avance)            -8
  5'20           5'11               -9  ( 9 secondes d'avance)           -17
  5'20           4'51               -29 (29 secondes d'avance)           -46
  5'20           5'11               -9  ( 9 secondes d'avance)           -55
  5'20           5'30               +10 (10 secondes de retard)          -45
  5'20           5'08               -12 (12 secondes d'avance)           -57
  5'20           5'08               -12 (12 secondes d'avance)           -69
  5'20           5'33               +13 (13 secondes de retard)          -56
  5'20           5'07               -13 (13 secondes d'avance)           -69
  5'20           5'02               -18 (18 secondes d'avance)           -87
  5'20           4'55               -25 (25 secondes d'avance)          -113

Au final, on aura 113 secondes d'avance sur l'objectif. L'allure moyenne sera donc de 113/11 = 10,3 et 5'20-10"3 = 5'9,7 soit (environ 11,6km/h). Tout cela sans avoir à attendre le calcul et l'affichage des données par un logiciel (Turtlesport) plus complet.

Astuce : Pour mémoriser facilement un delta, on ne prendra pas -8, -17..., mais 8 secondes d'avance, 17 secondes d'avance...

On peut ainsi calculer en temps réel sa performance. Ceux qui ont une bonne mémoire pourront même faire des comparaisons avec les sorties précédentes.

Garder cet objectif en tête permet d'avoir une motivation supplémentaire. On attend avec impatiente le kilomètre suivant pour connaître le delta à appliquer et, en fin de course, on est amené à accélérer pour battre le record précédent !

Odyssea Cannes 2015

Tuesday, 01 September 2015
|
Écrit par
Grégory Soutadé

Logo Odyssea

11e édition de la course Odyssea à Cannes ce dimanche 20 septembre 2015. Une occasion de courir pour soutenir des associations locales d'aide aux femmes atteintes du cancer du sein. 3 formes sont possibles :

  • 10km course
  • 5km marche/course
  • 1km enfant

Le montant de l'inscription est de 12€ (15€ sur place) et 4€ (5€) pour les enfants. Plus de 1000 personnes de tous niveaux sont attendues !

Retours :

La course s'est déroulée sous magnifique ciel bleu. Il en devient presque rare d'avoir un ciel aussi pur sur la Côte d'Azur ! Le soleil était presque trop présent (assez chaud, ce qui a pesé sur une bonne moitié des coureurs), même si à l'ombre il ne faisait "que" 23°C/24°C.

Les 1500 participants ont permis de récolter 11 000€. Bravo à tout le monde et surtout, merci aux bénévoles ! Les photos sont disponibles ici et les résultats

Mon objectif pour cette année était de faire les deux boucles en 53'/54' (contre 56'57 l'année dernière). Objectif largement dépassé, puisque j'ai fini en 50'23 (non sans mal). Pour l'année prochaine ? Passer sous la barre des 50' évidemment ! Plus anecdotiquement, je récolte une 190e place sur 468

Bitcoin en interne

Thursday, 20 August 2015
|
Écrit par
Grégory Soutadé

Tout le monde connaît le Bitcoin, au moins de nom. Un truc obscure, monnaie virtuelle qui fonctionne en réseau, ou quelque chose comme ça...

Le Bitcoin en tant que monnaie virtuelle a beau être volatile, on ne peut s'empêcher de penser que son taux a fait fois 10 000 en quelques années (création en février 2009), et, peut-être regretter de ne pas s'y être intéressé avant.

Pour cet article, je laisserai de côté les questions morales de son utilisation, souvent liées à des activités frauduleuses.

Récemment, j'ai organisé une collecte de fond auprès des collègues de travail. En plus des traditionnels liquides, chèques, virements bancaires et Paypal, j'ai aussi proposé en l'air le Bitcoin.

J'ai donc cherché des outils pour manipuler cette devise et suit tombé sur Electrum. il s'agit d'un client (SPV) très complet qui a deux avantages majeurs :

  • Le portefeuille est en local
  • Il a une interface en ligne de commandes

C'est en voyant des termes barbares (UTXO, merkel root...), que j'ai commencé à me demander "Comment fonctionne réellement le Bitcoin ?". Je suis alors tombé sur le site bitcoin.org qui propose énormément de ressources sur cette crypto monnaie, et tout particulièrement la section "développeur" (en anglais uniquement) vraiment très bien expliquée. Je vais essayer de résumer les concepts clés à travers cet article. Tous les schémas proviennent de la page développeurs.

Bitcoin en interne

En plongeant des les détails techniques, on se rend compte que le Bitcoin est bien plus qu'une monnaie virtuelle. Nous avons affaire à un véritable système de transactions ! D'un point de vue théorique et mathématique, le système est très pur (extrêmement bien conçu). Pour autant, il n'y a rien de vraiment "neuf", mais c'est un assemblage très élégant de concepts modernes.

Comme je l'ai dit plus haut, le système Bitcoin est avant tout un système de transactions. On ne possède pas directement des bictoins, mais le droit d'utiliser le montant d'une transaction précédente. Comme illustré ci-dessous :

Propagation des transactions

Dans le schéma ci-dessus, il est question de satoshis, pour être au clair :

  • 1.0 = 1 bitcoin (BTC)
  • 1/100 (0.01) BTC = 1 bitcent (cBTC)
  • 1/1000 (0.001) BTC = 1 millibitcoin (mBTC)
  • 1/100000 (0.000001) BTC = 1 microbitcoin (uBTC, “bits”)
  • 1/10000000 (0.00000001) = 1 satoshi

1 Satoshi est donc un dix millionième bitcoin, c'est l'unité minimale.

L'utilisateur a donc à disposition des Unspent Transaction Outputs (UTXO). C'est-à-dire, des sorties de transactions non dépensées, donc non utilisées par des entrées de transactions suivantes.

Lors de la création d'une nouvelle transaction, il faut indiquer le(s) numéro(s) de(s) la sortie(s) précédente(s).

La phobie du concepteur (et des utilisateurs) étant la double dépense (double spent) : qu'un utilisateur dépense deux fois sa monnaie. C'est particulièrement vrai par le fait que les transactions ne sont intégrées au réseau de façon sûre qu'à partir de 10 minutes, avec la validation d'au moins un nœud (transaction valide à 75%). C'est l'effet P2P.

Pour éviter la double dépense, le réseau doit donc s'assurer que les sorties ne sont utilisées qu'une seule fois.

L'ensemble des transactions sont conservées à vie dans la "blockchain", une sorte de grand livre des comptes. On peut ainsi vérifier TOUTES les transactions depuis le bloc (genesis block).

Aperçu de la Blockchain

Cette blockchain est maintenue via un réseau pair à pair (peer-to-peer/P2P, comme bittorent) dans lequel des serveurs vérifient et insèrent les transactions. Mais, pour avoir le droit d'insérer des transactions, il faut fournir une preuve de travail. Preuve qui peut aussi rapporter des bitcoins (c'est le minage/mining) aussi appelée coinbase (transaction de base qui permet de créer des bitcoins).

La preuve de travail est simple : L'entête fait 80 octets, avec notamment 4 octets de libre. Pour avoir le droit d'insérer la transaction, il faut trouver une combinaison telle que le résultat de la fonction de hashage sha256 de l'entête soit inférieure à une valeur décidée par le réseau. Cette valeur est mise à jour tous les 2016 blocs. Pour schématiser :

SHA256(header) <= 00000000XXXXXXXXXXXXXXXXXXXXXXX.

Il est prévu que l'insertion de 2016 blocs dure environ deux semaines. Si ce n'est pas le cas, la difficulté pour insérer les blocs est augmentée ou diminuée consensuellement.

Si un attaquant veut modifier une transaction, il doit détenir 51% de la puissance de calcul du réseau afin de la faire accepter aux autres pairs.

Qui dit travail, dit récompense. Les serveurs qui insèrent vos transactions dans la blockchain s'assurent de la validité de celles-ci. En échange, l'utilisateur paie des frais de transaction (fees). Ces frais sont variables d'un serveur à l'autre, le minimum étant 10 000 satoshis. Au final, ce système peut rapporter pas mal aux serveurs en place.

On notera l'utilisation d'un arbre de Merkle pour la partie données. Le principe est le suivant : La valeur du niveau n est la valeur du hash de ses descendants de niveau n+1, jusqu'à la racine (merkle root).

La partie de données peut contenir de une à n transactions (groupées par bloc/block). Empaqueter un ensemble de transactions permet de mutualiser l'entête, donc de réduire le travail à fournir.

Description d'une transaction

Mais, si on regarde d'encore plus près, on se rend compte à quel point le Bitcoin est un système fascinant. En effet, une transaction est composée d'un index (pour l'identifier dans un bloc de la blockchain), d'un locktime, des indexes des transactions d'entrée et d'un script !

Le langage utilisé est un dérivé du Forth, un langage de programmation à pile. Il détermine les conditions pour lesquelles la transaction est valide. Le montant est la somme de toutes les entrées et peut être divisé en plusieurs sorties.

Le script lui-même contient les clés publiques, les signatures et demande (le plus souvent) à ce que 1 à n signatures soient présentent et valides. Ce script doit être approuvé par le receveur.

La durée de verrouillage (locktime) est la durée durant laquelle la transaction ne peut être intégrée à la blockchain. Si l'émetteur change d'avis avant la durée du lock, il peut envoyer une transaction d'annulation (qui utilisent les mêmes entrées et donc rend caduque la transaction précédente qui n'a pas encore été insérée, quitte à se retourner ses propres bitcoins).

Côté signature, Bitcoin utilise les courbes elliptiques 256 bits ainsi que du SHA256. Les données (notamment les clés) étant présentées en base 58 pour être "plus" facilement lisibles.

Dans le cas où le montant des entrées (inputs) est supérieur à celui des sorties (outputs), la différence est encaissée par le serveur au titre de frais de transaction. Si le montant total des entrées (indivisible) est largement supérieur à que l'on souhaite dépenser, on va ajouter une transaction supplémentaire vers notre propre portefeuille pour encaisser le surplus. L'adresse de réception est dans ce cas dénommée adresse de "change" (change address).

Cas d'utilisation

La souplesse du système (malléabilité des transactions/transaction malleability) amène à plusieurs cas d'utilisations.

Le cas le plus classique est la transaction simple : le script contient la clé publique de l'émetteur, sa signature et demande la vérification de ces deux éléments.

Là où ça devient drôle, c'est dans le cas de signatures multiples.

Le contrat "d'escrow" par exemple. Il s'agit d'un type de contrat qui implique deux acteurs et un arbitre. Pour qu'il soit valide, il faut deux signatures. En cas de conflit, les deux acteurs se tournent vers l'arbitre. Celui-ci propose une solution (remboursement à hauteur de X%) et émet une transaction qui doit être signée par au moins un des deux acteurs (en plus de sa propre signature).

Autre exemple qui implique un verrouillage : le micro paiement à la tâche. Bob veut payer 100 satoshis à Alice (correspondant à 100% de ses objectifs). Il crée alors deux transactions. La première contient les 100 satoshis à destination d'Alice et la seconde utilise la sortie de la première (le compte d'Alice) et retourne les satoshis à Bob avec une durée de verrouillage de 24h. Ell aura comme numéro de séquence 1.

En fin de journée, Alice fait signer à Bob un "bon" (bond) comme quoi elle n'a réalisée que 70% du travail. Elle va donc créer une transaction qui va rembourser Bob de 30 satoshis (en utilisant la sortie de la première transaction) avec un numéro de séquence > 1. Une fois signée par Bob, elle pourra l'envoyer au réseau (broadcast). Il faudra bien sûr l'envoyer avant la réalisation de la seconde transaction (plus le temps de traitement). Si tout se passe bien, la second transaction (numéro de séquence 1) ne sera plus valide.

Entre temps, Alice peut envoyer à Bob plusieurs bons (en incrémentant le numéro de séquence), sans les émettre sur le réseau. C'est un exemple de transaction "privées" (non émise).

Dernier exemple : pour brouiller les pistes quant au traçage des bitcoins, plusieurs personnes peuvent créer une transaction à signature multiple dans laquelle ils vont provisionner à valeur égale une certaine somme. La sortie sera mélangée et redistribuée à chacun d'entre eux (à parts égales). C'est ce qu'on appelle le CoinJoin.

Anonymité du Bitcoin

Contrairement à ce que l'on pense, le Bitcoin n'est pas anonyme, puisque toutes les transactions sont enregistrées à vie dans la blockchain. Du coup, si on arrive à associer une adresse à une personne, on a accès à toutes ses transactions. Pour pallier à cela, il est recommandé d'utiliser une adresse publique différente lors de chaque transaction.

Gestion des clés

Dérivation de la clé maître

Le portefeuille (wallet) qui stocke les Bitcoin contient une clé maître générée à partir d'une graine (seed). La clé maître génère elle-même n sous clés (publiques et privées). Les propriétés des courbes elliptiques permettant, en effet, de tout dériver à partir de la graine (Il est donc important de bien la protéger !).

Ceux qui ne comprennent pas la notion de clé publique/privée pourront jeter un œil sur l'articule Wikipedia consacré à la cryptographie asymétrique. Globalement, la clé privée permet de signer une transaction et sa correspondante publique permet de vérifier la signature. On diffuse la publique et on garde secrètement la privée.

La valeur du porte-monnaie sera donc celle de la somme de toutes les transactions de sortie non dépensées (UTXO) de toutes les sous-clé publiques.

Sécurité du Bitcoin

Bitcoin est utilisée comme monnaie virtuelle, on n'en voit jamais la couleur. Finalement, ce n'est pas si différent de nos comptes bancaires directement crédités par l'employeur et débités via des cartes bancaires. Néanmoins, après le casse du siècle sur le site Mt. Gox où des centaines de milliers de bitcoins ont disparus, on peut se poser la question de la sécurité.

Il existe plein de services sur Internet qui disent tout gérer pour vous. Votre portefeuille se retrouve en ligne, et on y accède via un compte. Si le serveur se fait pirater, tout est perdu !

La solution originale est d'exécuter sur sa machine les utilitaires bitcoin et bitcoind afin de gérer à 100% son installation (et accessoirement se passer de frais de transactions). Un peu lourd quand on connaît la taille actuelle de la blockchain (plus de 37GB)...

L'alternative qui a été développée est un gestionnaire de portefeuille qui utilise le Simplified Payment Verification (SPV) ou encore Vérification Simple des Paiements. Electrum fait partie de ceux-ci. Cette alternative offre l'avantage d'avoir un portefeuille en local sur la machine, mais d'utiliser un serveur distant pour l'insertion des transactions. Il ne va télécharger que quelques morceaux de la blockchain lorsqu'il devra vérifier une transaction. Reste éventuellement le problème de la synchronisation entre plusieurs périphériques (ordinateurs, tablettes, smartphones...)

Le Bitcoin ayant un équivalent (volatile) en euros, il est important de bien stocker le portefeuille, de le dupliquer, et même de le chiffrer (même si la graine est sensée déjà l'être).

Conclusion

Le système Bitcoin est un projet extrêmement bien pensé et a sûrement été réfléchi et mûri pendant des années avant d'apparaître sur la toile. Sa conception est un véritable travail de chercheur !

Malgré ses 6 ans d'âge, l'engouement reste assez limité, clairement dû à la volatilité du cours. Et même s'il a fait des petits, ses concurrents tels que litecoin, peercoin, dogecoin... restent très méconnus et beaucoup moins utilisés.

La qualité de bitcoin.org est le reflet d'une communauté très active qui essaie de promouvoir l'utilisation de sa crypto monnaie. Un exemple de ce dynamisme est l'utilisation d'URL simplifiée bitcoin:// pour réaliser des transactions ou encore l'utilisation des Codes QR.

Le Bitcoin est-il une autre bulle qui explosera ? À voir. Le traçage de plus en plus systématique et important de la population l'amènera peut être à détrôner un jour le système bancaire classique...

LUKS on Cubox (imx6 platform)

Sunday, 09 August 2015
|
Écrit par
Grégory Soutadé

Now I have a Cubox (i2ex), I wanted to encrypt my backup disks. I followed this excellent tutorial. The cipher recommendation is aes-xts-plain64. So, I created formated disk, encrypt it, copy data from my computer and connect it to the Cubox.

But, I get this error :

cryptsetup --type luks open /dev/sda1 backup
Enter passphrase for /dev/sda1: 
No key available with this passphrase.

I tried a couple of times, use a keyfile. Nothing worked !! It made me crazy. After a bunch of search, I found that the current kernel in the Debian image from Igor Pečovnik is 3.14.14 and has issues with NEON AES implementation.

I cannot blacklist the module as it's builtin. The solution is to build a new module from the latest 3.14.49 kernel (maintained by Greg Kroah-Hartman). Ouf ! I increased cra_priority to be sure to use the new implementation.

Instructions

In the Cubox :

  • Install kernel headers (already here in the image)
  • Download the latest 3.14 kernel from kernel.org
  • Decompress it
  • Apply this patch
  • Compile
  • Install
  • Reboot

Commands :

patch -p1 < crypto.patch
cd linux-3.14.49/arch/arm/crypto/
make
sudo make install
sudo echo aes-arm-bs >> /etc/modules
reboot

If you just want to test :

insmod aes-arm-bs.ko

Precompiled version

A precompiled version is available here. To manually install it :

sudo cp aes-arm-bs.ko /lib/modules/3.14.14-cubox-i/extra/
sudo depmod
sudo echo aes-arm-bs >> /etc/modules

Or just

sudo make install
sudo echo aes-arm-bs >> /etc/modules