J’ai testé pour vous : l’Italie !!!

Depuis le temps que l’idée me trottait dans la tête, d’autant plus que le pays regorge de magnifiques spots urbex … j’ai fini par me laisser tenter. Laissez-vous guider dans ce premier trip qui ne sera pas le dernier. L’Italie ça se savoure plus d’une semaine. D’ailleurs à propos de savourer …

La gastronomie : OUI, OUI et OUI !

La gourmande que je suis sait qu’elle va dans un pays dont la réputation n’est plus à faire. Je me suis fait une raison au Royaume-Uni (on n’y va pas pour ça, certainement pas, quoique le saumon d’Ecosse est à si bas prix que c’est un crime de s’en priver). J’ai été intriguée positivement par l’Allemagne, déçue par la Tchéquie qui vous concocte des plats trop bourratifs. Mais là on est en Italie. Les pâtes, la pizza sont des valeurs sûres. Les gelati, rien de mieux pour satisfaire un petit creux. Pour les amateurs de vins, le Chianti et le Prosecco sauront amadouer vos papilles. Mais vous découvrirez aussi les caloni, les suppi et autres arancini … Même en détestant le fromage, je n’ai pas hésité à ajouter du parmesan sur mes macaroni !!! Mama miaaaaaa !

Le lèche-vitrines en Italie, où tu as vraiment envie de lécher la vitrine !

Milan : NON, NON et NON.

Milan, c’est la grosse métropole bien corsée, pire que Paris. Nid à touristes bien condensés, c’est compliqué. Les cars de visite sont même les plus désorganisés que je n’ai jamais vus.
Les autochtones y sont revêches, peu avenants, pas souriants.
Les restaurants vous font payer une fortune, et y ajoutent volontiers par-ci par là des taxes venues d’on ne sait où.
Visiter la cathédrale « El Duomo » est un parcours du combattant et on n’est pas mécontent de quitter la ville. Qui a du potentiel, une beauté sûre, mais tout cela est gâché par une agitation permanente. La seule raison pour laquelle j’ai voulu y aller, était pour l’urbex. Vous y trouverez des spots de choix. Mais n’y passez pas votre vie.
Veni, vidi, vici … Arrivederci Milano.

ça grouille, impossible de faire une belle photo.

Rome : Un autre univers …

Ma maman me dit toujours qu’à ses yeux Rome est la plus belle ville du monde, et en parle avec les yeux qui brillent. J’allais tester ça !

Un peu frileuse en embarquant dans le train, pour le coup, je ne voulais pas être déçue. Mais c’est une toute autre atmosphère qui vous attend. Arrivée à Rome, je me promène un peu dans la gare, et ses stands gastronomiques qui n’hésitent pas à vous faire goûter leurs produits. Vous avez déjà un avant-gout de ce qui vous attend : vous allez vous ré-ga-ler !

Rome a beaucoup moins ce côté métropole, et pour cause, le centre-ville est parsemé par-ci par là de ruines historiques qui lui donne ce charme tellement typique de la Dolce Vita.

Déjà, les habitants sont beaucoup plus chaleureux. Vraiment, promenez-vous, voire perdez-vous, dans les petites ruelles où les maisons sont orangées, ça sent bon les fleurs et les bons petits plats. Et regardez les gens, ils se voient, ils crient leur amitié et se serrent dans les bras ! On est obligé de visiter avec le sourire, tout est prétexte à la bonne humeur, à l’émerveillement (à part le métro).

Rien à dire, c’est beau. Majestueux. Bellissimo.

N’hésitez pas à vous promener dans le Vieux Rome de nuit, côté Colisée / Forum, c’est tellement magnifique que j’en ai eu les larmes aux yeux, vraiment, j’ai pleuré d’émotion. C’est doux, c’est beau, on s’y sent en sécurité, même en étant une femme seule. C’est la Dolce Vita à l’état pur !

Niveau gastronomie, on retrouve des prix raisonnables. Les restaurants sont bons marché. La pizza est surprenante quand on la compare à celles de chez nous. Elles sont toutes fines, simples, sans chichis, de la tomate, un accompagnement, du fromage, et basta ! Mais molto bene

Buon appetito !!! (Pizza aux pepperoni)

Certains restaurants optent pour l’originalité dans leur design :

Bien entendu, on ne peut visiter Rome sans faire un tour à la Cité du Vatican et au Colisée, ainsi que le Forum, et je ne peux vous recommander que d’utiliser des billets coupe-file car il y a vraiment du monde. Et optez pour des visites guidées pour compléter vos notions d’Histoire. Et y aller tôt le matin, c’est mieux ! Message aux ochlophobes (dont je fais partie) : la Chapelle Sixtine est somptueuse mais oppressante de par la foule, les consignes y sont strictes qui plus est, préparez-vous à dompter votre stress.

Il y a des quartiers où il convient de ne pas circuler après 11 heures, comme du côté du Panthéon, rabattez-vous plutôt dans un des nombreux parcs, qui sont d’une beauté phénoménale (allez jeter un œil au jardin botanique, surtout l’été). Car Rome est immense, vous allez marcher, marcher, pendant des heures, ce qui va vous aider à éliminer les calories de vos pizzas et de vos macaroni al ragu, ce qui tombe bien, car vous n’aurez pas de surprise sur la balance à votre retour (véridique).

Une surprise m’a attendue à la fin du séjour : un trolleybus en gare de Roma Termini.

Mon avis global

Milan, non, vous l’avez compris. Mais Rome m’a enchantée. Il y a tellement de choses à y voir que j’ai manqué beaucoup d’endroits. J’ai eu un pincement au cœur en quittant la ville, mais j’y reviendrai lors d’un prochain trip, qui inclura surement Florence et Venise.
J’ai été tellement conquise que je me suis lancée dans une reproduction du Colisée dans mon serveur Minetest …

Je déclare la guerre aux « lol » !!!

Il fut un temps où je fréquentais les sites de rencontres, cultivant à l’époque l’espoir d’y rencontrer une princesse de contes de fées.

Dans ce contexte, je faisais vite le tri … lire des fautes à chaque mot, désolée je ne peux plus. J’ai déjà eu des histoires avec des gens qui n’étaient pas doués en orthographe, mais j’ai vite fait la corrélation. Ce n’est pas une question d’ouverture d’esprit, car l’ouverture je la faisais, me disant que l’autre avait certainement des qualités qui pouvaient me plaire, mais ces personnes n’étaient pas faites pour moi : impossible de parler de culture, des choses qui me passionnaient, de faire des débats … blocage complet. Les « cc sa va ? » … impossible également.

Bien sûr, il y a des gens qui peuvent être atteints de dyslexie », et autres « dys-« , mais si on va par là, 70% des gens avec qui je communiquais étaient donc atteints d’un trouble ? Je ne suis pas d’accord.

Il faut que je vous avoue quelque chose : je suis phobique des fautes d’orthographe, oui je suis une « pédante grammaticale » assumée, et voir des « er » à la place des « é » ou des « ez » à la place des « er », je ne comprends pas ce qu’il se passe dans cette logique. Et quand je ne comprends pas, ça m’énerve. Pourtant des fautes, j’en fais, et je me suis rendue compte de mes limites lors de mes actuelles révisions pour le « Certificat Voltaire » que je prépare. Ou alors je fourre par-ci par-là quelques fautes d’inattention. Mais les grosses fautes, les crimes contre la langue de Molière comme les « enfaite » me font hurler de douleur, littéralement. Il faut avouer que c’est comme ça, et que je ne peux pas changer cette phobie, tout comme ma misophonie.

Pour citer une anecdote personnelle, il y a un bon paquet d’années de ça, j’avais eu un coup de foudre, un gros. Un jour, après en avoir marre de me poser des questions, je lui ai proposé un verre, qu’elle a décliné, mais le lendemain elle m’a envoyé un mail plus explicatif pour me faire comprendre que ce ne serait pas possible entre nous. Bon, ça arrive, un « non » ce n’est ni le premier ni le dernier, parce que c’est la vie et il faut l’accepter, et ça m’a permis de sortir de ma zone de confort (et de plus tard, entendre des « oui » de la part d’autres personnes). Mais ce qui m’a fait complètement changer d’avis sur cette personne était le contenu même de ce mail, écrit en langage SMS. La personne concernée n’avait plus 20 ans.

Langage SMS ? Mais NEXT, miss, sans regret !!!

Mais un mot me fait encore plus hurler, lors d’une conversation épistolaire.

LOL.

Parce qu’il n’y a rien derrière. On peut jeter un lol, par une phrase qui fait rire, mais parler d’un sujet sérieux, et lire en réponse un « lol » me laisse perplexe, lorsque un processus de « prise de connaissance en vue d’une relation » est entamée.

Lol, oui mais que veux-tu dire par là ? Que veux-tu exprimer ? (Parce que ce mot-là, aujourd’hui veut tout et rien dire, un peu comme un vieux livre qu’on cale sous un meuble, ça meuble une conversation, mais c’est plus de l’Ikea bon marché qu’un fauteuil Louis XIV).

Un exemple : je courtisais sur un site une demoiselle qui avait l’air d’être interessante, il y a quelques années. Nous avons échangé nos numéros, et un soir, alors que je lui partageais ma lecture du moment, j’ai eu une réponse qui là aussi, m’a faite vriller : « lolilollll mdrmdrmdr ».

Mon livre était : « Le pouvoir du moment présent » d’Eckart Tolle.
Donc rien de comique là-dedans.

