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

 <title>Nicolas Hoizey</title>
 <link href="https://nicolas-hoizey.com/atom.xml" rel="self"/>
 <link href="https://nicolas-hoizey.com/?utm_source=Atom%20feed"/>
 <updated>2017-11-30T00:52:30+01:00</updated>
 <id>https://nicolas-hoizey.com/</id>
 <author>
   <name></name>
   <email></email>
 </author>

 
 <entry>
   <title>Medium is only an edge server of your POSSE CDN, your own blog is the origin</title>
   <link href="https://nicolas-hoizey.com/2017/11/medium-is-only-an-edge-server-of-your-posse-cdn-your-own-blog-is-the-origin.html"/>
   <updated>2017-11-09T00:00:00+01:00</updated>
   <id>https://nicolas-hoizey.com/2017/11/medium-is-only-an-edge-server-of-your-posse-cdn-your-own-blog-is-the-origin</id>
   <content type="html">&lt;p&gt;People tend to be lazy (I am often) and chose the easiest tool to do the job, even if it’s not the best one. &lt;a href=&quot;https://medium.com/&quot;&gt;Medium&lt;/a&gt; is the new &lt;a href=&quot;https://www.blogger.com/&quot;&gt;Blogger&lt;/a&gt;&lt;sup id=&quot;fnref:ev-williams&quot;&gt;&lt;a href=&quot;#fn:ev-williams&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, but with a &lt;a href=&quot;https://medium.com/@ev/writing-in-medium-df8eac9f4a5e&quot;&gt;much nicer content editing UI&lt;/a&gt;, and a cleaner presentation of content to readers&lt;sup id=&quot;fnref:blur&quot;&gt;&lt;a href=&quot;#fn:blur&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;. People can create and account and start publish in a few minutes, it’s really easy. But how can all this be free?&lt;/p&gt;

&lt;h2 id=&quot;medium-can-do-anything-with-your-content&quot;&gt;Medium can do anything with your content&lt;/h2&gt;

&lt;p&gt;Andrea Phillips already said it a few years ago in her post &lt;a href=&quot;https://medium.com/@andrhia/the-problem-with-medium-336300490cbb&quot;&gt;The Problem With Medium&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;you’re giving your writing to a corporation for free, and they can do anything they want with it. Forever. Without paying you. Ever.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Terms of Service have evolved since Andrea’s post back in 2013, but are still to be carefully considered (emphasis mine):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;By posting content to Medium, you give us a nonexclusive license to publish it on Medium Services, including &lt;strong&gt;anything reasonably related to publishing it&lt;/strong&gt; (like storing, displaying, reformatting, and distributing it). In consideration for Medium granting you access to and use of the Services, &lt;strong&gt;you agree that Medium may enable advertising on the Services&lt;/strong&gt;, including in connection with the display of your content or other information. &lt;strong&gt;We may also use your content to promote Medium&lt;/strong&gt;, including its products and content. — &lt;a href=&quot;https://medium.com/policy/medium-terms-of-service-9db0094a1e0f#8c81&quot;&gt;Content rights &amp;amp; responsibilities&lt;/a&gt; section of current &lt;a href=&quot;https://medium.com/policy/medium-terms-of-service-9db0094a1e0f&quot;&gt;Medium Terms of Service&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Of course, Medium is an obvious black sheep, but the same can be said about most other centralized and closed services.&lt;/p&gt;

&lt;h2 id=&quot;bad-things-can-happen&quot;&gt;Bad things can happen&lt;/h2&gt;

&lt;p&gt;Additionally, Medium is a service that can disappear like many others before, and your content might be lost. I will never accept to take such a risk for my content.&lt;/p&gt;

&lt;p&gt;Also, there are sometimes issues with content moderation, like &lt;a href=&quot;https://twitter.com/poshaughnessy/&quot;&gt;Peter O’Shaughnessy&lt;/a&gt; experienced a few days ago:&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Nothing like having your new blog post suspended by &lt;a href=&quot;https://twitter.com/Medium?ref_src=twsrc%5Etfw&quot;&gt;@Medium&lt;/a&gt; to remind you of the good old days of self-hosting 😳 &lt;a href=&quot;https://t.co/TpSUEPZgQP&quot;&gt;https://t.co/TpSUEPZgQP&lt;/a&gt; &lt;a href=&quot;https://t.co/MhlvgLIbxH&quot;&gt;pic.twitter.com/MhlvgLIbxH&lt;/a&gt;&lt;/p&gt;&amp;mdash; peter@toot.cafe (@poshaughnessy) &lt;a href=&quot;https://twitter.com/poshaughnessy/status/927836002915356672?ref_src=twsrc%5Etfw&quot;&gt;November 7, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;Disappearing content can happen on any platform, like &lt;a href=&quot;https://gizmodo.com/search-for-bisexual-on-twitter-right-now-and-no-news-1820161061&quot;&gt;it did on Twitter recently&lt;/a&gt;, but when you don’t own the platform, you don’t have any way to fix the issue, you can just wait for the platform owner to do it, if it pleases him.&lt;/p&gt;

&lt;h2 id=&quot;posse-is-the-best-option&quot;&gt;POSSE is the best option&lt;/h2&gt;

&lt;p&gt;POSSE means &lt;strong&gt;P&lt;/strong&gt;ublish (on your) &lt;strong&gt;O&lt;/strong&gt;wn &lt;strong&gt;S&lt;/strong&gt;ite, &lt;strong&gt;S&lt;/strong&gt;yndicate &lt;strong&gt;E&lt;/strong&gt;lsewhere.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_200/https://nicolas-hoizey.com/assets/logos/indiewebcamp.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_100/https://nicolas-hoizey.com/assets/logos/indiewebcamp.png 100w, https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_250/https://nicolas-hoizey.com/assets/logos/indiewebcamp.png 250w, https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_400/https://nicolas-hoizey.com/assets/logos/indiewebcamp.png 400w&quot; sizes=&quot;(min-width: 55rem) 12.5rem, (min-width: 30rem) 22.5vw, 30vw&quot; class=&quot;logo&quot; width=&quot;600&quot; height=&quot;286&quot; /&gt;
Like &lt;a href=&quot;/2017/07/so-long-disqus-hello-webmentions.html&quot;&gt;Webmentions&lt;/a&gt;, POSSE is a creation of &lt;a href=&quot;https://indieweb.org/&quot;&gt;IndieWeb&lt;/a&gt;, which gives this description:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;POSSE lets your friends keep using whatever they use to read your stuff (e.g. silo aggregators like Facebook, Tumblr, Twitter, etc.).&lt;/p&gt;

  &lt;p&gt;It’s a key part of why and how the IndieWeb movement is different from just “everyone blog on their own site”, and also different from “everyone just install and run (YourFavoriteSocialSoftware)” etc. monoculture solutions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You really own your content, on your own (cool) URLs, and it’s up to you to &lt;a href=&quot;https://remysharp.com/2016/12/22/cool-uris-dont-change&quot;&gt;make it last&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But you also syndicate it on other platform (most being centralized and closed) that might have greater reach. Ideally, copies of your content on these platforms should link to your canonical URLs. Even &lt;a href=&quot;https://help.medium.com/hc/en-us/articles/217991468-SEO-and-duplicate-content&quot;&gt;Medium allows it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;IndieWeb listed &lt;a href=&quot;https://indieweb.org/POSSE#How_To_Implement&quot;&gt;a few ways to POSSE to popular services and social networks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This blog is already POSSEed on &lt;a href=&quot;https://twitter.com/nhoizey&quot;&gt;Twitter&lt;/a&gt; and &lt;a href=&quot;https://www.facebook.com/nhoizey&quot;&gt;Facebook&lt;/a&gt; thanks to &lt;a href=&quot;https://nicolas-hoizey.com/atom.xml&quot;&gt;the Atom feed&lt;/a&gt;, &lt;a href=&quot;https://ifttt.com/&quot;&gt;IFTTT&lt;/a&gt; and &lt;a href=&quot;https://buffer.com/&quot;&gt;Buffer&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;the-content-delivery-network&quot;&gt;The Content Delivery Network&lt;/h2&gt;

&lt;p&gt;You can think of these other platforms as edge servers in a &lt;a href=&quot;https://en.wikipedia.org/wiki/Content_delivery_network&quot;&gt;Content Delivery Network&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The goal is to “distribute service spatially relative to end-users to provide high availability and high performance”. The edge server that will serve an HTML page or static resource to a user is often the closest one. These edge servers get the content to serve from the origin server, operated by the content owner. The end-user might never contact the origin directly, but the most important is that she gets the pages and associated resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Medium, Twitter, Facebook and others are edge services for your content&lt;/strong&gt;, they are the platforms where you will find — unfortunately — more readers that on your own URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your platform is the origin&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;lets-make-copies-of-our-own-content-to-medium&quot;&gt;Let’s make copies of our own content to Medium&lt;/h2&gt;

&lt;p&gt;You can &lt;a href=&quot;https://help.medium.com/hc/en-us/articles/214550207-Import-post&quot;&gt;manually import any post onto Medium&lt;/a&gt;, just &lt;a href=&quot;https://medium.com/@nhoizey/chrome-fails-showing-big-emojis-8b274d98f17b&quot;&gt;like I did&lt;/a&gt; for my recent post about &lt;a href=&quot;/2017/10/chrome-fails-showing-big-emojis.html&quot;&gt;big emojis not rendered by Chrome&lt;/a&gt;. But there are &lt;a href=&quot;https://help.medium.com/hc/en-us/sections/115001484747-Editing-formatting&quot;&gt;very few formating options&lt;/a&gt;, it’s really not made for such technical writings with code blocks.&lt;/p&gt;

&lt;p&gt;There is also &lt;a href=&quot;https://github.com/Medium/medium-api-docs&quot;&gt;an API&lt;/a&gt; that allows you to &lt;code class=&quot;highlighter-rouge&quot;&gt;POST&lt;/code&gt; you content to Medium. Jeremy Keith &lt;a href=&quot;https://adactio.com/journal/9694&quot;&gt;blogged about this&lt;/a&gt;, and shared &lt;a href=&quot;https://gist.github.com/adactio/c174a4a68498e30babfd&quot;&gt;his PHP code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If like me you use Jekyll, Aaron Gustafson, author of &lt;a href=&quot;/2017/07/so-long-disqus-hello-webmentions.html&quot;&gt;the plugin I use for Webmentions&lt;/a&gt; has created another plugin for &lt;a href=&quot;https://www.aaron-gustafson.com/notebook/crossposting-to-medium-from-jekyll/&quot;&gt;Crossposting to Medium From Jekyll&lt;/a&gt;, taking inspiration for Jeremy Keith’s PHP code. I might try it soon.&lt;/p&gt;

&lt;h2 id=&quot;but-setting-your-own-platform-is-not-so-easy&quot;&gt;But setting your own platform is not so easy&lt;/h2&gt;

&lt;p&gt;I know it is not easy for most people to create and host their own platform, like &lt;a href=&quot;https://twitter.com/nsteinmetz/status/928183482882428928&quot;&gt;Nicolas told me on Twitter&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Agree but effort may be too high for (lazy) people and platforms lower reach for external contributions in favour of their own content&lt;/p&gt;&amp;mdash; Nicolas Steinmetz (@nsteinmetz) &lt;a href=&quot;https://twitter.com/nsteinmetz/status/928183482882428928?ref_src=twsrc%5Etfw&quot;&gt;November 8, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;Remouk also added that the reach of our own platform is almost nonexistent, and that he has more comments on social shares than on the actual contents themselves:&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;fr&quot; dir=&quot;ltr&quot;&gt;Oui je suis bien d&amp;#39;accord, je rebondissais juste sur le côté pratique d&amp;#39;avoir son propre blog: ce n&amp;#39;est pas si compliqué à faire mais l&amp;#39;audience sera ridicule / inexistante. J&amp;#39;ai plus de commentaires sur les partages de mes articles que sur mes articles eux-même. (:&lt;/p&gt;&amp;mdash; remouk (@remouk) &lt;a href=&quot;https://twitter.com/remouk/status/928189534264754177?ref_src=twsrc%5Etfw&quot;&gt;November 8, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;I experience the same, that’s why I’m really happy that &lt;a href=&quot;/2017/07/so-long-disqus-hello-webmentions.html&quot;&gt;Webmentions, webmention.io and Bridgy&lt;/a&gt; allow me to get Twitter comments back to my posts.&lt;/p&gt;

&lt;p&gt;So, yes, it’s obvious not everyone who wants to publish content is able to build and host his own platform. Even tech-savvy people can have difficulties doing so.&lt;/p&gt;

&lt;h2 id=&quot;your-own-platform-is-the-nearest-you-can-get-help-to-setup&quot;&gt;Your “own” platform is the nearest you can (get help to) setup&lt;/h2&gt;

&lt;p&gt;If you can’t do it right now, let’s say hosting your own platform is your long term target.&lt;/p&gt;

&lt;p&gt;You can start by choosing a better platform that Medium to create your content, the origin that will serve all edge platforms you want to have for their greater reach.&lt;/p&gt;

&lt;p&gt;Such a platform can be Github with &lt;a href=&quot;https://pages.github.com/&quot;&gt;Github Pages&lt;/a&gt;, where your content will more be yours than on Medium. You can also use the hosted &lt;a href=&quot;https://en.wordpress.com/&quot;&gt;Wordpress.com&lt;/a&gt;. Or whatever where you will be confident enough you won’t lose your content, and ownership of it.&lt;/p&gt;

&lt;p&gt;But &lt;strong&gt;first, chose your own domain name&lt;/strong&gt;, and use it for your canonical URLs. If you want later to change the platform, you can change where your domain points to, and your canonical URLs will be safe.&lt;/p&gt;

&lt;p&gt;It’s free on Github, and only costs 4€ a month on Wordpress.com.&lt;/p&gt;

&lt;p&gt;It is one of the first items in &lt;a href=&quot;https://indieweb.org/IndieMark&quot;&gt;the IndieMark set of metrics&lt;/a&gt; for “measuring the indieweb-ness of a site, and a step-by-step approach to incrementally adopting indieweb features on your site”.&lt;/p&gt;

&lt;p&gt;It is really worth it.&lt;/p&gt;

&lt;p&gt;I’m not alone recommending this:&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;&amp;gt; If you don’t have a blog, I urge you, start working on one this weekend. Your own blog, with your own content, at your own domain. — &lt;a href=&quot;https://twitter.com/csswizardry?ref_src=twsrc%5Etfw&quot;&gt;@csswizardry&lt;/a&gt; &lt;a href=&quot;https://t.co/8pOMUdRJtI&quot;&gt;https://t.co/8pOMUdRJtI&lt;/a&gt;&lt;/p&gt;&amp;mdash; Nicolas Hoizey (@nhoizey) &lt;a href=&quot;https://twitter.com/nhoizey/status/932291964434898944?ref_src=twsrc%5Etfw&quot;&gt;November 19, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:ev-williams&quot;&gt;
      &lt;p&gt;Ev Williams, the CEO of Medium, is one of Twitter’s co-founders, but was previously headding Blogger. &lt;a href=&quot;#fnref:ev-williams&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:blur&quot;&gt;
      &lt;p&gt;I must say I really don’t like the way they deal with images through, with this ugly blur. &lt;a href=&quot;#fnref:blur&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Chrome fails showing big emojis</title>
   <link href="https://nicolas-hoizey.com/2017/10/chrome-fails-showing-big-emojis.html"/>
   <updated>2017-10-27T00:00:00+02:00</updated>
   <id>https://nicolas-hoizey.com/2017/10/chrome-fails-showing-big-emojis</id>
   <content type="html">&lt;p&gt;It was the first time I really tried to use Web technologies instead of Powerpoint to create slides for a talk. The aim was to be able to demonstrate some cool responsive images features right inside the slides. But when I tried to put big emojis is these slides to emphasize reactions to these features, I discovered Chrome didn’t show some of them!&lt;/p&gt;

&lt;p&gt;I tried in Firefox, and it did show the emojis without any issue. Unfortunately, Firefox on macOS doesn’t have a real fullscreen option appart from the one you can start with JavaScript, so I had to use Chrome.&lt;/p&gt;

&lt;p&gt;I found the maximum &lt;code class=&quot;highlighter-rouge&quot;&gt;font-size&lt;/code&gt; after which Chrome didn’t show the emojis anymore was &lt;code class=&quot;highlighter-rouge&quot;&gt;128px&lt;/code&gt;:&lt;/p&gt;

&lt;figure&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_800/https://nicolas-hoizey.com/2017/10/chrome-emoji-128px-max.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_360/https://nicolas-hoizey.com/2017/10/chrome-emoji-128px-max.png 360w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_670/https://nicolas-hoizey.com/2017/10/chrome-emoji-128px-max.png 670w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_980/https://nicolas-hoizey.com/2017/10/chrome-emoji-128px-max.png 980w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_1290/https://nicolas-hoizey.com/2017/10/chrome-emoji-128px-max.png 1290w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_1600/https://nicolas-hoizey.com/2017/10/chrome-emoji-128px-max.png 1600w&quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; width=&quot;1792&quot; height=&quot;1322&quot; /&gt;
&lt;figcaption&gt;&lt;p&gt;Chrome doesn’t show emoji for a &lt;code class=&quot;highlighter-rouge&quot;&gt;font-size&lt;/code&gt; above &lt;code class=&quot;highlighter-rouge&quot;&gt;128px&lt;/code&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I tried to circumvent this issue by scaling an emoji with a lower &lt;code class=&quot;highlighter-rouge&quot;&gt;font-size&lt;/code&gt;, using CSS transformations, but it didn’t work either:&lt;/p&gt;

&lt;figure&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_800/https://nicolas-hoizey.com/2017/10/chrome-emoji-65px-scale-2-either.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_360/https://nicolas-hoizey.com/2017/10/chrome-emoji-65px-scale-2-either.png 360w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_670/https://nicolas-hoizey.com/2017/10/chrome-emoji-65px-scale-2-either.png 670w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_980/https://nicolas-hoizey.com/2017/10/chrome-emoji-65px-scale-2-either.png 980w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_1290/https://nicolas-hoizey.com/2017/10/chrome-emoji-65px-scale-2-either.png 1290w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_1600/https://nicolas-hoizey.com/2017/10/chrome-emoji-65px-scale-2-either.png 1600w&quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; width=&quot;1792&quot; height=&quot;1322&quot; /&gt;
&lt;figcaption&gt;&lt;p&gt;Chrome doesn’t show a &lt;code class=&quot;highlighter-rouge&quot;&gt;65px&lt;/code&gt; emoji scaled twice either&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;It looked like the render size was the limit, instead of the actual &lt;code class=&quot;highlighter-rouge&quot;&gt;font-size&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here is the code I used, you can put it directly in the URL field of your browser:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;data:text/html;charset=utf-8,&lt;span class=&quot;nt&quot;&gt;&amp;lt;body&amp;gt;&amp;lt;p&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;style=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;margin: 0; font-size:128px&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;128px: %F0%9F%98%B1&lt;span class=&quot;nt&quot;&gt;&amp;lt;/p&amp;gt;&amp;lt;p&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;style=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;margin: 0;font-size:129px&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;129px: %F0%9F%98%B1&lt;span class=&quot;nt&quot;&gt;&amp;lt;/p&amp;gt;&amp;lt;p&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;style=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;margin: 0;font-size:65px; transform: scale(2); transform-origin: top left&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;65px * 2: %F0%9F%98%B1&lt;span class=&quot;nt&quot;&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then, I discovered the emoji where shown when I put the browser window on another screen, I was really astonished:&lt;/p&gt;

