Un nouveau livre en cours, qui va s'écrire tout seul

Donc voilà, comme j'ai l'impression que j'ai un don (non, j'éxagère, ça fait des années que j'écris régulièrement et je ne crois pas au talent) pour écrire sur des sujets chiants :

Je me lance dans un nouveau livre qui va s'étoffer au fur et à mesure sur un nouveau sujet passionnant : À la recherche du travail perdu : une aventure commune/ence.

Ne me faîtes pas dire ce que je n'ai pas dit : les sujets sont chiants au premier abord, mais les 6 lecteurs des précédents opus que j'ai rencontré en ont dit du bien.

Moi, j'écris, je suis pas juge :D
D'ailleurs je suis pas suffisamment maso pour écrire sans retours. Même si j'admets que n'ayant mis aucun traceurs de stats sur mes livres, j'ai aucune idée de si ils sont lus en dehors des retours explicites.
Mais ouais, même 6 lecteurs (dont 2 de ma famille) ça fait quelque chose. Pas de quoi prendre le melon ou d'avoir les chevilles qui enflent mais une certaine sérénité à écrire en se disant, hey, mec, t'as des lecteurs !

Le logiciel c'est de la couture

Qu'est ce qu'un logiciel ?



Quand j'étais petit que ce soit pour le commodore 64, les premiers PC, et la HP 48, j'étais une figure incontournable de la fourniture de logiciels divers et souvent piratés...

Donc je sais ce qu'est un logiciel : un fichier fournit par n'importe quelle méthode (dont les disquettes, kermit, ...) qui est utilisable pour l'utilisateur une fois installé. C'est aussi des paquets pypi, des liens sur un site web ou des paquets debian qu'on installe. L'informatique est très diverses dans sa manière de « livrer » les habits informatiques et c'est ce que l'on pourrait appeler coutures.

Et, prenez des gants genre en cuir : pour être élégant on porte les coutures vers l'intérieur (ce qui peut faire mal), pour le confort on les porte retournées.

La notion de couture en informatique mérite qu'on s'y arrête : le tissu du logiciel c'est le code. Ce qui distingue la pratique des uns et des autres, « le professionalisme », c'est l'art de la couture ; de comment on fait tout tenir ensemble et que la couture ne détruise pas l'habit, et que l'habit tienne sans que la couture devienne une perte de confort pour l'utilisateur.

Logiciel avec ou sans couture pour l'utilisateur ?



Imaginons que je veux juste un téléphone qui téléphone et joue de la musique. Quand le fournisseur de telecom livre une nouvelle fonctionnalité sur son réseau, j'ai pas envie que mon téléphone soit inactif le temps que je le mette à jour. Et j'ai pas envie de mettre à jour le téléphone. Je veux ma livraison de logiciel sans couture (surtout le coté serveur). Même chose si je suis un joueur, je préfère jouer qu'être ennuyé par le déploiement de patch et de bugfix.

Logiciel avec couture



Imaginons que je suis administrateur système en train de déployer une couche critique (authentification (ldap), transport (serveur web), téléphonie (asterisk), moi, au contraire je veux avoir un logiciel avec couture ; que j'installe volontairement en suivant une liste de critère (stabilité, sécurité, niveau de fonctionnalités plus ou moins étendus selon que ma compagnie est dans le « bleeding edge » de l'innovation (ce qui nécessite beaucoup de mise à jours dont sécurité), ou dans le « plan plan » où moins on a besoin d'opérateurs pour maintenir un logiciel mieux on se porte.

La couture du logiciel définit tout ce qui n'est pas logiciel mais qui au final correspond à une manière de livrer.

Aussi, certains aiment cliquer dans des « apps store » pour choisir en fonction de l'icône qui est la plus jolie.

Il n'existe pas de « bonne couture universelle » dans le domaine informatique, c'est au cas par cas.

Ce qui implique qu'il y ait une manière originale pour chaque développeur. Quand on dit manière, on accepte implicitement qu'il existe une manière originale de le faire: l'Art. L'art étant souvent ce que la pratique industrielle prétend adopter. Moi, je dis que l'industrie est plus comme un singe qui mime ce qui se fait et est en position de suiveuse qu'en position de meneuse.

Le monde de la couture logicielle pratique



Le monde de l'informatique moderne est truffé de sources primaires de logiciels (dépôts git par exemple ou mercurial) qui ruissellent en source de distributions secondaires (genre les paquets python pypis, perl CPAN), tertiaires (souvent un logiciel étant un assemblage de logiciels existants on le retrouve sur un dépôt), et en produit finis (paquets de distribution, logiciels à télécharger sur une plateforme d'éditeur ou un site web lambda). Chaque étape apporte son lot de coutures. L'art du développeur est de factoriser et d'essayer de faire disparaître au maximum les coutures entre les logiciels mélangés d'infrastructures (serveur de base de données, web...) et le « code ». Le tisssu du logiciel.

Ça veut dire que le mode de livraison que ce soit une archive de code (zip, tarball) avec un manuel d'intallation, un fichier de composition de container (docker compose), une « app » dans un store est non une évidence mais un choix autant esthétique, technique que politique.