Perplexe par la teneur de son propos, je lui demande plus d’explications, elle m’a juste répondu que pour elle « c’était pipo ». Okay, donc NEXT, pour le « trolol » et également, parce qu’elle ne partageait pas les mêmes valeurs en termes de spiritualité.

Un autre exemple … cette fois-ci j’étais en « relation sérieuse » avec une femme. Avec le temps, je me demandais vraiment ce que j’avais plus lui trouver, j’aimais discuter de choses intellectuelles, elle préférait les potins, parler des défauts et de la vie des autres, et lire « Closer ». Je n’ai rien contre ces gens-là, mais ce n’est pas mon truc ! Je pense que je l’idéalisais complètement. Je lui envoie un jour un SMS assez alarmant pour lui dire que je craignais qu’une de mes amies se soit enrôlée dans une secte. Là encore, rien de drôle, c’est plutôt grave (et heureusement mes craintes ne sont restées qu’au stade de peur, tout va bien pour elle). Et j’ai eu comme réponse « lol ».

J’imaginais la crédibilité de ses messages écrits, de l’image qu’elle pouvait renvoyer, de la mienne par la même occasion, puisque nous étions ensemble.

Quand j’écris, j’ai besoin de propos riches, j’ai besoin d’en savoir plus sur la personne que j’ai de l’autre côté de l’écran. Et le « lol » a le même effet que « cc sa va », un minimum d’éloquence, que diable, notre langue est riche (quoi que, pas autant que l’Allemand, mais c’est une autre histoire), et derrière se cachent des trésors (ne serait-ce que recevoir de belles lettres d’amour non copiées-collées d’un site … ) !

Et puis surtout : si tu dis LOL, le Bon Dieu il tue des petits chatons mignons. A moins que tu n’aimes pas les chats, un autre motif pour te nexter.

Mes débuts dans le web : j’étais une vraie gamine !

Message préventif

Si vous êtes victime de harcèlement ou de dénigrement sur Internet, parlez-en aux adultes. Si vous êtes un adulte responsable qui entendez de la détresse, appliquez les mesures qui s’imposent pour tempérer les situations, de grâce. Le problème est de nos jours TROP GRAVE.

L’histoire : J’ai crée un site par haine

On a parfois du mal à vouloir s’imposer quand on est jeune, chercher par tous les moyens de satisfaire ses besoins primaires. Grâce au développement personnel, j’ai compris que le besoin de reconnaissance faisait partie de mon identité. Et c’était encore plus le cas sur les bancs de fac.

Remontons le temps. On est en 2000, j’arrive en première année de BTS Assistant de Direction (oui … je me suis suis dit allons là, on verra bien). Mon site amelieonline.net vient tout fraichement de sortir, souvent agrémenté de mises à jour plus ou moins ratées. Mais je venais de découvrir une passion (qui allait devenir vocation), et le soir, à peine rentrée dans mon studio, je me jette sur mon PC pour faire du développement, faire des sites annexes, bref, je m’amuse à découvrir HTML au lieu de faire mes devoirs. Mon cadeau de mes 18 ans, c’était un livre sur Dreamweaver (l’IDE le plus en vogue de l’époque) et sa licence. Oui, donc au moment des faits, j’ai 18-19 ans.

Je suis comme une folle. Je crée des tutoriels pour ma classe, et espère que le site aurait son petit succès. Je ne manque pas, lors de la présentation officielle devant ma classe, face à ma prof principale de parler de mon site. Je reçois des messages sur mon livre d’or, des bonjours, de ma prof et de mes camarades. Mais le site n’est pas trop visité, j’ai du mal à trouver mon style, à la fois sérieux et trop second degré. En même temps, mes camarades ne sont pas « geeks » dans l’âme, pendant que moi, je navigue dans le « Deuxième monde » de Canal+, ancêtre du « métaverse ».

L’affaire de la photo à scandale

Du coup, je balise, et profite du projet « journal des promos AD du lycée » dont j’ai la charge pour écrire un article et faire la pub, venez sur mon site il est cool. Mais il y a un hiatus.

Quelques jours avant la distribution du canard, en fin de page de mon site, je publie une photo accompagnée d’un commentaire, destinée à une personne (hors du lycée et sans la nommer) qui m’avait profondément blessée. Le site ressemblait donc à ça (désolée je n’ai plus d’archive de cette version, la seule trace c’est cette demi-page imprimée toute pixelisée) … j’ai flouté volontairement l’image en question, qui était récupérée sur le web et qui m’avait amusée.

C’était quand même, avec le recul, vraiment osé, je n’aurais jamais dû faire ça, d’autant plus qu’on a du mal à faire le lien entre l’annonce de l’histoire de la « personne dangereuse » et la photo qui l’accompagne. On peut vraiment croire que je me moque de mes lecteurs, que je cherche à les provoquer. Mais on peut se montrer bête quand on a 18 ans.

Et un soir, en rentrant, je reçois un mail de la part des deuxième année, qui me fait part de leur indignation, agrémenté d’un bon « t’as rien compris à la vie et certainement rien au c… ». Je me sens en colère car c’était plus caricatural et vindicatif que pornographique, mais je consens à enlever la photo fissa. Mais le mal était fait. Le week-end arrive, je suis chez maman et … coup de fil.

AIE. Ma prof principale. Donc je lui explique ma version des faits, elle se montre douce et compréhensive, mais qualifie mon acte de « potache » (ce qui en soit est vrai). Ma maman, témoin de la conversation, me donne une bonne engueulade aussitôt raccroché. Le lundi, tout le monde me tombe dessus, camarades et profs : « Vous imaginez demain si ça tombe en conseil de classe ? A l’annonce de votre nom? devant le directeur de l’établissement ? ». Mon moi de l’époque a ressenti pendant longtemps un gros sentiment d’injustice : « Comment, je mets des tutos, des choses utiles sur ce site, et tout ce qu’on retient, c’est cette stupide photo ??? M… alors, allez tous vous faire f…. !!! ». Oui, au lieu de remettre en question mon contenu, je remettais la faute sur les autres, facile.

L’affaire Loft Story

Quelques mois plus tard, nous sommes en 2001 et le Loft apparait. Je demeure toujours une geek asociale et aigrie, même si je fréquente assidument une bande de copines du lycée où j’ai passé le bac, et je communique sur IRC. Mais je n’apprécie pas les filles de ma promo. A l’époque je les jugeais superficielles, et elles me trouvaient trop bizarre (HPI es-tu là ?). D’autant plus que je traversais une période compliquée, je me posais des questions sur mes orientations amoureuses, bref je n’étais pas bien dans mes pompes.

Je progresse dans mes apprentissages du web, je crée une plate-forme accessible par login et mot de passe pour ma promo pour qu’elles aient du contenu un peu fun. Sauf qu’il y a eu un contenu pas du tout fun … sauf pour moi. Je crée pendant l’été un site annexe sur cette plate-forme, parodie du site du Loft, où je mets en scène les filles que j’apprécie le moins. Avec les mêmes graphismes, les mêmes codes de couleur que le site original, je m’amuse de ouf, paf, dans leur tête. Mais je n’en parle pas trop autour de moi, laisse les gens qui veulent bien le découvrir. Je pensais fermer ce site tôt ou tard, parce que certains propos allaient loin. Puis je méconnaissais le droit : même en accès « privé », le droit à l’image s’applique. J’allais même plus loin : mon prof de français, qui avait alors humilié le projet du journal devant la classe, prenait le rôle de Castaldi !

Puis vint le drame, en plein cours d’anglais, alors que je provoquais quelques voisines au lieu d’écouter la leçon, la déléguée souffle à ses voisines l’existence du site parodique. Là je vois les menaces directes des principales concernées. Ce que j’ai fait ? J’ai pris la fuite en plein cours, face à une prof désemparée, et file fissa à mon studio pour effacer toute preuve d’existence ce cette catastrophe qui se préparait. Et j’ai fait la morte pendant plusieurs jours, prétextant être malade auprès de la vie scolaire.

Bien sûr, à mon retour j’ai eu des comptes à rendre. Sincèrement, j’ai regretté ce site. Car entre-temps, nous vivions toutes la catastrophe AZF et ça nous avait rapprochées, et je m’étais montrée assagie dans ma virulence et mes jugements. Ce coup-ci, ma maman n’a eu aucun vent de cette affaire, il vaut mieux, pour elle et pour moi, car elle aurait vraiment été déçue.

Heureusement il y a eu ma prof principale qui a été là, car je suis allée direct lui confesser mes actes, et dans son attitude un peu maternelle envers moi, m’a alors défendue (même si elle ne cautionnait pas du tout mon « œuvre », normal), elle m’a conseillé de travailler sur mon besoin de vengeance, et a tempéré le conflit qui aurait pu aller loin. Beaucoup plus loin. Je l’en remercie encore et passe un bonjour à elle en passant. Nous sommes toujours en contact, des décennies après. Une femme adorable qui a su prendre le temps de m’écouter quand j’en avais besoin.

Pourquoi j’ai fait ça ?

Parce que j’étais une adolescente qui manquait de confiance et d’estime d’elle-même, en mal de reconnaissance et qui ressentait beaucoup d’injustice. Ancienne victime de harcèlement moral au collège et au lycée, je voulais absolument qu’on aime ce que je faisais, qu’on admire mon travail, quitte à basculer dans la provocation. Je subissais en parallèle du cyber-harcèlement sur IRC, des gens qui n’hésitaient pas, par simple gratuité de m’insulter, ce qui m’avait rendue à l’époque aigrie et très anxieuse. Je ne m’en sers pas d’excuse, j’avais tort sur toute la ligne. Mais la haine est un cercle vicieux, quand on est jeune, on a la haine quand on reçoit de la haine.

