<?xml version="1.0" encoding="ISO-8859-15"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Blog &amp; White   </title>
    <link>https://weber.fi.eu.org/blog</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss" rel="self" type="application/rss+xml"/>
    <description>Le blog en noir et blanc de Matthieu</description>


  <item>
    <title>Tikki Brownie</title>
    <link>https://weber.fi.eu.org/blog/2024/03/10#tikki_brownie</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2024/03/10#tikki_brownie</guid>
    <pubDate>Sun, 10 Mar 2024 12:01:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2Ftikki_brownie.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2Ftikki_brownie.html">Babelfish</a> ]</p> <p class="story_para first">Une recette d'<a href="https://owiowifouettemoi.com/2019/08/18/tikki-brownie/">Owi Owi Fouette-moi</a>
dont la cuisson a été modifiée.</p>

<h4>Ingrédients</h4>

<ul>
<li>125&amp;nbsp;g farine</li>
<li>1/4&amp;nbsp;c. à café poudre à lever</li>
<li>1 pincée sel</li>
<li>25&amp;nbsp;g cacao</li>
<li>70&amp;nbsp;g eau bouillante</li>
<li>85&amp;nbsp;g huile d'olive sans trop de goût</li>
<li>90&amp;nbsp;g chocolat noir fondu</li>
<li>1 ½uf</li>
<li>140&amp;nbsp;g sucre brun</li>
<li>55&amp;nbsp;g sucre blanc</li>
<li>1&amp;nbsp;c. à café extrait de vanille</li>
</ul>

<ul>
<li>1 moule carré de 20&amp;nbsp;cm de coté chemisé de papier sulfurisé</li>
<li>1 &amp;laquo;&amp;nbsp;&amp;nbsp;caleçon à brownie&amp;nbsp;&amp;nbsp;&amp;raquo; adapté au moule</li>
</ul>

 <a href="https://weber.fi.eu.org/blog/images/calecon_a_brownie.jpg"><img src="https://weber.fi.eu.org/blog/images/calecon_a_brownie.thumbnail.jpg" width="200" height="113" class="align_left" alt="calecon_a_brownie"/></a>

<p class="story_para">Le caleçon à brownie est une bande de plusieurs épaisseurs de tissu placée
mouillée autour du moule pour empêcher le gâteau de cuire par les bords. De
cette manière, les bords ne sont pas plus cuits que le centre.</p>

<h4>Préparation</h4>

<p class="story_para">Préchauffer le four à 160&amp;nbsp;°C.</p>

<p class="story_para">Mélanger au fouet dans un saladier la farine, la poudre à lever et le sel.
Dans un second saladier, fouetter à la main le cacao avec l'eau. Ajouter</p>

<p class="story_para">l'huile et fouetter. Ajouter le chocolat fondu et fouetter. Ajouter l'½uf et
fouetter jusqu'à obtenir une préparation d'aspect uniforme. Ajouter les sucres
et l'extrait de vanille, fouetter. Ajouter en une fois le mélange de farine et
l'incorporer avec une spatule jusqu'à ce qu'on ne voie plus de farine.</p>

<p class="story_para">Verser la préparation dans le moule chemisé, réparir à l'aide de la spatule.
Mouiller le caleçon à brownie, l'essorer et le placer sur la grille du four,
puis y placer le moule. Faire cuire 30&amp;nbsp;min. À la sortie du four, saupoudrer de
flocons de sel.</p>

<p class="story_para">Laisser refroidir sur une grille, puis démouler le brownie avec le papier sulfurisé.
</p>

]]></description>
  </item>
  <item>
    <title>Le service militaire</title>
    <link>https://weber.fi.eu.org/blog/2024/02/26#le_service_militaire</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2024/02/26#le_service_militaire</guid>
    <pubDate>Mon, 26 Feb 2024 11:53:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FRaleries%2Fle_service_militaire.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FRaleries%2Fle_service_militaire.html">Babelfish</a> ]</p> <p class="story_para first">(Publié à l'origine sur
<a href="https://mastodon.weber.fi.eu.org/@matthieu/111996476946137513">Mastodon</a>)</p>

<p class="story_para">J'ai été appelé du contingent dans la cavalerie, au sein de cette grande
institution nécessairement bien organisée.</p>

<p class="story_para">J'ai reçu un papier me disant de me rendre à la gare de Colmar le lendemain de
mon anniversaire. Je me dis </p>

<blockquote>

<p class="story_para">&amp;laquo;&amp;nbsp;&amp;nbsp;oh y sont sympas, y m'appellent pas le jour de mon anniv,
alors que normalement ça aurait dû être ce jour là.&amp;nbsp;&amp;nbsp;&amp;raquo;</p>

</blockquote>

<p class="story_para">À la gare de Colmar, y'a personne. Un peu plus tard, y'a un autre gars qui
arrive, tout aussi paumé que moi. Puis deux autres. Puis quelques autres. Et
on attend.
Au bout de quelques heures, arrivent des militaires qui appellent des noms,
mais pas le mien ni celui de 3 autres gars. Alors on leur demande ce qu'on est
censés faire. Ils savent pas, mais nous emmènent à la caserne de Colmar (nous
4 on est censés aller dans diverses casernes de la brigade franco-allemande,
en Allemagne donc).
On passe la nuit à la caserne de Colmar, juste nous 4 dans un dortoir pour 16.
Et la journée aussi.
L'après-midi, des militaires de la caserne de Donaueschingen viennent nous
chercher et on part en minibus (sjmsb). On arrive l'après-midi à la caserne,
c'est là que 2 des gars devaient aller. Ils appellent la caserne d'Immendingen
pour que quelqu'un vienne me chercher (je suppose qu'ils ont fait pareil pour
le 4è gars qui devait aller je sais pas où). Je passe quelques heures au poste
de garde, puis le soir deux militaires arrivent en P4 et m'emmènent à mon
nouveau chez-moi.
On est vendredi soir, 22h passées, après l'extinction des feux. On me met dans
une chambre avec 3 autres gars tout aussi paumés que moi. Sauf qu'eux sont
arrivés avant le week-end, quand le magasin du corps était encore ouvert. Donc
ils ont eu leur paquetage, y compris leurs treillis. Moi pas. Donc j'ai passé
le week-end habillé en civil dans une caserne, à me retrouver en queue de
colonne parce que j'étais pas habillé pareil que les autres et que ça faisait
désordre.
Le lundi, j'ai eu mon matériel, et pour je sais plus quelle raison je me suis
changé dans un bureau, pas dans ma chambre. Après c'est un peu flou, mais je
suis passé devant l'officier orienteur, je lui ai dit que j'avais un diplôme
d'ingé en informatique et au bout de 2 jours j'ai changé d'escadron, passant
d'un escadron de combat à celui de commandement et de logistique (ECL). Quand
les autres gens partaient quelques semaines faire leurs classes, moi
bizarrement je suis resté.</p>

<p class="story_para">Dans la cellule OPEX (opérations extérieures) du BOI (bureau de machin et de
trucs, j'ai oublié) il y avait un appelé qui savait utiliser un ordinateur et
qui finissait son service deux mois plus tard. Je devais le remplacer. C'est
lui qui, dans le bureau, m'a appris à saluer et à faire des quarts de tour et
des demi-tours. Les grades, je les ai appris sur le tas.
La cellule OPEX avait besoin d'un outil informatique pour gérer les
personnels, et on comptait sur moi pour l'écrire.</p>

<p class="story_para">Dans le bureau, il y avait aussi un adjudant et un maréchal-des-logis chef
(promu plus tard adjudant) qui fumaient comme des cheminées d'usine (alors que
c'était interdit de fumer dans les bureaux, bien sûr).
L'adjudant avait le dos tout pété d'avoir passé 10 ans dans des blindés et
attendait la retraite. C'était un fainéant comme moi. Il m'avait appris à
ouvrir l'armoire blindée qui contenait les passeports des personnels (et les
horaires de bus, aussi).
L'armoire blindée était juste derrière la porte du bureau, donc on fermait la
porte à clé pour ne pas qu'une ouverture intempestive de cette dernière ne
vienne taper dans le gros bouton chiffré de la porte&amp;emsp;de l'armoire.
Un jour que l'autre adjudant était absent, on a ouvert l'armoire pour avoir
une raison de verrouiller le bureau, on s'est assis face à face et on s'est
amusés a lancer des mines de stylos dans la tasse de l'autre à l'aide du
mécanisme à ressort des agrafeuses.</p>

<p class="story_para">Mais en fait, j'étais pas habilité à ouvrir l'armoire blindée. L'adjudant m'a
dit </p>

<blockquote>

<p class="story_para">&amp;laquo;&amp;nbsp;&amp;nbsp;si on te demande de l'ouvrir, tu dis que tu sais pas faire.&amp;nbsp;&amp;nbsp;&amp;raquo;</p>

</blockquote>

<p class="story_para">Le chef de la cellule OPEX c'était un lieutenant qui bossait à l'étage. Il
était sympa, et je donnais des cours de maths à sa fille en échange de bons
dîners préparés par sa femme. Un soir j'étais en civil, seul dans mon bureau,
à attendre le lieutenant pour qu'il m'emmène chez lui. Arrive alors le second
du chef de corps.
Le lieutenant-colonel me demande d'ouvrir l'armoire blindée pour sortir un
truc. Je lui réponds, comme l'adjudant m'a dit, que je ne connais pas la
combinaison. Arrive alors le lieutenant, mon chef, à qui le colon demande le
truc en question. Le lieutenant, qui sait que je connais la combinaison, se
tourne vers moi et dit &amp;laquo;&amp;nbsp;&amp;nbsp;Weber, ouvre l'armoire blindée&amp;nbsp;&amp;nbsp;&amp;raquo;. Alors je dis &amp;laquo;&amp;nbsp;&amp;nbsp;Oui,
mon lieutenant&amp;nbsp;&amp;nbsp;&amp;raquo; et j'obtempère, sous les regard intrigué du colon, qui dit
rien. Petit moment de solitude.</p>

<p class="story_para">L'armée, depuis la toute fin des années 90, c'est une armée de professionnels
(j'étais parmi les derniers appelés). Les soldats sont censés protéger la
France, tout ça, tmtc.
Un jour on est allé s'entrainer au tir. J'étais à coté d'une engagée
volontaire (une pro, donc) qui n'arrivait pas à toucher la cible. Après une
brève discussion, j'ai compris qu'elle ne savait pas viser. Il faut aligner
deux trucs de l'arme aver la cible, mais elle n'alignait que le truc du bout
du canon</p>

<p class="story_para">L'armée, c'est aussi du matériel de pointe. J'ai appris de mon adjudant que
dans les chars AMX 30 B2, les supports pour les obus ont juste la bonne taille
pour y ranger des bouteilles de Bordeaux. Et si tu mets des chiffons mouillés
dans la clim, tu peux y rafraichir des canettes de bière.
Les camions Berliet fonctionnent au choix au gazole et à l'essence, on en
change en pressant un simple bouton. Aussi, le siège du passager vibre
tellement que ça fait bander (j'ai testé).</p>

<p class="story_para">Une dernière pour la route. Je sais plus ce que j'avais dit à mon adjudant,
mais il avait répondu &amp;laquo;&amp;nbsp;&amp;nbsp;c'est ça, appelle-moi con&amp;nbsp;!&amp;nbsp;&amp;nbsp;&amp;raquo;. En bon soldat, j'ai
évidemment rétorqué &amp;laquo;&amp;nbsp;&amp;nbsp;À vos ordres, mon adjudant&amp;nbsp;!&amp;nbsp;&amp;nbsp;&amp;raquo; :)
</p>

]]></description>
  </item>
  <item>
    <title>Petits pains pour hamburgers 2</title>
    <link>https://weber.fi.eu.org/blog/2023/10/28#petits_pains_pour_hamburgers_2</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2023/10/28#petits_pains_pour_hamburgers_2</guid>
    <pubDate>Sat, 28 Oct 2023 16:02:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2Fpetits_pains_pour_hamburgers_2.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2Fpetits_pains_pour_hamburgers_2.html">Babelfish</a> ]</p> <p class="story_para first">Adaptée de la recette <a href="https://www.seriouseats.com/the-spotted-pigs-hamburger-buns-recipe">Serious Eats</a>.</p>

<p class="story_para">Pour 6 petits pains de 12&amp;nbsp;cm de diamètre.</p>

<h4> Ingrédients </h4>

<ul>
<li>113&amp;nbsp;g lait tiède</li>
<li>170&amp;nbsp;g eau tiède</li>
<li>2&amp;nbsp;c. café levure sèche (5g)</li>
<li>1,5&amp;nbsp;c. soupe sucre en poudre (5g)</li>
<li>550&amp;nbsp;g farine</li>
<li>2&amp;nbsp;c. café sel (10g)</li>
<li>3&amp;nbsp;½ufs</li>
<li>60&amp;nbsp;g beurre</li>
</ul>

<ul>
<li>2 plaqueis à four et papier cuisson</li>
<li>pinceau</li>
</ul>

<h4> Préparation </h4>

<ul>
<li>Délayer la levure dans le lait, l'eau et le sucre et attentre 5&amp;nbsp;min que ça
mousse..</li>
<li>Placer la farine et le sel lans le mixeur, ajouter le liquide et mélanger.</li>
<li>Ajouter 2&amp;nbsp;½ufs, un par un, en mélangeant.</li>
<li>Ajouter le beurre en deux fois. Mixer 2 &amp;ndash; 3&amp;nbsp;min.</li>
<li>Ajouter de la farine au besoin, la pâte doit coller au fond, pas aux bords
du bol. Mixer 5 &amp;ndash; 6&amp;nbsp;min de plus.</li>
<li>Couvrir le bol et laisser pousser 2&amp;nbsp;h.</li>
<li>Former 6&amp;nbsp;boules (de 160 &amp;ndash; 170&amp;nbsp;g chacune), les placer sur deux plaques avec du
papier de cuisson. Brosser avec de l'huile et couvrire. Laisser reposer 2&amp;nbsp;h.</li>
<li>Préchauffer le four à 200&amp;nbsp;°C en chaleur tournante. Appuyer sur les boules
pour réduire leur épaisseur à 3&amp;nbsp;cm. Passer les boules à l'½uf battu avec 1&amp;nbsp;c.&amp;nbsp;à
soupe d'eau.</li>
<li>Cuire 7&amp;nbsp;min. Repasser à l'½uf et cuire 13&amp;nbsp;min de plus.</li>
</ul>

<h4>Commentaires</h4>

<ul>
<li>Les petits pains se conservent plusieurs jours dans une boite hermétique</li>
</ul>

]]></description>
  </item>
  <item>
    <title>Full-Text Search in Database For Mastodon</title>
    <link>https://weber.fi.eu.org/blog/2023/02/23#full-text_search_in_database_for_mastodon</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2023/02/23#full-text_search_in_database_for_mastodon</guid>
    <pubDate>Thu, 23 Feb 2023 14:56:00 +0200</pubDate>
    <description><![CDATA[ <p class="story_para first">I run my own <a href="https://mastodon.weber.fi.eu.org/">instance of Mastodon</a> on a
server with little memory, i.e. not enough to be able to run ElasticSearch in
addition to Mastodon. This means that I cannot do a full-text search on my
toots (which would have come handy from time to time).</p>

<p class="story_para">As an alternative solution, I have implemented a full-text search on database.
It is most probably not suitable to use on a large instance, as the
implementation uses an SQL query with multiple LIKE conditions ORed together.
That's not the most efficient way of querying a database, but for a small
enough number of statuses (40k at the moment), it's probably good enough.</p>

<p class="story_para">This feature is (and will probably forever remain) experimental, but if you
want to give it a try, and assuming that you have <a href="https://docs.joinmastodon.org/admin/install/#setting-up-mastodon">installed Mastodon from
Git</a> like me
in <code>/home/mastodon/live</code> and run v4.1.0, here's how to do it.</p>

As user <em>mastodon</em>, run:
<pre>
$ cd /home/mastodon/live
$ git remote add db_search https://weber.fi.eu.org/software/mastodon
$ git fetch db_search
$ git checkout v4.1.0+db_search.1
$ echo "FULL_TEXT_DB_SEARCH=true" >> .env.production
</pre>

Then restart the <em>mastodon-web</em> service by running as root:
<pre>
systemctl restart mastodon-web.service
</pre>

<p class="story_para">Reload the mastodon Web UI in your web browser. When you click on the search
box, you should now see a message like &amp;ldquo;Simple text returns posts you have
written&amp;hellip;&amp;rdquo; and searching with words you know you have written should display
matching toots.</p>

<p class="story_para">EDIT: I expanded the search to also consider the descriptions of
media attachments. The updated version is available as tag v4.1.0+db_search.1.
</p>

]]></description>
  </item>
  <item>
    <title>Repose-bras (partie 2)</title>
    <link>https://weber.fi.eu.org/blog/2022/08/11#repose-bras_2</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2022/08/11#repose-bras_2</guid>
    <pubDate>Thu, 11 Aug 2022 09:54:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FBricolage%2Frepose-bras_2.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FBricolage%2Frepose-bras_2.html">Babelfish</a> ]</p>  <a href="https://weber.fi.eu.org/blog/images/repose-bras-dessus-mousse.jpg"><img src="https://weber.fi.eu.org/blog/images/repose-bras-dessus-mousse.thumbnail.jpg" width="200" height="112" class="align_left" alt="repose-bras-dessus-mousse"/></a>

<p class="story_para first">La quête du <a href="https://weber.fi.eu.org/blog/Bricolage/repose-bras_1.writeback">repose-bras idéal</a>
passe par le confort, et donc par la quête de la mousse idéale. J'ai d'abord
essayé de la mousse pour l'isolation phonique, très dense, mais malgré sa
faible épaisseur d'1&amp;nbsp;cm, elle s'enfonce à peine sous la pression du bras, et
surtout elle surélève mes poignets au point où ils ne reposent plus
suffisamment sur les repose-poignets du clavier. J'ai alors essayé de la
mousse &amp;laquo;&amp;nbsp;ordinaire&amp;nbsp;&amp;raquo; de la même épaisseur, utilisée dans l'ameublement, et
j'ai découpé un espace pour que l'avant bras ne soit pas soutenu&amp;nbsp;; le fond est
recouvert d'une mousse d'emballage fine, récupérée dans un colis que j'ai
reçu. J'ai ensuite collé la mousse à la colle chaude, exception faite de la
partie qui recouvre les vis, pour pouvoir remonter le bazar une fois que c'est
terminé.</p>

<p class="story_para">Le coté droit est plus complexe, j'y ai ajouté un repose-poignet pour le
trackball en empilant deux épaisseurs de mousse d'isolation phonique. Ce
repose-poignet n'est pas collé, encore une fois pour avoir accès aux deux vis
cachées dessous.</p>

 <a href="https://weber.fi.eu.org/blog/images/repose-bras-gauche-habille-dessus.jpg"><img src="https://weber.fi.eu.org/blog/images/repose-bras-gauche-habille-dessus.thumbnail.jpg" width="200" height="98" class="align_left" alt="repose-bras-gauche-habille-dessus"/></a>

