Débutants : pourquoi le langage Python ?

J’ai fait cette traduction, vous pourrez trouver l’article d’origine ici.

Pourquoi Python ?

Par Eric Raymond

Le cardinal Biggles a gardé Eric au confessionnal pendant quatre heures avant d’entendre cette confession…
La première fois que j’ai dû me pencher sur Python… c’était par pur accident. Et je n’ai pas vraiment apprécié ce que j’ai vu à ce moment là. C’était début 1997, et le livre sur la programmation Python de Mark Lutz (O’Reilly & Associates) venait tout juste de sortir. Parfois les livres O’Reilly arrivent sur le pas de ma porte, en suivant un processus complètement aléatoire pour lequel j’ai abandonné tout essai de compréhension.
L’un deux était « Programmation Python ». Comme je collectionne les langages de programmation, j’ai trouvé cela intéressant. Je connais déjà une bonne douzaine de langage génériques, j’ai écrit quelques compilateurs et des interpréteurs pour le fun, et j’ai déjà designé quelques langages qui avaient des objectifs spécifiques et qui devaient suivre un certain formalisme. Récemment j’ai d’ailleurs écrit SNG, un langage écrit spécifiquement pour manipuler des images PNG (Portable Network Graphics). Les lecteurs intéressés peuvent regarder la page en question ici : http://www.catb.org/~esr/sng/. J’ai aussi écrit quelques implémentations de vieux langages, vous pouvez voir ça sur ma page du musée de la rétro-programmation (« Retrocomputing Museum page ») ici : http://www.catb.org/retro/.
Concernant Python, j’avais juste entendu que c’était un langage de « scripting », donc un langage destiné à écrire des scripts, avec son propre gestionnaire de mémoire intégré, et de grandes facilités pour appeler et coopérer avec d’autres programmes. Je me suis donc plongé dans « La Programmation Python » avec une idée bien précise en tête : que fait Python que Perl ne peut pas faire ?
Perl, bien sûr, était le poids lourd des langage modernes de scripting (NDT : c’était en 2000). Il est souvent devenu le langage de prédilection pour les administrateurs système en lieu et place du langage de scripting shell, souvent grâce à sa librairie UNIX et ses appels système, et aussi grâce à sa collection énorme de modules Perl construits par une communauté Perl très active. En 2000, ce langage est estimé être à l’origine de 85% du contenu « live » que l’on peut trouver sur le Net. Larry Wall, son créateur, est souvent considéré, à juste titre, comme l’un des leaders les plus importants dans la communauté Open Source, et apparait souvent en troisième place derrière Richard Stallman, et Linus Torvalds dans le panthéon des hackers demi-dieux.
A cette époque, j’avais utilisé Perl pour plein de petits projets. J’avais trouvé ce langage assez puissant, même si la syntaxe et quelque autres aspects de ce langage semblaient rebutants. Je pensais que Python avait un sacré chemin à faire en tant que nouveau langage de script, et au moment où j’ai commencé ma lecture, je me suis intéressé d’abord à ses aspect qui le rendaient unique.
J’ai fait immédiatement un mauvais trip sur la première chose que tout le monde remarque quand on lit un script Python pour la première fois : le fait que les espaces (= l’indentation) signifie quelque chose dans la syntaxe du langage. Ce langage n’a aucun délimiteur du type des crochets que l’on trouve en C ou en Perl ; au lieu de cela, les changements dans l’indentation délimitent naturellement les groupes. Et, naturellement, comme la plupart des hackers, lorsque j’ai réalisé cet état de fait, je suis retombé immédiatement dans une phase de dégoût.
Je suis suffisamment vieux pour avoir programmé en FORTRAN dans les années 1970. Au jour d’aujourd’hui, personne – ou presque – ne l’a jamais fait, mais le fait de l’avoir fait a mis en tête à ceux qui ont dû « subir » ça, quel point il est énervant de pratiquer le principe de « champs prédéterminés ». En fait, le terme « formatage libre » utilisé pour décrire le nouveau style de langage orienté « mot-clé », par exemple en Pascal et en C, a presque été oublié ; c’est parce que tous les langages d’aujourd’hui sont basés sur ce principe. Enfin presque tous. C’est difficile de blâmer quelqu’un, si, lorsqu’il voit un code Python, réagit comme s’il avait marché dans une bouse de dinosaure.
C’est un peu ce que j’ai ressenti. J’ai alors lu le reste de la description du langage, sans trouver quelque chose d’autre d’intéressant. Je n’y voyais aucune raison de recommander Python, à part le fait peut-être que la syntaxe semblait un peu plus claire que celle de Perl et qu’il semblait plutôt facile de créer des éléments d’interface utilisateur (« GUI elements ») tels que les boutons et les menus.
J’ai remis le livre sur l’étagère, en pensant qu’il faudrait que je me fasse un petit projet orienté GUI en Python, juste pour m’assurer que j’avais bien compris les fondements du langage. Jamais je n’aurais cru que ce que j’allais voir éclaterait littéralement la compétition avec Perl.
C’est à ce moment là qu’une conspiration de choses inutiles à faire s’est organisée autour de moi, et j’ai mis la priorité de « Test Python » tout en bas de la liste des choses à faire. Cela dura plusieurs mois. Entretemps j’ai même écrit le livre « The Cathedral and the Bazaar ». Mais j’ai tout de même trouvé le temps d’écrire quelques programmes en Perl, dont deux assez gros et complexe. L’un deux, « keeper », est un assistant qui est encore utilisé (NDT : en 2000) lors de soumissions de nouveaux fichiers qui arrivent au gestionnaire d’archives du laboratoire Metalab. Il génère les pages web que vous pouviez voir à metalab.unc.edu/pub/Linux/!INDEX.html. L’autre, « anthologize », était utilisé pour générer automatiquement la documentation PostScript de la sixième édition de l’archive des HowTos du Projet de Documentation Linux. Ces deux programmes sont disponibles à Metalab.
Écrire ces programmes en Perl m’a laissé progressivement un gout amer. Les gros projets semblaient transformer les petites choses ennuyeuses de Perl en problèmes sérieux et récurrents. La syntaxe qui parait simplement un peu excentrique au début, se transforme au bout de plusieurs centaines de lignes en une jungle vierge pratiquement impénétrable, et je ne vous raconte pas quand il s’agit de milliers de lignes. La maintenance devient exponentielle en fonction du nombre de lignes de code. Beaucoup de ces problèmes ont été résolus en ajoutant des patches à Perl (objets, variables locales, « use strict », etc.), mais cela m’avait bien refroidi.
De plus, la résolution de bogues, déjà anormalement difficile à résoudre, se transformait en mission presque impossible si on s’absentait quelques jours pour faire autre chose. Plus le temps passait, plus je me battais avec les problèmes du Perl au lieu de me pencher sur les problèmes de l’application proprement dite. Le pire de tout, c’est que le code devait être sale. C’est simple : des programmes laids et sales sont comme des ponts suspendus : ils ont beaucoup plus de chances de s’effondrer que des ponts classiques, parce que la manière dont nous percevons la beauté (particulièrement les ingénieurs) est intimement reliée à notre capacité de gérer et de comprendre la complexité sous-jacente. Un langage qui empêche, de par sa nature, d’écrire un code élégant, empêche aussi d’écrire un bon code.
Avec une expérience d’une vingtaine de langages dans mes valises, je pouvais distinguer tous les petits signes qui me disaient que j’avais poussé tel ou tel langage jusqu’à ses propres limites. A la mi-1997, je me disais « il doit y avoir une meilleure solution ». Et je me suis mis à rechercher un langage de scripting plus élégant.
Je n’ai même pas imaginé replonger dans le C. Les jours où il semblait censé d’écrire ses propres allocations mémoire et son propre gestionnaire d’allocations sont largement révolus, mis à part certaines niches de développement comme l’écriture de code pour le noyau, le graphisme 3D, bref, des endroits où on doit gagner un maximum de temps machine et par là même un contrôle personnalisé de l’utilisation mémoire.
Dans toutes les autres situations, il est impensable d’imaginer passer du temps en plus, à déboguer les débordements de buffer (buffer overruns), la mauvaise gestion des pointeurs, les fuites mémoire générées par les malloc/free et tous les autres inconvénients liés à cela. C’est bien mieux de se dire que la machine va mettre un peu plus de temps et que le programme va consommer un peu plus de mémoire, et économiser sur le facteur humain. C’est d’ailleurs cette stratégie qui a conduit à l’explosion de Perl vers le milieu 1990.
J’ai commencé par tester Tcl, et j’ai rapidement découvert que c’était encore pire que Perl. Le vieux LISPer que je suis s’est alors penché sur les variantes de Lisp et Scheme, mais comme cela l’a été depuis le début pour Lisp, même un bon design est rendu complètement inutile s’il n’existe aucune documentation (ou très peu) sur les liens POSIX/UNIX, et si la communauté est très faible et, de plus, fragmentée. Si Perl est devenu populaire ce n’est pas par accident. La plupart de ses compétiteurs étaient simplement plus mauvais.
La seconde fois où je me suis penché sur Python était aussi accidentelle que la première fois. En octobre 1997, j’ai reçu plein de questions sur « fetchmail », la plupart venant d’utilisateurs basiques, qui montraient clairement qu’ils avaient des difficultés à générer des fichiers de configuration pour mon utilitaire « fetchmail ». La configuration du programme utilise une syntaxe classique, du style UNIX, mais peut devenir extrêmement compliquée à partir du moment où un utilisateur a des comptes POP3 et IMAP sur plusieurs sites. Par exemple, voici un fichier de configuration : Listing 1.
J’ai alors décidé d’écrire un éditeur facile à appréhender, pour aider à la configuration : « fetchmailconf ». L’objectif était clair : cacher complètement la complexité de la syntaxe derrière une interface utilisateur simple, claire et conviviale, avec des boutons de sélection, et des fiches simples à remplir.
Rien que l’idée de faire ça en Perl me faisait peur. J’avais déjà vu du code GUI en Perl, et c’était un vague mélange de Perl et de Tcl qui était encore plus laid au final que mon propre code Perl. C’est à ce moment là que je me suis souvenu de Python, que j’avais à peine survolé six mois auparavant. C’était le moment ou jamais.
Bien sûr, l’objectif allait sûrement tester sévèrement mes compétences en tant que personne inexpérimentée dans ce langage. La première chose que j’ai revue était cette fameuse indentation. Cette fois néanmoins j’ai passé outre, et j’ai commencé à taper un code grossier pour faire quelques éléments GUI. Aussi bizarre que cela puisse paraitre, après une vingtaine de minutes, ce procédé d’indentation ne m’a plus du tout paru anormal. J’ai juste indenté comme je l’aurais fait en C, sans me poser plus de question, et ça a fonctionné.
C’était ma première surprise. La seconde est venue après plusieurs heures de codage du projet, lorsque j’ai remarqué durant mes « va-et-viens » entre le programme et le livre sur Python, que j’écrivais du code pratiquement aussi vite que je le tapais. Lorsque j’ai réalisé cela, j’ai été comme électrifié. Si on y pense bien, une grosse partie de l’effort du codage correspond à tous les moments où lorsqu’on veut résoudre un problème, cette résolution ne s’écrit pas comme on se la représente mentalement. Et on met toujours beaucoup de temps à réaliser que ce que l’on a écrit ne correspond pas forcément à la résolution du problème. Ce principe aide énormément à mesurer la qualité d’un langage : lorsque vous apprenez un langage, combien de fois il vous a fallu ré-écrire une portion de code tant que vous ne connaissiez pas bien ce langage.
Lorsque vous écrivez un code qui fonctionne presque aussi vite que vous le tapez, vous ne revenez pratiquement jamais en arrière, et en général cela signifie que vous maitrisez parfaitement ce langage. Mais ce n’était pas du tout logique, parce que c’était mon premier jour de Python et je faisais régulièrement des pauses pour regarder, dans le livre, les appels à faire aux différentes librairies !
C’est le premier indice qui m’a fait penser que Python avait un design exceptionnellement bon. La plupart des langages ont des spécificités et des choses si particulières à apprendre qu’il faut toujours énormément de temps avant de pouvoir bien les maitriser. Python était le premier langage qui invalidait ce principe.
J’ai mis très peu de temps avant de comprendre des particularités. J’ai écrit « fetchmailconf », avec GUI, en six jours, dont deux ont été utilisés pour apprendre Python lui-même. Cela reflète une autre propriété utile de ce langage : il est compact. Vous pouvez avoir toutes ses caractéristiques facilement et rapidement en tête (tout au moins son concept et ses librairies de base). C est un langage connu pour être compact. Perl est connu pour ne pas l’être. On a beau dire ce qui a fait le succès de Perl : « Il n’y a pas qu’une seule manière de l’écrire », dans tous les cas, ce n’est jamais concis.
Le moment le plus dramatique de ma découverte était encore à venir. Mon design avait un problème : il était facilement possible de générer un fichier de configuration, mais après, lorsqu’il fallait mettre les mains dans ce fichier de configuration on retombait à nouveau dans le problème d’origine.
Le parseur du fichier de configuration de « fetchmail » est plutôt élaboré. Pour tout dire, il est écrit en YACC et Lex, deux outils classiques UNIX qui sont utilisés pour générer le code C d’un parseur. Pour que « fetchmailconf » puisse éditer des fichiers de configuration existants, je me suis dit que je devais faire un parseur fonctionnant à l’identique en Python. Je n’en avais pas du tout envie, d’une part à cause de tout le travail que cela impliquait, et d’autre part parce que je n’étais pas sûr que les comportements allaient être de manière fiable absolument identiques. C’était bien la dernière chose dont j’avais besoin : du boulot supplémentaire pour tenir à jour deux parseurs en même temps lors des futures évolutions de « fetchmail ».
Ce problème m’a bloqué pendant quelque temps. Puis j’ai eu une inspiration subite : je vais laisser « fetchmailconf » se servir du parser de « fetchmail » ! J’ai alors ajouté l’option –configdump à « fetchmail » afin qu’il puisse parser un fichier « .fetchmailrc » et en sortir un fichier sous la forme d’un initialiseur Python. Voici un exemple de fichier qu’il était possible de sortir : Listing 2 (pour gagner de la place un peu d’information pas liée au sujet a été supprimée).
Python pouvait évaluer la sortie de la commande « fetchmail –configdump ».
Ce n’est pas fini ! Je ne voulais pas que « fetchmailconf » puisse lire la configuration courante, mais je voulais la transformer en arbre d’objets dynamiques. Il devait y avoir trois types d’objets dans cet arbre :

  1. Configuration (l’objet de plus haut niveau qui représente toute la configuration)
  2. Site (objet qui représente entièrement l’un des sites)
  3. User (les données d’un utilisateur particulier rattachées à un site)