Le message final de mon moi actuel

Ce post se voulait au départ être une confession, confession de mes bêtises, de mon tempérament, du mal que j’ai pu faire.

De dire aussi que j’ai appris de mes erreurs. Et que la leçon à retenir c’est que tout créateur est responsable de son contenu, et qu’à ce jour, j’y suis très sensible.

Mais au fur et à mesure de l’écriture de ces lignes, j’ai beaucoup réfléchi sur cette histoire et l’actualité. Il y a autre chose à dire.

Aujourd’hui les temps ont changé, et le partage d’infos est plus facile. Il y a vingt ans, transmettre de l’info sur internet devait demander du travail. Il n’y avait pas les réseaux sociaux.

Et c’est ça qui est terrible, car ils sont vecteurs aggravants du harcèlement scolaire. Les jeunes qui ont recours à ces pratiques sont mal dans leur peau et ne se rendent pas compte qu’ils peuvent briser des vies ce faisant. Communiquer derrière un écran est facile, trop facile. Aujourd’hui des jeunes se suicident pour une page en trop, une phrase de trop. Ils n’ont plus de répit, aussitôt sortis du collège/lycée, ça continue sur leur téléphone !

Faites attention aux informations que vous véhiculez, elles peuvent causer beaucoup de mal.

J’ai visité pour vous : Prague !

Enfin ! Merci mon amie la pandémie pour m’avoir permis d’attendre ce voyage pendant deux ans et demi … Oui, j’ai bien attendu pour enfin mettre les pieds dans cette ville. J’imagine que vous souhaitez avoir mon avis, je le donne direct : mi-figue, mi-raisin.

Le voyage : je HAIS Air-France

  • A l’aller, j’ai dû attendre deux heures pour aller à Paris-CDG, bien entendu, il a fallu reporter mon deuxième vol, qui a eu lui aussi du retard. J’ai attendu en tout 6 heures à CDG, je n’en pouvais plus. A lieu d’arriver à 17h15 à Prague, j’ai du arriver à 23h, et donc renoncer à certaines choses que j’avais prévu, pas cool.
  • A retour, un retard de 30 minutes à CDG, suivi d’un embarquement qui n’en finissait pas.

Le peuple de Prague : ça coince !

Avant de partir, j’ai fureté sur les sites et vidéos qui pouvaient m’informer sur les us et coutumes tchèques, je peux vous citer deux sources plutôt intéressantes :

  • Prague secrète, conseils et astuces.
  • The honest guide, qui fait part des lieux intéressants, permet d’éviter les pièges à touristes, et donne des astuces pour éviter de croiser les scammers. Il y décrit son expérience dans la ville avec un grand sourire et une avenance qui donne vraiment envie !

Histoire de me comporter en touriste respectueuse, et pouvoir profiter pleinement de mon séjour. Sauf qu’il y a un hic.

Ma première visite aura été le château de Prague, et là Prague-Secrete a raison, ce n’est pas franchement intéressant de s’y attarder. Pire encore, le personnel y est déplorable, tellement il est désagréable. Quand je dis « Hi ! », les gars qui récupèrent mon ticket me répondent en grognant, et je me fais chasser comme une malpropre à l’entrée de la salle historique parce que j’avais acheté un ticket online !!! Et là je me dis :

« Ils sont sérieux, ils sont comme ça les gens dans cette ville ??? »

Au restaurant Mintcovna, pourtant plébiscité, je me fais recaler parce que je n’avais pas réservé. Je leur explique que je suis seule, il n’y a pas beaucoup de monde dans la salle. Franchement, on peut me caler dans un coin, avec un peu de bonne volonté, et puis zut, c’est mon anniversaire, j’ai 40 ans, on peut se plier à ma volonté !!! Heureusement, un autre français avait fini sa bière, et m’a proposé de prendre sa place. J’ai mangé un goulasch qui m’a vite plombée, limite lancé comme un frisbee par la serveuse, accompagné d’une bière 50% liquide 50% mousse. Je suis restée au moins une bonne heure, durant laquelle j’ai constaté que la salle demeurait toujours à moitié vide. Ils ont sérieux, eux aussi ??? Je suis partie en insultant en français le patron et son air condescendant. N’y allez pas.

Comme vous le voyez, ils mettent même pas le pain.

Franchement, je ne relate que deux histoires, mais il y en a d’autres. Qu’est-ce qu’ils ont ces gens, contre les touristes ! Je ne suis pas responsable du triste passé de ce pays, bon sang !

Heureusement, j’ai eu affaire à des personnes aimables, et je les en remercie. Parmi elles :

Une partie de Bohnice qui a viré un peu urbex 🙂

Trop de touristes, et de magasins

J’me suis faite avoir :'(

Évitez à tout prix le Pont Charles la journée, ainsi que la rue Karlova qui sont infestées de touristes qui se déplacent en troupeaux, sauf le matin, avant 9 heures.

Le centre de Prague est très joli, mais regorge d’attrape-touristes :

  • Des pseudo-boutiques de cannabis
  • Des boutiques à « souvenirs », qui vendent des chapkas et poupées russes, reliques d’un passé que les Tchèques aimeraient bien oublier.
  • Des vendeurs de Trdelník ou « Chminey cake » … ne croyez pas qu’il s’agisse d’une vraie spécialité … c’est JUSTE une gourmandise Praguoise « spécialité » … depuis que les touristes affluent. J’ai goûté, ce n’est pas mauvais, mais c’est du sucre, sur du sucre, avec encore plus de sucre (attention aux attaques de guêpes) !
  • Les promenades en calèche … sauf que les poneys ont l’air au bout de leur vie. Même si le concept peut paraître sympa, épargnez-leur ces trottes forcées.

Une jolie ville

Un patrimoine non égalé certes. Il y a une visite à faire à tout prix : le Monastère de Strahov, et sa légendaire librairie, c’est un pur bijou !

C’est une splendeur.

N’hésitez pas à vous perdre dans les galeries, vous pourrez avoir des surprises ! Tip : dans la galerie Lucerna, il y a un paternhoster !

Entrée du cinéma de la Galerie Lucerna

La gastronomie : oui mais …

Mais rien n’égalera la gastronomie Française, en fin de compte. J’avoue que l’idée de manger du porc rôti ou des plats mijotés avec un bock de bière m’enchantait pas mal. Mais en fait c’est HYPER bourratif, je n’arrivais pas à terminer mes assiettes, et il m’est arrivé de sauter des repas, parce que justement, je n’avais pas faim, et que le repas précédent m’avait bien rassasiée.

Et puis la bière, je finis par m’en lasser, au point que je finissais par trouver qu’elles avaient toutes le même goût. A vrai dire, j’ai l’impression que dans cette ville, c’est plus facile de trouver de la bière que de l’eau, à croire qu’ils ne connaissent QUE ça, et que dans la Vlatva (prononcez « Voltava »), c’est de la bière qui y coule. Franchement.

Mais des surprises …

  • J’ai fêté mon anniversaire au U Pavouka, repas gargantuesque dans une ambiance sertie de spectacles médiévaux. J’ai bien aimé (surtout les danseuses du ventre 😎 ).
  • Les galeries … furetez bien, des surprises architecturales mais aussi vous y trouverez des FLIPPERS. Oui, des FLIPPERS !!!
Des FLIPPERS !!!
  • Faites-vous servir par des petits trains au Vytopna.
  • Vous aimez les papillons, et vous voulez en voir de jolis de près ? Passez à la Butterfly House, avec un peu de chance vous ferez ami-ami avec un de ces lépidoptères.
Oui, j’ai un papillon sur la tête.

Pour conclure, que dire ?

Je suis venue. J’ai vu. Je n’y reviendrai plus. Parce que j’aimerais découvrir de nouveaux confins, et je n’ai pas eu le coup de foudre. Mais aucun regret, à part un, j’aurais aimé faire une vraie sortie urbex, mais pour cela, il faut connaitre des gens, et tous les lieux connus ont été réhabilités (dont ceux-ci). Dommage.

Migration du serveur Minetest (en PostgreSQL !)

Le moment était venu. Le serveur qui hébergeait jusqu’alors mon jeu Minetest « Amelaye in Minerland » commençait à souffrir, tant la base de données tendait à être énorme (33 Go, vous voyez un peu …). Difficile de dire aux joueurs d’arrêter d’explorer, de creuser, bref de tirer la plus-value du monde qu’ils aimaient modifier. D’autant plus que j’avais bien envie d’installer de nouveaux mods. Et puis surtout, le serveur qui héberge le jeu est une machine perso, qui sert également pour pas mal de choses.

Alors j’ai décidé d’une part de louer un nouveau serveur Kimsufi, une machine assez robuste pour cet usage exclusif, et d’autre part, de migrer la base de données Minetest, à l’origine en SQLite vers PostgreSQL. Pourquoi ? Parce que si on regarde bien, c’est plutôt vivement recommandé.

Documentation des backends Minetest

Tout est dit, ne plus rester sous SQLite implique de limiter les lags, et également de réduire les risques de corruption de la base de données (ma plus grande crainte !). Et ça, c’est tout bénéf’ !

Allons-y. Ma nouvelle machine arrive toute fraiche avec la dernière version d’Ubuntu. Déjà, je m’enlève de la tête qu’on n’installe pas Minetest avec un simple apt-get dans mon cas de figure, ce serait trop simple. Car la version déjà compilée ne supporte pas PostgreSQL. Il va falloir compiler les sources. Je relève le défi.