<p class="story_para">J'ai ensuite recouvert la mousse de tissus noir que j'avais acheté il y a
longtemps pour fabriquer un sac pour des dés de <a href="https://weber.fi.eu.org/blog/Games/super_mario_dice.writeback">Super Mario Dice</a>.
Les cotés rectilignes étaient faciles à gérer, mais le coté concave a demandé
un peu d'efforts de couture&amp;nbsp;: tout comme on ne peut pas recouvrir parfaitement
une orange (sphérique) d'un feuille de papier (plane), on ne peut pas non plus
recouvrir le repose-bras de tissus non-extensible (et le tissus extensible,
c'est galère à utiliser, donc je n'ose même pas y penser).</p>

 <a href="https://weber.fi.eu.org/blog/images/repose-bras-gauche-habille-dessous.jpg"><img src="https://weber.fi.eu.org/blog/images/repose-bras-gauche-habille-dessous.thumbnail.jpg" width="160" height="150" class="align_left" alt="repose-bras-gauche-habille-dessous"/></a>

<p class="story_para">Le dessous est nettement plus simple: le tissus est agrafé (merci à Aku qui
m'a prêté l'outil idoine).</p>

 <a href="https://weber.fi.eu.org/blog/images/repose-bras-droit-habille-dessus.jpg"><img src="https://weber.fi.eu.org/blog/images/repose-bras-droit-habille-dessus.thumbnail.jpg" width="200" height="124" class="align_left" alt="repose-bras-droit-habille-dessus"/></a>

<p class="story_para">Le coté droit est plus compliqué à cause du repose-poignet qui ajoute un
deuxième bord concave et une épaisseur supplémentaire. J'ai fini par
comprendre (à force d'essayer de poser le tissus à plat sur toutes les parties
où placer la deuxième couture. L'angle entre le repose-poignet et le bord
supérieur par contre est très moche, j'ai dû y faire une découpe que j'ai
recouverte d'un morceau de tissus collé à la colle chaude (c'est trop petit
pour que j'arrive à y coudre une pièce). Enfin, le tissus est collé sous le
repose-poignet, c'est très moche aussi mais personne n'ira regarder.</p>

 <a href="https://weber.fi.eu.org/blog/images/repose-bras-dessus-habille.jpg"><img src="https://weber.fi.eu.org/blog/images/repose-bras-dessus-habille.thumbnail.jpg" width="200" height="118" class="align_left" alt="repose-bras-dessus-habille"/></a>

<p class="story_para">Le résultat final.</p>

<p class="story_para"><em>Modification du 2022-08-18</em>: j'ai collé deux morceaux de silicone (découpés
dans un tapis de pâtisserie en silicone qui était abimé de coups de couteau)
sous les parties du repose-bras qui prennent appui sur la surface du bureau,
pour éviter qu'il ne glisse. Coller du silicone, c'est pas facile, la colle
néoprène tient très bien sur le bois mais pas du tout sur le silicone. Le
joint silicone en tube en revanche fait l'affaire (même si on pourrait le
décoller en tirant fort dessus).
</p>

]]></description>
  </item>
  <item>
    <title>Repose-bras (partie 1)</title>
    <link>https://weber.fi.eu.org/blog/2022/08/05#repose-bras_1</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2022/08/05#repose-bras_1</guid>
    <pubDate>Fri, 05 Aug 2022 15:14:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FBricolage%2Frepose-bras_1.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FBricolage%2Frepose-bras_1.html">Babelfish</a> ]</p>  <a href="https://weber.fi.eu.org/blog/images/repose-bras-dessus.jpg"><img src="https://weber.fi.eu.org/blog/images/repose-bras-dessus.thumbnail.jpg" width="200" height="111" class="align_left" alt="repose-bras-dessus"/></a>

<p class="story_para first">Pour rendre mon poste de travail plus confortable, je voulais y ajouter un
repose-bras. Comme tous ceux que j'ai vus en ligne étaient trop étroits et
mordaient sur le bord du bureau là où je veux mettre le trackball, j'ai décidé
d'en construire un moi-même. <em>How hard can it be?</em> comme y disent (oui je sais
le bord du repose-bras du commerce pourrait être utilisable pour remplacer
celui du trackball, mais j'avais pas envie d'essayer pour me rendre compte que
finalement, bah non, c'est pas top).</p>

