<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

 <title>Ex commito</title>
 <link href="http://kray.me/atom.xml" rel="self"/>
 <link href="http://kray.me/"/>
 <updated>2026-08-14T05:38:47+00:00</updated>
 <id>http://kray.me</id>
 <author>
   <name>Fabrice Laporte</name>
   <email></email>
 </author>

 
 <entry>
   <title>Cévennes en van</title>
   <link href="http://kray.me/travel/2026/07/cevennes/"/>
   <updated>2026-07-29T00:00:00+00:00</updated>
   <id>http://kray.me/travel/2026/07/cevennes</id>
   <content type="html">&lt;p&gt;Van récupéré à Toulouse le 29 au matin, rendu le 2 au matin. Programme avec le fils : culture gourmande, outdoor (canyon, via ferrata), animaux (âne), campings avec piscine. On cible les Cévennes/Grands Causses &lt;strong&gt;sans dépasser le viaduc de Millau&lt;/strong&gt;, avec &lt;strong&gt;200 km de route max par jour&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Les distances et temps de van ci-dessous sont &lt;strong&gt;approximatifs&lt;/strong&gt; (routes de causse et de gorges souvent sinueuses, prévoir de la marge).&lt;/p&gt;

&lt;h2 id=&quot;jour-1--sam-29--toulouse--millau-route-directe-2-h-max&quot;&gt;Jour 1 — Sam 29 : Toulouse → Millau (route directe, 2 h max)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Toulouse → Millau&lt;/strong&gt; — ~180 km · &lt;strong&gt;~2 h&lt;/strong&gt; (A68/A75)
On file direct pour rester dans les 2 h. Installation au camping piscine à Millau, et fin d’après-midi tranquille : point de vue sur le viaduc. Limite Est du séjour.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total J1 : ~180 km · ~2 h de van&lt;/strong&gt; &lt;em&gt;(trajet le plus tendu du séjour, partir tôt)&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;jour-2--dim-30--outdoor-gorges-du-tarn&quot;&gt;Jour 2 — Dim 30 : Outdoor Gorges du Tarn&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Millau → Le Rozier / Rousses&lt;/strong&gt; — ~20 km · &lt;strong&gt;~30 min&lt;/strong&gt; (aller)
Via ferrata familiale + canyoning (formule combinée matin/aprem). Canyon famille dès 7 ans. Option canoë sur le Tarn.&lt;/li&gt;
  &lt;li&gt;Nuit à Millau ou à Mostuéjouls (camping Les Bords du Tarn, piscine + bassin ludique).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total J2 : ~40 km · ~1 h de van&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;jour-3--lun-31--gorges-du-tarn--médiéval--âne-recentré&quot;&gt;Jour 3 — Lun 31 : Gorges du Tarn — médiéval + âne (recentré)&lt;/h2&gt;

&lt;p&gt;Journée sans presque bouger le van, tout est dans les gorges autour du camping.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Château de Peyrelade&lt;/strong&gt; (Rivière-sur-Tarn) — ~5 km · &lt;strong&gt;~10 min&lt;/strong&gt;
Forteresse en ruine perchée à l’entrée des Gorges du Tarn, tour et panorama sur les gorges. &lt;em&gt;Château médiéval.&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Balade avec un âne&lt;/strong&gt; (secteur Gorges du Tarn / Causse) — matinée, demi-journée (~55 €)
L’âne porte le sac, rythme parfait pour l’enfant. &lt;em&gt;Animaux.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Après-midi &lt;strong&gt;au choix&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Belvédère des Vautours&lt;/strong&gt; (Le Truel, Gorges de la Jonte) — ~10 km · &lt;strong&gt;~15 min&lt;/strong&gt;
Observation des vautours fauves en vol libre, centre pédagogique. &lt;em&gt;Animaux.&lt;/em&gt; Puis baignade dans le Tarn.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Aven Armand&lt;/strong&gt; (Causse Méjean) — ~35 km · &lt;strong&gt;~35 min&lt;/strong&gt;
Grotte géologique spectaculaire : « forêt vierge » de stalagmites, la plus haute du monde (~30 m). Pas préhistorique, mais l’effet waouh est garanti pour l’enfant.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Nuit au même camping.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total J3 : ~40 km · ~1 h de van&lt;/strong&gt; (option Aven Armand : ~110 km · ~2 h 10)&lt;/p&gt;

&lt;h2 id=&quot;jour-4--mar-1--roquefort--albi-on-rentre-en-douceur&quot;&gt;Jour 4 — Mar 1 : Roquefort → Albi (on rentre en douceur)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Millau → Roquefort-sur-Soulzon&lt;/strong&gt; — ~30 km · &lt;strong&gt;~35 min&lt;/strong&gt;
Visite des caves de Roquefort creusées dans la falaise (Papillon : visite gratuite ; Société : parcours enfant 7-15 ans avec dégustation). &lt;em&gt;Fabrique gourmande.&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Roquefort → Albi&lt;/strong&gt; — ~90 km · &lt;strong&gt;~1 h 30&lt;/strong&gt;
Nuit au camping à Albi (piscine). En soirée, option balade : cathédrale Sainte-Cécile et cité épiscopale (UNESCO). Albi est à ~1 h de Toulouse → retour easy le lendemain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total J4 : ~120 km · ~2 h 05 de van&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;jour-5--mer-2-matin--retour-toulouse-1-h-max&quot;&gt;Jour 5 — Mer 2 matin : retour Toulouse (1 h max)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Albi → Toulouse&lt;/strong&gt; — ~75 km · &lt;strong&gt;~1 h&lt;/strong&gt; (A68)
Restitution du van.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total J5 : ~75 km · ~1 h de van&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;camping-sauvage--bivouac&quot;&gt;Camping sauvage / bivouac&lt;/h2&gt;

&lt;p&gt;Le bivouac est toléré mais réglementé dans le secteur (souvent 19 h → 9 h, tente uniquement, pas de van/voiture en pleine nature, pas de feu). Avec un van, rester sur les campings (piscine pour le fils) est plus serein, avec éventuellement une nuit bivouac tente lors de la rando âne. Les aires France Passion (ferme/vigneron) sont une bonne alternative légale pour une nuit en van.&lt;/p&gt;

&lt;h2 id=&quot;à-réserver-tôt&quot;&gt;À réserver tôt&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Via ferrata + canyon (créneaux guides fin juillet/début août).&lt;/li&gt;
  &lt;li&gt;Balade âne (petits effectifs).&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Barcelona</title>
   <link href="http://kray.me/travel/2025/02/barcelona/"/>
   <updated>2025-02-27T00:00:00+00:00</updated>
   <id>http://kray.me/travel/2025/02/barcelona</id>
   <content type="html">&lt;iframe width=&quot;100%&quot; height=&quot;300px&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; allow=&quot;geolocation&quot; src=&quot;//umap.openstreetmap.fr/fr/map/barcelona-trip_1182855?scaleControl=false&amp;amp;miniMap=false&amp;amp;scrollWheelZoom=false&amp;amp;zoomControl=true&amp;amp;editMode=disabled&amp;amp;moreControl=true&amp;amp;searchControl=null&amp;amp;tilelayersControl=null&amp;amp;embedControl=null&amp;amp;datalayersControl=true&amp;amp;onLoadPanel=none&amp;amp;captionBar=false&amp;amp;captionMenus=true#8/42.393/1.280&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href=&quot;//umap.openstreetmap.fr/fr/map/barcelona-trip_1182855?scaleControl=false&amp;amp;miniMap=false&amp;amp;scrollWheelZoom=true&amp;amp;zoomControl=true&amp;amp;editMode=disabled&amp;amp;moreControl=true&amp;amp;searchControl=null&amp;amp;tilelayersControl=null&amp;amp;embedControl=null&amp;amp;datalayersControl=true&amp;amp;onLoadPanel=none&amp;amp;captionBar=false&amp;amp;captionMenus=true#8/42.393/1.280&quot;&gt;Voir en plein écran&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;&quot;&gt;See photos&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;jeudi-27-fev&quot;&gt;Jeudi 27 Fev&lt;/h3&gt;
&lt;details&gt;
  &lt;summary&gt;🚗 4h45 Bègles =&amp;gt; Bagnères de Luchon&lt;/summary&gt;
  &lt;p&gt;&lt;img src=&quot;https://i.postimg.cc/769TSBCc/Selection-387.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;(1h15) Bègles =&amp;gt; Bazas&lt;/li&gt;
    &lt;li&gt;(3h30) Bazas =&amp;gt; Bagnères de Luchon&lt;/li&gt;
  &lt;/ul&gt;
&lt;/details&gt;
&lt;p&gt;🛏️ &lt;a href=&quot;https://www.airbnb.fr/rooms/846920040332420977?source_impression_id=p3_1739431884_P3xFP3C_86Fa8nYu&quot;&gt;La maison de Caroline, chambre 2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La fête du Boeuf à Bazas est dans une ambiance moins familiale que je ne le pensais (on se rapproche de l’esprit fête de village), très sympa mais pas forcément dans l’esprit cette année où il va falloir reprendre la route dans la foulée.&lt;br /&gt;
Impossible de s’attabler à un restau pour tester une côte de boeuf car trop de monde.&lt;br /&gt;
Le airbnb est chouette très cosy avec sa cheminée, son poêle, bcp de livres et une chatte prénommée “Clochette”&lt;/p&gt;

&lt;h3 id=&quot;vendredi-28-fev&quot;&gt;Vendredi 28 Fev&lt;/h3&gt;

&lt;p&gt;📍 Bagnères de Luchon
🛏️ &lt;a href=&quot;https://www.airbnb.fr/rooms/846920040332420977?source_impression_id=p3_1739431884_P3xFP3C_86Fa8nYu&quot;&gt;La maison de Caroline, chambre 2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Belle journée mais la neige n’est pas tombée cette nuit, je décide de ne pas louer de skis vu les conditions et de partir en randonnée (tip pour la prochaine fois : monter au sommet quand c’est comme ça) .&lt;br /&gt;
En revenant au village chacun a droit à son moment fort : Nelson fait un tour d’auto-tamponneuses, je teste la bière locale de la Brasserie du Vénasque.&lt;/p&gt;

&lt;h3 id=&quot;samedi-1er-mars&quot;&gt;Samedi 1er Mars&lt;/h3&gt;

&lt;details&gt;
  &lt;summary&gt;🚗 4h45 Bagnères de Luchon =&amp;gt; Matadepera&lt;/summary&gt;
  &lt;p&gt;&lt;img src=&quot;https://i.postimg.cc/CLwgKkqR/Selection-388.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;(2h) Bagnères de Luchon =&amp;gt; Congost de Mont-rebei&lt;/li&gt;
    &lt;li&gt;(2h45) Congost de Mont-rebei =&amp;gt; Matadepera&lt;/li&gt;
  &lt;/ul&gt;
&lt;/details&gt;

&lt;p&gt;🛏️ &lt;a href=&quot;https://www.airbnb.fr/rooms/1021599813197691565?source_impression_id=p3_1739431687_P3Hh7KYtU9Ty6idc&quot;&gt;Chambre - Matadepera&lt;/a&gt;&lt;/p&gt;

&lt;details&gt;
  &lt;summary&gt;Programme&lt;/summary&gt;
  &lt;p&gt;Journée de transition&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Congost de Mont-rebei : randonnée spectaculaire à travers un canyon creusé par la rivière Noguera Ribagorçana&lt;/li&gt;
    &lt;li&gt;Arriver pas trop tard au airbnb pour profiter du coin qui a l’air cool&lt;/li&gt;
  &lt;/ul&gt;
&lt;/details&gt;

&lt;h3 id=&quot;dimanche-2-mars&quot;&gt;Dimanche 2 Mars&lt;/h3&gt;

&lt;details&gt;
  &lt;summary&gt;🚗 1h Matadepera =&amp;gt; L&apos;Hospitalet de Llobregat&lt;/summary&gt;
  &lt;p&gt;&lt;img src=&quot;https://i.postimg.cc/CLwgKkqR/Selection-389.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/details&gt;

&lt;p&gt;🛏️ &lt;a href=&quot;https://www.airbnb.fr/rooms/1083904054391290829?source_impression_id=p3_1739432171_P39zgpD0n4cNDPdW&quot;&gt;Grande chambre avec balcon&lt;/a&gt;&lt;/p&gt;

&lt;details&gt;
  &lt;summary&gt;Programme&lt;/summary&gt;
  &lt;ul&gt;
    &lt;li&gt;Chercher un parking gratuit proche du airbnb, la voiture restera là pour 2j&lt;/li&gt;
    &lt;li&gt;&lt;span class=&quot;label label-red&quot;&gt;&lt;code&gt;TODO&lt;/code&gt;&lt;/span&gt; se renseigner sur tickets transports sur 2 jours&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h4 id=&quot;h00---12h30--tlphrique-de-montjuc-&quot;&gt;&lt;strong&gt;11h00 - 12h30&lt;/strong&gt; : Téléphérique de Montjuïc 🚠&lt;/h4&gt;
  &lt;ul&gt;
    &lt;li&gt;Départ en métro vers Montjuïc.&lt;/li&gt;
    &lt;li&gt;Monte avec le téléphérique et profite de la vue.&lt;/li&gt;
    &lt;li&gt;Visite rapide du &lt;strong&gt;Castell de Montjuïc&lt;/strong&gt;.&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h4 id=&quot;h30---14h00--djeuner&quot;&gt;&lt;strong&gt;12h30 - 14h00&lt;/strong&gt; : Déjeuner&lt;/h4&gt;
  &lt;ul&gt;
    &lt;li&gt;Options : &lt;strong&gt;quartier du Born&lt;/strong&gt; ou &lt;strong&gt;face à la mer à Barceloneta&lt;/strong&gt;.&lt;/li&gt;
    &lt;li&gt;Suggestions : &lt;strong&gt;menu paella&lt;/strong&gt; ou &lt;strong&gt;tapas&lt;/strong&gt;.&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h4 id=&quot;h00---16h00--balade&quot;&gt;&lt;strong&gt;14h00 - 16h00&lt;/strong&gt; : Balade&lt;/h4&gt;
  &lt;ul&gt;
    &lt;li&gt;Flânerie dans le &lt;strong&gt;Barri Gòtic&lt;/strong&gt; ou le long du &lt;strong&gt;Passeig de Gràcia&lt;/strong&gt;.&lt;/li&gt;
    &lt;li&gt;Option : pause café ou glace à la &lt;strong&gt;Boqueria&lt;/strong&gt;.&lt;/li&gt;
    &lt;li&gt;Départ vers le &lt;strong&gt;Palau Blaugrana&lt;/strong&gt;&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h4 id=&quot;h-basket-barcelone---ro-breogn-au-palau-blaugrana&quot;&gt;17h Basket Barcelone - Río Breogán au Palau Blaugrana&lt;/h4&gt;
&lt;/details&gt;

&lt;h3 id=&quot;lundi-3-mars&quot;&gt;Lundi 3 Mars&lt;/h3&gt;

&lt;p&gt;📍 L’Hospitalet de Llobregat&lt;br /&gt;
🛏️ &lt;a href=&quot;https://www.airbnb.fr/rooms/1083904054391290829?source_impression_id=p3_1739432171_P39zgpD0n4cNDPdW&quot;&gt;Grande chambre avec balcon&lt;/a&gt;&lt;/p&gt;

&lt;details&gt;
  &lt;summary&gt;Programme&lt;/summary&gt;

  &lt;h4 id=&quot;h00---10h30---muse-des-sciences-cosmocaixa-&quot;&gt;&lt;strong&gt;9h00 - 10h30&lt;/strong&gt; :  Musée des sciences CosmoCaixa 🔬&lt;/h4&gt;
  &lt;ul&gt;
    &lt;li&gt;Visite interactive du &lt;strong&gt;Bosc Inundat&lt;/strong&gt; (forêt amazonienne recréée).&lt;/li&gt;
    &lt;li&gt;Expériences scientifiques et planétarium (selon disponibilité).&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h4 id=&quot;h00---13h30--djeuner-dans-le-quartier-de-grcia-ou-eixample&quot;&gt;&lt;strong&gt;12h00 - 13h30&lt;/strong&gt; : Déjeuner dans le quartier de Gràcia ou Eixample&lt;/h4&gt;
  &lt;ul&gt;
    &lt;li&gt;Options : tapas modernes, cuisine catalane ou menus du jour abordables.&lt;/li&gt;
    &lt;li&gt;Suggestions : &lt;strong&gt;El Nacional&lt;/strong&gt; (plus chic), &lt;strong&gt;Bar Mut&lt;/strong&gt;, ou un bistrot local&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h4 id=&quot;h45---15h00--sagrada-famlia-&quot;&gt;&lt;strong&gt;13h45 - 15h00&lt;/strong&gt; : Sagrada Família ⛪&lt;/h4&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Visite intérieure&lt;/strong&gt; (réserve les billets à l’avance pour éviter l’attente).&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h4 id=&quot;h00---18h00--optionnel--aquarium-de-barcelone--si-le-timing-le-permet&quot;&gt;&lt;strong&gt;16h00 - 18h00&lt;/strong&gt; : Optionnel – Aquarium de Barcelone 🦈 (&lt;em&gt;si le timing le permet&lt;/em&gt;)&lt;/h4&gt;
  &lt;ul&gt;
    &lt;li&gt;Descente en métro vers Port Vell.&lt;/li&gt;
    &lt;li&gt;Visite rapide des tunnels sous-marins et du bassin des requins.&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h4 id=&quot;h00---20h00--dpart-vers-la-fte-de-sant-medir-&quot;&gt;&lt;strong&gt;18h00 - 20h00&lt;/strong&gt; : Départ vers la Fête de Sant Medir 🎭&lt;/h4&gt;
  &lt;ul&gt;
    &lt;li&gt;Direction &lt;strong&gt;Gràcia&lt;/strong&gt; pour les festivités traditionnelles.&lt;/li&gt;
    &lt;li&gt;Défilés, fanfares, distribution de bonbons et ambiance locale.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/details&gt;

&lt;h3 id=&quot;4-mars&quot;&gt;4 Mars&lt;/h3&gt;

&lt;details&gt;
&lt;summary&gt;
🚗 4h30 L&apos;Hospitalet de Llobregat =&amp;gt; Toulouse
&lt;/summary&gt;&lt;div&gt;
    &lt;ul&gt;
      &lt;li&gt;(1h30) L’Hospitalet de Llobregat =&amp;gt; Figueras&lt;/li&gt;
      &lt;li&gt;(2h30) Figueras =&amp;gt; Toulouse&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;🛏️ cousin Laurent &lt;del&gt;&lt;span class=&quot;label label-green&quot;&gt;&lt;code&gt;TODO&lt;/code&gt;&lt;/span&gt; contacter cousin Laurent&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;Musée Dali à Figueras&lt;/p&gt;

&lt;h1 id=&quot;5-mars&quot;&gt;5 Mars&lt;/h1&gt;

&lt;p&gt;🚗 3h Toulouse =&amp;gt; Bègles&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;(1h30) Toulouse =&amp;gt; Prayssas&lt;/li&gt;
  &lt;li&gt;(2h30) Prayssas =&amp;gt; Bègles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Visites tantes&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Make gif from a youtube video</title>
   <link href="http://kray.me/2025/02/add_gif_to_whatsapp/"/>
   <updated>2025-02-08T00:00:00+00:00</updated>
   <id>http://kray.me/2025/02/add_gif_to_whatsapp</id>
   <content type="html">&lt;ul&gt;
  &lt;li&gt;use &lt;code&gt;yt-dlp YOUTUBE_URL&lt;/code&gt; to download the video&lt;/li&gt;
  &lt;li&gt;use &lt;code&gt;ffmpeg -ss HH:MM:SS.xxx -i INPUT.mp4 -t HH:MM:SS.xxx -c copy OUT.mp4&lt;/code&gt; to extract duration (&lt;code&gt;-t&lt;/code&gt;) from start timestamp &lt;code&gt;-ss&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;upload on ezgif to crop, add text captions and optimize&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Pawn races five golden rules</title>
   <link href="http://kray.me/chess/2025/02/pawn_rules/"/>
   <updated>2025-02-04T00:00:00+00:00</updated>
   <id>http://kray.me/chess/2025/02/pawn_rules</id>
   <content type="html">&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Gu1jnDjEXT8&amp;amp;t=530s&quot;&gt;Rule 1&lt;/a&gt;: Don‘t take unnecessary pawns.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Gu1jnDjEXT8&amp;amp;t=915s&quot;&gt;Rule 2&lt;/a&gt;: Don‘t put your king in the checking zone of your opponents passing pawns.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Gu1jnDjEXT8&amp;amp;t=1505s&quot;&gt;Rule 3&lt;/a&gt;: Simultaneous queen promotion doesn’t always imply a draw.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Gu1jnDjEXT8&amp;amp;t=1770s&quot;&gt;Rule 4&lt;/a&gt;: Use your king to force the other king into the checking zone of your passing pawns or to prevent the other king from stopping your pawn.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Gu1jnDjEXT8&amp;amp;t=2505s&quot;&gt;Rule 5&lt;/a&gt;: Prepare for a pawn race by pushing the prospective passer beforehand.&lt;br /&gt;
Bonus rule: You don‘t always have to participate in a pawn race.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Course contre-la-montre à l&apos;aéroport</title>
   <link href="http://kray.me/dream/4c3320/"/>
   <updated>2025-01-18T00:00:00+00:00</updated>
   <id>http://kray.me/dream/course_aeroport</id>
   <content type="html">&lt;div class=&quot;dream-dissipate-image&quot;&gt;
    &lt;img src=&quot;/public/img/posts/dream/20250118.jpg&quot; alt=&quot;un homme court un téléphone dans la main dans des couloirs déserts sous-terrains betonnés aseptisés labyrinthique. Quelques panneaux comme dans les aéroports indiquent direction. c&apos;est bas de plafond. Plan large où on voit l&apos;homme perdu. Peinture dans le style de picasso&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(en extérieur dans une ville [qui pourrait être Maisons-Alfort])&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Coup de téléphone avec Alice on se donne RDV à l’aéroport.&lt;br /&gt;
On est à vélo, Alice me distance (je vais passer tout le rêve à la voir de dos/ne pas la voir).&lt;br /&gt;
On arrive à ce qui ressemble à une station de RER on n’accroche pas les vélos au même endroit, je pers du temps à accrocher mon anti-vol.&lt;br /&gt;
Je l’ai perdu de vure, je cours des centaines de mètres dans le réseau souterrain, [j’essaie de la joindre mais pas de réseau], j’ai peur de rater l’embarquement. Il s’agit d’une destination exotique [[genre Ahmedabad&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;]] &lt;span class=&quot;label label-black&quot;&gt;?!&lt;/span&gt;&lt;br /&gt;
Dans ma tête je me répète que cette fois [c’est fini entre nous, avec ce raté elle ne me pardonnera jamais] &lt;span class=&quot;label label-red&quot;&gt;?&lt;/span&gt;.&lt;br /&gt;
J’arrive à l’avoir au bout du fil, elle est en pleurs disant qu’il n’y a plus de place pour sa mère.&lt;br /&gt;
&lt;em&gt;F- Où es tu ?&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;A- Derrière le stand de ta boîte&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;J’arrive dans un grand hall, au milieu duquel se trouve un pauvre stand, je vais derrière et accède à second hall. Je la vois en pleurs, il y’a mes tantes assises avec elle, je dis bonjour à Marie-Rose.&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;label label-gray&quot;&gt;💥&lt;/span&gt;&lt;span class=&quot;label label-green&quot;&gt;!&lt;/span&gt; Happy-end, &lt;small&gt;[[je me transforme en papillon et donne ma place à la mère d’Alice et Veejay]]&lt;/small&gt; .&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;dans mon enregistrement audio je dis “Ahmedabad, en Inde” alors qu’à tête reposée, un mois après je plaçais la ville au Moyen-Orient &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Training program (February)</title>
   <link href="http://kray.me/chess/2025/01/training/"/>
   <updated>2025-01-08T00:00:00+00:00</updated>
   <id>http://kray.me/chess/2025/01/training</id>
   <content type="html">&lt;h3 id=&quot;principles-of-chess-endgames--gm-naroditsky&quot;&gt;Principles of Chess Endgames / GM Naroditsky&lt;/h3&gt;
&lt;details&gt;
  &lt;summary&gt;
    4/5/18
    








  &lt;!-- Default green color --&gt;





&lt;style&gt;
  .progress-container {
    display: flex;
    height: 12px;
    width: 100%;
    background: #ddd;
    border-radius: 6px;
    overflow: hidden;
  }
  .done-progress, .target-progress, .remaining-progress {
    height: 100%;
  }
&lt;/style&gt;

&lt;div class=&quot;progress-container&quot;&gt;
  &lt;div class=&quot;done-progress&quot; style=&quot;background: Gold; width: 22%;&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;target-progress&quot; style=&quot;background: rgba(0, 0, 0, 0.2); width: 5%; border-top-right-radius: 6px; border-bottom-right-radius: 6px;&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;remaining-progress&quot; style=&quot;background: #ddd; width: 73%;&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
  
  &lt;/summary&gt;
  &lt;br /&gt;
&lt;div&gt;
    &lt;ul class=&quot;task-list&quot;&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; checked=&quot;checked&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=mhUoe2JBxco&quot;&gt;Principles of Chess Endgames / King Activity&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; checked=&quot;checked&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=QUqq7wSLE78&quot;&gt;Introduction to Pawn Endgames / Principles of Chess Endgames&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; checked=&quot;checked&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=W0Lw4ox_n_M&quot;&gt;Understanding Passed Pawns / Principles of Chess Endgames&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; checked=&quot;checked&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Gu1jnDjEXT8&quot;&gt;Pawn Races / Principles of Chess Endgames&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=iyl_vVXeFuI&quot;&gt;Pawn Breakthroughs / Principles of Chess Endgames&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=mEZHigJCtls&quot;&gt;Knight Vs Bishop Endgame / Principles of Chess Endgames&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=oRK7XLhGz_c&quot;&gt;Bishop + Knight Mate Simplified / Principles of Chess Endgames&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=n3FufrVltsc&quot;&gt;Using Your King / Beginner to Master / Principles of Chess Endgames&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Fxjthnv7mBQ&quot;&gt;Advanced Pawn Endgame Concepts / Beginner to Master / Principles of Chess Endgames&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=VWeZ8m34BSk&quot;&gt;Test Your Pawn Endgame Knowledge, Part 1 / Principles of Chess Endgames&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=qTKk-cGcTZ4&quot;&gt;Test Your Pawn Endgame Knowledge, Part 2 / Principles of Chess Endgames&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=CCLlstRUbAc&quot;&gt;Knight vs Pawns / Beginner to Master / Principles of Chess Endgames&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=hUZo3_gKm7k&quot;&gt;The 5 Best Endgames from the Pro Chess League!&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=7MmwcJxi0eA&quot;&gt;The Best Endgames from the Chess.com Champion Chess Tour Final!&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=mKKDE17DkjY&quot;&gt;Knight v. Pawn Endings, Part 1 / Test Your Knowledge / Principles of Chess Endgames&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=olIn0oJccHI&quot;&gt;The Most Instructive Endgames from the CCT / Analyzing the Rook’s Secrets / Part 2!&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=owTm2uYWym4&quot;&gt;Knight vs. Pawns / Two Incredible Endgames / Principles of Chess Endgames&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=g7AcF_hQhvg&quot;&gt;Knight v. Pawn Endings, Part 2 / Test Your Knowledge / Principles of Chess Endgames&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;

  &lt;/div&gt;