On prépare le terrain

J’installe la matière première, les librairies qui me seront utiles …

sudo apt install wget postgresql 
postgresql-contrib g++ make libc6-dev libirrlicht-dev cmake 
libbz2-dev libpng-dev libjpeg-dev libxxf86vm-dev libgl1-mesa-dev 
libsqlite3-dev libogg-dev libvorbis-dev libopenal-dev 
libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev 
libjsoncpp-dev libpq-dev libpqtypes-dev doxygen 
libluajit-5.1-dev libspatialindex-dev libncurses-dev

Comme ça, c’est fait. Je me crée un utilisateur minetest :

sudo useradd -mU minetest

Et je me logue sur le compte, comme ça :

sudo -i -u minetest

Puis je télécharge les sources de Minetest. Important : téléchargez la DERNIERE VERSION stable qui correspond à celle que vous utilisiez, sinon ça peut engendrer des bugs. Dans mon cas, c’est la 5.5.1 :

git clone https://github.com/minetest/minetest.git
git checkout 5.5.1
cd minetest/games/
git clone https://github.com/minetest/minetest_game.git
git checkout 5.5.1
cd ..

Ok, c’est facile. Maintenant, je passe à la pré-compilation (et je croise les doigts) :

cmake . -DRUN_IN_PLACE=TRUE 
-DBUILD_CLIENT=FALSE 
-DBUILD_SERVER=TRUE 
-DCMAKE_BUILD_TYPE=Release 
-DBUILD_UNITTESTS=FALSE 
-DENABLE_POSTGRESQL=TRUE 
-DVERSION_EXTRA=postgresql 
-DPostgreSQL_INCLUDE_DIR=/usr/include/postgresql 
-DPostgreSQL_TYPE_INCLUDE_DIR=/usr/include/postgresql 
-DPostgreSQL_LIBRARY=/usr/lib/x86_64-linux-gnu/libpq.so

Et là … ça plante.

CMake Error at CMakeLists.txt:110 (message):
IrrlichtMt headers are required to build the server, but none found.
The Minetest team has forked Irrlicht to make their own customizations.
It can be found here: https://github.com/minetest/irrlicht
For example use: 
git clone --depth=1 https://github.com/minetest/irrlicht lib/irrlichtmt

On sent bien les origines allemandes du jeu, tiens. Il a besoin d’une librairie « Irrlicht » pour pouvoir compiler. Mais pourtant, je l’ai apt-getté, celui-là … bon, on va là aussi compiler les sources avec l’adresse GIT qui est fournie alors.

Installation d’Irrlicht

Donc, on récupère Irrlicht dans le répertoire minetest pour pouvoir faire en sorte que l’include dans les sources trouve ses petits. Il est très important d’installer Irrlicht dans lib/irrlichtmt

git clone --depth=1 https://github.com/minetest/irrlicht lib/irrlichtmt

On va dans le répertoire et on compile :

cd lib/irrlichtmt
cmake . -DBUILD_SHARED_LIBS=OFF
make -j$(nproc)

Normalement on s’en sort avec juste quelques warnings.

Compilation réussie !

Je reviens deux répertoires en arrière, relance la pré-compilation de Minetest, et … mince encore des erreurs.

CMake Error at /usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
Could NOT find Zstd (missing: ZSTD_LIBRARY ZSTD_INCLUDE_DIR)
Call Stack (most recent call first):
/usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
cmake/Modules/FindZstd.cmake:24 (find_package_handle_standard_args)
src/CMakeLists.txt:228 (find_package)

Bon, certainement une lib qui manque, ce ne sera pas la mer à boire. Je reviens dans mon compte utilisateur et je fais un petit :

sudo apt install -y libzstd-dev

Je reviens dans mon compte minetest et mon répertoire minetest, je relance la pré-compilation. Cool, ça a marché. Maintenant je lance la compilation :

make -j$(nproc)

Okay, le terminal m’indique que minetestserver a été compilé avec succès.

Je lance le binaire :

cd ..
./minetest/bin/minetestserver

Et je lance mon jeu depuis Minetest en spécifiant l’adresse IP du serveur. Tout se lance, génial. J’éteins le serveur, le plus complexe reste à venir.

Configuration du serveur PostgreSQL

Je relance par sécurité le service :

sudo systemctl restart postgresql.service

Et puis je lance mon interface PostgreSQL

sudo -u postgres psql 
CREATE USER monuser WITH PASSWORD '*****';
CREATE DATABASE adventure OWNER monuser;
GRANT ALL PRIVILEGES ON DATABASE adventure TO monuser;

Je vérifie avec /l que tout est ok et je sors

La migration de l’ancien serveur

Là, je suis obligée de dire à mes joueurs que le serveur doit être fermé pour la migration. J’éteins mon ancien serveur et je fais une copie de mon monde vers le nouveau. Je ne cache pas que ça prend du temps, vu le nombre de gigaoctets de mon map.sqlite.

Pour vous situer, il faut copier deux répertoires :
– celui des mods : .minetest/mods vers minetest/mods
– celui du monde, dans mon cas : .minetest/worlds/adventure vers minetest/worlds/adventure

Je tremble un peu durant ce transfert et prie pour que tout se passe bien. Je relance après cette étape en spécifiant mon monde et … ça se lance ! Tout va bien, je souffle un peu ! Maintenant passons aux choses sérieuses !

J’édite mon fichier world.mt du monde adventure pour y ajouter mes identifiants de connexion PostgreSQL. On ne touche à rien d’autre, notamment la configuration des backends en SQLite. Ce sera fait automatiquement.

pgsql_connection = host=127.0.0.1 port=5432 user=monuser password=***** dbname=adventure
pgsql_auth_connection = host=127.0.0.1 port=5432 user=monuser password=***** dbname=adventure
pgsql_player_connection = host=127.0.0.1 port=5432 user=monuser password=***** dbname=adventure

Et je lance ma première migration, celle du monde, et j’attends. Ce qui est sympa, c’est que l’avancée de la migration s’affiche :

./minetest/bin/minetestserver --migrate postgresql --world minetest/worlds/adventure

Si vous avez comme moi une base de données énorme, ne faites pas l’erreur que j’ai faite, de lancer le script dans un terminal et le laisser juste agir comme ça (sincèrement, je ne pensais pas que ça prendrait tant de temps !). Je suis partie me coucher, le lendemain mon ordi avait rebooté tout seul, interrompant le process (que j’avais lancé la veille à 15h30), et que j’ai dû relancer cette fois dans un screen (ou faites un nohup … &, bref, permettez au script de le laisser exécuté même si il y a une coupure.). Bref, une bonne vingtaine d’heures plus tard (oui, une VINGTAINE d’heures !!!) après le deuxième lancement, la base des blocs est migrée !

Regardons le fichier world.mt. Il a changé automatiquement le backend correspondant à la base des blocs. Nickel. Faisons la suite. Les autres bases de données migrent très vite.

./minetest/bin/minetestserver --migrate-auth postgresql --world minetest/worlds/adventure
./minetest/bin/minetestserver --migrate-players postgresql --world minetest/worlds/adventure

L’heure de vérité à sonné. Je vérifie que mes backends ont bien été modifiés et que tout pointe sur ma base PostgreSQL. Mieux que ça, je convertis mes fichiers map.sqlite, auth.sqlite et players.sqlite en map.old, auth.old et players.old. Je lance le jeu, et super, tout marche et je retrouve mon monde tel que je l’avais laissé …

Reste à remettre dans mon minetest.conf les paramètres de l’ancien serveur, sauf l’adresse, qui change.

Pour terminer, augmentez la mémoire allouée pour les requêtes PostgreSQL, sinon vous allez vous retrouver avec des plantages core dumped. Donc dans /etc/postgresql/potgresql.conf, changez la valeur du paramètre shared_buffer pour qu’il ait au moins une valeur supérieure à 512Mo. Chez moi, j’ai affecté 1024Mo.

Il ne reste plus qu’à profiter du jeu maintenant !

Mes notes du Symfony Live – Jour 2

Vous avez dit Symfony 6.1? – Nicolas Grekas

Ici, un autre « core dev » de Symfony pour cette première conférence, qui nous rappelle qu’au sein même d’une même version majeure, il y a promesse de rétrocompatibilité … D’une version majeure à une autre, le chemin de migration continue. Il est conseillé de faire un composer update tous les mois; et tous les 6 mois, un composer update pour passer en version mineure suivante, pour corriger les dépréciations.
Il est déconseillé de commencer ou rester sur une version LTS, pour ne pas rester « lent » ou « stable ».
En 6.1 on a droit à :
– une modernisation du code via nouvelles syntaxes / fonctions
– une meilleure description des types natifs et génériques
– une simplification par abandon : SwiftMailer, Twig, FlexServer
– une revisitation des classiques : composer runtime, symfony new (l’option –-full pour le website skeleton devient –website)
– des serveurs à longue durée d’exécutions
– une performance accrue.
Retour sur le nombre de PR : 6PR/jour en 12 mois soit 2000PR : 400 features, 700 bugs, +900 mineures)
Je vous laisse le loisir de regarder la rediffusion de la conférence pour avoir l’aperçu complet, et non exhaustif de cette mise à jour !

Mon avis : un bon tour de découverte de cette nouvelle version de SF, bien hâte de la tester en fait !

Code asynchrone dans une application Symfony synchrone – Jérôme Tamarelle

