Sublime Text : détection des indentations tab/space

Alors voilà, vous vous êtes mis à Sublime Text 2 (http:// www. sublimetext.com/2), parce que c’est un éditeur de texte topissimissime.

Vous prévoyez de vous en servir pour un ensemble de projets et de fichiers de code existants, ayant des conventions différentes concernant les indentations en tabulations/espace. Pour diverses raisons, (justifiées ou non), vous n’avez pas envie de tout homogénéiser à grands coups de replace, alors vous avez gardé cette configuration :

"translate_tabs_to_spaces": false,

 

Le problème

Vous vous attelez à un projet indenté avec des espaces, vous y créez un nouveau fichier de code (mettons que ce soit du python). Dès la première définition de fonction, vous tapez manuellement les 4 espaces d’indentation, afin de bien indiquer à Sublime Text que c’est ça que vous voulez. Lorsque vous passez à la ligne suivante, c’est bien des espaces qui sont automatiquement ajoutés.

Ensuite, c’est la merde.

Pour reculer d’une indentation, vous êtes obligé d’appuyer 4 fois sur backspace. Et chaque fois que vous écrivez un if, un while ou autre, le niveau d’indentation automatiquement ajouté est écrit avec une tabulation.

Vous vous retrouvez donc avec de la cagassade comme ça :

screenshot_space_tab_02,

ce qui ne manque pas de faire hurler l’interpréteur python.

Vous êtes constamment obligé de remettre manuellement des espaces. Vous ne comprenez pas pourquoi cet abruti de Sublime Text ne comprend pas la convention de ce fichier en particulier, alors que celui-ci contient déjà trouzemille lignes de code indentées bien comme il faut.

 

L’interrogation existentielle

La configuration de Sublime Text est définie dans différents fichiers, qui se recouvrent les uns à la suite des autres (config globale, config d’un package, d’un projet, …). Ce n’est pas toujours évident de déduire les valeurs utilisées au final. Heureusement, il est possible de les vérifier.

Vous ouvrez la console, via l’option du Menu principal « View -> Show Console », puis vous tapez fébrilement les commandes suivantes :

view.settings().get("translate_tabs_to_spaces")
False
view.settings().get("tab_size")
4
view.settings().get("detect_indentation")
True
view.settings().get("auto_indent")
True
view.settings().get("smart_indent")
True

sublime_text_console

Tout semble normal.

Alors, vous décidez que Sublime Text n’est pas si génial que ce qu’on en dit, et vous reprenez ce bon vieux Notepad (pas Notepad++, Notepad tout court). C’est de la chiottasse, mais au moins, c’est de la chiottasse maîtrisée.

Notepad à l'apogée de son utilisation

Notepad à l’apogée de son utilisation

 

La solution

Sublime Text est capable de simplifier les ajouts et retraits d’indentation, qu’ils soient en tab ou en espace. Mais pour y parvenir, il doit préalablement déduire la convention du fichier à partir de son contenu actuel. Cette déduction n’est déclenchée qu’à l’ouverture. Comme il s’agit d’un fichier que vous aviez créé, rien n’a été déduit puisqu’il était vide au départ.

Il suffit de fermer puis réouvrir le fichier, et tout va mieux. (Pas la peine de redémarrer Sublime Text, juste l’onglet du fichier concerné). Il existe par ailleurs une commande pour relancer la déduction, mais je ne sais plus où elle est, et osef.

Il faut un nombre suffisant de lignes indentées (une dizaine) pour que cette déduction soit garantie. Naturellement, il faut qu’elles soient toutes homogènes, et si c’est des espaces, il en faut le même nombre à chaque fois.

 

La sodomie drosophilienne

(Ça veut dire « enculage de mouche »)

La déduction d’indentation est également déclenchée lorsqu’on copie-colle une quantité conséquente de texte dans un fichier vide. On va jouer un peu avec ça.

Créer un nouveau fichier (File -> New File, ou raccourci Ctrl+N). Copier-collez le texte suivant dedans :

def truc():
    1
    2
    3
    4
    5
    6
    7
    8
    9
    0

(Il y a 10 lignes indentées, chacune avec 4 espaces).

Placez votre curseur juste après le « 0 » de la dernière ligne.

Appuyez sur « Entrée ». Une ligne indentée s’ajoute. Elle comporte 4 espaces.

Appuyez sur Backspace.

Les 4 espaces sont retirés en une seule fois et le curseur revient au début de la ligne. Sublime Text a compris que l’indentation de ce fichier est sous forme de 4 espaces. Il n’est même pas nécessaire de préciser que la syntaxe est du python. (D’ailleurs c’en est pas vraiment, car écrire des lignes ne comportant qu’un chiffre n’a que peu de sens).

copypast_ok

Recréez ensuite un nouveau fichier. Ne repartez pas du fichier précédent, car Sublime Text lui a déjà attribué une convention.

Copier-collez le même texte mais sans la dernière ligne.

Placez votre curseur juste après le « 9 ».

Appuyez sur « Entrée ». Une ligne indentée s’ajoute. Elle comporte 4 espaces.

Appuyez sur Backspace.

Seul un espace est retiré. Sublime Text n’a pas compris que l’indentation de ce fichier est sous forme d’espaces. Il garde le comportement par défaut, qui est une indentation indéterminée.

copypast_fail

Pour info, j’utilise Sublime Text version 2.0.2, Build 2221.

Toute cette drosophilophilie pour dire qu’avec la dernière génération d’éditeurs de texte (Sublime, Atom, …), on n’a plus vraiment besoin de se soucier du choix tabulations/espaces. J’ai récemment créé un nouveau projet python + django, j’ai passé 3 jours dessus avant de m’apercevoir que certains fichiers étaient indentés avec des espaces et d’autres avec des tabulations !

Ça ne dérange ni python, ni Sublime Text, ni la personne qui code d’avoir des fichiers mixés. Cependant, il est toujours nécessaire d’appliquer la même convention au sein d’un même fichier, et il vaut mieux comprendre avec précision le comportement et l’intelligence de ces nouveaux éditeurs de texte.

Malgré ces petites gênes qui subsistent, il semble donc que la rivalité millénaire entre les tabulistes et les espaciens s’estompe progressivement, ce qui est à mon avis une bonne chose.

Strips-Indentation-600-final

 

Le réconfort

Maintenant que vous connaissez cette subtilité, à vos claviers, mesdames les codeuses et messieurs les codeurs !

moretomeasure_by_fatty_lover-d5stsk4

De la 3D avec pyglet

Salut à vous, chers amis multi-dimensionnels !!

En ce moment, j’entrepose et je documente sur mon compte github tous mes trucs de code. J’ai commencé par les plus récents, et je remonte progressivement dans le temps et dans mes joyeux souvenirs.

Mais c’est un peu fastidieux, et pas très valorisant car je ne fabrique rien de nouveau. Je me suis donc offert des petites vacances créatives au milieu de ce travail d’archivage, ce qui a résulté en une démo 3D, faite avec python + openGL + pyglet.

screenshot_cube

screenshot_icosahedron

Et devinez quoi ? Je l’ai entreposée et documentée sur mon compte github !
https://github.com/darkrecher/Geode-Sweeper

Certes, y’a pas grand chose. On peut tourner autour d’un objet (un cube arc-en-ciel ou un dodécaèdre, au choix), et c’est tout. De plus, je n’ai pas fait d’exécutable. Pour tester, vous devrez installer le bataclan nécessaire.

Je vais me garder ce machin sous le coude dans le futur but de concrétiser une idée de jeu absolument géniale : un démineur sur une géode. D’où le nom du repository : Geode-Sweeper.

Je ne vous en dis pas plus, mais pour vous faire patienter, voici des nichons géodésiques.

lara13

Avant, je ne voulais jamais parler publiquement de mes créations tant qu’elles n’étaient pas finies. Mais je me suis rendu compte que c’était un peu idiot, d’autant plus que quand je parle, c’est principalement dans le vide. J’ai donc décidé de décrire mes créations dès le début de leur création (ha ha ha). Le souci, c’est que Geode-Sweeper, je l’ai non seulement pas fini, mais carrément même pas commencé.

Donc je ne peux pas vous en dire plus. Pour vous faire repatienter, voici des fesses en polygone.

The-10-Most-Ridiculous-Victoria-Secret-Fashion-Show-Costumes

Ce blog vous a habitué à un bien meilleur patrimoine concernant les images érotiques. Pour me rattraper et vous faire rerepatienter, voici une jolie codeuse python.

python_girl_boobs

Sans transition :

Jacques Chancelle et tombe

Comme vous le savez, Jacques Chancelle est mort.

Je ne sais pas exactement qui est ce mec, et je dois avouer qu’il ne m’intéresse pas plus que ça. Mais ça m’a rappelé un souvenir rigolo.

Il y a environ 25 ans de ça, je me distrayais avec un jeu vidéo nommé « Tera », catalogué, déjà à cette époque, dans la catégorie « vieux et un peu pourri ».

screenshot du jeu vidéo Tera, de Loriciel

Lorsqu’un des personnage mourait, un texte indiquait en bas de l’écran : « Machin chancelle et tombe… ». Je-sais-plus-qui avait alors dit « haha, Jacques Chancelle, lol ! ». (Enfin à l’époque on disait pas encore « lol », mais l’idée est là, m’voyez).

Du coup, j’avais créé un personnage du nom de « Jacques », et on s’était trop lolé quand il a mouru, car le jeu a dit : « Jacques chancelle et tombe ». Hahaharg !!

Ici et maintenant, devant vous, je jure que lorsque le Revenu de Base Inconditionnel sera mis en place en France, je rejouerai à ce jeu, j’en décortiquerai les mécanismes, et publierai la solution dans un article de blog. Et alors, on retiendra de Jacques Chancelle sa contribution sérendipitesque à ce superbe jeu qu’est Tera.

Ouais et Bonne Année sinon.

Victoriabilité augmentée : la pêche aux mouleu-mouleu-mouleu.

Vous vous souvenez de ce concept que j’ai inventé il y a quelques temps déjà ?

Eh bien je l’ai réitéré. (Il était dans une boucle « for », quelque part).

C’est à nouveau pour le jeu flash débile « Anti-Idle » (http:// www. kongregate.com/games/Tukkun/anti-idle-the-game).

Celui-ci contient un mini-jeu, qui consiste à pêcher des triangles. Il se présente comme ça :

Anti-Idle Fishing screenshot

triangle = symbole du vagin = moule. donc pêche aux triangles = pêche aux moules.

Le triangle orange, en bas à droite, se déplace latéralement. Lorsqu’il arrive pil poil au niveau du trait rouge vertical, il faut appuyer sur une touche, ce qui permet de faire un « perfect catch ». Puis, un autre triangle passe, et ainsi de suite.

L’un des achievements du jeu consiste à effectuer 20 perfect catch à la suite. J’ai essayé de le faire à la main, avec mes petits réflexes d’hominoïdes, ça m’a très vite lourdé.

Pavlov aurait certainement réglé le problème avec des cacahuètes, des décharges électriques et un sifflet. En ce qui me concerne, je l’ai réglé avec un petit script python, qui effectue des copies d’écran et envoie des appuis de touches vers le jeu aux bons moments.

Vous le trouverez, sur mon compte github, avec la documentation nécessaire.

poisson pané en forme de triangle

Une pêche miraculeuse.

J’ai un peu honte de gâcher du temps de ma vie à programmer des trucs aussi inutiles, pour un jeu aussi débile. Je vais donc invoquer ma clause de déculpabilisation récursive : « ce n’est pas grave d’avoir honte de quelque chose, à condition de ne pas avoir honte d’avoir honte ».

Et sinon, je travaille actuellement sur Kawax. Je ne finirais probablement jamais ce jeu, mais je vais au moins en faire une version présentable. Vous pouvez voir l’évolution du chantier sur mon sus-mentionné compte github.

Sur ce, je vous laisse, je dois gagner l’achievement des 2000 perfect catch (heureusement que pour celui-là, il ne faut pas les faire tous à la suite).

Lailani fat girl fishing

Bonne pêche aux ce-que-vous-voulez !

La victoriabilité augmentée !!

Royal Salute à vous, petits technophiles.

Vous avez certainement entendu parler de la réalité augmentée.

Edutainment : la réalité augmentée est créée par un procédé de distortion du champ karmagraphique, qui transforme les vessies en lanternes, les miroirs en alouettes, les cliques et les claques en clic-clacs, les plombs en plomb et les mâles en pis de vache. La réalité augmentée ajoute une troisième dimension à notre monde réel 2D. Elle est compressible et interopérable : un simple mail suffit pour en transmettre plusieurs mètres cubes à vos amis. Elle permet également à toutes les personnes compatibles d’augmenter leur salaire et leur taux d’alcool.

Appareil permettant de diminuer le résultat de la soustraction entre monde réel et réalité augmentée, afin d'interfacer les deux au sein d'une abstraction commune.

Appareils servant à diminuer le résultat de la soustraction entre monde réel et réalité augmentée, afin d’interfacer les deux au sein d’une abstraction commune.

Photo prise dans la réalité augmentée, mettant en évidence les illusions d'optiques inhérentes au monde réel.

Photo prise dans la réalité augmentée, mettant en évidence les illusions d’optiques inhérentes au monde réel, qui nous font croire que les japonaises ont des petits seins.

Eh bien moi, j’ai inventé un concept de la même veine : la victoriabilité augmentée. Pas aussi cool que la réalité augmentée, mais presque. Disons que ça déprécate du chaton lvl 99 Gangnam Style.

La virtualité augmentée

« Virtualité augmentée » est une expression existante, plus ou moins déjà définie. Je ne le savais pas et j’avais voulu l’utiliser pour nommer le concept que j’ai inventé. Je ne peux plus le faire. Ça m’emmerde, parce que j’avais écrit une belle introduction avec. Donc ce que je vais vous demander, juste le temps de quelques paragraphes, c’est de faire comme si « virtualité augmentée » ne préexistait pas, et désignait mon invention à moi.

OK ? Merci, vous êtes super gentils.

On est d’accord que ce qui s’affiche sur l’écran d’un ordinateur est virtuel.

Mais cette virtualité n’est pas toujours claire, ni simple d’utilisation, ni agréable.

Prenons un exemple complètement au hasard. Vous jouez à un jeu vidéo de calcul mental, dans lequel vous devez répondre le plus rapidement possible à des questions existentielles telles que « 123/3 est-il plus grand, plus petit ou égal à 30+5 ? ».

Il s’agit d’une situation virtualitaire totalement pas pratique, pour des raisons que nous devinons tous très bien : il faut lire les questions, y réfléchir, trouver le résultat, … Si on se trompe, on perd du temps, le score n’est pas aussi haut que ce qu’il pourrait être. Bref, ce n’est pas très rentable.

Dans une virtualité idéale, le jeu se déroulerait sans qu’aucune intervention humaine ne soit nécessaire. Dès qu’une question de calcul mental serait posée, la réponse serait automatiquement trouvée et sélectionnée. Puis le jeu poserait une nouvelle question, et ainsi de suite. L’ensemble serait beau, agréable et optimal pour le score.

La virtualité idéale n’est pas évidente à atteindre. Mais on peut déjà imaginer et créer des logiciels qui s’en approchent.

La victoriabilité augmentée

La reine Victoria, inventeuse du Steam Punk, mais qui n'a pas inventé l'expression "victoriabilité". Heureusement sinon j'aurais vraiment été dans la merde.

La reine Victoria, inventeuse du Steam Punk. Elle n’a pas inventé le mot « victoriabilité », et heureusement sinon j’aurais vraiment été dans la merde.

Revenons à la euh… réalité. (Merde, putain de mot, on l’utilise partout ça fait tout confondre. Ah vous êtes encore là ? Oups…  Euh… Faites pas attention. On enchaîne).

Puisque manifestement, dans cette fameuse réalité commune à tout le monde, on me pique mes expressions avant même que j’ai le temps de m’en servir, je déclare officiellement que « victoriabilité augmentée » désigne le concept d’un logiciel externe apportant une assistance temps réel à un jeu vidéo trop difficile ou trop chiant.

Anti-Idle Math Solver

Tout ça pour dire que j’ai codé un script en python, pour le sous-jeu Math Master, du stupide jeu flash Anti-Idle (http:// www. kongregate.com/games/Tukkun/anti-idle-the-game).

Ce script effectue des captures d’écran, en déduit la question de calcul mental affichée, et renvoie la réponse dans une console. Le seul point qui manque, c’est le clic automatique sur la réponse. Mais c’est déjà pas mal non ?

Ça ressemble à ça.

Ça ressemble à ça.

J’ai tout mis sur mon compte github (https:// github.com/darkrecher/Anti-Idle-Math-Solver).

Edit 2013-12-14: Ça ne fonctionne plus depuis la version 1,652 de Anti-Idle. Ce serait assez simple à corriger, il suffit de mettre à jour les définitions de couleurs. Si vous voulez que je le fasse, envoyez un message ou un signalement de bug. En attendant, j’ai la flemme de le faire.

Je ne m’étends pas plus que ça sur le script en lui-même. Le repository contient une très belle doc de présentation pour les utilisateurs, ainsi qu’une très belle autre doc de conception pour les développeurs qui voudraient hypothétiquement reprendre le code.

Je suis content, c’est mon premier projet sur github un tant soit peu conséquent. Grâce à lui, j’ai augmenté mon niveau en geekeries. Maintenant je peux ajouter les compétences suivantes à ma fiche de personnage :

  • Écrire du python sans trop violenter le PEP8.
  • Githuber de manière à peu près correcte. Sauf que j’ai parfois des commits bizarres, avec des différentiels de fichiers mal fichus. Je vais tenter d’éclaircir la question.
  • Edit 2013-12-03 : je sais d’où viennent ces commits bizarres. Un simple cafouillage dans les sauts de ligne (CR / LF / CR&LF). Oubliez cela, c’est réglé.
  • Faire de la doc de « macro-description ». Quand j’ai créé Blarg, je me suis targué d’avoir tout bien documenté. Sauf que la doc tant vantée n’était constituée que de commentaires de code. Ce n’est pas très pratique pour quelqu’un qui ne connait pas du tout le projet et qui veut le découvrir, car il ne sait pas par où commencer.
PEP8, la boisson qui vous fait bien coder en python.

PEP8, la boisson qui vous fait bien coder en python.

J’ai encore pleins d’anciens et futurs projets à mettre sur github. Mais c’est pas pour complètement tout de suite. Là j’ai prévu d’augmenter la monétisation de mon blog (c’est de la monetariabilité augmentée). Je vais ajouter mon intermédiaire publicitaire préféré à vraiment tous les liens, et en profiter pour ressuciter les morts (les liens morts). Y’a du boulot. Et faut aussi que je fasse cette fameuse page regroupant toutes les conneries que j’ai faites depuis le début de ma vivirtuelle.

Petites blablateries rapides en vrac

J’ai éjaculé un nouvel article chez mes amis virtuels Sam & Max. J’y décris des méthodes d’union d’un ensemble d’intervalles (http:// sametmax.com/union-dun-ensemble-dintervalles/).

Le jeu Galaxy 55 est temporairement mort. Ça me chagrine beaucoup, parce que je l’aimais énormément, et j’y avais « investi » du temps. J’avais écrit des articles de blog et de magazine 42 à son sujet, créé un script de récupération des prix du marché des kubes (encore une augmentation de la victoriabilité), trouvé une méthode de quadrillage optimal pour extraire le minerai, et construit un super espace de stockage sur ma planète principale. J’espère que tout ceci reviendra un jour. Sinon, il faudra se coder son propre minecraft-like, avec des robots cette fois-ci.

Si vous voulez écouter de la bonne dub qui rotototototom du ganja farmer à la platine de platine, je vous conseille le site OnDubGround Productions (http:// odgprod.com/). C’est ma musique de chevet. J’aime particulièrement Panda Dub et Mahom.

C’est presque l’été, on va pouvoir se lashay. Voici donc une photo de Summer Lashay.

summer-lashay-01

Royal à bientôt à tous !

Ça destructure du schtroumpf clignotant à coups d’extincteur !!

Alors ces fêtes, bien ou bien ? Si vous avez chopé la gastro ces deux dernières semaines, sachez que c’est de moi qu’elle est partie. Ouais, je suis le patient zéro. Me remerciez pas, c’est naturel. (J’espère que je ne vous apprends rien lorsque j’annonce qu’une gastro, c’est naturel).

schtroumpf_pompier

Schtroumpf destructuré à coup d’extincteur.

Je me dois de vous expliquer l’origine du titre croquignolet de cet article. Pour cela, il faut remonter à un peu plus avant dans le temps.

Un peu plus avant

Je suis (du verbe suivre) avec une assiduité certaine le blog geeko-pythono-sexo-philosophile « Sam & Max ». Dans un de leur récent article, ils listent des services, gratuits et payants, permettant d’héberger des applications web (http:// sametmax.com/quel-hebergement-web-pour-les-projets-python/).

Je cherchais ce genre d’infos, car j’ai quelques petites idées de bidouilleries à offrir à l’internet. Malheureusement, je n’ai aucune expérience dans ce domaine. Figurez-vous que, malgré tous les trucs informatiques étranges que j’ai fait jusqu’à maintenant, je n’ai jamais eu besoin de créer/tuner/jackiser intégralement un site. Les services préconçus existants m’ont toujours convenu : ce blog, le magazine 42, SourceForge, InLibroVeritas, Ulule, IndieDb, etc.

Il y a longtemps de cela, je m’étais fait un site perso (avec un fond vert), hébergé par Alice/Tiscali. C’était du HTML statique, et je n’avais pas profité de toutes les folles possibilités de customisation offertes, alors que y’avait moyen d’y mettre du javascript, et peut-être même du php. Je n’ai pas honte de ce site perso, il brahmapoutrait du pingouin Linux freudien à la kqlqsh. C’était simplement une autre époque.

Or donc, pour tester et découvrir ces services d’hébergement, j’ai créé un expressionotron, c’est à dire un générateur de phrases d’exclamations époustouflantes. Et c’est ce que j’ai utilisé pour obtenir le titre de cet article.

J’ai codé la chose en python, avec la librairie Flask, et je l’ai encastré chez PythonAnywhere. Allez-y voir, et n’hésitez pas à marteler à outrance la touche F5, afin d’avoir une foule de formules cosmopolites à ressortir « en société » : http://recher.pythonanywhere.com/expressionotron

Des pythons (flasques) dans des flasques

Des pythons (flasques) dans des flasques.

Un peu après, mais quand même toujours avant

Fier de mes exploits, je poste un commentaire chez Sam & Max, annonçant la toute nouvelle existence de mon œuvre. Le concept est accueilli à bras ouvert, et Sam (le chien) me suggère de créer un twitter bot émettant une phrase à la con par jour.

Je connais encore moins les twitter bot que les bidouilleries web, mais puisque je suis en phase « découverte de nouvelles teshnologies », je me lance dans cette entreprise.

Comme on pouvait s’y attendre avec le fabuleux langage python : il y a une librairie pour ça. Elle se nomme, et c’est fort à-propos : twitter (http:// code.google.com/p/python-twitter/).

Cerise sur la choucroute, les gentils lutins de chez PythonAnywhere l’ont pré-installée. Quelques recherches internetienne, quelques lignes de code, quelques tests, et voilà-t-y pas qu’un robot à touitte sort vaillamment de mon cerveau (à défaut de sortir d’un robot-utérus fait en métal liquide).

Le premier twitter bot, créé en 1739

Le premier twitter bot, créé en 1739.

Je vous invite donc à consulter, et surtout à vous abonner au compte suivant : https://twitter.com/expressionotron

Je suis bien content d’avoir réalisé tout ça. J’ai découvert des nouveaux trucs, et je peux maintenant mettre sur mon CV : « expert en programmation web ».

Ces exploits ne méritent pas vraiment un article décrivant en détail les aspects techniques. De la documentation sur Flask et Bottle, il y en a à la pelle (voire à la bouteille). PythonAnywhere a son propre tutoriel intégré dans le site. Quant au twitter bot, j’ai trouvé assez rapidement un exemple, incluant du code et des infos sur les mystères de l’OAuth. Il est par là (http:// wilsonericn.wordpress.com/2011/08/22/tweeting-in-python-the-easy-way/).

Si vous insistez en me mettant plein de commentaire, je ferais un tutoriel maison ici. Mais honnêtement, je pense que vous n’avez pas besoin de plus que ce qui existe déjà ici et là. Bonne débrouille !

L’idée originale de l’exressionotron ayant été piquée chez nioutaik, je l’ai bien évidemment crédité. Je me suis également fendu d’un joyeux clin d’œil : l’avatar du twitter bot est une version pixel-art-paint minimaliste de l’OMG-tortoise, égérie (s’il en est) de l’expressionotron nioutaikien (http:/ www. nioutaik.fr/index.php/2007/09/06/386-l-expressionotron).

Coïncidence ? Mmmhh... Pas sûr.

Coïncidence ? Mmmhh… Pas sûr.

Et pour après ?

J’ai envie d’améliorer le concept, mais je ne le ferais que si des gens s’y intéressent, et sont prêts à flatter mon ego en échange de mon travail. Car : oui ! C’est du Travail !

Au fur et à mesure que le twitter bot atteindrait de plus en plus de followers, j’augmenterais les fonctionnalités et la diversité des phrases rigolotes. Voici les étapes prévues :

  • Si j’ai 24 followers, je corrige les fautes d’orthographes, j’améliore la gestion de la seed, et je rajoute 50 verbes, 50 noms, 50 adjectifs et 50 trucs de fin. Sachant qu’il y a actuellement une centaine de chacun de ses éléments.
  • Pour 30 followers, je libère le code du site et le mets sur github. Mais je ne libèrerai pas encore les listes de mots.
  • Pour 40 followers, je corrige les fautes d’accord entre les noms et les adjectifs, et j’en profite pour rajouter une cinquantaine de noms, majoritairement féminin.
  • Pour encore plus de followers (nombre restant à déterminer), je rajoute encore des mots, et je les regroupe par champ lexical. Vous pourrez alors générer une expression spécial Star Wars, spécial Magic The Gathering, spécial jeux de rôles, etc. Vous pourrez également mixer plusieurs champs lexicaux.
  • Pour encore-encore plus de followers, je publie les listes de mots des premières versions, je rajoute d’autres champs lexicaux, je crée une interface permettant de construire manuellement son expression en piochant ce qu’on veut.
  • Il est certainement possible de trouver encore plein d’idées bien débiles. Les possibilités d’extension sont infinies.

Il y a déjà 14 followers, la première étape devrait être franchissable, j’ai bon espoir.

Alors, venez vous agglomérer, petits twittos. Faites comme les mannequins du site Scoreland, mettez-vous en file indienne et suivez-moi !

score_sixpack14

Ni avant, ni après, mais d’autre part

J’ai écrit deux articles de pythonneries sur le blog de Sam et Max. Je vous en parle plus tard.

Le magazine 42 est paru depuis le jour de la fin du monde. C’est le dernier numéro. Notre aventure s’arrête là. Il y aura bien sûr un petit article récapitulatif de ce que j’y ai fait, et quelques explications de cet arrêt.

Seed expressionotronatoriale du titre de cet article : 183058273_001

Seed du brahmapoutrage des pingouins Linux : 238201767_001

On va pas se laisser brahmapoutrer comme ça ! Quak quak !

On va pas se laisser brahmapoutrer comme ça ! Quak quak !

Dernière minute, de type « et merde ! »

Pas merci à ce putain de WordPress, de foutre automatiquement des liens là où j’ai absolument pas demandé qu’il en foute, et que faut justement PAS que y’en ai. Putain de bordel de connerie de truc de daube. C’est trop demander d’avoir juste du TEXTE SIMPLE dans un article comportant du TEXTE SIMPLE ?

Donc à partir de maintenant, les liens en clair, que je mets à côté des liens avec intermédiaire publicitaire, seront écrits en gris, italique, et SANS LE H DE « HTTP » ! Sinon ce connard de WordPress me les transforme automatiquement en lien cliquable, et je veux justement pas qu’il le fasse ! Je veux obliger les gens à cliquer sur les liens à pub, tout en donnant quand même la cible du lien, si jamais un jour l’intermédiaire publicitaire sus-mentionné a un problème, me claque entre les doigts ou me supprime mon compte pour une raison quelconque.

Et maintenant je vais devoir reprendre TOUS mes articles, pour corriger cette connerie. SUPER WORDPRESS, SUPER ! J’avais exactement besoin de ça ! Putain, heureusement que c’est gratuit, sinon je serais VRAIMENT en train de râler !

Plus qu’à espérer que personne n’invente de protocole intitulé « ttp », sinon je suis bon pour tout re-re-faire. TROP BIEN ! ÇA DÉPUCELLE DU ZOMBI NEURASTHÉNIQUE À LA PELLE À TARTE ! JE SUIS TROP HEUREUX!

Edit 2013-11-24 : Bon, j’ai trouvé une astuce un tout petit peu moins dégueulasse. Si je colle des espaces en plein milieu de l’URL, ça vire la mise en forme automatique. C’est ce que je suis en train de faire, sur tous mes articles.

Galaxy 55 : script de récupération des prix

Edit 2013-11-19 : le jeu Galaxy 55 a été mis en jachère pour une durée indéterminée. Cet article n’est donc plus d’actualité. Je le conserve ici, car tout ce que je dis est éternel.

Salutations aux capitalicubistes qui me lisent !

Aujourd’hui, un article de geek avec du code dedans. Mais pas du python. Nous, dans le blog de Réchèr, on n’est pas que des machines à pythonner, on est aussi des êtres humains, avec un cœur, un foie, des ovaires et/ou des couilles. (On est surtout un mec tout seul avec des petites voix dans la tête).

Bref, ce que je vous propose, c’est

Du javascript DTC (Dans Ta Console)

Une fois n’est pas coutume, mais plusieurs fois est ; la société Motion Twin a créé un chouette jeu. C’est « comme Minecraft, mais dans l’espace », et ça s’intitule Galayx 55. Le joueur y explore des planètes diverses et variées. Minage, extraction, récolte et recherche de constructions témoignant d’une civilisation perdue sont de mise. Je ne vous décris pas tout en détail, d’autres sites feront ça mieux que moi, et avec moins de commentaires débiles en rouge pour sous-entendre que je suis fou et que je voudrais que tout parte, non que tout reste, non que tout parte mais que le reste reste, prolétaritude du dictatioriaaaaaaaaaaaaahhhhh !

Ce jeu comporte un marché d’échange de cubes. Un peu comme Wall Street, mais sans les hippies qui l’occupy. (Tiens d’ailleurs, il en est où ce mouvement ? Faudra que je le moteur-de-recherchise, à l’occasion). Les joueurs y font des offres d’achats, de vente et des transactions. Tout cela est bien biaux.

Il y a juste un problème d’interface : on peut consulter les prix pour chaque type de cube, un par un, mais il n’y a pas de récapitulatif global!

Il y a aussi quelques soucis dans l’affichage des courbes.

Alors vous êtes là, avec vos planètes comportant des centaines de cubes, vous « kiffez » l’exploitation intensive de la nature dans le but bien légitime d’amasser de l’argent, vous êtes prêt à tondre des hectares entier de forêt luxuriante pour votre luxe, mais vous ne pouvez pas savoir quels cubes se vendent le mieux. Mince alors.

Heureusement, je suis là.

Disgression : j’ai mis le mot « kiffer » entre guillemets juste pour m’amuser à faire le type qui parle pas djeun’s mais qui essaie quand même de parler djeun’s tout en ayant bien conscience qu’il sait pas le faire, et qui prend tout cela au second degré. Je fais du second degré sur du second degré. D’ailleurs, pour être vraiment clair sur mes intentions, j’aurais du mettre les guillemets entre guillemets. Ça aurait donné quelque chose comme ça : ‘ »‘kiffer' »‘. Sauf que WordPress bidouille mes guillemets pas comme je veux. Bon, passons.

Galaxy 55 est un jeu comportant des arbres et des barrières en bois, comme ce qu’on voit en arrière-plan de cette image.

Je me suis lancé dans la réalisation d’un bout de javascript automatisant la récupération des prix. Comme j’y connais pas grand-chose à la programmation web en général, je me suis dit que ce serait sûrement faisable sous la forme d’un gros tas de code à copier-coller comme un bourrin dans la console du navigateur. J’y suis parvenu.

Je ne m’en suis rendu compte que plus tard, mais j’ai vraiment eu du bol. Ça a pu fonctionner ainsi grâce au fait que la recherche des cubes, leur sélection et la récupération des prix se font par des requêtes Ajax.

(ici, il faudrait mettre une image d’un bidon de lessive Ajax, mais ce serait tellement convenu. Je vous l’épargne, d’accord ?)

Les requêtes Ajax ne changent pas l’URL, ce qui signifie qu’il n’y a pas de méga-reset de la page web qui aurait tué dans l’œuf l’exécution de mon gentil script. Oui, mon script s’exécute dans un œuf et il vous emmerde.

Et donc ça marche. Mon code, après quelques instants de moulinage, finit par logger dans la console le tableau complet des cours et des prix. Pour savoir comment s’en servir, vous pouvez consulter, au choix

Faites-en bon usage, jeunes parallelépipédocapitalistes !

Les trucs que j’ai pas réussi à faire dans ce script

Des requêtes jQuery qui ne se bloquent pas

Une petite partie de jQuery ?

Une petite partie de jQuery ?

Doit y avoir un truc qui m’échappe avec cette cochonnerie. Je tape $(« div#best_ask span.tgt ») dans la console et j’obtiens un tableau contenant un élément. Jusqu’ici tout va bien.

Sur la même page, je lance mon script comportant cette ligne de code, et elle me renvoie null.

Je me dis qu’il faut peut-être attendre que les ajaxeries en cours soient terminées. Je met la ligne dans une fonction SetTimeout, qui se relance tant que le truc obtenu est null. Le bastringue se coince dans une boucle infinie. Merci, au revoir, et passez-moi une brouette de commandes getElement [ById / sByTagName / sByClassName ].

Continuer mon script sur une autre page

Lorsque je suis parvenu à logger le tableau dans la console, je me suis dit que ce serait cool de l’envoyer automatiquement à un site de pastebin. C’est là que je me suis heurté au problème non vu précédemment, grâce au gros coup de bol.

Ça paraît évidemment pour ceux qui font du web depuis l’époque où leur mère suçait encore des bites, mais pour moi, ça ne l’était pas. Je vais donc vous l’écrire en gras : La plupart des infos en mémoire (variables, fonctions à exécuter après un timer, etc.) sont oubliées lorsqu’on recharge la page ou qu’on change d’URL.

Ce n’est pas une limitation technique, le navigateur fait exprès d’être amnésique de la sorte. Il s’agit d’une sorte de mesure de sécurité, appelée la « Same Origin Policy », ou quelque chose comme ça. Il y a bien une instruction javascript pour changer de page, mais lorsqu’on l’exécute : pouf ! Mémoire-de-poisson-rouge power !

Rien à voir, sinon le mot "cube".

Rien à voir, sinon le mot « cube ».

Les « vrais » sites web, pour conserver leurs informations, utilisent des cookies dont ils gavent votre navigateur. Il est certainement possible de concocter rapidement une de ces délicieuses friandises, mais ça n’aidera pas mon pauvre script dans sa pauvre console. Il va de toutes façons se stopper en changeant de page.

La solution serait d’utiliser un plug-in comme GreaseMonkey, qui peut cuisiner ses propres cookies en interne, et exécuter différents morceaux de javascript dans différentes pages. J’en aurais donc un morceau dans la page Galaxy 55, un autre dans celle du pastebin, et les données se transmettraient grâce à un cookie commun. (kou-ki-kom-1).

Sauf que je n’ai pas envie de mettre tout ce bazar en place, d’abord parce que j’ai la flemme, et ensuite parce que ce serait moins portable. Le script tel qu’il est actuellement n’a rien besoin d’autre qu’un navigateur. Pas de singe graisseux à installer, ni tout autre tralalas.

Je veux que ça reste super simple à utiliser, que n’importe quel joueur puisse l’exécuter et rediffuser publiquement les prix afin d’en faire profiter tout le monde. J’ai dit.

Autre petite chose concernant Galaxy 55

Pour aller d’une planète à l’autre, on dispose d’un vaisseau, à concevoir soi-même comme on veut.

 Y'avait trop de cube dans l'image précédente. Pour compenser, voici des courbes.

Y’avait trop de cubes dans l’image précédente. Pour compenser, voici des courbes.

Ce vaisseau doit respecter diverses contraintes : étanchéité, accès à l’ordinateur de bord, accès au transmuteur, etc. Comme je suis un grand scientifique, je suis parvenu à créer le plus petit vaisseau acceptable possible. Le détail de ces recherches cruciales et sérieuses est publié dans le forum (http:// twinoid.com/fr/tid/forum#!view/96|thread/11814458).

Le vaisseau possède également une valeur de vitesse, qui semble être calculée en fonction du nombre de cubes. J’ai trouvé la formule exacte. Mes expériences empiriques et les conclusions théoriques qui en découlent sont décrites dans le sujet du forum sus-mentionné. Distinction suprême pour mon travail de chercheur, cette formule de vitesse est reprise dans la revue scientifique Twinpedia (http:// www. twinpedia.com/galaxy55/donnees_mathematiques).

Mes nouveaux l’amis de l’internet

Pour trouver la réponse à mes questions existentielles sur le javascript et les pastebin, j’ai eu recours à mes nouveaux l’amis de l’internet. Ils s’appellent Sam et Max et ont un blog super (http:// sametmax.com/).

Allez-y les voir, je les «’» »«’»kiffe«’» »«’». Voici une photo d’eux, avec un troisième ami indéterminé.

 Photo prise à la soirée-anniversaire de celui du milieu.

Photo prise à la soirée-anniversaire de celui du milieu.

Je vais essayer, dans les semaines qui viennent, de leur proposer des articles sympatoches sur le python ou autre. C’est toujours bien de squatter un peu le blog d’autres gens, ça permet d’amener du flux de cerveau dans le mien.

J’en profite également pour remercier Roro, un autre l’ami de l’internet, qui m’a introduit (avec vaseline) au blog de Sam&Max. Il n’a pas de site ni de blog ni de truc comme ça, alors je vais juste le remercier publiquement ici.

Merci !!!

Merci !!!

Et merci à lui pour plein d’autres trucs !!

L’expression du vide dans les langages de programmation

Bonjour. Je suis un chercheur du CNRS, ou d’un quelconque organisme du même drapeau. Je travaille sur la théorie du langage, la théorie des types, et autres acabits. Je suis très généreux de mes émoluments intellectuels, et ai à cœur de les partager avec le monde entier. Voici un article totalement inutile, donc indispensable, que j’ai écrit pour la revue scientifique « Geekatorial considerations & Neuronal branling ».

Moi au CNRS, lors d'une recherche documentaire

Moi au CNRS, lors d’une recherche documentaire

Qu’appelle-je l’expression du vide ?

Afin de répondre à cette question,  je vous propose de répondre à la question inverse. Que n’appelle-je-pas l’expression du vide ?

D’aucuns feront la remarque que répondre à une question inverse ne répond pas DU TOUT à la question initiale. Je m’en fous, je suis un théoricien du langage, je fais ce que je veux, c’est quand même pas vous qu’allez m’apprendre mon métier, non mais merde quoi, je suis du CNRS, j’ai fait des études moi, je diplômes. Donc aux aucuns qui font cette remarque, je réponds : « restez aucuns, et ne devenez pas quelqu’uns, vous êtes le vide. »

Bien.

Exemples de ce que n’est pas l’expression du vide dans un langage de programmation :

  • Une variable numérique contenant la valeur 0
  • Une variable booléenne contenant la valeur False
  • Une chaîne de caractère vide
  • Un tableau ou une liste contenant 0 élément

Pourquoi cela ? Parce que ces variables ont des types spécifiques, ce qui exprime déjà quelque chose. Si votre variable numérique est censée représenter une quantité de carottes, la valeur 0 exprime : « Ici, il n’y a pas de carottes ». Ce n’est pas tout à fait la même chose que d’exprimer « Ici, il n’y a rien ». Dans « il n’y a pas de carottes », on sous-entend qu’il pourrait y en avoir. Et c’est déjà l’expression de quelque chose de particulier. Donc l’expression de pas-de-vide.

Votre booléen exprime qu’une certaine proposition est vraie ou fausse. Il n’y a donc pas rien, puisqu’il y a une proposition, peu importe laquelle. Votre chaîne de caractère vide exprime « il n’y a pas de texte ». Mais il y a une chaîne de caractères. Votre tableau vide exprime : « il n’y a pas d’éléments dans ce tableau ». Mais il y a un tableau. Etc.

Dans : « Ici, il n’y a rien », le seul sous-entendu, c’est « Ici, il pourrait y avoir quelque chose ». Oui mais quoi ? On ne sait pas. N’importe quoi. Le premier bidule qui se présente. Et le contraire du premier bidule qui se présente, c’est bien « rien du tout ». Donc « Ici, il n’y a rien » est bien l’expression du vide. Voili voilà.

On admet donc comme prédicat que l’expression du vide ne peut pas être une valeur spécifique d’une variable ayant un type défini.

Des fois y’aura besoin de décocher ce prédicat, on verra ça le moment venu.

Mais encore ?

L’expression du vide n’est pas un commentaire dans le code. Du point de vue de la machine, les commentaires sont totalement ignorés. C’est « parler pour ne rien dire ». Ce n’est pas « parler pour dire qu’il n’y a rien ici ».

Raymond Devos : "Quand j'ai rien à dire, je veux qu'on le sache"

Raymond Devos : « quand je n’ai rien à dire, je veux qu’on le sache »

L’expression du vide n’est pas non plus le vide lui-même. Le vide, ce serait un fichier de code vide, ou plus localement, une ligne vide dans un fichier de code, ou encore plus localement, des espaces à la fin d’une ligne de code.

Le vide c’est « ne pas parler ». Ce n’est pas « parler pour dire qu’il n’y a rien ici ».

Mais assez parlé dans le vide, et voyons quelles sont les possibilités d’exprimer le vide.

Le mot-clé void

« void » est utilisé dans les langages de programmation de bourgeois, tel que le C, le C++, le Java … C’est le nom d’un type. Au même titre que int est un nom de type pour une variable numérique. Sauf que void est un type avec rien dedans. Pas de valeur, que d’alle.

Dans ces langages, les fonctions renvoient toujours quelque chose. Lorsqu’elles ne renvoient rien, elles renvoient une variable de type void. On aurait pu appeler ce genre de fonction des procédures, comme dans le langage Pascal, mais les inventeurs du C sont des bourgeois marrants.

On a donc bien ici une expression de vide : Ici [à l’endroit où on pourrait récupérer une donnée renvoyée par une fonction], il n’y a rien ». Qu’est-ce qu’il pourrait y avoir à la place ? On ne sait pas, puisqu’on a dit que le type lui-même était le vide. Si on veut mettre autre chose, ça pourrait être tout et n’importe quoi.

Dakkath le kilrathi : "The void ! the void !"

Dakkath le kilrathi : « The void ! the void ! »

On peut également utiliser « void » pour déclarer un pointeur vers un truc qu’on sait pas ce que c’est.

void *p = &quelqueChose;

Mais cet exemple n’est pas une expression de vide, puisque le pointeur pointe sur quelque chose. De quel type ce quelque chose est ? On sait pas. C’est le type vide. Certes. Mais « ici, il y a bien quelque chose ».

Fun fact : le pointeur « void * » est le seul moyen, en C, d’obtenir l’adresse mémoire d’une fonction.

int fonction_a_la_con() {
    return 69; 
}
void *pointeur_fonction = &fonction_a_la_con; 
// exécution de la fonction pointée par le pointeur.
// Un pointeur sachant pointer...
(*pointeur_fonction)();

On aurait pu imaginer l’existence d’un type spécifique, définissant une fonction. Quelque chose comme func. Et on aurait écrit :

func *pointeur_fonction = &fonction_a_la_con;

Mais non, on n’a pas ce genre de chose. Pourquoi ? Parce que le C est un langage de bourgeois, tout simplement.

Edit 2013-10-01 : Je me suis un peu trompé concernant les pointeurs de fonction en C. Voir le commentaire de mon ami Pudbou.

On n’en a pas fini avec les pointeurs « void * ». Y’aura une surprise un peu plus loin.

Et sinon, en javascript, il existe carrément la fonction void(). C’est une fonction qui ne fait rien, à part évaluer les arguments qu’on lui passe, ou quelque chose de ce genre. J’ai pas tout compris. En javascript, je suis pas champion. Mais on voit cette fonction dans certains sites web. Passez votre curseur de souris sur un lien un peu bizarre et vous verrez, dans la barre d’état de votre navigateur, le texte sybillin : « javascript:void() ». Merci gentil navigateur, tout le monde s’en fout.

Plus de blabla sur void dans l’inévitable (de chevet) lien kiwi-pédé (http:// fr.wikipedia.org/wiki/Void).

le mot-clé NULL

Toujours dans les langages de bourgeois, le mot-clé NULL est une valeur spécifique qu’on peut attribuer à un pointeur, pour dire qu’il ne pointe sur rien.

int *a = NULL;

Mais cette exemple n’est pas une expression de vide. « Ici, il n’y a rien ». Certes. Mais si y’avait quelque chose, on aurait quoi ? Un entier. On a explicitement précisé ce qu’on pourrait avoir à la place du vide.

Vous pensez à ce que pense ?

Oui ! Une levrette !!!

Mais non bande de petits cochons. Et si on combinait les deux ?

void *p = NULL;

Surprise !!! Voici l’expression du vide dans son excellence. « Ici, il n’y a rien. Ce qu’on pourrait avoir à la place, c’est tout et n’importe quoi. »

Dirigeons-nous maintenant vers un autre langage. Un qu’est pas pour les bourgeois. Un qu’est pour les anarcho-patchworkistes : le PHP.

Eh bien figurez-vous qu’en PHP, toutes les variables valent initialement NULL. Même celles qu’on n’a pas définies. Il s’agit d’une confusion entre l’expression du vide et l’indéfini. « Il n’y a rien ici » s’énonce de la même manière que : « je n’ai encore rien dit à propos de ici ». Je trouve cela étrange, voire carrément stupide.

Re kiwi-pédé (http:// fr.wikipedia.org/wiki/NULL).

D’autre part, dans ce joyeux langage de petits enfants innocents qu’est le Pascal, NULL se dit « nil », mais on l’utilise de la même manière que le NULL du C. Dans d’autres langages que je ne connais pas, on dit « null », en minuscunulles.

Les égyptiens codent en Pascal, car ils ont le Nil

Les égyptiens codent en Pascal, car ils ont le Nil

L’expression du vide dans les systèmes de fichiers

Un système de fichier n’est pas vraiment un langage de programmation. Mais ce que je vous propose ici est un petit paragraphe interludaire.

Un terre-lude ?

Dans un système de fichier, l’expression du vide, c’est tout simplement un fichier vide. 0 octets. Paf. Mais il y a plus rigolo. Il existe le « trou noir », qui absorbe tout ce qui s’en approche.

Le trou noir est un fichier symbolique, c’est à dire un truc qui se comporte plus ou moins comme un fichier, mais qui, physiquement, ne stocke pas d’octets sur le disque dur. Le trou noir fait disparaître tout ce qu’on écrit dedans. Il sert à balancer à la poubelle du blabla de sortie (standard ou erreur) dont on n’aurait rien à foutre.

Dans le monde Unix, ce fichier est situé à l’emplacement /dev/null. Chez Windows, il s’appelle plus simplement NUL.

En guise de dernier soubresaut interludaire, je mentionnerais le fichier Windows CON, permettant de rediriger du blabla de sortie vers la console. Alors, votre Windows, il est NUL ou il est CON ? Ha ha ha.

Le Perl

Perl, au même titre que le PHP, est un langage de programmation pour anarcho-patchworkistes. Mais à tendance hyéroglyphoïdale.

Perl = langage pour faire caca des perles

Perl = langage pour faire caca des perles

Dans ce langage, point de null ni de void, mais la possibilité d’indéfinir des variables. Ça donne quelque chose de ce style :

$a = undef;
#ou bien :
undef($a);
if (defined $a) { ... }

Et ça peut permettre de virer les éléments d’un tableau. (Ou pas, car y’a aussi l’instruction « delete » pour ça). Enfin j’y connais rien, et je m’en fous total du Perl. C’est un langage moche et incompréhensible.

On y retrouve, à priori, la même confusion entre le vide et l’indéfini. D’où le côté anarcho-patchworkiste.

Le Lisp :

Il s’agit d’un langage d’une étrange pureté. Mon collègue penseur, l’éminent geekologue Randall Munroe, de l’université blogalienne de xkcd, nous précise collégialement que ce pourrait être le langage qu’a utilisé Dieu pour coder le monde réel (http:// xkcd.com/224/). Ce n’est pas mon avis, mais ce n’est pas le sujet.

LISP signifie LISt Processing : la plupart des actions se font donc avec des listes. La valeur booléenne True s’écrit simplement « T ». La valeur False s’écrit « NIL ». Sauf que NIL signifie également : « une liste vide ».

L’opérateur « null » permet de savoir si quelque chose est NIL ou pas. (null A) renvoie T si A est vide, et renvoie NIL si A n’est pas vide.

Le Lisp comporte également l’ultra-classique opérateur « not » (inversion d’un booléen). (not A) renvoie T si A est faux, et renvoie NIL si A n’est pas faux.

C'est pas faux.

C’est pas faux.

Or, comme « liste vide » = « faux », on s’aperçoit que les opérateurs « null » et « not » effectuent exactement la même chose. C’est pas rigolo ça ? Dans le moteur d’interprétation du Lisp, ça pointe sur le même code. Moi je trouve ça super.

D’autre part, nous avons ici un contre-exemple de ce que je disais au début. L’expression du vide se fait par le biais d’une valeur spécifique d’une variable ayant un type spécifique.

Interlude : Ø

Le langage mathématique est presque un langage de programmation, bien qu’il manipule des valeurs sorties de mon cul, tel que Pi ou e. Il possède lui aussi son expression du vide. Il s’agit de l’ensemble vide : Ø. Un O barré.

L’origine de ce symbole nous vient de la Grèce antique (à l’époque où le pays avait encore de l’argent). Il représente le cul cousu de Pythagore, qui refusait de se faire enculer par ses amis. Pourtant ils étaient grecs.

Et puisqu’on parle de cul et que c’est interlude :

Et sinon, dans les langages de programmation qui veulent simuler des trucs de matheux, on trouve la valeur NaN (Not A Number). C’est pas tout à fait le vide, puisque c’est « du vide qui aurait pu être un nombre », mais c’est fun quand même. Pour l’obtenir, rien de plus simple : une bonne vieille division par 0 de la mort.

Nan-Nan-Nan-nanère (http:// fr.wikipedia.org/wiki/NaN)

Visual Basic

Je l’ai déjà dit dans une autre vie (vous étiez pas encore là) : le Visual Basic est à la programmation ce que la vulvovaginite est à la sexualité : un truc vraiment sale.

Ce fabuleux langage posède une foultitude de mots rigolos. Ça ne sert pas à grand chose, mais qu’est-ce qu’on s’amuse !

Nothing est l’expression du vide, mais seulement pour les variables objet. (Donc pas totalement une expression de vide). À noter qu’on ne peut pas tester la condition « If machin = Nothing ». Il faut tester « If machin is Nothing ». Pourquoi ? On ne sait pas trop.

Le mot Empty est l’expression du vide, pour le type Variant. C’est à dire le type « tout et n’importe quoi ». On a donc là une expression de vide assez complète. Cependant, Empty est considéré comme égal à 0, ainsi que égal à une chaîne vide. Bizarre, oui.

Toujours pour un Variant, le mot Null est l’expression de l’inconnu (pas du vide). Le Null n’est pas considéré comme égal à 0, ni à une chaîne vide, ni à Empty, ni même à un autre Null. Là encore, il faut tester « If machin is Null ».

Le mot Missing permet juste de savoir si un paramètre optionnel a été passé à une fonction, ou pas. Enfin que pour les Variant. Sinon, on a la valeur par défaut du paramètre selon son type.

Je ne trouve pas d’explication à tout cela.

Mais il y a plus de détails par ici (http:// allenbrowne.com/vba-NothingEmpty.html).

Le chocolat, ce n'est pas sale, contrairement au Visual Basic.

Le chocolat, ce n’est pas sale, contrairement au Visual Basic.

Les types nullables

Restons chez Microsoft, avec leur vision, toujours aussi folklorique, de la programmation. On nous y propose une petite curiosité assez saugrenue : le type que-on-a-clairement-défini-lequel-c-etait-sauf-que-en-fait-il-peut-être-nul.

Ça donne ça :

//Déclaration
int? blorp = 5;
// On peut assigner null, ou une valeur numérique
// à la variable blorp
blorp = 4;
blorp = null;
// blarg = blorp, sauf si blarg est null,
// auquel cas blarg = -1.
int blarg = blorp ?? -1

Pourquoi pas. Ça peut servir…

BrainFuck

Ce langage est trop simple, et ne permet pas d’exprimer le vide.

Le Korn shell, et autres langages de script moches

À ma connaissance, on ne peut pas non plus exprimer le vide avec ces trucs moches. En fait, toutes les variables sont des chaînes de caractères. Lorsque l’une d’elle est vide ou indéfinie, c’est une chaîne vide, tout simplement. Ce qui peut amener des tas de situations bien marrantes.

Exemple. Instruction de copie de fichier, à laquelle on passe des variables en paramètre :

cp ${SOURCE} ${DESTINATION} ${OPTION}

Korn in the shell ? Nichons in the shell ?

Korn in the shell ? Nichons in the shell ?

Outre le fait qu’il faille écrire trois caractères inutiles et moches chaque fois qu’on veut mentionner une variable, on constate ici un truc marrant. Si on a oublié de définir DESTINATION, l’interpréteur le remplace par une chaîne vide, mais aucune erreur ne sera détectée. Le shell de merde va donc stupidement décaler les paramètres. On se retrouvera à copier un fichier vers ${OPTION}, et non vers ${DESTINATION}. N’oubliez pas de nettoyer le bordel que vous aurez foutu sur le disque après tout ça.

Le python

Comme vous le savez, le python est le meilleur langage du monde entier. On peut même programmer des jeux vidéos avec.

On peut y exprimer le vide de manière simple et explicite : le mot-clé None.

Une variable non définie ne vaut pas None. Elle est explicitement pas définie, et provoque une erreur lorsqu’on essaie de l’utiliser quelque part.

Le python est un langage fortement typé. Ça a pas l’air comme ça, parce qu’on peut affecter n’importe quoi à n’importe quelle variable n’importe quand. Mais lorsqu’une affectation est faite, le type est déterminé, c’est celui là et pas un autre, bordel. (Enfin… jusqu’à la prochaine affectation).

Ah oui ? mais alors, quel est donc le type de ce fameux None ? Ouvrons une console python et jouons un peu :

a = 5
type(a)

La console répond : <type ‘int’>
Le type de a est un numérique entier. Ces valeurs possibles sont : 0, 1, 2, -1, -2, … C’est super.

a = None
type(a)

La console répond : <type ‘NoneType’>
Le type de a est ‘NoneType’. Lorsqu’une variable est de ce type, sa seule valeur possible est ‘None’. Rigolo non ? Je crois même que c’est une espèce d’astuce pour se débarrasser d’un défaut de la théorie des types. La valeur vide est censée être de tous les types en même temps, et c’est un peu gênant. Bon enfin je dis ça, c’est juste pour faire mon malin parce que j’ai fait semblant de lire un article de Wikipédia que je me souviens même plus lequel c’est.

None = Nonne = gros nichons ?

None = Nonne = gros nichons ?

Tiens, pendant qu’on y est :

type(type(a))

ça répond : <type ‘type’>

type(type(type(a)))

ça répond aussi : <type ‘type’>
Les définitions de type : <type ‘int’>, <type ‘NoneType’>, etc. sont des valeurs, au même titre que 5, ou que None. Le type de ces valeurs est « type de valeur ».

« type de valeur » est également une définition de type, donc une valeur. Le type de la valeur « type de valeur » est « type de valeur ». Ha ha ! BOUCLE INFINIE OF THE DEATH !!!

Comme en Visual Beurk-hic, une comparaison avec None doit se faire sous la forme « machin is None », et non pas « machin == None ». La différence, c’est qu’en python on est un peu plus libre. Les deux fonctionnent.

Le == None est conventionnellement bizarre, et un peu dangereux dans des cas tordus. Parce qu’on peut surcharger l’opérateur « == », et donc créer une putain de classe qui renverrait True lorsqu’on la compare à None. Tandis que le « is » n’est pas surchargeable. C’est une comparaison d’identité brut, et non pas d’égalité de valeur. Et donc euh… Ben c’est mieux comme ça. (Interdit de dire que mes explications ne sont pas claires).

Et de toutes façons : « on n’est pas égal au vide. On EST le vide. »

Voici du blabla fun à ce sujet (http:// jaredgrubb.blogspot.com/2009/04/python-is-none-vs-none.html).

Ne rien faire, ça c’est la vie

Le vide peut s’exprimer par l’absence d’objet, mais aussi par l’absence d’action. On peut dire, explicitement : « Là, je ne fais rien ».

Comme j’ai envie de me coucher, on va faire court.

En langage machine, il existe l’instruction NOP (No Operation Performed). Selon les microprocesseurs, on peut avoir un code spécifique pour ça. En général 0, ou une valeur hexadécimale qui tombe juste. Dans le cas contraire, on a recours à une instruction normale, qu’on utilise avec des paramètres à la con, de façon que rien ne soit fait. Par exemple, le code 0x90, sur les processeurs x86, permet d’échanger le registre EAX avec le registre EAX. Whizzz !!

Tiens à propos de Whizzz, pour indiquer un NOP, on utilise parfois le mot-clé xyzzy. Mais là je ne saurais rien vous dire de plus que ce que j’irais pomper dans wikipedia. Donc allez-y direct.

Nothing happened...

Nothing happened…

Dans les langages de programmation de plus haut niveau, l’inaction peut également être exprimée, mais ce que je propose là est une vision des choses ‘  » ‘capillotractée’  » ‘.

  • Le point-virgule tout seul, dans les langages de bourgeois où les fins de lignes doivent comporter un point-virgule.
  • { }. C’est à dire un début de bloc de code, immédiatement suivi de la fin du bloc de code.
  • En Pascal, un « begin » immédatement suivi d’un « end ».

En python, on est beaucoup plus classe et plus explicite que cela, puisqu’il existe l’instruction pass, qui ne fait rien. Pourquoi en avoir besoin, alors que c’est un langage pas-machine ?

L’indentation a une signification en python. Or, on est obligé de mettre au moins une ligne de code, indentée, après un début de bloc « if », « while », ou autre. Si on ne veut rien y mettre, on doit explicitement mettre pass.

Le python est un putain de langage trop bien. Mais vous le saviez déjà.

piton

Piton

Conclusion :

Un jour, on m’a reproché de parler pour ne rien dire. Et je me suis dit que c’est surtout le reproche lui-même qui était du « parler pour ne rien dire ». Après, j’ai dit que je ne dirais plus rien à ces reprochateurs. Comme ça le problème a été réglé.

Je suis content de voir que vous avez lu jusque là ! D’ailleurs, peut-être avez-vous carrément lu jusqu’ici ? Ou là ? Bon, y’a qu’ à dire « là-bas ». Ça vous va ?

Le prochain article sera corporate et purgatif. Je baverais sur les anciennes boîte pour lesquelles j’ai bossé comme un con.