<p class="story_para">Celui que j'ai construit est composé de deux parties en contreplaqué de 12&amp;nbsp;mm
(qui coûte justement un bras en ce moment, 36&amp;nbsp;¤/m<sup>2</sup>, il doit être
plaqué or à l'intérieur) fixées à un tasseau de 28&amp;nbsp;mm par six vis
auto-taraudeuses 3x30 (à tête Torx, le Torx c'est bien, mangez-en. Je ne vois
pas pourquoi on utiliserait encore du Pozidriv de nos jours&amp;nbsp;; d'ailleurs à
Stark, on ne trouve plus que du Torx).</p>

 <a href="https://weber.fi.eu.org/blog/images/repose-bras-dessous.jpg"><img src="https://weber.fi.eu.org/blog/images/repose-bras-dessous.thumbnail.jpg" width="113" height="150" class="align_left" alt="repose-bras-dessous"/></a>

<p class="story_para">Le repose-bras est fixé au bord du bureau par un ingénieux système de crochets
en acier, ce qui permet de l'enlever et le remettre rapidement. Je les ai
trouvés sur ergostar.fi quand je regardais les modèles de repose-bras. Je ne
suis pas sûr comment je l'aurais fixé si je n'avais pas trouvé ces crochets.
Ces derniers sont ensuite vissés sur les bords du repose-bras (sous les
parties que mordent justement sur le bureau) grâce à des écrous à frapper M5
(dont j'ai découvert l'existence en me promenant sur motonet.fi pour justement
regarder comment je pourrais fixer le bazar en question) qui s'adaptent
pile-poil aux vis M5 fournies avec les crochets.</p>

<p class="story_para">Prochaine étape&amp;nbsp;: trouver de la mousse pas trop épaisse pour rembourrer le
dessus et la couvrir avec du tissus.
</p>

]]></description>
  </item>
  <item>
    <title>Nerdle Solver</title>
    <link>https://weber.fi.eu.org/blog/2022/04/20#nerdle_solver</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2022/04/20#nerdle_solver</guid>
    <pubDate>Wed, 20 Apr 2022 14:01:00 +0200</pubDate>
    <description><![CDATA[ <p class="story_para first">There was <a href="https://en.wikipedia.org/wiki/Mastermind_(board_game)">Mastermind_(board_game)</a> where you have to guess the
correct colors in the correct order. Then came Wordle, where you have to guess
the correct letters in the correct order to make an actual word. And then came
<a href="https://nerdlegame.com/">Nerdle</a> where you have to guess the correct
arithmetic identity, using digits from 0 to 9, the four usual operations and
the &amp;ldquo;equal&amp;rdquo; sign.</p>

<p class="story_para">That was fun the couple of first times, but then came the itch to write a
<a href="https://weber.fi.eu.org/software/nerdle/">solver</a> for it (like I did a long
time ago with the Sudoku: same kind of repetitive puzzle, same geek reflex).</p>

 <a href="https://weber.fi.eu.org/blog/images/Nerdle.png"><img src="https://weber.fi.eu.org/blog/images/Nerdle.thumbnail.png" width="159" height="150" class="align_left" alt="Nerdle"/></a>

<pre>
$ python3 nerdle.py
([c]orrect [i]ncorrect [a]bsent
8+7*6=50 > iiaaaiai
10+2-4=8 > cccacaci
10+1-8=3 > cccccccc
10+1-8=3
</pre>

<div class="clear"></div>

<p class="story_para">The user interface is trivial: the solver prompts a solution, type it in the
Nerdle web interface, then type the colored hints back into the solver: green
is &amp;ldquo;c&amp;rdquo; for <em>Correct</em>, purple is &amp;ldquo;i&amp;rdquo; for <em>Incorrect</em> and black is &amp;ldquo;a&amp;rdquo; for
<em>Absent</em> (as indicated by the solver when you start it).</p>

<p class="story_para">It always starts with the same first attempt, that is composed of 8 of the 15
possible symbols. Then based on the hints, it computes possible next
solutions and ranks them based on the diversity of the symbols it contains and
the amount of yet-unused ones (assuming that the actual solution contains as
wide a variety of symbols as possible, and that unused symbols need to be
tried).</p>

<p class="story_para">One thing I liked when coding this little tool is that I got to use sets a
lot, and implement a lot of the logic using set operations. 
</p>

]]></description>
  </item>
  <item>
    <title>Pâte à pizza</title>
    <link>https://weber.fi.eu.org/blog/2022/04/11#pate_a_pizza</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2022/04/11#pate_a_pizza</guid>
    <pubDate>Mon, 11 Apr 2022 11:20:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2Fpate_a_pizza.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2Fpate_a_pizza.html">Babelfish</a> ]</p> <p class="story_para first">Proportions de base pour la pâte à pizza:</p>

<ul>
<li>250 g farine</li>
<li>150 g eau à 43&amp;nbsp;°C</li>
<li>4 g sel</li>
<li>1,5 c. à café levure sèche</li>
<li>3 c. à soupe huile d'olive</li>
</ul>

<p class="story_para">Ce qui fait 440g de pâte en tout. D'après
<a href="https://www.tonton-pizza.net/poids-paton-pizza/">tonton-pizza</a> il faut un
pâton de 230&amp;nbsp;g pour une pizza de 29&amp;nbsp;cm, ça tombe bien c'est juste adapté à la
taille de la pelle à pizza. Donc on peut faire 2 pizza (à 4% près) avec cette
quantité de pâte.</p>

<p class="story_para">Mais comme je ne sais apparemment pas calculer la quantité de pâte pour faire
5 pizzas (je me suis retrouvé samedi dernier avec exactement la quantité
nécessaire pour en faire 3), voilà une liste des quantités en fonction du
nombre de pizzas.</p>

<h4>1 pizza</h4>

<ul>
<li>125 g farine</li>
<li>75 g eau</li>
<li>2 g sel</li>
<li>3/4 c. à café levure sèche</li>
<li>1,5 c. à soupe huile d'olive</li>
</ul>

<h4>2 pizzas</h4>

<ul>
<li>250 g farine</li>
<li>150 g eau</li>
<li>4 g sel</li>
<li>1,5 c. à café levure sèche</li>
<li>3 c. à soupe huile d'olive</li>
</ul>

<h4>3 pizzas</h4>

<ul>
<li>375 g farine</li>
<li>225 g eau</li>
<li>6 g sel</li>
<li>2,25 c. à café levure sèche</li>
<li>4,5 c. à soupe huile d'olive</li>
</ul>

<h4>4 pizzas</h4>

<ul>
<li>500 g farine</li>
<li>300 g eau</li>
<li>8 g sel</li>
<li>3 c. à café levure sèche</li>
<li>6 c. à soupe huile d'olive</li>
</ul>

<h4>5 pizzas</h4>

<ul>
<li>625 g farine</li>
<li>375 g eau</li>
<li>10 g sel</li>
<li>3,75 c. à café levure sèche</li>
<li>7,5 c. à soupe huile d'olive</li>
</ul>

<h4>6 pizzas</h4>

<ul>
<li>750 g farine</li>
<li>450 g eau</li>
<li>12 g sel</li>
<li>4,5 c. à café levure sèche</li>
<li>9 c. à soupe huile d'olive</li>
</ul>

<h4>7 pizzas</h4>

<ul>
<li>875 g farine</li>
<li>525 g eau</li>
<li>14 g sel</li>
<li>5,25 c. à café levure sèche</li>
<li>10,5 c. à soupe huile d'olive</li>
</ul>

]]></description>
  </item>
  <item>
    <title>New Leffakone Infrared Receiver</title>
    <link>https://weber.fi.eu.org/blog/2021/11/14#new_leffakone_infrared_receiver</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2021/11/14#new_leffakone_infrared_receiver</guid>
    <pubDate>Sun, 14 Nov 2021 11:56:00 +0200</pubDate>
    <description><![CDATA[ <p class="story_para first">Several months ago, the leffakone infrared receiver started to misbehave.
There were a lot of errors in syslog about spikes in the signal, and the
problem seemed to come from the serial port on the motherboard rather than
from the <a href="https://www.lirc.org/receivers.html">homebrew IR receiver</a>,
connected to the serial port, that I had built in 2002 or 2003 and&amp;emsp;that I had
been using with lirc ever since. One of the symptoms was that unloading the
lirc-serial kernel module caused the computer to freeze, while testing the
receiver with an oscilloscope seemed to show that it was working correctly.
For many months, I was too lazy to do something about it, as using a keyboard
with a long enough cord was enough to control leffakone. During the last
autumn vacation, I tried to test the receiver with the serial port on
minikone, but the latter seems to deliver only 1.2V signals, when the receiver
expects at least 7V to power its onboard voltage regulator. So that was not
very conclusive.</p>

 <a href="https://weber.fi.eu.org/blog/images/leffakone_ir_receiver.jpg"><img src="https://weber.fi.eu.org/blog/images/leffakone_ir_receiver.thumbnail.jpg" width="200" height="150" class="align_left" alt="leffakone_ir_receiver"/></a>

<p class="story_para">At the same time, I had the idea of building a <a href="https://weber.fi.eu.org/blog/Bricolage/Arduino/co2_meter.writeback">CO<sub>2</sub>
monitor</a>
using a Jeenode I had lying around, and somehow I wondered if the IR receiver
module would not just fit into one of the Jeenode's ports. Guess what? It
fits perfectly, allowing to use the IRQ pin as the input, which is exactly
what the <a href="https://github.com/Arduino-IRremote/Arduino-IRremote">Arduino-IRremote</a>
library suggests to use. Writing the <a href="https://weber.fi.eu.org/software/arduino/ir_receiver/">software</a>
was a bit of a headache, because the library assumes that the compiler would
run with the <code>-flto</code> option (and the compilation ends with an error if it is
not set), but my custom Makefile somehow fails to compile the code correctly
if I enable that option. Thankfully, you can get around the problem with
<code>#define SUPPRESS_ERROR_MESSAGE_FOR_BEGIN</code>. After that, the program is quite
straightforward: configure it for the RC5 protocol (as this is what my remote
control produces), read a code and write it to the serial port if it matches
the RC5 address. I also added a new feature: if the code is the power on
button, it would set a pin to HIGH for a short while, allowing to switch the
computer on. I used the <a href="https://web.archive.org/web/20160319152658/http://jeelabs.net/projects/hardware/wiki/JeeNode_USB">Jeenode USB</a>
as it has an on-board USB-to-serial adatpter, which makes it perfect to
connect to a modern computer. I had one reed relay left from the
<a href="https://weber.fi.eu.org/blog/Bricolage/Arduino/new_leffakone_timer.writeback">timer</a>
and despite being rated for a 5V control voltage, it works with the Jeenode's
3.3V signal. The Jeenode is connected to the computer with a USB cable where I
have replaced the USB Type A connector with a Molex connector so that I can
use one of USB headers on the motherboard. Crimping the very small contacts
was difficult as I don't have a crimping tool, but the connections seem to be
working despite having done quite a poor job of it.</p>

<p class="story_para">Yesterday, I installed the extra reed relay and the Jeenode onto the PCB that
holds the relays of the timer, and now it's inside leffakone and working well.
And since I forgot to take a picture, there is no image of what it looks like.
In addition, I'm quite happy I have been able to do this project by using only
bits and pieces I already had (the Jeenode, the headers, the reed relay, the
IR receiver module, the USB cable, the Molex contacts and housing).
</p>

]]></description>
  </item>
  <item>
    <title>CO<sub>2</sub> Meter</title>
    <link>https://weber.fi.eu.org/blog/2021/11/02#co2_meter</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2021/11/02#co2_meter</guid>
    <pubDate>Tue, 02 Nov 2021 23:22:00 +0200</pubDate>
    <description><![CDATA[  <a href="https://weber.fi.eu.org/blog/images/CO2_Meter_ext.jpg"><img src="https://weber.fi.eu.org/blog/images/CO2_Meter_ext.thumbnail.jpg" width="200" height="150" class="align_left" alt="CO2_Meter_ext"/></a>

<p class="story_para first">The last issue of Make: magazine had an article about building a
CO<sub>2</sub> monitor. The concentration of CO<sub>2</sub> is apparently a
<a href="https://hal.archives-ouvertes.fr/hal-03213146/document">good estimator for the concentration of
SARS-CoV-2</a> in the
air, which is correlated to the risk of transmission. The article suggests
keeping the concentration of CO<sub>2</sub> under 800&amp;nbsp;ppm when people are
wearing masks.</p>

<p class="story_para">The Make: article proposes a green-yellow-red light indicator, where the light
is green when the concentration is below 1000&amp;nbsp;ppm, yellow above that level and
red when it goes above 2000&amp;nbsp;ppm. These values are rather about indoors air
quality and not directly related to limiting the transmission of SARS-CoV-2.</p>

<p class="story_para">An article from NIST however indicates that the <a href="https://www.nist.gov/publications/indoor-carbon-dioxide-concentrations-ventilation-and-indoor-air-quality-standards">1000 ppm limit has no basis
whatsoever</a>
so I decided to use the 800&amp;nbsp;ppm limit instead and a rather arbitrary limit of
1300&amp;nbsp;ppm based on looking at Figure&amp;nbsp;2 in <a href="https://ehp.niehs.nih.gov/doi/10.1289/ehp.1510037">this
article</a> which seems to
indicate that some cognitive abilities drop around that concentration.</p>

<h4> Description </h4>

 <a href="https://weber.fi.eu.org/blog/images/CO2_Meter_int.jpg"><img src="https://weber.fi.eu.org/blog/images/CO2_Meter_int.thumbnail.jpg" width="200" height="150" class="align_left" alt="CO2_Meter_int"/></a>

<p class="story_para">The device itself is quite simple: it has an on/off switch and a single
two-color LED indicator, red and green. The yellow color is obtained by
turning on both green and red colors at the same time. It also has a small
hole where a paperclip can be inserted for triggering the calibration
procedure. The holes next to the power switch expose the CO<sub>2</sub> sensor
and its temperature/humidity sensor.</p>

<p class="story_para">Inside the box there is an Arduino-like
<a href="https://www.digitalsmarties.net/products/jeenode">Jeenode</a> I had lying around
with an <a href="https://www.digitalsmarties.net/products/aa-power-board">AA Power
board</a> (I have no
idea if these are still sold, I've had them around for over ten years). The
AA Power board is meant for a single AA battery, but it cannot provide enough
current, so I removed the battery clips and connected it to a 2-AA battery
holder, via the switch. It seems to be working well with two NiMH
rechargeable batteries.</p>

<p class="story_para">The CO<sub>2</sub> sensor is a <a href="https://www.sensirion.com/scd30/">Sensirion
SCD30</a>. It is quite expensive (about 50
EUR), but has an easy to use I2C interface and is the most accurate of the
sensors presented in the Make: article. The software is quite trivial (if you
except the calibration procedure, see below), and available
<a href="https://weber.fi.eu.org/software/arduino/co2_meter/">here</a>. The device
automatically makes a measurement ever two seconds, the program reads it and
updates the LED accordingly. That's it.</p>

<h4> Calibration </h4>

<p class="story_para">There is an automatic calibration procedure that requires to keep the sensor
powered for at least 7 days and put it in fresh (outdoors) air at least an
hour per day. This is not very practical given that I've estimated that the
batteries would last about 25&amp;nbsp;hours (20&amp;nbsp;mA for the ATmega, 17&amp;nbsp;mA for the
SCD30, 10&amp;nbsp;mA for the LED at 3.3&amp;nbsp;V, with maybe a 80% efficiency for the power
board with two 1900&amp;nbsp;mAh batteries at 2.4&amp;nbsp;V). There is however also the
possibility to expose the sensor to air with a known&amp;emsp;CO<sub>2</sub>
concentration and tell it the actual value it is measuring. It then uses this
value as a reference point for subsequent measurements. The device is
apparently sensitive to changes in shape (e.g. when subjected to mechanical
stress during transport) so as a portable device it probably needs to be
regularly re-calibrated.</p>

<p class="story_para">The calibration procedure is simple: place the device outdoors, wait about 2
minutes for it to settle, then introduce a paperclip into the hole and press
the button underneath it; the LED will be flashing red. The device will take
repeated measurements every 2 seconds, and when a succession of 10 measurements
is considered stable enough (i.e. the absolute value of the difference
between the first and last of those is at most 1, and the sum of the absolute
values of each measurement with its previous one is at most 10), it sets the
calibration value to 416&amp;nbsp;ppm (which seems to be about the average value in
2021). As the device is accurate to +/- 30&amp;nbsp;ppm, the exact value does not
matter so much. The device then returns to its normal operation mode, showing
a green, yellow or red light.</p>

<h4> What next? </h4>

<p class="story_para">Put a sticker on it with some indications about the LED colors and the reset
button hole.
</p>

]]></description>
  </item>
  <item>
    <title>Hot Sauce</title>
    <link>https://weber.fi.eu.org/blog/2021/09/30#hot_sauce</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2021/09/30#hot_sauce</guid>
    <pubDate>Thu, 30 Sep 2021 22:47:00 +0200</pubDate>
    <description><![CDATA[ <p class="story_para first">As I cannot find any Blair's Original Death Sauce in shops, I decided to
reverse-engineer it, from memory. This is the result.</p>

<h4>Ingredients</h4>

<ul>
<li>25&amp;nbsp;g carrot</li>
<li>11&amp;nbsp;g freshly grated garlic</li>
<li>3.5&amp;nbsp;g fresh coriander leaves</li>
<li>5&amp;nbsp;g mineral salt (Seltin)</li>
<li>1.5&amp;nbsp;g powdered paprika</li>
<li>0.2&amp;nbsp;g smoked paprika</li>
<li>4&amp;nbsp;g sugar</li>
<li>1.5&amp;nbsp;g powdered onion</li>
<li>0.5&amp;nbsp;g dried parsley</li>
<li>10&amp;nbsp;g tomato concentrate</li>
<li>15&amp;nbsp;mL lemon juice</li>
<li>150&amp;nbsp;mL Poppamies Habanero sauce (1 bottle)</li>
<li>water</li>
</ul>

<h4>Tools</h4>

<ul>
<li>1 very small saucepan and matching kitchen stove</li>
<li>1 0.1&amp;nbsp;g-precision scale</li>
<li>assorted measuring spoons (15&amp;nbsp;mL , 50&amp;nbsp;mL)</li>
<li>1 immersion blender</li>
<li>1 clean and empty habanero sauce bottle (or another container for the
  leftover sauce).</li>
<li>1 clean small funnel that fits into the bottle</li>
<li>1 electric kettle</li>
</ul>

<h4>Preparation</h4>

<p class="story_para">Chop the carrot finely, rinse and chop the coriander leaves.</p>

<p class="story_para">In a very small saucepan, boil 1/2&amp;nbsp;dL water and add the carrots. Let it boil,
then add the garlic, coriander, salt, paprika, smoked paprika, sugar, powdered
onion and dried parsley. Let boil until the carrots are soft, stirring from
time to time (keep an eye on it, it takes only a few minutes). If the water
evaporates too quickly, just add more water and let it boil again. Then add
the tomato concentrate, lemon juice and habanero sauce and boil once more.</p>

<p class="story_para">Blend the preparation with an immersion blender until smooth and set aside.</p>

<p class="story_para">Rinse the empty habanero sauce bottle, and preferably get a second bottle, as
there will be more than 150&amp;nbsp;mL sauce.</p>

<p class="story_para">Boil water in a kettle and use it immediately to fill the bottles and the
screw caps to sterilize them. Also pour some of that water in and outside of a
small funnel. Estimate the thickness of the sauce, add boiled water and
stir to make it thinner. I added 30&amp;nbsp;mL water, maybe 20&amp;nbsp;mL would have been
enough? Then empty the bottles (careful, they are hot) and pour the sauce into
them with the funnel. Put the screw caps and store in the refrigerator. I use
on such batch over several months, it seems to be keeping well.
</p>

]]></description>
  </item>
  <item>
    <title>OpenARC with Postfix on Debian 10 (buster)</title>
    <link>https://weber.fi.eu.org/blog/2021/04/11#openarc_with_postfix_on_debian_10</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2021/04/11#openarc_with_postfix_on_debian_10</guid>
    <pubDate>Sun, 11 Apr 2021 20:23:00 +0200</pubDate>
    <description><![CDATA[ <p class="story_para first">Gmail started to complain recently that the messages forwarded by the trivial
mailing-list hosted on my server did not pass the ARC validation. As Google
already considers e-mail coming from my domain as spam (but strangely, not the
emails forwarded by the mailing list on the same domain), I did not want to risk
to see my e-mail treated as even less worthy to be delivered to the Valued
Customers of Gmail (i.e., probably half the world) than it is now. And I wanted
to look into ARC anyway. But the installation is not trivial, there are no
official Debian packages, and no clear tutorial on the Web, so here's what I
did. It may work for you or not.</p>

<p class="story_para">This tutorial assumes you already have configured postfix with opendkim, and
they are running on a single computer on a Debian 10. The configuration example
expects postfix to run as chroot and uses the private key configured for
opendkim.</p>

<p class="story_para">All the following commands need to be run as root or through sudo.</p>

<h4>Install the package</h4>

Add an apt source by creating the file <code>/etc/apt/sources.list.d/openarc.list</code>
and write:
<pre>
deb https://download.opensuse.org/repositories/home%3A/andreasschulze/Debian_10 /
</pre>

Then run:
<pre>
curl https://download.opensuse.org/repositories/home:/andreasschulze/Debian_10/Release.key | apt-key add -
apt update
apt install openarc
</pre>

If you don't want to run <code>curl</code> as root, you can run that command instead:
<pre>
curl https://download.opensuse.org/repositories/home:/andreasschulze/Debian_10/Release.key | sudo apt-key add -
</pre>

This will install openarc 1.0.0&amp;nbsp;beta3-3, but the package's post-installation
script has a bug, so the installation fails. To fix it, edit
<code>/var/lib/dpkg/info/openarc.postinst</code> and comment-out line 62 which contains
<pre>
  ln -s ../../var/lib/supervise/openarc-milter /etc/service/
</pre>

<p class="story_para">Then run as root <code>apt install openarc</code> again.</p>

<h4>Configure OpenArc</h4>

<p class="story_para">Create <code>/etc/openarc/keys</code> and copy the key from opendkim (e.g.,
<code>/etc/opendkim/keys/example.private</code>) into <code>/etc/openarc/keys/</code>. Then copy
<code>/etc/opendkim/TrustedHosts</code> into <code>/etc/openarc/</code>.</p>

<p class="story_para">Create <code>/etc/openarc.conf</code> (or create one such file based on
<code>/usr/share/doc/openarc/openarc.conf.sample.gz</code>) and modify the following
directives (without the quotes around the values, of course):</p>

<ul>
<li>AuthservID:        the name of the server (e.g., &amp;ldquo;server.example.com&amp;rdquo;)</li>
<li>Canonicalization:  the value &amp;ldquo;relaxed/simple&amp;rdquo;</li>
<li>Domain:            the domain namd (e.g., &amp;ldquo;weber.fi.eu.org&amp;rdquo;)</li>
<li>FinalReceiver:     the value &amp;ldquo;no&amp;rdquo;</li>
<li>InternalHosts:     the value &amp;ldquo;/etc/openarc/TrustedHosts&amp;rdquo; (if there is a such a file)</li>
<li>KeyFile:           the path to the private key (e.g., &amp;ldquo;/etc/openarc/keys/example.private&amp;rdquo;)</li>
<li>OversignHeaders:   the value &amp;ldquo;From&amp;rdquo;</li>
<li>PidFile:           the value &amp;ldquo;/var/run/openarc.pid&amp;rdquo;</li>
<li>Selector:          the value of the opendkim selector (see <em>Selector</em> in opendkim.conf)</li>
<li>Socket:            the value &amp;ldquo;local:/var/spool/postfix/var/run/openarc/openarc.sock&amp;rdquo;</li>
<li>Syslog:            the value &amp;ldquo;Yes&amp;rdquo;</li>
</ul>

Create <code>/var/spool/postfix/var/run/openarc</code> that will contain the socket:
<pre>
mkdir /var/spool/postfix/var/run/openarc
chown openarc:openarc /var/spool/postfix/var/run/openarc
chmod 750 /var/spool/postfix/var/run/openarc
</pre>

Add the postfix user to the openarc group so that postfix can access the socket
(run as root):
<pre>
usermod -a -G openarc postfix
</pre>

Create a systemd service file <code>/etc/systemd/system/openarc.service</code> with the
following content:
<pre>
[Unit]
Description=OpenARC Authenticated Received Chain (ARC) Milter
Documentation=man:openarc(8) man:openarc.conf(5) https://openarc.org/
After=network.target nss-lookup.target·
&amp;nbsp;
[Service]
Type=forking
PIDFile=/var/run/openarc.pid
UMask=0002
ExecStart=/usr/sbin/openarc -c /etc/openarc.conf
Restart=on-failure
&amp;nbsp;
[Install]
WantedBy=multi-user.target
</pre>

<p class="story_para">The <code>UMask</code> directive is especially important, so that
<code>/var/spool/postfix/var/run/openarc/openarc.sock</code> is readable and writable by
the members of the <em>openarc</em> group (i.e., postfix). OpenDKIM has a <code>UMask</code>
directive, but OpenARC does not.</p>

You can now start the service with
<pre>
systemctl start openarc
</pre>

<h4>Configure postfix</h4>

Edit <code>/etc/postfix/main.cf</code> and add the socket to the <code>smtpd_milters</code> and
<code>non_smtpd_milters</code> lists (you may already have other milters configured, such
as OpenDKIM):
<pre>
smtpd_milters = unix:/var/run/opendkim/opendkim.sock,
                unix:/var/run/openarc/openarc.sock
&amp;nbsp;
non_smtpd_milters = unix:/var/run/opendkim/opendkim.sock,
                    unix:/var/run/openarc/openarc.sock
</pre>

Finally, restart postfix:
<pre>
systemctl restart postfix
</pre>

<p class="story_para">You can now test your OpenARC setup with the tools provided by
<a href="https://openarc.org/testing">openarc.org</a>.
</p>

]]></description>
  </item>
  <item>
    <title>Unpopular Ratings</title>
    <link>https://weber.fi.eu.org/blog/2020/12/01#unpopular_ratings</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2020/12/01#unpopular_ratings</guid>
    <pubDate>Tue, 01 Dec 2020 22:59:00 +0200</pubDate>
    <description><![CDATA[ <p class="story_para first">For quite a while, I've been wondering what to do with movies or games which
have been rated with a small number of people, such as the ones found on IMDb
or BoardGameGeek: users can give a 0 &amp;ndash; 10 rating to items, and the users'
average is then shown. Is an obscure movie rated 8 by 42 people actually worth
an 8?</p>

<p class="story_para">Putting aside the actual usefulness of those ratings, I wanted to know how
much uncertainty there is on those values, knowing only the arithmetic mean
and the number of people who have voted.</p>

<p class="story_para">Given population (i.e., all the users who have seen the film or played the
game and who could vote), when we take a sample (i.e., the users who have
rated the item) of size <em>n</em>, we get a sample mean <em>m</em>. But if another sample
had been taken, we would have gotten a slightly different sample mean. How
much much different would these two values be? In other words, how close is
this value from the value we would get if the whole population would have
rated the item?</p>

<p class="story_para">The <a href="https://en.wikipedia.org/wiki/Standard_error#Standard_error_of_the_mean">standard error of the mean</a>
indicates how much the sample mean <em>m</em> can vary by calculating its standard
deviation <em>s</em><sub>m</sub> = <em>s</em>/&amp;radic;n. The problem is that it is
based on the standard deviation <em>s</em> of the population, which is unknown. Given
that we do not know the users' individual ratings, we cannot either calculate
the standard deviation of the sample.</p>

<p class="story_para">All is not lost, however: since the ratings are always between 0 and 10, we can
estimate the maximum value of the standard deviation. My best guess is that
this value is maximal when half the ratings are 0 and the other half are 10,
leading to a standard deviation of 5.</p>

<p class="story_para">Given that the means of 96% of the samples of size <em>n</em> falls within
&amp;plusmn;2<em>s</em><sub>m</sub> of the population's mean, we know that the
mean of the population is very likely to be between
<em>m</em>&amp;minus;10&amp;radic;<em>n</em> (but no less than 0) and
<em>m</em>+10&amp;radic;<em>n</em> (but no more than 10). So this obscure movie
rated 8&amp;nbsp;by 42 users is worth between 6.5 and 9.5. Given that on IMDb movies
rated above about 7 are reasonably good, the obscure movie may be worth
watching.
</p>

]]></description>
  </item>
  <item>
    <title>Noursella v3</title>
    <link>https://weber.fi.eu.org/blog/2020/10/13#noursella_v3</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2020/10/13#noursella_v3</guid>
    <pubDate>Tue, 13 Oct 2020 15:29:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FChoco_Noursy%2Fnoursella_v3.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FChoco_Noursy%2Fnoursella_v3.html">Babelfish</a> ]</p> <p class="story_para first">Mise à jour du <a href="https://weber.fi.eu.org/blog/Cuisine/Choco_Noursy/noursella_v2.writeback">Noursella v2</a>
avec de la vanille et adaptée à de nouveaux ingrédients, disponibles en
Finlande.</p>

<h4>Ingrédients</h4>

<ul>
<li>56g chocolat noir (Pirkka luomu reilun kaupan tumma suklaa 72%)</li>
<li>250g pâte de noisette (100% noisette, Rapunzel Haselnussmus 100% Haselnüsse)</li>
<li>70g cacao en poudre (Callebaut Cocoa Powder CP-E0-776, 22/24% matière
  grasse)</li>
<li>110g sucre glace (Dan Sukker tomusokeri)</li>
<li>30g sucre vanillé (à base de sucre glace, Dan Sukker Vaniljasokeri)</li>
<li>20-30g huile végétale neutre (Apetit rypsiöljy)</li>
</ul>

<h4>Préparation</h4>

<p class="story_para">Faire fondre le chocolat (cassé en petits morceaux, 2&amp;nbsp;min au micro-ondes),
y mélanger la pâte de noisette (d'abord l'huile qui surnage, puis la partie
solide) jusqu'à obtenir un appareil homogène. Placer le cacao, le sucre glace
et le sucre vanillé dans un tamis à farine, et ajouter en plusieurs fois dans
le mélange chocolat-noisette, en mélangeant bien à chaque étape. Ajouter
finalement de l'huile en fonction de la texture souhaitée: 20g d'huile donne
une pâte plus difficile à tartiner sur une crêpe, 30g d'huile donne un pâte
plus liquide mais une petite partie de l'huile va remonter à la surface au
bout d'une semaine.</p>

<h4>Conservation</h4>

<p class="story_para">Dans un pot en verre (propre&amp;hellip;), plusieurs semaines dans un placard à
température ambiante.</p>

<h4>Des chiffres</h4>

<p class="story_para">Masse totale: 540g</p>

<ul>
<li>Lipides: 42g pour 100g</li>
<li>Glucides: 31g pour 100g (sucres: 30g pour 100g)</li>
<li>Protéines: 10g pour 100g</li>
<li>Fibres: 5.5g pour 100g</li>
</ul>

<p class="story_para">Prix: 16,42&amp;nbsp;EUR (30,41&amp;nbsp;EUR/kg)
</p>

]]></description>
  </item>
  <item>
    <title>Roll through the Dungeon</title>
    <link>https://weber.fi.eu.org/blog/2020/07/21#roll_through_the_dungeon</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2020/07/21#roll_through_the_dungeon</guid>
    <pubDate>Tue, 21 Jul 2020 12:40:00 +0200</pubDate>
    <description><![CDATA[ <p class="story_para first">A couple of months ago, I discovered <a href="https://www.boardgamegeek.com/boardgame/237031/d100-dungeon">D100
Dungeon</a>, a
free print-and-play (at least up to version 2.2) dungeon crawling game where
most aspects of the game are randomly generated by rolling dice. While it is
yet-another game where you walk into a room, kill the monster and loot the
treasure, I was especially enthusiastic about generating the dungeon's map
randomly (look at the pictures on BoardGameGeek, some people have taken the
time to even make very nice looking maps) I've played a few games before
feeling the itch to design such a game myself (game design is something that
has been itching every now and then, but without much result until now).</p>

<p class="story_para"><a href="https://weber.fi.eu.org/rttd/">Roll through the Dungeon</a> (RttD) is the result
of scratching that itch. The structure of the game is very much inspired by
D100&amp;nbsp;Dungeon, but I changed some of the mechanisms that I didn't like with
what I consider better ones.</p>

<p class="story_para">Inspired by the <a href="https://rpggeek.com/rpg/355/james-bond-007">James Bond 007</a>
role-playing game I played as a teenager in the early '90s, skill tests have
an associated success grade, indicating how well your character succeeds in
doing a given action. This success grade then determines how much time is
spent on doing the action, and in case of fights, how much damage is inflicted
to the opponent. This contrasts with D100&amp;nbsp;Dungeon's two-step fights, where the
skill test tells you whether you have hit the opponent, but an second,
unrelated roll determines the damage. I find it more intellectually
satisfactory that the damage depends on how successful the action has been,
rather than being an independent event, but I am aware it is nothing more than
a design decision and it does not model reality any better than the two-step
model. I'm particularly proud of the <a href="https://en.wikipedia.org/wiki/Nomogram">nomogram</a>
I have designed for computing the success grade, but I must admit that it is
actually not very practical (the table is much faster to use, as it does not
require manipulating a ruler). But I did it for fun, and that is the kind of
geeky stuff I consider fun :)</p>

<p class="story_para">Another important difference between D100&amp;nbsp;Dungeon and RttD is the construction
of the dungeon's map. The map is a grid of adjacent squares rooms, and in the
former game, a single D100 roll determines most of the characteristics in a
square: the three exits from the room (corridor, door or wall) and what you
find in it (a feature, a monster or nothing). This leads to paradoxical maps,
where on one side of a room is a door, but the same side seen from the
adjacent room is a solid wall. RttD solves this at the cost of more dice
rolls: room sides are determined by independent D10 rolls, and the room's
content is yet another roll. That means that you need to roll up to four D10
instead of one D100.</p>

<p class="story_para">Many design decisions from D100&amp;nbsp;Dungeon have become apparent when trying to
solve the same problems, and have led to the same solutions, reinforcing the
similarity between the two games: roll tables are ordered, with the
not-go-good stuff at the beginning of the table, and the best stuff at its
end. This way, it is possible to get better stuff in some circumstances by
offsetting the dice roll (i.e., adding 10 to the D100 roll). This is
especially important when searching the rooms: feature rooms may contain a
trap, so when searching a feature room, you add 5 to your roll to make it
impossible to find a second trap in the same room, as well as increasing
the chances to find better stuff.</p>

<p class="story_para">The hardest thing for me in working on this game has been (and still is) to
invent thematic elements, such as monsters, quests, room features, treasures.
I tried not to simply copy D100&amp;nbsp;Dungeon (partly because it's copyrighted, and
partly because I wanted to prove myself that I could do it), but it has been
really hard. Most monsters and features are coming straight from
the <a href="https://nethackwiki.com/">NetHack wiki</a>, monster HP and damage are
generated by a script to create a progression in the difficulty, but the
hardest has been (and still is) quests. Some are more or less direct
adaptations from the quests in D100&amp;nbsp;Dungeon, a few are from my own imagination
(especially in the <em>&amp;ldquo;Ridicule does not kill&amp;rdquo; they say</em> chapter), but the
list of quests is still incomplete (actually, it's the only thing that
justifies not releasing a version 1.0 of the game).</p>

<p class="story_para">I have now played about 25&amp;nbsp;games of RttD to test the game, fix the problems
and try and improve it. I'm a bit sad to say that the novelty is wearing off
and that the game feels quite repetitive (it is, by design). What has been the
most fun until now has been to use LaTeX again to produce the PDF booklet and
to develop macros for generating some parts of the tables and making
cross-references. It is nothing fancy, but as a software developer, it's the
kind of things I enjoy doing.</p>

<p class="story_para">I feel like running out of steam about RttD so I don't know how long I
will continue working on it; certainly I won't anymore spend several hours
daily as I have in the beginning. But as the game is released under Creative
Commons BY &amp;ndash; SA, anyone can work on it, write changes, and generally improve
it. The PDF booklet has a section about developing the game, if you are
interested. Among the things that are not implemented yet are curses and
blessings (which D100&amp;nbsp;Dungeon already has), I was considering making them more
like NetHacks curses i.e., items you find may be cursed and detrimental to
your character if worn or used.
</p>

]]></description>
  </item>
  <item>
    <title>Battery Capacity Meter</title>
    <link>https://weber.fi.eu.org/blog/2019/12/14#battery_capacity_meter</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2019/12/14#battery_capacity_meter</guid>
    <pubDate>Sat, 14 Dec 2019 17:08:00 +0200</pubDate>
    <description><![CDATA[ <p class="story_para first">I have over forty Ni-MH low self-discharge rechargeable batteries (mostly
Eneloops, and a few Vartas and GPs) and I have noticed that some of them tend
to not keep the charge very well. In order to find out which ones are worth
throwing away to be recycled, I needed a device that would measure their
capacity.</p>

<p class="story_para">The principle is very simple: recharge the battery, discharge it through a
resistor with a known value, measure the current while it discharges, and
integrate the current over time. This will give you the battery's capacity.
A few things need to be taken into account: how do you know that a battery is
depleted and what discharge current should be used? From what I could gather
by reading a few Web forums, the battery is considered to be depleted when its
voltage goes below 1.0&amp;nbsp;V or 0.9&amp;nbsp;V (I settled on 1.0 V), and the current should
be such that the battery discharges in about five hours (for a 2000&amp;nbsp;mAh battery,
that would be about 400&amp;nbsp;mA). If the current is too high, the battery's voltage
while it is discharging will be very close to 1.0&amp;nbsp;V already at the beginning
of the process and the capacity measurement will probably be biased. I noticed
this in the first iteration of the device where I had a 1&amp;nbsp;&amp;Omega; resistor and
a 1&amp;nbsp;A current, and decided to change for a 3.3&amp;nbsp;&amp;Omega; resistor after reading
about the &amp;ldquo;discharge in 5 hours&amp;rdquo; rule.</p>

<h4>The device</h4>

 <a href="https://weber.fi.eu.org/blog/images/battery_capacity_meter.jpg"><img src="https://weber.fi.eu.org/blog/images/battery_capacity_meter.thumbnail.jpg" width="200" height="105" class="align_left" alt="battery_capacity_meter"/></a>

<p class="story_para">The prototype I built is very simple. The battery discharges through a
3.3&amp;nbsp;&amp;Omega; &amp;plusmn;1% 0.6&amp;nbsp;W resistor, and the voltage is measured using the
Arduino's ADC (more on that below). A MOSFET (STMicroelectronics VNP35NV04-E,
quite expensive but it turns fully On with only 2.5&amp;nbsp;V<sub>GS</sub> and its On
resistance is only 13&amp;nbsp;m&amp;Omega;, which is below the tolerance of the main
resistor and the accuracy of what the Arduino can measure, so it can simply be
ignored) controls the discharge and cuts the current once the &amp;ldquo;depleted&amp;rdquo;
threshold has been reached to prevent damaging the battery. A 10&amp;nbsp;k&amp;Omega;
resistor acts as a pull-down for the MOSFET's gate, and a 110&amp;nbsp;&amp;Omega; limits
the gate current (whether it's really needed or not seems to depend whom you
ask on Web forums, but since I had some lying around I decided to use them).
There are two instances of the circuit on the prototype board, so I can test
two batteries in parallel.</p>

<h4>Accuracy of the Arduino's ADC</h4>

<p class="story_para">The Arduino's ADC has a maximum precision of 10&amp;nbsp;bits, meaning that the value
read from e.g., A0 is translated to a value between 0 and 1023 included, by
comparing A0 to a reference voltage that by default is the Arduino's supply
voltage. It is however possible to get (reasonably) accurate voltage
measurement with the Arduino (see this Web post titled
<a href="https://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/">Secret Arduino Voltmeter</a>)
by measuring first the supply voltage accurately against the ATMega328's internal
band-gap reference. To do so, you need to first measure the band-gap
reference's correct value (it's about 1.1&amp;nbsp;V, it's very stable over time and
temperature, but it's exact value differs from one ATMega328 to the next).</p>

<p class="story_para">The process therefore goes like this.</p>

<ol>
<li>With a trusted voltmeter, measure the Arduino's supply voltage
V<sub>CC</sub> as accurately as possible.</li>
<li>Using the code snippet in the blog post, measure the band-gap's value
with the ADC; that gives you a number N<sub>ref</sub>. For better accuracy,
compute the arithmetic mean of 1000 measurements to get rid of the random
fluctuations in the measurement.</li>
<li>Calculate V<sub>ref</sub> = N<sub>ref</sub>&amp;nbsp;&amp;times;&amp;nbsp;V<sub>cc</sub>&amp;nbsp;/&amp;nbsp;1024 (and not
1023 as stated in the blog post). In my case,
V<sub>ref</sub>&amp;nbsp;=&amp;nbsp;1.089&amp;nbsp;V&amp;nbsp;&amp;plusmn;0.001V.</li>
<li>Hardcode the V<sub>ref</sub> you have found in your Arduino program.</li>
</ol>

<p class="story_para">Then when you want to actually measure a voltage V with the Arduino's ADC, do
as follows.</p>

<ol>
<li>Measure N<sub>ref</sub> with the ADC and compute the value of
V<sub>cc</sub>&amp;nbsp;=&amp;nbsp;V<sub>ref</sub>&amp;nbsp;&amp;times;&amp;nbsp;1024&amp;nbsp;/&amp;nbsp;N<sub>ref</sub> (again, take the
average of 1000 measurements).</li>
<li>Measure N with the ADC and compute the value V&amp;nbsp;=&amp;nbsp;N&amp;nbsp;&amp;times;&amp;nbsp;V<sub>cc</sub>&amp;nbsp;/&amp;nbsp;1024
(once again, average over 1000 measurements).</li>
</ol>

<p class="story_para">If my uncertainty calculations are correct, I get a 0.12% uncertainty on the
value of V<sub>cc</sub> (compounding the uncertainty of the voltmeter and the
ADC), which is less than the 1% uncertainty on the discharge resistor value. I
tried to accurately measure the 3.3&amp;nbsp;&amp;Omega; resistor value, but my amperemeter
is not accurate enough for currents above 200&amp;nbsp;mA, so that's the best I can
hope to achieve.</p>

<p class="story_para">Take a look at the <a href="http://weber.fi.eu.org/software/arduino/battery_capacity_meter/">code</a>
if you want to know the details of the implementation (especially computing in
millivolts in order to use only integers instead of floats).</p>

<h4>What about those batteries, then?</h4>

<p class="story_para">I measured the capacity of 27 batteries so far: 2&amp;nbsp;GPs, 3&amp;nbsp;Vartas and
22&amp;nbsp;Eneloops (6 of generation 1, 7 of generation 2, 2 of generation 3 and 7 of
generation 4). All have a nominal capacity of 1900&amp;nbsp;mAh.</p>

<p class="story_para">Both GPs have a capacity of 1&amp;nbsp;mAh, so they are useful only as paperweights.
The Vartas have capacities of 870, 450 and 250&amp;nbsp;mAh, so they are only
marginally more useful than the GPs.</p>

<p class="story_para">One Eneloop is in really bad shape (200&amp;nbsp;mAh), but the others have capacities
between 1660 and 1900&amp;nbsp;mAh, with a mean of 1790&amp;nbsp;mAh.</p>

 <a href="https://weber.fi.eu.org/blog/images/eneloop-gen4-Q.png"><img src="https://weber.fi.eu.org/blog/images/eneloop-gen4-Q.thumbnail.png" width="200" height="150" class="align_left" alt="eneloop-gen4-Q"/></a>

<p class="story_para">This is a typical battery, in good shape (1890&amp;nbsp;mAh). The voltage quickly drops
to around 1.2&amp;nbsp;V and remains stable for a while before dropping again.</p>

<div class="clear"></div>

 <a href="https://weber.fi.eu.org/blog/images/eneloop-gen4-D.png"><img src="https://weber.fi.eu.org/blog/images/eneloop-gen4-D.thumbnail.png" width="200" height="150" class="align_left" alt="eneloop-gen4-D"/></a>

<p class="story_para">This one is definitely good for nothing (200&amp;nbsp;mAh). I remember accidentally
dropping batteries on the floor a couple of times in the past, maybe this one
suffered from it? </p>

<div class="clear"></div>

 <a href="https://weber.fi.eu.org/blog/images/eneloop-gen1-M.png"><img src="https://weber.fi.eu.org/blog/images/eneloop-gen1-M.thumbnail.png" width="200" height="150" class="align_left" alt="eneloop-gen1-M"/></a>

<p class="story_para">This one is a first generation eneloop, bought probably around 2011. It still
has a capacity of 1660&amp;nbsp;mAh, but the shape of the curve is different from the
typical one, maybe due to old age?
</p>

]]></description>
  </item>
  <item>
    <title>Bed Reading Lamp</title>
    <link>https://weber.fi.eu.org/blog/2019/11/21#bed_reading_lamp</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2019/11/21#bed_reading_lamp</guid>
    <pubDate>Thu, 21 Nov 2019 17:42:00 +0200</pubDate>
    <description><![CDATA[ <p class="story_para first">For quite a while I have been dreaming about a lamp for reading in bed that
would be equally usable when lying on my belly or sitting with my back on the
wall. It would be wide enough to uniformly light an open comic book (slightly
larger than an A3 paper sheet) without causing a glare on the paper, meaning
that it should light from above. Finally it must be made of a strip of warm
white LED, its brightness must be adjustable and must consume no power when
it's off.</p>

<p class="story_para">And because making things is fun, I wanted to make it myself. There it is.</p>

 <a href="https://weber.fi.eu.org/blog/images/Reading_lamp.jpg"><img src="https://weber.fi.eu.org/blog/images/Reading_lamp.thumbnail.jpg" alt="Reading_lamp"/></a>

<p class="story_para">It's made of 60&amp;nbsp;cm of LED strip glued on the inside of a 15&amp;times;15&amp;nbsp;mm
aluminium profile, and it's powered by a 12&amp;nbsp;V, 500&amp;nbsp;mA power supply, via a
dimmer (that has also silly features like strobe effect, blinking and
pulsating, but that's no good for reading). The power supply is connected to
the mains via a wire equipped with a switch (that effectively cuts the power
to the power supply when it's off).</p>

<p class="story_para"> <a href="https://weber.fi.eu.org/blog/images/Reading_lamp_wiring.jpg"><img src="https://weber.fi.eu.org/blog/images/Reading_lamp_wiring.thumbnail.jpg" alt="Reading_lamp_wiring"/></a>  <a href="https://weber.fi.eu.org/blog/images/Reading_lamp_wiring_inside.jpg"><img src="https://weber.fi.eu.org/blog/images/Reading_lamp_wiring_inside.thumbnail.jpg" alt="Reading_lamp_wiring_inside"/></a></p>

<p class="story_para">To meet the requirement of reading in two different positions, the angle of
the aluminium profile can be changed by rocking it. I had to solder thinner
wires to the LED&amp;nbsp;strip to prevent it from acting like a spring and holding the
lamp back when rocking it.</p>

<p class="story_para"> <a href="https://weber.fi.eu.org/blog/images/Reading_lamp_position_A.jpg"><img src="https://weber.fi.eu.org/blog/images/Reading_lamp_position_A.thumbnail.jpg" alt="Reading_lamp_position_A"/></a>  <a href="https://weber.fi.eu.org/blog/images/Reading_lamp_position_B.jpg"><img src="https://weber.fi.eu.org/blog/images/Reading_lamp_position_B.thumbnail.jpg" alt="Reading_lamp_position_B"/></a>
</p>

]]></description>
  </item>
  <item>
    <title>Week numbers</title>
    <link>https://weber.fi.eu.org/blog/2019/09/30#week_numbers</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2019/09/30#week_numbers</guid>
    <pubDate>Mon, 30 Sep 2019 18:13:00 +0200</pubDate>
    <description><![CDATA[ <p class="story_para first">Given a week number, it's not easy to know when it is located in the
calendar. And to add to the confusion, there are three definitions of the week
number (ISO-8601; Middle Eastern; North-American and Islamic). The EU and most
European countries use the ISO-8601 definition, according to
<a href="https://en.wikipedia.org/wiki/Week#Week_numbering">Wikipedia</a>.</p>

<p class="story_para">The following method is quite approximative so the actual definition does not
matter so much, but it should help placing a week number in the calendar
without having to look it up:</p>

<ol>
<li>Divide by 4</li>
<li>Subtract 10%</li>
<li>Add 1</li>
</ol>

<p class="story_para">The integer part (before the decimal separator) of the result is the number of
the month, and the fractional part (after the decimal separator) times three
tells you near what day of the month it is located.</p>

<p class="story_para">For example:</p>

<ul>
<li>Week 1: 1/4 is 0.25, minus 10% is about 0.2, plus 1 is 1.2; 2 times 3 is 6:
it's around January 6th (Jan. 1-5, 2019 actually).</li>
<li>Week 7: 7/4 is 1.75, minus 10% is about 1.6, plus 1 is 2.6; 6 times 3
is 18: it's around February 18th (Feb. 10-16, 2019 actually).</li>
<li>Week 14: 14/4 is 3.5, minus 10% is about 3.2, plus 1 is 4.2; 2 times 3
is 6: it's around April 6th (Mar. 31-Apr. 6, 2019 actually).</li>
<li>Week 42: 42/4 is 10.5, minus 10% is about 9.5, plus 1 is 10.5; 5 times
3 is 15: it's around October 15th (Oct. 13-19, 2019 actually).</li>
<li>Week 35: 35/4 is 8.75, minus 10% is about 7.9, plus 1 is 8.9; 9
times 3 is 27: it's around August 27th (Aug. 25-31, 2019 actually).</li>
<li>Week 52: 52/4 is 13, minus 10% is about 11.7, plus 1 is 12.7; 7 times 3
is 21: it's around December 21st (Dec. 22-28, 2019 actually).</li>
</ul>

]]></description>
  </item>
  <item>
    <title>Optique photo 7 : conclusion</title>
    <link>https://weber.fi.eu.org/blog/2019/09/30#optique_photo_7_conclusion</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2019/09/30#optique_photo_7_conclusion</guid>
    <pubDate>Mon, 30 Sep 2019 08:30:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FScience%2Foptique_photo_7_conclusion.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FScience%2Foptique_photo_7_conclusion.html">Babelfish</a> ]</p> <p class="story_para first">Suite à des discussion sur la distance focale équivalente d'un objectif monté
sur des appareil photo numériques équipés de capteurs de différentes tailles
et sur des notions exotiques comme l'ouverture équivalent et la sensibilité
équivalente évoquées par Richard Butler sur dpreview.com, je me suis penché
sur la question de la pertinence de ces concepts. Les articles suivants
publiés précédemment sur mon blog présentent les résultats de mes réflexions.</p>

<ol>
<li><a href="https://weber.fi.eu.org/blog/Science/optique_photo_1_angle_de_champ.writeback">L'angle de champ</a></li>
<li><a href="https://weber.fi.eu.org/blog/Science/optique_photo_2_profondeur_de_champ.writeback">La profondeur de champ</a></li>
<li><a href="https://weber.fi.eu.org/blog/Science/optique_photo_3_perspective.writeback">La perspective</a></li>
<li><a href="https://weber.fi.eu.org/blog/Science/optique_photo_4_sensibilite.writeback">La sensibilité</a></li>
<li><a href="https://weber.fi.eu.org/blog/Science/optique_photo_5_temps_de_pose.writeback">Le temps de pose</a></li>
<li><a href="https://weber.fi.eu.org/blog/Science/optique_photo_6_affichage.writeback">L'affichage</a> d'une photo</li>
</ol>

<p class="story_para">Je ne m'intéresse à la photo que sous l'angle de l'optique, et comme je ne
suis pas photographe pour deux sous, j'ai peut-être écrit des énormités&amp;nbsp;; si
c'est le cas, on peut poster des commentaires sous les articles et tenter de
me convaincre que je me suis trompé.</p>

<h4>Caractériser une photo</h4>

<p class="story_para">Une photo est souvent caractérisée par le modèle d'appareil ayant servi, ainsi
que par la distance focale de l'objectif utilisé, le nombre d'ouverture et le
temps de pose. Étant donné la confusion créée par la notion de distance focale
équivalente, je me suis demandé si la distance focale était vraiment pertinente
pour caractériser une photo. Mais caractériser quoi, exactement&amp;nbsp;? Et
caractériser dans quel but&amp;nbsp;?</p>

<p class="story_para">Je fais l'hypothèse que caractériser une photo sert à reproduire la photo,
autant que possible à l'identique, avec le même appareil ou avec un autre
appareil. Ce qu'on peut chercher alors à reproduire c'est l'angle de champ,
les distances limites de la profondeur de champ (c'est à dire la distance du
premier plan net et du dernier plan net) et le cas échéant un effet voulu de
sur- ou sous-exposition, ou de flou de mouvement. On peut décrire ces
caractéristiques par des paramètres ayant davantage de sens que le trio
focale, diaphragme et temps de pose&amp;nbsp;?</p>

<p class="story_para">L'angle de champ est une combinaison de la distance focale et la taille du
capteur, donc indiquer seulement la distance focale en laissant le soin au
lecteur de deviner la taille du capteur en fonction du modèle de l'appareil
est possible, mais on peut faire mieux en indiquant directement la valeur de
l'angle de champ au moment de la prise de vue. Il est ensuite possible de
recréer cet angle de champ avec n'importe quelle combinaison judicieuse de
capteur et d'objectif.</p>

<p class="story_para">De même, la profondeur de champ dépend de la distance focale, de
l'ouverture du diaphragme, de la taille des pixels du capteur et de la
distance de mise au point. Au lieu de détailler les trois premières valeurs,
on peut les combiner sous la forme de la distance hyperfocale. Les distances
des premier et dernier plans nets sont alors deux fonctions simples de la
distance de mise au point et de la distance hyperfocale. Reproduire la
profondeur de champ devient alors simplement une question de prendre la
même distance hyperfocale et de faire la mise au point sur la distance donnée.</p>

<p class="story_para">Si le photographe ne cherche pas d'effet d'exposition particulier, la
sensibilité du capteur est une fonction des autres paramètres pour une
valeur d'exposition idéale, standard. En revanche si la photo a été
volontairement sur- ou sous-exposée, il faut indiquer la sensibilité utilisée
au moment de la prise de vue.</p>

<p class="story_para">Le flou de mouvement enfin est particulier car il dépend du temps, et le temps
de pose est le seul paramètre qui en dépende également. Dans de cas d'une
exposition standard, le temps de pose a une valeur minimale qui dépend de
la distance focale, et on peut supposer que cette valeur sera choisie car elle
permet d'utiliser la sensibilité la plus faible possible et ainsi réduire le
bruit. En revanche si un flou de mouvement est voulu par le photographe, ou au
contraire si l'objet se déplace rapidement et que le but est de le &amp;laquo;&amp;nbsp;figer&amp;nbsp;&amp;raquo;,
il faut alors indiquer le temps de pose.</p>

<p class="story_para">En conclusion, au lieu de caractériser une photo par le modèle d'appareil,
la distance focale, le nombre d'ouverture et éventuellement le temps de pose
et la sensibilité, on peut caractériser une image de manière plus générique et
descriptive en indiquant l'angle de champ, la distance hyperfocale, la
distance de mise au point et éventuellement la sensibilité et le temps de
pose. Bien que ces nouvelles caractéristiques soient moins connues que celles
utilisées jusqu'à présent, calculer leurs valeurs ne pose pas de problème
aux appareils photos numériques et pourraient donc être incluses dans les
métadonnées des images. Et je suis certain que la signification des
caractéristiques &amp;laquo;&amp;nbsp;classiques&amp;nbsp;&amp;raquo; n'est pas mieux comprise par la plupart des
photographes que les caractéristiques proposées ici, remplacer en ensemble de
valeurs hermétique par un autre ensemble de valeurs hermétiques ne devrait donc
pas poser de problème une fois vaincue la résistance naturelle de l'être
humain au changement.</p>

<h4>Applications numériques</h4>

<p class="story_para">Pour se faire une idée des valeurs numériques des caractéristiques décrites
plus haut, voici des applications numériques de diverses formules pour trois
appareils photos de référence&amp;nbsp;: un compact, un boitier APS-C et un plein
format avec 3 objectifs.</p>

<h5>Appareils photo de référence</h5>

<table class="borders">
<tr>
<th>Appareil</th>
<th>Pixels</th>
<th>Capteur</th>
<th>Objectifs</th>
</tr>
<tr>
<th>A</th>
<td>21,1&amp;nbsp;Mpix</td>
<td>6,17&amp;times;4,55&amp;nbsp;mm<br>(1/2,3)</td>
<td>4,3-172,0&amp;nbsp;mm, f/3,3-f/6,9</td>
</tr>
<tr>
<th>B</th>
<td>25,0&amp;nbsp;Mpix</td>
<td>23,5&amp;times;15,6&amp;nbsp;mm<br>(APS-C)</td>
<td>16&amp;nbsp;mm, f/2,8&amp;nbsp;;<br>18-135&amp;nbsp;mm, f3,5-5,6</td>
</tr>
<tr>
<th>C</th>
<td>27,1&amp;nbsp;Mpix</td>
<td>36&amp;times;24&amp;nbsp;mm<br>(plein format)</td>
<td>16-35&amp;nbsp;mm, f/4&amp;nbsp;;<br>35-70mm, f/2,8;<br>70-200mm, f/2,8</td>
</tr>
</table>

<h5>Dimensions d'un pixel</h5>

<table class="borders">
<tr>
<th>Appareil</th>
<th>&amp;epsilon;</th>
<th>Surface</th>
<th>Densité</th>
</tr>
<tr>
<th>A</th>
<td>1,15&amp;nbsp;&amp;mu;m</td>
<td>1,33&amp;nbsp;pm<sup>2</sup></td>
<td>752&amp;nbsp;000&amp;nbsp;px/mm<sup>2</sup></td>
</tr>
<tr>
<th>B</th>
<td>3,83&amp;nbsp;&amp;mu;m</td>
<td>14,7&amp;nbsp;pm<sup>2</sup></td>
<td>68&amp;nbsp;200&amp;nbsp;px/mm<sup>2</sup></td>
</tr>
<tr>
<th>C</th>
<td>5,65&amp;nbsp;&amp;mu;m</td>
<td>31,9&amp;nbsp;pm<sup>2</sup></td>
<td>31&amp;nbsp;400&amp;nbsp;px/mm<sup>2</sup></td>
</tr>
</table>

<h5>Angles de champ</h5>

<table class="borders">
<tr>
<th>Appareil</th>
<th>&amp;theta; (rad)</th>
<th>&amp;theta; (°)</th>
</tr>
<tr>
<th>A</th>
<td>1,45-0,446</td>
<td>83-2,55</td>
</tr>
<tr>
<th>B</th>
<td>1,45<br>1,33-0,208&amp;nbsp;</td>
<td>83<br>76,2-11,9</td>
</tr>
<tr>
<th>C</th>
<td>1,86-1,11<br>1,11-0,599<br>0,599-0,215</td>
<td>107-63,4<br>63,4-34,4<br>34,4-12,4</td>
</tr>
</table>

<h5>Distances hyperfocales</h5>

<table class="borders">
<tr>
<th>Appareil</th>
<th>F (m)</th>
<th>f/N (mm)</th>
</tr>
<tr>
<th>A</th>
<td>2,01-3730</td>
<td>4,3/8-172/6,9</td>
</tr>
<tr>
<th>B</th>
<td>3,04-23,9<br>3,85-850</td>
<td>16/22-16/2,8<br>18/22-135/5.6</td>
</tr>
<tr>
<th>C</th>
<td>2,06-54,2<br>9,86-310<br>39,4-2530</td>
<td>16/22-35/4<br>35/22-70/2,8<br>70/22-200/2,8</td>
</tr>
</table>

<h5>Sensibilité</h5>

<p class="story_para">En admettant que les capteurs des appareils A, B et C ne diffèrent que par la
taille de leurs pixels (ce qui est loin d'être évident) et en fixant un niveau
de bruit à ne pas dépasser dans l'image obtenue, on peut comparer leur
&amp;laquo;&amp;nbsp;sensibilités&amp;nbsp;&amp;raquo; relatives.</p>

<ul>
<li>A est 11 fois moins sensible que B et 24 fois moins sensible que C.</li>
<li>B est 11 fois plus sensible que B et 2,2 fois moins sensible que C.</li>
<li>C est 24 fois plus sensible que A et 2,2 fois plus sensible que B.</li>
</ul>

<p class="story_para">On peut aussi comparer, à distance focale et temps de pose égaux, de combien
de crans il faut ouvrir ou fermer le diaphragme pour obtenir la même
exposition et le même niveau de bruit.</p>

<ul>
<li>A doit ouvrir de 3,5 crans par rapport à B et de 4,6 crans par rapport à C.</li>
<li>B doit fermer de 3,5 crans par rapport A et ouvrir de 1,1 crans par rapport
à C.</li>
<li>C doit fermer de 4,6 crans par rapport à A et de 1,1 crans par rapport à B.</li>
</ul>

<h5>Affichage</h5>

<ul>
<li>Moniteur 16:10 24" FullHD&amp;nbsp;:  2,30&amp;nbsp;Mpx&amp;nbsp;; taille d'un pixel&amp;nbsp;: 405&amp;nbsp;&amp;mu;m</li>
<li>Moniteur 16:9 32" 4k&amp;nbsp;:       8,29&amp;nbsp;Mpx&amp;nbsp;; taille d'un pixel&amp;nbsp;: 265&amp;nbsp;&amp;mu;m</li>
<li>Moniteur 16:9 27" 5k&amp;nbsp;:       14,8&amp;nbsp;Mpx&amp;nbsp;; taille d'un pixel&amp;nbsp;: 167&amp;nbsp;&amp;mu;m</li>
<li>Télévision 16:9 40" FullHD&amp;nbsp;: 2,07&amp;nbsp;Mpx&amp;nbsp;; taille d'un pixel&amp;nbsp;: 661&amp;nbsp;&amp;mu;m</li>
<li>Télévision 16:9 55" 4k&amp;nbsp;:     8,29&amp;nbsp;Mpx&amp;nbsp;; taille d'un pixel&amp;nbsp;: 455&amp;nbsp;&amp;mu;m</li>
<li>Télévision 16:9 85" 8k&amp;nbsp;;     33,2&amp;nbsp;Mpx&amp;nbsp;; taille d'un pixel&amp;nbsp;: 351&amp;nbsp;&amp;mu;m</li>
</ul>

<ul>
<li>Impression papier à 300&amp;nbsp;dpi&amp;nbsp;:taille d'un pixel&amp;nbsp;: 84,7&amp;nbsp;&amp;mu;m</li>
<li>Impression à 300&amp;nbsp;dpi en 10&amp;times;13&amp;nbsp;cm&amp;nbsp;: 1,81&amp;nbsp;Mpix</li>
<li>Impression à 300&amp;nbsp;dpi en 10&amp;times;15&amp;nbsp;cm&amp;nbsp;: 2,09&amp;nbsp;Mpix</li>
<li>Impression à 300&amp;nbsp;dpi en 20&amp;times;30&amp;nbsp;cm&amp;nbsp;: 8,37&amp;nbsp;Mpix</li>
<li>Impression à 300&amp;nbsp;dpi en 40&amp;times;60&amp;nbsp;cm&amp;nbsp;: 33,5&amp;nbsp;Mpix</li>
<li>Impression à 300&amp;nbsp;dpi en 76&amp;times;115&amp;nbsp;cm&amp;nbsp;: 122&amp;nbsp;Mpix</li>
</ul>

]]></description>
  </item>
  <item>
    <title>Optique photo 6 : l'affichage</title>
    <link>https://weber.fi.eu.org/blog/2019/09/20#optique_photo_6_affichage</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2019/09/20#optique_photo_6_affichage</guid>
    <pubDate>Fri, 20 Sep 2019 13:06:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FScience%2Foptique_photo_6_affichage.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FScience%2Foptique_photo_6_affichage.html">Babelfish</a> ]</p> <h4>Taille d'un point d'affichage</h4>

<p class="story_para first">La notion de flou qui est importante pour la
<a href="https://weber.fi.eu.org/blog/Science/optique_photo_2_profondeur_de_champ.writeback">profondeur de champ</a> et le
<a href="https://weber.fi.eu.org/blog/Science/optique_photo_5_temps_de_pose.writeback">flou de bougé</a> ne dépend
pas tant de la taille des pixels du capteur que de la taille des pixels au
moment de l'affichage, que ce soit sur un écran ou sur un support physique
comme le papier. En effet, utiliser la taille d'un pixel comme taille maximale
&amp;epsilon; d'une tache de flou donne une garantie que le flou n'est pas
perçu par le capteur et donc n'est pas enregistré dans l'image, mais puisque
l'image est destinée à être regardée par un humain, ce qui importe <em>in fine</em>
c'est la capacité de l'humain à percevoir le flou. On peut donc définir
une nouvelle valeur de &amp;epsilon; utilisé dans les calculs de profondeur de
champ et de bougé en fonction de la manière d'afficher l'image.</p>

<p class="story_para">Pour un affichage sur écran, on peut calculer la taille d'un pixel &amp;epsilon;
(en mètres) en fonction de la diagonale D (en pouces), du format R (par
exemple 16/9) et du nombre de pixels par ligne n:</p>

<pre>&amp;epsilon; = 0,0254&amp;nbsp;&amp;times;&amp;nbsp;D&amp;radic;(1&amp;nbsp;+&amp;nbsp;1&amp;nbsp;/&amp;nbsp;R)&amp;nbsp;/&amp;nbsp;n</pre>

<p class="story_para">Pour un affichage sur papier, on peut calculer la taille d'un point &amp;epsilon;
(en mètres) en fonction de la définition de l'impression d (en points par
pouce, dpi):</p>