Le fichier d’exemple précédent décrit cinq objets « Site », chacun ayant un objet « User » rattaché à lui.
J’avais déjà écrit ces trois classes d’objets (c’est ce qui m’a pris quatre jours, pendant lesquels j’ai surtout passé du temps à mettre les objet GUI à la bonne place). Chaque classe avait une méthode qui pouvait faire surgir un pop up d’édition qui éditait les données de l’objet proprement dit. Il ne me restait plus qu’à transformer les données lues d’origine en objets réels.
J’ai tout d’abord imaginé écrire du code qui connaitrait les informations de chaque classes et utiliserait ces connaissances afin de faire une correspondance, mais j’ai rapidement oublié cette idée, parce qu’en imaginant ajouter des nouveautés il y aurait des problèmes de compatibilité.
Ce que je voulais vraiment c’était un code qui analyserait la forme et les membres de l’initialiseur, en demandant directement au code qui définissait les classes, et qui s’ajusterait automatiquement afin de faire concorder les données d’un côté et les objets de l’autre.
Ce genre de choses est appelé « bidouille de méta-classes » (« metaclass hacking ») et est souvent considéré comme quelque chose d’ésotérique et d’effrayant (de la magie noire). La plupart des langages « orienté-objet » n’ont pas cette capacité ; pour ceux qui le peuvent (Perl y compris), cela a tendance à rendre le code plutôt complexe et dur à appréhender. J’avais déjà été impressionné par la rapidité d’apprentissage de Python mais là on arrivait à un vrai test. Quelle complexité de code est-ce que cela allait engendrer ? Je savais par expérience que cela allait être difficile, et même en arrivant à mes fins, le résultat allait être sale. J’ai tout de même pris le livre et je me suis penché sur les capacités Python concernant les méta-classes. La fonction résultat est dans le Listing 3, et le code qui l’appelle est dans le Listing 4.
Ça n’a pas l’air super compliqué soi-disant pour de l’affreuse magie noire, pas vrai ? Trente deux lignes en comptant les commentaires. En sachant juste ce que j’ai dit sur la structure de la classe, le code appelant est compréhensible. Mais ce n’est pas la taille qui est vraiment impressionnante. Tenez-vous bien : il m’a fallu quatre-vingt-dix minutes pour écrire ce code, et il a fonctionné correctement la première fois où je l’ai testé.
Dire que j’étais épaté est un euphémisme. Rien que le fait d’avoir un code qui fonctionne dès la première écriture est déjà remarquable en soi ; mais en plus, c’était ma première bidouille avec des méta-classes, six jours après avoir appris le langage ! Même en essayant d’imaginer que je suis un sacré bon hacker, ça n’en resterait pas moins une preuve vivante de la clarté, de la concision, et de l’élégance du design de Python.
C’est bien simple : il n’y a aucune possibilité simple de faire cela en Perl, même avec mon expérience plutôt poussée avec ce langage. C’est à ce moment là que j’ai réalisé que c’en était fini de Perl.
C’était un moment très intense. Bon, j’avoue qu’avec du recul, on peut juste constater que ce n’était qu’une bidouille subtile et élégante rendue possible grâce la souplesse de Python. L’utilité à long terme d’un langage ne se trouve pas que dans la possibilité, justement, de faire des bidouilles subtiles, et élégantes, mais aussi dans l’utilité qu’on a du langage au jour le jour. Le travail au jour le jour ne consiste pas qu’à écrire de nouveaux programmes, mais principalement à en lire et à en modifier des existants.
La vraie conclusion de cette anecdote est celle-ci : plusieurs mois après avoir écrit « fetchmailconf », je pouvais toujours lire et comprendre mon code sans avoir de gros effort de concentration pour tout comprendre à nouveau. Je stresse déjà rien qu’en imaginant avoir à replonger dans le code de « keeper » ou « anthologize » à nouveau, mais « fetchmailconf » ne pose aucun problème.
Perl a toujours son utilité. Pour des petits projets (100 lignes ou moins) qui impliquent énormément de filtres de texte (« pattern matching »), je pense que je pencherai peut-être vers une bonne expression régulière Perl plutôt que du code Python. En regardant les scripts « timeseries » et « growthplot » Perl de la distribution « fetchmail », je peux dire que ce sont presque des choses qu’on pourrait faire en utilisant une bonne combinaison de awk/sed/grep/sh. Pour tout le reste, je préfère de loin les vertues de Python, je pense que si vous testez, vous en arriverez certainement à la même conclusion.

