PROJET AUTOBLOG


Sam et Max

source: Sam et Max

⇐ retour index

Configurer un outil de merge pour git sous Windows

dimanche 9 mars 2014 à 00:04

Si vous utilisez msysgit, il n’y a pas d’outil pratique préinstallé pour gérer ce qui suit un git mergetool. Le plus simple à configurer est kdiff3. Il suffit de le télécharger et installer, puis de rajouter ceci dans votre fichier .gitconfig :

[diff]
    tool = kdiff3
	keepBackup = false
	prompt = false
[merge]
    tool = kdiff3
	keepBackup = false
	prompt = false
[mergetool "kdiff3"]
    path = C:/Program Files (x86)/KDiff3/kdiff3.exe
    trustExitCode = false

Remplacez “C:/Program Files (x86)/KDiff3/kdiff3.exe” par le bon chemin selon votre système, bien entendu.

kdiff3 a tendance à laisser trainer des fichiers *.orig après le merge, et ça peut se régler dans Configure/Options > Directory Merge > Backup Files (*.orig).

Ainsi votre prochain merge ouvrira tranquilement kdiff3 pour chaque conflit.

flattr this!

One myth down, pass it around

vendredi 7 mars 2014 à 15:34

Elle existe. Je l’ai rencontrée.

On avait demandé un coup de main à des amis pour des travaux, et elle avait proposé de venir. L’ambiance était plutôt poussière et transpiration en mode vêtement de clodo, alors quand elle s’est pointé avec des talons hauts et une bouteille de rosé, on a un peu tiqué.

Mais bon, mon coloc me la présente comme une copine, et c’était le moment de faire une pause de toute façon, alors pourquoi se prendre la tête ? Et puis il n’y a jamais assez de jolies rouquines sur les chantiers.

Assez rapidement on se rend compte qu’elle est complètement déchirée et n’a pas vraiment compris le principe du mot “travaux”. Elle demande un tire-bouchon, mais y en pas dans la boîte à outil. Elle a l’air vraiment déçue, alors j’entreprends de l’ouvrir à la savate.

Pour ceux qui ne connaissent pas cette technique de vieux sioux alcoolique, ça consiste à mettre la bouteille dans une chaussure de manière à ce que son cul touche la semelle côté talon, et ensuite taper l’extérieur du dit talon contre un mur jusqu’à ce que le bouchon sorte, ce qui peut prendre quelques minutes.

C’est fatiguant, et ça secoue méchamment le vin, donc je ne recommande pas ça à la soirée de monsieur Duran.

Bref, j’arrive avec le bouchon à moitié sorti, ses yeux se mettent à briller. J’explique que je vais l’ouvrir dans les chiottes parce que j’ai peur d’en mettre partout. J’entre, elle entre avec moi et et ferme la porte.

Je précise que je ne la connais toujours pas. En fait, je ne sais même pas comment elle s’appelle.

Elle se penche vers moi pour me rouler une pelle, puis recule et me demande :

“Attend, t’es venu avec qui déjà ?”

Prise de conscience.

“La bouteille.”

Je l’ouvre, on sort. Elle est déjà en train d’enlacer un autre pote. Dans la seconde. La seconde, je vous dis.

Qui est un peu gêné parce que sa copine à lui est à approximativement 3 mètres en train d’halluciner.

Notre personnage principal va donc faire du body-body avec tous les mecs présents en environ 15 minutes, puis, réalisant que personne n’étaient vraiment chauds, s’allonge sur le canapé, et s’endort pour le reste de la soirée.

Mon coloc m’expliquera plus tard :

“Elle est gentille mais elle peut rapidement te flinguer une soirée. Elle va pas faire gaffe aux couples et ça peut vite partir en fight. Par contre si tu t’ennuies ce soir…”

“Mais pourquoi tu l’as invité aujourd’hui ?”

“Je sais pas, elle a proposé, je me suis dis, plus on a de bras…”

flattr this!

Un petit goût de meteor.js en Python