<pre>&amp;epsilon; = 0.0254 / d</pre>

<h4>Agrandissement maximal</h4>

<p class="story_para">Pour éviter les effets de crénelage lors de l'affichage, il faut aussi veiller
à ne pas afficher l'image à une trop grande taille par rapport à la résolution
de l'image numérique. En d'autres termes, le nombre de pixels N de l'affichage
ne doit pas être plus grand que le nombre de pixels de l'image (c'est à dire
du capteur si on ne retaille pas l'image). On suppose ici que l'intégralité de
l'image est affichée sur l'écran ou le papier, c'est à dire qu'on ne va pas
zoomer dans l'image.</p>

<p class="story_para">Pour un écran, le nombre de pixels N vaut</p>

<pre>N = n<sup>2</sup>&amp;nbsp;/&amp;nbsp;R</pre>

<p class="story_para">Pour un tirage papier de densité d points par pouce, N vaut</p>

<pre>N = 0,155&amp;nbsp;&amp;times;&amp;nbsp;l<sup>2</sup>d<sup>2</sup>&amp;nbsp;/&amp;nbsp;R</pre>

<p class="story_para">où l est la largeur du papier et R est le rapport largeur sur hauteur.</p>

<p class="story_para">On peut aussi calculer N en fonction de la largeur l et la hauteur h du
papier&amp;nbsp;:</p>