&lt;div class=&quot;ratio-4-3 embed-video-container&quot; onclick=&quot;var myAnchor = document.getElementById('XlDxkRq2Gr4');var tmpDiv = document.createElement('div');tmpDiv.innerHTML = '&amp;lt;iframe style=&amp;quot;vertical-align:top;width:100%;height:100%;position:absolute;&amp;quot; src=&amp;quot;https://www.youtube.com/embed/XlDxkRq2Gr4?autoplay=1&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;';myAnchor.parentNode.replaceChild(tmpDiv.firstChild, myAnchor);return false;&quot; title=&quot;click here to play&quot;&gt;
&lt;a class=&quot;youtube-lazy-link&quot; style=&quot;width:100%;height:100%;background:#000 url(https://i2.ytimg.com/vi/XlDxkRq2Gr4/0.jpg) center center no-repeat;background-size:contain;position:absolute&quot; href=&quot;https://www.youtube.com/watch?v=XlDxkRq2Gr4&quot; id=&quot;XlDxkRq2Gr4&quot; onclick=&quot;return false;&quot;&gt;
&lt;div class=&quot;youtube-lazy-link-div&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;youtube-lazy-link-info&quot;&gt;Chromium issue 719648&lt;/div&gt;
&lt;/a&gt;
&lt;div class=&quot;video-info&quot;&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;I had forgotten my MacBook 12” screen was a Retina one, which means there were twice the pixels of a standard screen.&lt;/p&gt;

&lt;p&gt;So it looks like the actual physical pixels Chrome doesn’t want to fill with emojis is above &lt;code class=&quot;highlighter-rouge&quot;&gt;256px&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I found the issue had already been &lt;a href=&quot;https://bugs.chromium.org/p/chromium/issues/detail?id=719648#c13&quot;&gt;reported on bugs.chromium.org&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/TobiReif&quot;&gt;Tobi Reif&lt;/a&gt;, so I added my own test case to help fix it.&lt;/p&gt;

&lt;p&gt;Tobi had encountered this issue on Chrome mobile on Android, as he showed on &lt;a href=&quot;https://tobireif.com/posts/maximum_font_size_for_emoji/&quot;&gt;his own test case&lt;/a&gt;, for a &lt;code class=&quot;highlighter-rouge&quot;&gt;font-size&lt;/code&gt; above &lt;code class=&quot;highlighter-rouge&quot;&gt;54px&lt;/code&gt;. He used a Samsung Galaxy S6, which has &lt;a href=&quot;https://mydevice.io/devices/#sortSmartphones&quot;&gt;a 4 pixel ratio&lt;/a&gt;, so the threshold for him was a rendering size of &lt;code class=&quot;highlighter-rouge&quot;&gt;54 * 4 = 216 pixels&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I wonder why it differs from Chrome desktop, it would be nice to test this on several devices to understand more what happens.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>So long Disqus, hello Webmention</title>
   <link href="https://nicolas-hoizey.com/2017/07/so-long-disqus-hello-webmentions.html"/>
   <updated>2017-07-27T00:00:00+02:00</updated>
   <id>https://nicolas-hoizey.com/2017/07/so-long-disqus-hello-webmentions</id>
   <content type="html">&lt;p&gt;Enough. I’m fed up with Disqus. It’s been useful, easy to plug on this blog, but it’s a mess for web performance, and I don’t own my data, so… bye bye. Webmention is now a great alternative, with more people implementing it, so let’s try to keep only that.&lt;/p&gt;

&lt;h2 id=&quot;so-long-disqus&quot;&gt;So long Disqus&lt;/h2&gt;

&lt;p&gt;When I launched this Jekyll based site a while ago, I didn’t put any comment system, because I didn’t like any of &lt;a href=&quot;https://nicolas-hoizey.com/2013/09/gerer-des-commentaires-sur-un-blog-statique.html&quot; hreflang=&quot;fr&quot;&gt;the options available at the moment&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Later, I was missing the interaction I had on my previous dynamic blog powered by &lt;a href=&quot;https://www.spip.net/en_rubrique25.html&quot;&gt;SPIP&lt;/a&gt;, so I jumped in the Disqus train, because it was the most used around me, and on the sites I visited.&lt;/p&gt;

&lt;h3 id=&quot;disqus-is-so-easy-to-use-with-jekyll&quot;&gt;Disqus is so easy to use with Jekyll&lt;/h3&gt;

&lt;p&gt;Installing Disqus on a blog only requires &lt;a href=&quot;https://gastero-prod.disqus.com/admin/universalcode/&quot;&gt;a few lines&lt;/a&gt; in the post template, with two JavaScript variable to set with Liquid values. Really easy.&lt;/p&gt;

&lt;p&gt;Then generate the site, deploy, and it works!&lt;/p&gt;

&lt;h3 id=&quot;but-disqus-is-a-pain-for-actual-and-perceived-web-performance&quot;&gt;But Disqus is a pain for actual and perceived web performance&lt;/h3&gt;

&lt;p&gt;I hate how Disqus feels so slow when I browse pages using it.&lt;/p&gt;

&lt;p&gt;In fact, Disqus loads asynchronously, so it doesn’t really affect the &lt;a href=&quot;https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/metrics/speed-index&quot;&gt;Speed Index&lt;/a&gt; of the page on initial load and rendering, but I hate almost every use of lazy loading&lt;sup id=&quot;fnref:medium-lazy&quot;&gt;&lt;a href=&quot;#fn:medium-lazy&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, and Disqus’ one is really bad. I scroll the page to the post end, and then Disqus loads the comments and suggested content, pushing everything else, with an annoying repaint. I hate that. It makes me feel like the site is slow.&lt;/p&gt;

&lt;p&gt;Also, Disqus loads around 450 kB of data — mostly JavaScript — on the pages, which is not so light for “just” comments. And it loads that from 5 or 6 different domains&lt;sup id=&quot;fnref:dns&quot;&gt;&lt;a href=&quot;#fn:dns&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;, without a great caching optimization.&lt;/p&gt;

&lt;figure&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_800/https://nicolas-hoizey.com/2017/07/dareboost-disqus-page-weight.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_360/https://nicolas-hoizey.com/2017/07/dareboost-disqus-page-weight.png 360w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_670/https://nicolas-hoizey.com/2017/07/dareboost-disqus-page-weight.png 670w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_980/https://nicolas-hoizey.com/2017/07/dareboost-disqus-page-weight.png 980w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_1290/https://nicolas-hoizey.com/2017/07/dareboost-disqus-page-weight.png 1290w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_1600/https://nicolas-hoizey.com/2017/07/dareboost-disqus-page-weight.png 1600w&quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;Disqus weight in the page&quot; width=&quot;1940&quot; height=&quot;856&quot; /&gt;
&lt;figcaption&gt;&lt;p&gt;&lt;a href=&quot;/2015/06/la-recherche-dans-du-statique-facile-avec-algolia.html&quot;&gt;This page&lt;/a&gt;’s weight before and after removing Disqus, as shown in my &lt;a href=&quot;https://www.dareboost.com/&quot;&gt;Dareboost&lt;/a&gt; monitoring. Disqus accounted for &lt;strong&gt;three quarters&lt;/strong&gt; of the page weight!&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Disqus also requires &lt;a href=&quot;https://github.com/nico3333fr/CSP-useful/tree/master/csp-for-third-party-services#disqus&quot;&gt;a few rules in your Content Security Policy&lt;/a&gt;, but that’s manageable.&lt;/p&gt;

&lt;h3 id=&quot;also-not-everyone-likes-to-comment-on-disqus&quot;&gt;Also, not everyone likes to comment on Disqus&lt;/h3&gt;

&lt;p&gt;Disqus being a third party service, we don’t know what our comments become and how Disqus tracks us accross blogs, how &lt;a href=&quot;http://geek-and-poke.com/geekandpoke/2010/12/21/the-free-model.html&quot;&gt;we are becoming the product&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_800/https://nicolas-hoizey.com/2017/07/geek-and-poke-fremium-model.jpg&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_360/https://nicolas-hoizey.com/2017/07/geek-and-poke-fremium-model.jpg 360w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_410/https://nicolas-hoizey.com/2017/07/geek-and-poke-fremium-model.jpg 410w&quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;Geek&amp;amp;Poke cartoon about the “free” model&quot; width=&quot;410&quot; height=&quot;409&quot; /&gt;
&lt;figcaption&gt;&lt;p&gt;The famous Geek&amp;amp;Poke cartoon with pigs talking about the “free” model.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I can of course export all comments to keep my own local copy, but it’s not as convenient as a true local storage.&lt;/p&gt;

&lt;p&gt;Some people also &lt;a href=&quot;https://twitter.com/ChapitreOnze/status/890507297780367360&quot; hreflang=&quot;fr&quot;&gt;don’t like being forced to create an account on Disqus to be able to comment&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you use Disqus on your blog, please active the “Allow guests to comment” option in the settings!&lt;/p&gt;

&lt;figure&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_800/https://nicolas-hoizey.com/2017/07/disqus-guests.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_360/https://nicolas-hoizey.com/2017/07/disqus-guests.png 360w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_670/https://nicolas-hoizey.com/2017/07/disqus-guests.png 670w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_980/https://nicolas-hoizey.com/2017/07/disqus-guests.png 980w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_1290/https://nicolas-hoizey.com/2017/07/disqus-guests.png 1290w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_1378/https://nicolas-hoizey.com/2017/07/disqus-guests.png 1378w&quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;Guest commenting in Disqus&quot; width=&quot;1378&quot; height=&quot;178&quot; /&gt;
&lt;figcaption&gt;&lt;p&gt;If you use Disqus, please allow guests to comment without an account&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;comments-history-is-not-lost&quot;&gt;Comments history is not lost!&lt;/h2&gt;

&lt;p&gt;Of course, removing Disqus could have meant losing the comments made so far. But I don’t like to lose valuable content. Some of the comments you make on my posts are even more valuable than the posts themselves!&lt;/p&gt;

&lt;p&gt;So, I used &lt;a href=&quot;https://twitter.com/pathawks&quot;&gt;Pat Hawks&lt;/a&gt;’s &lt;a href=&quot;https://github.com/pathawks/jekyll-disqus-comments&quot;&gt;jekyll-disqus-comments&lt;/a&gt; plugin to get a copy of all comments into &lt;a href=&quot;https://github.com/nhoizey/nicolas-hoizey.com/tree/master/_comments&quot;&gt;YAML data files&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I had to clean them a lot, mostly manually, because they were an HTML mess. Maybe not only because of Disqus, but also because they had already been &lt;a href=&quot;/a-propos/du-site.html#avec-jekyll-le-statique-cest-fantastique&quot; hreflang=&quot;fr&quot;&gt;migrated from SPIP&lt;/a&gt; before.&lt;/p&gt;

&lt;p&gt;The comments are shown below posts has before&lt;sup id=&quot;fnref:comments&quot;&gt;&lt;a href=&quot;#fn:comments&quot; class=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;, but they are now static, using &lt;a href=&quot;https://github.com/nhoizey/nicolas-hoizey.com/blob/master/_includes/comments.html&quot;&gt;a Jekyll template&lt;/a&gt;, without Disqus being involved anymore.&lt;/p&gt;

&lt;h2 id=&quot;hello-webmention&quot;&gt;Hello Webmention&lt;/h2&gt;

&lt;p&gt;I added Webmention to this blog a while ago, with some success on popular posts like &lt;a href=&quot;https://nicolas-hoizey.com/2017/01/how-much-data-should-my-service-worker-put-upfront-in-the-offline-cache.html#webmentions&quot;&gt;How much data should my Service Worker put upfront in the offline cache?&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I also see that Webmention use is growing elsewhere. For example, &lt;a href=&quot;https://twitter.com/rachelandrew&quot;&gt;Rachel Andrew&lt;/a&gt; chose to adopt Webmention because she add to much SPAM:&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;I had to turn off comments on my recent posts due to them being used as a vector for anonymous abuse. New site will use Web Mentions.&lt;/p&gt;&amp;mdash; Rachel Andrew (@rachelandrew) &lt;a href=&quot;https://twitter.com/rachelandrew/status/882224351688482816?ref_src=twsrc%5Etfw&quot;&gt;July 4, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;I discovered Webmention a while ago thanks to &lt;a href=&quot;https://twitter.com/adactio&quot;&gt;Jeremy Keith&lt;/a&gt;’s &lt;a href=&quot;https://adactio.com/journal/6469&quot;&gt;experiments with Webmention&lt;/a&gt; on his own blog.&lt;/p&gt;

&lt;h3 id=&quot;so-what-is-webmention&quot;&gt;So, what is Webmention?&lt;/h3&gt;

&lt;p&gt;Webmention is &lt;a href=&quot;https://www.w3.org/TR/webmention/&quot;&gt;a W3C recommendation&lt;/a&gt; since January 12nd 2017, based on the great work of &lt;a href=&quot;https://indieweb.org/&quot;&gt;IndieWeb&lt;/a&gt; people.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/drewm&quot;&gt;Drew McLellan&lt;/a&gt;, developer of the Perch CMS with Rachel Andrew, explains very well &lt;a href=&quot;https://allinthehead.com/retro/378/implementing-webmentions&quot;&gt;the Webmention flow&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ol&gt;
    &lt;li&gt;Frankie posts a blog entry.&lt;/li&gt;
    &lt;li&gt;Alex has thoughts in response, so also posts a blog entry linking to Frankie’s.&lt;/li&gt;
    &lt;li&gt;Alex’s publishing software finds the link and fetches Frankie’s post, finding the URL of Frankie’s Webmention endpoint in the document.&lt;/li&gt;
    &lt;li&gt;Alex’s software sends a notification to the endpoint.&lt;/li&gt;
    &lt;li&gt;Frankie’s software then fetches Alex’s post to verify that it really does link back, and then chooses how to display the reaction alongside Frankie’s post.&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;Reminds you of manual trackbacks and Wordpress’ automated pingbacks? Indeed. Let say it’s a standard way to do almost the same.&lt;/p&gt;

&lt;p&gt;Trackbacks and pingbacks failed mostly because of SPAM, and IndieWeb is taking this seriously for Webmention’s future, with intense work on &lt;a href=&quot;https://indieweb.org/Vouch&quot;&gt;Vouch&lt;/a&gt;, an anti-spam extension to Webmention. Let’s hope it gets implemented soon everywhere.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/jamesrichmanx&quot;&gt;James Richman&lt;/a&gt; explains in this post: &lt;a href=&quot;https://wptavern.com/is-w3c-replicating-the-wordpress-pingback-system&quot;&gt;Is W3C Replicating the WordPress Pingback System?&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;how-does-it-work-on-this-site&quot;&gt;How does it work on this site?&lt;/h3&gt;

&lt;p&gt;Webmentions for this site are collected by two services:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://webmention.io/&quot;&gt;webmention.io&lt;/a&gt; “is a hosted service created to easily handle webmentions (and legacy pingbacks) on any web page”. I use it as my Webmention endpoint. This is &lt;a href=&quot;https://github.com/aaronpk/webmention.io&quot;&gt;an open source project&lt;/a&gt; built by &lt;a href=&quot;https://twitter.com/aaronpk&quot;&gt;Aaron Parecki&lt;/a&gt;, co-founder of &lt;a href=&quot;https://indieweb.org/&quot;&gt;IndieWebCamp&lt;/a&gt; and editor of the W3C Webmention and Micropub specifications&lt;sup id=&quot;fnref:shareaholic&quot;&gt;&lt;a href=&quot;#fn:shareaholic&quot; class=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://brid.gy/&quot;&gt;Bridgy&lt;/a&gt; “pulls comments, likes, and reshares on social networks” (Facebook, Twitter, Google+, Instagram, Flickr, etc.) and push them to my Webmention endpoint. This is &lt;a href=&quot;https://github.com/snarfed/bridgy&quot;&gt;an open source project&lt;/a&gt; built by IndieWeb people, and is free to use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once Webmentions are in webmention.io, they are pulled into my jekyll sources thanks to &lt;a href=&quot;https://twitter.com/aarongustafson&quot;&gt;Aaron Gustafson&lt;/a&gt;’s &lt;a href=&quot;https://github.com/aarongustafson/jekyll-webmention_io/&quot;&gt;jekyll-webmention_io&lt;/a&gt; plugin for Jekyll, and added to my posts pages.&lt;/p&gt;

&lt;h2 id=&quot;there-are-still-a-few-issues-to-fix&quot;&gt;There are still a few issues to fix&lt;/h2&gt;

&lt;p&gt;All of this is great, but there are a few issues I’ld like to fix as soon as possible.&lt;/p&gt;

&lt;p&gt;First, there are some Webmentions that should not be shown, either because they are useless, or because they are duplicates. &lt;a href=&quot;https://aaronparecki.com/2017/07/19/24/webmention-io&quot;&gt;webmention.io now provides a way to remove mentions&lt;/a&gt;, and will evolve to add &lt;a href=&quot;https://indieweb.org/block&quot;&gt;a block function&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Also, I should group mentions by type. Likes, for example, can be take much less space in the page. Aaron Gustafson grouped mentions by type &lt;a href=&quot;https://www.aaron-gustafson.com/notebook/your-site-should-be-a-pwa/#webmentions&quot;&gt;on his blog&lt;/a&gt;, but I’ld like to show them as &lt;a href=&quot;https://indieweb.org/facepile&quot;&gt;facepiles&lt;/a&gt;, &lt;a href=&quot;https://allinthehead.com/retro/378/implementing-webmentions#comments&quot;&gt;like Drew McLellan&lt;/a&gt;:&lt;/p&gt;

&lt;figure class=&quot;onehalf&quot;&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_400/https://nicolas-hoizey.com/2017/07/webmention-facepiles.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_180/https://nicolas-hoizey.com/2017/07/webmention-facepiles.png 180w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_335/https://nicolas-hoizey.com/2017/07/webmention-facepiles.png 335w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_490/https://nicolas-hoizey.com/2017/07/webmention-facepiles.png 490w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_645/https://nicolas-hoizey.com/2017/07/webmention-facepiles.png 645w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_757/https://nicolas-hoizey.com/2017/07/webmention-facepiles.png 757w&quot; sizes=&quot;(min-width: 50rem) 25rem, 45vw&quot; alt=&quot;An example of facepile&quot; width=&quot;757&quot; height=&quot;854&quot; /&gt;
&lt;figcaption&gt;&lt;p&gt;Nice facepiles for likes and reposts on Drew McLellan’s site.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I also have issues with some avatars that come directly from Twitter, and are &lt;a href=&quot;https://github.com/aarongustafson/jekyll-webmention_io/issues/24&quot;&gt;really heavy&lt;/a&gt;. The new version of Aaron’s Jekyll plugin will allow me to define my own template, and use Cloudinary to resize and optimize these images. I have yet to try it, because I’m still using the old single file version, while the new one is now a gem.&lt;/p&gt;

&lt;h2 id=&quot;august-11th-2017-update&quot;&gt;August 11th, 2017 update&lt;/h2&gt;

&lt;p&gt;Simple —yet really valuable— Webmentions as likes and reposts are now simple facepiles. They are the most abundant Webmentions, so it helps reduce the length of the page, and make the actual mentions more visible, most being replies on Twitter.&lt;/p&gt;