Incroyable talent : Ukraine : Kseniya Simonova, hallucinant

La vidéo ci-dessous montre le vainqueur de l' »Ukraine’S Got Talent », Kseniya Simonova, 24 ans, le dessin d’une série de photos sur une table de sable lumineux montrant comment les gens ordinaires ont été touchés par l’invasion allemande pendant la Seconde Guerre mondiale. Son talent, qui est certes étrange, magnétique est à surveiller.
Les images, projetées sur un grand écran, ont remporté le premier prix d’environ £ 75,000.
Elle commence par la création d’une scène montrant un couple assis se tenant les mains sur un banc, sous un ciel étoilé, mais des appareils de combat…
Dans la scène finale, une mère et l’enfant apparaissent à l’intérieur et un homme debout à l’extérieur, les mains pressées contre la vitre, en disant au revoir.
The Great Patriotic War, comme on l’appelle en Ukraine, a abouti à un quart de la population tué avec huit à 11 millions de morts sur une population de 42 millions.
Kseniya Simonova dit: « Je trouve ça assez difficile de créer de l’art en utilisant du papier et des crayons ou les pinceaux, mais en utilisant du sable et des doigts me dépasse. L’art, surtout quand la guerre est utilisée comme le sujet, apporte même quelques membres du public aux larmes. Et il on ne peut pas faire de plus beau compliment ».