Par exemple, j'ai choisi de ne pas faire d'application android ou apple car je ne veux pas suivre les coutures imposées qui merchandisent le logiciel tout en donnant trop de pouvoir à l'éditeur.

La couture la plus simple



Le logiciel le plus simple actuellement dans une forme de livraison comme un sac patapouf, c'est un bête lien vers un serveur de page web, un numéro de version et une manière indiquant comment vérifier l'intégrité du paquet.

C'est ce que j'appelle le logiciel SAC : juste un fil appelé version et un gros sac où l'on met tout dedans.

Mes standards en tant qu'administrateur système minimaliste sont un peu plus élevé. Je vais devoir installer et opérer la solution : je veux de la documentation.
Pareil pour le développeur qui fait des logiciels.

Par contamination de pratiques, nous développons un art de la couture logicielle qui reflète notre communauté de pratique et sans la pratique face à un paysage qui change en permanence il est impossible de « coudre » dans le sens du bois.

La tradition des versions et changelog



Une pratique s'est imposée sur le fait d'avoir des numéros de versions, leur donner un sens de préférence monotonique et monotone pour éviter les surprises.

On a tendance à faire croitre les versions, et ajouter des significations aux chiffres, genre les versions majeures sont signes de changements disruptifs, et mineurs qui indiquent que mis à part les corrections de bogues on le logiciel reste inchangé dans son fonctionnement.
Aux bugs, quand on a un outil de gestion de version intégré on fait correspondre des tickets d'anomalie, et on étoffe le changelog avec les modifs pour qu'un lecteur mordu par un bug sache dans quelle version c'est résolu.

Au bug correspond un test appliqué automagiquement par le gestionnaire de version (ce qui est appelé intégration continue) pour surveiller si il réapparaît (on sait jamais). C'est pas nécessaire, mais ça évite de fournir un logiciel qui a une déchirure :D et quand on est une entreprise qui développe son logiciel pour ses besoins au lieu de passer par la case mise à disposition du logiciel, on évite les coutures et on déploie automatiquement.

La couture propre comme art



La spécificité de chaque développeur réside dans la taille des unités de code qu'il pousse.
Quand je code à la maison, souvent interrompu, mon unité de code préférée est la plus petite possible car je ne suis pas résistant au multi tasking qui pète ma mémoire. Donc, je couds à petite maille. Des tickets de bugs non coupables en plusieurs tickets : atomiques.

Par curiosité subie, il m'est arrivé de faire des mailles larges et de m'en mordre les doigts : quand t'as une pile de modifs non commitées énorme et que tu découvres un bug critique tu es bien ennuyé à pousser ta correction mélangée avec du code en cours non validés, testés.

Si mon grand père maçon m'a appris une chose ce n'est pas qu'un bon ouvrier se reconnaît à ses outils, mais surtout à la propreté de son chantier.

La propreté n'est pas qu'esthétique et du domaine de la fierté, elle est surtout là pour éviter les accidents.

Travailler à petite maille, c'est faire beaucoup de points fins, et donc s'assurer que l'état de son code « sur l'établi (sa machine) » est le plus proche de celui dans le dépôt possible.

Si t'as un accident majeur sur ton chantier (ta baraque et ton ordi crame), tu dois pouvoir reprendre le plus facilement possible ta tâche.

Ce qui semble de la friction, du travail accessoire (gérer les tickets, les versions, documenter les changements) est pourtant essentiel à minimiser les accidents coté développeurs et utilisateurs et au final à maximiser le temps de plaisir à coder. Celui qui veut la paix se prépare au pire.

Cette réflexion est une alternative à la logique qui définit le codeur par ses outils, et sa capacité à les forger. Je prétends que ce qui fait le bon ouvrier informaticien n'est pas sa facilité ni sa virtuosité à utiliser/faire des outils, mais au contraire à oublier les outils pour se concentrer sur la production d'artefacts pertinents bien qualifiés.

Internet et disparition de la vie sociale

Aujourd'hui, c'est jour du marché au vent (marché frais, ou marché on dit ailleurs).

Je me souviens dans les années 1970 que le marché frais de ma jeunesse couvrait tout le centre ville dans la ville où j'ai grandi. Aujourd'hui, il ne couvre que même pas 1/10é de la surface.

Le marché n'étais pas que l'occasion d'acheter, il était l'occasion d'échanger, prendre des nouvelles, faire de la propagande électorale, se montrer, et pour ceuzes qui avaient l'envie en échange d'un pot de vin au placier l'occasion de vendre parfois même un peu au black.

Aujourd'hui, et mon point de vue est que ce n'est pas la faute d'internet mais qu'internet en est un symptome, ces espaces de vies IRL (In real life/dans la vraie vie) ont été remplacé par des lieux d'échanges virtuels.

Il n'y a pas que le marché qui a disparu : il y a le club d'échec remplacé par les compétitions ELO en ligne, le club informatique remplacé par les multiples forums, la MJC remplacée par les studios numériques et vidéos musicales sur youtube, les radios locales (pirates parfois) remplacées par les podcasts, twitch, les partis de foot/basket/volley du dimanche entre potes remplacées par les abo à la « gym » ...