jeudi 6 mars 2014 à 11:37

Je n’ai jamais caché ma jalousie envers les codeurs Javascript sous meteor.js. C’est à mon sens la techno la plus révolutionnaire en matière de dev Web depuis l’invention des frameworks HTTP.

Ca permet notamment de faire du PUB/SUB entre le navigateur et le serveur. C’est à dire qu’un navigateur déclenche un événement, le serveur le reçoit, et tous les browsers abonnés le reçoivent aussi. Du coup, on modifie une page, toutes les autres pages sont modifiées en temps réel.

Dommage que ce soit codé dans un langage pourri.

Heureusement depuis quelques temps, un standard est en train d’émerger autour du RPC et PUB/SUB entre navigateurs et serveurs : WAMP. Il existe du coup des implémentations du protocole en plusieurs langages, donc une en Python avec autobahn.

Ca s’utilise ainsi : pip install autobahn.

Puis, un petit coup de Python :

import sys
 
from twisted.python import log
from twisted.internet import reactor
 
from autobahn.twisted.websocket import listenWS
 
from autobahn.wamp1.protocol import WampServerFactory, WampServerProtocol
 
 
class MyPubSubServerProtocol(WampServerProtocol):
    def onSessionOpen(self):
        # On choisit un namespace pour enregistrer ses events PUB/SUB
        self.registerForPubSub("http://example.com/events/bam")
 
if __name__ == '__main__':
   # on lance notre serveur avec moult verbosité
   log.startLogging(sys.stdout)
   wampFactory = WampServerFactory("ws://127.0.0.1:9000", debugWamp=True)
   wampFactory.protocol = MyPubSubServerProtocol
   listenWS(wampFactory)
   reactor.run()

On lance le serveur directement :

python votre_script.py

Côté client (pas besoin de serveur, on peut l’ouvrir dans le browser cash pistache) :

<!DOCTYPE html>
<html>
  <head>
    <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
    <script src="https://raw.github.com/tavendo/AutobahnPython/master/examples/twisted/wamp1/pubsub/simple/example1/autobahn.min.js"></script>
    <script type="text/javascript">
 
    $(function(){
        ab.connect("ws://localhost:9000", function(session) {
 
            $('#foo').click(function(){
                // au clic sur le bouton, on envoit un evenement BAM
                session.publish('http://example.com/events/bam', ['bam']);
 
                // On ajoute bam à la liste en local car le publisher ne
                // reçoit pas ses propres events
                $('#doh').append('<li>bam</li>');
            });
 
            session.subscribe('http://example.com/events/bam', function(topic, evt){
                // on s'inscrit pour recevoir l'event quand il est
                // déclenché. Ceci marchera dans tout autre tab que celui
                // qui a déclenché l'event
                $('#doh').append('<li>bam</li>');
            });
        })
 
    });
 
    </script>
 
</head>
 
<body>
 
<!-- Notre liste qui va se remplir de bam ! -->
<ul id="doh"></ul>
<button id="foo" value="Bam">Bam</button>
 
</body>
</html>

Ce qui ce passe, c’est que quand j’appuie sur le bouton “Bam”, ça envoit un événement Bam au serveur via Websocket, qui propage l’événement à tous les clients. Donc tous les tabs ouverts sur cette page récupèrent l’événement et peuvent y réagir. Ici, les deux pages sont mises à jour en simultané.

Mise à jour de deux pages web en simultané avec autobahn

Chez moi ça marche

Bien entendu, ceci est un exemple très basique fait pour vous donner un avant goût de la techno. D’ailleurs, meteor.js, c’est bien plus que du PUB/SUB. Il y a de la gestion de la deco, la synchro de la base côté client, le hot push de code, etc. Ils ont fait un vrai travail de fond sur les problématiques concrètes.

Donc on en est encore loin, surtout que même leur techno est toujours expérimentale. Mais on a enfin de quoi rattraper le temps perdu. Et avec asyncio, îl n’y aura même pas besoin de dépendre de twisted pour ce faire. 2014 va être trop fun !