Pianos numériques : le Casio LK230 et du Yamaha DGX 630

Voilà mon objectif d’origine : m’amuser rapidement avec le piano.
J’ai commencé, je voulais des touches lumineuses, uniquement pour apprendre « visuellement » sans me poser trop de questions.

http://www.casio-europe.com/fr/emi/specials/keylighting/

Et puis j’ai vu le LK230

http://www.casio-europe.com/fr/emi/lightguided/

J’ai commencé un peu à jouer et là beurk au bout de deux jours j’en pouvais plus, parce que le système d’apprentissage est qu’il joue l’intégralité de la chanson avant que vous puissiez essayer. Complètement inefficace comme méthode. Et le second truc très gênant c’est que les touches ne sont pas sensibles. C’est à dire que si vous tapez lentement ou vite, le son qui sort est exactement le même. Je l’ai ramené au vendeur et j’ai pris le modèle au dessus : le LK270.
Là, la méthode est beaucoup plus « cohérente », avec vraiment les chansons découpées en morceaux et tant que vous n’avez pas joué le morceau correctement vous recommencez.
Après avoir appris 4-5 chansons, je commence à m’en lasser, parce que sur tout le répertoire (152), il n’y en a qu’une trentaine de vrai piano (quand j’entend « vrai piano » c’est que vous pouvez jouer tout seul, il n’y a pas besoin d’accompagnement), le reste c’est du synthé, de l’orgue, bref, des airs connus mais pas de piano seul. Et sur la trentaine restant sur les 152, il ne faut pas rêver beaucoup sont très difficiles voire injouables : il y a même 4 chansons pur piano catégorie « E » sachant que débutant = « A » et « E » = limite impossible (avec mes longs doigts j’arrive à faire certaines notes que je pense sincèrement impossibles chez les personnes qui ont des petites mains, donc ces chansons sont à éliminer d’office chez la majorité des gens).
Je vais donc chez le marchand, j’achète un livre « chansons connues adaptées pour piano » (2-3 chansons) et j’arrive à la maison et que vois-je ? Bah je constate que j’y comprends rien. Oui je suis un gros nOOb du piano !