<pre>N = 0,155&amp;nbsp;&amp;times;&amp;nbsp;lhd<sup>2</sup></pre>


]]></description>
  </item>
  <item>
    <title>Optique photo 5 : le temps de pose</title>
    <link>https://weber.fi.eu.org/blog/2019/09/16#optique_photo_5_temps_de_pose</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2019/09/16#optique_photo_5_temps_de_pose</guid>
    <pubDate>Mon, 16 Sep 2019 21:22:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FScience%2Foptique_photo_5_temps_de_pose.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FScience%2Foptique_photo_5_temps_de_pose.html">Babelfish</a> ]</p> <h4>Exposition et temps de pose</h4>

<p class="story_para first">Du point de vue pratique, l'exposition d'une photo dépend du nombre
d'ouverture du diaphragme, de la <a href="https://weber.fi.eu.org/blog/Science/optique_photo_4_sensibilite.writeback">sensibilité du capteur</a>
et du temps de pose. On peut comprendre cette exposition comme la quantité de
lumière nécessaire pour que chaque pixel du capteur CCD reçoive suffisamment
de photons pour produire une valeur &amp;laquo;&amp;nbsp;raisonnable&amp;nbsp;&amp;raquo; de ce pixel. On a alors le
choix d'exposer ces pixels à un flot de lumière important pendant un temps
court, ou au contraire un flot de lumière plus faible pendant un temps plus
long pour recevoir le même nombre de photons, et donc obtenir le même
résultat.</p>

<p class="story_para">Plus formellement, l'<a href="https://fr.wikipedia.org/wiki/Exposition_lumineuse">exposition lumineuse</a>
H est définie par H&amp;nbsp;=&amp;nbsp;Et, où E est l'éclairement lumineux c'est à dire le flot
de lumière et t est le temps de pose.</p>

 <a href="https://weber.fi.eu.org/blog/images/optique_photo_1.png"><img src="https://weber.fi.eu.org/blog/images/optique_photo_1.thumbnail.png" width="200" height="63" class="align_left" alt="optique_photo_1"/></a>

<p class="story_para">En faisant l'hypothèse d'un système idéal d'une lentille mince parfaitement
transparente uniformément éclairée par l'objet photographié, on peut
<a href="https://fr.wikipedia.org/wiki/Ouverture_(photographie)#R%C3%A9gulation_de_l'exposition">définir</a>
l'éclairement lumineux comme E&amp;nbsp;=&amp;nbsp;L&amp;pi;&amp;nbsp;/&amp;nbsp;(4(N&amp;nbsp;/&amp;nbsp;(1&amp;nbsp;-&amp;nbsp;f&amp;nbsp;/&amp;nbsp;l))<sup>2</sup>) où L
est la <a href="https://fr.wikipedia.org/wiki/Luminance">luminance</a> de l'objet, f est
la distance focale de l'objectif, l est la distance de l'objet et N est le
nombre d'ouverture du diaphragme. Dans le cas courant où la distance focale
est négligeable par rapport à la distance à l'objet, on peut simplifier cette
définition en E&amp;nbsp;=&amp;nbsp;L&amp;pi;&amp;nbsp;/&amp;nbsp;(4N<sup>2</sup>).</p>

<p class="story_para">Par ailleurs, la <a href="https://fr.wikipedia.org/wiki/Sensibilit%C3%A9_ISO">sensibilité</a>
est définie par S = H<sub>0</sub>&amp;nbsp;/&amp;nbsp;H où H<sub>0</sub> est une valeur
d'exposition de référence, constante. En considérant que la luminance de
l'objet est elle aussi constante, on obtient la relation</p>

<pre>St&amp;nbsp;/&amp;nbsp;N<sup>2</sup> = 4H<sub>0</sub>&amp;nbsp;/&amp;nbsp;(L&amp;pi;)</pre>

<p class="story_para">qui indique bien que si l'un des trois paramètres N, S ou t varie alors l'un
au moins des deux autres paramètres doit varier pour que l'égalité soit
toujours vérifiée.</p>

<h4>Flou et temps de pose</h4>

<p class="story_para">Si le sujet ou l'appareil photo se déplacent pendant la prise de vue, on
comprend aisément qu'un point de l'objet donne une image qui se déplace sur le
capteur, qui enregistre alors plusieurs points contigus.</p>

<p class="story_para">Parmi tous les mouvements possibles de l'appareil photo qui conduisent à un
flou de bougé, un mouvement simple à modéliser est une rotation de l'appareil
photo autour du centre optique O. On considère que durant la prise de vue, le
point A s'est déplacé en B, et que le temps de pose est assez long pour que le
capteur enregistre toutes les positions prises par ce point entre A' et B'.
L'image du point, au lieu d'être un point, est alors un trait de longueur h'.
On peut exprimer <a href="https://weber.fi.eu.org/blog/Science/optique_photo_1_angle_de_champ.writeback">h' en fonction de &amp;theta;</a></p>