&lt;p&gt;Also, I’m now using my own templates for all these Webmentions, and I use Cloudinary to optimize all avatars (size, format and weight), and reduce the number of domains from where ressources for the page come. Also, default links to avatars that came from &lt;a href=&quot;https://webmention.io/&quot;&gt;webmention.io&lt;/a&gt; where in fact soft redirects (302) to the actual URL on Twitter’s servers, so there was an additional latency to get them. Looks like I’ve killed two birds with one stone!&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:medium-lazy&quot;&gt;
      &lt;p&gt;Don’t get me started on &lt;a href=&quot;https://jmperezperez.com/medium-image-progressive-loading-placeholder/&quot;&gt;Medium’s stupid images lazy loading&lt;/a&gt; which makes me see only blured useless things when I scroll… &lt;a href=&quot;#fnref:medium-lazy&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:dns&quot;&gt;
      &lt;p&gt;So as many DNS requests are needed. &lt;a href=&quot;#fnref:dns&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:comments&quot;&gt;
      &lt;p&gt;Here is &lt;a href=&quot;https://nicolas-hoizey.com/2017/01/how-much-data-should-my-service-worker-put-upfront-in-the-offline-cache.html#commentaires&quot;&gt;an example of comments preserved for a popular post&lt;/a&gt;. &lt;a href=&quot;#fnref:comments&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:shareaholic&quot;&gt;
      &lt;p&gt;Aaron is also a &lt;a href=&quot;http://www.urbandictionary.com/define.php?term=shareaholic&quot;&gt;shareaholic&lt;/a&gt;, traking on his website &lt;a href=&quot;https://aaronparecki.com/gps/&quot;&gt;where he moves&lt;/a&gt;, &lt;a href=&quot;https://aaronparecki.com/ate&quot;&gt;what he eats&lt;/a&gt;, etc. &lt;a href=&quot;#fnref:shareaholic&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Automatiser l'installation des applications sur un nouveau Mac</title>
   <link href="https://nicolas-hoizey.com/2017/05/automatiser-l-installation-des-applications-sur-un-nouveau-mac.html"/>
   <updated>2017-05-02T00:00:00+02:00</updated>
   <id>https://nicolas-hoizey.com/2017/05/automatiser-l-installation-des-applications-sur-un-nouveau-mac</id>
   <content type="html">&lt;p&gt;Voici &lt;a href=&quot;https://github.com/nhoizey/macOS-init&quot;&gt;un script&lt;/a&gt; qui automatise complètement l’installation de vos applications préférées sur un Mac avec un macOS vierge, et récupère la plupart de vos paramétrages issus d’une installation précédente ou d’un autre Mac.&lt;/p&gt;

&lt;p&gt;La migration d’un ancien à un nouveau Mac est extrêmement simple, presque magique, mais elle signifie que tout ce qui n’allait pas sur l’ancien se retrouve sur le nouveau. Je préfère donc depuis quelques années toujours repartir d’une base saine lorsque je commence à utiliser un nouveau Mac.&lt;/p&gt;

&lt;p&gt;Au delà de cette installation initiale d’un nouveau Mac, il est aussi parfois utile de remettre à zéro un Mac déjà un peu ancien, afin d’optimiser ses ressources, et se débarasser de toutes sortes de choses que l’on a installé en test, puis mal désinstallé. Le faire lors de chaque mise à jour majeure de macOS, par exemple, est une bonne idée.&lt;/p&gt;

&lt;p&gt;Mais cela peut prendre pas mal de temps et donner des migraines, si l’on a peur d’oublier certaines applications ou paramétrages, d’où l’automatisation nécessaire.&lt;/p&gt;

&lt;h2 id=&quot;comment-ce-script-fonctionne-t-il-&quot;&gt;Comment ce script fonctionne-t-il ?&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_200/https://nicolas-hoizey.com/assets/logos/homebrew.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_100/https://nicolas-hoizey.com/assets/logos/homebrew.png 100w, https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_250/https://nicolas-hoizey.com/assets/logos/homebrew.png 250w, https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_256/https://nicolas-hoizey.com/assets/logos/homebrew.png 256w&quot; sizes=&quot;(min-width: 55rem) 12.5rem, (min-width: 30rem) 22.5vw, 30vw&quot; class=&quot;logo&quot; alt=&quot;Homebrew&quot; width=&quot;256&quot; height=&quot;256&quot; /&gt;
Ce script était initialement très largement inspiré de &lt;a href=&quot;https://github.com/nicolinuxfr/macOS-post-installation&quot;&gt;celui de Nicolas Furno&lt;/a&gt;&lt;sup id=&quot;fnref:furno&quot;&gt;&lt;a href=&quot;#fn:furno&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, mais est ensuite passé à l’utilisation de &lt;a href=&quot;https://github.com/Homebrew/homebrew-bundle&quot;&gt;Homebrew Bundle&lt;/a&gt; grâce à la suggestion de &lt;a href=&quot;https://twitter.com/oncletom&quot;&gt;Thomas Parisot&lt;/a&gt;. Il permet d’installer presque tous les logiciels que j’utilise, et de configurer quelques paramètres automatiquement après l’installation de macOS.&lt;/p&gt;

&lt;p&gt;Ce script exploite exclusivement des lignes de commande Shell et il n’a ainsi aucune dépendance. Quelques pré-requis toutefois :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Il faut être administrateur du Mac pour l’utiliser (il exploite la commande &lt;code class=&quot;highlighter-rouge&quot;&gt;sudo&lt;/code&gt;) ;&lt;/li&gt;
  &lt;li&gt;Il faut s’être connecté au préalable dans le Mac App Store ;&lt;/li&gt;
  &lt;li&gt;Les apps à installer depuis la boutique d’Apple doivent déjà être associées à votre compte iTunes Store, donc avoir déjà été achetées, ou téléchargées au moins une fois si elles sont gratuites.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le script utilise 4 applications pour automatiser cela :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://brew.sh&quot; title=&quot;Homebrew — The missing package manager for macOS&quot;&gt;Homebrew&lt;/a&gt; permet d’installer automatiquement des applications système ;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://caskroom.github.io&quot;&gt;Homebrew Cask&lt;/a&gt; permet d’installer des applications macOS qui sont disponibles hors du Mac App Store ;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/mas-cli/mas&quot;&gt;mas&lt;/a&gt; permet d’installer des applications du Mac App Store, à condition qu’elles aient déjà été achetées ou téléchargées au moins une fois si elles sont gratuites ;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/lra/mackup&quot;&gt;Mackup&lt;/a&gt; enfin permet de restaurer les préférences d’applications depuis une installation précédente ou un autre Mac.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;comment-lutiliser&quot;&gt;Comment l’utiliser ?&lt;/h2&gt;

&lt;p&gt;Voici comment utiliser les deux scripts :&lt;/p&gt;

&lt;h3 id=&quot;installation-initiale-de-los-vierge&quot;&gt;Installation initiale de l’OS vierge&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Installez macOS&lt;/li&gt;
  &lt;li&gt;Lancez le Mac App Store et connectez-vous à votre compte&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Attention&lt;/strong&gt;, si vous migrez depuis une autre machine ou faites une réinstallation complète, utilisez tant que possible le même &lt;em&gt;username&lt;/em&gt;, sinon Mackup ne fera pas les bonnes actions pour récupérer les paramètres des applications.&lt;/p&gt;

&lt;h3 id=&quot;première-étape&quot;&gt;Première étape&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Téléchargez la dernière version du projet (&lt;a href=&quot;https://github.com/nhoizey/macOS-init/archive/master.zip&quot;&gt;lien direct&lt;/a&gt;) ;&lt;/li&gt;
  &lt;li&gt;Ouvrez les fichiers &lt;code class=&quot;highlighter-rouge&quot;&gt;post-install.sh&lt;/code&gt; et &lt;code class=&quot;highlighter-rouge&quot;&gt;Brewfile&lt;/code&gt;, et modifiez ce qui est installé par défaut ;&lt;/li&gt;
  &lt;li&gt;Pensez à changer les lignes &lt;code class=&quot;highlighter-rouge&quot;&gt;brew cask install dropbox&lt;/code&gt; et &lt;code class=&quot;highlighter-rouge&quot;&gt;open -a Dropbox&lt;/code&gt; de &lt;a href=&quot;https://github.com/nhoizey/macOS-init/blob/master/post-install.sh&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;post-install.sh&lt;/code&gt;&lt;/a&gt; en fonction du service Cloud utilisé, ou alors à la supprimer si vous ne voulez pas en utilisez ;&lt;/li&gt;
  &lt;li&gt;À partir de la ligne &lt;code class=&quot;highlighter-rouge&quot;&gt;## *** CONFIGURATION ***&lt;/code&gt;, le script configure quelques réglages par défaut, à modifier selon vos besoins ;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://fr.wikihow.com/ouvrir-le-Terminal-sur-un-Mac&quot;&gt;Ouvrez ensuite le Terminal de macOS&lt;/a&gt;, glissez le fichier &lt;code class=&quot;highlighter-rouge&quot;&gt;post-install.sh&lt;/code&gt; depuis le Finder vers le Terminal, et appuyez sur la touche &lt;kbd&gt;Entrée&lt;/kbd&gt; et accrochez votre ceinture ;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Le script fonctionnera largement sans votre intervention, sauf :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;pour valider l’installation de Homebrew ;&lt;/li&gt;
  &lt;li&gt;pour saisir le mot de passe administrateur pour Homebrew ;&lt;/li&gt;
  &lt;li&gt;pour le mot de passe administrateur nécessaire pour Cask ;&lt;/li&gt;
  &lt;li&gt;pour certains logiciels qui nécessitent un accès admin ;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si tout va bien, il se terminera normalement sans erreur, mais en cas d’erreur, vous pourrez relancer le script et seul ce qui n’a pas déjà été installé, sera installé ;&lt;/p&gt;

&lt;h3 id=&quot;seconde-étape&quot;&gt;Seconde étape&lt;/h3&gt;

&lt;p&gt;Quand le premier script est terminé, et quand vos données sont synchronisées depuis le cloud :&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Ouvrez le fichier &lt;code class=&quot;highlighter-rouge&quot;&gt;post-cloud.sh&lt;/code&gt; et modifiez la &lt;a href=&quot;https://github.com/nhoizey/macOS-init/blob/master/post-cloud.sh#L8&quot;&gt;ligne 8&lt;/a&gt; en fonction du service de Cloud choisi, ou laissez-la en commentaire si vous utilisez Dropbox (choix par défaut) ;&lt;/li&gt;
  &lt;li&gt;Glissez le fichier &lt;code class=&quot;highlighter-rouge&quot;&gt;post-cloud.sh&lt;/code&gt; du Finder vers le Terminal, et appuyez sur la touche &lt;kbd&gt;Entrée&lt;/kbd&gt; pour finir l’installation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Voilà, c’est opérationnel.&lt;/p&gt;

&lt;h3 id=&quot;mises-à-jour-ultérieures&quot;&gt;Mises à jour ultérieures&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Lancez le script &lt;code class=&quot;highlighter-rouge&quot;&gt;update.sh&lt;/code&gt; pour mettre à jour toutes les applications qui le nécessitent.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;lautomatisation-ultime&quot;&gt;L’automatisation ultime&lt;/h2&gt;

&lt;p&gt;Je me suis encore plus facilité la tâche avec une automatisation supplémentaire qui lance directement l’installation de &lt;strong&gt;ma propre sélection&lt;/strong&gt; d’applications, sans avoir à passer par toutes les autres étapes ci-dessus :&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;-sfL&lt;/span&gt; https://nhoizey.github.io/macOS-init/run.sh | sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Bien entendu, ne lancez pas cette commande directement si vous ne souhaitez pas installer les mêmes applications que moi, ce qui est probable.&lt;/p&gt;

&lt;p&gt;Pour conclure et achever de vous convaincre de l’intérêt de ce script, sachez que je me suis « amusé » à installer complètement trois fois un même Mac en une après-midi, alors qu’il me fallait avant bien deux jours pour arriver au même résultat manuellement.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:furno&quot;&gt;
      &lt;p&gt;Script qu’il a &lt;a href=&quot;https://www.macg.co/logiciels/2017/01/un-script-pour-configurer-automatiquement-un-nouveau-mac-96652&quot;&gt;décrit dans un article MacGénération&lt;/a&gt;. &lt;a href=&quot;#fnref:furno&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>99 Red Balloons played with red balloons</title>
   <link href="https://nicolas-hoizey.com/2017/02/99-red-balloons-played-with-red-balloons.html"/>
   <updated>2017-02-03T00:00:00+01:00</updated>
   <id>https://nicolas-hoizey.com/2017/02/99-red-balloons-played-with-red-balloons</id>
   <content type="html">&lt;p&gt;Vous connaissez certainement la chanson « &lt;a href=&quot;https://fr.wikipedia.org/wiki/99_Luftballons&quot;&gt;99 Luftballons&lt;/a&gt; » du groupe allemand Nena&lt;sup id=&quot;fnref:nena&quot;&gt;&lt;a href=&quot;#fn:nena&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; qui dénonçait la guerre froide, et fût &lt;a href=&quot;https://fr.wikipedia.org/wiki/99_Luftballons#Classements&quot;&gt;un hit en Europe&lt;/a&gt; au milieu des années 80. Mais vous ne saviez pas encore, sans doute, qu’un doux dingue a joué ce morceau avec des ballons de baudruche rouges…&lt;/p&gt;

&lt;p&gt;Ce titre de chanson ne vous dit rien ? Rappel :&lt;/p&gt;

&lt;div class=&quot;ratio-4-3 embed-video-container&quot; onclick=&quot;var myAnchor = document.getElementById('La4Dcd1aUcE');var tmpDiv = document.createElement('div');tmpDiv.innerHTML = '&amp;lt;iframe style=&amp;quot;vertical-align:top;width:100%;height:100%;position:absolute;&amp;quot; src=&amp;quot;https://www.youtube.com/embed/La4Dcd1aUcE?autoplay=1&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;';myAnchor.parentNode.replaceChild(tmpDiv.firstChild, myAnchor);return false;&quot; title=&quot;click here to play&quot;&gt;
&lt;a class=&quot;youtube-lazy-link&quot; style=&quot;width:100%;height:100%;background:#000 url(https://i2.ytimg.com/vi/La4Dcd1aUcE/0.jpg) center center no-repeat;background-size:contain;position:absolute&quot; href=&quot;https://www.youtube.com/watch?v=La4Dcd1aUcE&quot; id=&quot;La4Dcd1aUcE&quot; onclick=&quot;return false;&quot;&gt;
&lt;div class=&quot;youtube-lazy-link-div&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;youtube-lazy-link-info&quot;&gt;Nena ‎- 99 Luftballons&lt;/div&gt;
&lt;/a&gt;
&lt;div class=&quot;video-info&quot;&gt;Music video by  Nena ‎performing 99 Luftballons  (P) 1983 CBS Schallplatten GmbH
For Entertainment Purpose Only.
See more 80s music videos at http://tv80s.com&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Il en existe une version en anglais, intitulée « 99 Red Balloons » :&lt;/p&gt;

&lt;div class=&quot;ratio-4-3 embed-video-container&quot; onclick=&quot;var myAnchor = document.getElementById('HZ1TQYjCwYc');var tmpDiv = document.createElement('div');tmpDiv.innerHTML = '&amp;lt;iframe style=&amp;quot;vertical-align:top;width:100%;height:100%;position:absolute;&amp;quot; src=&amp;quot;https://www.youtube.com/embed/HZ1TQYjCwYc?autoplay=1&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;';myAnchor.parentNode.replaceChild(tmpDiv.firstChild, myAnchor);return false;&quot; title=&quot;click here to play&quot;&gt;
&lt;a class=&quot;youtube-lazy-link&quot; style=&quot;width:100%;height:100%;background:#000 url(https://i2.ytimg.com/vi/HZ1TQYjCwYc/0.jpg) center center no-repeat;background-size:contain;position:absolute&quot; href=&quot;https://www.youtube.com/watch?v=HZ1TQYjCwYc&quot; id=&quot;HZ1TQYjCwYc&quot; onclick=&quot;return false;&quot;&gt;
&lt;div class=&quot;youtube-lazy-link-div&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;youtube-lazy-link-info&quot;&gt;Nena   99 Red Balloons   Top Of The Pops&lt;/div&gt;
&lt;/a&gt;
&lt;div class=&quot;video-info&quot;&gt; &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;J’ai découvert l’existence de &lt;a href=&quot;http://andrewhuang.com/&quot;&gt;Andrew Huang&lt;/a&gt; grâce à ce tweet de Hubert Sablonnière :&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;😍 I love this world!!&lt;br /&gt;&lt;br /&gt;🤔 &lt;a href=&quot;https://twitter.com/andrewismusic?ref_src=twsrc%5Etfw&quot;&gt;@andrewismusic&lt;/a&gt; inverts &amp;quot;Für Elise&amp;quot; manually &lt;a href=&quot;https://t.co/Th7c4ybkR5&quot;&gt;https://t.co/Th7c4ybkR5&lt;/a&gt;&lt;br /&gt;😏 &lt;a href=&quot;https://twitter.com/sophira?ref_src=twsrc%5Etfw&quot;&gt;@Sophira&lt;/a&gt; answers with &lt;a href=&quot;https://t.co/Jyc3864ZUQ&quot;&gt;https://t.co/Jyc3864ZUQ&lt;/a&gt; &lt;a href=&quot;https://t.co/AHTq1w86y5&quot;&gt;pic.twitter.com/AHTq1w86y5&lt;/a&gt;&lt;/p&gt;&amp;mdash; Hubert 😎 SABLONNIÈRE (@hsablonniere) &lt;a href=&quot;https://twitter.com/hsablonniere/status/827444273427644416?ref_src=twsrc%5Etfw&quot;&gt;February 3, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;C’est ainsi que j’ai découvert cette version de « 99 Red Balloons » jouée par Andrew avec des ballons de baudruche rouge :&lt;/p&gt;

&lt;div class=&quot;ratio-4-3 embed-video-container&quot; onclick=&quot;var myAnchor = document.getElementById('aZND9dApFKU');var tmpDiv = document.createElement('div');tmpDiv.innerHTML = '&amp;lt;iframe style=&amp;quot;vertical-align:top;width:100%;height:100%;position:absolute;&amp;quot; src=&amp;quot;https://www.youtube.com/embed/aZND9dApFKU?autoplay=1&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;';myAnchor.parentNode.replaceChild(tmpDiv.firstChild, myAnchor);return false;&quot; title=&quot;click here to play&quot;&gt;
&lt;a class=&quot;youtube-lazy-link&quot; style=&quot;width:100%;height:100%;background:#000 url(https://i2.ytimg.com/vi/aZND9dApFKU/0.jpg) center center no-repeat;background-size:contain;position:absolute&quot; href=&quot;https://www.youtube.com/watch?v=aZND9dApFKU&quot; id=&quot;aZND9dApFKU&quot; onclick=&quot;return false;&quot;&gt;
&lt;div class=&quot;youtube-lazy-link-div&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;youtube-lazy-link-info&quot;&gt;99 Red Balloons - played with red balloons.&lt;/div&gt;
&lt;/a&gt;
&lt;div class=&quot;video-info&quot;&gt;✸ Support more content like this on Patreon:
http://www.patreon.com/andrewhuang

✸ Here's another video where I perform with a balloon LIVE:
https://www.youtube.com/watch?v=g2ywowYEMw4

✸ FAQ:
1. How many balloons did you use? Four.
2. How long did it take? Around one hour of recording, ten hours of computering.
3. Did you use Auto-Tune? No.

✸ More of my stuff:
Twitter: http://twitter.com/andrewhuang
Facebook: http://facebook.com/andrewismusic
Instagram: http://instagram.com/andrewismusic
Snapchat: http://snapchat.com/add/andrewhuaaaaang
Tumblr: http://andrewismusic.tumblr.com
SoundCloud: http://soundcloud.com/andrewismusic
Spotify: https://open.spotify.com/artist/7HifubxN0gO1nHbRIqWhrY

✸ Download and take the balloon happiness with you everywhere you go! 
iTunes https://itunes.apple.com/album/99-red...
Loudr http://ldr.fm/upzWD 

✸ The song at the end is &quot;Nowhere&quot; from my album SPRING:
Bandcamp https://andrewhuang.bandcamp.com/albu...
iTunes https://itunes.apple.com/album/spring...

--

CAMERA I SHOT THIS WITH
http://amzn.to/1JqgAmk

LENS I SHOT THIS WITH
http://amzn.to/1PGHKFd

MY MUSIC SOFTWARE
http://amzn.to/1OHWIxu

MY COMPUTER
http://amzn.to/1PGK0Mu

MY MIC
http://amzn.to/1PGKCln

MY AUDIO INTERFACE
http://amzn.to/1Z3l4GM&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Bon vendredi ! ;-)&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:nena&quot;&gt;
      &lt;p&gt;Nena étant aussi le nom de la chanteuse, pour faire simple. &lt;a href=&quot;#fnref:nena&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Mettre à jour les plugins Jekyll sans danger</title>
   <link href="https://nicolas-hoizey.com/2017/02/mettre-a-jour-les-plugins-jekyll-sans-danger.html"/>
   <updated>2017-02-01T00:00:00+01:00</updated>
   <id>https://nicolas-hoizey.com/2017/02/mettre-a-jour-les-plugins-jekyll-sans-danger</id>
   <content type="html">&lt;p&gt;Si vous n’utilisez pas &lt;a href=&quot;https://bundler.io/&quot;&gt;Bundler&lt;/a&gt; pour installer vos plugins Jekyll, c’est à dire &lt;a href=&quot;https://jekyllrb.com/docs/plugins/#installing-a-plugin&quot;&gt;la troisième option de la documentation officielle des plugins Jekyll&lt;/a&gt;&lt;sup id=&quot;fnref:doc&quot;&gt;&lt;a href=&quot;#fn:doc&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, vous pouvez passer votre chemin. Ou vous y mettre, vous ne le regretterez pas ! Une fois l’installation gérée avec Bundler, voilà comment je vous conseille de gérer vos mises à jour.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_200/https://nicolas-hoizey.com/assets/logos/jekyll.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_100/https://nicolas-hoizey.com/assets/logos/jekyll.png 100w, https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_250/https://nicolas-hoizey.com/assets/logos/jekyll.png 250w, https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_400/https://nicolas-hoizey.com/assets/logos/jekyll.png 400w&quot; sizes=&quot;(min-width: 55rem) 12.5rem, (min-width: 30rem) 22.5vw, 30vw&quot; class=&quot;logo&quot; alt=&quot;Jekyll&quot; width=&quot;498&quot; height=&quot;230&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;connaître-la-liste-des-mises-à-jour-disponibles&quot;&gt;Connaître la liste des mises à jour disponibles&lt;/h2&gt;

&lt;p&gt;D’abord, lancez la commande suivante :&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;bundle outdated
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Voilà un exemple de résultat, listant les plugins, ou leurs dépendances, pour lesquels des mises à jour sont disponibles :&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;master]
Fetching https://github.com/pattex/jekyll-tagging.git
Fetching gem metadata from https://rubygems.org/
Fetching version metadata from https://rubygems.org/
Fetching dependency metadata from https://rubygems.org/
Resolving dependencies.....