flattr this!

Le point sur les derniers événements autour de Bitcoin

mercredi 5 mars 2014 à 13:31

MtGox, la plus grande plateforme d’échange de Bitcoin, située au Japon, a connu une crise sans précédent. Ce n’est pas la première, même très grave, mais je pense que celle-ci lui sera fatale. Car les précédentes étaient techniques, et ici, il y a en plus une crise de confiance envers les humains derrière. Et avec Bitcoin, la confiance est tout.

D’autres plateformes connaissent des soucis, comme Flexcoin. Il y a en a eu d’autres par le passé. Il y en aura encore d’autres dans le futur.

Maintenant voici ce que personne ne semble vouloir dire dans les media en ce moment…

Tout ceci est absolument normal.

Comme Bitcoin est sulfureux, et en plus très technique, les fantasmes et les projections les plus grandes sont faites aux dépends de l’analyse et la rationalisation.

Bitcoin est un projet expérimental

Je l’ai dit, et je le répète, Bitcoin est une expérience. Et ce n’est PAS une expérience technique. C’est une expérience sociale.

Qui de surcroît touche la notion d’échange de biens et de services, la notion de richesse, de propriété, de circulation de ceux-ci et d’évaluation de valeurs.

Il est absolument normal que ça parte dans tous les sens. On ne peut pas faire quelque chose de radicalement nouveau affectant massivement un sujet des plus sensibles sans des conséquences importantes, et parfois graves.

Quand on veut être sûr de son coup, Seigneur Dagonet… on plante des navets. On ne pratique pas le putsch.

Donc si on cherche la sécurité, on ne participe pas au projet Bitcoin. Le projet n’est PAS sûr. Il n’est pas fait pour ça. Il n’a JAMAIS été présenté comme ça.

Bitcoin est un projet jeune

La monnaie existe depuis quelques milliers d’années. On a donc de l’expérience avec : infrastructures, sécurisation, mécanisme de fluctuation, comportement de la population à son égard, stockage, conversion, utilisation, et tout le tutti quanti.

De millions d’arnaques, de vols, de fraudes, de manipulations et autres malversations. On commence à avoir l’habitude, parce qu’on a littéralement tout vu.

Et malgré ça, notre système économique n’est pas vraiment ce qu’on pourrait appeler en forme.

Avec Bitcoin on a 5 ans de pratique. Une poussière. Que dalle. Vous vous attendez à quoi ?

Quelques talentueux hackers mettent en place des plateformes d’échanges. Aussi malins qu’ils soient, ils ont en face d’eux des voleurs qui ont des milliers d’années d’expérience dans lesquelles puiser. Forcément, ça va se planter.

Ça arrive maintenant parce qu’il y du pognon en jeu. Parce que le Bitcoin vaut maintenant vraiment le coup de tabasser un mec et lui mettre un flingue sur la tempe.

Précisément parce que le Bitcoin est en train de remplir sa mission, on se retrouve avec des explosions de partout.

Le Bitcoin ne peut pas ne pas passer par là. Il ne peut pas devenir un outil crédible pour l’humanité sans qu’on passe par des phases de chaos. Auxquelles il devra survivre, ou mourir, tué par le darwinisme économique.

Vous faites de la merde

Les problèmes actuellement liés aux Bitcoin sont typiquement d’ordre PBCK.

Bitcoin n’est pas parfait, mais jusqu’ici son fonctionnement n’a pas encore été pris en défaut. Je ne dis pas que ça n’arrivera jamais, bien au contraire, je parie sur le fait que ça arrivera. Ça fait partie du deal. Évoluer ou crever.

Mais ce n’est pas le cas pour le moment.

Pour le moment, la raison pour laquelle il y a des tels problèmes, c’est que beaucoup d’utilisateurs de Bitcoin ne l’utilisent pas dans le but pour lequel il a été conçu.