Notre société a fait un violent passage d'un espace urbain physique ouvert à tous à des espaces individualisés.

Le tout bagnole ?



Ne soyons pas aveugles, une des raisons pour lesquelles les marchés ont disparu reste la « gêne occasionnée » aux possesseurs de véhicules privés qui prennent l'espace public comme un espace privatif pour garer leurs ouatures immobiles 95% du temps.

Si je disais que wesh je jouais au foot dans la rue dans les années 80 ont me dirait que c'est inacceptable aujourd'hui ; je pourrais me faire renverser, et le « bruit du ballon » représente une gêne et le risque de briser des vitres comme un délinquant.

À Pontoise, le dimanche on pouvait faire une chose impossible de nos jours : fermer les rues aux voitures pour faire des critériums de vélos, organisés par le vendeur de vélo du quartier !

La voiture a bon dos, car j'ai aussi vécu l'enclosage des espaces publiques, dont les terrains de sports et les stades qui sont devenus accessibles que pour les assoces reconnues « institutionnellement ». Faisant d'une ville avec une palanquée de stades, une ville avec une palanquée de stades vides la plupart du temps. Ce qui est absurde, on construit masse de stades pour que les gens fassent du sport collectivement, puis on leur dit pas quand vous voulez sinon c'est le bordel. Ben, la vie c'est le bordel.

Je dirais aussi que grâce au développement de la possession d'animaux domestiques il est de nos jours impossibles d'apprécier des espaces verts qui ne soient pas minés à la crotte de chien. Et une crotte de chien c'est vraiment hyper déplaisant quand on marche dedans.

Le flicage minérale de la rue


Vu que j'étais pas un saint, je vous la ferais pas à l'envers, je dois admettre que la rue était un espace de transgression à faire à nos petites amies des choses que la morale réprouve planqués derrière un bosquet d'un parc public. Comme les vieux disaient, vous êtes pas des chiens vous pouvez faire ça chez vous quand on se faisait choper (à moins qu'ils se rincent l'œil comme des vieux pervers). On faisait joujou avec des pétards, de la poudre noire, on explorait les chantiers en constructions et les ruines à l'abandon, on « traînait » en étant bordeline délinquant.

C'est sûr qu'avec les développements de la « cipale » (police municipale) qui patrouille avec ses uniformes de militaire tout droit sorti d'un film de guerre et les caméras de vidéo-surveillance cette espace publique de transgression a disparu.

Puis aussi, on a tellement minéralisé les rues que pour faire ce que je faisais, à moins de se cacher derrière son petit doigt, il faut avoir de nos jours un certain penchant exhibitionniste.

La disparition des chiotards


Une chose qui est le symptome du fait que les humains ne sont plus bienvenus dans les villes c'est la disparition des chiotards, gogues, pissotières.

Alors certes, c'était pas le Pérou, ça sentait un peu, mais les humains ont besoin de chier et de pisser. Une ville sans chiotards est hostile à la vie humaine.

Le problème, c'est qu'avec le développement de la misère sociale qui a explosé depuis les années 1990 la présence de chiotards est devenue un aimant à clodos, migrants et autres.

Et croyez le ou pas, les miséreux restent, et leurs besoins restent, laissant dans les détours de la ville des monticules de caca humains qui puent.

Pour ceux qui ont eu le plaisir de vivre en banlieue, le train qui lorsqu'il y a des incidents peut correspondre à des longues HEURES de trajet n'a pas de gogues.

J'ai vu plus d'une fois dans ma vie des gens se soulager ou vomir sous mes yeux dans le RERA qui n'est que peu nettoyé.

Rendant une des voies de sortie de sa ville dortoir elle aussi hostile à la vie humaine.

Les contrats brasseurs et la hausse des baux commerciaux


Il n'échappera à personne que les prix des loyers sont devenus une part croissante des dépenses tant des personnes réelles que morales.
Si l'idiot a vu « la mort des petits commerces » comme la faute de « la grande distribution », le sage regarde comment les députés corrompus (surtout du coté d'Osny à l'époque) ont participé à défiscaliser une partie de l'immobilier commercial qui a participé à sa financiarisation et a résulté dans deux extrêmes : les grosses surfaces commerciales, et les franchises.
Et moi je regarde surtout les franchises.
Votre patron de bouiboui de boulangerie, supérette aujourd'hui n'est majoritairement qu'un patron que de nom, tenu par sa banque à avoir une caution bancaire solide apportée par des logiques de franchise ou de fait les « patrons » sont des « gérants ». La franchise apporte les garanties financières, subventionne l'installation « aux normes », et verrouille l'approvisionnement en blé, boisson, service, assurance et autres biens nécessaires à la vente du patron et en retour impose ses objectifs.

Dans ce monde de requin, un mètre carré est cher, plus de place pour le baby foot, le flipper, ou même d'avoir un bar à peine rempli pour être viable.
On a aussi vu sur Paris une pratique hostile aux banlieusards qui a été l'apparition des physionomistes refusant l'entrée arbitrairement (toujours aux mêmes).
À quoi bon sortir, si c'est pour se faire sortir ?