Outdated gems included &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;the bundle:
  &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; addressable &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;newest 2.5.0, installed 2.4.0&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; concurrent-ruby &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;newest 1.0.4, installed 1.0.2&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; i18n &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;newest 0.8.0, installed 0.7.0&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; json &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;newest 2.0.3, installed 1.8.3&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; liquid &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;newest 4.0.0, installed 3.0.6&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; listen &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;newest 3.1.5, installed 3.0.8&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; nokogiri &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;newest 1.7.0.1, installed 1.7.0&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; nuggets &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;newest 1.5.0, installed 1.0.0&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; rack &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;newest 2.0.1, installed 1.6.5&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; rouge &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;newest 2.0.7, installed 1.11.1&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; sprockets &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;newest 3.7.1, installed 3.6.3&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;mettre-tout-à-jour-dun-coup-attention-danger&quot;&gt;Mettre tout à jour d’un coup (ATTENTION, DANGER !)&lt;/h2&gt;

&lt;p&gt;Pour prendre en compte toutes ces nouvelles versions, vous pouvez lancer une commande simple :&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;bundle update
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Mais cela risque logiquement de mettre à jour plusieurs plugins en même temps, voire Jekyll lui-même, et de rendre complexe l’identification du coupable si cette mise à jour casse le fonctionnement du site.&lt;/p&gt;

&lt;h2 id=&quot;mettre-à-jour-progressivement&quot;&gt;Mettre à jour progressivement&lt;/h2&gt;

&lt;p&gt;Afin de mettre à jour à moindre risque, il faut donc y aller étape par étape, c’est à dire plugin par plugin, et tester le résultat à chaque fois, avec au moins un &lt;code class=&quot;highlighter-rouge&quot;&gt;build&lt;/code&gt; ou un &lt;code class=&quot;highlighter-rouge&quot;&gt;serve&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Mettons par exemple à jour &lt;code class=&quot;highlighter-rouge&quot;&gt;nokogiri&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tout d’abord, faisons une copie de la liste des versions actuellement installées :&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;cp Gemfile.lock Gemfile.lock.old
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Cela nous permettra de revenir en arrière si quelque chose ne fonctionne pas après mise à jour du plugin.&lt;/p&gt;

&lt;p&gt;Mettons ensuite à jour &lt;code class=&quot;highlighter-rouge&quot;&gt;nokogiri&lt;/code&gt; avec la commande suivante, utilisant l’option &lt;code class=&quot;highlighter-rouge&quot;&gt;--source&lt;/code&gt; :&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;bundle update &lt;span class=&quot;nt&quot;&gt;--source&lt;/span&gt; nokogiri
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Voici un extrait du résultat :&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Fetching gem metadata from https://rubygems.org/
Fetching version metadata from https://rubygems.org/
Fetching dependency metadata from https://rubygems.org/
Resolving dependencies...
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;…]
Using nokogiri 1.7.0.1 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;was 1.7.0&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;…]
Bundle updated!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;La mise à jour s’est bien déroulée, il ne reste plus qu’à tester, et si tout se passe bien, on passe à la mise à jour suivante.&lt;/p&gt;

&lt;h2 id=&quot;que-faire-si-la-mise-à-jour-nest-pas-satisfaisante-&quot;&gt;Que faire si la mise à jour n’est pas satisfaisante ?&lt;/h2&gt;

&lt;p&gt;S’il y a un soucis, on peut revenir à la situation précédente en reprenant le &lt;code class=&quot;highlighter-rouge&quot;&gt;Gemfile.lock&lt;/code&gt; précédent et en relançant l’installation :&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;cp &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; Gemfile.lock.old Gemfile.lock
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;bundle install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;il-arrive-que-la-commande-update-ne-déclenche-pas-la-mise-à-jour&quot;&gt;Il arrive que la commande &lt;code class=&quot;highlighter-rouge&quot;&gt;update&lt;/code&gt; ne déclenche pas la mise à jour&lt;/h2&gt;

&lt;p&gt;Attention, ce n’est pas une erreur, certains plugins ne peuvent pas être mis à jour à cause de dépendances venant d’autres plugins.&lt;/p&gt;

&lt;p&gt;Si par exemple je tente de mettre à jour &lt;code class=&quot;highlighter-rouge&quot;&gt;sprockets&lt;/code&gt; avec &lt;code class=&quot;highlighter-rouge&quot;&gt;bundle update --source sprockets&lt;/code&gt;, voici ce que j’obtiens :&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;master]
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Resolving dependencies...
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;…]
Using sprockets 3.6.3
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;…]
Bundle updated!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;sprockets&lt;/code&gt; est disponible en version &lt;code class=&quot;highlighter-rouge&quot;&gt;3.7.1&lt;/code&gt; d’après &lt;code class=&quot;highlighter-rouge&quot;&gt;bundle outdated&lt;/code&gt;, mais &lt;a href=&quot;https://github.com/jekyll/jekyll-assets/blob/81a2c709938d53333dfe2898e842b4d9a2d72f9a/Gem.gemspec#L22&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;jekyll-assets&lt;/code&gt; dépend encore de la version &lt;code class=&quot;highlighter-rouge&quot;&gt;3.6.3&lt;/code&gt;&lt;/a&gt;, et &lt;code class=&quot;highlighter-rouge&quot;&gt;bundle update --source&lt;/code&gt; respecte cette contrainte.&lt;/p&gt;

&lt;h2 id=&quot;une-nouvelle-option-à-explorer-&quot;&gt;Une nouvelle option à explorer ?&lt;/h2&gt;

&lt;p&gt;Une &lt;a href=&quot;https://github.com/bundler/bundler/pull/4980#issuecomment-254713686&quot;&gt;option &lt;code class=&quot;highlighter-rouge&quot;&gt;--conservative&lt;/code&gt; apparue avec Bundler &lt;code class=&quot;highlighter-rouge&quot;&gt;1.14&lt;/code&gt;&lt;/a&gt; semble produire le même résultat, mais la documentation n’est pas très claire, je n’ai pas encore compris son intérêt par rapport à &lt;code class=&quot;highlighter-rouge&quot;&gt;--source&lt;/code&gt;. Des explications sont bienvenues en commentaire, si vous les avez… ;-)&lt;/p&gt;

&lt;h2 id=&quot;mais-ces-précautions-ne-suffisent-pas-toujours&quot;&gt;Mais ces précautions ne suffisent pas toujours&lt;/h2&gt;

&lt;p&gt;Un problème plus important serait d’avoir deux plugins avec une dépendance commune, mais avec des versions requises non compatibles.&lt;/p&gt;

&lt;p&gt;Je n’ai heureusement pas encore eu ce cas à traiter.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:doc&quot;&gt;
      &lt;p&gt;Je préférerai d’ailleurs voir cette option en premier, tellement elle simplifie les choses. &lt;a href=&quot;#fnref:doc&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Lister des contenus similaires avec Jekyll</title>
   <link href="https://nicolas-hoizey.com/2017/01/lister-des-contenus-similaires-avec-jekyll.html"/>
   <updated>2017-01-23T00:00:00+01:00</updated>
   <id>https://nicolas-hoizey.com/2017/01/lister-des-contenus-similaires-avec-jekyll</id>
   <content type="html">&lt;p&gt;Arrivé à la fin d’un billet, il est toujours intéressant de pouvoir facilement continuer la lecture avec un autre billet, sans changer de site. C’est l’objet des liens « billet précédent » / « billet suivant » que l’on trouve sur de nombreux blogs. Mais les sujets traités sur ce site étant très variés, il y a peu de chance qu’un lecteur puisse être intéressé par un autre billet qui ne serait proche que chronologiquement de celui qu’il vient de lire. Les propositions de rebond doivent être plus intelligentes que cela.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_200/https://nicolas-hoizey.com/assets/logos/jekyll.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_100/https://nicolas-hoizey.com/assets/logos/jekyll.png 100w, https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_250/https://nicolas-hoizey.com/assets/logos/jekyll.png 250w, https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_400/https://nicolas-hoizey.com/assets/logos/jekyll.png 400w&quot; sizes=&quot;(min-width: 55rem) 12.5rem, (min-width: 30rem) 22.5vw, 30vw&quot; class=&quot;logo&quot; alt=&quot;Jekyll&quot; width=&quot;498&quot; height=&quot;230&quot; /&gt;
Jekyll disposait nativement dans sa version 2 d’un système de calcul de contenus similaires, sous la forme d’&lt;a href=&quot;https://jekyllrb.com/docs/configuration/#build-command-options&quot;&gt;une option LSI pour la génération du site&lt;/a&gt;&lt;sup id=&quot;fnref:lsi&quot;&gt;&lt;a href=&quot;#fn:lsi&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, qui permettait de remplir un tableau &lt;code class=&quot;highlighter-rouge&quot;&gt;site.related_posts&lt;/code&gt;&lt;sup id=&quot;fnref:post_site&quot;&gt;&lt;a href=&quot;#fn:post_site&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;. LSI signifie &lt;a href=&quot;https://en.wikipedia.org/wiki/Latent_semantic_analysis#Latent_semantic_indexing&quot;&gt;Latent Semantic Analysis&lt;/a&gt;. Je sais, ça ne vous avance pas à grand chose.&lt;/p&gt;

&lt;p&gt;Dans sa version 3, sortie &lt;a href=&quot;https://jekyllrb.com/docs/history/#v3-0-0&quot;&gt;il y a déjà 15 mois&lt;/a&gt;, la doc indique toujours cette option, mais il faut essuyer une erreur de génération de site et retrouver dans un moteur de recherche une référence à la &lt;a href=&quot;https://jekyllrb.com/docs/upgrading/2-to-3/&quot;&gt;procédure de migration de Jekyll 2 vers Jekyll 3&lt;/a&gt; pour comprendre que ce qui était auparavant natif ne l’est plus, et &lt;a href=&quot;https://jekyllrb.com/docs/upgrading/2-to-3/#dropped-dependencies&quot;&gt;nécessite maintenant&lt;/a&gt; d’installer et référencer explicitement le plugin &lt;a href=&quot;https://github.com/jekyll/classifier-reborn&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;classifier-reborn&lt;/code&gt;&lt;/a&gt; via Bundler et la configuration &lt;code class=&quot;highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;De manière générale, c’est une très bonne idée de réduire l’étendue du cœur de l’application, pour améliorer sa stabilité et faciliter sa maintenance, donc j’approuve la démarche, mais Jekyll ne gère malheureusement pas (encore ?) des documentations par version, d’où cet imbroglio.&lt;/p&gt;

&lt;p&gt;Une fois le plugin installé, il suffit d’ajouter un bout de code tel que celui-ci au gabarit &lt;code class=&quot;highlighter-rouge&quot;&gt;_layouts/post.html&lt;/code&gt; pour lister les billets similaires :&lt;/p&gt;

&lt;div class=&quot;language-liquid highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;ul&amp;gt;
  &lt;span class=&quot;p&quot;&gt;{%&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;post&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;in&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;site.related_posts&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;limit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;%}&lt;/span&gt;
    &amp;lt;li&amp;gt;&amp;lt;a href=&quot;&lt;span class=&quot;p&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}}&lt;/span&gt;&quot;&amp;gt;&lt;span class=&quot;p&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}}&lt;/span&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
  &lt;span class=&quot;p&quot;&gt;{%&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;endfor&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;%}&lt;/span&gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ensuite, lancez la commande &lt;code class=&quot;highlighter-rouge&quot;&gt;bundle exec jekyll build --lsi&lt;/code&gt; et…&lt;/p&gt;

&lt;p&gt;…partez vous balader.&lt;/p&gt;

&lt;p&gt;…retournez vous balader, la génération du site n’est pas terminée. Ou plutôt, l’indexation LSI n’est pas terminée.&lt;/p&gt;

&lt;p&gt;Personnellement, je n’ai pas attendu la fin du processus, je l’ai tué au bout de plus de 2h, bien énervé. J’ai 512 billets sur mon site à l’heure actuelle. La génération sans ce LSI prend environ 5 minutes. J’avais déjà eu ce souci avec seulement 80 billets &lt;a href=&quot;http://stackoverflow.com/questions/30038899/jekyll-build-stuck-in-rebuilding-index-stage&quot;&gt;il y a un an&lt;/a&gt;, et j’avais abandonné.&lt;/p&gt;

&lt;p&gt;Entre temps, j’avais testé une approche en pur Liquid se basant uniquement sur les tags, mais ce n’était vraiment pas satisfaisant, et plutôt long là aussi. J’avais aussi testé le plugin &lt;a href=&quot;https://github.com/alfanick/jekyll-related-posts&quot;&gt;jekyll-related-posts&lt;/a&gt;, mais les résultats n’étaient pas aussi bons que le LSI « standard » de Jekyll, et &lt;a href=&quot;https://github.com/alfanick/jekyll-related-posts/issues/3&quot;&gt;un bug récent&lt;/a&gt; empêchant &lt;code class=&quot;highlighter-rouge&quot;&gt;jekyll serve&lt;/code&gt; m’a fait fuir.&lt;/p&gt;

&lt;p&gt;C’est que j’avais malheureusement raté &lt;a href=&quot;http://stackoverflow.com/a/35495234/717195&quot;&gt;une réponse très pertinente&lt;/a&gt; arrivée depuis. Pour accélérer le traitement LSI, il faut utiliser un composant plus proche du système, et de ses performances, que l’implémentation en Ruby. &lt;a href=&quot;http://footle.org/2014/11/06/speeding-up-jekylls-lsi/&quot;&gt;Merci donc à Brad Greenlee pour l’astuce&lt;/a&gt;, qui consiste à installer la &lt;a href=&quot;http://www.gnu.org/software/gsl/&quot;&gt;GNU Scientific Library&lt;/a&gt; (GSL) et la &lt;a href=&quot;https://rubygems.org/gems/gsl&quot;&gt;gem Ruby gsl&lt;/a&gt; qui permet de l’exploiter.&lt;/p&gt;

&lt;p&gt;Sur macOS, installer GSL est simple avec Homebrew :&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew install gsl
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ensuite, la gem doit être ajoutée au &lt;code class=&quot;highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt; tout comme &lt;code class=&quot;highlighter-rouge&quot;&gt;classifier-reborn&lt;/code&gt;, mais hors de la section &lt;code class=&quot;highlighter-rouge&quot;&gt;:jekyll_plugins&lt;/code&gt; puisque ce n’est pas un plugin Jekyll, et l’installation se fait avec la commande &lt;code class=&quot;highlighter-rouge&quot;&gt;bundle install&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Vous pouvez regarder &lt;a href=&quot;https://github.com/nhoizey/nicolas-hoizey.com/blob/master/Gemfile&quot;&gt;mon propre &lt;code class=&quot;highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt;&lt;/a&gt; si vous avez un doute.&lt;/p&gt;