Petit rappel : Composer utilise depuis la version 2 des composants de ReactPHP, et peu de gens le savent.
Il est question de ces différents concepts :
1. I/O non bloquants
Fonctions natives de PHP pour les flux non-bloquants : stream_select, curl_multi_select, Symfony HTTPClient est non-bloquant.
2. Délégation de traitement à des processus parallèles
Effectuer des traitements en parallèle sans bloquer le processus courant, avec Sf Process ou encore Messenger
3. Branches de code concurrentes dans un même thread
Ici , on parle de promesses, coroutine, et fibers pour exécuter plusieurs branches de code en concurrence, sur le même thread.
A retenir :
– Une fonction synchrone peut appeler une fonction synchrone mais pas une fonction asynchrone.
– Une fonction asynchrone peut appeler une fonction synchrone et une fonction asynchrone.

Mon avis : je suis peu familiarisée avec ces concepts. Intéressant à découvrir par la pratique, peut-être avec un projet futur.                                     

Développer une application web décentralisée avec Symfony et API Platform – Kevin Dunglas

SAUVONS LE WEB !!! DECENTRALISONS !!! Tel est le message de cette conférence de Dunglas, connu de tous pour être un des core devs de Api Platform.
Les GAFAM représentent 57% de tout le trafic mondial, la majorité de l’usage du web passe par ces quelques acteurs-là, et leur donne un contrôle quasi total des contenus des internautes. Ce qui était à des milliards de lieues de la volonté de Tim Berners-Lee quand il a crée le web ! Au départ il voulait vraiment créer un espace de libre expression pour les gens qui ne pouvaient pas le faire … le Web devait donner une voie aux personnes marginalisées, les autres médias étant réellement contrôlés, tous ceux qui avaient quelque chose à dire pouvaient le faire, via les URL, qui relient les sources les unes aux autres (on a donc un graphe de connaissances). Or les GAFAM donnent donc pas mal de problèmes de démocratie, vu qu’ils censurent à tout-va.
Aux origines, le Web 1.0, tout était décentralisé.
Puis le Web 2.0 (terme marketing) est arrivé, permettant aux utilisateurs de bénéficier des formulaires pour publier du contenu, créer des mixs de communautés. On a vu apparaitre les API web, ainsi qu’un mix d’acteurs non-commerciaux et commerciaux, ça se passait plutôt bien. Mais l’argent est entré en jeu.
Puis on voit naitre le Web 3, la promesse : re-décentraliser le web, casser le pouvoir des états surveillants. On propose d’utiliser la blockchain d’Ethereum et d’exécuter ce code sur les ordinateurs du réseau pour faire des sites web. Donc base sur les cryptomonnaies, trustless et permissionless. Sauf que des problèmes se posent : consommation énergétique (Ethereum toujours en POW), d’énormes structures américaines sont intéressées par le concept, chaine de Ponzi.
Donc, voici le concept du Web 3.0, apparu avec le web sémantique, crée par Tim Berners-Lee, qui consiste à utiliser le web comme immense base de données, le web est donc considéré comme base de connaissances, les opérations auraient une grande interopérabilité.
Pour cela on utilise un modèles de données abstrait pour représenter n’importe quel set de données : RDF. Mais on a d’autres formats : tableau HTML, N-Tuple dans un fichier texte, Turtle, JSON-LD.
Tim Berners-Lee présente son projet : SOLID. Les considérations physiques, politiques, etc … dont détaillées dans des documents émis en dur. Solid Toolkit permet de créer des application décentralisées et interopérables, la décentralisation des données personnelles, etc …
A mentionner qu’on peut construire une application Symfony avec Solid. Dunglas propose son bundle.

Mon avis : je suis TRES sensibilisée sur sujet, et j'avais envie, avant la pandémie de faire un gros projet lié au web, son évolution et sa centralisation, hélas remis à plus tard. L'idée est interessante et je vais me pencher sur le sujet, et regarder Solid d'un peu plus près ... mais toutefois, je me pose des questions. N'est-il pas mieux de sensibiliser les gens à faire leur propre site internet, comme avant ? et de créer l'arborescence de leur communauté à cet effet ? Leur faire comprendre ce qu'est le logiciel libre ? Si Dunglas passe par là, je serai ravie qu'il puisse répondre à mon interrogation ;) !

Mon avis global sur le séminaire

Une joie de retrouver tout ce beau monde et l’ambiance des séminaires sans entendre les mots maske aubligatouar, pace vaksinale et tout le toutim. J’aspire vraiment à retrouver la vie active d’avant que je menais sur ce point-là. Les différents stands étaient attractifs, et je suis bien contente d’avoir eu un beau t-shirt en cadeau, et un autre gagné sur le stand des Tilleuls.coop. Il faut juste que je pense la prochaine fois à imprimer mon badge avant de venir ! Les thèmes des conférences étaient variées, et la plupart étaient bien intéressantes et donnent envie de creuser le sujet abordé.
Sinon … gros bémol pour les déjeuners. J’adorais le concept du buffet proposé lors de ma dernière venue, qui permettait un éventail varié. Je fais très attention à ce que je mange, surtout quand je ne trouve pas le temps de faire du sport, que je mange au resto le soir avec ma chérie + les copains que je n’ai pas revus depuis un bail, et que j’ai de gros problèmes avec certains aliments (comme le fromage). Là c’était vraiment bourratif, trop riche et pas varié (sérieux les gars, un gâteau au Daim ? Pas un seul fruit !). Le souci c’est que le tarif du SfLive est plutôt conséquent, et pour moi chaque centime compte, la nourriture en fait partie. Et qu’on ne me parle pas de « raisons sanitaires », vu qu’on reste toujours tous mélangés dans les différentes salles … mais bon, on va me répondre qu’on n’a pas eu le choix, c’est ça ou rien … Oui, je suis exigeante 😀 !

Mes notes du Symfony Live – Jour 1

Quelle joie pour moi de revenir à cette vie d’avant qui m’avait tant manquée … Il s’agit ici du deuxième Symfony Live auquel j’assiste, et comme bien des séminaires, j’ai appris pas mal de choses, que j’ai notées, remises au propre, et vous fais partager !

La keynote de Fabien Potencier

Fabien est en forme pour cette nouvelle session ! Pour démarrer le show, il nous fait un retour d’expérience sur un bug qu’il a eu avec Twig. Après une mise à jour des tests des selectors css, il y a eu un problème de « match » avec une expression qui devait figurer dans le code, via preg_match(). Il commence alors une session de debug, pour avoir un détail plus explicite de la source du bug.
S’inclut alors un petit speech sur l’open source, qui consiste à contribuer pour :
– éviter aux autres ou à soi de refaire la même erreur
– éviter à quelqu’un, voire des centaines de gens de réfléchir de nouveau à un problème
Du coup, quick fix, on fork, on ouvre le code, on essaye de faire le changement, on écrit les tests, on les exécute, on pull request et on croise les doigts 🙂 …
Quand il s’agit d’un package, on peut aussi modifier le code et faire un link dans les vendors pour pouvoir tester plus efficacement.
Cependant, ici il s’agit d’une modification dans ExpressionLangage, qui est une sous-partie de Twig. On peut faire mieux que simplement corriger, ou faire une fonctionnalité qui peut poser problème avec d’autres cas de figure. Du coup, Fabien a poussé la réflexion plus loin … On est en PHP8.1 et on supporte PHP7 dans Twig, ce qui pose problème pour la contribution. La solution : travailler sur Twig4 pour moderniser le code. On ouvre les issues, entre autres : résolution des mismatches camelcase vs. snake_case, ne plus avoir de fonctions globales, analyse syntaxique …
En fin de compte : Twig sera intégré en tant que composant de Symfony, Twig4 sera alors nommé Twig6.2 en parallèle à la nouvelle version de Symfony, et changera de namespace.

Mon avis : une bonne mise en bouche, qui m'a poussée à la réflexion quand à certains de mes side projects.

Comment valider de la donnée – Marion Horteau

Ici, Marion nous fait un parallèle avec l’univers de Pokémon. Personnellement, je ne suis pas du tout fan, mais je me suis laissée tenter.
Pour rappel, un validateur est composé d’une contrainte, qui est appliquée à un objet, et elle est appliquée à un validateur. nativement, il y en a une bonne dizaine (que j’ai du bûcher par cœur pour ma certif …).
Mais certaines contraintes ne sont pas forcément liées à un validateur, comme UniqueEntity dans Doctrine.
On valide sur une propriété, dans un formulaire, dans une méthode (getter ou autre), ou sur une classe entière, et soit dans le code, soit lors d’un submit dans un formulaire.
Mais ici on veut faire de la validation dynamique …
Marion propose donc une solution basée sur une API avec des paramètres qui varient.
Dans le contrôleur, on alimente un objet Evolution, avec un attribut Callback. Comme les contraintes sont différentes, on peut en ajouter avec Assert\Collection. InContext permet de rendre la validation récursive.
Pour externaliser les contraintes, elle crée une interface pour les différents types de contraintes. Elle ajoute des tags dans la définition des services. La persistance se fait soit par Doctrine, soit par Json.

Mon avis : dommage que le contexte Pokémon me rebute, mais il s'agit ici d'un avis personnel. L'introduction sur les validateurs natifs est toutefois un peu longuette, j'aurais aimé qu'elle détaille plus en détails cette validation dynamique. Mais intéressant.

Du DDD avec API Platform – Mathias Arlaud, Robin Chalas