C'était mieux avant ?


LOL, non !

Il y avait une chose dans nos villes des années 80 qui étaient pire que la reconnaissance faciale alliée à l'IA : le commérage.
Être dans la rue était en soi déjà un signe d'«ensauvagement», les enfants biens y z'allaient au catéchisme, dans les clubs de théâtre, les conservatoires, les rallyes (trucs de bourges), les scouts, en vacance chez leurs grands parents.
J'ai au niveau éducatif vu une transition de la vie d'ado semi libre, capable de sortir et socialiser dans la rue, à celle cornaquer par les pratiques éducatives semi disciplinaires. La mixité sociale était déjà vue dans un mauvais œil, et le qu'en-dira-ton pire qu'un résultat de mauvaise réputation sur google.
C'est même pour ça qu'on montait sur Paname quand on le pouvait ado pour échapper à la chape de plomb étouffante de la « réputation ».

Les plus gros artisans de l'étouffement de la ville, c'était les « notables » petits commerçants dont le malheur provenait ironiquement de leurs propres décisions de réacs racistes qui vont à la messe le dimanche (ou chez les francs macs, ou au rotary club) à minéraliser, dé juvéniser, stériliser le centre ville de toute vie, considérée comme « gênante ».
La folie de l'Ordre sociale était là en contre réaction à un mai 68 plus populo, qui a vu les populos s'embourgeoiser et devenir cons comme des petits bourgeois. On appelle ça feu le PS.

C'était étouffant !

On criait pour que ça change.


Internet c'était mieux avant ?


Face à toutes ces portes qui se fermaient, aux clubs, MJC, espace publics qui n'offraient plus d'occasion d'échanger et d'apprendre, face à une société qui se refermait, internet était le rêve !
Les communautés n'étant pas encore trop grosses comme aujourd'hui, il y avait nul besoin d'être « super compétitif » dans un domaine pour être reconnu. Même installer sa première debian était un succès digne de louange.

De nos jours si t'as pas installé debian en cluster k8s en double arbre à came rancherisés avec ton routeur virtuel de réseau logiciel, t'es juste un cave.

Ce qui a changé avec internet, c'est le niveau de globalisation et les œillères numériques collées par les algo de profilage des régies commerciales de pub, qui sont aussi les premiers fournisseurs de résultats de recherche.

Dans le village « globale » on vit ce que les « administrateurs systèmes/réseaux » appellent : un « split horizon ».

Selon qui tu es, tu ne partages pas la même vision d'internet que ton voison, tout en retombant sur d'inévitables « lieux de partages » (reddit, bluesky, facebook, twitter...) qui eux mêmes sous leurs apparences de diversités t'enferme par la grâce de la personnalisation dans ton propre profil.

De même que petiot dans ta ville de banlieue tu pouvais pas t'échapper de l'image que te renvoyaient ces putains de commères, tu peux pas échapper à l'image que te renvoie les réseaux de pubs.

Et la pub c'est pour vendre. Et ce qui fait vendre : c'est la peur. Surtout en période de crise.

Internet comme la ville des années 80 est une boucle d'amplification des peurs et des inconforts personnels que l'on ressent et qui sont partagés depuis la nuit des temps : la peur de vieillir et de perdre des capacités (retrouve un corps de minots en 2 semaines de calysthénique), la peur de manquer d'argent (devient riche rapidement avec l'appli de trading Moultawa et bitcoin), la peur de ne plus être désirable (vient trouver de la chair fraîche sur la dernière app à la mode), la peur de ne plus être « à la pointe » compétitive de son domaine, dépassé, largué, oublié...

Internet abuse de notre insécurité émotionnelle, mais ce n'est pas Internet qui en est à l'origine, ce n'est que le glaçage au dessus de la culture internationalisée.

Le village global a toujours existé