&lt;p&gt;Avec ces ingrédients magiques, l’indexation LSI ne prend plus que 5 minutes en gros, c’est devenu largement acceptable !&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:lsi&quot;&gt;
      &lt;p&gt;Cette option est à activer avec le paramètre &lt;code class=&quot;highlighter-rouge&quot;&gt;--lsi&lt;/code&gt; pour les commandes &lt;code class=&quot;highlighter-rouge&quot;&gt;build&lt;/code&gt; ou &lt;code class=&quot;highlighter-rouge&quot;&gt;serve&lt;/code&gt; de Jekyll, ou directement — ce que je préfère — dans le paramétrage du &lt;code class=&quot;highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; avec une entrée &lt;code class=&quot;highlighter-rouge&quot;&gt;lsi: true&lt;/code&gt;. &lt;a href=&quot;#fnref:lsi&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:post_site&quot;&gt;
      &lt;p&gt;Je n’ai pas encore compris pourquoi c’est &lt;a href=&quot;https://jekyllrb.com/docs/variables/#site-variables&quot;&gt;une variable du site&lt;/a&gt; (&lt;code class=&quot;highlighter-rouge&quot;&gt;site.related_posts&lt;/code&gt;) et non du billet (&lt;code class=&quot;highlighter-rouge&quot;&gt;post.related_posts&lt;/code&gt;), mais là n’est pas la question… &lt;a href=&quot;#fnref:post_site&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>How much data should my Service Worker put upfront in the offline cache?</title>
   <link href="https://nicolas-hoizey.com/2017/01/how-much-data-should-my-service-worker-put-upfront-in-the-offline-cache.html"/>
   <updated>2017-01-12T00:00:00+01:00</updated>
   <id>https://nicolas-hoizey.com/2017/01/how-much-data-should-my-service-worker-put-upfront-in-the-offline-cache</id>
   <content type="html">&lt;p&gt;I love when Web site/apps work even when I’m offline. I’ve made my SVG game &lt;a href=&quot;http://play.esviji.com&quot;&gt;esviji&lt;/a&gt; work offline thanks to &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Using_the_application_cache&quot;&gt;appcache&lt;/a&gt; just after attending &lt;a href=&quot;https://twitter.com/jaffathecake&quot;&gt;Jake Archibald&lt;/a&gt; conference about why &lt;a href=&quot;http://www.paris-web.fr/2012/conferences/application-cache.php&quot;&gt;Application Cache is a Douchebag&lt;/a&gt; during the 2012 edition of the &lt;a href=&quot;http://www.paris-web.fr/&quot;&gt;Paris Web&lt;/a&gt; conference. Fortunately, we have now Service Workers (in some browsers), which gives us more control over this kind of cache for offline browsing. But as Uncle Ben says, “With Great Power Comes Great Responsibility”.&lt;/p&gt;

&lt;p&gt;Just like with appcache, it is possible with Service Workers to put a full website in the cache when loading the first visited page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It is very interesting&lt;/strong&gt;, because you can then go offline and browse the whole site just as if you were online, without even noticing you’re offline. The cache will then be updated when you visit pages of the site while online. Depending on the nature of the content, you will fetch the page from the server when it is requested by the user, so that she gets the up-to-date version&lt;sup id=&quot;fnref:browsercache&quot;&gt;&lt;a href=&quot;#fn:browsercache&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, or you will show the cached version first, and update the cache only for subsequent visits.&lt;/p&gt;

&lt;p&gt;All of this is really well explained by &lt;a href=&quot;https://twitter.com/adactio&quot;&gt;Jeremy Keith&lt;/a&gt; in a series of posts on his blog, including the recent one about &lt;a href=&quot;https://adactio.com/journal/11730&quot;&gt;Making Resilient Web Design work offline&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://resilientwebdesign.com/&quot;&gt;Resilient Web Design&lt;/a&gt; is a Web book Jeremy wrote a few weeks ago. I urge you to read this book, it’s really great. Just like most of Jeremy’s creations, anyway.&lt;/p&gt;

&lt;p&gt;Here’s an extract of the book’s introduction:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The World Wide Web has been around for long enough now that we can begin to evaluate the twists and turns of its evolution. I wrote this book to highlight some of the approaches to web design that have proven to be resilient. I didn’t do this purely out of historical interest (although I am fascinated by the already rich history of our young industry). In learning from the past, I believe we can better prepare for the future.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, back to the topic of this post.&lt;/p&gt;

&lt;p&gt;Jeremy had the great idea to make this book available offline thanks to &lt;a href=&quot;https://resilientwebdesign.com/serviceworker.js&quot;&gt;a Service Worker&lt;/a&gt;, so you can visit it once, even only one page of it, and read the whole book while offline, commuting like me in Paris underground subway for example&lt;sup id=&quot;fnref:offlineios&quot;&gt;&lt;a href=&quot;#fn:offlineios&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is great&lt;/strong&gt;! There is a lot to come for the Web thanks to such features, assembled in &lt;a href=&quot;https://www.smashingmagazine.com/2016/08/a-beginners-guide-to-progressive-web-apps/&quot;&gt;Progressive Web Apps&lt;/a&gt;&lt;sup id=&quot;fnref:pwafr&quot;&gt;&lt;a href=&quot;#fn:pwafr&quot; class=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But&lt;/strong&gt;, it means Jeremy chose to &lt;strong&gt;fetch the whole site content and resources&lt;/strong&gt; in every &lt;a href=&quot;http://caniuse.com/#feat=serviceworkers&quot;&gt;capable browser&lt;/a&gt;&lt;sup id=&quot;fnref:capablebrowers&quot;&gt;&lt;a href=&quot;#fn:capablebrowers&quot; class=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;, even if the user only wants to read the introduction, and decide that she doesn’t need to read the rest. I would call her a fool, of course, but it might happen.&lt;/p&gt;

&lt;p&gt;According to my browser network panel or &lt;a href=&quot;https://www.webpagetest.org/result/170111_P9_D0V3/&quot;&gt;WebPagetest&lt;/a&gt;, it means &lt;strong&gt;almost 16 Mb are downloaded&lt;/strong&gt; right away when you access one page of the site.&lt;/p&gt;

&lt;figure&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_800/https://nicolas-hoizey.com/2017/01/webpagetest-resilient-web-design.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_360/https://nicolas-hoizey.com/2017/01/webpagetest-resilient-web-design.png 360w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_670/https://nicolas-hoizey.com/2017/01/webpagetest-resilient-web-design.png 670w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_980/https://nicolas-hoizey.com/2017/01/webpagetest-resilient-web-design.png 980w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_1034/https://nicolas-hoizey.com/2017/01/webpagetest-resilient-web-design.png 1034w&quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; width=&quot;1034&quot; height=&quot;740&quot; /&gt;
&lt;figcaption&gt;&lt;p&gt;The Resilient Web Design web book audited by WebPagetest&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The site is very fast, and all checks are green, but that’s because most of the downloads happen asynchronously, after the visited page has been rendered.&lt;/p&gt;

&lt;p&gt;I must confess I did almost the same thing for a while in my game &lt;a href=&quot;http://play.esviji.com&quot;&gt;esviji&lt;/a&gt; when I started using appcache, because I put almost 2 Mb of audio files in the cache. I decided later that offline users could play without sound, so I removed it from the cache.&lt;/p&gt;

&lt;p&gt;For a small site/app that takes 2 or 3 Mb, I can accept to download everything, because the convenience to have all this available while offline can be great. But I think 16 Mb is really to much.&lt;/p&gt;

&lt;p&gt;Just to illustrate, it means that &lt;strong&gt;one visit to this site will cost a Mauritanian at least 10 % of his daily income&lt;/strong&gt;, according to &lt;a href=&quot;https://twitter.com/tkadlec&quot;&gt;Tim Kadlec&lt;/a&gt;’s simulation on &lt;a href=&quot;https://whatdoesmysitecost.com/test/170111_P9_D0V3#gniCost&quot;&gt;What Does My Site Cost?&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_800/https://nicolas-hoizey.com/2017/01/what-does-my-site-cost.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_360/https://nicolas-hoizey.com/2017/01/what-does-my-site-cost.png 360w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_670/https://nicolas-hoizey.com/2017/01/what-does-my-site-cost.png 670w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_980/https://nicolas-hoizey.com/2017/01/what-does-my-site-cost.png 980w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_1074/https://nicolas-hoizey.com/2017/01/what-does-my-site-cost.png 1074w&quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; width=&quot;1074&quot; height=&quot;1278&quot; /&gt;
&lt;figcaption&gt;&lt;p&gt;Cost of visiting this website as a percentage of daily income&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Only 0.24 % for Jeremy in UK or 0.28 % for me in France, but we are here because we love the &lt;a href=&quot;https://www.paris-web.fr/2016/conferences/www-world-wide-web-not-wealthy-westerners-web.php&quot;&gt;World Wide Web, not Wealthy Westerners’ Web&lt;/a&gt;, as presented by &lt;a href=&quot;https://twitter.com/brucel&quot;&gt;Bruce Lawson&lt;/a&gt; during 2016 edition of the Paris Web conference.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_200/https://nicolas-hoizey.com/assets/logos/lighthouse.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_100/https://nicolas-hoizey.com/assets/logos/lighthouse.png 100w, https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_250/https://nicolas-hoizey.com/assets/logos/lighthouse.png 250w, https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_400/https://nicolas-hoizey.com/assets/logos/lighthouse.png 400w&quot; sizes=&quot;(min-width: 55rem) 12.5rem, (min-width: 30rem) 22.5vw, 30vw&quot; class=&quot;logo&quot; width=&quot;1850&quot; height=&quot;1042&quot; /&gt;
Because I use it quite a lot these days to check my own Progressive Web Apps, I thought it would be nice if &lt;a href=&quot;https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk&quot;&gt;Lighthouse&lt;/a&gt;, the Chrome extension that check web pages against &lt;a href=&quot;https://developers.google.com/web/updates/2016/12/lighthouse-dbw&quot;&gt;a growing list of best practices&lt;/a&gt;, included a check on total page weight. It looks like &lt;a href=&quot;https://twitter.com/hsablonniere&quot;&gt;Hubert Sablonnière&lt;/a&gt; already &lt;a href=&quot;https://github.com/GoogleChrome/lighthouse/issues/584&quot;&gt;had this idea and created an issue&lt;/a&gt;, which got support from &lt;a href=&quot;https://twitter.com/paul_irish&quot;&gt;Paul Irish&lt;/a&gt;, so it will come sooner or later.&lt;/p&gt;

&lt;p&gt;For my own website, I first thought I would only cache visited pages. But I now cache the homepage, the two about pages, and the last post, regardless of the page on which the user arrives, for a really light total weight of 87 KB additional resources. The offline fallback page lists the pages that are in the cache, so that the user can discover some unknown content even when she’s offline. This is a &lt;abbr title=&quot;Work In Progress&quot;&gt;WIP&lt;/abbr&gt;, so it might break, and it will change over the coming weeks, because I might adjust my strategy.&lt;/p&gt;

&lt;p&gt;There is a user setting to “save data” in some browser, which activation adds a new HTTP header we can test in our Service Workers, as shown by &lt;a href=&quot;https://twitter.com/deanohume&quot;&gt;Dean Hume&lt;/a&gt; in his post &lt;a href=&quot;http://deanhume.com/home/blogpost/service-workers--save-your-users-data-using-the-save-data-header/10139&quot;&gt;Service Workers: Save your User’s Data using the Save-Data Header&lt;/a&gt;, but I think most people that are not as tech savvy as us will never notice this setting, so it’s obviously a nice to have, but it’s not enough.&lt;/p&gt;

&lt;p&gt;So, it might be nicer to initially cache only the files needed to enhance the performance of the site and provide a clean offline fallback, then add the pages when they are visited, and provide the user with an option to cache the whole site, or part of it, for future offline browsing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It would be less magical, indeed, but more respectful&lt;/strong&gt; of users with limited and/or costly data plans.&lt;/p&gt;

&lt;p&gt;I don’t know if Jeremy thought about this or not, but I hope there will be some discussions around this in the community, because Service Workers give us a lot of power, that could be abused by people not aware of the damages it can cause, or even on purpose, just because it helps making websites faster. When &lt;a href=&quot;https://www.soasta.com/blog/page-bloat-average-web-page-2-mb/&quot;&gt;the average page is already more than 2 Mb&lt;/a&gt;, we really have to be careful.&lt;/p&gt;

&lt;p&gt;To conclude, it’s kind of amusing to see that Jeremy also provides links to download other versions of the book, including PDF, epub and mobi, and most of these files weight less than 16 Mb.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;February 25, 2017 update:&lt;/strong&gt; Lighthouse &lt;a href=&quot;https://github.com/GoogleChrome/lighthouse/pull/1759&quot;&gt;will now give a lower score if total byte weight is too high&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:browsercache&quot;&gt;
      &lt;p&gt;Be careful, you can still get a not so up-to-date version if the page is taken from the traditional browser cache. Yes, “it’s complicated” sometimes, as shown in &lt;a href=&quot;https://blog.yoav.ws/tale-of-four-caches/&quot;&gt;this awesome post written by Yoav Weiss&lt;/a&gt;. &lt;a href=&quot;#fnref:browsercache&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:offlineios&quot;&gt;
      &lt;p&gt;Well, that’s pure fiction, because I have an iPhone, and Apple didn’t work yet on supporting Service Workers in iOS. Just like &lt;a href=&quot;https://twitter.com/scottjehl&quot;&gt;Scott Jehl&lt;/a&gt;, “&lt;a href=&quot;https://twitter.com/scottjehl/status/819263184750202884&quot;&gt;As an iOS user, the lack of Service Worker support in Safari is almost enough for me to switch to Android. Almost.&lt;/a&gt;”. &lt;a href=&quot;#fnref:offlineios&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:pwafr&quot;&gt;
      &lt;p&gt;You can read more about Progressive Web Apps in french on my company’s blog: &lt;a href=&quot;http://blog.clever-age.com/fr/2016/12/29/les-progressive-web-apps-pour-booster-ux/&quot;&gt;Les Progressive Web Apps pour booster l’UX de vos services&lt;/a&gt;. &lt;a href=&quot;#fnref:pwafr&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:capablebrowers&quot;&gt;
      &lt;p&gt;As of today, these include only Firefox, Chrome and Opera. &lt;a href=&quot;#fnref:capablebrowers&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Cloudinary fait la promotion de mon plugin Jekyll</title>
   <link href="https://nicolas-hoizey.com/2016/08/cloudinary-fait-la-promotion-de-mon-plugin-jekyll.html"/>
   <updated>2016-08-31T00:00:00+02:00</updated>
   <id>https://nicolas-hoizey.com/2016/08/cloudinary-fait-la-promotion-de-mon-plugin-jekyll</id>
   <content type="html">&lt;p&gt;Je vous en avais parlé &lt;a href=&quot;https://nicolas-hoizey.com/2016/07/tout-change-rien-ne-change.html#un-nouveau-plugin-pour-grer-les-images-responsives-avec-cloudinary&quot;&gt;lors de ma migration vers Jekyll 3&lt;/a&gt;, je me suis lancé dans le développement d’&lt;a href=&quot;https://nhoizey.github.io/jekyll-cloudinary/&quot;&gt;un plugin Jekyll pour utiliser le service Cloudinary&lt;/a&gt; pour mes &lt;a href=&quot;http://images-responsives.com/&quot;&gt;images responsives&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_200/https://nicolas-hoizey.com/assets/logos/cloudinary.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_100/https://nicolas-hoizey.com/assets/logos/cloudinary.png 100w, https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_250/https://nicolas-hoizey.com/assets/logos/cloudinary.png 250w, https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_400/https://nicolas-hoizey.com/assets/logos/cloudinary.png 400w&quot; sizes=&quot;(min-width: 55rem) 12.5rem, (min-width: 30rem) 22.5vw, 30vw&quot; class=&quot;logo&quot; alt=&quot;Cloudinary&quot; width=&quot;480&quot; height=&quot;350&quot; /&gt;
&lt;a href=&quot;https://nho.io/cloudinary-signup&quot;&gt;Cloudinary&lt;/a&gt; a semble-t-il bien aimé cette initiative, puisque &lt;a href=&quot;https://ericportis.com/&quot;&gt;Eric Portis&lt;/a&gt; (&lt;a href=&quot;https://twitter.com/etportis&quot;&gt;@etportis&lt;/a&gt;), qui les a rejoint il y a quelque temps, m’a invité à écrire un billet pour leur blog à propos de ce développement : « &lt;a href=&quot;http://cloudinary.com/blog/how_i_used_cloudinary_to_solve_responsive_image_needs_in_my_jekyll_website_and_shared_the_magic_in_a_plugin&quot;&gt;How I used Cloudinary to solve responsive image needs in my Jekyll website, and shared the magic in a plugin&lt;/a&gt; ».&lt;/p&gt;

&lt;p&gt;Le billet a aussi été traduit en français par &lt;a href=&quot;http://frank.taillandier.me/&quot;&gt;Frank Taillandier&lt;/a&gt; pour le site Jekyll FR : « &lt;a href=&quot;https://jamstatic.fr/2016/08/31/gestion-images-responsive-avec-jekyll-cloudinary/&quot;&gt;Gérer les images responsive dans Jekyll avec le plugin Cloudinary&lt;/a&gt; ».&lt;/p&gt;

&lt;p&gt;N’hésitez-pas à partager l’info, retweeter, etc. !&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;How I used Cloudinary to solve responsive image needs in my &lt;a href=&quot;https://twitter.com/hashtag/Jekyll?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Jekyll&lt;/a&gt; website &amp;amp; shared the magic in a plugin: &lt;a href=&quot;https://t.co/p9n3LsVYcY&quot;&gt;https://t.co/p9n3LsVYcY&lt;/a&gt; &lt;a href=&quot;https://twitter.com/nhoizey?ref_src=twsrc%5Etfw&quot;&gt;@nhoizey&lt;/a&gt;&lt;/p&gt;&amp;mdash; Cloudinary (@cloudinary) &lt;a href=&quot;https://twitter.com/cloudinary/status/770970109594726401?ref_src=twsrc%5Etfw&quot;&gt;August 31, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;fr&quot; dir=&quot;ltr&quot;&gt;Gestion automatique des images responsive dans Jekyll avec le plugin &lt;a href=&quot;https://twitter.com/cloudinary?ref_src=twsrc%5Etfw&quot;&gt;@cloudinary&lt;/a&gt; de &lt;a href=&quot;https://twitter.com/nhoizey?ref_src=twsrc%5Etfw&quot;&gt;@nhoizey&lt;/a&gt; &lt;a href=&quot;https://t.co/47rcjbVhGm&quot;&gt;https://t.co/47rcjbVhGm&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jamstatic-fr (@jamstatic_fr) &lt;a href=&quot;https://twitter.com/jamstatic_fr/status/771216942434705409?ref_src=twsrc%5Etfw&quot;&gt;September 1, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;Et si ça vous tente, n’hésitez pas à &lt;a href=&quot;https://nho.io/cloudinary-signup&quot;&gt;créer un compte sur Cloudinary&lt;/a&gt;&lt;sup id=&quot;fnref:parrainage&quot;&gt;&lt;a href=&quot;#fn:parrainage&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, c’est &lt;strong&gt;gratuit&lt;/strong&gt; pour les besoins raisonnables comme ceux de ce blog, qui a tout de même déjà plus de 750 images.&lt;/p&gt;

&lt;p&gt;Vous pouvez aussi &lt;a href=&quot;https://news.ycombinator.com/item?id=12398006&quot;&gt;« upvoter » sur Hacker News&lt;/a&gt;, pour donner un peu de visibilité au plugin.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:parrainage&quot;&gt;
      &lt;p&gt;Si vous utilisez ce lien pour vous inscrire, cela me donnera un petit bonus de quota pour mon compte, un bon moyen de me remercier et encourager ! ;-) &lt;a href=&quot;#fnref:parrainage&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Faciliteur ou facilitateur ?</title>
   <link href="https://nicolas-hoizey.com/2016/08/faciliteur-ou-facilitateur.html"/>
   <updated>2016-08-23T00:00:00+02:00</updated>
   <id>https://nicolas-hoizey.com/2016/08/faciliteur-ou-facilitateur</id>
   <content type="html">&lt;p&gt;Comme je l’indique dans la page &lt;a href=&quot;/a-propos/de-moi.html&quot;&gt;à propos&lt;/a&gt; de ce site, « je me qualifie moi-même aujourd’hui de &lt;strong&gt;faciliteur de Web&lt;/strong&gt;, ayant à cœur de faire profiter les autres de mes connaissances ». Mais ne devrais-je pas plutôt dire « facili&lt;strong&gt;ta&lt;/strong&gt;teur » ?&lt;/p&gt;