Rappelons-le, ce pattern permet une conception tactique et architecturale. le DDD ce n’est pas du RAD, la conception est pilotée par le métier, et ça ne permet pas de développer rapidement.
Petit rappel de l’archi hexagonale : les layers sont des couches où on écrit du code, ils obéissent à la règle des dépendances.
– Couche basse : domaine (models, events, repo, services …)
– Couche application : contient les services applicatifs pour traiter les use-case métier
– Couche infrastructure : porte vers le monde extérieur (controllers, bases de données, caches, vendors …), c’est la SEULE qui aura accès à du code tiers.
Les avantages :
– on préserve l’intégrité de notre domaine,
– le code est d’avantage testable,
– on est capable de repousser les décisions technologiques,
– le domaine est agnostique du contexte utilisé (ligne de commande, terminal, navigateur …)
Dans Api Platform, on peut configurer via ApiResource les opérations, via new Get() et new Post(). Mais ce n’est pas la bonne approche.
Le pattern command bus va nous permettre de reprendre complètement le main sur nos use case métier en faisant appel à nos domaines. Ça implique : Notion de commande (objet PHP) + un handler (service applicatif) + bus (trouver le bon handler pour une commande données) + deuxième bus (query) pour nous permettre de contrôler la manière dont on interagit avec notre domaine.
On manipule entre autres :
ItemOperations
CollectionOperations (ça dépend si on a un id dans le chemin) – supprimée dans ApiP3, tout est operation
– Notion de ChainProvide qui fait appel aux autres providers
– On peut créer nos propres providers, qui auront d’autres priorités
– Création de DataTransformers

Mon avis :  Haaa ! API Platform ! J'adooore ce framework, et je voulais vraiment en savoir plus sur le Domain Design Development. Je comprends ici que je n'ai pas fait le tour de ce framework, je pense à certains side projects que je définis en DDD, qui font appel à une API crée par ApiP, mais j'ai envie de remanier tout ça. Conférence très interessante qui m'a remise en question. Merci :D !

Doctrine, objet typé, et colonne JSON – Grégoire Pineau

Ici, on parle CMS, notamment celui utilisé par JoliCode. Composé de blocs, qui représentent chacun un objet.
L’objectif de ces blocs :
– éviter la duplication de code
– pouvoir stocker les blocs en BDD
– avoir un maximum d’objets PHP
– et si possible, un objet par type de bloc
Pour ce faire, deux solutions : utiliser l’héritage Doctrine, et stocker du PHP sérialisé.
Les options :
MappedSuperClass : Doctrine ne sait pas gérer les relations avec
Single Table (genre une première classe) avec une entité. On aura une entité mais la deuxième classe sera vide, si la première est remplie.
Class Table : crée une table par type de bloc, pas très pratique à administrer.
On rejette d’emblée le PHP sérialisé via serialize() et unserialize(), non interopérable ! Quand à l’objet stocké en JSON, c’est « so 2013 » …
La solution proposée c’est le Concept Unit Of Work, la donnée est encapsulée via l’EntityManger qui :
– contient le cache de toutes les entitées passées
– gère les écritures en BDD,
– gère les transactions,
– s’occupe de quel objet doit être insert / delete / update
– s’occupe de gérer les dépendances entre les objets
– fait des snapshots des objets qu’il rencontre pour faire un diff au moment du flush.
On utilise alors les event Doctrine, qu’on hooke dans notre code, avec un listener Doctrine.

Mon avis : Je vais me faire taper sur les doigts, mais je vais être franche. C'est assez pénible quand les slides sont passées vite-vite quand on ne connait pas vraiment le sujet (qui ici est spécifique, puisque retour d'expérience). J'ai eu beaucoup de mal à suivre. Personnellement, j'aurais préféré moins de contenu, mais peut-être plus d'explications.

Connaissez-vous vraiment JWT ? – Karim Pinchon

Pour rappel, JWT (prononcé abusivement « jot ») = Json Web Token.
C’est une solution simple et sécurisée, qui a une référence et une valeur.
La cryto, ça obéit à des régles : c’est mathématique, c’est de confiance, ça communique, ça passe sur un canal non sûr, et c’est CAIN.
ça implique :
– la signature numérique
– le chiffrement
– le hachage (intégrité et sens unique)
– Mac / HMac (intégrité et authentification)
– encodage (chaine de caractères)
Pour voir à quoi ça ressemble, il existe les outils token.dev et jwt.io
Après un tour des tokens existants (JWE, JOSE …), quelques conseils :
– attention à ne pas tout accepter côté serveur
– valider les claims
– préférer l’asymétrique
– utiliser une librairie existante et éprouvée
– ne vous battez pas pour révoquer les JWT (ça doit avoir un cycle de vie)
– éviter de logger les jetons (pour la confidentialité)

Mon avis : je suis peu familière avec le cryptage des données, car je n'en ai fait que rarement dans ma carrière, mais c'est bon à savoir.

Des composants Symfony méconnus qui valent le détour – Alexandre Daubois

  • HTMLSanitizer : prévu pour SF 6.1, expérimental.
    HTMLPurifier : garde au mieux l’arborescence des noeuds, supprime les données potentiellement dangereuses.
    Le Sanitizer reconstruit les données du HTML en extrayant les données safe de l’input, la structure de base peut être perdue. Le comportement est défini par HTMLSanitizerConfig. Il peut forcer les https pour les URL, autorise les Schemes, autorise les media hosts.
  • STRING : arrivé en SF 5.0, il permet de faire de la manipulation simplifiée de codepoints, par exemple des emojis : combinaisons possibles pour faire des couleurs de peau, crée des chaines par contructeur (CodePointString, UnicodeString, ByteCodeString …), crée des chaines par factories.
  • OptionsResolver (remplace SPL) : valeurs obligatoires, callbacks, etc … , normalisation pour résoudre les options.
  • L’internationalisation : ce n’est pas seulement de la traduction (dates, nombres, monnaies, etc …), INTL depuis SF 2.3 (mai 2013).
    International Component For Unicode : quelques entreprises bien connues l’utilisent. Permet de formater : les langues, les locales, les monnaies, les timezones (reprises par les forms, qui vont puiser dans ce composant.)
Mon avis : je connaissais déjà OptionsResolver, mais c'est bien sympa d'en connaitre d'autres ! :D ...

Un fabuleux mapping avec Leaflet.js !

Aujourd’hui, pour changer, je vous parlerai de … front-end ! Bien que plus dévolue back, j’avais envie de faire d’une pierre deux-coups et de réaliser un joli mapping de mon monde Minetest.

Avec Minetest, c’est assez facile de générer des fichiers image qui retracent en 2D l’univers généré dans le jeu, avec minetestmapper. A partir de là, les plus créatifs peuvent s’amuser.

Pour la petite histoire, je suis en fait tombée sur le plan interactif du serveur Minetest LinuxForks, qui est juste splendide, et j’ai eu vraiment envie de me lancer ce défi.

Au commencement, une map qui rame à mort !

Du coup, j’ai intégré ce fichier dans une carte de base. Le code est simple, j’intègre Leaflet.js dans ma page web, et j’y intègre quelques markers. La bibliothèque, je la connaissais déjà, car je l’avais déjà intégrée pour l’outil d’un de mes clients BTP, pour y localiser les chantiers en cours. Mais Leaflet, c’est vraiment l’outil qui permet de créer des cartes, sans forcément qu’elle soit « terrestre », une « mappemonde ». Donc pas mal privilégiée par les geeks gamers.
Voilà grosso modo le code de base du premier jet que j’ai intégré dans mon index (j’y ai intégré après un div vide appelé map, bien entendu):

var map = L.map('map', {
    crs: L.CRS.Simple,
    center: [500, 500],
    scale: function (zoom) {
        return Math.pow(2, zoom);
    },
    zoom: function (scale) {
        return Math.log(scale / 256) / Math.LN2;
    },
});
 
var bounds = [[0,0], [2000,2000]];
var image = L.imageOverlay('map.png', bounds).addTo(map);
// Spawn
var spawn = L.latLng([971.5, 1156.5]);
L.marker(spawn).addTo(map).bindTooltip('Spawn Station', {sticky: false, direction: 'top'});
// Maison de Jym
var jymHome = L.latLng([972, 1137]);
L.marker(jymHome).addTo(map).bindTooltip('Maison de Jym', {sticky: false, direction: 'top'});
 
map.setView( [971.5, 1156.5], 3);

C’est déjà pas mal. La définition de la map en crs permet de générer une map personnalisable, le niveau de zoom est correct, on peut naviguer pépère. Sauf que la carte, qui est grande, met pas mal de secondes à charger, c’est lourd, très lourd. Et ça, c’est un gros souci. Sans compter que la map devient floue à un certain niveau de zoom avancé. A revoir, donc !

Le tiling, solution miracle !

Et puis j’apprends que Leaflet intègre très bien des briques d’images. A la base, on peut sans souci utiliser un coup d’imagemagick pour ce faire et recoller les morceaux, chose que la bibliothèque fait très bien. Donc pile ce dont j’ai besoin !

Pour créer les briques, il y a un script existant qui gère Leaflet. Il est en Python et s’appelle gdal2tiles-leaflet. Ne pas oublier avant de faire un petit sudo apt install python-gdal (pour les utilisateurs d’Ubuntu) et éventuellement installer python si ce n’est déjà fait, juste avant de l’utiliser.