Je retourne chez le marchand, j’achète un livre d’apprentissage : « Le piano pour les nuls ». Très bien, très marrant, très didactique, bref, je commence à apprendre le solfège petit à petit. Et puis je comprends les notes, et là que vois-je ?

Errrrg ! Le piano ne fait que 61 touches ! Tous les pianos classiques font 88 touches ! Donc : on ne peut jouer rien d’autre que les partitions + chansons d’origine du piano, ou bien, il faut se casser la tête à « adapter » les autres chansons qu’on peut récupérer sur Internet.

Alors vraiment je m’en tape de leur pub aussi stupide qu’inutile : l’arpégiateur, l’éditeur de rythme, le Music Challenge (il faut l’avoir essayé pour voir à quel point ça sert à… rien), bref, plein de trucs inutiles quand on veut jouer du piano et que du piano (quand on lit « La musicothèque contient 305 préréglages « One Touch » inspirés de morceaux pop rock populaires. » c’est inutile de mon point de vue, je veux pas chanter de l’Oasis ou du Blur hein…).

Bon bref : je retourne au magasin de musique, et j’essaie les pianos, ça fait 4-5 fois que je m’arrête et que j’essaie… Et vraiment, je peux de moins en moins supporter mon piano. Pourtant je l’ai payé dans les 300 euros…
Disons que le prix minimum d’un piano correct, d’après ce qu’il me semble, tourne autour de 500-600 euros neuf, peut-être moitié prix d’occasion…