&lt;p&gt;Le Larousse ne connaît pas « faciliteur », et sa &lt;a href=&quot;http://www.larousse.fr/dictionnaires/francais/facilitateur/186370&quot;&gt;définition de « facilitateur »&lt;/a&gt; indique ceci :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Qui est chargé de faciliter le déroulement d’une action, d’un processus&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Wiktionary a d’ailleurs &lt;a href=&quot;https://fr.wiktionary.org/wiki/facilitateur&quot;&gt;le même type de définition&lt;/a&gt; :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Personne chargée de faire en sorte que les choses se passent mieux.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;« Faciliteur » y est bien cité comme synonyme, mais &lt;a href=&quot;https://fr.wiktionary.org/wiki/faciliteur&quot;&gt;sa page&lt;/a&gt; indique qu’il est rarement utilisé.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C’est donc bien « facilitateur » qu’il faut plutôt utiliser.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pas loin, &lt;a href=&quot;https://fr.wikipedia.org/wiki/Facilitateur&quot;&gt;la page Wikipedia « facilitateur »&lt;/a&gt; est plus riche, mais se focalise sur une définition précise d’un métier, plutôt que simplement l’adjectif substantivé :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Métier encore méconnu, le facilitateur aide un groupe à comprendre ses objectifs communs et l’accompagne pour s’organiser et atteindre ces objectifs. Il emploie le plus souvent des outils et méthodes d’intelligence collective pour faciliter les réunions. Le facilitateur peut être utile dans diverses situations telles que de face à face, au sein d’un réseau professionnel par exemple de type socio-sanitaire, en groupe ou dans une pratique en ligne.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mais surtout, la fin de l’article indique ceci :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Le mot « facilitateur » est calqué de l’anglais facilitator. « Faciliteur » est son pendant en français de bon aloi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;C’est donc plutôt « faciliteur » qu’il faut utiliser ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sauf que &lt;a href=&quot;https://fr.wikipedia.org/wiki/Faciliteur&quot;&gt;la page Wikipedia « faciliteur »&lt;/a&gt; est vide, supprimée en 2006 par &lt;a href=&quot;https://fr.wikipedia.org/wiki/Utilisateur:Grondin&quot;&gt;Grondin&lt;/a&gt; parce que « néologisme confidentiel et non recyclable sur wiktionnaire »… :-/&lt;/p&gt;

&lt;p&gt;Je note que Wikipedia n’est pas fan du « français de bon aloi »…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Donc on revient à « facilitateur » ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Heureusement, la page Wiktionary contient aussi un lien vers &lt;a href=&quot;http://www.tv5monde.com/cms/chaine-francophone/lf/Merci-Professeur/p-17081-Facilitateur.htm?episode=3&quot;&gt;un épisode de l’émission « Merci professeur ! » de TV5Monde&lt;/a&gt;&lt;sup id=&quot;fnref:merciprof&quot;&gt;&lt;a href=&quot;#fn:merciprof&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, dans lequel Bernard Cerquiglini indique bien que « facilitateur » est un anglicisme, et qu’&lt;strong&gt;il est préférable de « respecter les règles traditionnelles de la morphologie », et donc substantiver « faciliter » en « faciliteur »&lt;/strong&gt; !&lt;/p&gt;

&lt;p&gt;La vie des langues est décidément captivante, mais l’essentiel, c’est que je peux garder ma présentation intacte, tant pis pour le Larousse et Wikipedia !&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:merciprof&quot;&gt;
      &lt;p&gt;Émission captivante, au passage, et très courte, donc je vous invite à parcourir les nombreux épisodes. &lt;a href=&quot;#fnref:merciprof&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>A bridge not so far</title>
   <link href="https://nicolas-hoizey.com/2016/08/a-bridge-not-so-far.html"/>
   <updated>2016-08-12T00:00:00+02:00</updated>
   <id>https://nicolas-hoizey.com/2016/08/a-bridge-not-so-far</id>
   <content type="html">&lt;p&gt;Voilà le Manhattan Bridge, impressionnante vue depuis la rue Washington du quartier DUMBO de Brooklyn.&lt;/p&gt;

&lt;figure&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_800/https://nicolas-hoizey.com/2016/08/a-bridge-not-so-far.jpg&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_360/https://nicolas-hoizey.com/2016/08/a-bridge-not-so-far.jpg 360w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_670/https://nicolas-hoizey.com/2016/08/a-bridge-not-so-far.jpg 670w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_980/https://nicolas-hoizey.com/2016/08/a-bridge-not-so-far.jpg 980w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_1290/https://nicolas-hoizey.com/2016/08/a-bridge-not-so-far.jpg 1290w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_1600/https://nicolas-hoizey.com/2016/08/a-bridge-not-so-far.jpg 1600w&quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; width=&quot;3023&quot; height=&quot;4534&quot; /&gt;
&lt;figcaption&gt;&lt;p&gt;A bridge not so far&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;En me décalant un peu, j’aurais même pu apercevoir l’Empire State Building entre les pieds, mais je préfère ce cadrage décalé, pas trop symétrique.&lt;/p&gt;

&lt;p&gt;J’ai adoré mon voyage à &lt;a href=&quot;/tags/new-york.html&quot;&gt;New York&lt;/a&gt; l’an dernier, et j’en ai ramené quelques photos bien sympathiques, que je vais continuer à diffuser petit à petit.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Soignez votre lisibilité avec des textes de largeur maîtrisée</title>
   <link href="https://nicolas-hoizey.com/2016/08/soignez-votre-lisibilite-avec-des-textes-de-largeur-matrisee.html"/>
   <updated>2016-08-11T00:00:00+02:00</updated>
   <id>https://nicolas-hoizey.com/2016/08/soignez-votre-lisibilite-avec-des-textes-de-largeur-matrisee</id>
   <content type="html">&lt;p&gt;Afin d’assurer une présentation optimale du texte pour la lisibilité, il est nécessaire de définir un nombre optimal de caractères par ligne quelle que soit la taille du texte.&lt;/p&gt;

&lt;p&gt;Allez, j’ose m’auto-&lt;a href=&quot;http://www.24joursdeweb.fr/2013/lachez-prise-sans-perdre-le-controle-grace-a-l-unite-css-em&quot;&gt;citer&lt;/a&gt;… ;-)&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;[…] assurer une présentation optimale du texte, notamment en conservant un nombre optimal de caractères par ligne — de 55 à 65, à affiner selon les langues concernées — quelle que soit la taille du texte. Pour cela, une largeur de &lt;code class=&quot;highlighter-rouge&quot;&gt;30em&lt;/code&gt; est une valeur courante, à ajuster évidemment selon la nature de la police de caractères&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En fait, les sources varient de 50 à 75 caractères par ligne :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;La conférence « La macro typographie de la page Web » (&lt;a href=&quot;http://www.dailymotion.com/video/xfpf08_la-macrotypographie-de-la-page-web-anne-sophie-fradier_tech&quot;&gt;vidéo&lt;/a&gt; et &lt;a href=&quot;http://fr.slideshare.net/Mitternacht/la-macrotypographie-de-la-page-web-5499736&quot;&gt;slides&lt;/a&gt;) animée par Anne-Sophie Fradier &lt;a href=&quot;https://www.paris-web.fr/2010/conferences/macrotypographie-page-web.php&quot;&gt;à Paris Web 2010&lt;/a&gt; parle de &lt;strong&gt;55 à 65&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;L’article « &lt;a href=&quot;http://baymard.com/blog/line-length-readability&quot;&gt;Readability: the Optimal Line Length&lt;/a&gt; » de Baymard Institute parle de &lt;strong&gt;50 à 60&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Le chapitre « &lt;a href=&quot;http://webtypography.net/2.1.2&quot;&gt;Choose a comfortable measure&lt;/a&gt; » de « &lt;a href=&quot;http://webtypography.net/&quot;&gt;The Elements of Typographic Style Applied to the Web&lt;/a&gt; » parle de &lt;strong&gt;66&lt;/strong&gt; comme valeur idéale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour finir, un petit outil de simulation pour voir l’impact de la langue et de la police de caractères sur le nombre de caractères par ligne selon la largeur du bloc en &lt;code class=&quot;highlighter-rouge&quot;&gt;em&lt;/code&gt; : &lt;a href=&quot;http://nerd.vasilis.nl/code/measure-help/&quot;&gt;http://nerd.vasilis.nl/code/measure-help/&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Ripe</title>
   <link href="https://nicolas-hoizey.com/2016/08/ripe.html"/>
   <updated>2016-08-09T00:00:00+02:00</updated>
   <id>https://nicolas-hoizey.com/2016/08/ripe</id>
   <content type="html">&lt;p&gt;Je n’ai pas trop l’habitude de faire des photos de natures mortes, mais quand j’ai vu ces vieux livres dans une des installations du &lt;a href=&quot;http://www.domaine-chaumont.fr/festival_festivals&quot;&gt;Festival International des Jardins de Chaumont-sur-Loire&lt;/a&gt;&lt;sup id=&quot;fnref:chaumont&quot;&gt;&lt;a href=&quot;#fn:chaumont&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, j’ai su qu’il y avait matière à faire une belle photo.&lt;/p&gt;

&lt;figure&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_800/https://nicolas-hoizey.com/2016/08/20150427-Ripe.jpg&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_360/https://nicolas-hoizey.com/2016/08/20150427-Ripe.jpg 360w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_670/https://nicolas-hoizey.com/2016/08/20150427-Ripe.jpg 670w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_980/https://nicolas-hoizey.com/2016/08/20150427-Ripe.jpg 980w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_1290/https://nicolas-hoizey.com/2016/08/20150427-Ripe.jpg 1290w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_1600/https://nicolas-hoizey.com/2016/08/20150427-Ripe.jpg 1600w&quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; width=&quot;5616&quot; height=&quot;3744&quot; /&gt;
&lt;figcaption&gt;&lt;p&gt;“Ripe”&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Voici pour l’accompagner une belle citation de Carlos Ruiz Zafón extraite de “The Shadow of the Wind” :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Every book, every volume you see here, has a soul. The soul of the person who wrote it and of those who read it and lived and dreamed with it. Every time a book changes hands, every time someone runs his eyes down its pages, its spirit grows and strengthens.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;PS: “Ripe” en anglais signifie « mûr » en français.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:chaumont&quot;&gt;
      &lt;p&gt;Je vous recommande vivement d’y aller au moins une fois, d’ailleurs, ça vaut le détour. &lt;a href=&quot;#fnref:chaumont&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Tout change, rien ne change</title>
   <link href="https://nicolas-hoizey.com/2016/07/tout-change-rien-ne-change.html"/>
   <updated>2016-07-13T00:00:00+02:00</updated>
   <id>https://nicolas-hoizey.com/2016/07/tout-change-rien-ne-change</id>
   <content type="html">&lt;p&gt;Ce site est &lt;a href=&quot;https://nicolas-hoizey.com/a-propos/du-site.html#avec-jekyll-le-statique-cest-fantastique&quot;&gt;généré avec Jekyll&lt;/a&gt; depuis plus d’un an maintenant, mais je n’avais pas encore réussi à migrer vers &lt;a href=&quot;https://jekyllrb.com/news/2015/10/26/jekyll-3-0-released/&quot;&gt;Jekyll 3, sorti en octobre&lt;/a&gt;, à cause de multiples blocages liés à des plugins non compatibles. La migration est maintenant faite !&lt;/p&gt;

&lt;h2 id=&quot;tout-change&quot;&gt;Tout change&lt;/h2&gt;

&lt;h3 id=&quot;jekyll-3&quot;&gt;Jekyll 3&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_200/https://nicolas-hoizey.com/assets/logos/jekyll.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_100/https://nicolas-hoizey.com/assets/logos/jekyll.png 100w, https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_250/https://nicolas-hoizey.com/assets/logos/jekyll.png 250w, https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_400/https://nicolas-hoizey.com/assets/logos/jekyll.png 400w&quot; sizes=&quot;(min-width: 55rem) 12.5rem, (min-width: 30rem) 22.5vw, 30vw&quot; class=&quot;logo&quot; alt=&quot;Logo de Jekyll&quot; width=&quot;498&quot; height=&quot;230&quot; /&gt;
J’ai donc enfin pu migrer vers Jekyll 3, avec d’une part l’assurance de pouvoir suivre les évolutions du logiciel et de ses plugins, et d’autre part de pouvoir bénéficier de nouvelles fonctionnalités.&lt;/p&gt;

&lt;p&gt;Mon bloquage principal pour cette migration était mon fork du plugin &lt;a href=&quot;https://github.com/nhoizey/jekyll-picture-tag/&quot;&gt;Jekyll Picture Tag&lt;/a&gt;, qui me permettait :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;de mettre les images au même endroit que les billets en Markdown, fonction essentielle à mon avis pour faciliter la publication&lt;/li&gt;
  &lt;li&gt;de générer le code HTML des images responsives à base de balises &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;picture&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour couvrir ces deux besoins, j’ai pris le parti de développer deux plugins séparés, maintenant disponibles pour la communauté :&lt;/p&gt;

&lt;h3 id=&quot;un-nouveau-plugin-pour-associer-les-images-aux-posts-markdown&quot;&gt;Un nouveau plugin pour associer les images aux posts Markdown&lt;/h3&gt;

&lt;p&gt;Le plugin &lt;a href=&quot;https://nhoizey.github.io/jekyll_post_files/&quot;&gt;jekyll_post_files&lt;/a&gt;&lt;sup id=&quot;fnref:rename&quot;&gt;&lt;a href=&quot;#fn:rename&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; permet donc de mettre les images qui illustrent les billets (et même mes autres fichiers liés, PDF par exemple) avec ceux-ci dans &lt;code class=&quot;highlighter-rouge&quot;&gt;_posts/&lt;/code&gt; ou un sous dossier, tout en laissant la possibilité de les mettre dans un dossier global &lt;code class=&quot;highlighter-rouge&quot;&gt;/assets/images/&lt;/code&gt; si elle sont vouées à être partagées.&lt;/p&gt;

&lt;p&gt;Cela permet d’avoir cette organisation de fichiers, par exemple :&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;_posts/
  2016-06-09-cloudflare/
    2016-06-09-so-long-cloudflare-and-thanks-for-all-the-fissh.md
    cloudflare-architecture.jpg
    performance-report-sample.pdf