Voici la commande que j’ai lancée :
./gdal2tiles.py -l -p raster -z 0-10 -w none ../map.png ../tiles
Et j’ai attendu quelques bonnes minutes pour que toutes les briques soient générées. C’est un peu long mais ça vaut le coup. Ne pas oublier l’option -p raster car on en aura besoin par la suite, et surtout l’option -l qui définit spécialement des briques adaptées pour leaflet. J’ai demandé un niveau de zoom variable de 0 à 10, pour bien pouvoir avoir chaque détail de ma carte.

Gérer le tiling dans Leaflet

Maintenant qu’on a généré les briques, il faut pouvoir les assembler. Là encore, après pas mal de recherches, j’ai pu trouver de quoi satisfaire ma faim.

Bien avant, il faut intégrer la librairie rastercoords, pour pouvoir faire la correspondance des briques au format « raster » (l’option que nous avions vu plus haut). Et ainsi, avec ce code, vous pouvez déjà disposer d’une map sympa :

;(function (window) {
    function init (mapid) {
        var minZoom = 0
        var maxZoom = 9
        var img = [
            38192, // original width of image
            29792  // original height of image
       ]
    // create the map
    var map = L.map(mapid, {
       minZoom: minZoom,
       maxZoom: maxZoom
    })
 
    var rc = new L.RasterCoords(map, img)
    map.setView(rc.unproject([22000, 15450]), 9)
    L.control.layers({}, {
        //@todo
    }).addTo(map)
 
    L.tileLayer('./tiles/{z}/{x}/{y}.png', {
        noWrap: true,
        attribution: 'Creation Amelie DUVERNET aka Amelaye <a href="http://minetest.amelieonline.net">Projet Amelaye In Minerland</a>'
        }).addTo(map)
    }
 
    init('map')
}(window))

Des markers jolis et dynamiques

Nous avons la carte, il faut maintenant y ajouter les markers. Pour ce faire, vous avez besoin de :
– La librairie font-awesome (on en a besoin pour extra-markers)
– La librairie leaflet-extra-markers

J’ai crée deux fonctions, la première, layerGeo qui permet de récupérer les points définis dans mon fichier geojson.js

function layerGeo (map, rc) {
  var layerGeo = L.geoJson(window.geoInfo, {
    // correctly map the geojson coordinates on the image
    coordsToLatLng: function (coords) {
      return rc.unproject(coords)
    },
    // add a popup content to the marker
    onEachFeature: function (feature, layer) {
      if (feature.properties &amp;&amp; feature.properties.name) {
        layer.bindPopup(feature.properties.name)
      }
    },
    pointToLayer: function (feature, latlng) {
      return L.marker(latlng, {
        icon: feature.properties.id
      })
    }
  })
  map.addLayer(layerGeo)
  return layerGeo
}

Ainsi qu’une autre, qui permet de trouver les « frontières » de la carte, et également d’afficher les coordonnées d’un emplacement au hasard cliqué :

function layerBounds (map, rc, img) {
  // set marker at the image bound edges
  var layerBounds = L.layerGroup([
    L.marker(rc.unproject([0, 0])).bindPopup('[0,0]'),
    L.marker(rc.unproject(img)).bindPopup(JSON.stringify(img))
  ])
  map.addLayer(layerBounds)
 
  // set markers on click events in the map
  map.on('click', function (event) {
    // to obtain raster coordinates from the map use `project`
    var coord = rc.project(event.latlng)
    // to set a marker, ... in raster coordinates in the map use `unproject`
    var marker = L.marker(rc.unproject(coord)).addTo(layerBounds)
    marker.bindPopup('[' + Math.floor(coord.x) + ',' + Math.floor(coord.y) + ']').openPopup()
  })
  return layerBounds
}

Du coup, on revient sur notre code qui affiche la map et on corrige la ligne L.control.layers pour appeler nos fonctions :

L.control.layers({}, {
  'Bounds': layerBounds(map, rc, img),
  'Info': layerGeo(map, rc)
}).addTo(map)

Maintenant passons aux choses sérieuses, la définition de nos coordonnées. Et là, on va passer nos jolis markers, ainsi que les points qui nous intéressent, et tout ceci va se passer au niveau d’un nouveau fichier geojson.js :

;(function (window) {
    // Markers
    var spawnStation = L.ExtraMarkers.icon({
        icon: 'fa-anchor',
        markerColor: 'red',
        shape: 'star',
        prefix: 'fa'
    });
 
    var metroStation = L.ExtraMarkers.icon({
        icon: 'fa-subway',
        markerColor: 'blue',
        shape: 'circle',
        prefix: 'fa'
    });
 
    var castle = L.ExtraMarkers.icon({
        icon: 'fa-dungeon',
        markerColor: 'violet',
        shape: 'square',
        prefix: 'fa'
    });
 
    // etc ...
 
    // geoJson definitions
    window.geoInfo = [
        {
            'type': 'Feature',
            'properties': {
                'name': 'Spawn Station',
                'id': spawnStation
            },
            'geometry': {
                'type': 'Point',
                'coordinates': [22087, 15321]
            }
        },
        // Castles
        {
            'type': 'Feature',
            'properties': {
                'name': 'Chateau dans le ciel',
                'id': castle
            },
            'geometry': {
                'type': 'Point',
                'coordinates': [22088,14112]
            }
        },
        {
            'type': 'Feature',
            'properties': {
                'name': 'Chateau Royal',
                'id': castle
            },
            'geometry': {
                'type': 'Point',
                'coordinates': [22229,15299]
            }
        },
        {
            'type': 'Feature',
            'properties': {
                'name': 'Chateau Amelaye',
                'id': castle
            },
            'geometry': {
                'type': 'Point',
                'coordinates': [22060,15402]
            }
        }, // etc ...
    ]
}(window))

Là, j’ai pas mal galéré car il faut injecter les markers personnalisés dans un fichier qui doit être scrupuleusement rigoureux, car geojson est une norme. J’ai donc passé les variables qui correspondent à la définition des « templates de markers » dans la propriété id. C’est caduque, bricolé, mais ça marche.

Et voilà le résultat (disponible en ligne) :

Nous voici maintenant avec une map rapide à charger, qui intègre pas mal de points personnalisables. Il reste pas mal de choses à faire, j’ai bien envie d’utiliser une base de données pour créer une API, voire une base ElasticSearch qui se chargera de générer le fichier geojson, mais pour l’instant je n’ai pas décidé de la suite. Qu’en pensez-vous ?

Voici pour plus de détails le rendu final sur mon Github.

Ma recette anti-déprime (et booster d’immunité)

Voilà, mercredi, le couperet est tombé. Je voulais pourtant remonter cette pente dans laquelle je m’étais engluée depuis mars dernier. Certains le savent, comme beaucoup j’ai pris cher à l’annonce du premier confinement. Je n’avais, pour couronner le tout, pas passé une super année 2019, ponctuée de drames personnels, deux deuils, c’est pas mal comme mauvais combo. je m’étais dit qu’en 2020, j’allais sortir, voir d’autres gens, me changer les idées, au lieu d’être la geek qui aligne les lignes de PHP, même si ça m’a permis de m’aider dans la démarche des étapes du deuil. Bref, je ne vais pas m’étaler là-dessus, je ne suis pas là pour jouer les victimes.

Avec le recul, j’ai vécu le premier confinement comme un stress post-traumatique, et ça a été même un le réveil d’un autre traumatisme. En effet, ce n’était pas le premier confinement que je subissais. Le premier je l’ai subi à 19 ans, l’après-midi du 21 septembre 2001. J’habitais à Toulouse. Et croyez-moi, là, j’avais vraiment peur car sortir représentait un vrai danger à cause des émanations chimiques. Et près de 20 ans après, subsiste toujours l’angoisse de penser qu’un cancer lié à tout ça puisse se développer un jour où l’autre. Mais vous savez quoi ? J’étais contente de pouvoir être confinée … cela voulait dire que j’avais toujours mon studio d’étudiante. D’autres n’ont pas eu cette chance.

Lors du premier confinement, je ne suis sortie que pour les premières nécessité, courses, vétérinaire (car le Maître de la maison nécessite des soins réguliers à cause d’un souci de santé important), et achat de pièces informatiques chez une technicienne indépendante. Étant auto-entrepreneure, avoir un matos informatique de qualité est primordial, et le mien commençait à dater. Il fallait s’en occuper. Mais je ne faisais que bosser et jouer à Minetest en fait, les fesses collées à ma chaise. Je n’avais envie de rien, plus possible de faire du sport en salle, d’aller courir en bord de mer, de faire de la rando, d’aller à la piscine, et surtout … PLUS D’URBEX. Je n’avais pas le cœur à faire trois gainages sur le sol de l’appartement. J’ai commencé à déprimer. Et ça a duré à cause des mesures sanitaires : forçage du gel hydro-alcoolique alors que je fais de l’urticaire aux mains (alors que je me les lave régulièrement à l’eau et au savon), port du masque alors que je fais des attaques de panique (Fort heureusement, le médecin a pu me faire une dérogation à ce sujet).

En septembre, ayant conscience que j’avais repris des poignées d’amour, j’ai recommencé à faire du sport, à me réinscrire à la piscine, reprendre les cours de guitare. Un retour progressif à ma vie d’avant, en somme, mais ma joie fut de courte durée. Fermeture des salles de sport, puis couvre-feu, puis re-confinement. PAN ! A vrai dire je me suis demandée si je n’allais tout simplement pas basculer dans la folie. Quitte à vivre dans un monde de fous, allons-y gaiement ! Non mais en plus, j’avais commencé une thérapie régulière chez ma kinésiologue, sans rire !!!