<pre>h' = tan(&amp;theta;)lf/(l-f)</pre>

<p class="story_para">Lorsque la distance focale f est négligeable devant l et que &amp;theta; est
inférieur à 0.5 radians (soit 29°, ce qui fait que l'erreur d'approximation de
tan(&amp;theta;) est inférieure à 10%), on peut simplifier en</p>

<pre>h' = f&amp;theta;</pre>

<p class="story_para">En considérant que l'angle &amp;theta; est le résultat d'une rotation de vitesse
angulaire &amp;omega; durant un temps t, c'est-à-dire &amp;theta;&amp;nbsp;=&amp;nbsp;&amp;omega;t on peut
écrire</p>

<pre>h' = f&amp;omega;t</pre>

<p class="story_para">En notant &amp;epsilon; la hauteur d'un pixel et en reprenant l'hypothèse que le
flou est <a href="https://weber.fi.eu.org/blog/Science/optique_photo_2_profondeur_de_champ.writeback">invisible</a>
si la taille h' de la &amp;laquo;&amp;nbsp;tache&amp;nbsp;&amp;raquo; de flou est plus petite qu'un pixel, on peut
écrire que le flou de bougé est invisible si</p>

<pre>t < &amp;epsilon;/(f&amp;omega;)</pre>

<p class="story_para">On retrouve ici l'approximation dite &amp;laquo;&amp;nbsp;de l'inverse de la focale&amp;nbsp;&amp;raquo;, à savoir
que pour éviter le flou de bouger, </p>

<blockquote>

<p class="story_para">&amp;laquo;&amp;nbsp;le temps de pose minimum a la même valeur
numérique que l'inverse de la distance focale exprimée en millimètres.&amp;nbsp;&amp;raquo;</p>

</blockquote>

<p class="story_para"> Cette
approximation suppose que
&amp;epsilon;/&amp;omega;&amp;nbsp;=&amp;nbsp;1/1000&amp;nbsp;m&amp;middot;s&amp;middot;rad<sup>-1</sup>. On peut
supposer que pour un photographe moyen, la vitesse &amp;omega; de ses mouvements
involontaires est constante, mais on voit que cette approximation dépend
directement de la taille &amp;epsilon; d'un pixel qui peut beaucoup varier d'un
capteur à l'autre.
</p>

]]></description>
  </item>
  <item>
    <title>Optique photo 4 : la sensibilité</title>
    <link>https://weber.fi.eu.org/blog/2019/09/15#optique_photo_4_sensibilite</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2019/09/15#optique_photo_4_sensibilite</guid>
    <pubDate>Sun, 15 Sep 2019 17:22:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FScience%2Foptique_photo_4_sensibilite.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FScience%2Foptique_photo_4_sensibilite.html">Babelfish</a> ]</p> <h4>Le bruit</h4>

<p class="story_para first">Chaque pixel d'un <a href="https://fr.wikipedia.org/wiki/Capteur_photographique">capteur CCD</a>
d'appareil photo numérique est un transducteur qui transforme une quantité de
lumière reçue Q en une différence de potentiel électrique u<sub>0</sub> qui
est proportionnelle à Q selon un facteur f&amp;nbsp;:</p>

<pre>u<sub>0</sub> = fQ</pre>

<p class="story_para">Dans un situation idéale, une valeur donnée de Q devrait donner
systématiquement la même valeur nominale u<sub>0</sub>. En réalité, à cause du
<a href="https://fr.wikipedia.org/wiki/Bruit_num%C3%A9rique">bruit</a>, des mesures
répétées d'une même valeur d'exposition donneront des valeurs différentes de u</p>

<pre>u = u<sub>0</sub> + &amp;epsilon;</pre>

<p class="story_para">où &amp;epsilon; est une erreur de mesure aléatoire. Cela signifie que chaque
mesure répétée de u aura une valeur différente de &amp;epsilon;, mais aussi que
deux pixels voisins qui sont exposés de la même manière donneront des valeurs
de u différentes.</p>

<p class="story_para">Si on considère qui le bruit est un <a href="https://fr.wikipedia.org/wiki/bruit_blanc">bruit blanc</a> (ce qui est
probablement faux mais suffisamment similaire à la réalité pour être utile à
cette explication), alors les valeurs de &amp;epsilon; sont couramment proches de
zéro (et donc u est proche de u<sub>0</sub>), mais &amp;epsilon; peut parfois,
plus rarement, être nettement plus grand que zéro et donc la valeur de u est
nettement différente de u<sub>0</sub>.</p>

<h4>La sensibilité d'un capteur numérique</h4>

<p class="story_para">Les valeurs typiques de u sont très petites et il est donc nécessaire de les
amplifier avant de les numériser. Ainsi une valeur v de pixel (typiquement entre
0 pour la valeur la plus sombre et 255 pour la valeur la plus lumineuse) est
obtenue en effectuant</p>

<pre>v = Au si Au &amp;le; v<sub>max</sub>
v = v<sub>max</sub> si Au > v<sub>max</sub></pre>

<p class="story_para">où A est le facteur d'amplification. Comme la valeur de v ne peut dépasser
v<sub>max</sub>, on comprend que si l'amplification A choisie est trop élevé
par rapport à u, l'intervalle de valeurs possibles pour un pixel n'est pas
suffisant pour représenter la valeur correcte de ce pixel, et on arrive à la
saturation.</p>

<p class="story_para">En faisant varier A, on peut faire varier la &amp;laquo;&amp;nbsp;sensibilité&amp;nbsp;&amp;raquo; du capteur et
obtenir des valeurs élevées de v (donc un pixel très lumineux) à partir d'une
valeur faible de u (par exemple en photographiant dans une situation de faible
luminosité).</p>

<p class="story_para">Cependant, comme v contient aussi le bruit &amp;epsilon;, ce dernier est amplifié
de la même manière&amp;nbsp;:</p>

<pre> v = Au<sub>0</sub> + A&amp;epsilon;</pre>

<p class="story_para">Ainsi, plus la &amp;laquo;&amp;nbsp;sensibilité&amp;nbsp;&amp;raquo; du capteur est élevée, c'est à dire plus le
facteur d'amplification A est élevé, plus le bruit est élevé et devient
perceptible pour l'observateur.</p>

<p class="story_para">Par exemple pour une image d'un objet noir, on s'attend à ce que v soit proche
de zéro pour tous les pixels même pour une grande valeur de A parce que
u<sub>0</sub> est justement proche de zéro. Mais il peut arriver que &amp;epsilon;
soit bien plus grand que u<sub>0</sub>, ce qui conduit à ce que la valeur v du
pixel soit essentiellement égale à A&amp;epsilon;. Ceci se traduit par des pixels
brillants au milieu de pixels sombres, typiques du bruit des photos prises en
faible lumière avec une sensibilité élevée.</p>

<h4>Comparaison de capteurs</h4>

<p class="story_para">Dans des conditions d'éclairage uniforme dans l'espace et le temps d'une
surface s pendant un temps t (le temps de pose d'une photo), on peut définir
les grandeurs suivantes&amp;nbsp;:</p>

<ul>
<li>l'<a href="https://fr.wikipedia.org/wiki/Exposition_lumineuse">exposition lumineuse</a>
  H est définie par H&amp;nbsp;=&amp;nbsp;Et,</li>
<li>l'<a href="https://fr.wikipedia.org/wiki/%C3%89clairement_lumineux">éclairement lumineux</a>
  E est défini par E&amp;nbsp;=&amp;nbsp;&amp;Phi;&amp;nbsp;/&amp;nbsp;s,</li>
<li>le <a href="https://fr.wikipedia.org/wiki/Flux_lumineux">flux lumineux</a> &amp;Phi; est
  défini par &amp;Phi;&amp;nbsp;=&amp;nbsp;Q&amp;nbsp;/&amp;nbsp;t</li>
</ul>

<p class="story_para">où Q est la <a href="https://fr.wikipedia.org/wiki/Quantit%C3%A9_de_lumi%C3%A8re">quantité de
lumière</a>
c'est à dire approximativement le nombre de photons qui arrivent sur la
surface s. En combinant ces trois définitions, on obtient</p>

<pre>Q = Hs</pre>

<p class="story_para">c'est à dire que la quantité de lumière qui arrive sur un pixel est
proportionnelle à la surface de ce pixel. Autrement dit, à exposition H égale,
un pixel plus grand reçoit une plus grande quantité de lumière qu'un pixel
plus petit.</p>

<p class="story_para">En reprenant définition de u<sub>0</sub> plus haut, on a</p>

<pre>u<sub>0</sub> = fHs</pre>

<p class="story_para">et donc, en ignorant pour le moment le bruit &amp;epsilon; on a</p>

<pre>v = AfHs</pre>

<p class="story_para">Ainsi, pour obtenir la même valeur v avec deux capteurs (capteur 1 et capteur
2) dont les pixels ont respectivement des surfaces s<sub>1</sub> et
s<sub>2</sub>, on a besoin d'un facteur d'amplification A<sub>1</sub> sur
le capteur 1 et A<sub>2</sub> sur le capteur 2 tels que</p>

<pre>A<sub>2</sub> = A<sub>1</sub>s<sub>1</sub>&amp;nbsp;/&amp;nbsp;s<sub>2</sub></pre>

<p class="story_para">On a vu plus haut que le bruit est amplifié. Cela se traduit par</p>

<pre>A<sub>2</sub>&amp;epsilon; = A<sub>1</sub>&amp;epsilon;s<sub>1</sub>&amp;nbsp;/&amp;nbsp;s<sub>2</sub></pre>

<p class="story_para">c'est à dire que le bruit dans l'image obtenue par le second capteur est
s<sub>1</sub>&amp;nbsp;/&amp;nbsp;s<sub>2</sub> fois plus élevé que le bruit dans l'image
obtenue par le premier capteur.</p>

<p class="story_para">Qualitativement, cela signifie que pour obtenir deux photos exposées de
manière identiques avec deux appareils différents, l'un muni d'un capteur à
grands pixels et le second muni d'un appareil à petits pixels, celui dont les
pixels sont petits a besoin d'un facteur d'amplification plus élevé et
produit donc une image plus bruitée.</p>

<h4>Sensibilité</h4>

<p class="story_para">La <a href="https://fr.wikipedia.org/wiki/Sensibilit%C3%A9_ISO">sensibilité</a> est
définie par S = H<sub>0</sub>&amp;nbsp;/&amp;nbsp;H où H<sub>0</sub> est une valeur d'exposition
de référence.</p>

<p class="story_para">Un photographe s'attend à ce que lorsqu'on prend la même photo avec deux
appareils (dont les capteurs sont équivalents à l'exception de la taille des
pixels, et donc de leur nombre), l'image obtenue est exposée de la même façon
(en supposant que la distance focale, le nombre d'ouverture, le temps de pose
et la sensibilité sont les mêmes). Une conséquence est que les facteurs
d'amplification des deux appareils doivent être différents puisque les tailles
des pixels sont différentes, et que l'image de l'appareil dont les pixels sont
plus petits contiendra donc plus de bruit.</p>

<p class="story_para">Réciproquement, si on cherche à produire avec les deux appareils des images
contenant une quantité de bruit identique, il faut changer les paramètres
d'exposition de l'appareil produisant le plus de bruit de sorte à</p>

<ul>
<li>diminuer la sensibilité S d'un facteur s<sub>1</sub>&amp;nbsp;/&amp;nbsp;s<sub>2</sub> afin
  d'utiliser le même facteur d'amplification dans les deux appareils, et</li>
<li>augmenter l'exposition H d'un facteur s<sub>1</sub>&amp;nbsp;/&amp;nbsp;s<sub>2</sub> afin
  de compenser la diminution de la sensibilité.</li>
</ul>

<p class="story_para">On peut parvenir à ce dernier point en augmentant le temps de pose ou en
augmentant la surface de la pupille du diaphragme d'un facteur
s<sub>1</sub>&amp;nbsp;/&amp;nbsp;s<sub>2</sub>.</p>

<p class="story_para">Selon le modèle simplifié utilisé ici, à tailles de capteurs égales, un
capteur de plus haute définition (donc comportant un plus grand nombre de
pixels) produira donc des images contenant plus de bruit.</p>

<p class="story_para">Si on décide de considérer qu'avec une exposition de référence H<sub>ref</sub>
la sensibilité S<sub>ref</sub> maximale d'un capteur de référence dont les
pixels ont une surface s<sub>ref</sub> représente une quantité de bruit de
référence, on peut considérer qu'à quantité de bruit identique, un capteur de
plus haute définition dont les pixels ont une surface s aura donc une
&amp;laquo;&amp;nbsp;sensibilité équivalente&amp;nbsp;&amp;raquo; S<sub>eq</sub> plus faible nécessitant une
exposition H<sub>eq</sub>. En effet
S<sub>ref</sub>&amp;nbsp;=&amp;nbsp;H<sub>0</sub>&amp;nbsp;/&amp;nbsp;H<sub>ref</sub> et
H<sub>eq</sub>&amp;nbsp;=&amp;nbsp;s<sub>ref</sub>&amp;nbsp;/&amp;nbsp;sH<sub>ref</sub>, donc</p>

<pre>S<sub>eq</sub> = S<sub>ref</sub>s/s<sub>ref</sub></pre>

<p class="story_para">Il faut noter que la sensibilité équivalente, qui dépend de la surface des
pixels, n'a rien à voir avec la focale équivalente qui dépend des dimensions
du capteur et non de celles de ses pixels.
</p>

]]></description>
  </item>
  <item>
    <title>Optique photo 3 : la perspective</title>
    <link>https://weber.fi.eu.org/blog/2019/09/14#optique_photo_3_perspective</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2019/09/14#optique_photo_3_perspective</guid>
    <pubDate>Sat, 14 Sep 2019 14:25:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FScience%2Foptique_photo_3_perspective.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FScience%2Foptique_photo_3_perspective.html">Babelfish</a> ]</p> <h4>Le grandissement</h4>

 <a href="https://weber.fi.eu.org/blog/images/optique_photo_1.png"><img src="https://weber.fi.eu.org/blog/images/optique_photo_1.thumbnail.png" width="200" height="63" class="align_left" alt="optique_photo_1"/></a>

<p class="story_para first">La hauteur h' de l'image d'un objet de hauteur h situé à une distance l d'un
objectif de distance focale f est donnée par h'&amp;nbsp;=&amp;nbsp;hf&amp;nbsp;/&amp;nbsp;l. Le rapport des
tailles entre l'objet et l'image s'appelle le grandissement &amp;gamma;, et en
supposant que f est négligeable devant l, &amp;gamma; est défini par</p>

<pre>&amp;gamma; = h'&amp;nbsp;/&amp;nbsp;h = f&amp;nbsp;/&amp;nbsp;l</pre>

<p class="story_para">Le grandissement dépend donc uniquement de la distance à l'objet et de la
distance focale de l'objectif.</p>

<h4>La perspective</h4>

<p class="story_para">On peut donner une valeur chiffrée à la perspective en comparant les tailles
des images de deux objets de même taille mais situés à des distances
différentes. En supposant que la <a href="https://weber.fi.eu.org/blog/Science/optique_photo_2_profondeur_de_champ.writeback">profondeur de
champ</a> est
suffisante pour que les images des deux objets soient nettes, on peut noter
h'<sub>1</sub> et h'<sub>2</sub> les hauteurs de ces images et l<sub>1</sub>
et l<sub>2</sub> les distances des objets, puis calculer le rapport
h'<sub>1</sub>&amp;nbsp;/&amp;nbsp;h'<sub>2</sub></p>

<pre>h'<sub>1</sub>&amp;nbsp;/&amp;nbsp;h'<sub>2</sub> = l<sub>2</sub>&amp;nbsp;/&amp;nbsp;l<sub>1</sub></pre>

<p class="story_para">On constate que le rapport des hauteurs des images dépend seulement du rapport
des distances des deux objets. En particulier, il ne dépend pas de la distance
focale de l'objectif (si cette dernière est négligeable devant les distances
aux objets).</p>

<p class="story_para">Une conséquence de ce constat est qu'un objectif à longue focale n'&amp;laquo;&amp;nbsp;écrase&amp;nbsp;&amp;raquo;
pas davantage les perspectives qu'un objectif à courte focale (si on ignore
les déformations sur les bords de l'image dûs aux courtes focale). Cette
conclusion est cohérente avec le fait qu'un objectif à courte distance focale
associée à un capteur de petite taille donnera la même image (avec la même
perspective) qu'un objectif de plus longue distance focale associé à un
capteur plus grand (lorsque le rapport des distance focales de ces deux
objectifs est égal au <em>crop factor</em> des deux capteurs).
</p>

]]></description>
  </item>
  <item>
    <title>Optique photo 2 : la profondeur de champ</title>
    <link>https://weber.fi.eu.org/blog/2019/09/13#optique_photo_2_profondeur_de_champ</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2019/09/13#optique_photo_2_profondeur_de_champ</guid>
    <pubDate>Fri, 13 Sep 2019 18:54:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FScience%2Foptique_photo_2_profondeur_de_champ.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FScience%2Foptique_photo_2_profondeur_de_champ.html">Babelfish</a> ]</p> <h4>Le flou</h4>

 <a href="https://weber.fi.eu.org/blog/images/optique_photo_2.png"><img src="https://weber.fi.eu.org/blog/images/optique_photo_2.thumbnail.png" width="200" height="103" class="align_left" alt="optique_photo_2"/></a>

<p class="story_para first">Lorsque la mise au point d'un <a href="https://weber.fi.eu.org/blog/Science/optique_photo_1_angle_de_champ.writeback">système optique
(simplifié)</a>  a été
effectuée, l'image d'un objet ponctuel A situé à une distance l de l'objectif
est un point A'. La mise au point est cependant imparfaite pour un objet B
situé à une distance L plus (ou moins) loin que l&amp;nbsp;: les rayons lumineux
convergent en B' au lieu de A', continuent leur course et vont s'étaler autour
de A' dans une zone de largeur &amp;epsilon;. Sur le capteur d'un appareil photo,
l'image B' de B est donc une tache circulaire dont le diamètre &amp;epsilon; dépend
de L, de la distance de mise au point l, de la distance focale f de la
lentille et du diamètre d de la pupille, c'est-à-dire le trou circulaire par
lequel la lumière entre dans la lentille, délimitée par le diaphragme. On
considère ici que la pupille est suffisamment grande pour négliger les effets
dûs à la diffraction.</p>

<p class="story_para">On considère que l'image d'un point est net lorsque l'observateur (humain,
en général) est incapable de faire la différence entre un &amp;laquo;&amp;nbsp;vrai&amp;nbsp;&amp;raquo; point et
une tache. Le diamètre &amp;epsilon; maximal d'une telle tache est lié au pouvoir
de séparation de l'½il de l'observateur, qui est lié non seulement à la taille
de la tache mais aussi à la distance à laquelle se situe l'observateur&amp;nbsp;: plus
l'observateur est éloigné, plus il est difficile de distinguer une petite tache
d'un &amp;laquo;&amp;nbsp;vrai&amp;nbsp;&amp;raquo; point. La valeur de cet &amp;epsilon; maximal n'est pas universelle,
car elle dépend in fine de l'affichage de la photo (sur écran ou en tirage
papier) et de la manière dont on regarde cette photo&amp;nbsp;: il sera par exemple
plus facile de remarquer un flou en regardant de près une image tirée en grand
format qu'en regardant de loin une image tirée en petit format.</p>