assets/
  images/
    cloudflare-logo.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Et d’utiliser directement l’image et le PDF dans le Markdown, sans aucun chemin :&lt;/p&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;![&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;Cloudflare logo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;sx&quot;&gt;/assets/cloudflare-logo.png&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.

&lt;span class=&quot;p&quot;&gt;![&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;Cloudflare architecture&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;sx&quot;&gt;cloudflare-architecture.jpg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat.

Here is &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;an example of performance report&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;sx&quot;&gt;performance-report-sample.pdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ceci implique qu’une prévisualisation live dans un éditeur comme &lt;a href=&quot;http://macdown.uranusjr.com/&quot;&gt;MacDown&lt;/a&gt; est complètement opérationnelle, sans aucune configuration spécifique.&lt;/p&gt;

&lt;p&gt;Le support de la syntaxe courante basée sur un dossier global permet aussi d’installer le plugin sans rien casser, et de migrer progressivement les contenus qui le nécessitent.&lt;/p&gt;

&lt;h3 id=&quot;un-nouveau-plugin-pour-gérer-les-images-responsives-avec-cloudinary&quot;&gt;Un nouveau plugin pour gérer les images responsives avec Cloudinary&lt;/h3&gt;

&lt;p&gt;Le plugin Jekyll Picture Tag, même dans sa version d’origine, avait été mon choix à l’époque faute de mieux, &lt;a href=&quot;https://cloudfour.com/thinks/dont-use-picture-most-of-the-time/&quot; hreflang=&quot;en&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; n’étant en général pas la bonne solution&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Il existe maintenant un plugin &lt;a href=&quot;https://github.com/wildlyinaccurate/jekyll-responsive-image&quot;&gt;Jekyll Responsive Image&lt;/a&gt; qui permet d’utiliser la syntaxe &lt;code class=&quot;highlighter-rouge&quot;&gt;srcset-w&lt;/code&gt;/&lt;code class=&quot;highlighter-rouge&quot;&gt;sizes&lt;/code&gt; en général plus appropriée, avec même son propre template.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_200/https://nicolas-hoizey.com/assets/logos/cloudinary.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_100/https://nicolas-hoizey.com/assets/logos/cloudinary.png 100w, https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_250/https://nicolas-hoizey.com/assets/logos/cloudinary.png 250w, https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_400/https://nicolas-hoizey.com/assets/logos/cloudinary.png 400w&quot; sizes=&quot;(min-width: 55rem) 12.5rem, (min-width: 30rem) 22.5vw, 30vw&quot; class=&quot;logo&quot; alt=&quot;Logo de Cloudinary&quot; width=&quot;480&quot; height=&quot;350&quot; /&gt;
Mais je voulais cesser de générer, optimiser et héberger moi-même les variantes d’images nécessaires, et plutôt m’appuyer sur &lt;a href=&quot;http://cloudinary.com/invites/lpov9zyyucivvxsnalc5/sgyyc0j14k6p0sbt51nw&quot;&gt;Cloudinary&lt;/a&gt;, un des leaders des nombreux services SaaS de gestion d’images optimisés pour le responsive.&lt;/p&gt;

&lt;p&gt;J’ai donc créé le nouveau plugin &lt;a href=&quot;https://nhoizey.github.io/jekyll-cloudinary/&quot;&gt;Jekyll Cloudinary&lt;/a&gt; qui ajoute un tag Liquid &lt;code class=&quot;highlighter-rouge&quot;&gt;{% cloudinary … %}&lt;/code&gt; pour publier les images et générer automatiquement le code HTML avec &lt;code class=&quot;highlighter-rouge&quot;&gt;srcset-w&lt;/code&gt;/&lt;code class=&quot;highlighter-rouge&quot;&gt;sizes&lt;/code&gt; et des URL Cloudinary, voire même un ensemble &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;figure&amp;gt;&lt;/code&gt;/&lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;figcaption&amp;gt;&lt;/code&gt; si une légende est précisée.&lt;/p&gt;

&lt;p&gt;Je peux ainsi écrire ceci :&lt;/p&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{% cloudinary cloudflare.png alt=&quot;Un schéma montrant l'apport de Cloudflare&quot; caption=&quot;Un schéma montrant l'apport de Cloudflare&quot; %}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ce qui va générer, avec ma configuration :&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;figure&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;img&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,w_720,q_auto,f_auto/https://nicolas-hoizey.com/2016/06/cloudflare.png&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;srcset=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;
      https://res.cloudinary.com/nho/image/fetch/c_limit,w_320,q_auto,f_auto/https://nicolas-hoizey.com/2016/06/cloudflare.png 320w,
      https://res.cloudinary.com/nho/image/fetch/c_limit,w_670,q_auto,f_auto/https://nicolas-hoizey.com/2016/06/cloudflare.png 670w,
      https://res.cloudinary.com/nho/image/fetch/c_limit,w_720,q_auto,f_auto/https://nicolas-hoizey.com/2016/06/cloudflare.png 720w&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;sizes=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;(min-width: 50rem) 50rem, 90vw&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;alt=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Un schéma montrant l'apport de Cloudflare&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;width=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;720&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;height=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;327&quot;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;figcaption&amp;gt;&lt;/span&gt;Un schéma montrant l'apport de Cloudflare&lt;span class=&quot;nt&quot;&gt;&amp;lt;/figcaption&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/figure&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Magique !&lt;/p&gt;

&lt;p&gt;Mon temps de &lt;em&gt;build&lt;/em&gt; du site a été largement réduit, même si les images générées étaient en cache, et le poids total du site chez mon hébergeur est passé de 325 Mo à 139 Mo.&lt;/p&gt;

&lt;p&gt;Bien sûr, il faut ajouter le service &lt;a href=&quot;http://cloudinary.com/invites/lpov9zyyucivvxsnalc5/sgyyc0j14k6p0sbt51nw&quot;&gt;Cloudinary&lt;/a&gt; à l’équation, mais l’offre gratuite suffit amplement pour un blog comme le mien :&lt;/p&gt;

&lt;figure&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_800/https://nicolas-hoizey.com/2016/07/cloudinary-pricing.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_360/https://nicolas-hoizey.com/2016/07/cloudinary-pricing.png 360w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_670/https://nicolas-hoizey.com/2016/07/cloudinary-pricing.png 670w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_980/https://nicolas-hoizey.com/2016/07/cloudinary-pricing.png 980w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_1208/https://nicolas-hoizey.com/2016/07/cloudinary-pricing.png 1208w&quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;Les tarifs de Cloudinary&quot; width=&quot;1208&quot; height=&quot;561&quot; /&gt;
&lt;figcaption&gt;&lt;p&gt;Les tarifs de Cloudinary, dont l’offre gratuite déjà généreuse&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Mais cela ne me suffit pas, je travaille sur un plugin qui permettrait de profiter de ce même Cloudinary mais en n’utilisant que la syntaxe Markdown standard pour les images, pour retrouver cette facilité de publication — et prévisualisation en cours d’édition — que je vantais juste avant. Mais &lt;a href=&quot;https://github.com/jekyll/jekyll/issues/5099&quot;&gt;ce n’est pas simple&lt;/a&gt;, je découvre en même temps Ruby, les subtilités des plugins Jekyll, etc.&lt;/p&gt;

&lt;h3 id=&quot;le-plugin-jekyll-algolia-pour-indexer-les-contenus&quot;&gt;Le plugin Jekyll Algolia pour indexer les contenus&lt;/h3&gt;

&lt;p&gt;J’utilisais jusqu’à présent un &lt;code class=&quot;highlighter-rouge&quot;&gt;Rakefile&lt;/code&gt; bidouillé à partir d’un autre trouvé sur Github pour indexer mes contenus en appelant l’API Algolia.&lt;/p&gt;

&lt;p&gt;J’utilise maintenant &lt;a href=&quot;https://github.com/algolia/algoliasearch-jekyll&quot;&gt;le plugin officiel&lt;/a&gt;, ce qui est bien plus pratique, et devrait permettre de meilleurs résultats.&lt;/p&gt;

&lt;h2 id=&quot;rien-ne-change&quot;&gt;Rien ne change&lt;/h2&gt;

&lt;p&gt;Malgré ces nombreuses évolutions en coulisses, rien ne change pour les visiteurs, le site généré étant quasiment identique, et même strictement identique côté visuel !&lt;/p&gt;

&lt;h2 id=&quot;mais-si-un-peu-quand-même-temporairement&quot;&gt;Mais si, un peu quand même, temporairement&lt;/h2&gt;

&lt;p&gt;Parmi les petits changements temporaires tout de même :&lt;/p&gt;

&lt;h3 id=&quot;les-vidéos-ne-sont-plus-lazy-loadées&quot;&gt;Les vidéos ne sont plus &lt;em&gt;lazy loadées&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;Les vidéos Youtube sont pour l’instant intégrées avec le &lt;em&gt;player&lt;/em&gt; standard, donc ne sont plus &lt;em&gt;lazy loadées&lt;/em&gt; au clic du lecteur. C’est une régression, mais elle n’est que temporaire, il faut que j’adapte le plugin &lt;a href=&quot;https://github.com/erossignon/jekyll-youtube-lazyloading&quot;&gt;Jekyll Youtube Lazyloading&lt;/a&gt; à mon nouveau &lt;a href=&quot;https://github.com/nhoizey/nicolas-hoizey.com/blob/jekyll3/_plugins/auto-embed.rb&quot;&gt;plugin d’embed automatique à partir d’une simple URL&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Cela m’a fait perdre 4 points sur Dareboost, tout de même ! ;-)&lt;/p&gt;

&lt;figure&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_800/https://nicolas-hoizey.com/2016/07/dareboost-de-98-a-94.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_360/https://nicolas-hoizey.com/2016/07/dareboost-de-98-a-94.png 360w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_670/https://nicolas-hoizey.com/2016/07/dareboost-de-98-a-94.png 670w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_960/https://nicolas-hoizey.com/2016/07/dareboost-de-98-a-94.png 960w&quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;4 points perdus sur Dareboost&quot; width=&quot;960&quot; height=&quot;330&quot; /&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;MAJ :&lt;/strong&gt; Les vidéos sont de nouveau &lt;em&gt;lazy loadées&lt;/em&gt;, comme vous pouvez le voir par exemple sur &lt;a href=&quot;/2015/06/la-recherche-dans-du-statique-facile-avec-algolia.html&quot;&gt;ce billet à propos du moteur de recherche Algolia&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;la-mise-en-évidence-du-terme-recherché-ne-fonctionne-plus&quot;&gt;La mise en évidence du terme recherché ne fonctionne plus&lt;/h3&gt;

&lt;p&gt;L’indexation Algolia via le plugin ne fonctionne pas comme celle que j’utilisais auparavant, ce qui signifie que les résultats n’ont plus la même structure.&lt;/p&gt;

&lt;p&gt;Il faut encore que je corrige l’affichage des résultats dans la page de recherche, en m’inspirant peut-être de ce qu’à fait Algolia dans &lt;a href=&quot;https://github.com/algolia/algoliasearch-jekyll-hyde&quot;&gt;son fork du thème Hyde&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;tous-les-commentaires-sont-les-bienvenus-&quot;&gt;Tous les commentaires sont les bienvenus !&lt;/h2&gt;

&lt;p&gt;Je suis vraiment preneur de vos commentaires pour savoir comment encore améliorer ce site, ou ma mise en œuvre de Jekyll, merci d’avance.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:rename&quot;&gt;
      &lt;p&gt;Il va peut-être falloir un jour changer son nom en &lt;code class=&quot;highlighter-rouge&quot;&gt;jekyll-postfiles&lt;/code&gt; pour suivre &lt;a href=&quot;http://ben.balter.com/jekyll-style-guide/plugins/#naming&quot;&gt;les pratiques des plugins Jekyll&lt;/a&gt;, même si elles sont différentes de &lt;a href=&quot;http://guides.rubygems.org/name-your-gem/&quot;&gt;celles plus générales des Gems&lt;/a&gt;. &lt;a href=&quot;#fnref:rename&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>So long CloudFlare, and thanks for all the fissh</title>
   <link href="https://nicolas-hoizey.com/2016/06/so-long-cloudflare-and-thanks-for-all-the-fissh.html"/>
   <updated>2016-06-09T00:00:00+02:00</updated>
   <id>https://nicolas-hoizey.com/2016/06/so-long-cloudflare-and-thanks-for-all-the-fissh</id>
   <content type="html">&lt;p&gt;Souhaitant me mettre aux &lt;a href=&quot;https://developer.mozilla.org/fr/docs/Web/API/Service_Worker_API/Using_Service_Workers&quot;&gt;Service Workers&lt;/a&gt;, notamment pour remplacer &lt;a href=&quot;https://developer.mozilla.org/fr/docs/Utiliser_Application_Cache&quot;&gt;appcache&lt;/a&gt; pour le support &lt;em&gt;offline&lt;/em&gt; de mon jeu &lt;a href=&quot;https://esviji.com/&quot;&gt;esviji&lt;/a&gt;, j’avais besoin de passer en HTTPS. &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let’s Encrypt&lt;/a&gt; étant à l’époque toujours en &lt;em&gt;beta&lt;/em&gt;, et les tutoriels de mise en œuvre pas légion et peu compréhensibles, j’avais choisi la solution de facilité avec &lt;a href=&quot;https://www.cloudflare.com/&quot;&gt;CloudFlare&lt;/a&gt;, que je quitte aujourd’hui pour mes propres certificats Let’s Encrypt sur mon hébergement mutualisé &lt;a href=&quot;https://www.alwaysdata.com/fr/&quot;&gt;AlwaysData&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;CloudFlare est un service qui fonctionne comme un proxy pour le site, avec beaucoup de fonctionnalités destinées à améliorer la performance et la sécurité, dont notamment la mise en place de HTTPS. Rien à faire sur le site, qui peut rester en HTTP, il faut juste faire pointer les DNS chez CloudFlare plutôt que chez l’hébergeur du site. Et quand même bien parcourir les nombreuses options de configuration dans tous les sens, pour bien choisir exactement ce que l’on veut.&lt;/p&gt;

&lt;figure&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_800/https://nicolas-hoizey.com/2016/06/cloudflare.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_360/https://nicolas-hoizey.com/2016/06/cloudflare.png 360w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_670/https://nicolas-hoizey.com/2016/06/cloudflare.png 670w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_720/https://nicolas-hoizey.com/2016/06/cloudflare.png 720w&quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;Un schéma montrant l'apport de Cloudflare&quot; width=&quot;720&quot; height=&quot;327&quot; /&gt;
&lt;figcaption&gt;&lt;p&gt;Un schéma montrant l’apport de Cloudflare&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;J’ai oublié de préciser que l’&lt;a href=&quot;https://www.cloudflare.com/plans/&quot;&gt;offre de base&lt;/a&gt;, qui inclue le HTTPS, est gratuite, difficile de faire plus compétitif !&lt;/p&gt;

&lt;p&gt;Pourtant, la magie a ses limites, et si je suis convaincu que CloudFlare peut faire beaucoup de bien à des sites pas spécialement optimisés, il n’a pas beaucoup de sens pour un site où les optimisations de performance sont déjà très poussés, comme chez moi. L’effet peut même être inverse, puisque l’on perd une grande partie du contrôle, notamment sur les en-têtes associées aux requêtes HTTP. J’ai donc choisi de quitter CloudFlare.&lt;/p&gt;

&lt;p&gt;J’ai été d’autre part largement motivé par la stabilisation de Let’s Encrypt, et surtout l’apparition d’&lt;a href=&quot;http://forum.alwaysdata.com/viewtopic.php?id=4631&quot;&gt;un tutoriel Let’s Encrypt dédié à mon hébergeur AlwaysData&lt;/a&gt;, utilisant le client &lt;a href=&quot;https://github.com/kuba/simp_le&quot;&gt;simp_le&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;J’ai ainsi pu mettre en place un certificat Let’s Encrypt sur &lt;a href=&quot;https://nicolas-hoizey.com/&quot;&gt;https://nicolas-hoizey.com/&lt;/a&gt; en moins d’une heure, et je n’ai plus qu’à faire de même sur &lt;a href=&quot;https://esviji.com/&quot;&gt;https://esviji.com/&lt;/a&gt; et &lt;a href=&quot;https://play.esviji.com/&quot;&gt;https://play.esviji.com/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Je précise juste qu’il faut prendre une IP fixe pour pouvoir mettre du SSL, soit 5 € par mois en plus de votre tarif d’hébergement.&lt;/p&gt;

&lt;p&gt;Une astuce à connaître, enfin, si vous êtes aussi sur AlwaysData. Si vous voulez rediriger tout le trafic HTTP vers le HTTPS, vous trouverez sans doute ce type de configuration Apache dans des docs en ligne :&lt;/p&gt;

&lt;div class=&quot;language-apache highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nc&quot;&gt;RewriteCond&lt;/span&gt; %{HTTPS} !=on
&lt;span class=&quot;nc&quot;&gt;RewriteRule&lt;/span&gt; ^(.*) https://nicolas-hoizey.com/$1#s [QSA,R=301,L]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Il se trouve que la &lt;code class=&quot;highlighter-rouge&quot;&gt;RewriteCond&lt;/code&gt; ne fonctionne pas chez AlwaysData, où il faut plutôt utiliser celle-ci :&lt;/p&gt;

&lt;div class=&quot;language-apache highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nc&quot;&gt;RewriteCond&lt;/span&gt; %{HTTP:X-Forwarded-Proto} !https
&lt;span class=&quot;nc&quot;&gt;RewriteRule&lt;/span&gt; ^(.*) https://nicolas-hoizey.com/$1 [QSA,R=301,L]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Un grand merci à Martin pour le tutoriel, et Héloïse pour l’aide sur la bonne configuration Apache pour les redirections.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The DNA Journey</title>
   <link href="https://nicolas-hoizey.com/2016/06/the-dna-journey.html"/>
   <updated>2016-06-03T00:00:00+02:00</updated>
   <id>https://nicolas-hoizey.com/2016/06/the-dna-journey</id>
   <content type="html">&lt;p&gt;Une vidéo que tout le monde devrait voir&lt;sup id=&quot;fnref:soustitres&quot;&gt;&lt;a href=&quot;#fn:soustitres&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, une expérience que tout le monde devrait pouvoir faire.&lt;/p&gt;

&lt;div class=&quot;ratio-4-3 embed-video-container&quot; onclick=&quot;var myAnchor = document.getElementById('tyaEQEmt5ls');var tmpDiv = document.createElement('div');tmpDiv.innerHTML = '&amp;lt;iframe style=&amp;quot;vertical-align:top;width:100%;height:100%;position:absolute;&amp;quot; src=&amp;quot;https://www.youtube.com/embed/tyaEQEmt5ls?autoplay=1&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;';myAnchor.parentNode.replaceChild(tmpDiv.firstChild, myAnchor);return false;&quot; title=&quot;click here to play&quot;&gt;
&lt;a class=&quot;youtube-lazy-link&quot; style=&quot;width:100%;height:100%;background:#000 url(https://i2.ytimg.com/vi/tyaEQEmt5ls/0.jpg) center center no-repeat;background-size:contain;position:absolute&quot; href=&quot;https://www.youtube.com/watch?v=tyaEQEmt5ls&quot; id=&quot;tyaEQEmt5ls&quot; onclick=&quot;return false;&quot;&gt;
&lt;div class=&quot;youtube-lazy-link-div&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;youtube-lazy-link-info&quot;&gt;momondo – The DNA Journey&lt;/div&gt;
&lt;/a&gt;
&lt;div class=&quot;video-info&quot;&gt;We asked 67 people from all over the world to take a DNA test. It turns out they have much more in common with other nationalities than they thought ...

It’s easy to think there are more things dividing us than uniting us. But we actually have much more in common with other nationalities than you’d think. 

At momondo we believe that everybody should be able to travel the world, to meet other people, and experience other cultures and religions. Travel opens our minds: when we experience something different, we begin to see things differently. Share this video, and help us spread the word – and open our world. 

Discover more personal stories from Jay, Aurelie, Carlos, Yanina, Karen and Ellaha here: http://momon.do/DNA.Playlist

Let’s connect! 
Facebook: https://www.facebook.com/momondo 
Twitter: https://twitter.com/momondo
Google+: https://plus.google.com/+momondo
Instagram: https://www.instagram.com/momondo/

The film was shot in Vega, Copenhagen, Denmark, and directed by Jeppe Rønde. 

For more about our vision, please visit: www.momondo.com/letsopenourworld

momondo is a free, independent global travel search site comparing billions of cheap flights, hotels and car hire deals.&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Merci Éric de l’avoir &lt;a href=&quot;https://twitter.com/edasfr/status/738736842724540416&quot;&gt;twittée&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:soustitres&quot;&gt;
      &lt;p&gt;Des sous-titres sont disponibles dans plein de langues, n’oubliez pas de les activer si l’anglais vous rebute. &lt;a href=&quot;#fnref:soustitres&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>People don't change the default 16px font size in their browser</title>
   <link href="https://nicolas-hoizey.com/2016/03/people-don-t-change-the-default-16px-font-size-in-their-browser.html"/>
   <updated>2016-03-02T00:00:00+01:00</updated>
   <id>https://nicolas-hoizey.com/2016/03/people-don-t-change-the-default-16px-font-size-in-their-browser</id>
   <content type="html">&lt;p&gt;I am really happy to still read articles that advocate for the &lt;a href=&quot;http://zellwk.com/blog/rem-vs-em/&quot;&gt;use of proportional CSS units as &lt;code class=&quot;highlighter-rouge&quot;&gt;em&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;rem&lt;/code&gt;&lt;/a&gt; in 2016. But there are often trolls&lt;sup id=&quot;fnref:troll&quot;&gt;&lt;a href=&quot;#fn:troll&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; that come comment these articles to say that we, who are using proportional units, are dumb, because there is no need for this. Here is &lt;a href=&quot;http://zellwk.com/blog/rem-vs-em/#comment-2547145640&quot;&gt;an example&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are unfortunately &lt;strong&gt;two misleading urban legends&lt;/strong&gt; in most web developers minds:&lt;/p&gt;

&lt;h2 id=&quot;default-font-size-in-browsers-is-always-16px&quot;&gt;Default font size in browsers is always 16px&lt;/h2&gt;

&lt;p&gt;No, it’s not.&lt;/p&gt;

&lt;p&gt;It is often, true, but not always.&lt;/p&gt;

&lt;p&gt;Here are a few counterexamples I’ve collected from actual devices / browsers:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Device / browser&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Default font size&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Opera Mini 4.5&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;13px&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Palm webOS 2.0 &amp;amp; webOS TouchPad&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;14px&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Opera Mini 7&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;17px&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;AOL 9&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;20px&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Cybook Odyssey (e-book reader)&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;21px&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Blackberry 6.0&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;22px&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;NetFront NX&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;23px&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Kindle 3&lt;sup id=&quot;fnref:kindle&quot;&gt;&lt;a href=&quot;#fn:kindle&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;26px&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;These devices are fairly old because I made the study in 2013, but I’m sure there are still such devices nowadays. I admit I can’t prove it with actual data.&lt;/p&gt;

&lt;p&gt;These default font sizes were set by the device or browser vendors because it was the best size for reading. When you set your font-size in &lt;code class=&quot;highlighter-rouge&quot;&gt;px&lt;/code&gt; units, you throw their work to satisfy their users/clients into the bin.&lt;/p&gt;

&lt;h2 id=&quot;people-dont-change-the-default-font-size-in-their-browser&quot;&gt;People don’t change the default font size in their browser&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;I do&lt;/strong&gt; — and I have friends who do too — change the browser settings for default font size. I even made &lt;a href=&quot;http://lanyrd.com/2013/parisweb/sckdfg/&quot;&gt;a talk about &lt;code class=&quot;highlighter-rouge&quot;&gt;em&lt;/code&gt; and this great feature&lt;/a&gt;&lt;sup id=&quot;fnref:french&quot;&gt;&lt;a href=&quot;#fn:french&quot; class=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; in 2013 at &lt;a href=&quot;http://www.paris-web.fr/&quot;&gt;Paris Web, the french leading Web conference&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;I agree we are not a lot&lt;sup id=&quot;fnref:everyone&quot;&gt;&lt;a href=&quot;#fn:everyone&quot; class=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt; to do that, maybe even less now than a few years ago.&lt;/p&gt;

&lt;p&gt;But is it:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;because there is really no need anymore,&lt;/li&gt;
  &lt;li&gt;because browsers hide this really valuable feature in their “advanced” settings,&lt;/li&gt;
  &lt;li&gt;or because Web developers don’t care about people who need this?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My humble opinion is that:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;there is still a need&lt;/strong&gt; for this, maybe even increasingly so with people using the Web getting older,&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;but&lt;/strong&gt; too many websites are really deceptive, not caring at all about users’ preferences and needs, using &lt;code class=&quot;highlighter-rouge&quot;&gt;px&lt;/code&gt; font-sizes, making this feature useless,&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;then&lt;/strong&gt; users change their habits and use global zoom, even if it’s more complicated and the result is sometimes less practical&lt;sup id=&quot;fnref:scroll&quot;&gt;&lt;a href=&quot;#fn:scroll&quot; class=&quot;footnote&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;,&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;then&lt;/strong&gt; browsers hide or remove this feature, because they see in usage statistics that it is not used anymore,&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;then&lt;/strong&gt; people who really would need this feature don’t find it, don’t even know it exists,&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;then&lt;/strong&gt; most web developers, who are also web users, don’t know that this feature exists either, and that there are people out there who would be delighted to use it, so they don’t do anything to support that.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We — most web developers — collectively killed the feature by not allowing it to work as intended. We should try to focus on the users’ need, not the technical implementation (or lack thereof), before saying it’s not useful.&lt;/p&gt;

&lt;p&gt;So, we might not be a lot to need — or even just want — to change the default font size of our browsers, but:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;using &lt;code class=&quot;highlighter-rouge&quot;&gt;px&lt;/code&gt; unit, you deny us this right,&lt;/li&gt;
  &lt;li&gt;using &lt;code class=&quot;highlighter-rouge&quot;&gt;em&lt;/code&gt; unit, you satisfy everyone&lt;sup id=&quot;fnref:usersagainstem&quot;&gt;&lt;a href=&quot;#fn:usersagainstem&quot; class=&quot;footnote&quot;&gt;6&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, if you use &lt;code class=&quot;highlighter-rouge&quot;&gt;px&lt;/code&gt; for font-size, I hope it’s only because you didn’t know what it means, and I also hope you will change.&lt;/p&gt;

&lt;p&gt;And please, please, don’t tell me using &lt;code class=&quot;highlighter-rouge&quot;&gt;em&lt;/code&gt;s or &lt;code class=&quot;highlighter-rouge&quot;&gt;rem&lt;/code&gt;s is hard. It’s not. At all. You just need to think differently and use the appropriate tools. &lt;a href=&quot;http://zellwk.com/blog/rem-vs-em/&quot;&gt;Read this&lt;/a&gt; again, and practice.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:troll&quot;&gt;
      &lt;p&gt;I often call myself a troll, that’s not that harsh when I’m the one saying it… ;-) &lt;a href=&quot;#fnref:troll&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:kindle&quot;&gt;
      &lt;p&gt;Yes, &lt;a href=&quot;https://www.google.fr/search?q=kindle+web+font+size&quot;&gt;people use Kindle and similar e-book readers to browse the Web&lt;/a&gt;. &lt;a href=&quot;#fnref:kindle&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:french&quot;&gt;
      &lt;p&gt;In french, sorry if you don’t understand it. &lt;a href=&quot;#fnref:french&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:everyone&quot;&gt;
      &lt;p&gt;Answering everyone’s needs is at the heart of the Web’s universal access principle, the first of &lt;a href=&quot;https://www.w3.org/Consortium/mission#principles&quot;&gt;W3C’s design principles&lt;/a&gt; &lt;a href=&quot;#fnref:everyone&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:scroll&quot;&gt;
      &lt;p&gt;Think about websites that are not yet responsive, where zooming leads to messy horizontal scroll. &lt;a href=&quot;#fnref:scroll&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:usersagainstem&quot;&gt;
      &lt;p&gt;I never heard about users complaining about font sizes defined in &lt;code class=&quot;highlighter-rouge&quot;&gt;em&lt;/code&gt;s, only developers. &lt;a href=&quot;#fnref:usersagainstem&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Le gros impact des raccourcisseurs d'URL sur la performance</title>
   <link href="https://nicolas-hoizey.com/2016/02/un-exemple-d-impact-des-raccourcisseurs-d-url.html"/>
   <updated>2016-02-19T00:00:00+01:00</updated>
   <id>https://nicolas-hoizey.com/2016/02/un-exemple-d-impact-des-raccourcisseurs-d-url</id>
   <content type="html">&lt;p&gt;Les raccourcisseurs d’URL sont devenus incontournables sur le Web depuis quelques années, mais initialement pensés comme outils de facilitation de partage&lt;sup id=&quot;fnref:nhoio&quot;&gt;&lt;a href=&quot;#fn:nhoio&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, &lt;a href=&quot;http://www.lemonde.fr/technologies/article/2009/12/15/la-bataille-des-raccourcisseurs-d-adresses-web_1281072_651865.html&quot;&gt;ils ont beaucoup évolué&lt;/a&gt; et sont surtout devenus des outils de &lt;em&gt;tracking&lt;/em&gt;. Du coup, les sites en abusent de plus en plus, alors que les plateformes où ces liens sont publiés, Twitter par exemple, rajoutent leur propre couche. &lt;strong&gt;L’impact sur la performance pour l’utilisateur final est désastreux&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Voici l’exemple d’un lien présent dans un tweet de TechCrunch :&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Google opens its Cloud Vision API to all developers &lt;a href=&quot;https://t.co/9EJqYiRxGA&quot;&gt;https://t.co/9EJqYiRxGA&lt;/a&gt; &lt;a href=&quot;https://t.co/K1jnjLiHhi&quot;&gt;pic.twitter.com/K1jnjLiHhi&lt;/a&gt;&lt;/p&gt;&amp;mdash; TechCrunch (@TechCrunch) &lt;a href=&quot;https://twitter.com/TechCrunch/status/700559714762018816?ref_src=twsrc%5Etfw&quot;&gt;February 19, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;L’URL où se trouve effectivement le contenu est &lt;a href=&quot;http://techcrunch.com/2016/02/18/google-opens-its-cloud-vision-api-to-all-developers/&quot;&gt;http://techcrunch.com/2016/02/18/google-opens-its-cloud-vision-api-to-all-developers/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mais la première URL effectivement suivie est celle imposée par Twitter, c’est à dire &lt;a href=&quot;https://t.co/9EJqYiRxGA&quot;&gt;https://t.co/9EJqYiRxGA&lt;/a&gt;, même si l’URL affichée dans le tweet — qui fera l’objet de la première redirection — est &lt;a href=&quot;http://tcrn.ch/1UaOheF&quot;&gt;http://tcrn.ch/1UaOheF&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Et voilà l’enchainement de redirections provoqué par un clic sur ce lien :&lt;/p&gt;

&lt;figure&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_800/https://nicolas-hoizey.com/2016/02/impact-redirection-webperf-fibre.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_360/https://nicolas-hoizey.com/2016/02/impact-redirection-webperf-fibre.png 360w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_670/https://nicolas-hoizey.com/2016/02/impact-redirection-webperf-fibre.png 670w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_980/https://nicolas-hoizey.com/2016/02/impact-redirection-webperf-fibre.png 980w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_990/https://nicolas-hoizey.com/2016/02/impact-redirection-webperf-fibre.png 990w&quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;L'impact des redirections avec une connexion fibre&quot; width=&quot;990&quot; height=&quot;178&quot; /&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Le cumul des temps passés pour chaque redirection avant d’arriver à la « vraie » requête pour la page voulue est de 1 300 millisecondes, &lt;strong&gt;presque une seconde et demi de perdue&lt;/strong&gt; !&lt;/p&gt;

&lt;p&gt;Et cela dans un environnement bien confortable avec une connexion fibre de très bonne qualité.&lt;/p&gt;

&lt;p&gt;La simulation d’une bonne connexion 3G dans Chrome montre que la bande passante du réseau n’a aucune influence sur ce temps passé, puisqu’aucun contenu n’est en fait transféré :&lt;/p&gt;

&lt;figure&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_800/https://nicolas-hoizey.com/2016/02/impact-redirection-webperf-3g.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_360/https://nicolas-hoizey.com/2016/02/impact-redirection-webperf-3g.png 360w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_670/https://nicolas-hoizey.com/2016/02/impact-redirection-webperf-3g.png 670w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_969/https://nicolas-hoizey.com/2016/02/impact-redirection-webperf-3g.png 969w&quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; width=&quot;969&quot; height=&quot;180&quot; /&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;La simulation d’une latence de 500 millisecondes sur cette connexion 3G — ce qui peut se produire très souvent en mobilité — montre par contre un impact énorme :&lt;/p&gt;

&lt;figure&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_800/https://nicolas-hoizey.com/2016/02/impact-redirection-webperf-3g-latence.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_360/https://nicolas-hoizey.com/2016/02/impact-redirection-webperf-3g-latence.png 360w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_670/https://nicolas-hoizey.com/2016/02/impact-redirection-webperf-3g-latence.png 670w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_980/https://nicolas-hoizey.com/2016/02/impact-redirection-webperf-3g-latence.png 980w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_1060/https://nicolas-hoizey.com/2016/02/impact-redirection-webperf-3g-latence.png 1060w&quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; width=&quot;1060&quot; height=&quot;178&quot; /&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Le temps perdu est ici de 3 370 millisecondes, soit &lt;strong&gt;presque 3 secondes et demi&lt;/strong&gt; !&lt;/p&gt;

&lt;p&gt;Autant dire que c’est extrêmement frustrant, et qu’il m’arrive souvent de revenir à mon fil Twitter avant que la page souhaitée n’ait été affichée.&lt;/p&gt;

&lt;p&gt;Dans le cas qui illustre mon propos, on peut se demander de plus pourquoi on fait un double aller-retour entre &lt;code class=&quot;highlighter-rouge&quot;&gt;tcrn.ch&lt;/code&gt; et &lt;code class=&quot;highlighter-rouge&quot;&gt;trib.al&lt;/code&gt;, il y a peut-être une erreur de configuration quelque part, avec en conséquence une seconde de vraiment perdue pour rien.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:nhoio&quot;&gt;
      &lt;p&gt;J’utilise moi-même le domaine personnalisé &lt;code class=&quot;highlighter-rouge&quot;&gt;nho.io&lt;/code&gt; avec Bitly quand j’ai besoin de partager une URL courte et intelligible, notamment des &lt;a href=&quot;https://indiewebcamp.com/permashortlinks&quot;&gt;permashortlinks&lt;/a&gt; vers mes propres contenus, mais j’en connais les conséquences, donc je suis prudent. &lt;a href=&quot;#fnref:nhoio&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Je n'utilise (presque) plus ma liseuse électronique</title>
   <link href="https://nicolas-hoizey.com/2016/02/je-n-utilise-plus-ma-liseuse-electronique.html"/>
   <updated>2016-02-03T00:00:00+01:00</updated>
   <id>https://nicolas-hoizey.com/2016/02/je-n-utilise-plus-ma-liseuse-electronique</id>
   <content type="html">&lt;p&gt;Je réagi ici au &lt;a href=&quot;http://nota-bene.org/Livre-numerique-pas-encore-probant-pour-moi&quot;&gt;billet de Stéphane sur le livre numérique qu’il ne juge pas encore probant&lt;/a&gt; pour donner mon propre avis. J’allais répondre chez lui, mais j’ai voulu trop écrire, ça devenait inconfortable dans le petit champ de saisi, donc j’ai fini par plutôt écrire chez moi… ;-)&lt;/p&gt;

&lt;figure class=&quot;onethird right&quot;&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_300/https://nicolas-hoizey.com/2016/02/Cybook-Odyssey-HD-FrontLight.jpg&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_120/https://nicolas-hoizey.com/2016/02/Cybook-Odyssey-HD-FrontLight.jpg 120w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_230/https://nicolas-hoizey.com/2016/02/Cybook-Odyssey-HD-FrontLight.jpg 230w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_340/https://nicolas-hoizey.com/2016/02/Cybook-Odyssey-HD-FrontLight.jpg 340w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_450/https://nicolas-hoizey.com/2016/02/Cybook-Odyssey-HD-FrontLight.jpg 450w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_560/https://nicolas-hoizey.com/2016/02/Cybook-Odyssey-HD-FrontLight.jpg 560w&quot; sizes=&quot;(min-width: 50rem) 17rem, 30vw&quot; width=&quot;3326&quot; height=&quot;3847&quot; /&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Je lis extrêmement peu en dehors du Web (trop peu, même), et surtout des ouvrages consacrés à &lt;a href=&quot;/a-propos.html&quot;&gt;mes deux passions&lt;/a&gt; que sont le Web (surtout ses techniques) et la photographie (tant les techniques que les œuvres).&lt;/p&gt;

&lt;p&gt;Je devrais lire plus de romans — je prends d’ailleurs plaisir à le faire de temps en temps, surtout en vacances —, mais je n’arrive pas à prendre le temps nécessaire, consacrant le peu que j’ai à mes lectures techniques associées à mes &lt;em&gt;pet projects&lt;/em&gt; comme &lt;a href=&quot;http://esviji.com/&quot;&gt;mon jeu esviji&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mes deux thèmes de prédilection ne sont malheureusement pas compatibles avec les liseuses électroniques, à cause de :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;l’écran noir et blanc : un code source un peu long sans coloration syntaxique c’est vite pénible, et bien sûr, voir l’œuvre d’un Steve McCurry ou autre en noir et blanc n’est vraiment pas pertinent&lt;/li&gt;
  &lt;li&gt;le petit écran : surtout pour les livres photos, dont j’ai quelques exemplaires vraiment grands&lt;/li&gt;
  &lt;li&gt;la texture : là encore plutôt pour la photo, où le bon choix de papier peut transcender ou au contraire anéantir une belle photo&lt;/li&gt;
  &lt;li&gt;les annotations : pour le coup, surtout pour les livres techniques, je n’ai pas trouvé mieux que les annotations directement dans le livre, avec post-it en marque page éventuellement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Par contre, pour les livres techniques, les versions électroniques sont très utiles pour retrouver rapidement un passage via une recherche en texte libre. Mais la recherche sur liseuse électronique — en tout cas sur ma vieille Bookeen — est galère.&lt;/p&gt;

&lt;p&gt;J’achète du coup tous mes livres techniques en formats papier ET numérique, mais j’utilise plus le PDF sur mon ordi (pour la recherche) que l’ePub sur ma liseuse. Cela fait un sacré budget, mais j’ai ainsi la combinaison des deux conforts que je recherche.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Versions de Firefox OS utilisées sur esviji</title>
   <link href="https://nicolas-hoizey.com/2015/10/versions-de-firefox-os-utilisees-sur-esviji.html"/>
   <updated>2015-10-21T00:00:00+02:00</updated>
   <id>https://nicolas-hoizey.com/2015/10/versions-de-firefox-os-utilisees-sur-esviji</id>
   <content type="html">&lt;p&gt;Mon jeu &lt;a href=&quot;http://esviji.com&quot;&gt;esviji&lt;/a&gt; est principalement utilisé sur les smartphones Firefox OS — à 75% d’après Google Analytics — grâce à sa &lt;a href=&quot;https://marketplace.firefox.com/app/esviji&quot;&gt;présence dans la marketplace qui leur est dédiée&lt;/a&gt;, et plutôt apprécié &lt;a href=&quot;https://marketplace.firefox.com/app/esviji/ratings&quot;&gt;visiblement&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Voilà les 10 versions de Firefox les plus utilisées sur &lt;a href=&quot;http://play.esviji.com/&quot;&gt;play.esviji.com&lt;/a&gt;&lt;sup id=&quot;fnref:v2&quot;&gt;&lt;a href=&quot;#fn:v2&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; depuis 3 mois, et les versions de Firefox OS correspondantes&lt;sup id=&quot;fnref:corr&quot;&gt;&lt;a href=&quot;#fn:corr&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; :&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Version de Firefox&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Version de Firefox OS&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Sessions&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;28.1&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1.3&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;8 354&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;18.1&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1.1&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1 254&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;28.0&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1.3&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;489&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;32.0&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2.0&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;122&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;18.0&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1.0.1&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;19&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;37.0&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2.2&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;13&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;34.0&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2.1&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;9&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;26.0&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1.2&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;3&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;30.0&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1.4&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;39.0&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2.?&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;La version 1.3 de Firefox OS est donc largement la plus utilisée parmi les joueurs de esviji, qui se trouvent principalement aux Philippines, et la vieille version 1.1 est encore pas mal présente.&lt;/p&gt;

&lt;p&gt;Je dois donc prendre en compte ces deux versions dans mes tests pour savoir si elles sont compatibles avec les nombreuses nouveautés CSS&lt;sup id=&quot;fnref:css&quot;&gt;&lt;a href=&quot;#fn:css&quot; class=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; employées dans la future version 2 de esviji. Sinon, elles devront se contenter de rester sur la v1.&lt;/p&gt;

&lt;p&gt;En parlant de statistiques, je serais &lt;strong&gt;énormément heureux&lt;/strong&gt; si quelqu’un peut m’expliquer d’où vient cet énorme sursaut dans les installations de esviji durant trois jours à partir du 11 mai 2015 :&lt;/p&gt;

&lt;figure&gt;
&lt;img src=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_800/https://nicolas-hoizey.com/2015/10/esviji-installation-stats.png&quot; srcset=&quot;https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_360/https://nicolas-hoizey.com/2015/10/esviji-installation-stats.png 360w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_670/https://nicolas-hoizey.com/2015/10/esviji-installation-stats.png 670w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_980/https://nicolas-hoizey.com/2015/10/esviji-installation-stats.png 980w,
https://res.cloudinary.com/nho/image/fetch/c_limit,f_auto,q_auto,w_1053/https://nicolas-hoizey.com/2015/10/esviji-installation-stats.png 1053w&quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; width=&quot;1053&quot; height=&quot;679&quot; /&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:v2&quot;&gt;
      &lt;p&gt;N’oubliez pas que vous pouvez maintenant aller tester la version sur &lt;a href=&quot;http://v2.esviji.com/&quot;&gt;v2.esviji.com&lt;/a&gt; ! &lt;a href=&quot;#fnref:v2&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:corr&quot;&gt;
      &lt;p&gt;Les correspondances sont données par &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Gecko_user_agent_string_reference#Firefox_OS_version_number&quot;&gt;cette table&lt;/a&gt;. &lt;a href=&quot;#fnref:corr&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:css&quot;&gt;
      &lt;p&gt;Notamment les &lt;em&gt;viewport units&lt;/em&gt; (&lt;code class=&quot;highlighter-rouge&quot;&gt;vw&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;vh&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;vmin&lt;/code&gt; et &lt;code class=&quot;highlighter-rouge&quot;&gt;vmax&lt;/code&gt;), &lt;code class=&quot;highlighter-rouge&quot;&gt;calc()&lt;/code&gt;, et flexbox. &lt;a href=&quot;#fnref:css&quot; class=&quot;reversefootnote&quot;&gt;⬆︎&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 

</feed>