Voilà mes conseils de gros débutant : ce à quoi il faut faire attention :

  • les touches lumineuses, ça n’est qu’un argument commercial, en pratique c’est très bien au début mais on s’en lasse vite, donc n’y faites pas attention (ça aurait été super si (1) le piano avait 88 touches, (2) il y avait d’autres musique « pur piano » à récupérer sur Internet) ;
  • 88 touches ;
  • une méthode d’apprentissage correcte dans le piano si vous voulez apprendre (il faut se renseigner) ;
  • des touches « sensibles » (minimum 2 niveaux de sensibilité + aucune sensibilité = total de 3 niveaux minimum) ;
  • l’éclairage : si l’écran de votre piano est un LCD ancien (comme les vieux jeux électroniques), il faut être sûr d’avoir un bon éclairage indirect, sinon, comme moi, avec une seule et unique lampe au plafond, c’est vraiment gênant et il faut un écran retro-éclairé ;
  • enfin la qualité des touches : fais des tests chez les marchands, essayez une fois, partez, revenez le lendemain, ré-essayez, et faites ça 2-3 jours. A la fin vous réaliserez quel est le piano sur lequel vous avez envie de jouer. Je ne parle pas de rester sur des grands pianos trop chers qu’on ne peut pas s’offrir, mais vraiment juste parmi ceux qu’on peut se payer : c’est pas forcément le plus cher qu’on apprécie le plus… et si on achète un piano qui n’a même pas le minimum voulu, vous allez finir comme moi… à savoir… un peu dégoûté…


Avec du recul, si j’avais su, j’aurais investi 600 euros quitte à payer en plusieurs fois, parce que je suis loin d’être riche, pour une simple raison : à ce niveau de prix, pour le double du prix, vous avez bien plus que le double de la qualité. Un piano de 600 euros est incomparablement mieux qu’un à 300. Pour être plus explicite, la différence entre 600 et 1200 euros est bien plus faible (toujours de mon point de vue de gros gros débutant) qu’entre 300 et 600…

Linux Shell : exemple de grep et expressions régulières

Ci-suivent des exemples de grep qui fonctionnent.
Je veux très souvent lister tous les fichiers php / htm / Javascript. J’ai deux possibilités :

  • find . | grep -E '(php|htm|html|js)$' | more
  • find . | grep '\(php\|htm\|html\|js\)$' | more

Je veux aussi souvent chercher parmi tous mes fichiers de mon site Internet, lesquels contiennent un mot particulier. Prenons par exemple le mot « Internet ». J’ai deux possibilités :

  • find . | grep -E '(php|htm|html|js)$' | xargs grep Internet
  • find . | grep '\(php\|htm\|html\|js\)$' | xargs grep Internet

Je le note parce que je ne comprenais pas pourquoi ce qui suit ne fonctionnait pas :
find . | grep '(php|htm|html|js)$' | xargs grep Internet