Avant internet, il y avait canal + (version c'était mieux avant (ironie)), canal jimmy et quand on avait les moyens les voyages.

Johnny Hallyday a littéralement fait sa fortune comme d'autres avant et après lui (genre daft punk) à aller aux states se payer des vinyles, éventuellement des droits d'auteurs et les « localiser ». Les adapter en français. Comme La Fontaine repompait Ésope. Comme ... je ne pourrais les citer tous tellement la pratique du plagiat sans gênes est une tradition française inscrite dans les gènes de la culture française.
Je ne crois pas que l'ouverture à l'autre soit une mauvaise chose, hein ?
Je constate juste que quand un truc ressemble à un empire, bien cradoque et à vocation de domination, nos intellectuels ont un braquemare de folie envers ses cultures (présentes et passées).
La culture bourgeoise française est une culure élitiste de domination sans partage.
Culture qui a inluencé par la représentation croissante de la bourgeoisie dans la société avec amplification, nos lois, nos médias, nos tribunes publiques.

Vous remarquerez que nos intellectuels sont majoritairement des littéraires avec un mépris peu déguisé pour la science, les faits.

Eux ce qu'ils aiment c'est une forme de cléricalisme où ils ont le monopole des mots qui régissent de par l'écrit la société.

Et les lois en sont une forme.

Peu importe que la loi ne soit pas appliquées (marronier des chiens dangereux, des armes blanches, toussa), ou injuste, ce qui importe c'est les mots.

Genre peu importe que seuls les riches soient représentés à l'assemblée nationale, laissant 2/3 du peuple sans voix : c'est marqué République sur le fronton des mairies, donc on vie en démocratie.

Ce qui a disparu



Ce qui a disparu c'est la mémoire de l'occupation nazie et de la résistance.

Si souvent on parle de la résistance les armes à la main, il y en a eu d'autres tout aussi utiles dénoncées et villipendées par la bourgeoisie (qui rappelons le a collabora massivement comme corps social).
Une bourgeoisie déjà à cheval sur les mots, l'ordre et la rigueur.
Ce qui a disparu, c'est la résistance molle qui a permis à l'instar de ce qui est arrivé en Hollande de nourrir la population. Tout les citoyens qui ont refusé de respecter les lois, et ont permis de détourner de l'effort de guerre la nourriture que l'Ordre imposait. Si vous regardez les ravages comparés de la malnutrition sous l'occupation entre la Hollande et la France, il est clair que le marché noir a sauvé les fesses de nombres d'enfants.

Les gens (et c'est le cas de mon grand père qui avait fuit le STO) se sont mis à vivre en clandestinité et pour nourrir leurs familles à braconner.
Grand père qui avait déjà utilisé ses talents de braco pour faire aider à passer une famille juive en territoire libre.

Bracos que je fréquentais au lycée et qui ma foi me faisait découvrir des trésors de verdure en plein centre ville.

Mais pas que, bouilleur de crûs (comme mon arrière grand père), travailleurs au black, vendeur à la sauvette, notre société a perdu toute cette tolérance face au gris sociale, à l'économie de subsistance.

Le vrai tort des reubeus des cités est il de vendre de la drogue, ou plus prosaïquement de travailler au noir ?

Si vous regardez la pénétration du shit dans la société française, si cela se justifie sûrement par la demande, il faut constater que le marché est créatif et au vu du peu d'empoisonnement qui autrement ferait le sensationalisme des nouvelles il est de qualité contrôlée. En tout cas il est de meilleur qualité que celui des eaux minérales (trollololol).

En conclusion, ce qui détruit la société ce n'est pas internet, les bagnoles, la culture. C'est la société elle-même qui se calcifie à trop vouloir s'imposer un modèle de propreté minérale que les humains n'ont pas.

Un humain, ça chie, ça pète, ça pisse, ça baise, ça bouffe, ça échange. Le seul endroit qui lui reste est un lieu dématérialisé qui n'est pas la cause du problème, mais le symptome. On a construit des sociétés de tourisme instagrammables sans charclos, pécores, fol, originaux pertrubants parce que notre société déteste les perturbations et préfère vivre dans la vanité du miroir de la propreté positive artificielle qu'elle se renvoit d'elle même.
Mais un humain reste un animal social et rien ne remplace le contact humain qu'on lui refuse (quand il est pas riche, vu que j'ai pas évoqué le fait que maintenant quasi tout espace public accessible (centre) est privatisé, coûtant un bras pour s'aaseoir et pisser dans un minimum de confort).

Ce que l'on voit accélérer avec internet, c'est juste ce qui existait déjà « avant », la déshumanisation de la société, le rejet de tout ce qui est jugé par des faiseurs de tendance « à la marge », les inutiles qu'il faut éradiquer, qu'ils soient handicapés, inadpatés sociaux, au RSA, mals dans leur peau, et surtout ceux critiques du modèle social prétendumment inclusif.

Et bien, j'emmerde le consensus. Notre société accélère à être exclusive, elle a institutionaliser l'exclusion par la performance, la course de l'égo et du toujours mieux. Regardez les réseaux sociaux pour vous en convaincre avec les images d'Épinal que les gens se forgent. Quelque part, moi, ce que j'y vois, même quand j'y participe, c'est l'aliénation.

Notre soif de perfection affichée, est aussi une critique de notre capacité à être faillible, moche, humain. Notre culte des apparences nous rend étranger à notre partie humaine et faillible.

Une société humaine qui ne tolère pas l'erreur, n'accepte pas la rédemption qui pourtant est le centre de la figure du saint de la religion chrétienne dont on prétend qu'elle fonde nos valeurs civilisationnelles.

Loser du libre un livre libre !

Voilà j'ai publié mon dernier livre Loser du libre

Sans éditeurs, sans traqueurs de stats, juste pour écrire et raconter le point de vue dans un milieu qui aime beaucoup à rappeler ses success story et grands hommes, qu'il y a aussi des losers.

Ça parle de comment j'ai planifié et bourriné la sortie de yahi sur un budget temps (et le temps c'est de l'argent) limité, ainsi que mes nombreux échecs.

Si vous trouvez ça sympa, déposez un commentaire sur linuxfr, ça me fera ma journée.

Coding, packagaging, writing doc is fun, but evangelisation isn't

I just finished recently coding yahi, a simple tool with a lot of work in having a single web page multi view output that have no external depencies on assets or javascript.

I am kind of proud.

I packaged it, because, no software exists without packaging, and not only a software package MUST install (QA), but it MUST in my standard have an alluring very short documentation stating in few words the use case.

It is not coding, still, I like it.

Tests, at least local (and I do them partly locally), must be done before pushing. Still it happend I have « big finger » syndrome and sometimes release some defects.

And I must be all the more careful I lost my pypi OTP.

Then, there is evengelisation : it is about trying to « sell » your software. But, not all platforms are equally accessible nor welcoming.

Selling free software is a major pain in the ass, however a software without users is shit.

We have nowadays only « fame » based social network, giving an unfair advantage to those with social capital, capital that weighs more than rationality.

Also modern social network don't have memory, they are like a constant flow of news which for avoiding needless costs get erased ... when they don't reach a certain fame level.

Leaving you two choices: being forgotten fast, or spamming often to exist in the noise of news. And being put in the position of spamming feels, dirty.

Even though I have at best some welcomed views, some positive feedbacks, it doesn't really is as pleasant as meeting real life persons and showing your project (even though it doesn't give a large exposure).

Evengelisation of software, is the most brutal part of writing a software the one that requires an abnormal ego and resistance to feeling insecure.

I hate it. But, on the other hand a software without users is like a book without readers : useless.

As a conclusion, I admit it's the part I'm the less cumfortable with, but any free software coder must go through this when he works alone.

PS : Speaking of books without a reader, I am also a free writer as in free software and my books in french are available for reading:

Poetry with Yahi : amish coding and trolling with code

ποιητής, in greek means « to do », from this word derives the word « poetry ».

Poetry, in its radical meaning means : showing the stuff you do.

The « Art » and the « way » so dear to greek meant that not all ways of doing are equal : sometimes you can « inspire » by showing a path of lesser pain.

The « way » may be seen as a reference to the common way of doing things : the one best way, and the Art another way of doing more with less.

Yahi : coding as fractal poetry



Being jobless and thus a one man army kind of dev having to code everything alone, to ensure having a result at the end requires a lot of « poetry » and « Art » diverging from the one best way.

It is poetry in its goals, in its documentation, in its python code and naming and javascript code.

I will stress that basically poetry is meant to be perturbing, it is basically for some a synonym of trolling. It is fine for me, and I embrace it.

Poetry in python



It is a one line trick Basically, you transform a log thanks to a named regexp capture into a dict and then you use an addition to aggregate your data.

End of the story.

This is possible thanks to another « poetry » which are python dict (actually Mutable Mappings to be generic) that can add (and substract, divide, multiplied) thanks to the usage of traits.

Here, the God of (mis)fortune made me do a bad decision a long time ago ; try to make a metaphore based on trait.

Dict CAN be made to support linear algebrae in a non surprising way.

Some said : you invented a new algebraic data structure the tree-tor. A fractal-like vector that propagates the operation to the values.
I beg to differ since with a little trick you can restate that an intricated dict is no more than a one level dict, hence ... a Keep It Simple and Simpler algebraic Vector.

Suffice to pose the convention that any intricated dict { a : { b : 1 } } is the same as { ( a , b ) : 1 }.

Hence since you can transform a tree-tor in a vector without loss of information, a treetor is a vector with an expected behaviour of vector.

I actually proposed this to python-ideas as an inclusion to the stdlib, but core devs were less than willing to handle a code without a use that could fail in unexpected ways. And I do understand them.

So yahi, is a troll demo of using dicts to prove that (intricated) dicts that quacks like an algebraic vector, only using ONE operation (__add__) is already neat convenience. This single line is a TROLL by doing.

As a reader of poetry, when poetry is along the cliché, the expected way, it annoys me. I expect surprise, disturbance, perturbation from poetry.

Hence, when I do code poetry I expect to be perturbing, disrupting the « norm ».

Poetry in the naming



Well, trait is a trait, but it collides with the world « trait » meaning an arrow. Hence I decided to be metaphoric in the naming.

Archery based on traits, provides concrete classes of dicts that actually support linear algebrae: it's calleds bows.
I have been living on the american continent, curious of the culture of the native americans that was nowhere to be seen in the museum.

But when I was giving cigarettes away to squidjies on boulevard St Laurent in Montréal, they would tell me awesome stories that were nowhere to be seen.

So, when I read that there used to be a tribe of first nations specialized in archery : the Yahi which existence was wiped away from the surface of earth in the name of gold rush, I decided to use this name as both a reference to archery and the golden rush to the cloud. It is also a way to say fuck to the actual sorry state of the USA regarding the treatment of Native Americans that have my empathy.

It explains why my two main functions are notch to prepare the aggregation and shoot to aggregate. Using traits one line at a time fast to aggregate.

Maybe it is not smart since I may have trouble at the border, but anyway : I am too broke to buy myself a plan ticket to leave my country.

Poetry in design : being amish



I have implemented for companies numerous statistic in « real time » for web applications. It always struck me as overkill to use a multi tiers infrastructure some of which in the cloud to get frequentation data of a website at the second.

Sometimes, as a salaryman this excess of infrastructure was infuriating.

What if, we can simply parse log and make them available with the minimum « OPEX » ? (Operational Expanses).

What is less than using the cloud ? Deploying a local dynamic web server to serve all views required.

What is less than having a flask server ? A single all in one web page.

People in this case expect the full amish solution of static web pages, me I chose a all in one web page in the fashion of javascript driven à la single page app.

Breaking the purity of being actually statique, but not the security promise for people hosting the files as a static assets : no security holes comes from serving the result.

The result being standalone (JS/CSS/assets/HTML) it can even be sent by email as an archive/vizualisation format.



Poetry in javascript



I made to blog post to elaborate how I designed a « single page app behaviour with chained routing ».

The non poetic way to do this is to embedd virtual routing framework and not care how it is done. The one best way is to bloat your HTML page with shitloads of dependance.

I did not care less, I rewrote a full all in one view generator based on the included raw JSON I parse to build and graph everything.

The choice of using D3js (bar charts), and google jsapi (geo chart) instead of matplotlib was obvious to me : they produce great results with less investment in time than by using tools such as matplotlib that are a huge dependance.

Hence by chosing to graph views on the fly with JS libraries, I had already tainted my choice. It was a matter of time to put all the views in one page.

Conclusion



Doing more with less is more than trolling it is also questioning :
  • our best practices/one best way;
  • since doing without a result is not poetry but intellectual wanking, I worked my ass off that I fixed all the bugs I could before releasing (I need beta testers at this level)
  • poetry itself, long boring piece of words don't move me, I think poetry should questions what it has become and focus back on REALISATIONS that DO SOMETHING in a way that raises questions
  • while the world is burning, this code aiming at trolling grafana based stacks of data gathering, is also a question about where we go as a profession, with more useless CO2 being generated by our usage by having more and more bloated solutions
And most by not following rules, like PEP8, naming convention, and shit, it is poetry in the brutal way that questions the supremacy of form over intentions.

And at the end, releasing code that WORKS, DOING as a loser in my lonely dark room is a troll of all these projects coming to realm of free software without evangelists task force, public relations, marketing, famous rocks star developers. It feels great to go on the ring of free software (almost*) alone proving the strength of the ones seen as weak.
It is my poetry to show off what I can do from code to packaging and doc. Poetry is pride, pride is poetry.

Thanks



This project would not have had a refreshing without the help of @19emtuck that wanted to have fun on a project, and @be1 I begged logs to since I don't have a server anymore anywhere. And trust me, it's ridiculously hard to make this kind of project without millions of line of logs to test the robustness of the solution.

A virtual routing table in (almost) vanilla javacsript with two level of routing in 70 lines

The code



Since the code is small, before detailing it:
<script src="https://code.jquery.com/jquery-3.7.1.js"></script>
<style>
.content { visibility: none }
</style>
<script>
$(document).ready(() => {
    var query = new URLSearchParams(window.location.search )
    route = query.get("route")
    anchor = document.URL.match(/#[^\?]+/)

    $(".router").each( (i,e) => {
        var query = new URLSearchParams( e.attributes.href.value )
        $(e).addClass(query.get("route"))
    })
    $(".selector").each((i,e) => $(e).addClass($(e).attr("href").substr(1)))
    $(".selector").click( function(e) {
        e.preventDefault()
        history.pushState({} ,"", "" + $(this).attr("href"));
        anchor = $(this).attr("href").replace(/\?.*/,"");
        ({
            "#subroute1" : console.log,
            "#subroute2":  (e) => alert(e),
            "#subroute3" : console.log,
            "#subroute4":  (e) => alert(e)  })[anchor](anchor)
        console.log("subroute called:" + anchor)
        return true
    })
    $(".router").click( (e) => {
        e.preventDefault()
        var href=$(e.target)[0].attributes.href
        url = href.value
        if (anchor)
            url += anchor
        history.pushState({}, null, url)
        var query = new URLSearchParams( href.value )
        var route = query.get("route");
        ({
            "route1": () => { $(".content").hide(); $("." + route).show() },
            "route2": () => { $(".content").hide(); $("." + route).show() },
            "route3": () => { $(".content").hide(); $("." + route).show() },
        })[route]()
        console.log("route called:" + route)
        return true
    })
    if (route == undefined ) {
        console.log("default route")
        $(".router.route1").click()
    } else {
        console.log('dealing with: ' +route +':'+ anchor)
        $(".router" + "." + route).click()
    }
    anchor = document.URL.match(/#[^\?]+/)
    if (anchor) {
        console.log("anchor detected in URL:" + anchor[0] + "route:" + route)
        $("." + route +"  ." + anchor[0].substr(1)).click()
        console.log("sub route called:" +anchor[0])
    }
    console.log("ready")
})
</script>
<ul>
    <li><a class="router" href=?route=route1>route1</a></li>
    <ul class="content route1">
        <li><a class="selector" href=#subroute1 >sub menu 1</a></li>
        <li><a class="selector" href=#subroute2 >sub menu 2</a></li>
    </ul>
    <li><a class="router" href=?route=route2>route2</a></li>
    <ul class="content route2" >
        <li><a class=selector href=#subroute3 >sub menu 3</a></li>
        <li><a class=selector href=#subroute4 >sub menu 4</a></li>
    </ul>
    <li><a class="router" href=?route=route3>route3</a></li>
</ul>
<div class='content route1'>route 1</div>
<div class='content route2'>route 2</div>
<div class='content route3'>no subroute</div>



The need



In a project named yahi, for log parsing I am putting in a single HTML page all the data, and the views to avoid using a dynamic server, so I have to do the routing for calling the right javascript either :
  • when clicking on the a element I chose for displaying data
  • when loading an URL so that not only pages are available but also sharable.
So came the need for a level 2 router. Route layer 1 are gonna be stored in the GET key route, and subroute are gonna be called by clicking on the anchor of their names.



The how of the code



We being with the HTML:
<ul>
    <li><a class="router" href=?route=route1>route1</a></li>
    <ul class="content route1">
        <li><a class="selector" href=#subroute1 >sub menu 1</a></li>
        <li><a class="selector" href=#subroute2 >sub menu 2</a></li>
    </ul>
    <li><a class="router" href=?route=route2>route2</a></li>
    <ul class="content route2" >
        <li><a class=selector href=#subroute3 >sub menu 3</a></li>
        <li><a class=selector href=#subroute4 >sub menu 4</a></li>
    </ul>
    <li><a class="router" href=?route=route3>route3</a></li>
</ul>
<div class='content route1'>route 1</div>
<div class='content route2'>route 2</div>
<div class='content route3'>no subroute</div>
We tie the router to the HTML router class and the route is on one place the href value of the a element.
We tie the sub route to the HTML selector class and the route is on one place the href value of the a element.

When the document is loaded ($(document).ready) :
    var query = new URLSearchParams(window.location.search )
    route = query.get("route")
    anchor = document.URL.match(/#[^\?]+/)
we get the route from URL GET parameters, and anchor from the document.URL

    $(".router").each( (i,e) => {
        var query = new URLSearchParams( e.attributes.href.value )
        $(e).addClass(query.get("route"))
    })
    $(".selector").each((i,e) => $(e).addClass($(e).attr("href").substr(1)))
We tag the links of class selector and route with their respective subroute and route as a class for being to later able to target them with their CSS selector.

    $(".selector").click( function(e) {
        e.preventDefault()
        history.pushState({} ,"", "" + $(this).attr("href"));
        anchor = $(this).attr("href").replace(/\?.*/,"");
        ({
            "#subroute1" : console.log,
            "#subroute2":  (e) => alert(e),
            "#subroute3" : console.log,
            "#subroute4":  (e) => alert(e)  })[anchor](anchor)
        console.log("subroute called:" + anchor)
        return true
    })
We are gonna emulate a legitimate click on an a element, so first we disable it.
Then, we push in the history like a legitimate click does the URL that has been click making sure our subroute is the one specified.
I do cleanup that may be dead code of the anchor according to garbage that could be there.

and then I call with a dispatch table the subroute available.

And for eviting hogs, I don't know why, I have to return something.

    $(".router").click( (e) => {
        e.preventDefault()
        var href=$(e.target)[0].attributes.href
        url = href.value
        if (anchor)
            url += anchor
        history.pushState({}, null, url)
        var query = new URLSearchParams( href.value )
        var route = query.get("route");
        ({
            "route1": () => { $(".content").hide(); $("." + route).show() },
            "route2": () => { $(".content").hide(); $("." + route).show() },
            "route3": () => { $(".content").hide(); $("." + route).show() },
        })[route]()
        console.log("route called:" + route)
        return true
    })
We are gonna emulate a legitimate click on an a element, so first we disable it.
We get the wanted url from looking at the source of truth : our own href.
anchor variable is a reference to the one parsed from the URL. If it exists we append it to the url that we push in the history.
We get the truth of the wanted route by parsing the href value of clicked element, and with a dispatch table we call the route. Then, we push in the history like a legitimate click does the URL that has been click making sure our subroute is the one specified.
I do cleanup that may be dead code of the anchor according to garbage that could be there.

and then I call with a dispatch table the subroute available.

And for eviting hogs, I don't know why, I have to return something.

    if (route == undefined ) {
        console.log("default route")
        $(".router.route1").click()
    } else {
        console.log('dealing with: ' +route +':'+ anchor)
        $(".router" + "." + route).click()
    }
Here we look that route called in the URL, if none is specified we decide a default route

    anchor = document.URL.match(/#[^\?]+/)
    if (anchor) {
        console.log("anchor detected in URL:" + anchor[0] + "route:" + route)
        $("." + route +"  ." + anchor[0].substr(1)).click()
        console.log("sub route called:" +anchor[0])
    }
    console.log("ready")
Just in case someone JUST modified the URL in a click action we check the information from the document.URL. And, if so we emulate a click on the subroute if an only if it is in a div of the correct route so people cannot mess by specifying a wrong route for a subroute in the URL.

And that's the all in one page with the trick.