<h4>La profondeur de champ</h4>

<p class="story_para">D'après l'article de Wikipedia sur la <a href="https://fr.wikipedia.org/wiki/Profondeur_de_champ">Profondeur de champ</a>, les
limites de distance où les objets donneront une image considérée comme nette,
une fois choisie un valeur &amp;epsilon; maximale sont</p>

<pre>L = l / (1 &amp;plusmn; &amp;epsilon;l/df)</pre>

<p class="story_para">Les objets dont la distance est située entre ces limites auront une image
considérée comme nette, car la tache de diamètre &amp;epsilon; est trop petite
pour être distinguée d'un &amp;laquo;&amp;nbsp;vrai&amp;nbsp;&amp;raquo; point net. On remarque que pour
photographier un objet donné situé à une distance l en utilisant un objectif
de distance focale f donnée, ces deux valeurs limites ne dépendent que du
diamètre de la pupille, et pas du tout de la taille du capteur de l'appareil
photo. Plus précisément, si les pixels du capteur sont plus grands que
&amp;epsilon; il n'y aura aucun flou car la tache circulaire sera contenue dans un
seul pixel. Si les pixels sont plus petits que &amp;epsilon; mais que les pixels à
l'affichage de la photo (sur écran ou sur papier) sont plus grands que la
tache circulaire, alors il n'y aura aucun flou à l'affichage, mais on pourra
voir le flou en zoomant dans l'image (ce qui revient à dire que les pixels
d'affichage deviennent plus petits que la tache circulaire).</p>

<h4>Le nombre d'ouverture et la focale équivalente</h4>

<p class="story_para">La taille d de la pupille est exprimée dans la pratique non pas en millimètres,
mais en fraction 1/N de la distance focale de l'objectif&amp;nbsp;: d&amp;nbsp;=&amp;nbsp;f&amp;nbsp;/&amp;nbsp;N. N est le
nombre d'ouverture et vaut donc N&amp;nbsp;=&amp;nbsp;f&amp;nbsp;/&amp;nbsp;d.</p>

<p class="story_para">Si considère qu'en utilisant un objectif de distance focale f sur un capteur
de taille différente on a une distance focale équivalente f<sub>eq</sub>&amp;nbsp;=&amp;nbsp;kf,
alors on peut écrire</p>

<pre>N = f<sub>eq</sub> / kd</pre>

<p class="story_para">où k est appelé &amp;laquo;&amp;nbsp;crop factor&amp;nbsp;&amp;raquo;, soit</p>

<pre>kN = f<sub>eq</sub> / d</pre>

<p class="story_para">En introduisant la notion de nombre d'ouverture équivalent N<sub>eq</sub>
défini par N<sub>eq</sub>&amp;nbsp;=&amp;nbsp;kN, la formule précédente devient</p>

<pre>N<sub>eq</sub> = f<sub>eq</sub> / d</pre>

<p class="story_para">qui est a la même forme que la définition du nombre d'ouverture, mais en
utilisant le nombre d'ouverture équivalent et la focale équivalente.</p>

<h4>Hyperfocale</h4>

<p class="story_para">On peut définir F&amp;nbsp;=&amp;nbsp;df/&amp;epsilon;. En remplaçant le diamètre de la pupille d
par son expression utilisant la distance focale et le nombre d'ouverture, on
obtient</p>

<pre>F = f<sup>2</sup>/&amp;epsilon;N</pre>

<p class="story_para">Les distances limites de la profondeur de champ deviennent alors</p>

<pre>L = lF / (F &amp;plusmn; l)</pre>

<p class="story_para">La distance <a href="https://fr.wikipedia.org/wiki/hyperfocale">hyperfocale</a> F est la distance l minimale pour laquelle tous
les objets entre F/2 et l'infini sont nets. Un corrolaire est que lors d'une
mise au point à l'infini, tous les objets situés au delà d'une distance F sont
nets.</p>

<p class="story_para">Si on utilise la distance hyperfocale comme unité de distance de mise au point
photographié, on peut représenter, de manière générique pour n'importe quelle
combinaison de capteur, distance focale et nombre d'ouverture, les distances
limites entre lesquelles les objets forment des images nettes (en supposant
toujours que la distance focale est négligeable par rapport à la distance de
mise au point). </p>

<p class="story_para">En notant l = qF, on peut exprimer L en fonction de q et F:</p>

<pre>L = qF / (1 &amp;plusmn; q)</pre>

 <a href="https://weber.fi.eu.org/blog/images/optique_photo-profondeur_de_champ_1.png"><img src="https://weber.fi.eu.org/blog/images/optique_photo-profondeur_de_champ_1.thumbnail.png" width="200" height="150" class="align_left" alt="optique_photo-profondeur_de_champ_1"/></a>

<p class="story_para">Le diagramme ci-contre indique les limites minimum et maximum de netteté pour
une mise au point égale à une fraction de la distance hyperfocale F. On remarque
que vers 0,9F, la limite maximum de netteté est déjà à 10F, et tend vers
l'infini lorsqu'on se rapproche de 1F. Si on fait la mise au point à une
valeur supérieure à F, la limite maximum de netteté reste à l'infini alors que
la limite minimale n'augmente comparativement que très peu.</p>

<div class="clear"></div>

 <a href="https://weber.fi.eu.org/blog/images/optique_photo-profondeur_de_champ_2.png"><img src="https://weber.fi.eu.org/blog/images/optique_photo-profondeur_de_champ_2.thumbnail.png" width="200" height="150" class="align_left" alt="optique_photo-profondeur_de_champ_2"/></a>

<p class="story_para">Le diagramme ci-contre représente les limites de netteté pour des distances de
mise au point inférieures à 0,5F. On remarque que lors d'une mise au point à
0,5F, les objets situés au delà de F ne sont plus nets.
</p>

]]></description>
  </item>
  <item>
    <title>Optique photo 1: l'angle de champ</title>
    <link>https://weber.fi.eu.org/blog/2019/09/10#optique_photo_1_angle_de_champ</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2019/09/10#optique_photo_1_angle_de_champ</guid>
    <pubDate>Tue, 10 Sep 2019 22:47:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FScience%2Foptique_photo_1_angle_de_champ.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FScience%2Foptique_photo_1_angle_de_champ.html">Babelfish</a> ]</p> <h4>Le modèle simplifié</h4>

 <a href="https://weber.fi.eu.org/blog/images/optique_photo_1.png"><img src="https://weber.fi.eu.org/blog/images/optique_photo_1.thumbnail.png" width="200" height="63" class="align_left" alt="optique_photo_1"/></a>

<p class="story_para first">On peut simplifier un objectif d'appareil photo en le considérant comme une
lentille mince de centre O et de distance focale f. L'axe optique de la
lentille passe par O et est perpendiculaire à cette dernière. Les points F et
F', situés de part et d'autre de la lentille à une distance f sont les points
focaux de cette dernière. L'objet AB, situé à une distance l de la lentille
donne alors une image A'B' sur le capteur de l'appareil photo. La hauteur de
l'objet est h et la hauteur de l'image est h'.</p>

<p class="story_para">Les règles de l'optique géométrique sont simples&amp;nbsp;:</p>

<ul>
<li>les rayons lumineux passant par le centre O de la lentille ne sont pas
déviés, donc AA' et BB' sont des lignes droites&amp;nbsp;;</li>
<li>les rayons lumineux qui arrivent sur la lentille parallèlement à l'axe
optique ressortent de la lentille en passant par le point focal F', tel le
rayon BCB'&amp;nbsp;;</li>
<li>les rayons lumineux qui arrivent sur la lentille en passant par le point
focal F ressortent parallèlement à l'axe optique, tel le rayon BDB'.</li>
</ul>

<h4>L'angle de champ</h4>

<p class="story_para">L'angle sous lequel l'objectif voit l'objet AB est l'angle &amp;theta;. On a
tan&amp;nbsp;&amp;theta;&amp;nbsp;=&amp;nbsp;h&amp;nbsp;/&amp;nbsp;l et tan&amp;nbsp;&amp;alpha;&amp;nbsp;=&amp;nbsp;h&amp;nbsp;/&amp;nbsp;(l&amp;nbsp;-&amp;nbsp;f)&amp;nbsp;=&amp;nbsp; h'&amp;nbsp;/&amp;nbsp;f. On en déduit que
tan&amp;nbsp;&amp;theta;&amp;nbsp;=&amp;nbsp;(l&amp;nbsp;-&amp;nbsp;f)h'&amp;nbsp;/&amp;nbsp;lf, que l'on peut simplifier (lorsque f est
négligeable devant l) en tan&amp;nbsp;&amp;theta;&amp;nbsp;=&amp;nbsp;h'&amp;nbsp;/&amp;nbsp;f.</p>

<p class="story_para">Si on considère que l'image A'B' et son symétrique (qui n'est pas représenté
sur le diagramme) sont ensemble suffisamment grands pour couvrir l'intégralité
de la diagonale du capteur, on sait que la hauteur h' de l'image représente la
moitié de la diagonale d du capteur. Cela signifie que l'angle &amp;theta; est la
moitié de l'angle de champ du système objectif-capteur. On a alors</p>

<pre>tan(angle de champ&amp;nbsp;/&amp;nbsp;2) = d&amp;nbsp;/&amp;nbsp;2f</pre>

<p class="story_para">Ceci montre que l'angle de champ dépend seulement de la distance focale de
l'objectif et de la taille du capteur (lorsque f est négligeable devant l,
soit en pratique lorsque la distance à l'objet est au moins dix fois plus
grande que la distance focale).</p>

<h4>Angle de champ et taille de capteur</h4>

<p class="story_para">Pour deux capteurs de tailles différents et avec un objectif donné, le rapport
des tangentes des demi-angles de champ est égale au rapport des tailles des
capteurs. Pour des angles de champ de moins de 53° (c.-à-d. lorsque la
valeur de la tangente est proche de la valeur de l'angle, en radians), c'est
à dire lorsque la distance focale est plus grande que la diagonale du capteur,
on peut faire l'approximation que le rapport des angles de champ est égal au
rapport des tailles des capteurs, avec une erreur de moins de 10%, soit</p>

<pre>angle<sub>1</sub>&amp;nbsp;/&amp;nbsp;angle<sub>2</sub> = diagonale<sub>1</sub>&amp;nbsp;/&amp;nbsp;diagonale<sub>2</sub></pre>

<p class="story_para">Ainsi par exemple un capteur deux fois plus grand qu'un autre capteur donnera
un angle de champ deux fois plus grand lorsque ces capteurs sont munis
d'objectifs de même distance focale.</p>

<p class="story_para">Si on veut une approximation qui fonctionne aussi pour de grands angles, il
devient nécessaire de comparer les tangentes des demi-angles de champ, par
exemple</p>

<pre>tan(angle<sub>1</sub>&amp;nbsp;/&amp;nbsp;2)&amp;nbsp;/&amp;nbsp;tan(angle<sub>2</sub>&amp;nbsp;/&amp;nbsp;2) = diagonale<sub>1</sub>&amp;nbsp;/&amp;nbsp;diagonale<sub>2</sub></pre>

<p class="story_para">ou de faire intervenir les arctangentes, par exemple</p>

<pre>angle<sub>1</sub>&amp;nbsp;/&amp;nbsp;angle<sub>2</sub> = arctan(diagonale<sub>1</sub>&amp;nbsp;/&amp;nbsp;2f)&amp;nbsp;/&amp;nbsp;arctan(diagonale<sub>2</sub>&amp;nbsp;/&amp;nbsp;2f)</pre>

<p class="story_para">ce qui est nettement moins pratique à évaluer de tête.</p>

<h4>La distance focale équivalente</h4>

<p class="story_para">Supposons que l'on a un capteur de référence dont la diagonale est
d<sub>ref</sub> (par exemple un capteur 24&amp;times;36&amp;nbsp;mm) et un objectif de
distance focale f.</p>

<p class="story_para">Lorsqu'on utilise cet objectif avec un autre capteur dont la diagonale est
d, on a un angle de champ &amp;theta; défini par</p>

<pre>tan(&amp;theta;&amp;nbsp;/&amp;nbsp;2) = d&amp;nbsp;/&amp;nbsp;f</pre>

<p class="story_para">On veut alors savoir quelle serait la distance focale équivalente
f<sub>eq</sub> d'un objectif fictif donnant le même angle de champ &amp;theta; si
on utilisait cet objectif fictif avec le capteur de référence. On a</p>

<pre>tan(&amp;theta;&amp;nbsp;/&amp;nbsp;2) = d&amp;nbsp;/&amp;nbsp;f =  d<sub>ref</sub>&amp;nbsp;/&amp;nbsp;f<sub>eq</sub></pre>

<p class="story_para">et donc</p>

<pre>f<sub>eq</sub> = f&amp;nbsp;&amp;times;&amp;nbsp;d<sub>ref</sub>&amp;nbsp;/&amp;nbsp;d</pre>

<p class="story_para">(cette valeur est correcte si f est négligeable par rapport à l et par rapport
à ld&amp;nbsp;/&amp;nbsp;d<sub>ref</sub>).</p>

<p class="story_para">Comparée à l'angle de champ, le calcul de la distance focale équivalente n'est
pas limitée à des angles de champ suffisamment petits. La distance focale
équivalente fait cependant appel à un facteur caché, la taille du capteur de
référence.
</p>

]]></description>
  </item>
  <item>
    <title>CAPTCHA</title>
    <link>https://weber.fi.eu.org/blog/2019/09/04#captcha</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2019/09/04#captcha</guid>
    <pubDate>Wed, 04 Sep 2019 22:34:00 +0200</pubDate>
    <description><![CDATA[ <p class="story_para first">For years, the comments were systematically rejected on the blog because most
of them were spam, and I didn't have a good way of filtering them out. A
<a href="https://en.wikipedia.org/wiki/CAPTCHA">CAPTCHA</a> would have been a solution, but I read that the ones
based on warped text are easily defeated, and I didn't want to bother with
images anyway.</p>

<p class="story_para">I recently rediscovered the idea of a CAPTCHA based on arithmetics, which I
now have implemented. The poster of a comment must do a simple arithmetics
operation involving two single digit numbers and one operator. It should not
be difficult to defeat, but arithmetics CAPTCHAs are apparently uncommon, so
it is likely that most bots don't implement such solvers. It has already
repelled a couple of spam comments today.
</p>

]]></description>
  </item>
  <item>
    <title>Roulette et Martingale</title>
    <link>https://weber.fi.eu.org/blog/2019/08/12#roulette_et_martingale</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2019/08/12#roulette_et_martingale</guid>
    <pubDate>Mon, 12 Aug 2019 07:31:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FScience%2Froulette_et_martingale.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FScience%2Froulette_et_martingale.html">Babelfish</a> ]</p> <p class="story_para first">Supposons qu'on joue à la roulette dans un casino. La roulette est honnête,
donc tous les chiffres ont la même probabilité de sortir. Cette roulette
comporte 18 numéros rouges, 18 numéros numéros noirs et un zéro qui n'est ni
rouge ni noir. Les paris se font par tranche de 1 Euro, et sont limités à 100
Euros. On entre au casino avec 127 Euros en poche, et on parie toujours sur le
rouge et on ne réinvestit pas ce qu'on a gagné, c'est à dire qu'on arrête de
jouer une fois qu'on a perdu les 127 Euros de départ.</p>

<p class="story_para">À chaque jeu on a donc <em>p</em> = 18/37 chances de gagner (soit un peu moins d'une
chance sur deux).</p>

<p class="story_para">Si on fait <em>n</em> = 127 paris de 1 Euro, la probabilité de gagner <em>k</em> fois (0 <=
k <= <em>n</em>) est de
P(X = <em>k</em>) = Comb( <em>n</em>, <em>k</em>) p<sup> <em>k</em></sup> (1 - <em>p</em>)<sup> <em>n</em> - <em>k</em></sup>
(il s'agit d'une <a href="https://fr.wikipedia.org/wiki/Loi_binomiale">Loi binomiale</a>). Les gains après <em>k</em> victoires
sur <em>n</em> parties sont de 2 <em>k</em> - n. On peut donc calculer la somme des P(X =
<em>k</em>) pour tous les <em>k</em> tels que 2 <em>k</em> - n > 0, ce qui donne la probabilité de
quitter le casino avec en poche plus d'Euros que lorsqu'on y est entré. Cette
probabilité est de 0,38, c'est à dire qu'on a 38% de chance de quitter le
casino avec au moins 128 Euros et au plus 254 Euros. Cela signifie aussi qu'on
a 62% de chance de n'avoir rien gagné, voire perdu tout ou partie des 127
Euros initiaux. En fait, on peut s'attendre, en moyenne, à perdre 3,43 Euros.</p>