&lt;/details&gt;

&lt;h3 id=&quot;sicilienne-blitzstream&quot;&gt;Sicilienne Blitzstream&lt;/h3&gt;
&lt;details&gt;
  &lt;summary&gt;
    1/3/9









  &lt;!-- Default green color --&gt;





&lt;style&gt;
  .progress-container {
    display: flex;
    height: 12px;
    width: 100%;
    background: #ddd;
    border-radius: 6px;
    overflow: hidden;
  }
  .done-progress, .target-progress, .remaining-progress {
    height: 100%;
  }
&lt;/style&gt;

&lt;div class=&quot;progress-container&quot;&gt;
  &lt;div class=&quot;done-progress&quot; style=&quot;background: Orange; width: 11%;&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;target-progress&quot; style=&quot;background: rgba(0, 0, 0, 0.2); width: 22%; border-top-right-radius: 6px; border-bottom-right-radius: 6px;&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;remaining-progress&quot; style=&quot;background: #ddd; width: 67%;&quot;&gt;&lt;/div&gt;
&lt;/div&gt;

  &lt;/summary&gt;
  &lt;br /&gt;

&lt;div&gt;
    &lt;ul class=&quot;task-list&quot;&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; checked=&quot;checked&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=C4P6MdNiScQ&amp;amp;ab_channel=Echecs-Blitzstream&quot;&gt;Introduction au Répertoire “Dragon Accéléré” avec les noirs&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=vzVM-FlAF_0&amp;amp;t=770s&amp;amp;ab_channel=Echecs-Blitzstream&quot;&gt;Le dragon accéléré - des pièges et la variante 0-0 pour les blancs&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=-yKwPyTqIs8&amp;amp;ab_channel=Echecs-Blitzstream&quot;&gt;Le dragon accéléré - l’étau de Maroczy&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=A-TmQf0A384&amp;amp;ab_channel=Echecs-Blitzstream&quot;&gt;Le dragon accéléré - J’ai toutes les cases noires&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=TIGY9fl_Fqc&amp;amp;pp=ygUSYmxpdHpzdHJlYW0gZHJhZ29u&quot;&gt;Tour d’horizon de la Sicilienne&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=y0kBE44xcJI&amp;amp;list=PLiZ56cRXeIu1F12A18euoB6fEm72uXKo5&amp;amp;index=4&amp;amp;pp=iAQB&quot;&gt;Sacrifice de dame de Nezhmetdinov&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=yzntUJvQ70w&amp;amp;list=PLiZ56cRXeIu1F12A18euoB6fEm72uXKo5&amp;amp;index=6&amp;amp;ab_channel=Echecs-Blitzstream&quot;&gt;Larsen ne veut pas faire nulle contre Bobby Fischer !!&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zO8-e7C3m1o&amp;amp;list=PLiZ56cRXeIu1F12A18euoB6fEm72uXKo5&amp;amp;index=7&amp;amp;ab_channel=Echecs-Blitzstream&quot;&gt;Partie pédagogique modèle contre la Sicilienne Dragon par Matthieu Cornette&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=_ywy3_uNwtw&amp;amp;ab_channel=BlitzstreamFacile&quot;&gt;L’ouverture Sicilienne: Maîtrisez ces plans essentiels pour dominer vos adversaires&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
&lt;/details&gt;
</content>
 </entry>
 
 <entry>
   <title>post-commit hook to generate a changelog page for your Jekyll site</title>
   <link href="http://kray.me/2025/01/post_commit_changelog/"/>
   <updated>2025-01-05T00:00:00+00:00</updated>
   <id>http://kray.me/2025/01/post_commit_changelog</id>
   <content type="html">&lt;p&gt;Last year I decided to &lt;a href=&quot;/2024/05/jekyll_private_repo/&quot;&gt;make my blog private&lt;/a&gt;, it enables me to have private sections accessible only to those who have the url.&lt;br /&gt;
Yet, I missed some of the transparency history provided by public repositories and opted for an in-between solution :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;for each commit of type &lt;code&gt;feat&lt;/code&gt; or &lt;code&gt;fix&lt;/code&gt; a line is added on the &lt;em&gt;Changelog&lt;/em&gt; page&lt;/li&gt;
  &lt;li&gt;some filepaths can be kept secret by not reporting related commits&lt;/li&gt;
  &lt;li&gt;although &lt;em&gt;Changelog&lt;/em&gt; page additions are automated, commiting it is a task left to human operator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please find details of my solution relying on a git post-commit hook in the aptly named &lt;code&gt;post-commit-changelog&lt;/code&gt; branch of my &lt;a href=&quot;https://github.com/Kraymer/jekyll/tree/post-commit-changelog&quot;&gt;Jekyll fork&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Sicilian opening principles with Black</title>
   <link href="http://kray.me/chess/2024/12/sicilian_opening/"/>
   <updated>2024-12-29T00:00:00+00:00</updated>
   <id>http://kray.me/chess/2024/12/sicilian_opening</id>
   <content type="html">&lt;div class=&quot;warning-box&quot;&gt;
    &lt;span class=&quot;warning-icon&quot;&gt;🤖&lt;/span&gt;
    &lt;p class=&quot;warning-text&quot;&gt;&lt;b&gt;The post below is generated by Chat-GPT&lt;/b&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;iframe style=&quot;width: 100%; aspect-ratio: 3/2;&quot; src=&quot;https://lichess.org/study/embed/yRhX2072/3qgXV7lX&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;The Sicilian Defense is a hypermodern opening, meaning you counterattack rather than immediately fight for the center.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;golden-rule&quot;&gt;Golden Rule&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Use …d5 to challenge White’s central control whenever possible.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Counter White’s kingside castling with queenside play (e.g., …a6, …b5).&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Stay flexible and adapt to White’s approach. The Sicilian thrives on dynamic counterattacks.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;1-use-d5-to-challenge-whites-central-control&quot;&gt;1. Use …d5 to Challenge White’s Central Control&lt;/h2&gt;

&lt;h3 id=&quot;why-it-works&quot;&gt;Why It Works&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;The move …d5 is a key central break in the Sicilian. It challenges White’s e4 pawn, undermines their central control, and opens lines for your pieces, especially your light-squared bishop and rooks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;when-to-play-d5&quot;&gt;When to Play …d5&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;White has committed their pawn structure:&lt;/strong&gt; If White plays Nc3, c3, or d3, their setup makes it harder for them to respond effectively to …d5.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Your pieces are well-developed:&lt;/strong&gt; Ensure your knights, pawns, and rooks are in positions to support central play.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;You have the opportunity to gain a tempo:&lt;/strong&gt; Play …d5 if White cannot maintain their central pawn without losing time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;examples&quot;&gt;Examples&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 d5!&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;Black strikes in the center, equalizing dynamically.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code&gt;1.e4 c5 2.Nf3 Nc6 3.c3 Nf6 4.d3 d5!&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;Exploiting White’s slower structure.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;caution&quot;&gt;Caution&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Don’t play …d5 prematurely. If White can counter with e5 or respond with superior development, your position may become awkward.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;2-counter-whites-kingside-castling-with-queenside-play&quot;&gt;2. Counter White’s Kingside Castling with Queenside Play&lt;/h2&gt;

&lt;h3 id=&quot;why-it-works-1&quot;&gt;Why It Works&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Most Sicilian positions result in White castling kingside early while you delay castling. This creates an asymmetry where you attack on the queenside, aiming to open files for your rooks, while White attacks on the kingside.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;key-moves-for-queenside-play&quot;&gt;Key Moves for Queenside Play&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;…a6, …b5:&lt;/strong&gt; Start your pawn storm on the queenside to undermine White’s queenside structure or create open lines for your rooks.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;…Bb7:&lt;/strong&gt; Activate your dark-squared bishop to pressure the center or support the queenside push.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;…Rc8:&lt;/strong&gt; Place your rook on the c-file to pressure White’s c2 pawn or exploit an open file.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;examples-1&quot;&gt;Examples&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 b5!&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;Black begins queenside counterplay before committing to castling.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code&gt;1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.O-O Bg7 5.Re1 a6 6.Bxc6 dxc6 7.d3 b5!&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;Queenside pawns advance, opening files and gaining space.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;caution-1&quot;&gt;Caution&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Avoid rushing queenside play if White can counterattack before your pieces are coordinated.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;3-stay-flexible-and-adapt-to-whites-approach&quot;&gt;3. Stay Flexible and Adapt to White’s Approach&lt;/h2&gt;

&lt;h3 id=&quot;why-it-works-2&quot;&gt;Why It Works&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;The Sicilian is a counterattacking defense where you thrive on creating imbalances. Staying flexible allows you to adapt to White’s strategy while maintaining dynamic potential.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;key-principles-for-flexibility&quot;&gt;Key Principles for Flexibility&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Delay Castling:&lt;/strong&gt; Postpone kingside castling until you know whether White’s attack is premature or serious. Sometimes you may castle queenside for counterplay.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Prepare Multiple Plans:&lt;/strong&gt; Have options for both queenside and central play. For instance, you can pivot between playing …d5 or advancing queenside pawns.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Exploit Weaknesses:&lt;/strong&gt; If White creates weaknesses (e.g., an exposed king, overextended pawns), shift your strategy to exploit them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;examples-2&quot;&gt;Examples&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;If White avoids Nc3 or delays pawn moves, consider fianchettoing your bishop with …g6, …Bg7 to keep control of the center and maintain flexibility.&lt;/li&gt;
  &lt;li&gt;If White overextends on the kingside, delay queenside pawn pushes and prepare counterattacks in the center with …d5.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;caution-2&quot;&gt;Caution&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Avoid becoming too passive. The Sicilian’s strength lies in its ability to create dynamic chances, so look for active moves.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Grattage de dos devant Powerpoint</title>
   <link href="http://kray.me/dream/027a4e/"/>
   <updated>2024-12-22T00:00:00+00:00</updated>
   <id>http://kray.me/dream/grattage_dos_powerpoint</id>
   <content type="html">&lt;p&gt;&lt;em&gt;(une salle de réunion inconnue)&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;dream-dissipate-image&quot;&gt;
    &lt;img src=&quot;/public/img/posts/dream/20241222.jpg&quot; alt=&quot;salle de réunion, des slides sont projetées sur écran avec un homme qui les présente. une femme brune est assise dans un canapé, un garçon est assis à coté et lui gratte le dos. Impressionist style&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;Avec [5] collègues, on regarde des [slides/un petit film] présenté par Arthur d’A., où il nous présente les travaux sur lesquels il travaillait dans son ancienne boîte.&lt;/p&gt;

&lt;p&gt;Des slides ambiance &lt;a href=&quot;https://www.reddit.com/r/Giscardpunk&quot;&gt;Giscard punk&lt;/a&gt;, un brin désuètes dans des tons marron/orange., avec des, il présente un poste de conducteur avec des mécaniques un peu compliquées pour faire en sorte que le conducteur dépense le moins d’efforts. Il nous explique que pendant des années, il travaillait sur le thème du confort du poste de travail d’un conducteur de train. 
&lt;span class=&quot;label label-red&quot;&gt;?&lt;/span&gt; &lt;small&gt;[[ Il évoque Will Smith dans &lt;em&gt;I, Robot&lt;/em&gt;, comme quoi il ne veut pas nous spoiler la fin, mais qu’il faut aussi se remettre en question au niveau de l’être humain, il ne faut pas se reposer totalement sur la technique et que si Will Smith a raté l’Oscar, c’est parce qu’il n’apportait pas cette dimension. ]]&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Dans un canapé, Fernando à ma gauche, Alice à ma droite.
Il y a sa tête qui fait des soubresauts car elle tombe de sommeil, je la recale contre mon épaule pour qu’elle ne s’affale pas. 
 Fernando me fait remarquer qu’elle tend le bras et avec sa main gauche elle mime le geste de gratter, elle veut qu’on la gratte dans le dos, je m’exécute bien sûr. &lt;span class=&quot;label label-green&quot;&gt;‼&lt;/span&gt;&lt;/p&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;Alice stresse car elle ne peut pas travailler, elle est sur son téléphone et demande le code wifi [pour pouvoir checker ses mails].&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PC robinet constructif</title>
   <link href="http://kray.me/dream/daf180/"/>
   <updated>2024-12-17T00:00:00+00:00</updated>
   <id>http://kray.me/dream/pc_robinet_constructif</id>
   <content type="html">&lt;div class=&quot;dream-dissipate-image&quot;&gt;
    &lt;img src=&quot;/public/img/posts/dream/20241217.jpg&quot; alt=&quot;pc doté d&apos;un robinet et tiroir-caisse dans une grotte&quot; /&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;rangées de vieux pcs des années 80 dans une sorte de cave/grotte&lt;/li&gt;
  &lt;li&gt;je tire sur un tiroir caisse pour faire couler de l’eau, je mets les main en coupole dessous pour la réceptionner&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Arthur Coudert a accès a mes pseudos [[ 1password ]] me tease par rapport à ça&lt;/li&gt;
  &lt;li&gt;je le pointe du doigt “attention, ce n’est pas très constructif ce que tu fais là !”&lt;/li&gt;
  &lt;li&gt;marouffin observe la scène sans commenter&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Sinnerman Amnesia</title>
   <link href="http://kray.me/sound-selector/2024/12/sinnerman-amnesia/"/>
   <updated>2024-12-15T00:00:00+00:00</updated>
   <id>http://kray.me/sound-selector/2024/12/sinnerman-amnesia</id>
   <content type="html">&lt;p&gt;&lt;em&gt;“Sometimes I wake up and find I’m gone…“&lt;/em&gt; I picked &lt;em&gt;Sinnerman&lt;/em&gt; just for its chorus :)&lt;br /&gt;
&lt;em&gt;Sabir&lt;/em&gt; brings the oriental touch I like to have in the recent playlists. &lt;br /&gt;
Then &lt;em&gt;Amnesia&lt;/em&gt; guitar riff operates a reset to switch to a mini-story with the last 5 songs.&lt;br /&gt;
Story of a sinnerman lost in the middle of nowhere in a motel, and dreaming vividly of a past love.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;iframe style=&quot;border-radius:12px&quot; src=&quot;https://open.spotify.com/embed/playlist/3mPdl6IYeK8PkXLYkggDuA?utm_source=generator&quot; width=&quot;100%&quot; height=&quot;688&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; allow=&quot;autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
</content>
 </entry>
 
 <entry>
   <title>Séminaire et tsunami</title>
   <link href="http://kray.me/dream/e05dfd/"/>
   <updated>2024-12-13T00:00:00+00:00</updated>
   <id>http://kray.me/dream/seminaire</id>
   <content type="html">&lt;p&gt;&lt;em&gt;(Grand bâtiment type Googleplex)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;les bureaux sont déserts, c’est le matin, j’explore les lieux&lt;/li&gt;
  &lt;li&gt;soudain je tombe nez à nez avec une boss, une femme qui a de l’influence dans la société. Elle ne porte pas de haut et me semi-drague &lt;span class=&quot;label label-green&quot;&gt;!&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;je raconte l’anecdote à mon frère [[ s’agirait il de sa boîte, d’une collègue à lui ? ]]&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(dans un restaurant)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Un board d’actionnaires Yesboony se tient à Maisons Alfort.&lt;br /&gt;
Je quitte un restaurant du centre-ville pour y assister, je croise Adrien dans le restaurant, lui demande si il vient [mais visiblement il va rester là faire la fête avec des proches].&lt;/p&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;div class=&quot;dream-dissipate-image&quot;&gt;
    &lt;img src=&quot;/public/img/posts/dream/20241213-alfort.jpg&quot; alt=&quot;dans une piece vide d&apos;un appartement avec parquet bois au sol. 1 femme adulte noire d&apos;origine martiniquaise cheveux tirés en arriere  avec lunettes (style vestimentaire grunge en noir, piercing) est assise sur une chaise parlant à une autre femme adulte bcbg 50 ans stricte assise, une assistante 20 ans est là debout aussi. ambiance tendue. rendu réaliste&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;Je monte dans la cage d’escalier de mon immeuble rue de la République Maisons Alfort, et là j’entends Nathalie qui explique qu’en l’espace de trois ans, les équipes ont été remodelées. Désormais on a 50% de développeurs qui travaillent sur les apps mobiles, comme telle boîte, et qu’on est encore en deçà de telle autre boîte, où ils ont 66% de leurs développeurs qui travaillent en mobile.&lt;/p&gt;

&lt;p&gt;Je continue à monter l’escalier, je reste au pas de la porte (ouverte) je me retrouve face à Nathalie en mode grunge, le nez percé, une chaînette qui relie sa narine à l’oreille, elle est habillée en noir, on sent qu’elle a voulu en imposer grave à sa supérieure, et avoir une touche un peu techos-créatrice.&lt;/p&gt;

&lt;p&gt;Là il y a sa supérieure qui me dit &lt;em&gt;“vous n’allez pas rester là, allez à la cave”&lt;/em&gt;. Etant chez moi quand même, avec un minimum de fierté, je réponds d’une petite voix &lt;em&gt;“je ne vais pas à la cave, je descends d’un étage”&lt;/em&gt;. En partant, il y a l’assistante de la bosse qui prend la parole et se fait déchirer par cette dernière. Je laisse là Nathalie toute blême, et qui va reprendre la parole.&lt;/p&gt;