D’abord, Bitcoin est actuellement massivement spéculatif. Il n’a pas été conçu pour ça. C’est un système fait pour échanger de la valeur, pas pour spéculer. Qui dit spéculation, dit manipulation.

Et vous avez en face des grosses entités qui sont spécialisées là dedans depuis des siècles. Ils savent influencer les marchés et se faire de la thune avec votre pognon depuis toujours. En n’utilisant pas Bitcoin pour acheter, mais pour spéculer, on se met à la merci de ces puissances.

Surprise, vous savez comment se comporte le cours du Bitcoin depuis la disparition de tous ces BTC ? Le cours remonte. Car quand on a acquis une grosse quantité de butin, il faut l’écouler à une valeur intéressante. Je ne serai donc pas surpris que le cours soit actuellement artificiellement poussé à la hausse par les mêmes personnes qui ont chouré le magot. Comment ils le feraient ? Aucune idée. Mais on a vu des trucs plus fous à la bourse. Nous sommes des noobs face à des pros du monde de la finance.

Ensuite, Bitcoin est décentralisé, et vous (enfin vous, si vous avez perdu du pognon sur MTGox), pauvres cons, vous le stockez sur des plateformes centralisées. En gros vous reproduisez le schéma bancaire classique avec une technologie qui est faite pour émanciper l’individu du système.

Ce genre d’attaque est doublement une bonne chose :

Bref, Bitcoin n’est toujours pas mort

L’expérience continue, avec ses hauts et ses bas. C’est plus passionnant que jamais, je pense que son créateur n’a jamais imaginé l’impact de ce qu’il a lancé. Bitcoin, un logiciel qui ne fait qu’envoyer des calculs mathématiques sans valeur concrète à travers des tuyaux, est en train d’influencer le monde entier.

Pour le meilleur, ou pour le pire, jusqu’à ce que sa mort nous sépare.

Et si vous croyez que l’on a vu le pire, c’est que vous n’avez pas encore compris. Si Bitcoin fini par être un succès, alors jusqu’ici, on a été dans la partie calme et facile de sa vie.

flattr this!

Le sourire du jour

mardi 4 mars 2014 à 11:29

Je me baladais dans le code source de path.py, et je suis tombé sur l’auteur essayant de résoudre le problème suivant :

“Soit une chaine ‘mode’ représentant le mode d’ouverture du fichier, détecter si le fichier est demandé à être ouvert en écriture et dans ce cas lever une exception”

L’implémentation naïve serait:

for letter in mode:
    if letter in 'wa+':
        raise ValueError('Only read-only file modes can be used')

Une implémentation un peu plus classe serait :

if any(letter for letter in mode if letter in 'wa+'):
    raise ValueError('Only read-only file modes can be used')

Mais l’auteur a choisit d’utiliser les sets, qui sont exactement fait pour ça. Et la solution est simple et élégante:

if set(mode).intersection('wa+'):
    raise ValueError('Only read-only file modes can be used')

Je sais, il m’en faut pas grand chose pour être heureux.


Edit: explication demandée en comments :)

Un set permet de prendre n’importe quel itérable, et créer un ensemble avec. Il est capable de faire toutes les opérations ensemblistes (union, différence, etc) entre lui-même et un autre itérable.

Dans notre cas, si le mode contient un flag qui implique l’écriture, voici ce que ça donne en détails :

>>> mode = 'wb'
>>> set_de_mode = set(mode)
>>> set_de_mode
set([u'b', u'w'])
>>> set_de_mode.intersection('wa+')
set([u'w'])

On se retrouve donc avec un élément dans le set résultant de l’intersection. Un set non vide a une valeur True dans un contexte booléen en Python, donc la conditionif set(mode).intersection('wa+'): sera remplie.

A l’inverse, si il n’y a pas de flag qui implique l’écriture :

>>> set('r').intersection('wa+')
set([])

On obtient un set vide, qui vaut False dans un contexte booléen.

Tout ceci marche car les chaînes de caractères sont itérables en Python, et que les sets acceptent n’importe quel itérable. Vive le duck typing.

flattr this!