<p class="story_para">Jouer une martingale consiste à doubler la mise si on perd, afin que le gain
couvre les pertes passées. La table de roulette ayant une limite de 100 Euros,
on peut donc miser au plus <em>m</em> = 7 fois de suite en doublant la mise à chaque
jeu, soit 1 + 2 + 4 + 8 + 16 + 32 + 64 = 127 Euros (ça tombe bien, c'est
justement la somme qu'on avait en entrant au casino). La probabilité de gagner
au bout de <em>i</em> jeux (donc de perdre <em>i</em> - 1 fois puis de gagner une fois) est
P(X = <em>i</em>) = (1 - <em>p</em>)<sup> <em>i</em> - 1</sup> <em>p</em> (il s'agit d'une <a href="https://fr.wikipedia.org/wiki/Loi_g%C3%A9om%C3%A9trique">Loi
géométrique</a>). On
peut donc calculer la somme de ces probabilités pour <em>i</em> = 1 &amp;hellip; <em>m</em>, qui
représente la probabilité de gagner 1 Euro en utilisant la martingale. Cette
probabilité est de 1 - (1 - <em>p</em>)<sup> <em>m</em></sup> = 0,99. Cela signifie qu'on a 99%
de chance de gagner 1 Euro, et donc 1% de chance de perdre 127 Euros. On peut
donc s'attendre à perdre en moyenne 0,21 Euro. </p>

<p class="story_para">Si on joue la martingale plusieurs fois de suite aussi longtemps que l'on ne
perd pas, on peut espérer gagner à répétition, mais la probabilité de ne
jamais perdre diminue à mesure que l'on joue (il s'agit encore une fois d'une
loi géométrique, cette fois avec avec <em>p</em> = 0,99). Si on parvient à gagner en
jouant la martingale au moins 128 fois de suite, alors on est certain qu'au
moment où la chance tourne et que l'on perd, on ne perd que 127 Euros, et donc
qu'on quitte le casino avec en poche au moins 1 euro de plus que lorsqu'on y
est entré. Cette probabilité est de 0,298. Cela signifie qu'on a 29,8% de
chance de sortir du casino avec au moins 128 Euros en poche. Cela signifie
aussi qu'on a 70,2% de chance de perdre entre 0 et 127 Euros. En fait, on peut
s'attendre à perdre en moyenne 21,8 Euros. Si on compare cette méthode avec la
précédente qui consiste à miser 127 fois 1 Euro sur le rouge, on voit que le
chances de ne pas perdre d'argent sont plus élevées si on n'utilise pas la
martingale, et que les gains moyens sont moins mauvais lorsqu'on n'utilise pas
la martingale (ils sont cependant toujours négatifs, c'est à dire qu'on y perd
toujours de l'argent, en moyenne).</p>

<p class="story_para">Jouer la martingale a cependant une utilité&amp;nbsp;: la probabilité de
gain élevé est plus grande avec la martingale que sans. Par exemple la
probabilité de gagner au moins 10 Euros est de 11,6% sans martingale et 27,1%
avec la martingale. Pour 20 Euros ou plus, la probabilité est d'à peine 1.9%
sans martingale et de 24,7% avec la martingale, et on a encore environ 10% de
chances de gagner au moins 115 Euros avec la martingale alors que cette
probabilité est de moins d'une sur cent milliards sans martingale.
</p>

]]></description>
  </item>
  <item>
    <title>Nouvelle table</title>
    <link>https://weber.fi.eu.org/blog/2019/06/22#nouvelle_table</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2019/06/22#nouvelle_table</guid>
    <pubDate>Sat, 22 Jun 2019 13:02:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fnouvelle_table.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fnouvelle_table.html">Babelfish</a> ]</p>  <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2019-06-22.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2019-06-22.thumbnail.jpg" alt="nouvelle_cuisine_2019-06-22"/></a>


]]></description>
  </item>
  <item>
    <title>Jour 8</title>
    <link>https://weber.fi.eu.org/blog/2018/09/07#jour_8</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2018/09/07#jour_8</guid>
    <pubDate>Fri, 07 Sep 2018 18:16:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fjour_8.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fjour_8.html">Babelfish</a> ]</p>  <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-07_1.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-07_1.thumbnail.jpg" alt="nouvelle_cuisine_2018-09-07_1"/></a>

 <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-07_2.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-07_2.thumbnail.jpg" alt="nouvelle_cuisine_2018-09-07_2"/></a>

 <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-07_3.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-07_3.thumbnail.jpg" alt="nouvelle_cuisine_2018-09-07_3"/></a>


]]></description>
  </item>
  <item>
    <title>Jour 7</title>
    <link>https://weber.fi.eu.org/blog/2018/09/06#jour_7</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2018/09/06#jour_7</guid>
    <pubDate>Thu, 06 Sep 2018 18:07:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fjour_7.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fjour_7.html">Babelfish</a> ]</p>  <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-06_1.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-06_1.thumbnail.jpg" alt="nouvelle_cuisine_2018-09-06_1"/></a>

 <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-06_2.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-06_2.thumbnail.jpg" alt="nouvelle_cuisine_2018-09-06_2"/></a>


]]></description>
  </item>
  <item>
    <title>Jour 6</title>
    <link>https://weber.fi.eu.org/blog/2018/09/05#jour_6</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2018/09/05#jour_6</guid>
    <pubDate>Wed, 05 Sep 2018 18:14:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fjour_6.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fjour_6.html">Babelfish</a> ]</p>  <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-05_1.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-05_1.thumbnail.jpg" alt="nouvelle_cuisine_2018-09-05_1"/></a>

 <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-05_2.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-05_2.thumbnail.jpg" alt="nouvelle_cuisine_2018-09-05_2"/></a>


]]></description>
  </item>
  <item>
    <title>Jour 5</title>
    <link>https://weber.fi.eu.org/blog/2018/09/04#jour_5</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2018/09/04#jour_5</guid>
    <pubDate>Tue, 04 Sep 2018 17:42:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fjour_5.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fjour_5.html">Babelfish</a> ]</p>  <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-04_1.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-04_1.thumbnail.jpg" alt="nouvelle_cuisine_2018-09-04_1"/></a>

 <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-04_2.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-04_2.thumbnail.jpg" alt="nouvelle_cuisine_2018-09-04_2"/></a>


]]></description>
  </item>
  <item>
    <title>Jour 4</title>
    <link>https://weber.fi.eu.org/blog/2018/09/03#jour_4</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2018/09/03#jour_4</guid>
    <pubDate>Mon, 03 Sep 2018 17:06:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fjour_4.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fjour_4.html">Babelfish</a> ]</p>  <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-03_1.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-03_1.thumbnail.jpg" alt="nouvelle_cuisine_2018-09-03_1"/></a>

 <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-03_2.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-09-03_2.thumbnail.jpg" alt="nouvelle_cuisine_2018-09-03_2"/></a>


]]></description>
  </item>
  <item>
    <title>Jour 3</title>
    <link>https://weber.fi.eu.org/blog/2018/08/31#jour_3</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2018/08/31#jour_3</guid>
    <pubDate>Fri, 31 Aug 2018 23:45:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fjour_3.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fjour_3.html">Babelfish</a> ]</p>  <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-31_1.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-31_1.thumbnail.jpg" alt="nouvelle_cuisine_2018-08-31_1"/></a>

 <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-31_2.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-31_2.thumbnail.jpg" alt="nouvelle_cuisine_2018-08-31_2"/></a>


]]></description>
  </item>
  <item>
    <title>Jour 2</title>
    <link>https://weber.fi.eu.org/blog/2018/08/30#jour_2</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2018/08/30#jour_2</guid>
    <pubDate>Thu, 30 Aug 2018 23:45:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fjour_2.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fjour_2.html">Babelfish</a> ]</p>  <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-30.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-30.thumbnail.jpg" alt="nouvelle_cuisine_2018-08-30"/></a>


]]></description>
  </item>
  <item>
    <title>Jour 1</title>
    <link>https://weber.fi.eu.org/blog/2018/08/29#jour_1</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2018/08/29#jour_1</guid>
    <pubDate>Wed, 29 Aug 2018 23:45:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fjour_1.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fjour_1.html">Babelfish</a> ]</p>  <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-29_1.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-29_1.thumbnail.jpg" alt="nouvelle_cuisine_2018-08-29_1"/></a>

 <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-29_2.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-29_2.thumbnail.jpg" alt="nouvelle_cuisine_2018-08-29_2"/></a>


]]></description>
  </item>
  <item>
    <title>Ancienne cuisine</title>
    <link>https://weber.fi.eu.org/blog/2018/08/25#ancienne_cuisine</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2018/08/25#ancienne_cuisine</guid>
    <pubDate>Sat, 25 Aug 2018 23:45:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fancienne_cuisine.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Fancienne_cuisine.html">Babelfish</a> ]</p>  <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-25_1.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-25_1.thumbnail.jpg" alt="nouvelle_cuisine_2018-08-25_1"/></a>

 <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-25_2.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-25_2.thumbnail.jpg" alt="nouvelle_cuisine_2018-08-25_2"/></a>


]]></description>
  </item>
  <item>
    <title>Tas de meubles</title>
    <link>https://weber.fi.eu.org/blog/2018/08/23#tas_de_meubles</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2018/08/23#tas_de_meubles</guid>
    <pubDate>Thu, 23 Aug 2018 23:45:00 +0200</pubDate>
    <description><![CDATA[<p class="translate">Translation: [ <a href="http://translate.google.com/translate?u=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Ftas_de_meubles.html&amp;langpair=fr%7Cen&amp;hl=en&amp;ie=UTF8">Google</a> | <a href="http://babelfish.altavista.com/babelfish/urltrurl?lp=fr_en&amp;url=https%3A%2F%2Fweber.fi.eu.org%2Fblog%2FCuisine%2FNouvelle_cuisine%2Ftas_de_meubles.html">Babelfish</a> ]</p>  <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-23_1.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-23_1.thumbnail.jpg" alt="nouvelle_cuisine_2018-08-23_1"/></a>

 <a href="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-23_2.jpg"><img src="https://weber.fi.eu.org/blog/images/nouvelle_cuisine_2018-08-23_2.thumbnail.jpg" alt="nouvelle_cuisine_2018-08-23_2"/></a>


]]></description>
  </item>
  <item>
    <title>Advertisement on the Web</title>
    <link>https://weber.fi.eu.org/blog/2018/07/18#advertisement_on_the_web</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2018/07/18#advertisement_on_the_web</guid>
    <pubDate>Wed, 18 Jul 2018 16:34:00 +0200</pubDate>
    <description><![CDATA[ <h4>The economic value of a Youtube video</h4>

<p class="story_para first">The Youtube platform has been designed for the purpose of making all of its
videos are available to anyone at anytime. Given its large amount of content,
its suggestion algorithm and the ability to automatically play the next
suggested video, a user of Youtube can consider that the stream of videos he
wants to watch is limitless. This makes the stream a nonscarce resource i.e.,
a free good which, from an economics point of view has no value.</p>

<p class="story_para">Asking users to pay for watching videos would indeed be a bad business move
for Youtube, as many user would refuse to pay for watching content they
currently get at no cost. Even the Youtube Red subscription, according to an
Ars Technica article and related user comments, seems to be valuable not for
it exclusive content, but for the extra features provided by the mobile player
(download for offline viewing and background playing). Interestingly, these
features are already provided by non-standard software, which is freely
available. The exclusive content being apparently of little interest according
to the article, the subscription seems to rather be &amp;ldquo;tax&amp;rdquo; on people who
don't know they could legitimately get the same service for free.</p>

<p class="story_para">Youtube being a business, it needs to get revenue, at least to support the
cost of its large IT infrastructure. Since users are not charged any money,
Youtube's revenue comes (exclusively?) from advertising (I guess that the
collection of user behavioural data and their profiling is also sold to
advertisers). Youtube's content therefore has value only insofar as it
attracts potential consumers and exposes them to advertisement. The content
itself does not matter to the platform, as long as users are drawn to it.</p>

<p class="story_para">This is thus the foundation of the Web platforms and the Attention Economy,
where the users' attention is the actual product being sold by the platforms.
User profiling and Big Data is only a tool used for maximising the amount of
attention being captured.</p>

<h4>Advertisers are gamblers, you don't need to let them win</h4>

<p class="story_para">In 2004, Patrick Le Lay, then CEO of the French TV channel TF1 said &amp;ldquo;what we
sell to Coca-Cola is available human brain-time.&amp;rdquo; One aspect of this
is that TV channels sell advertisers the opportunity to reach the channel's
viewers and attempt to influence them into buying the advertised products.</p>

<p class="story_para">From the point of view of the advertisers, it is a gamble: they bet money (the
cost of producing the TV commercial and the price paid to the TV channel to show
the commercial) and hope to gain from it (when viewers buy their products
because they have seen the commercial and have been influenced by it). This
gamble is two-fold: the viewers may or may not see the commercial, and they may
or may not be receptive to the influence techniques used in the commercial.</p>

<p class="story_para">In social media, advertisement can be considered from the same angle: the website
sells advertisers display space on its pages, and the advertisers gamble that
users of the website will see the commercial and be influenced by it.</p>

<p class="story_para">While everybody agrees that you don't have a moral obligation to buy a product
after you have seen a commercial, it seems less obvious that you don't either
have any moral obligation to view the commercial. For example, you could close
your eyes and plug your ears to ignore the commercial; you could even use tools
that automatically hide the commercial from you.</p>

<h4>Putting the advertisers' money to uses I approve of</h4>

<p class="story_para">As I want to protect myself from the influence of advertisers, I normally use
automated tools that prevent me from seeing advertisement. I record television
programs and skip the commercials (automatically when the tool works as
intended, otherwise manually), and I use ad blockers in my Web browser to
prevent commercials from being displayed on my screen.</p>

<p class="story_para">The difference between TV and the Web is that the TV channel gets paid for
broadcasting the commercials and cannot control whether or not I skip them
while advertisers on the Web pay the websites only if the commercial is being
fetched i.e., only if I allow the Web browser under my control to display the
commercial. In that case, my preferred solution would be to fetch the
commercial as if it would be displayed, without actually displaying it. And
since advertisers not only display commercials but also track the users across
websites, it is necessary to isolate each commercial so that the tracking is
not possible.</p>

<p class="story_para">I would not normally care about websites not being paid by their advertisers,
but in the particular case of Youtube, I use tools that allow me to watch
content without having to view any commercial, meaning that the content's
creators cannot hope to get payment from Youtube. I therefore dream of a tool
that would allow me to channel advertisers' money to the content creators
without having to view any commercial, thus letting the advertisers gamble,
but strongly shifting the odds of this gamble in my favor. I consider this to
be retribution for the advertisers' attempt at influencing me for their
profit.
</p>

]]></description>
  </item>
  <item>
    <title>ANSI colors and Solarized</title>
    <link>https://weber.fi.eu.org/blog/2018/05/22#ansi_colors_and_solarized</link>
    <atom:link href="https://weber.fi.eu.org/blog/index.rss10" rel="self" type="application/rss+xml"/>
    <guid isPermaLink="true">https://weber.fi.eu.org/blog/2018/05/22#ansi_colors_and_solarized</guid>
    <pubDate>Tue, 22 May 2018 23:21:00 +0200</pubDate>
    <description><![CDATA[ <p class="story_para first">The <a href="http://ethanschoonover.com/solarized">Solarized</a> color scheme redefines
some of the standard basic ANSI colors, making some color combinations
unsuitable for display. In particular, bright green, bright yellow, bright
blue and bright cyan are tones of grey instead of the expected colors.</p>

<p class="story_para">Also, some terminals interpret bold text as bright colors, turning e.g, bold
green into a shade of grey instead of the expected green. At least in
URxvt, setting <code>intensityStyles: False</code> will prevent bold text from being
displayed in bright colors (but will still be displayed in a bold font).</p>

<p class="story_para">When redefining color schemes for terminal applications using ANSI colors,
these are possible combinations, using the usual ANSI color names. Note that
bright colors are usually not available as background colors.</p>

<h4> Solarized Light default background (ANSI white) </h4>

<p class="story_para">Normal:
<span style="background-color: #fdf6e3;color: #073642;">black</span>
<span style="background-color: #fdf6e3;color: #dc322f;">red</span>
<span style="background-color: #fdf6e3;color: #859900;">green</span>
<span style="background-color: #fdf6e3;color: #b58900;">yellow</span>
<span style="background-color: #fdf6e3;color: #268bd2;">blue</span>
<span style="background-color: #fdf6e3;color: #d33682;">magenta</span>
<span style="background-color: #fdf6e3;color: #2aa198;">cyan</span>
<span style="background-color: #fdf6e3;color: #eee8d5;">(light)grey</span></p>

<p class="story_para">Bright:
<span style="background-color: #fdf6e3;color: #002b36;">black/grey</span>
<span style="background-color: #fdf6e3;color: #cb4b16;">red</span>
<span style="background-color: #fdf6e3;color: #586e75;">green</span>
<span style="background-color: #fdf6e3;color: #657b83;">yellow</span>
<span style="background-color: #fdf6e3;color: #839496;">blue</span>
<span style="background-color: #fdf6e3;color: #6c71c4;">magenta</span>
<span style="background-color: #fdf6e3;color: #93a1a1;">cyan</span>
<span style="background-color: #fdf6e3;color: #fdf6e3;">white</span></p>

<h4> ANSI (Light)Grey background </h4>

<p class="story_para">Normal:
<span style="background-color: #eee8d5;color: #073642;">black</span>
<span style="background-color: #eee8d5;color: #dc322f;">red</span>
<span style="background-color: #eee8d5;color: #859900;">green</span>
<span style="background-color: #eee8d5;color: #b58900;">yellow</span>
<span style="background-color: #eee8d5;color: #268bd2;">blue</span>
<span style="background-color: #eee8d5;color: #d33682;">magenta</span>
<span style="background-color: #eee8d5;color: #2aa198;">cyan</span>
<span style="background-color: #eee8d5;color: #eee8d5;">(light)grey</span></p>

<p class="story_para">Bright:
<span style="background-color: #eee8d5;color: #002b36;">black/grey</span>
<span style="background-color: #eee8d5;color: #cb4b16;">red</span>
<span style="background-color: #eee8d5;color: #586e75;">green</span>
<span style="background-color: #eee8d5;color: #657b83;">yellow</span>
<span style="background-color: #eee8d5;color: #839496;">blue</span>
<span style="background-color: #eee8d5;color: #6c71c4;">magenta</span>
<span style="background-color: #eee8d5;color: #93a1a1;">cyan</span>
<span style="background-color: #eee8d5;color: #fdf6e3;">white</span></p>

<h4> Solarized Dark default background (ANSI bright black/grey) </h4>

<p class="story_para">Normal:
<span style="background-color: #002b36;color: #073642;">black</span>
<span style="background-color: #002b36;color: #dc322f;">red</span>
<span style="background-color: #002b36;color: #859900;">green</span>
<span style="background-color: #002b36;color: #b58900;">yellow</span>
<span style="background-color: #002b36;color: #268bd2;">blue</span>
<span style="background-color: #002b36;color: #d33682;">magenta</span>
<span style="background-color: #002b36;color: #2aa198;">cyan</span>
<span style="background-color: #002b36;color: #eee8d5;">(light)grey</span></p>

<p class="story_para">Bright:
<span style="background-color: #002b36;color: #002b36;">black/grey</span>
<span style="background-color: #002b36;color: #cb4b16;">red</span>
<span style="background-color: #002b36;color: #586e75;">green</span>
<span style="background-color: #002b36;color: #657b83;">yellow</span>
<span style="background-color: #002b36;color: #839496;">blue</span>
<span style="background-color: #002b36;color: #6c71c4;">magenta</span>
<span style="background-color: #002b36;color: #93a1a1;">cyan</span>
<span style="background-color: #002b36;color: #fdf6e3;">white</span></p>

<h4> ANSI Black background </h4>

<p class="story_para">Normal:
<span style="background-color: #073642;color: #073642;">black</span>
<span style="background-color: #073642;color: #dc322f;">red</span>
<span style="background-color: #073642;color: #859900;">green</span>
<span style="background-color: #073642;color: #b58900;">yellow</span>
<span style="background-color: #073642;color: #268bd2;">blue</span>
<span style="background-color: #073642;color: #d33682;">magenta</span>
<span style="background-color: #073642;color: #2aa198;">cyan</span>
<span style="background-color: #073642;color: #eee8d5;">(light)grey</span></p>

<p class="story_para">Bright:
<span style="background-color: #073642;color: #002b36;">black/grey</span>
<span style="background-color: #073642;color: #cb4b16;">red</span>
<span style="background-color: #073642;color: #586e75;">green</span>
<span style="background-color: #073642;color: #657b83;">yellow</span>
<span style="background-color: #073642;color: #839496;">blue</span>
<span style="background-color: #073642;color: #6c71c4;">magenta</span>
<span style="background-color: #073642;color: #93a1a1;">cyan</span>
<span style="background-color: #073642;color: #fdf6e3;">white</span>
</p>

]]></description>
  </item>
  </channel>
</rss>
<!-- Total serving time: 0.952116 seconds -->