Mais là, j’ai dit NON. J’ai appris à dépasser ceci en fin de compte. J’ai déjà eu des coups durs, des bons punchs dans la tête, et là, un coin de mon cerveau a refusé l’enlisement. J’ai cherché des idées pour changer mon énergie. Jeudi dernier, j’ai passé la journée devant mes fourneaux : mélanger des ingrédients, concevoir des bons petits plats en faisant preuve de patience me canalise. Le lendemain, j’ai chaussé mes baskets et je suis allée courir autour de chez moi. Et j’ai décidé de mettre en place un protocole.

  • Ne pas se lever après 8h30. Je ne dois pas perdre une matinée à paresser, hop on règle son réveil !
  • Avant le petit-déjeuner, prendre :
    – un jus de citron pressé (immunité, boost et alcalinisation de l’organisme) dans de l’eau tiède
    – gelée royale (aide l’immunité, indispensable en ces temps actuels)
    – magnésium bisglycinate (le magnésium marin, tu oublies, il n’y a pas de magnésium dans la mer)
    zinc
    safran (anti-dépresseur naturel, aide l’immunité)
    rhodiola
    – 5 gouttes de Fleurs de Bach : cherry plum
  • Activité physique régulière, aide l’immunité, donne une belle silhouette et c’est bon aussi pour la santé mentale : « un esprit sain dans un corps sain », dit-on bien.
  • Méditation pleine conscience le matin (personnellement j’utilise « Petit Bambou« ) après le petit déjeuner, avant d’attaquer le travail, pour l’ancrage, suivie d’un mantra que ma kinésiologue a écrit pour moi.
  • Et bien sûr, alimentation équilibrée, riche en fibres. Pour ma part, je cuisine beaucoup, avec des produits frais non-transformés (fruits et légumes de saison et locaux, viande du boucher, poisson du marché), ou du moins qui le sont au minimum. J’évite les sucres, les gâteaux, je mange des pâtes assez rarement.
  • Étant d’une nature spirituelle, je termine mon ménage en passant l’appartement à la sauge, mais il faut aimer l’odeur. J’utilise souvent des bâtons d’encens aux vertus apaisantes.
  • Faire des choses qui me plaisent : mes morceaux préférés à la guitare, réviser ma liste de mots en allemand ou écoute de chansons en allemand et les chanter à tue-tête pour améliorer ma prononciation (coucou les voisins), faire mon plat préféré ou inventer de nouvelles recettes, faire des câlins au chat

Parce que si les média nous inondent à coups de masques et de gels, ils ne nous disent pas qu’une alimentation équilibrée, de l’exercice physique et des compléments alimentaires naturels ralentissent eux aussi la propagation des virus. Hé oui …

Résultats des courses, au bout de quelques jours seulement, je retrouve progressivement une certaine sérénité, même si j’ai tendance à envisager des scénarios catastrophes. Je suis moins en colère, je me retrouve petit à petit. Et surtout la qualité de mon sommeil a bien changé, je ne me réveille plus au cours de la nuit, plus d’insomnies ni de cauchemars, un vrai repos …

J’ai encore des soucis de concentration à l’heure actuelle mais je ne suis qu’au début de mon protocole et je me dis à terme que ça va porter ses fruits sur ma dispersion mentale.

Du tutoiement sur les réseaux sociaux

Je vais être honnête : un truc m’agace. Le vouvoiement sur les réseaux sociaux. Cette phrase peut être absurde mais elle ne l’est pas tant que ça. Dans la vraie vie, nous Français, on aime bien, quand on ne se connaît pas, mettre cette distance verbale, quitte à fustiger son interlocuteur qui glisserait un « tu » indélicat. Personnellement, ça m’arrive. Idem pour les Allemands avec leur « Sie », les Espagnols avec « usted ». Bref.

J’ai eu cette idée de post en voyant une conversation tourner au combat de poissonniers sur un thread Facebook (pléonasme), qui concernait la critique d’une photo, avec cette fameuse phrase « ouais, déjà on ne se connaît pas je ne vous permets pas de me tutoyer ! « .

Mes premiers « surfs » sur la toile datent de fin novembre 1997, soit 8 ans après la création du Web, dans le CDI de mon lycée. A l’époque, seule une certaine « elite » pouvait créer du contenu dans la toile, il fallait savoir les bases du HTML et se débrouiller avec un logiciels FTP, donc une certaine intelligence. C’était le bon temps, tu pouvais même avoir Thierry Lhermitte en prof pour qu’il t’explique tout ça (dire que je me suis débarrassée de ce CD :'( , je suis dépit) :

Mais quelque chose m’a frappée. Dans cet univers virtuel, les créateurs et ceux qui postaient dans des forums faisaient un peu comme partie d’une communauté. Rappelez-vous qu’à l’époque (pour ceux qui étaient nés, c’est un temps que les moins de 20 ans etc …), Internet était le support du projet Autoroutes de l’information et finalement, cet internet était une ideosphère qui devait réunir le monde. Pourquoi s’embêter avec un « vous », franchement, puisqu’on est tous copains ? C’était le bon temps, où les insultes envoyées étaient bon enfant, et faisaient rire.

Voici d’ailleurs un extrait d’un texte intéressant que je vous invite à lire, et qui donne une idée dans quoi on baignait à cette époque, et c’était vraiment ça (inutile de préciser que je suis tombée de haut, naïveté adolescente oblige) :

[…] Ensuite ce discours a pris une deuxième direction, parallèle de la première, consistant à valo­riser sur un mode quasi religieux le nouveau monde d’Internet. La forme rhétorique, complémentaire de la disqualification, est celle du prosélytisme. L’idée selon laquelle le réseau Internet pourrait bien servir à réaliser concrètement les vieux rêves de « conscience planétaire » du « New age », l’idéal d’une « unification universelle des consciences » ou encore la montée vers la « noosphère » chère à Teilhard de Chardin (jésuite et philosophe, qui inventa dans les années quarante la notion de « noosphère » et plaida pour une « collectivisation des consciences » à l’échelle planétaire), est devenue très populaire dans certains milieux proches de la « Toile ».

https://journals.openedition.org/ress/604

Du coup j’ai balancé une référence de la Netiquette. La Netiquette peu de gens savent ce que c’est pourtant ça date de 1994, et c’est un « contrat » (inclus dans les RFC du web) ou plutôt une charte des bonnes attitudes à avoir sur le Net. Rien de très officiel mais ça a été longtemps une référence à l’époque où le Net comptait 200 millions d’utilisateurs, et que le cadre était assez mal légiféré. Il est stipulé dans la discussion :

L’usage, dans les forums, veut qu’on utilise le tutoiement, c’est une pratique courante, bien que non généralisée sur l’ensemble des forums.

Tutoyer un inconnu sur internet, n’est pas considéré comme malpoli (encore que ça dépende du contexte et de l’usage qui règne sur le forum en question), alors que tutoyer un inconnu dans la rue, est beaucoup plus délicat (sauf rapports d’âges « favorables »)

Quand j’ai commencé à utiliser internet, il y a un paquet d’années, les articles sur la netiquette prévenait que le tutoiement ne devait pas être mal pris, que c’était l’usage le plus répandu. L’article, sans doute traduit de l’anglais, du coup, ne le mentionne pas.

Il serait quand même intéressant de traiter ce sujet, afin que les gens ne connaissant pas la nétiquette, et peu familiarisé avec l’usage des discussions sur internet, ne se sentent pas intimidés. Il ne faut pas confondre tutoiement et manque de respect. Le vouvoiement peut aussi être irrespectueux quand il est utilisé pour établir une distance.

Le tutoiement n’est bien sûr pas une obligation de la nétiquette, mais il n’est pas un comportement grossier, comme certains pourraient le penser. Internet aboli pas mal de frontières, quand on ignore l’âge, le sexe, et le statut social de la personne avec qui on discute, à bâtons rompus. ça vaut quand même le coup de le mentionner!

Wikipedia

Un bel exemple de jolie page des années 90 avec le règlement de Usenet.

Bien sur, dans les années qui suivirent, dans des cadres « formels » comme des lettres de motivation, je vouvoyais mais je n’ai jamais abordé sur les réseaux et IRC en « vous ».

Voilà un peu pourquoi ça me fait de la peine. D’autant plus que beaucoup de gens s’insultent bien comme il faut, tout en gardant le vouvoiement. Style, je t’insulte et te manque de respect, mais je reste polie.e, tavu. Paradoxal tout ça.

Personnellement, je vais être dure mais je le ressens tel, je trouve que le vous sur internet, de par mon vécu (23 années sur la Toile), a un retentissement condescendant et hypocrite, surtout quand on le voit suivi d’injures. Après, il y a une génération excusables de Boomers (la génération de mes parents, nés après-guerre qui ont donc 60-70 ans) qui sont arrivés dans les années 2000 et qui ne connaissaient pas les us et coutumes et pensent que le vouvoiement est donc de mise. Et je pense que de débarquement de gens méconnaissant ces principes, et la centralisation du net, tuant les communautés de passionnés, qui est à l’origine de cet abandon du « tu » qui nous était cher, à nous, premiers arrivés.

Donc ne m’en veux pas si je te tutoie, internaute, même si tu me vouvoies auparavant, car ce sont mes règles, mes repères, et si tu es respectueux je le serai aussi 😉 . Je garde le vous pour mes prospects (et encore !), mes conversations sur LinkedIn (réseau professionnel oblige, donc formel) ou les organismes-suceurs.

Ces organismes-suceurs-là