&lt;p&gt;Je descends mon étage, je tombe sur un enfant qui joue au ballon, dans un grand couloir desservant les appartements. Le ballon m’arrive dessus et je commence à jouer avec lui.&lt;/p&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(concert open air à Maisons Alfort)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;séminaire yesboony sur plusieurs jours, succession de concerts avec des groupes connus. [Adrien est interessé pour voir un concert de Bon Iver le lendemain &lt;span class=&quot;label label-black&quot;&gt;?!&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;je fais des aller-retour entre le séminaire et mon appart pour ramener de la mousse au chocolat/praliné &lt;span class=&quot;label label-gray&quot;&gt;🪞&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/span&gt; que j’ai dans mon frigo &lt;span class=&quot;label label-gray&quot;&gt;🪞&lt;sup id=&quot;fnref:1:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;[ je joue au tarot avec des gens dont Foppe à ma droite. Plus personne n’a
d’atouts sauf moi, habitués à jouer ils jettent tous leurs quatre dernières
cartes, car les plis sont perdants. Sauf que moi je doute, parce qu’il me
reste peut-être un atout, mais après je n’ai que des piques, et suivant
dans quel ordre je les jouerai le résultat n’est pas le meme… Je pose
quand meme mes cartes d’un coup, veut me reprendre au dernier moment en
bredouillant qqch, mais personne ne me calcule. ]&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;div class=&quot;dream-dissipate-image&quot;&gt;
    &lt;img src=&quot;/public/img/posts/dream/20241213.jpg&quot; alt=&quot;une plage en bord de route, à sa gauche la foret et des rochers. A sa droite en contre-bas une plage de sable/galets et un tsunami d&apos;une vingtaine de metres de haut  qui surgit de nulle part.Un homme est soulevé par le souffle qui précède le tsunami et flotte verticalement très haut quelques mètres au dessus de la vague. 3 personnes dans l&apos;eau&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(Une route avec une forêt luxuriante à l’intérieur des terres, et une plage de sable/cailloux de l’autre coté)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;il y’a des hollandais dans l’eau (Foppe, Jan, Achilleas)&lt;/li&gt;
  &lt;li&gt;je jette des trucs ([[ mon ancien laptop cassé ??]]) dans l’eau et ils me les ramènent comme on ferait avec un chien&lt;/li&gt;
  &lt;li&gt;une vague type tsunami déboule mais elle ne vient pas du large et a bizarrement une direction orthogonale ie elle parcourt la plage et “suis” la route. En prévision, je sors de l’eau&lt;/li&gt;
  &lt;li&gt;suite à un appel d’air précédant la vague je me retrouve à flotter dans les airs au-dessus de celle-ci &lt;span class=&quot;label label-gray&quot;&gt;🌀&lt;/span&gt;. J’avance au rythme de la vague puis commence à retomber doucement jusqu’à flotter à 2m de hauteur. Alors je fais un dernier effort pour tendre ma jambe le plus possible afin que mon orteil touche le bitume afin de créer l’adhérence et que je ne me ré-envole pas, ça fonctionne.&lt;/li&gt;
  &lt;li&gt;je suis sur la route, la vague arrive et je vais me blottir en bord de route à côté d’un gars de Goboony que je ne connais pas. Il y’a de la mousse, la terre est mouillée, ce n’est pas agréable. J’agrippe le relief de toutes mes forces, ça va bien se passer.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;Camille (parent d’élève) avait mangé chez nous un dimanche y’a 2 semaines et nous avait ramené de la mousse au chocolat avec des cacahuètes &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt; &lt;a href=&quot;#fnref:1:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Echecs à Paris Xè</title>
   <link href="http://kray.me/dream/4cb3f2/"/>
   <updated>2024-12-12T00:00:00+00:00</updated>
   <id>http://kray.me/dream/echecs_75010</id>
   <content type="html">&lt;div class=&quot;dream-dissipate-image&quot;&gt;
    &lt;img src=&quot;/public/img/posts/dream/20241212.jpg&quot; alt=&quot;in a deserted parking lot with just 2 cars, poorly lit by few street lamps, 3 men (one with short hair, two with short beards) are playing a game of chess in the street, sitting on the asphalt, there are puddles, it&apos;s nightfall. A white Casio-type watch is placed next to the chessboard, a moped in the background. no others spectators&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(Paris. Un parking déserté faiblement éclairé par des lampadaires, la nuit tombe.)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Loïc, Jeff et moi jouons une partie d’échecs &lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; à même le bitume mouillé&lt;/li&gt;
  &lt;li&gt;une fois la partie finie, Loïc rejoins sa mobylette en arrière-plan&lt;/li&gt;
  &lt;li&gt;il a oublié sa montre casio blanche qu’il avait posé par terre, je la lui ramène&lt;/li&gt;
  &lt;li&gt;jouasse, je leur propose qu’on aille boire des coups quartier Strasbourg - Saint-Denis  &lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;[[ on déambule dans le 10è ]]&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;j’ai joué une partie OTB avec Jeff au Jardin du Luxembourg en Août 2024 et avec Loïc le 6 Décembre dernier &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;j’attribue le fait que ce rêve concentre des thèmes qui me sont chers (échecs/montres/Xè arrondissement) à l’effort que j’ai mené dernièrement pour générer des fonds d’écrans Google meet reprenant mes thèmes “passions” &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Life Sunset Camarade</title>
   <link href="http://kray.me/sound-selector/2024/11/life-sunset-camarade/"/>
   <updated>2024-11-30T00:00:00+00:00</updated>
   <id>http://kray.me/sound-selector/2024/11/life-sunset-camarade</id>
   <content type="html">&lt;p&gt;I’m still mining this album &lt;em&gt;Up and Away&lt;/em&gt; for my playlists (third track extracted). Rachid Taha takes us into a mediterranean soundscape for two songs.
&lt;em&gt;Love$ick&lt;/em&gt; brings some welcome energy, from the band I discovered in &lt;em&gt;Anatomy of a Fall&lt;/em&gt; movie.
We wrap up with two intricate tracks, particularly Carmensita which closes the playlist in a joyful, messy tumult.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;iframe style=&quot;border-radius:12px&quot; src=&quot;https://open.spotify.com/embed/playlist/0wx2BVdv6rgWOVbPu6OC30?utm_source=generator&quot; width=&quot;100%&quot; height=&quot;688&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; allow=&quot;autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;

</content>
 </entry>
 
 <entry>
   <title>Analyzing defeats with Chat-GPT (Week 48)</title>
   <link href="http://kray.me/chess/2024/11/chat_gpt_week_48/"/>
   <updated>2024-11-23T00:00:00+00:00</updated>
   <id>http://kray.me/chess/2024/11/chat_gpt_week_48</id>
   <content type="html">&lt;div class=&quot;toc&quot;&gt;
  &lt;div class=&quot;toc-title&quot;&gt;Table of content&lt;/div&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;#benko-gambit&quot;&gt;Benko Gambit&lt;/a&gt;&lt;/li&gt;
&lt;!--       &lt;ul&gt;
        &lt;li&gt;&lt;a href=&quot;#section2-1&quot;&gt;Sous-section 1&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#section2-2&quot;&gt;Sous-section 2&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt; --&gt;
    &lt;li&gt;&lt;a href=&quot;#scotch-gambit&quot;&gt;Scotch Gambit&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#smith-morra-gambit&quot;&gt;Smith-Morra Gambit&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#petrov-defense&quot;&gt;Petrov Defense&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;

&lt;h1 id=&quot;benko-gambit&quot;&gt;Benko Gambit&lt;/h1&gt;

&lt;h2 id=&quot;games&quot;&gt;Games&lt;/h2&gt;

&lt;iframe style=&quot;width: 100%; aspect-ratio: 3/2;&quot; src=&quot;https://lichess.org/study/embed/u13Juno0/Au2Qlk2Y&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;

&lt;details&gt;&lt;summary&gt;Control the Center Efficiently&lt;/summary&gt; In the game, both players competed for central squares, but as Kraymer, you might have missed opportunities to secure strong central control early on. Dominating the center allows your pieces to operate more effectively. In future games, focus on moves that contribute to your central pawn structure and improve piece activity, such as advancing pawns to key central squares or developing minor pieces to support these pawns.&lt;/details&gt;

&lt;details&gt;&lt;summary&gt;Timing of Exchanges&lt;/summary&gt; Exchanging pieces at the right moment is crucial. In this game, there were moments when exchanges happened that either helped or hindered your position. For example, consider whether trading an active piece for an opponent&apos;s less active piece is advantageous. Pay attention to the resulting pawn structures and open lines to ensure the exchanges align with your strategic goals.&lt;/details&gt;

&lt;details&gt;&lt;summary&gt;Anticipate Opponent&apos;s Counterplay&lt;/summary&gt; Your opponent demonstrated clear plans for counterplay on certain files or squares. As Kraymer, identifying and preempting such plans is vital. Always ask, &quot;What is my opponent trying to achieve?&quot; and adjust your strategy to neutralize their threats while advancing your own plan. For instance, prophylactic moves can fortify weaknesses or limit the opponent&apos;s activity.&lt;/details&gt;

&lt;h1 id=&quot;scotch-gambit&quot;&gt;Scotch Gambit&lt;/h1&gt;

&lt;iframe style=&quot;width: 100%; aspect-ratio: 3/2;&quot; src=&quot;https://lichess.org/study/embed/u13Juno0/R4fXDOdm&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;

&lt;details&gt;&lt;summary&gt;Prioritize Development Over Premature Pawn Moves&lt;/summary&gt; The move `6.c3` was an inaccuracy, as it delayed completing development and preparing the center. Instead, a simple developing move like `6.Nbd2` would have supported the center and allowed better coordination of your pieces. The lesson here is to focus on rapid development in the opening and avoid premature pawn moves unless they achieve a specific goal.&lt;/details&gt;

&lt;details&gt;&lt;summary&gt;Be Wary of Creating Weaknesses&lt;/summary&gt; The sequence `7.h3 Bxf3 8.gxf3` left your kingside significantly weakened. While `h3` is often a useful prophylactic move, it became a liability when it led to doubled pawns and an exposed king. The takeaway is to carefully assess the consequences of pawn moves, especially those near your king, as they can create long-term weaknesses that your opponent can exploit.&lt;/details&gt;

&lt;details&gt;&lt;summary&gt;Tactical Awareness Is Crucial&lt;/summary&gt; The blunder `9.Qxd4??` missed the opportunity to maintain balance with `9.Qa4+`, which would have applied pressure to Black and prevented their positional consolidation. This oversight highlights the importance of looking for forcing moves (checks, captures, and threats) before committing to a plan. Staying tactically vigilant can often save or improve an otherwise difficult position.&lt;/details&gt;

&lt;h1 id=&quot;smith-morra-gambit&quot;&gt;Smith-Morra Gambit&lt;/h1&gt;

&lt;iframe style=&quot;width: 100%; aspect-ratio: 3/2;&quot; src=&quot;https://lichess.org/study/embed/u13Juno0/QPY9wQuL&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;

&lt;details&gt;
  &lt;summary&gt;Be cautious with material imbalance&lt;/summary&gt;
Mistake: After 13...Bb6, Kraymer missed a chance to capture the b4 pawn with 13...Nxb4. This would have provided material advantage and a more active position. Instead, the position became increasingly passive, and Kraymer ended up giving White chances for counterplay.
Lesson: Always evaluate whether you can capitalize on your opponent&apos;s material weakness. In this case, the b4 pawn was vulnerable, and capturing it would have improved Black’s position. When ahead in material, it’s often useful to consolidate the advantage and not give your opponent chances to counterattack.
&lt;/details&gt;

&lt;details&gt;
  &lt;summary&gt;Evaluate piece placement over tempo&lt;/summary&gt;
Mistake: Kraymer&apos;s 15...Rg8 was a bit premature and didn’t address the critical pressure points. A better move would have been 15...Be6, aiming to complete development and stabilize the position.
Lesson: Focus on developing your pieces to active squares and aim to complete your development before embarking on unnecessary attacking moves. Here, 15...Be6 would have kept Black’s position solid and allowed for counterplay when the moment was right.
&lt;/details&gt;

&lt;details&gt;
  &lt;summary&gt;Avoid impulsive moves when under pressure&lt;/summary&gt;
Blunder: 16...Bh3 was a blunder, allowing White to capture the f6-pawn and continue building up the attack. Instead, Kraymer should have played 16...Ne5, aiming to create counter threats.
Lesson: When under pressure, don’t make defensive moves impulsively. Instead, seek to challenge your opponent’s attack or create counter threats, such as 16...Ne5, which would have complicated the game and given Black chances to defend and counterattack. Always analyze tactical motifs, especially when you&apos;re defending a difficult position.
&lt;/details&gt;

&lt;h1 id=&quot;petrov-defense&quot;&gt;Petrov Defense&lt;/h1&gt;

&lt;iframe style=&quot;width: 100%; aspect-ratio: 3/2;&quot; src=&quot;https://lichess.org/study/embed/u13Juno0/DQCDmm2X&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;

&lt;details&gt;&lt;summary&gt;The Power of Activity in the Opening&lt;/summary&gt; In the early moves, White’s `7.Be2?!` was a significant inaccuracy, as it allowed Black to seize the initiative. The move lacks ambition compared to the stronger `7.Qe2`, which develops with tempo and prepares long-term plans like queenside castling or pressure along the e-file. The lesson here is to prioritize active, purposeful moves in the opening that maximize piece potential and create dynamic opportunities, rather than making moves solely for safety.&lt;/details&gt;

&lt;details&gt;&lt;summary&gt;Simplification Can Be Key in the Endgame&lt;/summary&gt; The missed opportunity with `38.Rxe6+` illustrates a critical strategic concept: in the endgame, simplifying into a favorable position can often outweigh maintaining material or positional tension. By trading rooks, White could have transitioned into a winning king-and-pawn endgame with clear plans to advance their passed pawns. The lesson is to evaluate simplifications based on their impact on king activity and pawn promotion chances.&lt;/details&gt;

&lt;details&gt;&lt;summary&gt;Misplaced Pieces Can Lead to Counterplay&lt;/summary&gt; The decision to play `38.Rd7?` instead of activating the rook or centralizing the king demonstrates the danger of misplacing pieces in critical moments. A passive rook or inactive king in the endgame can turn even advantageous positions into precarious ones by allowing the opponent counterplay. The takeaway is to prioritize the activity of your pieces and avoid unnecessary passivity, particularly when nearing the endgame.&lt;/details&gt;
</content>
 </entry>
 
 <entry>
   <title>Moment suspendu dans canapé</title>
   <link href="http://kray.me/dream/2a1e97/"/>
   <updated>2024-11-14T00:00:00+00:00</updated>
   <id>http://kray.me/dream/moment_suspendu</id>
   <content type="html">&lt;div class=&quot;dream-dissipate-image&quot;&gt;
    &lt;img src=&quot;/public/img/posts/dream/20241114.jpg&quot; alt=&quot;conversation entre amis. une fille brune est assise dans un canapé dans une pièce à l&apos;ambiance tamisée, un garçon est allongé dans le sofa sa tête repose sur les genoux de la fille, il somnole , ils se tiennent la main droite. Impressioniste style&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(dans le salon d’un appartement austère mal éclairé)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;L’after avec Baptiste, Yoann et Jeff s’est poursuivi [chez l’un deux].&lt;br /&gt;
Alice et moi sommes dans un canapé, elle assise, moi allongé la tête reposant sur ses cuisses en contact avec son ventre. Nous nous tenons la main (droite).
Je semi-somnole, entends les discussions sans y participer.&lt;br /&gt;
Je me blottis encore plus pour atteindre un confort maximal, j’ai conscience de n’être séparé 
de la cicatrice que par une mince couche de tissu.&lt;br /&gt;
Sa main gauche se pose sur ma hanche, je la remet à sa place afin de garder le rêve le plus stable possible.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Brown Cadillac in the Market</title>
   <link href="http://kray.me/sound-selector/2024/08/brown-cadillac-in-the-market/"/>
   <updated>2024-08-31T00:00:00+00:00</updated>
   <id>http://kray.me/sound-selector/2024/08/brown-cadillac-in-the-market</id>
   <content type="html">&lt;p&gt;Unpredictable ride through jazzy grooves and soulful rhythms with its share of dynamic twists.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;iframe style=&quot;border-radius:12px&quot; src=&quot;https://open.spotify.com/embed/playlist/5tehlWBF1FzAMsdTYwd6Df?utm_source=generator&quot; width=&quot;100%&quot; height=&quot;688&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; allow=&quot;autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
</content>
 </entry>
 
 <entry>
   <title>Cave à jazz</title>
   <link href="http://kray.me/dream/a849a0/"/>
   <updated>2024-06-18T00:00:00+00:00</updated>
   <id>http://kray.me/dream/cave_jazz</id>
   <content type="html">&lt;ul&gt;
  &lt;li&gt;dans une cave/bar à jazz/stand-up de Bordeaux j’aperçois les Médale assis au premier rang Maire-Rose &amp;amp; Serge, Steph et Corinne. Je vais taper la bise, fait une blague sur les cheveux gris de Corinne.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Ferme self-services</title>
   <link href="http://kray.me/dream/ae9d62/"/>
   <updated>2024-05-29T00:00:00+00:00</updated>
   <id>http://kray.me/dream/ferme_self_service/index</id>
   <content type="html">&lt;p&gt;Ben a acheté un gâteau dans une pâtisserie stylée. Il leur ramène pour se faire rembourser mais compliqué car il a ajouté un ingrédient dessus.&lt;/p&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;div class=&quot;dream-dissipate-image&quot;&gt;
    &lt;img src=&quot;/public/img/posts/dream/20240529.jpg&quot; alt=&quot;in the Pyrenees at night in the room adjoining an old farm one single dry ham hangs from the ceiling, it is lit by candlelight, mold develops on the fat of the ham. We view the scene from the outside (door is open) with mountains as background&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(seul dans une ferme en montagne)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Plongé dans l’obscurité, ça toque à la porte, je décide de ne pas aller ouvrir.&lt;/p&gt;

&lt;p&gt;Les personnes vont ouvrir la porte d’une dépendance à côté.
Je sors finalement de la maison les rejoindre. Je me rends compte que c’est la police locale/gendarmerie. &lt;br /&gt;
Il y a une gendarme sympa : [“Monsieur Laporte votre jambon qui pend là, ça a l’air bon mais il ne faut pas le laisser sécher comme ça. Le gras il faut l’enlever, il faut que ce soit sec”].&lt;br /&gt;
Visiblement je laisse trop de gras et ça moisit sur place.&lt;/p&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(dans ville pyrénéenne fictive qui joue le rôle de Luz-Saint-Sauveur)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dans une boucherie un peu éloignée de la ville au sommet d’une colline.&lt;br /&gt;
Je suis dans la file d’attente. J’ai donné rendez-vous à cette boucherie à Arthur d’A.
J’arrive dans la boucherie il est déjà là, en train de blaguer avec le personnel.&lt;br /&gt;
Il vient d’emménager à Luz, la dame à la caisse lui demande ce qu’il a prévu de faire. Il lui répond une liste à la Prévert, termine par le fait qu’il veut monter une pièce de théatre.
Toujours dans la queue j’interviens assez fort : “Mais ça Arthur on a dit qu’on le gardait pour quand ta fille aura 10 ans” pour signaler ma présence. Flop.
Il recupère sa nourriture et viens me voir.&lt;/p&gt;

&lt;p&gt;Julien H débarque.&lt;br /&gt;
On commence à faire un peu le tour du magasin, c’est une sorte de self-service mais avec un parcours à suivre (comme à Flunch).
Nestor s’est ajouté, mon frère est là aussi, je fais les présentations.&lt;br /&gt;
Camille arrive dans le magasin, on blague que j’étais réfractaire à voir les collègues hors boulot (?) or j’ai donné rendez-vous [à la moitié de la boîte] dans la boucherie.&lt;/p&gt;

&lt;p&gt;On progresse mais se succèdent des plats plus lourds les uns que les autres, on arrive à une sorte de cruche contenant de [la garbure].
Avec la cuillère, je vais gratter dessous pour ramener des légumes. Je vois qu’il y’a d’autres trucs hyper bon et me dit qu’il faut que je garde de la place pour les autres produits à venir.&lt;/p&gt;

&lt;p&gt;Je tombe sur du guanciale, je suis en train de couper un morceau quand j’entends mon frère qui raconte à Dim que quand Marion ne veut pas manger quelque chose il ne la force pas, nos parents nous le faisaient quand on était petit mais désormais ça ne se fait plus.&lt;/p&gt;

&lt;p&gt;Un salarié de la boucherie vient me voir et me dit d’aller à la caisse car “mon ami” (Nestor) a mal compris une indication et a pris un dessert qu’il faut aller récupérer dans un autre magasin.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Reportage TV sur le séminaire</title>
   <link href="http://kray.me/dream/6054b9/"/>
   <updated>2024-05-26T00:00:00+00:00</updated>
   <id>http://kray.me/dream/seminaire_molietz</id>
   <content type="html">&lt;ul&gt;
  &lt;li&gt;équipe de télévision débarque à Molietz sur le lieu du séminaire le 2e jour après-midi or l’équipe Yc est rentrée chez elle ne reste que le staff Gb&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Flirt en entrepôt</title>
   <link href="http://kray.me/dream/8726f1/"/>
   <updated>2024-05-19T00:00:00+00:00</updated>
   <id>http://kray.me/dream/flirt_entrepot</id>
   <content type="html">&lt;ul&gt;
  &lt;li&gt;je travaille dans un entrepôt de logistique.&lt;/li&gt;
  &lt;li&gt;2 collègues féminines ramènent un véhicule de fonction type camion de la Brinks, elles en sortent deux gitans [qui ont commit un délit]&lt;/li&gt;
  &lt;li&gt;je flirte avec une troisième collègue dans une des travées de l’entrepôt&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Elo de retour aux affaires</title>
   <link href="http://kray.me/dream/4c4fde/"/>
   <updated>2024-05-18T00:00:00+00:00</updated>
   <id>http://kray.me/dream/elo_retour_affaires</id>
   <content type="html">&lt;ul&gt;
  &lt;li&gt;dans un open space similaire à avenue de la République, Elodie est ma voisine elle a été rappelée pour intervenir sur une situation de crise. Dans la salle en face de moi j’aperçois des collègues en couple : le gars enlace une grande brune.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;dans chambre une boisée, papa dans un fauteuil au fond la pièce. Moi en pleurs : “faudrait savoir maman dit qu’il faut t’emmener, alors que toi tu dis que tu peux y’aller seul”. Je prends un cadre coloré au mur pour le ramener chez moi.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Concert Pizza</title>
   <link href="http://kray.me/dream/8641a8/"/>
   <updated>2024-05-14T00:00:00+00:00</updated>
   <id>http://kray.me/dream/concert_pizza/index</id>
   <content type="html">&lt;div class=&quot;dream-dissipate-image&quot;&gt;
    &lt;img src=&quot;/public/img/posts/dream/20240514.jpg&quot; alt=&quot;on a dirty cement ground lies a CD cover with colors mainly red and gray/white/black with a profile picture of a 40 years old asiatic male singer with a ponytail on the left with title &apos;Back to Okinawa!&apos; on the right written in a bold face, like a revolutionary manifest. Style realist&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(devant une salle de spectacle imposante, [un zénith])&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;je rentre dans la salle me dirige vers [une douzaine] de personnes qui font la queue. La queue n’est pas longiligne mais délimitée par des rambards, on peut l’attaquer par l’une ou l’autre extrémité&lt;/li&gt;
  &lt;li&gt;je me place à un endroit puis vais à l’autre bout et la porte s’ouvre donc je suis parmi les premiers à entrer&lt;/li&gt;
  &lt;li&gt;j’arrive directement sur la scène, il y’a 3 groupes de banquettes. Je me dirige vers un de ces groupes, constitués de collègues de travail : je vais m’asseoir en face de Jeff, il y’a Benjamin L à ses côtés (Ndlr: comment ont ils faits pour être déjà dans la salle alors que j’étais parmiles premiers dans la queue ?)&lt;/li&gt;
  &lt;li&gt;il y’a aussi des spectateurs qui ont leurs places “normales” dans les gradins&lt;/li&gt;
  &lt;li&gt;je m’éclipse et vais en backstage, en revenant il y’a une pochette de CD par terre : [une jaquette rouge/grise avec la tête d’un japonais dessus cheveux longs, un titre écrit en gros : “Back to Okinawa!”]. [[ La personne asiatique figurant sur la pochette est dans notre groupe de collègues ]] (Ndlr: mais n’est pas un collègue IRL)&lt;/li&gt;
  &lt;li&gt;je sélectionne ce morceau sur mon Spotify sachant que je contrôle le son qui sort sur les enceintes de la salle de spectacle. J’ai conscience qu’un tel take-over sur la playlist est un peu abusé mais personne ne peut me capter donc je le fais.&lt;/li&gt;
  &lt;li&gt;[[ “Back to Okinawa!” est un langage crypté pour désigner le fait de faire transiter de la drogue. L’asiatique serait un dealer ?!? ]]&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(dans la salle de vie d’un appartment lumineux moderne)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;avec Federico, Francesca et un garçon de la team Italie. On étudie un projet, penchés au dessus d’une table où des documents sons éparpillés.&lt;/li&gt;
  &lt;li&gt;un bout de carton avec un logo d’un pizzaïolo avec une toque, [[ s’agit il d’un projet de création de pizzeria ? ]]&lt;/li&gt;
  &lt;li&gt;un enfant de 4 ans se réveille à l’autre bout de l’appart et va voir Federico “bonjour papa” puis “bonjour parrain” à l’autre mec&lt;/li&gt;
  &lt;li&gt;moi il ne me calcule pas, clairement je suis une pièce rapportée et ne sais pas quel est mon rôle au sein de ces italiens&lt;/li&gt;
  &lt;li&gt;enfant de 6 ans se lève aussi et donne du “bonjour marraine” à Francesca tout en lui faisant un calin&lt;/li&gt;
  &lt;li&gt;je remarque que l’enfant est déjà habillé, le vois de face avec les sangles de son cartable. Je tilte qu’il s’apprête à partir à l’école&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚡ Ndlr: réveil soudain car je dois emmener mon fils à la gare à 5h30 pour départ classe verte&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Free solution for serving a Jekyll blog stored in a private repository</title>
   <link href="http://kray.me/2024/05/jekyll_private_repo/"/>
   <updated>2024-05-12T00:00:00+00:00</updated>
   <id>http://kray.me/2024/05/jekyll_private_repo</id>
   <content type="html">&lt;p&gt;Since I began to document my travels on my blog, I was interested in switching &lt;code&gt;excommito&lt;/code&gt; repository to private mode. Unfortunately Github requires to move to &lt;em&gt;Team&lt;/em&gt; plan to serve private repositories.&lt;/p&gt;

&lt;p&gt;I investigated the free options and selected two contenders : Digitalocean and Netlify.&lt;/p&gt;

&lt;h2 id=&quot;digitalocean&quot;&gt;DigitalOcean&lt;/h2&gt;

&lt;p&gt;The “Jekyll static site” setup is one of many others and this is reflected in the onboarding funnel, I had to pay attention as sometimes it was upgrading me from starter kit to a premium kit for no obvious reason.&lt;br /&gt;
I had to fiddle with settings to fill in the build command as it was empty by default.&lt;br /&gt;
Then the build failed because of a Unicode problem, the fix was to define the &lt;code&gt;LC_LOCALE&lt;/code&gt; environment variable in DO dashboard.&lt;br /&gt;
At that point I was able to build the site and have it online, so I wrote a post … to discover that included images were not properly displayed. I wrote a &lt;a href=&quot;https://github.com/digitalocean/sample-jekyll/issues/16&quot;&gt;Github issue&lt;/a&gt; on their repo about that.&lt;/p&gt;

&lt;h2 id=&quot;netlify&quot;&gt;Netlify&lt;/h2&gt;

&lt;p&gt;First thing I noticed is that I’m not asked to enter a credit card number, the onboarding is way simpler than DO and the whole solution works out-of-the-box.&lt;br /&gt;
The first difficulty I met was to enables HTTPS on my custom domain, but was straightforward once I found &lt;a href=&quot;https://docs.netlify.com/domains-https/https-ssl/#netlify-managed-certificates&quot;&gt;the documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;After a two weeks test period, I have validated Netlify free blog hosting and removed &lt;code&gt;github-pages&lt;/code&gt; dependency from my Gemfile.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Dépôt de pêche prohibé</title>
   <link href="http://kray.me/dream/e59ea2/"/>
   <updated>2024-05-09T00:00:00+00:00</updated>
   <id>http://kray.me/dream/galere_pour_iech</id>
   <content type="html">&lt;div class=&quot;dream-dissipate-image&quot;&gt;
    &lt;img src=&quot;/public/img/posts/dream/20240509b.jpg&quot; alt=&quot;OIG3_toilet.jpeg&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(des locaux obscurs)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;je suis sur le trône, un collègue ([ouvrier]) se poste pile derrière la porte, me coupant dans mon élan&lt;/li&gt;
  &lt;li&gt;je parle avec le gars il me dit d’aller dans le bureau du patron&lt;/li&gt;
  &lt;li&gt;je suis eul dans la pièce, des meubles des années 70 le tout assez sale&lt;/li&gt;
  &lt;li&gt;pas de toilettes non plus, mais une sorte de fauteuil en tissu marron avec un trou qui doit jouer le rôle de cabinet&lt;/li&gt;
  &lt;li&gt;je retrouve le collègue dans les sanitaires, je choisis le sanitaire du fond&lt;/li&gt;
  &lt;li&gt;j’ouvre la porte et là je m’aperçois qu’une des cloisons est vitrée et qu’on fait donc ses besoins aux yeux de tous&lt;/li&gt;
  &lt;li&gt;me dit “qu’ils sont trop cons”, je vais reparler avec mon gars qui ajoute : “c’est pire que ça, si tu essaies d’entrer dans n’importe lequel des sanitaires ([ceux sans vitres]) y’a une alarme, c’est que celui du fond qui est sans alarme”. Effectivement il y’a des panneaux alarme/caméra devant chaque porte.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;div class=&quot;dream-dissipate-image&quot;&gt;
    &lt;img src=&quot;/public/img/posts/dream/20240509a.jpg&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(dans les nuages sur une échelle pour accéder à des douches d’une piscine, située 100m plus bas)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;je fais la queue, aggripé à un grillage&lt;/li&gt;
  &lt;li&gt;c’est mon tour, [il y’a des sanitaires en plus de la douche]&lt;/li&gt;
  &lt;li&gt;je suis en train de faire mon affaire quand des filles arrivent&lt;/li&gt;
  &lt;li&gt;je les laisse passer, redescends d’un cran sur le grillage&lt;/li&gt;
  &lt;li&gt;une des filles m’invective [“on pue ?! y’a pas de place pour trois”], je reconnais Geraldine. Elle me dit “habille toi quand même” et me jette un maillot de bain&lt;/li&gt;
  &lt;li&gt;je m’aperçois alors que je suis nu&lt;/li&gt;
  &lt;li&gt;je ne peux pas enfiler le maillot car je suis aggripé à ma paroi à 100m de hauteur&lt;/li&gt;
  &lt;li&gt;vient mon tour, je suis dans la douche, mes affaires sont sur un banc à côté&lt;/li&gt;
  &lt;li&gt;deux racailles viennent sur le banc et commencent à fouiller mes affaires&lt;/li&gt;
  &lt;li&gt;je sors de la douche les voir. Ma montre Baltic et ma casquette rouge sont encore là, ils étaient sur le point de me prendre deux billets&lt;/li&gt;
  &lt;li&gt;je m’embrouille avec le gars, [jette sa casquette beige]&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Contrôle radar</title>
   <link href="http://kray.me/dream/967ecc/"/>
   <updated>2024-05-07T00:00:00+00:00</updated>
   <id>http://kray.me/dream/controle_radar</id>
   <content type="html">&lt;div class=&quot;dream-dissipate-image&quot;&gt;
    &lt;img src=&quot;/public/img/posts/dream/20240507.jpg&quot; alt=&quot;by night, inside a medium car like a Volkswagen Polo, passenger seat POV. I struggle to attach my seat belt. Car goes to maximum speed, is shaking. A police car overtakes us to stop us. in pop surrealism art style&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;(dans une voiture, côté conducteur, Ben au volant)&lt;/em&gt; &lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;en route vers un concert&lt;/li&gt;
  &lt;li&gt;il conduit à balle, la voiture tremble&lt;/li&gt;
  &lt;li&gt;je flippe et galère a attacher ma ceinture de sécurité&lt;/li&gt;
  &lt;li&gt;on croise un radar, pas de flash apparent&lt;/li&gt;
  &lt;li&gt;une voiture de police nous arrête ensuite sur le bas côté&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(dans une sorte de garage [du commissariat?])&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ma mère s’est ramenée, conduite par [des gens], me fait la leçon &lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;on s’en tire avec une amende [raisonnable] &lt;sup id=&quot;fnref:3&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;notre seul but est de repartir vite pour pas rater le concert&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(même endroit, mais les personnages changent)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Ben n’est plus là, c’était moi le conducteur qui conduisait Nelson à un concert&lt;/li&gt;
  &lt;li&gt;j’argumente maintenant avec Dim plutot que ma mère : je lui dis qu’il est “hors de question” que je ne conduise pas Nelson à son concert &lt;sup id=&quot;fnref:4&quot;&gt;&lt;a href=&quot;#fn:4&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;ai passé du temps sur gites.fr pr regarder des sites de location éloignés à faire ensemble &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;passage qui fait écho à quand j’avais eu mon accident, il y’a 19 ans de ça et que mon ex s’était pointée sur les lieux pour m’aider &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot;&gt;
      &lt;p&gt;j’ai un dossier en cours par rapport à une amende majorée avec un montant excessif… &lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:4&quot;&gt;
      &lt;p&gt;le ton était montré entre nous trois le soir même &lt;a href=&quot;#fnref:4&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Lot de montres</title>
   <link href="http://kray.me/dream/ff9b26/"/>
   <updated>2024-04-30T00:00:00+00:00</updated>
   <id>http://kray.me/dream/lot_de_montres</id>
   <content type="html">&lt;p&gt;&lt;em&gt;2024/04/30&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;J’ai mis la main sur un lot de 5 montres, une digitale avec écrit &lt;em&gt;2014 Powerstone&lt;/em&gt; sur la dial. Certains bracelets étaient pas mal, du milieu de gamme.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Menorca</title>
   <link href="http://kray.me/travel/2024/04/menorca/"/>
   <updated>2024-04-16T00:00:00+00:00</updated>
   <id>http://kray.me/travel/2024/04/menorca</id>
   <content type="html">&lt;iframe width=&quot;100%&quot; height=&quot;300px&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; allow=&quot;geolocation&quot; src=&quot;//umap.openstreetmap.fr/fr/map/menorca_1057306?scaleControl=false&amp;amp;miniMap=false&amp;amp;scrollWheelZoom=false&amp;amp;zoomControl=true&amp;amp;editMode=disabled&amp;amp;moreControl=true&amp;amp;searchControl=null&amp;amp;tilelayersControl=null&amp;amp;embedControl=null&amp;amp;datalayersControl=true&amp;amp;onLoadPanel=none&amp;amp;captionBar=false&amp;amp;captionMenus=true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href=&quot;//umap.openstreetmap.fr/fr/map/menorca_1057306?scaleControl=false&amp;amp;miniMap=false&amp;amp;scrollWheelZoom=true&amp;amp;zoomControl=true&amp;amp;editMode=disabled&amp;amp;moreControl=true&amp;amp;searchControl=null&amp;amp;tilelayersControl=null&amp;amp;embedControl=null&amp;amp;datalayersControl=true&amp;amp;onLoadPanel=none&amp;amp;captionBar=false&amp;amp;captionMenus=true&quot;&gt;Voir en plein écran&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://photos.app.goo.gl/b4qoEcqKBRn2Rami9&quot;&gt;See photos&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;day-1&quot;&gt;Day 1&lt;/h3&gt;

&lt;p&gt;Expérience plus smooth pour récupérer la voiture (surclassage =&amp;gt; Peugeot 2008) qu’en Croatie, on se dirige vers le centre de Mahon.&lt;br /&gt;
Beaucoup de touristes français, Dim avait pour voisin dans l’avion un producteur de pruneaux d’Agen.&lt;br /&gt;
On prend la route en milieu d’aprem vers le point culminant de l’île : le Mirador Cim del Toro du haut de ses 350m. Dim y’achète une troisième main immonde.&lt;br /&gt;
On fait ensuite les courses pour la semaine incluant fromage de Mahon fumé et Gin local, passage à la boucherie/charcuterie.&lt;br /&gt;
Le &lt;a href=&quot;https://www.escapehome.com/en/&quot;&gt;Airbnb&lt;/a&gt; correspond aux photos, manque juste une cafetière, elle devrait etre livrée demain.&lt;/p&gt;

&lt;h3 id=&quot;day-2&quot;&gt;Day 2&lt;/h3&gt;

&lt;p&gt;Beaucoup de vent pendant la nuit obligeant à se lever pour mieux accrocher les différents volets qui claquaient.&lt;br /&gt;
Marche de 2h à la crique Cala Tirant le matin, micro portion du Cami de Cavalls (GR 223, 186 km) qui fait le tour de l’île.&lt;br /&gt;
Retour maison pour repas + sieste et après-midi studieux avec visites du site &lt;a href=&quot;https://fr.wikipedia.org/wiki/Culture_talayotique&quot;&gt;talayotique&lt;/a&gt; de Torrellafuda puis de la carrière de pierres de Lithica ponctuée par un jeu de touche-touche dans le labyrinthe.&lt;br /&gt;
Arrêt au Super Mercadal sur le chemin du retour pour prendre de quoi faire barbecue le soir.&lt;/p&gt;

&lt;h3 id=&quot;day-3&quot;&gt;Day 3&lt;/h3&gt;

&lt;p&gt;Temps pluvieux. 
Marche de Cala Gualdana pour atteindre Cala Mitjaneta puis Cala de Trebaluger.&lt;/p&gt;

&lt;h3 id=&quot;day-4&quot;&gt;Day 4&lt;/h3&gt;

&lt;p&gt;Débt de journée tendu avec le ipadgate.&lt;br /&gt;
Le beau temps est revenu on fait les sandwiches et direction les plages du sud.
Plus simple que la veille pour atteindre Platja Binigaus. Les en-cas permettent de tenir jusqu’à l’horaire espagnol pour s’attabler en terrasse dans un restaurant au bord de mer.&lt;br /&gt;
On passe 1h à Platja de Sant Tomas puis retour à Fornels se changer avant de rejoindre St Luis pour dîner avec Nestor et ses deux filles.&lt;/p&gt;

&lt;h3 id=&quot;day-5&quot;&gt;Day 5&lt;/h3&gt;

&lt;p&gt;Visite du centre-ville de Ciutadella et son décevant marché aux poissons.&lt;br /&gt;
Pic-nic au Cap d’Artrutx et son phare où une mouette nos tient compagnie, promenade digestive en partant de Playa de Son Xoriguer pour atteindre la Cova des Pardals.&lt;/p&gt;

&lt;h3 id=&quot;day-6&quot;&gt;Day 6&lt;/h3&gt;

&lt;p&gt;Direction le port de Serpentona essayer d’embarquer sur une excursion en bateau, une fois arrivé on déchante car pas de départ d’ici aussi on réserve pour demain à Mahon.&lt;br /&gt;
Louer un kayak nous tente mais étant donné les conditions météo (18°) et la température de l’eau on part pour un plan marche à destination de la plage Macarella. Promenade agréable à couvert, mais Nelson a des maux de ventre qui nous forceront à rentrer précipitamment au Airbnb sans prendre de glace à Es Mercadal.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Tentative de débauchage du développeur Firouzja</title>
   <link href="http://kray.me/dream/d40e44/"/>
   <updated>2024-03-11T00:00:00+00:00</updated>
   <id>http://kray.me/dream/Firouzja_back-end_dev</id>
   <content type="html">&lt;div class=&quot;dream-dissipate-image&quot;&gt;
    &lt;img src=&quot;/public/img/posts/dream/20240311.jpg&quot; alt=&quot;Alireza Firouzja, standing, has heated discussion with a gray hear guy seated in a sofa at a cocktail party (other people are discussing and have drinks) standing in a cozy living room of a parisian flat with old parquet. At the foot of the sofa there is an indian rug with colourful patterns&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;(indéterminé)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;je demande à mon frère si il a des places pour le match [PSG-Bordeaux] via son CE&lt;/li&gt;
  &lt;li&gt;pas de place, je décide d’aller dans un bar voir le match avec ma mère [[et une autre personne]], je lui dis pour le faire rager mais il s’en BLC&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(une cocktail-party dans un appartement parisien cosy avec plancher en bois ancien)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;un gars a l’air de s’ennuyer dans un canapé, je lui demande si il aime le sport et s’il préfèrerait pas être dans un bar à voir PSG-Bordeaux à l’heure qu’il est&lt;/li&gt;
  &lt;li&gt;le gars est PDG d’une boîte d’informatique, la discussion tourne à un entretien d’embauche &lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;ce PDG veut en fait via moi obtenir des informations sur &lt;a href=&quot;https://en.wikipedia.org/wiki/Alireza_Firouzja&quot;&gt;Alireza Firouzja&lt;/a&gt; qui est un collègue à moi (oui Firouzja est développeur dans ce monde) et qu’il a vu récemment dans les bureaux où je travaille
    &lt;blockquote&gt;
      &lt;p&gt;&lt;em&gt;(dans des bureaux parisiens)&lt;/em&gt;&lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;entrevue entre Firouzja et le PDG&lt;/li&gt;
        &lt;li&gt;une fois le PDG parti, Rodolphe dit [à Romain] que “c’est dans la boîte”&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;Alireza déboule. Malaise du PDG en mode &lt;em&gt;“Aaaah non, pas lui !”&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Alireza salue les gens puis arrive près de nous, évite la poignée de main avec le PDG et je lui serre bizarrement la main en mode hyper hésitant&lt;/li&gt;
  &lt;li&gt;PDG se plaint que son entrevue avec Alireza est parue dans les journaux
    &lt;blockquote&gt;
      &lt;p&gt;&lt;em&gt;(dans des bureaux parisiens)&lt;/em&gt;&lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;Rodolphe avait placé un photographe avec une longue-vue dans le batiment en face pour prendre la photo de l’entrevue&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;Alireza se plaint que le tapis devant le canapé n’est pas droit &lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;le PDG et moi on se lève du canapé et on galère pour replacer le tapis à sa position. Au fur et à mesure de la scène le tapis change d’aspect pour se rapprocher de l’aspect du doudou Momotte de mon enfance (patchwork de morceaux de tissu rose et blanc délavé et usé).&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;le départ de mon collègue Fred a eu lieu il y’a une dizaine de jours &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;typique des joueurs d’échecs de se plaindre de telle ou telle condition extérieure qui les empêche de se concentrer &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Becher Toy explosif</title>
   <link href="http://kray.me/dream/42bc01/"/>
   <updated>2024-02-27T00:00:00+00:00</updated>
   <id>http://kray.me/dream/becher_toy_explosif</id>
   <content type="html">&lt;div class=&quot;dream-dissipate-image&quot;&gt;
    &lt;img src=&quot;/public/img/posts/dream/20240227.jpg&quot; alt=&quot;in a rural rustic old house, we see the pyrenees mountains by the window. a guy is holding a small leaking beaker with holes, the liquid is corrosive and makes holes in the parquet floor. the guy tries to plug the holes in the beaker with his fingers. different black and white family pictures are on the wall. There is a single small colourful abstract painting frame on the wall too.&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;(à l’étage d’une maison pyrénéenne)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;je suis avec les propriétaires de la maison, ils me présentent des photos N&amp;amp;B ayant appartenu à mon grand-père, [c’est donc les gens qui ont racheté la maison de Luz à sa mort]&lt;/li&gt;
  &lt;li&gt;je suis là pour récupérer des affaires ayant appartenu à mon grand-père et qui auraient une valeur sentimentale&lt;/li&gt;
  &lt;li&gt;la dame a un accent anglais &lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; me fait des louanges sur le fait que mon grand-père était quelqu’un de sympathique&lt;/li&gt;
  &lt;li&gt;outre les cadres et photos en N&amp;amp;B, il y’a un tableau qui coloré détonne au mur, je demande si c’est un [[Miro]] ? &lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;je prends dans les mains un portrait N&amp;amp;B d’un monsieur, une vielle photo [début du XXe s], il y’a écrit le nom de la personne “Bechera” &lt;sup id=&quot;fnref:3&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(même pièce)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;j’ai un bécher dans la main contenant un liquide corrosif &lt;sup id=&quot;fnref:4&quot;&gt;&lt;a href=&quot;#fn:4&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;le bécher est troué et fuit par les trous, je mets mes doigts pour stopper les fuites, les bouts de ceux-ci sont noirs, brûlés &lt;sup id=&quot;fnref:5&quot;&gt;&lt;a href=&quot;#fn:5&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;le liquide fait des dégâts conséquents au plancher&lt;/li&gt;
  &lt;li&gt;les propriétaires qui étaient affables au début sont désormais dégoûtés et énervés envers moi&lt;/li&gt;
  &lt;li&gt;je leur dit que je paierai le coût des travaux pour rattraper le parquet&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;j’ai vu un reportage sur France3 le jour même où ils interrogeaient un couple de propriétaires en Dordogne, la femme était d’origine suédoise &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;mon osthéopathe a une affiche de Miro dans son cabinet et on échangé quelques mots sur ça la dernière fois &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot;&gt;
      &lt;p&gt;un collègue a comme pseudo “coudera” sur Github &lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:4&quot;&gt;
      &lt;p&gt;j’ai regardé une video sur Youtube d’un gars qui a son iphone dont la batterie prend feu subitement &lt;a href=&quot;#fnref:4&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:5&quot;&gt;
      &lt;p&gt;similaire aux doigts gelés dans les histoires d’alpinisme qui tournent mal &lt;a href=&quot;#fnref:5&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Croatie</title>
   <link href="http://kray.me/travel/2023/10/croatia/"/>
   <updated>2023-10-22T00:00:00+00:00</updated>
   <id>http://kray.me/travel/2023/10/croatia</id>
   <content type="html">&lt;iframe width=&quot;100%&quot; height=&quot;300px&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; allow=&quot;geolocation&quot; src=&quot;//umap.openstreetmap.fr/en/map/untitled-map_976076?scaleControl=false&amp;amp;miniMap=false&amp;amp;scrollWheelZoom=false&amp;amp;zoomControl=true&amp;amp;editMode=disabled&amp;amp;moreControl=true&amp;amp;searchControl=null&amp;amp;tilelayersControl=null&amp;amp;embedControl=null&amp;amp;datalayersControl=true&amp;amp;onLoadPanel=undefined&amp;amp;captionBar=false&amp;amp;captionMenus=true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href=&quot;//umap.openstreetmap.fr/en/map/untitled-map_976076?scaleControl=false&amp;amp;miniMap=false&amp;amp;scrollWheelZoom=true&amp;amp;zoomControl=true&amp;amp;editMode=disabled&amp;amp;moreControl=true&amp;amp;searchControl=null&amp;amp;tilelayersControl=null&amp;amp;embedControl=null&amp;amp;datalayersControl=true&amp;amp;onLoadPanel=undefined&amp;amp;captionBar=false&amp;amp;captionMenus=true&quot;&gt;See map full screen&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://photos.app.goo.gl/WpMvHyu4CfYWuRNP9&quot;&gt;See photos&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;day-1&quot;&gt;Day 1&lt;/h3&gt;

&lt;p&gt;On arrive en Croatie avec une amélioration nette de la météo par rapport à Bordeaux, j’avais un peu peur d’avoir un copier/coller, pourvu que ça dure.&lt;br /&gt;
Alors qu’on était bien relax suite à l’embarquement et vol qui s’étaient parfaitement passés, il a fallu gérer une galère : l’agence de location de voitures n’avait pas de bureau à l’aéroport et quand on appelait le numéro de mobile renseigné sur le contrat, personne ne répondait. En les recherchant sur &lt;a href=&quot;https://maps.app.goo.gl/sw76scsLtkmpakKT7&quot;&gt;Google maps&lt;/a&gt; on voit qu’ils sont notés 1* et qualifiés d’arnaqueurs, gloups. Après un trajet aller-retour de 4km  en trottant vers leurs supposés bureaux en vain, je reviens dégoulinant mais rassuré : c’est finalement par téléphone que la chose s’est réglée et qqun de l’agence passe  nous récupérer, les vacances peuvent commencer.&lt;br /&gt;
On a une cinquantaine de km à faire pour arriver au Airbnb, les paysages rappelent ceux de Corse/Sicile avec peu d’habitants au km2, on remarque que la nuit tombe vite vers 18h. Une fois sur place, la proprio nous informe qu’on peut manger au patelin d’a côté, chose dont on se mettait à douter car tout le long de la route c’était le désert niveau commerces.&lt;br /&gt;
Effectivement on trouvera sans mal un restau à la déco stylée et abordable où on goûtera des grillades locales &lt;em&gt;ćevapi&lt;/em&gt; mais on ne s’éternisera pas car Nelson tombe de sommeil au point même où il fait l’impasse sur le dessert, ce qui veut tout dire.&lt;/p&gt;

&lt;h3 id=&quot;day-2&quot;&gt;Day 2&lt;/h3&gt;

&lt;p&gt;Direction le parc Krka qui est un des huit parcs nationaux de Croatie. On s’arrête dans une boulangerie au passage pour avoir le repas en mode pic-nic.&lt;br /&gt;
On choisit l’entrée un peu à l’écart qui recquiert une traversée en bateau de 20 minutes pour arriver au commencement de la ballade, l’occasion d’observer quelques poules d’eau, hérons, canards et cygnes.
L’accès au parc consiste en une randonnée sur un senteir bien balisé autour de la cascade Skadinski buk, avec quelques points d’intérêt au passage (visite des restes d’un moulin…). Cela nous prend 2h et alors que le temps commence à se gâter on se dirige à l’embarcadère pour reprendre le bateau et revenir à Skradin.  AvaOnt de reprendre le volant, on monte jusqu’à la forteresse de Turina pour profiter du point de vue.&lt;br /&gt;
On prend la route pour se rendre à un point de vue sur le monastère de Krka, l’occasion de quelques sueurs froides avec le GPS complètement dans les choux, à devoir se faire des marches arrières en pleines montées pour retrouver notre chemin. Le réseau routier est assez inégal, il y’a des routes entretenues nickel par ailleurs.  On fait donc cette mini ballade “du monastère” et après 1h de route on est à Zadar, lieu de notre Airbnb. Logés en plein dans la vieille ville on aurait aimé en profiter pour visiter un peu mais Nelson se plaint de ses pieds donc on est condamnés à rester dans l’appart, la visite rapide des quais se fera demain.&lt;/p&gt;

&lt;h3 id=&quot;day-3&quot;&gt;Day 3&lt;/h3&gt;

&lt;p&gt;On laisse les bagages à l’appartement pour faire un tour vers la pointe de Zadar et les orgues de mer, il y’a aussi le marché on voit bien que la saison est passée, la plupart des clients sont des locaux.  A 11h il est temps de regagner le parking gratuit à 20 minutes de marche où j’avais laissé la voiture pour la nuit, on remonte vers les lacs de Plivice que nous visiterons demain. Le parc de Paklenica est sur la route, moyennant un léger détour, mais entre le départ tardif de Zadar, l’arrêt restau qui a pris plus de temps que prévu et mon utilisation approximative de Google Maps, on va se contenter d’une randonnée d’une grosse heure improvisée dans la partie Ouest du parc. Cela mérite plus mais peut etre aurons nous l’occasion de nous rattraper Jeudi quand on descendra vers Brela.&lt;br /&gt;
Du coup on quitte Paklenica pas trop tard afin de ne pas rouler la nuit tombée, vraiment très peu de monde sur les routes j’ai les deux voies pour moi et peux prendre des belles courbes comme un skieur. Après avoir pris de quoi faire des sandwitches pour demain on arrive dans notre location pour 2 jours accueillis par le proprio avec du brandy local, la mamma prépare le lit clic-clac à Nelson. Pas de cafetière disponible, sinon on est pas mal, on sera à 10 minutes du parc de Plivice demain où toute la journée sera dédiée à l’exploration des lacs.&lt;/p&gt;

&lt;h3 id=&quot;day-4&quot;&gt;Day 4&lt;/h3&gt;

&lt;p&gt;Arrivée à 8h45 à l’entrée 1 du parc, différents parcours aux programmes tous faisables avec les même tickets on part dans l’idée de faire un le parcours intermédiaire de 8km.&lt;br /&gt;
Ce lieu doit être bondé l’été mais pas grand monde aujourd’hui, quelques groupes de touristes chinois quand même qui rendent certains points d’intérêt fréquentés. On passe d’une scène à l’autre en marchant sur des pilotis, chaque lac se déversant dans son voisin via des combinaisons variées de cascades et dévers. Un régal pour les yeux entre la couleur turquoise des eaux et les camaieus jaune/rouge des feuillages automnaux. Sur la deuxième partie de la ballade, légère averse et lumière moins photogénique. Une fois le beau temps revenu on décide de prendre le bus pour revenir au parking mais on sort avant la fin (station 1) afin de faire la fin à pied sur le sentier panoramique et prendre les clichés des lacs d’en haut.&lt;br /&gt;
Retour au airbnb plus tôt que les jours précédents, quartiers libres et petit tour à pieds dans le voisinage avant d’aller manger au restaurant Degenija sur les coups de 19h.&lt;/p&gt;

&lt;h3 id=&quot;day-5&quot;&gt;Day 5&lt;/h3&gt;

&lt;p&gt;Journée de transition Nord/Sud. J’avais prévu de se refaire le parc de Paklenica mais en accédant à la bonne entrée cette fois, malheureusement le temps ne le permet pas aussi on roule jusqu’àu village côtier de Pakostane pour la pause déjeuner, on a toutes les peines du monde à trouver un endroit où manger on voit bien qu’on est hors-saison. On reprend un tronçon d’autoroute jusqu’à Trogir pour le moment &lt;em&gt;Wtf?!&lt;/em&gt; de la journée : sitôt garé Nelson entend un chat qui miaule, après inspection il s’avère que le chat est logé au niveau de l’essieu de la voiture et ne veut/peut pas sortir, Nelson lance alors l’idée qu’il peut s’agir du chat du Airbnb où on était ce matin. Vision d’horreur où j’imagine le chat coincé sous la voiture qui vit l’enfer pendant 150 bornes. Après 2 minutes le chaton finit par sortir de là et après mûre réflexion on arrive à la conclusion que finalement non, ça ne doit pas être le chat de Plivice, mais Papa tu peux envoyer un sms quand même au monsieur pour vérifier ? (le message sera rédigé mais jamais envoyé).&lt;br /&gt;
On expédie la visite du centre historique et 2 cornets de glace (pistache pour nous, orange sanguine pour lui) dans l’heure de parking qui nous est impartie et on reprend la route. A Split on fait un arrêt dans un Mall histoire de vérifier si oui ou non les polos Lacoste ne coûtent 20€ dans ce pays, mais non :surprised_pikachu: Si on avait su, on aurait économisé cette pause du coup quand on repart il fait nuit et on ne peut profiter des vues de la route le long de la côte qui relie Split à Brela ; bah la pleine lune apporte un faible éclairage de son halo, ça a son charme aussi.&lt;br /&gt;
Donc ce fut la journée la plus roulante du séjour, une anecdote sur la conduite en Croatie : les prix sont les même dans chaque station essence.&lt;/p&gt;

&lt;h3 id=&quot;day-6&quot;&gt;Day 6&lt;/h3&gt;

&lt;p&gt;Le spot où on est à Brela nous surprend agréablement. Vue directe sur la plus belle plage de la côte, entourés de pins, on dirait que la pousse de chaque arbre a été étudiée pour leur donner des formes séduisantes.&lt;br /&gt;
Le matin on prend les vélos pour découvrir les mini-plages alentour. Le temps est couvert, on  va en fin d’après midi marcher dans la montagne dans pour découvrir la &lt;em&gt;Napoleon road&lt;/em&gt; (1810), construite par les armées de Napoléon mais pas terminée.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>SublimeText PythonAutoImport plugin</title>
   <link href="http://kray.me/2023/09/st3_auto_imports/"/>
   <updated>2023-09-07T00:00:00+00:00</updated>
   <id>http://kray.me/2023/09/st3_auto_imports</id>
   <content type="html">&lt;p&gt;Six months ago, I forked a 10 years old &lt;a href=&quot;https://github.com/jasonmyers/PythonAutoImport&quot;&gt;plugin&lt;/a&gt; that do auto-imports and contributed &lt;a href=&quot;https://github.com/jasonmyers/PythonAutoImport/commit/fc7c7551a20a717576b85b54e12ff8683d140e45&quot;&gt;a fix&lt;/a&gt; so it works gracefully now with multi-lines import.&lt;/p&gt;

&lt;p&gt;After months using it I can safely says it improved my use of ST3 and so share it here for those that spend a hell lot of time in ST3 to write import statements.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/Kraymer/PythonAutoImport&quot;&gt;https://github.com/Kraymer/PythonAutoImport&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Tour de Suisse</title>
   <link href="http://kray.me/travel/2023/08/swiss/"/>
   <updated>2023-08-31T00:00:00+00:00</updated>
   <id>http://kray.me/travel/2023/08/swiss</id>
   <content type="html">&lt;iframe width=&quot;100%&quot; height=&quot;300px&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; allow=&quot;geolocation&quot; src=&quot;//umap.openstreetmap.fr/en/map/untitled-map_956077?scaleControl=false&amp;amp;miniMap=false&amp;amp;scrollWheelZoom=false&amp;amp;zoomControl=true&amp;amp;allowEdit=false&amp;amp;moreControl=true&amp;amp;searchControl=null&amp;amp;tilelayersControl=null&amp;amp;embedControl=null&amp;amp;datalayersControl=true&amp;amp;onLoadPanel=undefined&amp;amp;captionBar=false&amp;amp;captionMenus=true&amp;amp;datalayers=2938481#9/47.2904/8.3386&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href=&quot;//umap.openstreetmap.fr/en/map/untitled-map_956077?scaleControl=false&amp;amp;miniMap=false&amp;amp;scrollWheelZoom=true&amp;amp;zoomControl=true&amp;amp;allowEdit=false&amp;amp;moreControl=true&amp;amp;searchControl=null&amp;amp;tilelayersControl=null&amp;amp;embedControl=null&amp;amp;datalayersControl=true&amp;amp;onLoadPanel=undefined&amp;amp;captionBar=false&amp;amp;captionMenus=true&amp;amp;datalayers=2938481#9/47.2904/8.3386&quot;&gt;See full screen&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vol Bordeaux-Bâle le 21, on part léger avec 3 sacs à dos, on ne récupère le van que le lendemain. La première journée est une visite urbaine de Bâle mais entre 
les affichages en allemand / le forfait data du mobile qui ne couvre pas la Suisse et les bagages qui sont somme toute pas si léger à se coltiner, ça démarre doucement.&lt;/p&gt;

&lt;p&gt;J’avais identifié le Tierpark comme endroit à visiter du fait d’un zoo (gratuit) et d’un complexe aquatique à proximité. On arrive tant bien que mal à y’aller via le tram, et on se tape péniblement la visite du zoo un peu à l’abandon sous les 30+° de chaleur. Ceci fait je demande à un gars où se trouve la piscine et il s’avère qu’elle est trop loin, il me conseille d’aller au Gartenbad Eglisee, ce qu’on fait sans se prier. Autant les prix en Suisse sont élevés de manière générale, autant pour ce qui est des piscines on en a eu pour notre argent : des grands bassins avec des espaces verts bien entretenus. On y reste 2 heures puis on
reprend le TER vers Mulhouse où on passe la nuit (avec le dinnergate où s’y prenant trop tard on finira en dernier recours dans une pizzeria/burger ouverte de 17h à 5h du mat).&lt;/p&gt;

&lt;p&gt;Le Mardi après une visite express du centre ville de Mulhouse, on récupère le van. 
Et le premier stop se fait au Lidl du coin où on fait les courses pour la semaine, 
histoire de ne pas trop subir le cout de la vie helvète. Au final on aura plutot bien estimé les quantités, si ce n’est qu’on aurait dû troquer quelques saucisses pour plus de bières (elles viendront à manquer).&lt;/p&gt;

&lt;p&gt;Le coffre plein il est 16h passées et on se rend vers la première étape du périple : le lac Titisee en Allemagne. Un coin sympa, une sorte de Bègles plage en ce qui concerne la zone de baignade mais avec une meilleure vue. L’occasion de consommer le premier bretzel pour Nelson (il s’avère que ce sera aussi son dernier).&lt;/p&gt;

&lt;p&gt;On trouve où passer la nuit dans un bled tranquille de la Schwartzwald, mais sans duvet (on a pas géré sur ce coup là), la place à l’étage du van n’est pas la plus 
confortable et on finit la nuit à 3 en bas. Dans la suite du voyage on utilisera le chauffage stationnaire du van en cours de nuit mais le succès sera mitigé et de manière générale on aura pas le sommeil lourd.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/pw/AIL4fc-fGzz40f0VM6ZKMeSAhBnUgrn-lZsogGKfRTcg858V1NcJAb0thPdyTVdWk_nv9b67TpabanrBCzPgT9n3EymzKrvfNdGomSs-H_HDKVom0ZauNXRjJGQqt6pzoqmfbdtLMwyC52-SCXL85kIVkwRJEA=w1088-h1088-s-no?authuser=0&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Au réveil direction &lt;em&gt;Neuhausen am Rheinfall&lt;/em&gt; à une heure de route observer des chutes d’eau parmi les plus puissantes d’Europe en milieu urbain. On visite au train car une location de vélos nous attend à Constance à 12h30, mais arrivés sur place trop complexe de se garer en plein centre-ville. On oublie les bicycles et la foule pour aller faire trempette au lac, on est sur la rive côté suisse et aucun accès “sauvage” évident, à défaut on passe l’aprem dans une piscine avec méga-toboggans et accès au lac privatisé.
Entamés physiquement par les sessions de toboggans on prend notre retraite en fin d’après-midi vers notre lieu de campement à la station Wasserauen au pied des EbenAlps.&lt;/p&gt;

&lt;p&gt;Lever 7h30 du mat, on déjeune et profitons des toilettes publiques de la station avant de partir en randonnée vers 9h30. Les conditions sont idéales, si ce n’est Nelson qui chouinera une bonne partie de l’aller. Anecdote: on croisera notamment un couple de bergers vnr car ça devait faire le 5e aller-retour des alpages qu’ils se tapaient dans la matinée avec les chèvres qui filent pas droit, mais un gonze torse poils qui gueule en allemand ça fait toujours son effet.&lt;br /&gt;
Arrivés au lac, on est tenté par des smoothies faits avec le lait local mais on n’a malheureusement pas d’espèces sur nous, on se rabat donc sur le bar-restau pour prendre un verre après s’être baignés rapidement.&lt;br /&gt;
On reprend la route l’après-midi direction Lucerne. Une fois arrivés, alors qu’on vient à peine de commencer une ballade en ville, l’orage éclate avec branches qui tombent etc., on s’abrite 5 min dans une sorte de couvent et on retourne au van. On mettra un peu de temps à trouver notre emplacement où passer la nuit pour cause d’emplacements déjà pris et au final on n’aura fait que passer sans visiter.&lt;/p&gt;

&lt;p&gt;Vendredi 25 Août : direction le Sud. On fait escale au lac de Sanen pour piquer une tête et on arrive à Interlaken à la mi-journée. Le temps est maussade mais on a le temps de déguster de la fondue au chocolat avec fruits et marshmallows à la &lt;em&gt;Funky Chocolate Factory&lt;/em&gt;. On se documente sur le sujet et suite à ça désormais quand on entrera dans un supermarché on fera toujours un stop au rayon chocolats pour ramener en France un assemblage varié de plaques suisses.&lt;br /&gt;
Vu qu’il pleut on se rend à notre camping pour prendre nos marques, à 20 minutes de là. Le camping est situé dans une vallée encaissée, avec moult chutes d’eau et le mont &lt;em&gt;Breithorn&lt;/em&gt; en arrière plan, magnifique cadre. La fin de l’aprem est dédiée à la visite des chutes de Trümmelbach (à 5 minutes de là), les plus grandes chutes souterraines d’Europe.&lt;/p&gt;

&lt;p&gt;Le samedi était censé être l’apogée du séjour avec la randonnée du &lt;em&gt;Panorama Trail&lt;/em&gt; au &lt;em&gt;Schynige Platte&lt;/em&gt;, mais il y’a du brouillard toute la journée et sans surprise point de vision panoramique une fois arrivés sur le plateau. La journée aurait pu être pire : pris de peur au milieu de vaches que sur le moment je jugeais hostiles (&lt;a href=&quot;https://lh3.googleusercontent.com/pw/ADCreHc8HzLdQm_f2CY43_Yje7YfAB2k8OaNWGxY-8IOEXe0Cnhq4uikDPo3-DSmhMz0UO_N0Uaxxyey9oNVJVaCMBpA3NtWgDo-BRqLNdim_vOlwOzjWZp2dsocIZL8N23BNvGgjilpScqN7cOjsom6jW1f4g=w794-h1059-s-no?authuser=0&quot;&gt;une photo&lt;/a&gt; immortalise cet équilibre fragile), nous avons quitté le sentier balisé d’urgence mais sans une égratignure.&lt;br /&gt;
On termine la journée en mangeant une fondue au fromage (quand même) pour le goûter, et en faisant une petite ballade autour du camping sous le crachin.&lt;/p&gt;

&lt;p&gt;Blasés de la météo on quitte la région d’Interlaken pour commencer notre trajet retour.&lt;br /&gt;
L’objectif est de faire une visite de la fabrique de chocolat Cailler qui se trouve à côté de Gruyères.&lt;br /&gt;
En quête de notre dose quotidienne d’exercices je découvre sur la route une ballade menant à une des plus hautes passerelles suspendues d’Europe. Cette activité va s’avérer plus longue que prévue et la chocolaterie est repoussée au lendemain au désarroi de Nelson.  &lt;br /&gt;
On croise sur la route une fromagerie ouverte (un dimanche) et on en profite pour acheter des spécimens à ramener chez nous sous-vide.
Il pleut lorqu’on arrive vers Gruyères, on passe la nuit sur un parking pour camping-cars, bien contents d’en avoir fini avec cette journée de transition.&lt;/p&gt;

&lt;p&gt;Sitôt levés on va visiter la cité médiévale de Gruyères, se fait vite, sympa. Mais Nelson n’attend qu’une chose, et on part visiter la chocolaterie Cailler sur les coups de midi. La partie musée est plutot bien faite mais l’intérêt est au niveau de la découverte du processus de fabrication et la dégustation des chocolats qui l’accompagne. De fait on saute le repas et on reprend la route pour remonter vers Mulhouse, le van doit être remis demain midi. On s’arretera quand même sur le trajet pour goûter les hamburgers locaux.
On dort sur les berges du lac de Biaufond à la frontière suisse-allemande.&lt;/p&gt;

&lt;p&gt;Une fois le van retourné dans les mains de sa propriétaire le mardi matin on passe l’après-midi à visiter Basel avec les tarifs avantageux de la &lt;em&gt;Basel city card&lt;/em&gt; que notre nuit à l’hôtel Ibis nous octroie #bonplan, notre choix se porte vers les machineries du musée Tinguely (d’où Di Muoi ramènera un poster désormais affiché dans notre cuisine).&lt;/p&gt;

&lt;p&gt;Mercredi dernier jour. Lors du déjeuner à l’hôtel Ibis on assiste à une altercation entre et
le Breakfast Manager et un client, ce-dernier se plaignant que d’autres clients n’utilisent pas les pinces prévues à cet effet pour se servir, et que les affiches  poussant à l’utilisation des dites pinces sont mal positionnées. La propreté suisse.
On laisse nos bagages à l’hôtel et on a toute notre matinée pour visiter le zoo de Bâle qui se trouve à 30 minutes en transports en commun.&lt;br /&gt;
Une fois sur place, peu de monde, et l’occasion de voir des animaux sympas eg félins, gorilles, otaries (mais pas d’éléphant car enclos en reconstruction).&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Cool Negro Dope (instru.)</title>
   <link href="http://kray.me/sound-selector/2023/02/cool-negro-dope/"/>
   <updated>2023-02-11T00:00:00+00:00</updated>
   <id>http://kray.me/sound-selector/2023/02/cool-negro-dope</id>
   <content type="html">&lt;p&gt;Jazz / chillhop / abstract beats. For a laid-back afternoon, a reflective coffee break, or setting the mood for deep focus.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;iframe style=&quot;border-radius:12px&quot; src=&quot;https://open.spotify.com/embed/playlist/3rZkdGYlbjknPARM0p6lEA?utm_source=generator&quot; width=&quot;100%&quot; height=&quot;688&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; allow=&quot;autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
</content>
 </entry>
 
 <entry>
   <title>Truth better in thought</title>
   <link href="http://kray.me/sound-selector/2022/11/truth-better-in-thought/"/>
   <updated>2022-11-19T00:00:00+00:00</updated>
   <id>http://kray.me/sound-selector/2022/11/truth-better-in-thought</id>
   <content type="html">&lt;p&gt;From Jazz  to Rap thru Afrobeat. Thoughtful soundtrack with eclectic, global roots.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;iframe style=&quot;border-radius:12px&quot; src=&quot;https://open.spotify.com/embed/playlist/3przUKPWtSPHbnenm1NtRu?utm_source=generator&quot; width=&quot;100%&quot; height=&quot;688&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; allow=&quot;autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
</content>
 </entry>
 
 <entry>
   <title>Importing chess book exercise into Lichess etude using OCR</title>
   <link href="http://kray.me/2022/09/book_chess_problem_to_lichess_ocr/"/>
   <updated>2022-09-17T00:00:00+00:00</updated>
   <id>http://kray.me/2022/09/book_chess_problem_to_lichess_ocr</id>
   <content type="html">&lt;p&gt;A common advice when reading a chess book is to reproduce the exercices OTB. Yet, for casual players that play exclusively online, setting up a chessboard can be a burden. Without it, visualizing the exercice becomes a tedious task, and make the overall experience less enjoyable.&lt;/p&gt;

&lt;p&gt;Here is how I proceed to practise book exercises using Lichess etudes :&lt;/p&gt;

&lt;p&gt;1- create a study on Lichess named after the book&lt;br /&gt;
2- open &lt;a href=&quot;https://chessvision.ai/&quot;&gt;Chessvision.ai&lt;/a&gt; application on your smartphone and take a picture of the checkboard&lt;br /&gt;
3- click the ☰ button and press &lt;em&gt;Study&lt;/em&gt;, select the aforementioned study&lt;br /&gt;
4- scroll down and click ⚙ to edit the name of the created chapter&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/ognKG56d5As&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</content>
 </entry>
 
 <entry>
   <title>Chute accidentelle au musée</title>
   <link href="http://kray.me/dream/f0eb38/"/>
   <updated>2021-11-25T00:00:00+00:00</updated>
   <id>http://kray.me/dream/chute_accidentelle_musee</id>
   <content type="html">&lt;div class=&quot;dream-dissipate-image&quot;&gt;
    &lt;img src=&quot;/public/img/posts/dream/20211125.jpg&quot; alt=&quot;Inside a building similar to Guggenheim museum in NY, dome with high ceiling, a kid fell from the first floor&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(un séminaire Yescapa se tient dans un musée futuriste)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Au RDC une salle donne accès à une grotte où se trouve [un autel], des moines tibétain vont et viennent.
Je suis en famille. On rentre dans la grotte, mon père en béquilles arrive et veut visiter aussi mais c’est une grosse galère pr se déplacer.&lt;/p&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(dans la salle centrale)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Un enfant de 6 ans tombe en oblique, tête la première, chute que j’estime à 2 étages. Il porte un pantalon de la même couleur que celui de Nelson, je crois 
qu’il s’agit de lui mais non. Je vais vérifier que l’enfant n’est pas décédé &lt;span class=&quot;label label-gray&quot;&gt;🪞&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Une dame qui travaille au musée me dit de pas le toucher, elle appelle les secours.&lt;/p&gt;

&lt;p&gt;Je me déplace pr voir d’où il a pu tomber, ont lieu des discussions sur dans quel sens était la chute. Je tombe sur Julie dans tous ses états qui me dit que le gamin chialait après qu’elle l’ait grondé, elle l’a alors remis dans les bras de ses parents et là il est tombé. Je lui dit que j’ai vu l’enfant et ne crois pas qu’il soit mort, je ne suis pas sûr de moi &lt;span class=&quot;label label-gray&quot;&gt;🪞&lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/span&gt; 
En partant je croise une blonde qui dit à Julie &lt;em&gt;“c’est bien de faire ce que tu fais”&lt;/em&gt; (??) et là Julie tombe en pleurs (note: mais je ne la vois pas car l’apprend de manière indirect via la fille).
Après la blonde dans le couloir on [qqun m’accompagne] croise un groupe en pleurs, surement la famille de l’enfant, celui qui m’accompagne va les enlacer et compatir, je ne le fais pas.
Une genre limousine arrive dehors, porte s’ouvre avec l’enfant qui parle ses parents autour =&amp;gt; il va bien (parlait un peu comme un débile, mais soit) =&amp;gt; je prend pr mission d’aller avertir la direction&lt;/p&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(dans vestiaires du musée, première salle)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;musée est quasi vide je tombe sur qqun de Yescapa [Stanley de the office ? pas sûr, en tt cas un black], je lui raconte le truc, son pote parle d’un joueur de Lille de Football &lt;span class=&quot;label label-black&quot;&gt;?!&lt;/span&gt; 
J’envoie un sms à Adrien pr dire que l’enfant va bien.&lt;/p&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(dans vestiaires du musée, deuxième salle. Avec Adrien, Loïc et Arthur)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Loic sort de sa redingote moult DVD, BlueRay (Batman 5) qu’il étale sur un [banc] au milieu de la salle pour qu’Arthur en choisisse un. Adrien dit que Need For Speed est le cd le plus usé de tous (comprendre: il y’a bcp joué).&lt;/p&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(dans une chambre, localisation indéterminée)&lt;/em&gt;
On se retrouve dans une chambre avec Benjamin à parler d’une track d’un des cd de Loïc que l’on croit tous les 2 connaître mais on ne chantonne pas la même chose.
On joue la track sur le cd, verdict : il a gagné. C’est bien celle là que j’avais en tête, mais je connaissais une version live or là c’était l’album.&lt;/p&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;label label-gray&quot;&gt;💥&lt;/span&gt; 
&lt;em&gt;([quelqu’un] dans une ferrari jaune en mode mangane avec la musique en question au poste radio, qques secondes après c du rap naze sexiste à la place)&lt;/em&gt;
Je suis au volant de la ferrari (il n’y a plus de musique), en ville, fluctue entre première et seconde.
Une ligne droite vallonée je vais pouvoir accélérer passer la 4e&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Téléphone sonne&lt;/em&gt;&lt;sup id=&quot;fnref:3&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;une de mes lectures récentes était un livre sur le pont de Brooklyn où ça parlait de suicidés &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;peut être en rapport avec la daily où je n’ai pas été bon en communication en la faisant en français alors qu’on avait dit en anglais &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot;&gt;
      &lt;p&gt;un appel à 6h, chose qui n’arrive jamais et qui peut expliquer que je me sois souvenu de tous mes rêves au réveil &lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Autokill detached anonymous EC2 instances</title>
   <link href="http://kray.me/2019/01/ec2_autokill/"/>
   <updated>2019-01-15T00:00:00+00:00</updated>
   <id>http://kray.me/2019/01/ec2_autokill</id>
   <content type="html">&lt;p&gt;It’s not rare to detach an EC2 instance to have access to a server in a production-like environment
or to test how the autoscaler reacts after the sudden loss of an instance, etc.&lt;br /&gt;
It’s not rare neither that once you have done your job with the instance, you forget to stop it.
And it runs for days costing you money for nothing.&lt;/p&gt;

&lt;p&gt;Until now we have stated the rule at work that “no name &amp;amp; no group name” instances could be stopped 
instantly (so the first thing when working on a detached instance consists to give it a name).&lt;br /&gt;
I decided to automate this, as killing thing is a pet peeve of mine (cf &lt;em&gt;&lt;a href=&quot;http://kray.me/2017/03/ezkill-kill-process/&quot;&gt;ezkill, selective process killing made easy&lt;/a&gt;&lt;/em&gt;).&lt;br /&gt;
Rather than having a master instance in charge of executing the detached ones, each instance has 
the faculty of performing itself an hara-kiri wired as a cron job. The instance check its group 
name periodically and when it gets null, it means instance is detached and should shutdown.&lt;/p&gt;

&lt;p&gt;So here is the script we now ship in the AMI, called by cron on an hourly basis :&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt;
&lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt;
&lt;a href=&quot;#n8&quot; name=&quot;n8&quot;&gt;8&lt;/a&gt;
&lt;a href=&quot;#n9&quot; name=&quot;n9&quot;&gt;9&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n10&quot; name=&quot;n10&quot;&gt;10&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n11&quot; name=&quot;n11&quot;&gt;11&lt;/a&gt;
&lt;a href=&quot;#n12&quot; name=&quot;n12&quot;&gt;12&lt;/a&gt;
&lt;a href=&quot;#n13&quot; name=&quot;n13&quot;&gt;13&lt;/a&gt;
&lt;a href=&quot;#n14&quot; name=&quot;n14&quot;&gt;14&lt;/a&gt;
&lt;a href=&quot;#n15&quot; name=&quot;n15&quot;&gt;15&lt;/a&gt;
&lt;a href=&quot;#n16&quot; name=&quot;n16&quot;&gt;16&lt;/a&gt;
&lt;a href=&quot;#n17&quot; name=&quot;n17&quot;&gt;17&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;#!/bin/bash

# This script is executed on an instance itself in order to determine if it is detached.
# If so, it shuts itself down after alerting staff on slack.


INSTANCE_ID=`ec2metadata --instance-id`
IS_LONER_SERVER=`aws ec2 describe-tags --filters Name=resource-id,Values=&amp;quot;$INSTANCE_ID&amp;quot; Name=key,Values=Name --query Tags[].Value --output text`
if [ $? -ne 0 ]; then { echo &amp;quot;Failed, aborting.&amp;quot; ; exit 1; } fi
IS_AUTOSCALED_SERVER=`aws ec2 describe-tags --filters Name=resource-id,Values=&amp;quot;$INSTANCE_ID&amp;quot; Name=key,Values=aws:autoscaling:groupName --query Tags[].Value --output text`
if [ $? -ne 0 ]; then { echo &amp;quot;Failed, aborting.&amp;quot; ; exit 1; } fi


if { [ -z &amp;quot;$IS_LONER_SERVER&amp;quot; ] &amp;amp;&amp;amp; [ -z &amp;quot;$IS_AUTOSCALED_SERVER&amp;quot; ]; }; then
    echo &apos;Detached: `shutdown` in 5 minutes.&apos; | /usr/local/bin/slacktee.sh -p -u &amp;quot;$HOSTNAME&amp;quot; --config /home/ubuntu/.slacktee-alert
    sudo shutdown&amp;quot; | at now + 5 minutes
fi
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>Code across multiple branches while keeping a single database</title>
   <link href="http://kray.me/2018/12/django_branches_database/"/>
   <updated>2018-12-27T00:00:00+00:00</updated>
   <id>http://kray.me/2018/12/django_branches_database</id>
   <content type="html">&lt;p&gt;Coding an ORM based software having multiple development git branches ain’t trivial.&lt;br /&gt;
By definition, your database scheme evolves with your model code and you quickly end up with errors when you apply
a database migration in one branch then checkout another one : database and code get unsynchronized
and … you’re &lt;em&gt;doomed&lt;/em&gt; :scream:&lt;br /&gt;
You can go back to normal by applying reverse migrations but you don’t want that as it’s time consuming
and introduces unnecessary complications in your daily workflow.&lt;/p&gt;

&lt;p&gt;What else then?&lt;br /&gt;
For practical purpose we want to use the same database no matter the branch, so that we always have
same testing data available. Having one database per branch defeats that point and does not scale
well with number of branches (creating a branch in git is &lt;em&gt;cheap&lt;/em&gt; as opposed to restoring a database).&lt;/p&gt;

&lt;p&gt;The trick consists to use &lt;a href=&quot;https://github.com/fastmonkeys/stellar&quot;&gt;&lt;code&gt;stellar&lt;/code&gt;&lt;/a&gt;, this tool keeps
snapshots of the database in the RDBMS, and works as follow :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;first, you take a snapshot of your database in its original state, typically just after having 
restored your database dump :&lt;/p&gt;

    &lt;div class=&quot;language-plaintext highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;stellar snapshot &amp;lt;mydb&amp;gt;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;when you checkout a new branch, you restore the snapshot and apply migrations created in the 
meantime :&lt;/p&gt;

    &lt;div class=&quot;language-plaintext highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;stellar restore &amp;lt;mydb&amp;gt;
./manage.py migrate
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Cron jobs execution monitoring in slack</title>
   <link href="http://kray.me/2018/10/cron_monitoring_in_slack/"/>
   <updated>2018-10-24T00:00:00+00:00</updated>
   <id>http://kray.me/2018/10/cron_monitoring_in_slack</id>
   <content type="html">&lt;p&gt;This post is in the same vein than the &lt;a href=&quot;http://kray.me/2018/09/celery_monitoring_in_slack/&quot;&gt;previous one&lt;/a&gt; 
but applies to cron jobs instead of celery tasks.&lt;br /&gt;
I used to redirect stderr to a log file for my cron jobs but it took me weeks to figure the jobs were 
crashing in the first place.&lt;br /&gt;
So now I want my jobs to crash loudly, for that purpose I use &lt;a href=&quot;https://github.com/coursehero/slacktee&quot;&gt;slacktee&lt;/a&gt; util
that posts stdin to slack.&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt;
&lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt;
&lt;a href=&quot;#n8&quot; name=&quot;n8&quot;&gt;8&lt;/a&gt;
&lt;a href=&quot;#n9&quot; name=&quot;n9&quot;&gt;9&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n10&quot; name=&quot;n10&quot;&gt;10&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n11&quot; name=&quot;n11&quot;&gt;11&lt;/a&gt;
&lt;a href=&quot;#n12&quot; name=&quot;n12&quot;&gt;12&lt;/a&gt;
&lt;a href=&quot;#n13&quot; name=&quot;n13&quot;&gt;13&lt;/a&gt;
&lt;a href=&quot;#n14&quot; name=&quot;n14&quot;&gt;14&lt;/a&gt;
&lt;a href=&quot;#n15&quot; name=&quot;n15&quot;&gt;15&lt;/a&gt;
&lt;a href=&quot;#n16&quot; name=&quot;n16&quot;&gt;16&lt;/a&gt;
&lt;a href=&quot;#n17&quot; name=&quot;n17&quot;&gt;17&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;#!/bin/bash

# Take a command to run in argument. Posts stderr to slack if it fails. 
runcheck() {
    ERR=&amp;quot;$($@ 2&amp;gt;&amp;amp;1 &amp;gt; /dev/null)&amp;quot;
    if [ $? -ne 0 ]; then
         echo &amp;quot;\`${1##*/}\` failed&amp;quot; | /usr/local/bin/slacktee.sh -p -u &amp;quot;$HOSTNAME&amp;quot; --config /home/ubuntu/.slacktee-alert
        if [ ! -z $ERR ]; then
             echo &amp;quot;${ERR}&amp;quot; | sed -e &apos;s/^/&amp;gt;/&apos; | /usr/local/bin/slacktee.sh -p -u &amp;quot;$HOSTNAME&amp;quot; --config /home/ubuntu/.slacktee-alert
        fi
    fi
}

main() {
    runcheck $@
}
main $@
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;buffer-title center&quot;&gt;runcheck.sh&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;So my cron tasks are declared like so :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;$ crontab -l
SHELL=/bin/bash

# 0 */2 * * * /home/ubuntu/bin/runcheck.sh /home/ubuntu/my_project/binaries/cron/run_critics.sh
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;In case of failure, a slack alert pops with all needed infos : hostname, command that fails and error message.&lt;/p&gt;

&lt;p class=&quot;center&quot;&gt;&lt;img src=&quot;/public/img/posts/cron_alert.png&quot; alt=&quot;slack notification with developers facemojis&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Slackery</title>
   <link href="http://kray.me/2018/09/celery_monitoring_in_slack/"/>
   <updated>2018-09-10T00:00:00+00:00</updated>
   <id>http://kray.me/2018/09/celery_monitoring_in_slack</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;/sla-kuh-ree/&lt;/em&gt;&lt;br /&gt;
    1. the act of engaging in unproductive activities &lt;br /&gt;
    2. the act of monitoring celery processes via slack&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We will detail in this post how to have a slack notification when a celery task is being executed.  &lt;br /&gt;
This is something I wrote to circumvent the blindness I had about monitoring the proper execution 
of tasks, as accessing the queues list with &lt;code&gt;rabbitmqctl&lt;/code&gt; was immediatley overwhelming because of 
the number of tasks involved.&lt;/p&gt;

&lt;p&gt;Here how looks notifications for tasks decorated with &lt;code&gt;@slackery&lt;/code&gt; decorator : 
&lt;img src=&quot;/public/img/posts/slackery_notif.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;First, if not done already, you must configure your celery app with dedicated settings to be able 
to distinguish whether a function is called from webserver or a celery process :&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color:#B44;font-weight:bold&quot;&gt;socket&lt;/span&gt;
&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color:#B44;font-weight:bold&quot;&gt;myapp.settings&lt;/span&gt; &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color:#B44;font-weight:bold&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color:#777&quot;&gt;# NOQA&lt;/span&gt;

IS_CELERY = &lt;span style=&quot;color:#069&quot;&gt;True&lt;/span&gt;
HOSTNAME = socket.gethostname()
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;buffer-title center&quot;&gt;celery_settings.py&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;We can now write our decorator :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;check first that &lt;code&gt;IS_CELERY&lt;/code&gt; is defined&lt;/li&gt;
  &lt;li&gt;if so, send a message to slack channel webhook url with current time and instance hostname&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-python highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt;
&lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt;
&lt;a href=&quot;#n8&quot; name=&quot;n8&quot;&gt;8&lt;/a&gt;
&lt;a href=&quot;#n9&quot; name=&quot;n9&quot;&gt;9&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n10&quot; name=&quot;n10&quot;&gt;10&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n11&quot; name=&quot;n11&quot;&gt;11&lt;/a&gt;
&lt;a href=&quot;#n12&quot; name=&quot;n12&quot;&gt;12&lt;/a&gt;
&lt;a href=&quot;#n13&quot; name=&quot;n13&quot;&gt;13&lt;/a&gt;
&lt;a href=&quot;#n14&quot; name=&quot;n14&quot;&gt;14&lt;/a&gt;
&lt;a href=&quot;#n15&quot; name=&quot;n15&quot;&gt;15&lt;/a&gt;
&lt;a href=&quot;#n16&quot; name=&quot;n16&quot;&gt;16&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color:#B44;font-weight:bold&quot;&gt;functools&lt;/span&gt; &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color:#B44;font-weight:bold&quot;&gt;wraps&lt;/span&gt;
&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color:#B44;font-weight:bold&quot;&gt;django.utils&lt;/span&gt; &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color:#B44;font-weight:bold&quot;&gt;timezone&lt;/span&gt;
&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color:#B44;font-weight:bold&quot;&gt;utils.slack&lt;/span&gt; &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color:#B44;font-weight:bold&quot;&gt;slack_notify&lt;/span&gt;

&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color:#06B;font-weight:bold&quot;&gt;slackery&lt;/span&gt;(fun):
    &lt;span style=&quot;color:#D42&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;    Post slack notification when celery task is executed&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color:#B0B&quot;&gt;@wraps&lt;/span&gt;(fun)
    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color:#06B;font-weight:bold&quot;&gt;wrapper&lt;/span&gt;(*args, **kwargs):
        &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color:#369;font-weight:bold&quot;&gt;getattr&lt;/span&gt;(settings, &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;IS_CELERY&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#069&quot;&gt;False&lt;/span&gt;):
            slack_notify(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;celery&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;%s Executing %s&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt; % (&lt;span style=&quot;color:#369;font-weight:bold&quot;&gt;str&lt;/span&gt;(timezone.now())[:-&lt;span style=&quot;color:#00D&quot;&gt;7&lt;/span&gt;], fun),
                title=settings.HOSTNAME)
        &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;return&lt;/span&gt; fun(*args, **kwargs)

    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;return&lt;/span&gt; wrapper
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;And if you think the celery icon on the screenshot above is yummy, you can get it 
&lt;a href=&quot;http://www.iconhot.com/icon/pickin-time/celery.html&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Django: check for uncommited migrations on deploy</title>
   <link href="http://kray.me/2018/05/django-check-migration/"/>
   <updated>2018-05-12T00:00:00+00:00</updated>
   <id>http://kray.me/2018/05/django-check-migration</id>
   <content type="html">&lt;p&gt;Small check to integrate into your fabric deployment method. It detects uncommited migrations and 
prompt user to continue or abort the deployment.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt;
&lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt;
&lt;a href=&quot;#n8&quot; name=&quot;n8&quot;&gt;8&lt;/a&gt;
&lt;a href=&quot;#n9&quot; name=&quot;n9&quot;&gt;9&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n10&quot; name=&quot;n10&quot;&gt;10&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n11&quot; name=&quot;n11&quot;&gt;11&lt;/a&gt;
&lt;a href=&quot;#n12&quot; name=&quot;n12&quot;&gt;12&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color:#B44;font-weight:bold&quot;&gt;fabric.api&lt;/span&gt; &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color:#B44;font-weight:bold&quot;&gt;local&lt;/span&gt;

&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color:#06B;font-weight:bold&quot;&gt;check_migrations&lt;/span&gt;():
    &lt;span style=&quot;color:#D42&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span&gt;Return true if no migration file left uncommited&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    mig = local(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;./manage.py makemigrations&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;, capture=&lt;span style=&quot;color:#069&quot;&gt;True&lt;/span&gt;)
    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;if&lt;/span&gt; mig.split()[&lt;span style=&quot;color:#00D&quot;&gt;0&lt;/span&gt;] != &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;No&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;:  &lt;span style=&quot;color:#777&quot;&gt;# No changes detected&lt;/span&gt;
        local(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;git clean -f&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;)   &lt;span style=&quot;color:#777&quot;&gt;# Cleanup generated migrations&lt;/span&gt;
        print(mig)
        ok = &lt;span style=&quot;color:#369;font-weight:bold&quot;&gt;raw_input&lt;/span&gt;(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#b0b&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Uncommited migration(s). Continue? [y/n]&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;)
        &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;if&lt;/span&gt; ok.lower() != &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;y&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;:
            &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:#069&quot;&gt;False&lt;/span&gt;
    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:#069&quot;&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Git one-liner: show commits since last release</title>
   <link href="http://kray.me/2018/05/git-commits-since-last-release/"/>
   <updated>2018-05-05T00:00:00+00:00</updated>
   <id>http://kray.me/2018/05/git-commits-since-last-release</id>
   <content type="html">&lt;p&gt;This git one-liner is useful for checking there is no omission in the changelog before shipping a 
release.&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;alias git-log-since-rlz=&apos;git log --oneline --pretty=format:&amp;quot;%h%x09%an%x09%s&amp;quot; --no-merges $(git describe --abbrev=0 --tags)..HEAD&apos;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;And you get a no fluff view of the commits that happened since last tag :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;$ git-log-since-rlz
c5bf39db        Fabrice Laporte add new post 2018-05-03-slack_deploy_notifications.md
b047232e        Fabrice Laporte use terminal styling from mademistakes
fed1d2c5        Fabrice Laporte add comments link to last post
a9f137a7        Fabrice Laporte publish 2018-04-16-terminal_css.md
1335bd76        Fabrice Laporte Remove unpublished post
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>Creative use of &lt;code&gt;git blame&lt;/code&gt; for slack deploys notifications</title>
   <link href="http://kray.me/2018/05/slack_deploy_notifications/"/>
   <updated>2018-05-03T00:00:00+00:00</updated>
   <id>http://kray.me/2018/05/slack_deploy_notifications</id>
   <content type="html">&lt;p&gt;The goal is to make explicit who coded a deployed feature so that people (outside the dev team) know who to contact in case of complaints or praises.&lt;/p&gt;

&lt;p class=&quot;center&quot;&gt;&lt;img src=&quot;/public/img/posts/slack_deploy_notif.png&quot; alt=&quot;slack notification with developers facemojis&quot; /&gt;&lt;br /&gt;
&lt;em&gt;Slack deploy notification with authors faces&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This technique requires to have facemojis named after each developer (4 first letters of firstnames).
It relies on a &lt;code&gt;develop.md&lt;/code&gt; file that contains the changelog of the upcoming release, like so :&lt;/p&gt;

&lt;div class=&quot;language-markdown highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt;
&lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt;
&lt;a href=&quot;#n8&quot; name=&quot;n8&quot;&gt;8&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;Higher level release description 

### Added 
- item 1 

### Fixed
- item 2
- item 3
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;We parse the output of &lt;code&gt;git blame&lt;/code&gt; on that file to prepend a developer facemoji for each item.&lt;/p&gt;

&lt;p&gt;For example, imagine I’ve coded item 1 feature and added it to the &lt;code&gt;develop.md&lt;/code&gt;, then line &lt;code&gt;- item 1&lt;/code&gt; becomes &lt;code&gt;:fabr: item 1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Code is straight-forward :&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt;
&lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt;
&lt;a href=&quot;#n8&quot; name=&quot;n8&quot;&gt;8&lt;/a&gt;
&lt;a href=&quot;#n9&quot; name=&quot;n9&quot;&gt;9&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n10&quot; name=&quot;n10&quot;&gt;10&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n11&quot; name=&quot;n11&quot;&gt;11&lt;/a&gt;
&lt;a href=&quot;#n12&quot; name=&quot;n12&quot;&gt;12&lt;/a&gt;
&lt;a href=&quot;#n13&quot; name=&quot;n13&quot;&gt;13&lt;/a&gt;
&lt;a href=&quot;#n14&quot; name=&quot;n14&quot;&gt;14&lt;/a&gt;
&lt;a href=&quot;#n15&quot; name=&quot;n15&quot;&gt;15&lt;/a&gt;
&lt;a href=&quot;#n16&quot; name=&quot;n16&quot;&gt;16&lt;/a&gt;
&lt;a href=&quot;#n17&quot; name=&quot;n17&quot;&gt;17&lt;/a&gt;
&lt;a href=&quot;#n18&quot; name=&quot;n18&quot;&gt;18&lt;/a&gt;
&lt;a href=&quot;#n19&quot; name=&quot;n19&quot;&gt;19&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color:#06B;font-weight:bold&quot;&gt;get_changelog&lt;/span&gt;(changelog_path):
    &lt;span style=&quot;color:#D42&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span&gt;Extract release synopsis and changelog from given file.&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    blamelog = subprocess.check_output(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;git blame %s&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt; % changelog_path)
    synopsis = []
    changelog = []
    h3_found = &lt;span style=&quot;color:#069&quot;&gt;False&lt;/span&gt;
    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;for&lt;/span&gt; blameline &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;in&lt;/span&gt; blamelog.split(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#b0b&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;):
        line = &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;.join(blameline.split(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;)[&lt;span style=&quot;color:#00D&quot;&gt;1&lt;/span&gt;:])
        &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;if&lt;/span&gt; line.startswith(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;###&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;):
            h3_found = &lt;span style=&quot;color:#069&quot;&gt;True&lt;/span&gt;
        &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;not&lt;/span&gt; h3_found:
            synopsis.append(line)
        &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;else&lt;/span&gt;:
            &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;if&lt;/span&gt; line.startswith(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;):
                author = blameline.split()[&lt;span style=&quot;color:#00D&quot;&gt;1&lt;/span&gt;][&lt;span style=&quot;color:#00D&quot;&gt;1&lt;/span&gt;:&lt;span style=&quot;color:#00D&quot;&gt;5&lt;/span&gt;].lower()
                line = &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;:%s: %s&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt; % (author.lower(), line[&lt;span style=&quot;color:#00D&quot;&gt;2&lt;/span&gt;:])
            changelog.append(line)
    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;return&lt;/span&gt; synopsis, changelog
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;We’re done, you can craft a message with the synopsis and changelog and post a slack notification using 
&lt;a href=&quot;http://docs.python-requests.org/en/master/&quot;&gt;requests&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Obviously, for this trick to work, each developer must log his activity in &lt;code&gt;develop.md&lt;/code&gt; and one should avoid at all costs editing others lines or the output of &lt;code&gt;git blame&lt;/code&gt; won’t reflect original authors.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Custom css style for terminal codeblocks</title>
   <link href="http://kray.me/2018/04/terminal_css/"/>
   <updated>2018-04-16T00:00:00+00:00</updated>
   <id>http://kray.me/2018/04/terminal_css</id>
   <content type="html">&lt;div class=&quot;language-plaintext highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;A terminal styled codeblock
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Update&lt;/em&gt;&lt;/strong&gt;&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; : &lt;em&gt;Michael Rose &lt;a href=&quot;https://mademistakes.com/til/styling-language-specific-code-blocks/&quot;&gt;pointed me&lt;/a&gt; 
to a better way to give a terminal style to code blocks. I applied this technique for this blog but picked the ‘plaintext’ lexer to have no highlighting in my terminal blocks.&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;original post content available at &lt;a href=&quot;https://github.com/Kraymer/kraymer.github.com/blob/a9f137&quot;&gt;&lt;code&gt;a9f137&lt;/code&gt;&lt;/a&gt; &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Print related stored stashes when checkouting a branch</title>
   <link href="http://kray.me/2018/04/git-alias-print-branch-stashes-checkout/"/>
   <updated>2018-04-12T00:00:00+00:00</updated>
   <id>http://kray.me/2018/04/git-alias-print-branch-stashes-checkout</id>
   <content type="html">&lt;p&gt;I use git stashes parsimoniously and generally prefer to do a &lt;em&gt;WIP&lt;/em&gt; commit when I must leave a 
branch. Yet, sometimes, when I struggle to find a good implementation, I cannot resolve myself to 
commit the code -even as a WIP- and prefer to stash it away.&lt;br /&gt;
So git stashes are places where I put my half-baked attempts for an hypothetic later use.&lt;/p&gt;

&lt;p&gt;As soon as I checkout a branch, I call &lt;code&gt;git log&lt;/code&gt; to get back into the swing, if 
the top commit is labelled as &lt;em&gt;WIP&lt;/em&gt;, I soft reset it and am right back to work. 
Checking available stashes on checkout is not as natural for me and I forget to do it half the time 
thus losing the code stashed or wasting my time rewriting it :sob: …&lt;/p&gt;

&lt;p&gt;I figured today that I could use the fact that default stashes messages are of the form 
&lt;em&gt;“WIP on &lt;code&gt;&amp;lt;branchname&amp;gt;&lt;/code&gt;:”&lt;/em&gt; to grep them just after performing a checkout.
That gave birth to my &lt;code&gt;.gitconfig&lt;/code&gt; &lt;code&gt;co&lt;/code&gt; alias :&lt;/p&gt;

&lt;div class=&quot;language-config highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;co = &amp;quot;!f() { git checkout \&amp;quot;$@\&amp;quot; &amp;amp;&amp;amp; git stash list | grep \&amp;quot;$1:\&amp;quot;; }; f&amp;quot;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;… and gives following display :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;$ git co master 
Switched to branch &apos;master&apos; 
Your branch is up-to-date with &apos;origin/master&apos;. 
stash@{0}: WIP on master: c35edf60 add Curriculum vitae redirect 
stash@{2}: WIP on master: 0977c37 Move &amp;lt;head&amp;gt;&amp;lt;/head&amp;gt; outside head.html 
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;Tadaam! No more excuses to let stashes rot.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Highlighting lines in git blame output based on dates</title>
   <link href="http://kray.me/2018/02/git-blame-highlight-lines-date/"/>
   <updated>2018-02-16T00:00:00+00:00</updated>
   <id>http://kray.me/2018/02/git-blame-highlight-lines-date</id>
   <content type="html">&lt;p&gt;I tracked a bug today using &lt;code&gt;git blame&lt;/code&gt; and had a vague idea when the bug appeared, so I was mostly
interested by changes introduced during the last 30 days.&lt;br /&gt;
Perusing &lt;code&gt;git blame&lt;/code&gt; output to filter out too old lines was tedious, and so tonight I searched for 
a way to improve the output by highlighting lines in the desired period of time.&lt;br /&gt;
Here is an example, highlighting changes that happened from 2017 onward :&lt;/p&gt;

&lt;script src=&quot;https://asciinema.org/a/163256.js&quot; id=&quot;asciicast-163256&quot; async=&quot;&quot;&gt;&lt;/script&gt;

&lt;p&gt;The command is thus of the form :&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;git blame FILE | ack --nogroup --passthru &apos;.*(?:DATE_1|...|DATE_N).*?\)&apos;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;Few explanations :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;passthru&lt;/code&gt; option prints all lines, whether or not they match the expression&lt;/li&gt;
  &lt;li&gt;a non capturing group is used &lt;code&gt;(?:...)&lt;/code&gt; so that the highlight selection matches the whole regex, not just the date group&lt;/li&gt;
  &lt;li&gt;we use a lazy quantifier &lt;code&gt;.*?&lt;/code&gt; to stop the highlighting at the first &lt;code&gt;)&lt;/code&gt; delimiter, in case the line of code contains some others&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As usual, I don’t need to remember the exact command, as I rely on my zsh history to autocomplete my typing, or my &lt;a href=&quot;https://raw.githubusercontent.com/Kraymer/F-dotfiles/master/cheat/.cheat/git&quot;&gt;git cheatsheet&lt;/a&gt; when the history fails me.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Blog last publish date in favicon</title>
   <link href="http://kray.me/2018/01/jekyll-favicon-publish-date/"/>
   <updated>2018-01-21T00:00:00+00:00</updated>
   <id>http://kray.me/2018/01/jekyll-favicon-publish-date</id>
   <content type="html">&lt;p&gt;As for every details of &lt;a href=&quot;https://github.com/Kraymer/kraymer.github.com&quot;&gt;&lt;em&gt;Ex commito&lt;/em&gt; theme&lt;/a&gt;, I wanted the favicon to convey the maximum of information.
Basing your favicon on a thumbnail of your homepage sounds like a pretty dumb idea at first.&lt;br /&gt;
Obviously abstracting parts of the page details is essential to make the 128x128 square legible : I kept just the vertical split with artsy colourful sidebar and creamy right side.&lt;/p&gt;

&lt;p class=&quot;center&quot;&gt;&lt;img src=&quot;/public/img/favicon.png&quot; alt=&quot;empty favicon&quot; /&gt;&lt;br /&gt;
&lt;em&gt;Favicon empty background&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That’s a gross preview of how the blog looks, but that does not bring any useful information and makes a shitty favicon for sure.&lt;br /&gt;
But put the date of your last post in the empty right part of the image and this icon becomes a thing of beauty, &lt;em&gt;erm&lt;/em&gt;. The last publishing date identifies the state of the website like no other (metric).&lt;/p&gt;

&lt;p&gt;Because we don’t have that much space available we use the short &lt;code&gt;MMDD&lt;/code&gt; format to print the date.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt;
&lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt;
&lt;a href=&quot;#n8&quot; name=&quot;n8&quot;&gt;8&lt;/a&gt;
&lt;a href=&quot;#n9&quot; name=&quot;n9&quot;&gt;9&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n10&quot; name=&quot;n10&quot;&gt;10&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n11&quot; name=&quot;n11&quot;&gt;11&lt;/a&gt;
&lt;a href=&quot;#n12&quot; name=&quot;n12&quot;&gt;12&lt;/a&gt;
&lt;a href=&quot;#n13&quot; name=&quot;n13&quot;&gt;13&lt;/a&gt;
&lt;a href=&quot;#n14&quot; name=&quot;n14&quot;&gt;14&lt;/a&gt;
&lt;a href=&quot;#n15&quot; name=&quot;n15&quot;&gt;15&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color:#B44;font-weight:bold&quot;&gt;os&lt;/span&gt;
&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color:#B44;font-weight:bold&quot;&gt;PIL&lt;/span&gt; &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color:#B44;font-weight:bold&quot;&gt;Image&lt;/span&gt;, &lt;span style=&quot;color:#B44;font-weight:bold&quot;&gt;ImageDraw&lt;/span&gt;, &lt;span style=&quot;color:#B44;font-weight:bold&quot;&gt;ImageFont&lt;/span&gt;

&lt;span style=&quot;color:#777&quot;&gt;# Generates timestamped favicon images for every day of the year, store images in 12 folders (one per month).&lt;/span&gt;

FONT = ImageFont.truetype(os.path.abspath(os.path.join(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;static&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;fonts&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Avenir Next Condensed.ttc&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;)), &lt;span style=&quot;color:#00D&quot;&gt;60&lt;/span&gt;)

&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;for&lt;/span&gt; month &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;in&lt;/span&gt; [&lt;span style=&quot;color:#369;font-weight:bold&quot;&gt;str&lt;/span&gt;(x).zfill(&lt;span style=&quot;color:#00D&quot;&gt;2&lt;/span&gt;) &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;for&lt;/span&gt; x &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color:#369;font-weight:bold&quot;&gt;range&lt;/span&gt;(&lt;span style=&quot;color:#00D&quot;&gt;1&lt;/span&gt;, &lt;span style=&quot;color:#00D&quot;&gt;13&lt;/span&gt;)]:
    os.makedirs(month)
    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;for&lt;/span&gt; day &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;in&lt;/span&gt; [&lt;span style=&quot;color:#369;font-weight:bold&quot;&gt;str&lt;/span&gt;(x).zfill(&lt;span style=&quot;color:#00D&quot;&gt;2&lt;/span&gt;) &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;for&lt;/span&gt; x &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color:#369;font-weight:bold&quot;&gt;range&lt;/span&gt;(&lt;span style=&quot;color:#00D&quot;&gt;1&lt;/span&gt;, &lt;span style=&quot;color:#00D&quot;&gt;32&lt;/span&gt;)]:
        img = Image.open(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;public/img/favicon.png&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;)
        canvas = ImageDraw.Draw(img)
        canvas.text((&lt;span style=&quot;color:#00D&quot;&gt;65&lt;/span&gt;, &lt;span style=&quot;color:#00D&quot;&gt;50&lt;/span&gt;), (&lt;span style=&quot;color:#369;font-weight:bold&quot;&gt;str&lt;/span&gt;(day).zfill(&lt;span style=&quot;color:#00D&quot;&gt;2&lt;/span&gt;)), font=FONT, fill=(&lt;span style=&quot;color:#00D&quot;&gt;165&lt;/span&gt;, &lt;span style=&quot;color:#00D&quot;&gt;85&lt;/span&gt;, &lt;span style=&quot;color:#00D&quot;&gt;64&lt;/span&gt;))
        canvas.text((&lt;span style=&quot;color:#00D&quot;&gt;65&lt;/span&gt;, &lt;span style=&quot;color:#00D&quot;&gt;0&lt;/span&gt;), (&lt;span style=&quot;color:#369;font-weight:bold&quot;&gt;str&lt;/span&gt;(month).zfill(&lt;span style=&quot;color:#00D&quot;&gt;2&lt;/span&gt;)), font=FONT, fill=(&lt;span style=&quot;color:#00D&quot;&gt;165&lt;/span&gt;, &lt;span style=&quot;color:#00D&quot;&gt;85&lt;/span&gt;, &lt;span style=&quot;color:#00D&quot;&gt;64&lt;/span&gt;))
        img.save(os.path.join(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;%s/favicon_%s.png&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt; % (month, day)))
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;This script generates the &lt;a href=&quot;https://github.com/Kraymer/bulkdata/tree/master/excommito&quot;&gt;365+ different versions&lt;/a&gt; of the icon to cover the whole year, for a total size of 4,3M.&lt;/p&gt;

&lt;p&gt;And to use the correct version of the favicon, just use these lines in &lt;code&gt;head.html&lt;/code&gt; :&lt;/p&gt;

&lt;div class=&quot;language-liquid highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;{% capture last_date %}{{ site.posts.first.date }}{% endcapture %}
&amp;lt;link rel=&amp;quot;shortcut icon&amp;quot; type=&amp;quot;image/png&amp;quot; 
href=&amp;quot;https://raw.githubusercontent.com/Kraymer/bulkdata/master/excommito/{{ last_date | slice: 5,2 }}/favicon_{{ last_date | slice: 8,2 }}.png&amp;quot;&amp;gt;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;Have a look in your browser tab for the result! :sparkles:&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Deep in F-dotfiles : zsh package</title>
   <link href="http://kray.me/2017/06/fdotfiles-zsh/"/>
   <updated>2017-06-26T00:00:00+00:00</updated>
   <id>http://kray.me/2017/06/fdotfiles-zsh</id>
   <content type="html">&lt;p&gt;This post is the first of a serie focused on some cool things stored in
&lt;a href=&quot;https://github.com/Kraymer/F-dotfiles&quot;&gt;my dotfiles&lt;/a&gt;.
The topical organization of my dotfiles is such that each blog post will be dedicated to a given
package. Today we will start with the basics, setup of the shell with the &lt;code&gt;zsh&lt;/code&gt; package.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt;
&lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;├── .oh_my.zsh                Zsh theme and plugins
├── .zsh
│   ├── aliases.zsh
│   ├── config.zsh            Configure shell behavior
│   ├── dircolors.256dark     Colored ls
│   └── functions.zsh         Custom shell functions
└── .zshrc                    Routine loading all .zsh files
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;h3 id=&quot;oh_myzsh&quot;&gt;&lt;a href=&quot;https://github.com/Kraymer/F-dotfiles/blob/master/zsh/.oh_my.zsh&quot;&gt;.oh_my.zsh&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/public/img/posts/zshprompt.png&quot; alt=&quot;zsh prompt&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I use &lt;a href=&quot;https://github.com/robbyrussell/oh-my-zsh&quot;&gt;Oh My Zsh&lt;/a&gt; for its plugins coupled with
&lt;a href=&quot;https://github.com/bhilburn/powerlevel9k&quot;&gt;Powerlevel9k&lt;/a&gt; theme that makes the &lt;em&gt;pimpization&lt;/em&gt; of &lt;code&gt;PS1&lt;/code&gt;
a treat.&lt;/p&gt;

&lt;p&gt;The setup file weights a dozen lines (comments excluded) but has a tremendous impact on my
productivity, which is no surprise given that I spend most of my work day in a shell session.
I can live without the badass prompt, but I feel the pain when I ssh onto servers and lose my
&lt;code&gt;autojump&lt;/code&gt; and &lt;code&gt;history-substring-search&lt;/code&gt; plugins superpowers.&lt;/p&gt;

&lt;p&gt;I don’t use many plugins as I want to keep my prompt snappy, but core zsh is shipped with &lt;a href=&quot;https://code.joejag.com/2014/why-zsh.html&quot;&gt;a bunch
of powerful features&lt;/a&gt; already.&lt;/p&gt;

&lt;h3 id=&quot;aliaseszsh&quot;&gt;&lt;a href=&quot;https://github.com/Kraymer/F-dotfiles/blob/master/zsh/.zsh/aliases.zsh&quot;&gt;aliases.zsh&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;I use custom bash aliases parsimoniously, I prefer to do things the canonical way.
My primary use for aliases is to add default flags that i consider essential to commands like &lt;code&gt;-c&lt;/code&gt; for &lt;code&gt;nano&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But nothing fancy here.&lt;/p&gt;

&lt;h3 id=&quot;configzsh&quot;&gt;&lt;a href=&quot;https://github.com/Kraymer/F-dotfiles/blob/master/zsh/.zsh/config.zsh&quot;&gt;config.zsh&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;That’s where I put settings relative to shell core functions.
In particular the &lt;code&gt;history&lt;/code&gt; config is here : the filesize is boosted and the &lt;code&gt;SHARE_HISTORY&lt;/code&gt; attribute
makes the history work ok with multiple iTerm opened tabs.&lt;/p&gt;

&lt;p&gt;I put &lt;code&gt;TMOUT&lt;/code&gt; setting to &lt;code&gt;60&lt;/code&gt; seconds so that the hour in my prompt get updated : doing it one per
minute does not distract the eye and means you always have current time in prompt even when you’re
idle.&lt;/p&gt;

&lt;h3 id=&quot;functionszsh&quot;&gt;&lt;a href=&quot;https://github.com/Kraymer/F-dotfiles/blob/master/zsh/.zsh/functions.zsh&quot;&gt;functions.zsh&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Where things get interesting.
We have &lt;code&gt;which&lt;/code&gt; and &lt;code&gt;who&lt;/code&gt; commands but the need for &lt;code&gt;where&lt;/code&gt; arise much more frequently :&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;where() {
    find . -name \*$1\*
}
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;But the one function I would bring with me on a desert island is the one wrapping &lt;code&gt;ssh&lt;/code&gt; command
that attaches me to an existing tmux session once connected.&lt;/p&gt;

&lt;h3 id=&quot;zshrc&quot;&gt;&lt;a href=&quot;https://github.com/Kraymer/F-dotfiles/blob/master/zsh/.zshrc&quot;&gt;.zshrc&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;This file is responsible to source all the .zsh files located in my &lt;code&gt;~/.zsh&lt;/code&gt; directory.
It’s useful when you want a dotfiles package to alter an environment variable eg &lt;code&gt;$PATH&lt;/code&gt;, you just
write a &lt;code&gt;&amp;lt;package&amp;gt;/.zsh/&amp;lt;package&amp;gt;.env&lt;/code&gt; and reinstall the package via &lt;code&gt;stow&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This dynamic sourcing step is what makes F-dotfiles packages installs so seamless.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;Any question or insights to share regarding zsh setup ? Please leave a &lt;a href=&quot;https://github.com/Kraymer/kraymer.github.com/issues/11&quot;&gt;comment&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>RSS subscribe badge for Github projects</title>
   <link href="http://kray.me/2017/06/rss-badge-github/"/>
   <updated>2017-06-13T00:00:00+00:00</updated>
   <id>http://kray.me/2017/06/rss-badge-github</id>
   <content type="html">&lt;p&gt;One not-so-known feature of github is its atom feeds to track projects releases deliveries.&lt;br /&gt;
You can subscribe to it at :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://github.com/&amp;lt;user&amp;gt;/&amp;lt;project&amp;gt;/releases.atom&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I like that so much that I now add a &lt;img src=&quot;/public/img/posts/rss-badge.svg&quot; alt=&quot;releases badge&quot; /&gt;
badge to all my projects to make that more visible.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>&lt;i&gt;ezkill&lt;/i&gt;, selective process killing made easy</title>
   <link href="http://kray.me/2017/03/ezkill-kill-process/"/>
   <updated>2017-03-29T00:00:00+00:00</updated>
   <id>http://kray.me/2017/03/ezkill-kill-process</id>
   <content type="html">&lt;p&gt;&lt;code&gt;killall&lt;/code&gt; and &lt;code&gt;pkill -f&lt;/code&gt; are the two most popular tools to send SIGTERM to all
processes running a specified command.
With &lt;a href=&quot;https://github.com/Kraymer/ezkill&quot;&gt;&lt;strong&gt;&lt;code&gt;ezkill&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; I want to provide more
flexibility in the choice of processes to terminate while honoring the terse
efficiency of aforementioned commands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;ezkill&lt;/code&gt;&lt;/strong&gt; list processes matching input pattern, &lt;code&gt;ps&lt;/code&gt; style,
and add a letter prefix before each line.
This single letter plays the role of pid, you designate which processes to kill
by entering their letters at the prompt.&lt;/p&gt;

&lt;script type=&quot;text/javascript&quot; src=&quot;https://asciinema.org/a/5dxi20xzerjxhw2fn1tdhqi47.js&quot; id=&quot;asciicast-5dxi20xzerjxhw2fn1tdhqi47&quot; async=&quot;&quot;&gt;&lt;/script&gt;

&lt;p&gt;So that’s the trade-off: only the 26 first matching processes are displayed,
only one keystroke per process to kill is required.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Downloading magnet links as .torrent files</title>
   <link href="http://kray.me/2013/07/downloading-magnet-links-torrent-files/"/>
   <updated>2013-07-15T00:00:00+00:00</updated>
   <id>http://kray.me/2013/07/downloading-magnet-links-torrent-files</id>
   <content type="html">&lt;p&gt;Since magnets have been introduced in early 2012, &lt;strong&gt;I needed a way to convert a magnet URI to torrent&lt;/strong&gt; and found &lt;a href=&quot;https://forum.utorrent.com/viewtopic.php?id=115820&quot;&gt;this tutorial&lt;/a&gt;. It describes an elegant solution relying solely on a browser bookmark, that gets you a torrent file named after the hash of its content.&lt;/p&gt;

&lt;p&gt;But having a bunch of torrents files with hexadecimal hashnames sitting in a folder isn’t super user friendly : would it be hard to have an evocative name for each file ?
As a matter of fact, no … say hi to &lt;a href=&quot;https://github.com/KraYmer/torrefy&quot;&gt;&lt;strong&gt;torrefy&lt;/strong&gt;&lt;/a&gt;, the python script that sorts out torrent hash keys.&lt;/p&gt;

&lt;p&gt;```plaintext
    $ torrefy.py -v 815F79F2E8B25B3484019887DA40113546CB2935.torrent &lt;br /&gt;
    Renaming 815F79F2E8B25B3484019887DA40113546CB2935.torrent to &lt;br /&gt;
    Scandal.US.S02E18.HDTV.x264-LOL.mp4.torrent
``&lt;/p&gt;

&lt;p&gt;As usual, I recommend to create an &lt;a href=&quot;http://www.noodlesoft.com/hazel.php&quot;&gt;Hazel&lt;/a&gt; rule that takes care of unhashifying the name of any freshly downloaded torrent. Enjoy!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/public/img/posts/hazel-torrefy.png&quot; alt=&quot;Triggering torrefy.py via an Hazel action&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Todo playlists</title>
   <link href="http://kray.me/2013/05/itunes-todo-smart-playlists/"/>
   <updated>2013-05-09T00:00:00+00:00</updated>
   <id>http://kray.me/2013/05/itunes-todo-smart-playlists</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/public/img/posts/management_playlists.jpg&quot; alt=&quot;iTunes screenshot with playlists in sidebar&quot; /&gt;&lt;/p&gt;

&lt;p&gt;As soon as your collection grows much, smart playlists can prove useful to classify the amount of maintenance work that need to be done.&lt;br /&gt;
I use them as auto-generated todo lists for my music: a live listing of the tracks that need to be knocked into line, to make the library aim towards complete sanity :)&lt;br /&gt;
Please find below the six playlists I use and their corresponding correcting actions.&lt;/p&gt;

&lt;h3 id=&quot;unsynced-ratings-folder&quot;&gt;&lt;em&gt;Unsynced ratings&lt;/em&gt; folder&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What?&lt;/strong&gt; Songs which have ratings value not backed up by &lt;em&gt;Grouping&lt;/em&gt; tag.
Five playlists, one for each ratings value.&lt;br /&gt;
&lt;em&gt;Level one&lt;/em&gt; playlist defined as &lt;code&gt;Rating&lt;/code&gt; &lt;code&gt;is&lt;/code&gt; &lt;code&gt;★☆☆☆☆&lt;/code&gt; AND &lt;code&gt;Grouping&lt;/code&gt; &lt;code&gt;is not&lt;/code&gt; &lt;code&gt;1*&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; I only trust &lt;a href=&quot;/2011/03/resilient-id3-embedded-ratings/&quot;&gt;resilient ratings&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Action?&lt;/strong&gt; When I rate music on my phone or directly on iTunes, the playlist fills up. Regularly, I purge the folder by selecting all tracks of a group and editing the &lt;em&gt;Grouping&lt;/em&gt; tag.&lt;/p&gt;

&lt;h3 id=&quot;to-ditch&quot;&gt;&lt;em&gt;To ditch&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What?&lt;/strong&gt; Songs which album rating is less than 2 stars.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; Remove the weakest albums from my library.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Action?&lt;/strong&gt; The decision to ditch the album depends on the fact that all the tracks have been rated or not (setting a filter that would consider only completely rated albums cannot be done).&lt;br /&gt;
In any case, the playlist offers good candidates to pick for a &lt;em&gt;last chance playback&lt;/em&gt; when you’re in a mood to lighten your library footprint.&lt;/p&gt;

&lt;h3 id=&quot;to-upgrade&quot;&gt;&lt;em&gt;To upgrade&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What?&lt;/strong&gt; Quality stuff that would deserve to be reimported at higher bitrate.&lt;br /&gt;
Playlist defined as &lt;code&gt;Album Rating&lt;/code&gt; &lt;code&gt;is greater than&lt;/code&gt; &lt;code&gt;★★★☆☆&lt;/code&gt; AND &lt;code&gt;Bit Rate&lt;/code&gt; &lt;code&gt;is less than&lt;/code&gt; &lt;code&gt;160&lt;/code&gt; kbps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; Because reimporting music is time/money consuming, it makes sense to start by promoting the tunes that I like the most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How?&lt;/strong&gt; Once an album to upgrade is spotted, download it at desired bitrate
and use &lt;a href=&quot;https://pypi.python.org/pypi/replica&quot;&gt;replica&lt;/a&gt; to surreptitiously replace album folder by new one without iTunes even noticing.&lt;/p&gt;

&lt;h3 id=&quot;to-rate&quot;&gt;&lt;em&gt;To rate&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What?&lt;/strong&gt; All unrated songs.&lt;br /&gt;
Playlist defined as &lt;code&gt;Rating&lt;/code&gt; &lt;code&gt;is&lt;/code&gt; &lt;code&gt;&amp;lt;no stars&amp;gt;&lt;/code&gt; AND &lt;code&gt;Grouping&lt;/code&gt; &lt;code&gt;does not contain&lt;/code&gt; &lt;code&gt;*&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; Mostly used as a songs tank for the more-focused &lt;em&gt;Phone&lt;/em&gt; playlists (see below).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Action?&lt;/strong&gt;  Make sure that &lt;em&gt;Live updating&lt;/em&gt; playlist setting is unchecked so playback get not constantly interrupted when you’re in a rating session while listening through the playlist.&lt;/p&gt;

&lt;h3 id=&quot;phone---auto&quot;&gt;&lt;em&gt;Phone - Auto&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What?&lt;/strong&gt; Recently added songs waiting to be rated.&lt;br /&gt;
Playlist defined as &lt;code&gt;Date added&lt;/code&gt; &lt;code&gt;in the last&lt;/code&gt; &lt;code&gt;3&lt;/code&gt; &lt;code&gt;months&lt;/code&gt; AND &lt;code&gt;Playlist&lt;/code&gt; &lt;code&gt;is&lt;/code&gt; &lt;code&gt;To rate&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; Since few years, I add only correctly tagged songs into iTunes. 90% of the job is done upstream by &lt;a href=&quot;http://beets.radbox.org/&quot;&gt;beets&lt;/a&gt; but rating is a manual process. Once imported in iTunes, the newcomers are picked up by the system and included in this playlist until they are rated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Action?&lt;/strong&gt; Sync this playlist with your phone (I use &lt;a href=&quot;http://www.jrtstudio.com/iSyncr-iTunes-for-Android&quot;&gt;iSyncr&lt;/a&gt; on my android phone).&lt;br /&gt;
Pick the period duration so that it makes a chunk of tracks sized to your whole week transits, ie you should been able to &lt;em&gt;clear up&lt;/em&gt; the playlist in a week.
Synchronize the playlist every morning and see its size melt like snow in the sun as the number of unrated songs decrease!&lt;br /&gt;
Increase the &lt;em&gt;Date added&lt;/em&gt; span incrementally as your library get cleaner.&lt;/p&gt;

&lt;h3 id=&quot;phone---manual&quot;&gt;&lt;em&gt;Phone - Manual&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What?&lt;/strong&gt; No smart playlist here but a cherry picked selection of songs to rate (taken from &lt;em&gt;To rate&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; I bit off more than I could chew back in the days and I’m now left with a large amount of songs to rate.&lt;br /&gt;
I prefer selecting a handful of songs to listen for a transit journey, rather than having the massive &lt;em&gt;To rate&lt;/em&gt; playlist synced on my phone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Action?&lt;/strong&gt; Same as &lt;em&gt;Phone - Auto&lt;/em&gt; but rated songs must be removed from playlist manually!&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>First observations on iTunes 11</title>
   <link href="http://kray.me/2012/12/observations-itunes11-remote/"/>
   <updated>2012-12-03T00:00:00+00:00</updated>
   <id>http://kray.me/2012/12/observations-itunes11-remote</id>
   <content type="html">&lt;p&gt;My quick feedback on iTunes 11 after having played few hours with it.
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&quot;innovative-expanded-view&quot;&gt;Innovative expanded view&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/public/img/posts/itunes11-expanded-view.jpg&quot; alt=&quot;&quot; /&gt;
&lt;em&gt;Example of expanded view background color selection&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Apple boldly refreshes the immemorial &lt;em&gt;square album cover+tracklist column&lt;/em&gt; layout by extracting main color of the cover art and overprinting tracklisting onto it.&lt;/p&gt;

&lt;p&gt;I intentionally use the multi-colored &lt;em&gt;Abraxas&lt;/em&gt; Santana album cover art to illustrate this feature. Note how, despite the highly contrasted cover art, the result is still appealing : the algorithm pick the dominant color and meld the cover into it by blurring its edges.&lt;br /&gt;
The two columns layout and its ad hoc background ambient color provides a &lt;strong&gt;retro feel&lt;/strong&gt; to the whole thing that reminds me of classic &lt;strong&gt;vinyl packages&lt;/strong&gt;. User ratings are incorporated to enhance the barebones tracklisting and integrate nicely in the clean view.&lt;/p&gt;

&lt;p&gt;Needless to say, fonts color change dynamically depending on picked background color, to favour readability. When possible, the rendering algorithm will select secondary colors from the cover art to print album and tracks infos, adding to the &lt;strong&gt;tuned colors design&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;the-up-next-takeover&quot;&gt;The &lt;em&gt;Up Next&lt;/em&gt; takeover&lt;/h3&gt;

&lt;p&gt;As a big fan of the &lt;a href=&quot;/blog/itunes-dj-mode/&quot;&gt;iTunes DJ/Remote app combo&lt;/a&gt;, I was worried when discovering that the built-in iTunes DJ playlist disappeared. No drama though, as it has been integrated in the player controls and rename to &lt;em&gt;Up next songs&lt;/em&gt;.&lt;br /&gt;
I like that move. Although it was located in the &lt;em&gt;Playlists&lt;/em&gt; section on previous versions, iTunes DJ was in fact a special mode built on top of them. Sitted above them, with its unique icon to differentiate it from real playlists.&lt;br /&gt;
No more inconsistency. iTunes is now in perpetual DJ mode, and fiddling with next songs is just one click away, great!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/public/img/posts/itunes11.jpg&quot; alt=&quot;&quot; /&gt;
&lt;em&gt;Up next songs controls in iTunes and Remote&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Unsurprisingly, upgrading to iTunes 11 breaks iTunes DJ mode on Remote too. So, &lt;strong&gt;upgrading to Remote v3.0 is mandatory&lt;/strong&gt; and comes with its batch of changes :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Clicking the list button &amp;lt;img src=”/r/assets/images/listbutton.png” vertical-align:”text-bottom”&amp;gt; now brings up the &lt;em&gt;Up Next&lt;/em&gt; view.&lt;br /&gt;
 Each track slot occupy less vertical space than in the defunct iTunes DJ view. Album names are now displayed under track titles and contribute to the &lt;strong&gt;rich and compact design&lt;/strong&gt;.&lt;/li&gt;
  &lt;li&gt;The album view triggered via same list button on previous versions is no more. &lt;strong&gt;Gone with it is the possibility to rate songs&lt;/strong&gt;.&lt;/li&gt;
  &lt;li&gt;The &lt;strong&gt;selected view is now&lt;/strong&gt; a &lt;strong&gt;persistent&lt;/strong&gt; setting. Play a track and switch to &lt;em&gt;Up Next&lt;/em&gt; view, go to your library and tap another track : &lt;em&gt;Up Next&lt;/em&gt; view is reloaded. That should encourage users making it their default view as it’s more useful than the cover view.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;a-refreshing-update&quot;&gt;A refreshing update&lt;/h3&gt;

&lt;p&gt;With iTunes 11, Apple finally reversed the bloated trend that crippled iTunes since years. 
Unlike past self-acclaimed features (i look at you, &lt;a href=&quot;http://en.wikipedia.org/wiki/ITunes_Ping&quot;&gt;Ping&lt;/a&gt;), there is no &lt;em&gt;revolutionary&lt;/em&gt; change
in this release but a global effort to improve the user experience :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The album expanded view introduces a classy representation mode without sacrifying usability, which is no simple matter (yes, i look at you, &lt;a href=&quot;http://en.wikipedia.org/wiki/Cover_Flow&quot;&gt;Coverflow&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;With iTunes DJ removed, the playlists concept is back to the normal&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Up Next&lt;/em&gt; is an elegant way to control tracks selection on Desktop or iOS device&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Editing things just became easier&lt;/strong&gt;.&lt;br /&gt;
Right click an artist name or genre to edit all corresponding tracks. An &lt;em&gt;Edit&lt;/em&gt; button has been added for smart playlists. Classic playlists have their &lt;em&gt;Add to&lt;/em&gt; button that gives access to a two-panes view to easily drag&amp;amp;drop tracks.&lt;/li&gt;
  &lt;li&gt;Since the left sidebar is removed, &lt;strong&gt;all screen space is dedicated to selected library&lt;/strong&gt;. Maybe the most important step towards &lt;em&gt;unbloatedness&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These design decisions aiming for simplicity imply doing tuff choices, leaving features aside. The one removal that I regret is the &lt;em&gt;Play higher rated songs more often&lt;/em&gt; iTunes DJ setting that worked quite right for me. Let’s hope it comes back soon in one way (via smart playlists?) or another.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Pruning beets genre canonicalization tree</title>
   <link href="http://kray.me/2012/10/customizing-beet-genres-canonicalization-tree/"/>
   <updated>2012-10-13T00:00:00+00:00</updated>
   <id>http://kray.me/2012/10/customizing-beet-genres-canonicalization-tree</id>
   <content type="html">&lt;p&gt;Unlike most tags, ‘genre’ accept some latitude and is open to interpretation. In others words: a music management nightmare.
The &lt;a href=&quot;https://gist.github.com/1241307&quot;&gt;hundreds variations of genres&lt;/a&gt; in the nature are too numerous to be exploited for classification purposes. You gotta restrict yourself!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Figure a limited set of genres that fits your music tastes&lt;/strong&gt;. Focus on genres that don’t overlap and partition your library into sets of comparable sizes.&lt;/p&gt;

&lt;p&gt;Done right, genres are a great asset that enable to browse through files faster and to create better playlists based on genre filtering.&lt;/p&gt;

&lt;h3 id=&quot;genres-entrance-policy&quot;&gt;Genres entrance policy&lt;/h3&gt;

&lt;p&gt;Once you have handpicked your genres list, the easier way to keep it intact consist in ensuring that new additions to your library don’t introduce alien genres.&lt;/p&gt;

&lt;p&gt;I use &lt;a href=&quot;http://beets.radbox.org/&quot;&gt;beets&lt;/a&gt; to inject newcomers in my library and bring them into line.&lt;/p&gt;

&lt;p&gt;You will have to activate the &lt;code&gt;lastgenre&lt;/code&gt; plugin : it uses &lt;a href=&quot;http://www.lastfm.com&quot;&gt;lastfm&lt;/a&gt; crowdsourced data to fetch the genre information. I encourage you to read the &lt;a href=&quot;http://beets.readthedocs.org/en/latest/plugins/lastgenre.html&quot;&gt;plugin documentation page&lt;/a&gt; first. The plugin works great by default, but you must tweak its settings if you want to enforce a strict set of genres.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;beetsplug/lastgenre/genres.txt&lt;/code&gt; is a whitelist of all accepted genres. Replace the default one by
your custom list (all genres lowercase, one genre per line)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;beetsplug/lastgenre/genres-tree.yaml&lt;/code&gt; is the genres canonicalization tree : it stores the genres hierarchically relying on outline indentation for structure. It allows to find multiples candidates from a given genre thus improving the chance to have one present in user whitelist.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/public/img/posts/lastgenre_c14n.png&quot; alt=&quot;lastgenre plugin canonicalization steps&quot; /&gt;
&lt;em&gt;An example of lastgenre plugin canonicalization: resolving ‘crunk’ to ‘hip-hop’ : lastfm tag tree branch is parsed backward until a tag present in user whitelist is found.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Edit the yaml file to introduce your genres at strategic places : placing them near the tree root help you maximize the number of suggested genres that are funneled to your accepted tags.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/public/img/posts/c14nedit.jpg&quot; alt=&quot;editing canonicalization tree&quot; /&gt;
&lt;em&gt;Diff view of genres-tree.yaml showing changes done to redirect genres to ‘hip-hop’.&lt;/em&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Introducing replica, the id3 cloner CLI</title>
   <link href="http://kray.me/2012/04/introducing-replica-the-id3-cloner-cli/"/>
   <updated>2012-04-30T00:00:00+00:00</updated>
   <id>http://kray.me/2012/04/introducing-replica-the-id3-cloner-cli</id>
   <content type="html">&lt;p&gt;An mp3 file is made up of a metadata header prepended to the audio data blocks. While the id3 header can be edited to enrich the file description, the audio data is a result of a lossy compression and cannot be enhanced &lt;em&gt;a posteriori&lt;/em&gt;.&lt;br /&gt;
So, to upgrade the audio quality of a mp3 file, you have to acquire a new &amp;ndash; better &amp;ndash; copy of it.&lt;/p&gt;

&lt;p&gt;How do you cope then with the migration of the id3 &lt;em&gt;intel&lt;/em&gt; (such as &lt;a href=&quot;/blog/resilient-id3-embedded-ratings&quot;&gt;ratings&lt;/a&gt; information) contained in the original files?
&lt;a href=&quot;http://www.softpointer.com/tr.htm&quot;&gt;Tag&amp;amp;Rename&lt;/a&gt; for mac is yet to come (&lt;em&gt;sigh&lt;/em&gt;) and this specific problem looked simple enough that I decided to code a tool to solve it.&lt;/p&gt;

&lt;p&gt;Replica is a python script that enables you to copy id3 metadata between files (and more). &lt;br /&gt;
Go to the &lt;strong&gt;&lt;a href=&quot;https://github.com/KraYmer/replica&quot;&gt;project homepage&lt;/a&gt;&lt;/strong&gt; for more infos, or just start using it by typing &lt;code&gt;pip install replica&lt;/code&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Grand Mix recipe</title>
   <link href="http://kray.me/2011/09/daily-routine-smart-playlist-filterings/"/>
   <updated>2011-09-10T00:00:00+00:00</updated>
   <id>http://kray.me/2011/09/daily-routine-smart-playlist-filterings</id>
   <content type="html">&lt;p&gt;iTunes DJ is like my personal radio. I use a unique smart playlist as source, delivering a first-class digest of my library.
This way I can achieve a selection of &lt;strong&gt;homogeneous quality&lt;/strong&gt; that spans a &lt;strong&gt;wide spectrum of genres&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you&amp;rsquo;re interested to build your own &lt;em&gt;Grand Mix&lt;/em&gt; playlist, consider to combine the following filterings to refine your library content :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Focus on the tunes that you like&lt;/strong&gt;&lt;br /&gt;
It&amp;rsquo;s hard to conceive a routine-playlist that doesn&amp;rsquo;t filter ratings in some way. Be strict but not too much, or the resulting pool of songs will be too restricted.&lt;br /&gt;
Having a ratings metric defined, this step is a no-brainer : &lt;a href=&quot;/blog/howto-define-ratings-system&quot;&gt;on my scale&lt;/a&gt; it sets the bar at &lt;em&gt;3★&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bias to play the best songs&lt;/strong&gt;&lt;br /&gt;
Some players offer to boost occurrences of highly rated tunes. It&amp;rsquo;s a nice way to rise the quality while keeping a large pool of songs to dip into.&lt;br /&gt;
Have you ever wondered what does result from activating the &lt;em&gt;Play higher rated songs more often&lt;/em&gt; iTunes DJ setting? I did the test (see graph below).&lt;br /&gt;
I like how not only &lt;em&gt;5★&lt;/em&gt; but &lt;em&gt;4★&lt;/em&gt; songs distribution too are positively affected by this setting.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;img title=&quot;Influence of &apos;Play higher rated songs more often&apos;  check box on ratings distribution&quot; src=&quot;/public/img/posts/higherRated.png&quot; alt=&quot;Influence of &apos;Play higher rated songs more often&apos; check box on ratings distribution&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Low bitrate ditching&lt;/strong&gt;&lt;br /&gt;
Do you play music through good hi-fi speakers? Then, it may help to ignore files not satisfying a minimum quality standard by keeping only those whose &lt;em&gt;Bit Rate&lt;/em&gt; is greater than a given threshold.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Genre rebalancing&lt;/strong&gt;&lt;br /&gt;
I used to be a reggae monomaniac during my boyhood, my tastes have considerably spread since but I have accumulated a large number of reggae releases from these years, making this genre over-represented in my library.&lt;br /&gt;
The solution to deal with an unbalanced library, dominated by few genres when you strive for diversity, consists to apply &lt;strong&gt;ratings filterings by genre&lt;/strong&gt;.&lt;br /&gt;
In my case, ratings threshold for reggae songs is &lt;em&gt;4★&lt;/em&gt; whereas songs rated as low as &lt;em&gt;3★&lt;/em&gt; are accepted for others genres.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Genre exclusion&lt;/strong&gt;  &lt;br /&gt;
Sometimes the perceived quality depend highly on the listening context: classic example is &lt;em&gt;Christmas songs&lt;/em&gt;, always welcomed for snowy days, not that much the rest of the year. In the same vein, I would play clubbing tunes during a party but otherwise this genre tends to quickly bore me. &lt;br /&gt;
These context-specific songs are outside of the scope of a daily routine playlist, so I prefer to simply filter out their corresponding genres.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Take a seat and enjoy the musical ride</title>
   <link href="http://kray.me/2011/06/itunes-dj-mode/"/>
   <updated>2011-06-20T00:00:00+00:00</updated>
   <id>http://kray.me/2011/06/itunes-dj-mode</id>
   <content type="html">&lt;p&gt;Forget for a moment the narrowed technical concepts usually dealt with on this blog, to focus on the most fundamental interaction one has with their music on a daily basis &amp;hellip; &lt;strong&gt;playing&lt;/strong&gt;. How can this be impacted by software?&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ll dissect my personal case and show you how I adjust my use of iTunes according to the role I want to play in the listening session.&lt;/p&gt;

&lt;h3&gt;Sunday driver&lt;/h3&gt;

&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;Festus and Bikey Dread of Sir Coxsone soundsystem&quot; src=&quot;/public/img/posts/coxsone-soundsystem.jpg&quot; alt=&quot;Festus and Bikey Dread of Sir Coxsone soundsystem&quot; /&gt;&lt;br /&gt;
&lt;em&gt;Photo credits: Bernard Sohiez @ &lt;a href=&quot;http://www.urbanimage.tv/reggae/sound+systems/reggae+selectors/rx026_jbs_y/&quot;&gt;UrbanImage&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Before the mp3 era, media storage used to be pretty &lt;a href=&quot;http://mozy.com/blog/wp-content/uploads/2009/08/physical-storage-vs-digital-storage.png&quot;&gt;limited&lt;/a&gt;. The need to step in every time a disc finished, forced user to adopt a selector mindset, constantly thinking ahead of the next tracks to play.&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s possible to mimic this old school selector behaviour in iTunes : browsing among the shoals of metadata, using a savvy combination of filters/requests, in order to extract from the mass the next song that will fit your playlist. But from a user experience standpoint, the cold interaction one has with a screen/keyboard can&amp;rsquo;t compete with the vintage charm of vinyl juggling on a turntable.&lt;/p&gt;

&lt;p&gt;As a result, I rarely use iTunes to manually explore my library (unless I really feel the urge to listen to specific songs). I prefer to lose control in favor of a smoother user experience.&lt;/p&gt;

&lt;h3&gt;Passive passenger&lt;/h3&gt;

&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;Kuka Juke Bot&quot; src=&quot;/public/img/posts/kuka_juke_bot.jpg&quot; alt=&quot;Kuka Juke Bot&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cutting loose from computer interactions is how I roll now&lt;/strong&gt; (hosting iTunes on a headless Mac Mini, slashed of mouse and keyboard outgrowths, &lt;em&gt;does&lt;/em&gt; help).&lt;br /&gt;
If you take this path, avoid a brutal break-up where your computer would be suddenly in charge of the mp3 kids. Indeed, the basic setup consisting of activating random mode, clicking play and praying for the best is rarely satisfactory. &lt;strong&gt;Selection based on pure randomness doesn&amp;rsquo;t cut it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Some thorough work is needed to level up your computer into a decent stand-alone selector.&lt;br /&gt;
Because he is so clueless, you need to spoon-feed him with the best musical food you have, so he can chunder it later. Use &lt;strong&gt;smart playlists&lt;/strong&gt; for this purpose. These dynamic playlists work by selecting songs that match a set of given criteria or thresholds. As usual, the solution means &lt;strong&gt;leveraging embedded metadata&lt;/strong&gt;: no room for badly tagged files!&lt;br /&gt;
Define the smart playlist that will be the &lt;strong&gt;&lt;a href=&quot;/blog/daily-routine-smart-playlist-filterings&quot;&gt;cornerstone of your daily music routine&lt;/a&gt;&lt;/strong&gt;; only the songs matching its definition will be authorized to be played by your computer.
Once your custom-made smart playlist is done, promote it as the source of your player&amp;rsquo;s built-in DJ mode (whether it&amp;rsquo;s named &lt;a href=&quot;http://www.apple.com/itunes/features/&quot;&gt;iTunesDJ&lt;/a&gt;, &lt;a href=&quot;http://seriouslytrivial.com/2009/09/06/itunes-genius-like-playlist-with-mediamonkey/&quot;&gt;Auto-DJ&lt;/a&gt; or &lt;a href=&quot;http://amarok.kde.org/en/Insider/Issue_15#apg&quot;&gt;Automated Playlist Generator&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;You gotta have well thought out criteria that encompasses a large amount of music files to see the main merit of smart playlists: &lt;strong&gt;resourceful selection that spans the entire spectrum of your tastes&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;Backseat selector&lt;/h3&gt;

&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;Festus and Bikey Dread of Sir Coxsone soundsystem&quot; src=&quot;/public/img/posts/remote_ui.png&quot; alt=&quot;Remote iphone application&quot; /&gt;&lt;/p&gt;

&lt;p&gt;My music totally controlled by a machine, with no consideration for my current mood or specific requests whatsoever. It sounds a bit too rigid, let&amp;rsquo;s see how to inject a dash of human judgment into the mix.&lt;/p&gt;

&lt;p&gt;Keep in mind that simply accessing iTunes on my Mac Mini is not a satisfying option for me &amp;mdash; too much friction involved. Well, without further ado, let me introduce you to &lt;a href=&quot;http://www.quora.com/What-life-lessons-are-unintuitive-or-go-against-common-sense-or-wisdom&quot;&gt;Remote&lt;/a&gt;, the main reason why I bear with iTunes despite its shortcomings :&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Remote is a free, fun, and easy-to-use app that turns your     iPhone, iPad, or iPod touch into a remote control. So wherever you are in your house, you can control your computer’s iTunes library and your Apple TV with a tap or flick of a finger.&lt;/p&gt;
&lt;small&gt;Apple.com&lt;/small&gt;&lt;/blockquote&gt;

&lt;p&gt;(not much to add; using Remote just &lt;em&gt;feels&lt;/em&gt; right, hardly describable. It&amp;rsquo;s just something you have to experience by yourself).&lt;/p&gt;

&lt;p&gt;When you think about it, handling music selection via a mobile application is a natural fit. Compared to previous medias, modern digital storage enables music to be  :&lt;br /&gt;
  &amp;ndash; &lt;strong&gt;mutable&lt;/strong&gt;. Edit mp3 files to attach descriptive data (text, images) that can be &lt;strong&gt;displayed on a screen&lt;/strong&gt; to provide context when the song is played.&lt;br /&gt;
  &amp;ndash; &lt;strong&gt;dematerialized&lt;/strong&gt;. Access your music from anywhere using &lt;strong&gt;Internet or local Wi-Fi&lt;/strong&gt;.&lt;br /&gt;
Remote shines by exploiting these two characteristics and delivering its features via a clean user interface that provides an unsurpassed user experience.&lt;/p&gt;

&lt;h3&gt;What&amp;rsquo;s next?&lt;/h3&gt;

&lt;p&gt;My conclusions are two-fold :&lt;br /&gt;
  &amp;ndash; software can improve the playing experience by &lt;strong&gt;reducing the burden of selecting songs&lt;/strong&gt; thanks to smart playlists.  &lt;br /&gt;
  &amp;ndash; using desktop software involves too much frictions and context-switches. Being able to control iTunes from my sofa using a mobile application has redefined my user experience for the better.&lt;/p&gt;

&lt;p&gt;Lines are moving quickly after &lt;a href=&quot;http://www.ghacks.net/2011/06/07/apple-icloud-google-music-amazon-cloud-drive-its-getting-crowded/&quot;&gt;announcements&lt;/a&gt; of Amazon, Google and Apple to make personal music collections available from the Internet.&lt;br /&gt;
Coming months are promising, maybe soon I will be streaming my tunes from the Cloud, screaming out &lt;em&gt;&amp;lsquo;MAKE IT RAIN!&amp;rsquo;&lt;/em&gt; with pleasure &amp;hellip; I doubt it though. In any case, I will keep you informed.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>This is not Nam&apos;. This is tagging. There are rules.</title>
   <link href="http://kray.me/2011/04/walters-guide-to-rule-based-music-management/"/>
   <updated>2011-04-06T00:00:00+00:00</updated>
   <id>http://kray.me/2011/04/walters-guide-to-rule-based-music-management</id>
   <content type="html">&lt;p&gt;&lt;img title=&quot;&apos;Has the whole world gone crazy? Am I the only one around here who gives a shit about the rules?&apos;&quot; src=&quot;/public/img/posts/big_lebowski_smokey.jpg&quot; alt=&quot;&apos;Has the whole world gone crazy? Am I the only one around here who gives a shit about the rules?&apos;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This post is about &lt;strong&gt;Rule-based music library management&lt;/strong&gt;, term coined by Dan Gravell,  who&amp;rsquo;ve put it at the heart of his automatic tagging software &lt;em&gt;&lt;a href=&quot;http://www.blisshq.com/&quot;&gt;bliss&lt;/a&gt;&lt;/em&gt;. I&amp;rsquo;ll adress the topic of bliss features in a later post, to focus today on the concept of rules and how I use them in my tagging routine.&lt;/p&gt;

&lt;h3&gt;Rules really tie your library together&lt;/h3&gt;

&lt;p&gt;Digital music is like plasticine : bulk raw data crying out for &lt;strong&gt;structure&lt;/strong&gt;. &lt;br /&gt;
Just stacking it up before playing with it will invariably result in an undescriptable mess with no hope to find your way through.&lt;/p&gt;

&lt;p&gt;Stand back, have a &lt;strong&gt;global view&lt;/strong&gt; of the collection you&amp;rsquo;re building. Is it tuneful or conflicted ?&lt;/p&gt;

&lt;p&gt;Bring harmony to your library : avoid genres fragmentation, names mispelling, get rid of inconsistencies (&lt;em&gt;&amp;lsquo;feat&amp;rsquo;&lt;/em&gt; vs &lt;em&gt;&amp;lsquo;ft&amp;rsquo;&lt;/em&gt; anyone?)&amp;hellip; &lt;strong&gt;Shape it&lt;/strong&gt;.&lt;br /&gt;
Entering well-thought metadata information contributes heavily to this shaping as it enables efficient browsing based on tracks descriptive attributes (genre, release year, &lt;em&gt;etc&lt;/em&gt;). File-naming conventions and storage of albums related files (as opposed to embedded album metadata) are other aspects to consider when sculpting your library.&lt;/p&gt;

&lt;p&gt;In a rule-oriented library management system, you strive for &lt;strong&gt;musical data consistency&lt;/strong&gt;, by applying the same set of rules to all the elements that compose your library.&lt;/p&gt;

&lt;h3&gt;Those are my f*cking rules !&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Must-have tags&lt;/strong&gt;&lt;br /&gt;
Following tags cannot be left blank : &lt;em&gt;Artist&lt;/em&gt;, &lt;em&gt;Album Artist&lt;/em&gt;,&lt;em&gt;Title&lt;/em&gt;, &lt;em&gt;Album&lt;/em&gt;, &lt;em&gt;Genre&lt;/em&gt;, &lt;em&gt;Year&lt;/em&gt;, &lt;em&gt;Replaygain&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Various artists corner case #1&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;Album Artist&lt;/em&gt; is set to &lt;em&gt;&amp;lsquo;Various Artists&amp;rsquo;&lt;/em&gt; for compilations, unless something else makes sense (eg DJ or producer name).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No genres galore&lt;/strong&gt;&lt;br /&gt;
Minimum number of tracks required for creating a new  &lt;em&gt;Genre&lt;/em&gt; category is 50.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cover art for desktop&lt;/strong&gt; &lt;br /&gt;
A high resolution of front album cover is saved in album folder under the name &lt;em&gt;cover_hd.jpg&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cover art for mobile&lt;/strong&gt;  &lt;br /&gt;
A lower resolution (~400x400, ~40kb) of &lt;em&gt;cover_hd.jpg&lt;/em&gt; is embedded into tags.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;File-naming pattern&lt;/strong&gt;&lt;br /&gt;
Default naming pattern is &lt;em&gt;Artist-Album-Year/track_number-title.mp3&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Various artists corner case #2&lt;/strong&gt;&lt;br /&gt;
Artists names must figure in tracks paths for compilations : &lt;em&gt;VA-Album-Year/track_number-artist-title.mp3&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ratings&lt;/strong&gt; &lt;br /&gt;
Ratings are stored in &lt;em&gt;Grouping&lt;/em&gt; tag using a 5 star scale (see &lt;a href=&quot;/blog/resilient-id3-embedded-ratings&quot;&gt;Resilient ID3 embedded ratings&lt;/a&gt;).&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;I didn&amp;rsquo;t come up straight off with that list , as it&amp;rsquo;s rather the result of an incremental process spanning over years.  &lt;br /&gt;
Some rules arised belatedly and I&amp;rsquo;m still sweating today to make my oldest tracks abide by them (blasted &lt;em&gt;#8&lt;/em&gt; and its stupid stars! I knew I should have gone with the &lt;em&gt;&lt;a href=&quot;http://www.imdb.com/title/tt0118715/quotes?qt=qt0464765&quot;&gt;&amp;lsquo;Mark it zero!&amp;rsquo;&lt;/a&gt;&lt;/em&gt; approach ;).&lt;br /&gt;
Yet, most of my rules can be applied somewhat automatically by software means&amp;hellip;&lt;/p&gt;

&lt;p&gt;So stay tuned to learn what tools I use to ease the process!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Resilient ID3 embedded ratings</title>
   <link href="http://kray.me/2011/03/resilient-id3-embedded-ratings/"/>
   <updated>2011-03-13T00:00:00+00:00</updated>
   <id>http://kray.me/2011/03/resilient-id3-embedded-ratings</id>
   <content type="html">&lt;p&gt;&lt;img title=&quot;&apos;Rating&apos; column values reflected in the &apos;Grouping&apos; column as raw text&quot; src=&quot;/public/img/posts/grouping-ratings.jpg&quot; alt=&quot;&apos;Rating&apos; column values reflected in the &apos;Grouping&apos; column as raw text&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Rating songs is by far the most time-consuming task to perform when you polish an album properties. Unlike the tagging process, it can not be automated (see &lt;a href=&quot;/blog/howto-define-ratings-system&quot;&gt;A look at the stars&lt;/a&gt;) and may require a few full plays of the song to be accurate.&lt;br /&gt;
Because of that personal investment, ratings constitute one precious information that one can&amp;rsquo;t afford to lose, yet there is &lt;strong&gt;no gold standard method to store them&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;The infamous POPM tag&lt;/h3&gt;

&lt;p&gt;The classic way to store information (aka metadata) related to a mp3 file consists to embed it in its &lt;a href=&quot;http://en.wikipedia.org/wiki/ID3&quot;&gt;ID3 header&lt;/a&gt;. Cover art, lyrics and identification properties (eg artist and album names, release date, etc.) are widespread metadata and thus are editable using any average music player.&lt;/p&gt;

&lt;p&gt;It gets trickier when considering ratings.&lt;br /&gt;
On one hand, there does exist a &lt;em&gt;&lt;a href=&quot;http://www.id3.org/id3v2.3.0#head-2452ec9cf8b42c5c117b518b69e129ff67970852&quot;&gt;Popularimeter&lt;/a&gt;&lt;/em&gt; (&lt;em&gt;POPM&lt;/em&gt;) tag dedicated &lt;em&gt;&amp;ldquo;to specify how good an audio file is&amp;rdquo;&lt;/em&gt;. Yay!&lt;br /&gt;
On the other hand, &lt;em&gt;POPM&lt;/em&gt; tag has a value range spanning from 0 to 255 with no interpretation set in stone. The core of the issue is that the user interacts with a 5 star scale to rate a song whereas the software has to cope with an internal representation of 256 values. &lt;br /&gt;
As a result, every music player that supports this tag use its own heuristic to do the mapping, which makes &lt;strong&gt;ratings cross-application compatibility a nightmare&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;Make the ratings persistent&lt;/h3&gt;

&lt;p&gt;Because ratings cannot be embedded as smoothly as other metadata, I advocate an &lt;strong&gt;hybrid method&lt;/strong&gt; that couples two different ways to store the information :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use the &lt;strong&gt;integrated ratings system&lt;/strong&gt; of your media player to assign ratings. Feel free to use these ratings to customize your playback selection inside your player.&lt;br /&gt;
&lt;em&gt;Note: under the hood, some players store ratings in internal databases (eg Amarok, iTunes) whereas others write into the POPM tag.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;backup the player ratings periodically. Embedding data in the mp3 file and not being tied to the player representation is the key here.&lt;br /&gt;
Screw the &lt;em&gt;POPM&lt;/em&gt; tag. Just choose a &lt;strong&gt;common editable field&lt;/strong&gt; which had no use for you until now and dump your ratings into it, in my case I decided to go with the &lt;em&gt;Grouping&lt;/em&gt; tag.&lt;br /&gt;
Keep this field in sync with your player ratings and use it as reference for the day you&amp;rsquo;ll need to migrate your ratings to comply with another music player.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Watch the &lt;a href=&quot;http://www.youtube.com/watch?v=Qb118a6HWA8&quot;&gt;screencast&lt;/a&gt; to see this method applied to the transfer of ratings from iTunes to MediaMonkey.&lt;/p&gt;

&lt;p&gt;&lt;iframe src=&quot;http://www.youtube.com/embed/WalzAdkOf6M?wmode=transparent&quot; allowfullscreen frameborder=&quot;0&quot; height=&quot;417&quot; width=&quot;500&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Restoring files scattered on a backup drive using rsync</title>
   <link href="http://kray.me/2011/02/restoring-files-scattered-backup-drive-rsync/"/>
   <updated>2011-02-06T00:00:00+00:00</updated>
   <id>http://kray.me/2011/02/restoring-files-scattered-backup-drive-rsync</id>
   <content type="html">&lt;p&gt;I realized yesterday morning that some of the best tracks of my library had disappeared. It concerned artists of the &amp;rsquo;S-U&apos; section : the classic Shakira&amp;rsquo;s &lt;em&gt;Laundry Service&lt;/em&gt; was amputated from its masterpiece &lt;em&gt;Whenever, Wherever&lt;/em&gt;, &lt;em&gt;Master Blaster Jammin&lt;/em&gt; was missing from &lt;em&gt;Stevie’s Greatest Hits&lt;/em&gt;, and so on.&lt;/p&gt;

&lt;p&gt;The deletion must have occurred months ago due to an unfortunate keystrokes sequence in iTunes. Fortunately, I had a 1 year old rsync backup of my music files on a dusty external hard drive. &lt;br /&gt;
In such a situation, what is the shortest path to get the precious gems back to their original location ?&lt;/p&gt;

&lt;h3&gt;Have a glimpse at the damages&lt;/h3&gt;

&lt;p&gt;In &lt;em&gt;Terminal.app&lt;/em&gt;, execute &lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Rsync&quot;&gt;rsync&lt;/a&gt;&lt;/em&gt; to list the files that have been wiped out of your drive since last backup. Something like :&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;rsync -vnru --ignore-existing ~/Backup/\[STU\]/ ~/Music/\[STU\]/&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Options description:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;-v, &amp;mdash;verbose increase verbosity&lt;br /&gt;
-n, &amp;mdash;dry-run show what would have been transferred &lt;br /&gt;
-r, &amp;mdash;recursive recurse into directories&lt;br /&gt;
-u, &amp;mdash;update skip files that are newer on the receiver&lt;br /&gt;
&amp;mdash;ignore-existing skip updating files that exist on receiver&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Note that it&amp;rsquo;s the &lt;em&gt;-n&lt;/em&gt; option which is responsible for only showing files and not initiating transfer (&lt;em&gt;dry run&lt;/em&gt; aka simulation mode).&lt;/p&gt;

&lt;h3&gt;Separate the good from the bad&lt;/h3&gt;

&lt;p&gt;A problem with this recursive recovery method is that you will see re-emerge lame &lt;a href=&quot;/blog/howto-define-ratings-system&quot;&gt;1-star tunes&lt;/a&gt; from the darkness, files that you deleted intentionally from your drive since the last backup.
Use the &lt;em&gt;—exclude&lt;/em&gt; option to filter these black sheeps.&lt;/p&gt;

&lt;p&gt;Refine your rsync command until it spits a file listing that suits you. Then drop the &lt;em&gt;-n&lt;/em&gt; option to leave simulation mode and actually do the transfer, &lt;em&gt;for real&lt;/em&gt; :&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;rsync -vru --ignore-existing ~/Backup/\[STU\]/ ~/Music/\[STU\]/&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h3&gt;Icing on the cake : iTunes import&lt;/h3&gt;

&lt;p&gt;For the iTunes users in the crowd, here is a trick to ease the import process of recovered tracks.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;log output of rsync command in a text file :&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;rsync -vru --ignore-existing ~/Backup/\[STU\]/ ~/Music/\[STU\]/ &amp;gt; allPaths.txt&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;filter the text content to keep only audio files paths, save the result in a playlist :&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;grep -i &amp;quot;\.mp3&amp;quot; allPaths.txt &amp;gt; audioRelPaths.m3u&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;filepaths must be made absolute so that iTunes can interpret them. Use &lt;em&gt;lam&lt;/em&gt; utility to prepend the parent directory path :&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;lam -s &amp;quot;/Users/flap/Music/\[STU\]/&amp;quot; audioRelPaths.m3u &amp;gt; audioAbsPaths.m3u&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;drag &amp;amp; drop the m3u file on the iTunes dock icon to reimport all restored tracks in your library.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;iframe src=&quot;http://www.youtube.com/embed/fdi12C4zqY4?wmode=transparent&quot; allowfullscreen frameborder=&quot;0&quot; height=&quot;417&quot; width=&quot;500&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>A look at the stars</title>
   <link href="http://kray.me/2010/12/howto-define-ratings-system/"/>
   <updated>2010-12-31T00:00:00+00:00</updated>
   <id>http://kray.me/2010/12/howto-define-ratings-system</id>
   <content type="html">&lt;p&gt;With properly tagged files, it&amp;rsquo;s easy to organize your music in playlists based on genre, date or both. But most of the time you don&amp;rsquo;t care much about these attributes and just want to listen &lt;em&gt;good&lt;/em&gt; music. Managing a &amp;lsquo;best of&amp;rsquo; playlist works ok when you&amp;rsquo;re dealing with as few as hundreds of items, but for bigger collections you&amp;rsquo;ve got to come with something more elaborate if you don&amp;rsquo;t want things to go out of hand.&lt;/p&gt;

&lt;p&gt;This is where the ratings system, that is present in most music softwares, comes into play : each track of your library can be assigned a rating from 0 to 5 stars. Selecting good music then boils down to create a &lt;strong&gt;playlist filtering songs based on their ratings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When it comes to decide what these ratings really represent, you&amp;rsquo;re faced with two slightly different approaches.&lt;/p&gt;

&lt;h3&gt;Ratings as an improved play count indicator&lt;/h3&gt;

&lt;p&gt;A basic assumption is that the more you listen to a song, the more you like it. From this premiss, &lt;a href=&quot;http://www.google.com/search?q=mediamonkey%20auto%20ratings&quot;&gt;some tools&lt;/a&gt; extrapolate a score to represent how much you appreciate a song based on how obsessively you play it. So the absolute -somewhat cryptic- play and skip counts are replaced by a single relative score that can be used as a filter criteria.&lt;/p&gt;

&lt;p&gt;This algorithm implies meaningful count statistics. I don’t trust these results unless you have a small library. It is likely that the few songs sitting on the top of your playing charts are indeed among your favorite songs. It is less clear how any conclusion can be drawn from the ones that are scarcely played. Are they bad songs intentionally ignored, or forgotten treasures?&lt;/p&gt;

&lt;p&gt;Because this ratings method is fed by your listening habits, it&amp;rsquo;s &lt;strong&gt;less prone to help you discover your music&lt;/strong&gt;. Actually, it does the opposite by reinforcing your music selection pattern : the most played songs get the higher score while it becomes increasingly difficult over time for new songs to incorporate the top rankings.&lt;/p&gt;

&lt;p&gt;Not convinced by this automated approach, I regress on a more primitive technique.&lt;/p&gt;

&lt;h3&gt;Ratings as a personal feelings indicator&lt;/h3&gt;

&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;Vanessa Paradis at &apos;L Ecole des Fans&apos; TV show&quot; src=&quot;/public/img/posts/vparadis_edf.jpg&quot; alt=&quot;Vanessa Paradis at &apos;L Ecole des Fans&apos; TV show&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Carefully assign scores for your songs based on your personal listening pleasure.&lt;/p&gt;

&lt;p&gt;Some media players allow you to award half stars, thus doubling the ratings range to a whopping 10. That&amp;rsquo;s more than one can handle. Ditch half-stars, to focus on five distinct rankings &lt;strong&gt;that make sense to you&lt;/strong&gt;. Choose five adjectives to describe your points system and stick with it. Think in those terms when you rate a song.&lt;/p&gt;

&lt;p&gt;Here is my wording scale :&lt;/p&gt;

&lt;p&gt;★★★★★ : awesome&lt;br /&gt;
★★★★☆ : very good&lt;br /&gt;
★★★☆☆ : good&lt;br /&gt;
★★☆☆☆ : average&lt;br /&gt;
★☆☆☆☆ : lame&lt;/p&gt;

&lt;p&gt;The three first cuts make up my daily meat, songs scoring &lt;strong&gt;three stars and more&lt;/strong&gt; constitute indeed my daily random-mix playlist.  The two last are what&amp;rsquo;s left once all the tidbits have been pulled out : average and weak tunes that I rarely play except when I decide to specifically listen to one of the albums to which they belong.&lt;/p&gt;

&lt;p&gt;As you can guess, assigning ratings for each individual track is &lt;em&gt;tedious&lt;/em&gt; (at best) but totally worth it imho. Various techniques I use to optimize this process will be discussed in future posts.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Exporting music from Itunes (Mac) while keeping source folders arrangement</title>
   <link href="http://kray.me/2010/12/exporting-music-from-itunes-mac-while-keeping/"/>
   <updated>2010-12-18T00:00:00+00:00</updated>
   <id>http://kray.me/2010/12/exporting-music-from-itunes-mac-while-keeping</id>
   <content type="html">&lt;p&gt;Thanks to smart playlists in &lt;em&gt;iTunes&lt;/em&gt;, you can build a playlist gathering the best songs of your library in few seconds. I recently had to copy a such &lt;em&gt;best of&lt;/em&gt; selection to an external hard drive. A simple drag &amp;amp; drop from &lt;em&gt;iTunes&lt;/em&gt; to the &lt;em&gt;Finder&lt;/em&gt; can do the trick, yet resulting in a mess of unrelated files now all located in the same directory.&lt;br /&gt;
So, what is the easiest way to copy a playlist content to a specified location and have the folders arrangement of your source files duplicated on your destination drive ?&lt;/p&gt;

&lt;p&gt;Here is the solution that I’ve reached, unfortunately it involves no less than 3 different steps.&lt;/p&gt;

&lt;h3 id=&quot;export-the-playlist-to-m3u-file&quot;&gt;Export the playlist to M3U file&lt;/h3&gt;

&lt;p&gt;Because it can’t be done directly in &lt;em&gt;iTunes&lt;/em&gt;, you have to export your playlist first.
Select your playlist and right click &lt;em&gt;Export&lt;/em&gt; then choose the M3U8 format. M3U export has been added &lt;em&gt;recently&lt;/em&gt; to &lt;em&gt;iTunes&lt;/em&gt; (in one of the 9.x release), so upgrade your &lt;em&gt;iTunes&lt;/em&gt; if the only choices you’re faced with are text and xml.&lt;/p&gt;

&lt;h3 id=&quot;fix-the-m3u-file&quot;&gt;Fix the M3U file&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;iTunes&lt;/em&gt; saves M3U files using DOS/Windows newlines, fire up your &lt;em&gt;Terminal.app&lt;/em&gt; to correct that :&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;tr &apos;\r&apos; &apos;\n&apos; &amp;lt; input_m3u
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;h3 id=&quot;transfer-files-using-cpio-command&quot;&gt;Transfer files using &lt;em&gt;cpio&lt;/em&gt; command&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;cpio&lt;/em&gt; is the perfect tool to copy files listed in the M3U. Run it with &lt;em&gt;-dp&lt;/em&gt; options to activate pass-through mode and automatic directories creation :&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;tr &apos;\r&apos; &apos;\n&apos; &amp;lt; input_m3u | cpio -pd  destination_directory &amp;gt; m3u_file
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;Voilà ! All files are copied to destination and the directories structure is preserved which is neat when you sort your files by artists or year, etc.&lt;/p&gt;

&lt;iframe src=&quot;http://www.youtube.com/embed/1N5vNI1ISUc?wmode=transparent&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;417&quot; width=&quot;500&quot;&gt;&lt;/iframe&gt;
</content>
 </entry>
 
 <entry>
   <title>Fragments de rêves</title>
   <link href="http://kray.me/dream/dfa4d7/"/>
   <updated>1970-01-01T00:00:00+00:00</updated>
   <id>http://kray.me/dream/fragments</id>
   <content type="html">&lt;p&gt;&lt;em&gt;2025/01/13&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/public/img/posts/dream/20250113.jpg&quot; alt=&quot;homme avec verres vides dans pantalon&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;je rentre d’un bar émeché avec tellement de verres vides subtilisés et mis dans mon pantalon que je me retrouve figé à ne plus pouvoir avancé car tout tombe au moindre mouvement &lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. Des personnes me croisent et se moquent de moi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;2025/01/07&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;dans un petit appartement RDC avec Arthur C [et Enaël ?]&lt;/li&gt;
  &lt;li&gt;je prends une brioche dans un caddie mais c’était le caddit d’Arthur, on a fait les meme courses&lt;/li&gt;
  &lt;li&gt;Elodie dépose son vélo électrique vert bouteille et part à pieds vers le campus de Talence faire un apéro avec des potes à elle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;2025/01/05&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Joachim Mouhamad est interviewé par [[ un autre streamer échecs FR ]] sur le plateau de Nul Part Ailleurs&lt;/li&gt;
  &lt;li&gt;l’interviewer fait une allusion au fait que la femme de Joachim est [bonne et qu’il va s’en charger]&lt;/li&gt;
  &lt;li&gt;Joachim pète un câble et veut lui mettre une droite, des gens le retiennent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;2024/12/17 5h16&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Dim conseille aux locataires de se chauffer à la bougie pour réduire les charges&lt;/li&gt;
  &lt;li&gt;son frère ainé dit “c’est qui que tu traites de radins ?”, le ton monte&lt;/li&gt;
  &lt;li&gt;je me défends que je n’ai rien contre ma belle-soeur&lt;/li&gt;
  &lt;li&gt;ils rigolent qu’ils me carottent en achetant la maison 320k&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Arthur Coudert a accès a mes pseudos [[ 1password ]] me tease par rapport à ça&lt;/li&gt;
  &lt;li&gt;je le pointe du doigt “attention, ce n’est pas très constructif ce que tu fais là !”&lt;/li&gt;
  &lt;li&gt;marouffin observe la scène sans commenter&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;ornament-container&quot;&gt;
    &lt;span class=&quot;ornament&quot;&gt;§&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/public/img/posts/dream/20241217.jpg&quot; alt=&quot;pc doté d&apos;un robinet et tiroir-caisse dans une grotte&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;rangées de vieux pcs des années 80 dans une sorte de cave/grotte&lt;/li&gt;
  &lt;li&gt;je tire sur un tiroir caisse pour faire couler de l’eau, je mets les main en coupole dessous pour la réceptionner&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;2024/06/18&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;dans une cave/bar à jazz/stand-up de Bordeaux j’aperçois les Médale assis au premier rang Maire-Rose &amp;amp; Serge, Steph et Corinne. Je vais taper la bise, fait une blague sur les cheveux gris de Corinne.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;2024/05/26&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;équipe de télévision débarque à Molietz sur le lieu du séminaire le 2e jour après-midi or l’équipe Yc est rentrée chez elle ne reste que le staff Gb&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;2024/05/19&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;je travaille dans un entrepôt de logistique.&lt;/li&gt;
  &lt;li&gt;2 collègues féminines ramènent un véhicule de fonction type camion de la Brinks, elles en sortent deux gitans [qui ont commit un délit]&lt;/li&gt;
  &lt;li&gt;je flirte avec une troisième collègue une des travées de l’entrepôt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;2024/05/18&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;dans un open space similaire à avenue de la République, Elodie est ma voisine elle a été rappelée pour intervenir sur une situation de crise. Dans la salle en face de moi j’aperçois des collègues en couple : le gars enlace une grande brune.&lt;/li&gt;
  &lt;li&gt;dans chambre une boisée, papa dans un fauteuil au fond la pièce. Moi en pleurs : “faudrait savoir maman dit qu’il faut t’emmener, alors que toi tu dis que tu peux y’aller seul”. Je prends un cadre coloré au mur pour le ramener chez moi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;2024/04/30&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;J’ai mis la main sur un lot de 5 montres, une digitale avec écrit &lt;em&gt;2014 Powerstone&lt;/em&gt; sur la dial. Certains bracelets étaient pas mal, du milieu de gamme.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;j’ai subtilisé un verre au Berthom la veille &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 

</feed>