C’est tout simplement que par défaut (je ne sais pas si c’est le fait de mettre des quotes (« '« )) qui y fait, mais grep considère que ce qui est passé ainsi doit être cherché littéralement, et donc il ne ressortira que les fichiers dont le nom contient ces caractères : « (php|htm|html|js)« … ce qui n’est pas le but recherché. Mes exemples précédents, eux, fonctionnent correctement.

En espérant que cela serve à quelqu’un un jour !

Vie de merde : les modérateurs sont aussi incompétents que le site est plein de fausses histoires.

Mon compte a été modéré parce que j’ai fait des commentaires trop directs. Ce site sent les histoires totalement bidons à plein nez.
Bien évidemment, personne n’a la possibilité de vérifier la véracité des choses…

Allez je poste le lien sur lequel j’ai été modéré : ici.
Et l’autre lien : ici.

Bonjour MonsieurQuiFaitDesMauvaisCommentaires,

Le commentaire suivant a été modéré car il ne respectait pas la charte du site :

——————–
Ci suit mon commentaire :

Uriner devant un TGV et alors ? Fille ou pas, le train passe et qui vous prendra en photo ou autre ? Ni VDM, ni TLBM. Il faudrait une troisième option : « VDM bidon » pour qu’il soit éjecté naturellement des trucs intéréssants à présenter sur le site.

——————–
Lien : http://www.viedemerde.fr/inclassable/3849766#c_5193892

Note du modérateur : Gardez vos commentaires désobligeants pour vous. Les VDM publiées ont été plébiscitées par les lecteurs du site qui sont les premiers à les lire dans l’espace « Modérez les VDM ». Ensuite, c’est notre équipe qui fait un choix. La sélection des VDM se fait donc de façon démocratique et les anecdotes qui sont validées ont une certaine légitimité à l’être. Chacun a son humour et il y a assez d’histoires sur le site pour que vous puissiez éviter d’être désagréable sur celles qui ne vous font pas rire.

Viedemerde.fr est un site ouvert à tous et sur lequel chacun a le droit de s’exprimer. Pour que tous les échanges, même les plus animés, demeurent corrects et respectueux et afin de conserver un site agréable à visiter, il est de notre devoir à tous de suivre quelques règles évidentes.

Merci de votre compréhension.

Et la seconde modération arrive :

Bonjour MonsieurQuiFaitDesMauvaisCommentaires,

Le commentaire suivant a été modéré car il ne respectait pas la charte du site (mise en doute de la véracité de la VDM) :
——————–

Moi non plus. On raconte vraiment n’importe quoi dans VDM et le pire c’est que les modos valident. Même ma fille de 4 ans me demande de bien me frotter les pieds parce que « la neige ça fond et elle veut pas d’eau dans sa chambre »… vraiment du gros n’importe quoi. J’ai déjà fait une proposition et je la refais : ajouter un troisième choix en plus de TLBM / VDM : « Gros fake improbable ».

——————–
Lien : http://www.viedemerde.fr/inclassable/3839632#c_5193952

Il s’agit là de notre second avertissement, tous avertissements confondus et nous souhaitons attirer votre attention sur le fait que ne pas respecter la charte du site entraîne une gêne réelle pour les autres visiteurs du site. Par conséquent, à cet avertissement s’ajoute un bannissement temporaire de votre compte pour une durée de 7 jours à compter de l’envoi de cet e-mail.

Une fois la période de bannissement achevée, votre compte sera réutilisable, comme avant. Si vous ne recevez pas de nouvel avertissement dans les deux mois à venir, celui-ci s’effacera automatiquement de votre compte. Par contre, si vous venez à être averti(e) à nouveau pour le même motif ou pour un commentaire hors charte, le bannissement sera alors définitif.

Attendez je n’ai pas assez surligné le passage :

Le commentaire suivant a été modéré car il ne respectait pas la charte du site (mise en doute de la véracité de la VDM)

Vous savez sur quel commentaire j’ai dit que le truc était complètement faux, né de l’imagination (fertile) d’une personne ? Voilà le truc :

Aujourd’hui, il y a eu une petite inondation dans mon salon. Un radiateur qui a fui ? une tempête ? Non, seulement l’idée lumineuse de mon fils de seize ans de faire un bonhomme de neige à l’intérieur.

Et des gens pensent que c’est vrai ? Je rêve !

ExtJs : comment accéder aux variables GET ?

Avec la librairie ExtJs, Comment accéder aux variables GET qui sont dans l’URL ?

Cet article s’inspire de la discussion dans ce forum ici.

Il vous suffit de déclarer une fonction de Ext, par exemple :

Ext.getUrlParam = function(param) {
    var params = Ext.urlDecode(location.search.substring(1));
    return param ? params[param] : params;
};

Et ensuite, de l’appeler de cette façon :

var param = Ext.getUrlParam('ident');
if (param=='test') {
    alert('ok');
}

Pour tester si ce code fonctionne, il suffit de le mettre dans une page qui contient la librairie ExtJs, et de l’appeler avec le paramètre ‘test‘. Par exemple, si votre page s’appelle monexemple.php, il vous faudrait la tester ainsi : http://www.localsite/monexemple.php?ident=test.

Pour la note, j’utilise la librairie JavaScript ExtJs et j’apprends à m’en servir. Je suis actuellement en pleine découverte de ses possibilités, et elles sont grandes.

Accéder à des variables $_POST en Javascript?

Question : est-il possible d’accéder à des variables $_POST en Javascript ?

Réponse simple et directe : non.

Pourquoi ? C’est simple : la variable POST est quelque chose qui est envoyé par le client, pour le serveur. C’est le client qui l’envoie. Il est possible, avant d’envoyer un formulaire au serveur, de regarder est sur le point de partir. On peut le faire notamment en JavaScript, ou faire d’autres manipulations, mais on ne recevra jamais côté client des variables de formulaire dans un POST.

Windows Vista : Apache : quand php ne charge pas le fichier php.ini

Votre fichier « php.ini » n’est pas chargé au démarrage d’Apache sous Windows Vista ?

Pas de problème. C’est très simple. Éditez votre fichier Apache de configuration, habituellement httpd.conf.
Juste avant la ligne de directive qui dit de charger le module Apache, il faut ajouter la directive PHPIniDir "C:/PHP" qui précise où doit se situer le fichier php.ini.

Exemple :

PHPIniDir "C:/PHP"
LoadModule php5_module "C:/PHP/php5apache2_2.dll"

Je ne vous parle pas de l’autre méthode moins efficace : lancer Notepad en tant qu’administrateur, ouvrir le fichier php.ini puis le sauver sous le répertoire C:\Windows (c’est le répertoire de configuration par défaut de php).
Je viens de passer plus de deux heures complètes avant de réussir ce qui me prend en temps normal, sur Linux et Windows XP, 5 minutes. Décidément, Vista est vraiment de la daube sous tous les points de vue.

Linux : changer les droits que sur des répertoires et sous répertoires

Voilà le problème :

Vous voulez mettre des droits en lecture uniquement sur tous les fichiers mais laisser le droit "x" sur les répertoires.

Voilà la solution la plus simple que j’ai décomposée volontairement pour être plus clair :

  1. Supprimer toutes les autorisations :
    chmod -R 0 ./*
  2. Ajouter les autorisations en lecture pour tout le monde :
    chmod -R ugo+r ./*
  3. Ajouter les autorisations en écriture uniquement pour le possesseur des fichiers :
    chmod -R u+w ./*
  4. Et la petite astuce pour que les autres puissent lire les répertoires et sous-répertoires :
    Appliquer le "x" uniquement sur les répertoires et sous répertoires (et pas sur les fichiers) :
    find . -type d | xargs chmod ugo+x

En résumé, copiez collez cette ligne :
chmod -R 0 ./* && chmod -R ugo+r ./* && chmod -R u+w ./* && find . -type d | xargs chmod ugo+x

Et vous aurez pour tout le monde le droit en lecture des répertoire et sous répertoires et le droit en écriture uniquement donné à l’utilisateur courant.
Attention : il n’y aura pas de fichier exécutable, car les autorisations "x" seront enlevées.

Inès et ses blagounettes de fillette de 3 ans et demi…

Avant que j’oublie il faut que je mette à plat ces trois anecdotes :

  • Un soir, Inès rentre de l’école et nous chante une chanson : « qui se cache derrière mon dos, ce sont mes petites mains coquines, qui se cache dans mes chaussures, ce sont mes petits pieds coquins… »… et le soir arrive et moi comme à mon habitude, je chante ses chansons en modifiant les parole, exprès pour la faire râler, et elle me corrige systématiquement avec la phrase « naaan papa c’est pas ça ! ». Donc je commence à chanter « qui se cache dans mon p’tit nez », et là elle reprend : « c’est mes p’tits loulous coquins »… une bonne partie de rigolade !
  • Le lendemain on voit le Best Of Les Nuls sur Canal+ et on voit la parodie de Jacques Martin, avec une petite fille qui sort plein de trucs pas sympas pour Jacques mais ça fait rire… le lendemain, je croyais qu’elle avait oublié, je l’amène faire la sieste et là, comme elle ne voulait pas faire la sieste elle se met à me crier dessus comme la petite fille de Jacques Martin : « et puis de toute façon tu sens pas bon de la bouche ! »… Sur le coup j’ai tellement été surpris que ça m’a fait rire… bon j’ai quand même vérifié… je n’avais pas mauvaise haleine non mais !
  • Enfin dernière petite chose : Sandrine achète des Kinders, il y en avait quatre dans la boite. Elle dit à Inès « je ne prends qu’une boite, tu la partagera avec Lila, vous en aurez un chacun ». Et Inès réfléchit, regarde Sandrine et lui dit « mais non ! On en aura deux chacun : »… que dire de plus ?