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

 <title>Software Engineering Blog - Gilles Legoux (glegoux)</title>
 <link href="https://glegoux.com/atom.xml" rel="self"/>
 <link href="https://glegoux.com/"/>
 <updated>2026-05-11T13:23:01+00:00</updated>
 <id>https://glegoux.com/</id>

 
 <entry>
   <title>Top Five Ways to Beat Blue Monday</title>
   <link href="https://glegoux.com/blog/articles/2024/01/10/top-five-ways-to-beat-blue-monday.html"/>
   <updated>2024-01-10T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2024/01/10/top-five-ways-to-beat-blue-monday.html</id>
   <content type="html">&lt;p&gt;Knowing that the year’s most depressing day is soon can be upsetting. No recurrent day will see everyone feeling depressed. However, periodic factors can contribute to defining the social climate of a society, where statistically, a significant proportion of the population suffers from depression compared to other moments.&lt;/p&gt;

&lt;p&gt;Let’s understand the Blue Monday effect and how to go over it:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;📜 History&lt;/li&gt;
  &lt;li&gt;🧮 Formulae&lt;/li&gt;
  &lt;li&gt;📊 Analysis&lt;/li&gt;
  &lt;li&gt;🪄 Tips&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;-history&quot;&gt;📜 History&lt;/h1&gt;

&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Blue_Monday_%28date%29&quot;&gt;Blue Monday&lt;/a&gt;  is a day recognized as the most depressing day of the year, mainly because of the return to work and routine after a weekend and the end of the festivities of the previous year. It is the third Monday of January.&lt;/p&gt;

&lt;p&gt;It was initially created by psychologist Dr. Cliff Arnall in 2005 when he developed the concept as part of a marketing campaign for the now-defunct British company  &lt;a href=&quot;https://en.wikipedia.org/wiki/Sky_Travel&quot;&gt;Sky Travel&lt;/a&gt;. It’s a fantastic example of how an advertising campaign can become embedded in cultural traditions.&lt;/p&gt;

&lt;h1 id=&quot;-formulae&quot;&gt;🧮 Formulae&lt;/h1&gt;

&lt;p&gt;Dr. Cliff Arnall suggested a function that models how depressing each day of the year is. By finding the date on which a mathematical formula based on economic, psychological, and climatological factors, then validated by his observations, takes its maximum value on Blue Monday:&lt;/p&gt;

&lt;figure title=&quot;Depression formula — not proven scientifically 🤓&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:223/1*g_U1U3hTBB28XbBAaIiVVg.png&quot; title=&quot;Depression formula — not proven scientifically 🤓&quot; alt=&quot;Depression formula — not proven scientifically 🤓&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Depression formula — not proven scientifically 🤓
    
      [&lt;a href=&quot;https://en.wikipedia.org/wiki/Blue_Monday_(date)&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Where the parameters are the weather (W), the debt (D), the monthly salary (d), the time since Christmas (T), the time since failing our New Year’s resolutions (Q), low motivational levels (M), and the feeling of the need to take action (Na).&lt;/p&gt;

&lt;p&gt;Later, Dr. Cliff Arnall created the “Yellow Day”, a celebration of the happiest day of the year to counterbalance the saddest day. This time, he was in cahoots with an ice cream manufacturer,  &lt;a href=&quot;https://en.wikipedia.org/wiki/Wall%27s_(ice_cream)&quot;&gt;Wall’s Ice Cream&lt;/a&gt;, where the period around the 20th of June would be a perfectly happy day thanks to the pleasant temperature, more daylight hours, and holiday perspectives. On a similar approach, the formula is:&lt;/p&gt;

&lt;figure title=&quot;Happiness formula — not proven scientifically 🤓&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:214/1*LfeLEl_pl-iB8PSR5kDf5w.png&quot; title=&quot;Happiness formula — not proven scientifically 🤓&quot; alt=&quot;Happiness formula — not proven scientifically 🤓&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Happiness formula — not proven scientifically 🤓
    
      [&lt;a href=&quot;https://web.archive.org/web/20110120064745/http://www.ctv.ca/CTVNews/TopStories/20060623/happiest_day_060623&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Where the parameters are the outdoor activities (O) in full connection with nature (N) and also the social interactions (I), the childhood and other positive memories  (S), multiplied by the temperature (T), and divided holiday excitement (P).&lt;/p&gt;

&lt;p&gt;Several versions of these mathematical formulae exist. Each one gives periodic dates because they are founded on pseudo-periodic coupled parameters. However, the scientific community considers them as baseless pseudoscience. And they are right. In addition, the mental health of a population can be influenced by many unpredictable phenomena like an economic crisis, an epidemic, or a natural catastrophe. Even if a mathematical formula and/or these annual periodicities were proven, they would be disturbed by it. But time slices exist where the mental health of a whole population is affected. It isn’t easy to quantify. Only trends can be observed.&lt;/p&gt;

&lt;h1 id=&quot;-read-more&quot;&gt;👀 Read more&lt;/h1&gt;

&lt;p&gt;Read the rest of the article …&lt;/p&gt;

&lt;div style=&quot;text-align: center;margin-bottom: 1em;&quot;&gt;
  &lt;a href=&quot;https://medium.com/@glegoux/top-five-ways-to-beat-blue-monday-0f0de0950827&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; title=&quot;Read more&quot;&gt;
    &lt;button class=&quot;btn btn-dark&quot;&gt;
      &lt;b class=&quot;black&quot;&gt;Read more&lt;/b&gt;
    &lt;/button&gt;
  &lt;/a&gt;
&lt;/div&gt;

</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Ubuntu: apt-key is deprecated</title>
   <link href="https://glegoux.com/blog/articles/2023/07/29/ubuntu-apt-key-is-deprecated.html"/>
   <updated>2023-07-29T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2023/07/29/ubuntu-apt-key-is-deprecated.html</id>
   <content type="html">&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;apt-key&lt;/code&gt; is deprecated from Ubuntu 22.04 LTS (Jammy Jellyfish) for security flaws: don’t use it anymore whatever your Linux environment.
Instead of using it, consider the command gpg now. Then move your public keys relative to your APT package manager to a 
new location with the binary format OpenPGP, and specify the option Signed-By (signed-by) for all your used package repositories.&lt;/p&gt;

&lt;p&gt;Let’s follow this plan together to properly use your secure package management and see if you are not infected by these security flaws:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;🔒Understand the security flaws&lt;/li&gt;
  &lt;li&gt;💡 Explore its workstation environment for  &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;apt&lt;/code&gt;  and  &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;apt-key&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;🔨 Use directly the  &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;gpg&lt;/code&gt;  command to manage your new keys&lt;/li&gt;
  &lt;li&gt;➡️ Migrate your current trusted public security keys to the correct format and location&lt;/li&gt;
  &lt;li&gt;✅ Check the migration and stop the use&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;apt-key&lt;/code&gt;,  &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;/etc/apt/trusted.gpg&lt;/code&gt;,  &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;/etc/apt/trusted.gpg.d/&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;❔Questions&lt;/li&gt;
  &lt;li&gt;🚀 Go further&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;-understand-the-security-flaws&quot;&gt;🔒 Understand the security flaws&lt;/h1&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;apt-key&lt;/code&gt;  is a sub-command of  &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;apt&lt;/code&gt;  to secure the management packages with asymmetric  security keys. As you know, package management is a sensible area for security; it is an access door for an attacker to install malicious packages. That’s why when a package is installed, cryptography is used to validate that the installed package is really the one wishes (see  &lt;a href=&quot;https://wiki.debian.org/SecureApt&quot;&gt;Debian Wiki: SecureApt&lt;/a&gt;).&lt;/p&gt;

&lt;figure title=&quot;Security risks in package management&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:700/1*xnkb2pC2ouw_pA97-n8Mjg.png&quot; title=&quot;Security risks in package management&quot; alt=&quot;Security risks in package management&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Security risks in package management
    
      [built by author]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Here are the milestones of the lifecycle of a package until be installed:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The package is produced on a build machine;&lt;/li&gt;
  &lt;li&gt;The package is signed on the build machine with a private key;&lt;/li&gt;
  &lt;li&gt;The signed package is uploaded to a repository (download mirror);&lt;/li&gt;
  &lt;li&gt;The client system downloads the package (with its package dependencies before, if needed) thanks to the metadata and the usage of its package manager from an authorized repository (or from cache);&lt;/li&gt;
  &lt;li&gt;The signature of the package is verified (with its package dependencies before, if needed) with the associated public key;&lt;/li&gt;
  &lt;li&gt;If the signature is valid, the package is installed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The developers of Debian and Ubuntu realized that the apt-key command has had flaws for a long time (see  &lt;a href=&quot;https://security-tracker.debian.org/tracker/source-package/apt&quot;&gt;Security tracker: package apt&lt;/a&gt;  and particularly  &lt;a href=&quot;https://security-tracker.debian.org/tracker/CVE-2011-3374&quot;&gt;CVE-2011–3374&lt;/a&gt;). While  &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;apt-key&lt;/code&gt;  was not guaranteed to work people continue to use it, that’s why now this command line has been marked as deprecated (see  &lt;a href=&quot;https://salsa.debian.org/apt-team/apt/-/commit/ee284d5917d09649b68ff1632d44e892f290c52f&quot;&gt;Fully deprecate apt-key, schedule removal for Q2/2022 (ee284d59) · Commits · APT Developers / apt · GitLab&lt;/a&gt;) and will be deleted. Support for the function ends with Debian 11 (Bullseye) and Ubuntu 22.04 (Jammy Jellyfish).&lt;/p&gt;

&lt;p&gt;The problem is to move all tech ecosystems because numerous documentation or blog posts are not up-to-date on this aspect. Even tech giants like &lt;a href=&quot;https://web.archive.org/web/20230821043842/https://www.google.com/linuxrepositories/&quot;&gt;Google: Linux Software Repositories&lt;/a&gt;, where the usage of &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;apt-key&lt;/code&gt; is still referenced in August 2023 (after the publication of this article in July 2023). After raising the alert, the correction was made in February 2024 (&lt;a href=&quot;https://web.archive.org/web/20240219051925/http://www.google.com/linuxrepositories/&quot;&gt;here&lt;/a&gt;).&lt;/p&gt;

&lt;figure title=&quot;The home page of the Google Linux Software Repositories is not up-to-date with the usage of apt-key&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:700/1*uOECpGoz2jU0l2rwQ1t1fw.png&quot; title=&quot;The home page of the Google Linux Software Repositories is not up-to-date with the usage of apt-key&quot; alt=&quot;The home page of the Google Linux Software Repositories is not up-to-date with the usage of apt-key&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    The home page of the Google Linux Software Repositories is not up-to-date with the usage of apt-key
    
      [&lt;a href=&quot;https://www.google.com/linuxrepositories&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Let’s understand an attack scenario among several possible ones. Even if, by default, APT checks the validity of the signature of each package to install, and if it is invalid, a warning message is printed, and the package is not installed, this is not sufficient because APT also needs to know which trusted public GPG key belongs to which package repository.&lt;/p&gt;

&lt;h1 id=&quot;-read-more&quot;&gt;👀 Read more&lt;/h1&gt;

&lt;p&gt;Read the rest of the article …&lt;/p&gt;

&lt;div style=&quot;text-align: center;margin-bottom: 1em;&quot;&gt;
  &lt;a href=&quot;https://medium.com/@glegoux/ubuntu-22-04-jammy-jellyfish-apt-key-is-deprecated-2dbbee8aec84#:~:text=Let%E2%80%99s%20understand%20an%20attack%20scenario%20among%20several%20ones%20possible.&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; title=&quot;Read more&quot;&gt;
    &lt;button class=&quot;btn btn-dark&quot;&gt;
      &lt;b class=&quot;black&quot;&gt;Read more&lt;/b&gt;
    &lt;/button&gt;
  &lt;/a&gt;
&lt;/div&gt;

</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>History of the Generative AI</title>
   <link href="https://glegoux.com/blog/articles/2023/04/16/history-of-the-generative-ai.html"/>
   <updated>2023-04-16T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2023/04/16/history-of-the-generative-ai.html</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;Generative AI&lt;/strong&gt; is the state of the art of machine learning and has recently seen significant advancements with the emergence of &lt;strong&gt;AI ChatBots with high performance&lt;/strong&gt;.&lt;/p&gt;

&lt;figure title=&quot;Generative AI for all types of content&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:700/1*UenOkL0Tn-XuP-hOho9b3Q.png&quot; title=&quot;Generative AI for all types of content&quot; alt=&quot;Generative AI for all types of content&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Generative AI for all types of content
    
      [built by author]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Let’s discover its history, from simple textual machine learning models specialized to  &lt;strong&gt;universal&lt;/strong&gt;  &lt;strong&gt;large language models&lt;/strong&gt; at a vast scale:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;💬 AI ChatBots&lt;/li&gt;
  &lt;li&gt;🔥 From NLP to Multimodal GAI ChatBots based on LLM&lt;/li&gt;
  &lt;li&gt;🧪LLMs Timeline: Closed-source vs. Open-source&lt;/li&gt;
  &lt;li&gt;🎯 From Specialized Model to Generalized ML Model&lt;/li&gt;
  &lt;li&gt;📈 Scaling Laws &amp;amp; Performance&lt;/li&gt;
  &lt;li&gt;🏁 Technological and Economic Race&lt;/li&gt;
  &lt;li&gt;🚀 Go Further with Limited &amp;amp; Augmented LLMs&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;-ai-chatbots&quot;&gt;💬 AI ChatBots&lt;/h1&gt;

&lt;p&gt;Building generalist  &lt;strong&gt;AI chatbots&lt;/strong&gt;  is the most complex challenge for a technology that simulates human intelligence. It is the  &lt;strong&gt;base of the artificial human assistant&lt;/strong&gt;. They are experiencing dazzling success with the  &lt;strong&gt;release of ChatGPT&lt;/strong&gt;, a new step that has been overcome after Google Home and Alexa by AWS. The technical component behind these products has disrupted and improved the ecosystem considerably,  &lt;strong&gt;although not perfect yet&lt;/strong&gt;  (perhaps it will never be).&lt;/p&gt;

&lt;p&gt;The interest in chatBots followed the one for deep learning from 2010. Before, it was reserved for a restrained audience. Still, it exploded in  &lt;strong&gt;November 2022&lt;/strong&gt;  with the release of  &lt;strong&gt;chatGPT&lt;/strong&gt;  open to the general public with a ramp-up of  &lt;strong&gt;100M Monthly Active Users (MAUs) after two months&lt;/strong&gt;, a  worldwide record (4.5x faster than TikTok) and  &lt;strong&gt;1.6B MAUs now&lt;/strong&gt;. At the same time, machine learning and deep learning trends have continued growing in the background for ten years.&lt;/p&gt;

&lt;figure title=&quot;Google Trends from 2010&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:961/1*imwYfo_SLbjeVzeZ420QhQ.png&quot; title=&quot;Google Trends from 2010&quot; alt=&quot;Google Trends from 2010&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Google Trends from 2010
    
      [&lt;a href=&quot;https://trends.google.com/trends/explore?date=2010-01-01%202023-04-01&amp;amp;geo=FR&amp;amp;q=Machine%20Learning,Deep%20Learning,Chatbot&amp;amp;hl=en&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure title=&quot;Similar web for chat.openai.com&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:853/1*bdBhXytZGBsTrI3t-zxd4A.png&quot; title=&quot;Similar web for chat.openai.com&quot; alt=&quot;Similar web for chat.openai.com&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Similar web for chat.openai.com
    
      [&lt;a href=&quot;https://www.similarweb.com/website/chat.openai.com/#ranking&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;To have an order of magnitude, the human brain has, on average, 100 billion neurons and 100 trillion synapses. The estimated resources used for  &lt;strong&gt;chatGPT+&lt;/strong&gt;  (paying version of chatGPT) use deep learning models based on GPT-4 with an estimated model size close to these values (digits kept private by OpenAI). But a  &lt;strong&gt;human neuron/synapse&lt;/strong&gt;  is much more powerful than a  &lt;strong&gt;deep learning neuron/synapse.&lt;/strong&gt; The gap is still important, above on reasoning tasks on unknown problems requiring many resources.&lt;/p&gt;

&lt;figure title=&quot;Human brain vs. Deep learning&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:382/1*Ty6-E7apO67lSr02i-6kvQ.png&quot; title=&quot;Human brain vs. Deep learning&quot; alt=&quot;Human brain vs. Deep learning&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Human brain vs. Deep learning
    
      [adapted from &lt;a href=&quot;https://www.researchgate.net/figure/Visual-comparison-between-human-nerve-cell-and-neural-network-architecture14_fig3_360640306&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h1 id=&quot;from-nlp-to-multimodal-gai-chatbots-based-on-llm&quot;&gt;🔥From NLP to Multimodal GAI ChatBots based on LLM&lt;/h1&gt;

&lt;p&gt;Thanks to  &lt;strong&gt;Large Language Models (LLMs)&lt;/strong&gt;  working with Generative AI, chatBots continue getting closer to the objective of simulating  human intelligence&lt;strong&gt;.&lt;/strong&gt;  The  &lt;strong&gt;NLP AI models&lt;/strong&gt;  have progressively migrated from simple parsing to &lt;strong&gt;complex processing on the language structure&lt;/strong&gt;, from shallow learning to  &lt;strong&gt;deep learning&lt;/strong&gt;, from a single-language vocabulary of words to a  &lt;strong&gt;vocabulary of tokens with multi-language embeddings&lt;/strong&gt;, from an RNN (LSTM) to the  &lt;strong&gt;Transformer with multi-head attention layers&lt;/strong&gt;  approach.&lt;/p&gt;

&lt;figure title=&quot;NLP timeline with the Deep Learning&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:700/1*4N5CPyYSVFzfEapqGM5gug.png&quot; title=&quot;NLP timeline with the Deep Learning&quot; alt=&quot;NLP timeline with the Deep Learning&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    NLP timeline with the Deep Learning
    
      [&lt;a href=&quot;https://arxiv.org/pdf/2202.05924.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Finally, by mixing other types of data (like images, audio, …), NLP models became  &lt;strong&gt;multi-modal generative models&lt;/strong&gt; where varied instructions (in input) give varied results (in output).&lt;/p&gt;

&lt;h1 id=&quot;-read-more&quot;&gt;👀 Read more&lt;/h1&gt;

&lt;p&gt;Read the rest of the article …&lt;/p&gt;

&lt;div style=&quot;text-align: center;margin-bottom: 1em;&quot;&gt;
  &lt;a href=&quot;https://medium.com/@glegoux/history-of-the-generative-ai-aa1aa7c63f3c&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; title=&quot;Read more&quot;&gt;
    &lt;button class=&quot;btn btn-dark&quot;&gt;
      &lt;b class=&quot;black&quot;&gt;Read more&lt;/b&gt;
    &lt;/button&gt;
  &lt;/a&gt;
&lt;/div&gt;

</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>From Hadoop to the modern data stack</title>
   <link href="https://glegoux.com/blog/articles/2022/12/14/from-hadoop-to-the-modern-data-stack.html"/>
   <updated>2022-12-14T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2022/12/14/from-hadoop-to-the-modern-data-stack.html</id>
   <content type="html">&lt;h1 id=&quot;hadoop-at-criteo&quot;&gt;Hadoop at Criteo&lt;/h1&gt;

&lt;p&gt;by  &lt;a href=&quot;https://fr.linkedin.com/in/anthony-rabier-345108100&quot;&gt;Anthony Rabier&lt;/a&gt;, Staff Site Reliability Lead Engineer at  &lt;a href=&quot;https://www.criteo.com/&quot;&gt;Criteo&lt;/a&gt;&lt;br /&gt;
and  &lt;a href=&quot;https://fr.linkedin.com/in/williammontaz&quot;&gt;William Montaz&lt;/a&gt;, Senior Staff Site Reliability Engineer at  &lt;a href=&quot;https://www.criteo.com/&quot;&gt;Criteo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Criteo migrated from  &lt;a href=&quot;https://hadoop.apache.org/docs/stable/&quot;&gt;Hadoop&lt;/a&gt;  3 to Hadoop 2, with a lot of patches and in an awesome way by migrating first the runtime to Hadoop 3 for a big progressively without downtime for Hadoop YARN and HDFS without any intervention of the development teams, then by migrating the Hadoop projects for Spark, Flink, and Hadoop Map Reduce. So a vanilla distribution of Hadoop 3 has been created, running with compiled projects in Hadoop 2 and 3 with retro compatibility and tricks developed and merged by Criteo in the core project of Hadoop.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:318/0*Ca5vwq5jxI-Qq2m_&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Migration from Hadoop 2 to Hadoop 3&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/criteo/garmadon&quot;&gt;Garmadon&lt;/a&gt;  is an agent java deployed with all JVM processes running on the Criteo Hadoop cluster to do the metrology jobs for Spark, Flink, and Hadoop Map Reduce … You can build generic Grafana dashboards and create data lineage between your dataset and audit all operations on HDFS.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:700/0*OSMVeNYwRB6fQMSC&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Garmadon, Java agent for the Metrology on Hadoop&lt;/p&gt;

&lt;h1 id=&quot;data-processing-at-criteo&quot;&gt;Data processing at Criteo&lt;/h1&gt;

&lt;p&gt;by  &lt;a href=&quot;https://fr.linkedin.com/in/mliroz&quot;&gt;Miguel Liroz&lt;/a&gt;, Senior Staff Site Reliability Lead Engineer at  &lt;a href=&quot;https://www.criteo.com/&quot;&gt;Criteo&lt;/a&gt;&lt;br /&gt;
and  &lt;a href=&quot;https://www.linkedin.com/in/raphaelclaude&quot;&gt;Raphael Claude&lt;/a&gt;, Staff Site Reliability Engineer at  &lt;a href=&quot;https://www.criteo.com/&quot;&gt;Criteo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Datadoc is an internal tool used by Criteo to browse the data catalog and to provide a data catalog on each dataset.&lt;/p&gt;

&lt;figure title=&quot;Datadoc&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:700/1*UD_BHWOi4vMzm_vEQQthvg.png&quot; title=&quot;Datadoc&quot; alt=&quot;Datadoc&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Datadoc
    
      [built by author]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/criteo-engineering/scheduling-data-pipelines-at-criteo-part-1-8b257c6c8e55&quot;&gt;BigDataFlow&lt;/a&gt;  is an internal tool used by Criteo written in Scala to schedule data processing jobs from an extended SQL query.&lt;/p&gt;

&lt;figure title=&quot;BigDataFlow extended SQL&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:700/1*cRzS5MJ4IiErfXQ82Sz5Ug.png&quot; title=&quot;BigDataFlow extended SQL&quot; alt=&quot;BigDataFlow extended SQL&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    BigDataFlow extended SQL
    
      [built by author]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h1 id=&quot;-read-more&quot;&gt;👀 Read more&lt;/h1&gt;

&lt;p&gt;Read the rest of the article …&lt;/p&gt;

&lt;div style=&quot;text-align: center;margin-bottom: 1em;&quot;&gt;
  &lt;a href=&quot;https://medium.com/@glegoux/from-hadoop-to-the-modern-stack-cdb2f10cee31&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; title=&quot;Read more&quot;&gt;
    &lt;button class=&quot;btn btn-dark&quot;&gt;
      &lt;b class=&quot;black&quot;&gt;Read more&lt;/b&gt;
    &lt;/button&gt;
  &lt;/a&gt;
&lt;/div&gt;

</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>How to write a README?</title>
   <link href="https://glegoux.com/blog/articles/2022/12/10/how-to-write-a-readme.html"/>
   <updated>2022-12-10T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2022/12/10/how-to-write-a-readme.html</id>
   <content type="html">&lt;p&gt;A README is the best place to start documenting a project. A README is normally a  &lt;strong&gt;single-page document&lt;/strong&gt;  describing your computer project’s key aspects. This document can be read in a few minutes maximum. It is the open door for a newcomer who wants an overview of the fundamental aspects of the project.&lt;/p&gt;

&lt;p&gt;Having a README for a computer project is a  &lt;strong&gt;common&lt;/strong&gt;  enough &lt;strong&gt;thing&lt;/strong&gt;  for the code repositories. Still, the  &lt;strong&gt;template&lt;/strong&gt;  defining what should contain this README is not standard and often depends on the  &lt;strong&gt;sensibility of the software documentalist&lt;/strong&gt;. Avoiding gaps in content and format allows you to align the shared knowledge of your projects in the best common possible way.&lt;/p&gt;

&lt;p&gt;The rules for writing a README file will be described with a generic template and a pragmatic methodology agnostic to the tech stack and the project type you use.&lt;/p&gt;

&lt;p&gt;First, let’s begin defining the type of project that you can have.&lt;/p&gt;

&lt;p&gt;A  &lt;strong&gt;project&lt;/strong&gt; is a code repository; it can be composed of either one module (&lt;strong&gt;simple project&lt;/strong&gt;) or several modules (&lt;strong&gt;complex project&lt;/strong&gt;). This project is in an ecosystem composed of dependencies between modules of the same project or other projects. A module can be :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;An  &lt;strong&gt;application&lt;/strong&gt;: It is deployed at runtime with an executable. No other module depends on it except optionally at runtime.&lt;/li&gt;
  &lt;li&gt;A  &lt;strong&gt;library&lt;/strong&gt;: It’s used by other modules that depend on it for their execution and/or build.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, a  &lt;strong&gt;type of project&lt;/strong&gt;  can be a code library in (Python, Scala, or Java …), an SDK, a web app with a UI and/or an API, a machine learning model, a data processor, a set of scripts, an OPS configuration module or a scheduled job …&lt;/p&gt;

&lt;p&gt;All projects have not necessarily needed a README respected rigorous template; it can use a degraded version in function efforts that you want to provide. Only  &lt;strong&gt;mature projects&lt;/strong&gt;  where you want a high level of quality need it, that is to say, for a project used by the community in an intensive or critical way.&lt;/p&gt;

&lt;h1 id=&quot;practical-guidelines&quot;&gt;Practical guidelines&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Here are explained the practical guidelines that a README should respect.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For a simple project:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The README should be a simple text file called README.&lt;extension&gt;.&lt;/extension&gt;&lt;/li&gt;
  &lt;li&gt;It should be written in coherent syntax (like  &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Markdown&lt;/code&gt;  or  &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;reStructuredText&lt;/code&gt;).&lt;/li&gt;
  &lt;li&gt;There should be a README at the root of the project.&lt;/li&gt;
  &lt;li&gt;According to the README variant you choose (see sections below), you need to adhere to the variant structure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a complex project:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The README at the root must have links to the ones of each submodule, with a sentence to describe the role of each module&lt;/li&gt;
  &lt;li&gt;It should have a README for each module&lt;/li&gt;
  &lt;li&gt;The README of each module should respect the guidelines of a simple project&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;template&quot;&gt;Template&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Here are the sections that README should contain.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each  &lt;strong&gt;section&lt;/strong&gt;  can contain  &lt;strong&gt;direct or indirect information&lt;/strong&gt;  with  &lt;strong&gt;links&lt;/strong&gt;  and should contain a  &lt;strong&gt;title section&lt;/strong&gt;  with format H1 (i.e., ‘#’ with markdown). A section can be  &lt;strong&gt;optional&lt;/strong&gt;  and  &lt;strong&gt;required&lt;/strong&gt;  in function of the type of modules.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;[Project Title]&lt;/strong&gt;* [*: required]
    &lt;ul&gt;
      &lt;li&gt;High-level description (with a demo link if applicable)&lt;/li&gt;
      &lt;li&gt;It should indicate if it is a  &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;library&lt;/code&gt;  or an  &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;application  
&lt;/code&gt;- It should indicate who is the owner of this project&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Quick start&lt;/strong&gt;* [*: required]
    &lt;ul&gt;
      &lt;li&gt;How to set up the development environment, get the repository, install tech stack, …&lt;/li&gt;
      &lt;li&gt;Link to a demo&lt;/li&gt;
      &lt;li&gt;How to run the project&lt;/li&gt;
      &lt;li&gt;How to run the tests&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Usage&lt;/strong&gt;  [optional only if relevant and helpful]
    &lt;ul&gt;
      &lt;li&gt;How to use the project (ex. API description)&lt;/li&gt;
      &lt;li&gt;Links to help resources&lt;/li&gt;
      &lt;li&gt;How to contribute to the project (coding style, code of conduct, …)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Main structure&lt;/strong&gt;* [*: required]
    &lt;ul&gt;
      &lt;li&gt;Link(s) to other “sub-README(s)” (only if the module has submodules)&lt;/li&gt;
      &lt;li&gt;Links to dependencies&lt;/li&gt;
      &lt;li&gt;Describe the file architecture of the repository&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Architecture&lt;/strong&gt; [optional only if relevant and helpful]
    &lt;ul&gt;
      &lt;li&gt;Explanation of the design with a diagram and a description …&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Deployment&lt;/strong&gt;**  [**: required only for a deployed application]
    &lt;ul&gt;
      &lt;li&gt;Link to the deployment configuration&lt;/li&gt;
      &lt;li&gt;Link to this history of the deployment with the changelog and the releases&lt;/li&gt;
      &lt;li&gt;Link to the deployed application&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Monitoring&lt;/strong&gt;**  [**: required only for a deployed application]
    &lt;ul&gt;
      &lt;li&gt;Links to monitoring dashboards, …&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;References&lt;/strong&gt;  [required]
    &lt;ul&gt;
      &lt;li&gt;Links to the documentation about specifications, improvements, or maintenance…&lt;/li&gt;
      &lt;li&gt;Other useful links&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;License&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Link to the license and copyright with the general conditions&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;-read-more&quot;&gt;👀 Read more&lt;/h1&gt;

&lt;p&gt;Read the rest of the article …&lt;/p&gt;

&lt;div style=&quot;text-align: center;margin-bottom: 1em;&quot;&gt;
  &lt;a href=&quot;https://medium.com/@glegoux/how-to-write-a-readme-f8986d407c1e&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; title=&quot;Read more&quot;&gt;
    &lt;button class=&quot;btn btn-dark&quot;&gt;
      &lt;b class=&quot;black&quot;&gt;Read more&lt;/b&gt;
    &lt;/button&gt;
  &lt;/a&gt;
&lt;/div&gt;

</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Aerospike: Real-time database for the online ads ecosystem</title>
   <link href="https://glegoux.com/blog/articles/2022/11/29/aerospike-real-time-database-for-the-online-ads-ecosystem.html"/>
   <updated>2022-11-29T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2022/11/29/aerospike-real-time-database-for-the-online-ads-ecosystem.html</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;https://aerospike.com/&quot;&gt;Aerospike&lt;/a&gt;  can replace at the same time 2 cache layers, an in-memory layer, and a persistent memory layer like  &lt;a href=&quot;https://memcached.org/&quot;&gt;Memcached&lt;/a&gt;  and  &lt;a href=&quot;https://www.couchbase.com/&quot;&gt;Couchbase&lt;/a&gt;, respectively, with awesome performance.&lt;/p&gt;

&lt;p&gt;Especially explore the usages of this distributed key-value store for the e-commerce catalogs indispensable in the online ads ecosystem to build ad campaigns, recommend products to the right audience, and display the ads for the publishers.&lt;/p&gt;

&lt;p&gt;As a member of catalog teams at Criteo, I was at the last meetup of  &lt;a href=&quot;https://www.meetup.com/aerospike-paris-scale-warrior-meet-ups/events/289187127/&quot;&gt;Scale Warriors Aerospike&lt;/a&gt;, where the CTO (and founder at Aerospike) was present  &lt;a href=&quot;https://www.linkedin.com/in/drvsrini/&quot;&gt;Srini V. Srinivasan&lt;/a&gt;  to share new and existing features of Aerospike, and where Criteo presented its plan and strategy to migrate to Aerospike.&lt;/p&gt;

&lt;h1 id=&quot;aerospike&quot;&gt;Aerospike&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Aerospike&lt;/strong&gt;  is a key-value NoSQL database with  &lt;a href=&quot;https://en.wikipedia.org/wiki/Flash_memory&quot;&gt;flash memory&lt;/a&gt;  and  &lt;a href=&quot;https://en.wikipedia.org/wiki/In-memory_database&quot;&gt;in-memory&lt;/a&gt;  &lt;a href=&quot;https://github.com/aerospike&quot;&gt;open source&lt;/a&gt;. The high-level ecosystem of Aerospike is deeply integrated with tools of the Big data ecosystem for streaming, batch, and SQL usages with  &lt;a href=&quot;https://www.confluent.io/lp/apache-kafka/&quot;&gt;Kafka&lt;/a&gt;,  &lt;a href=&quot;https://spark.apache.org/&quot;&gt;Spark&lt;/a&gt;, and  &lt;a href=&quot;https://trino.io/&quot;&gt;Trino&lt;/a&gt;  with a  &lt;a href=&quot;https://developer.aerospike.com/client/java&quot;&gt;Java client&lt;/a&gt;:&lt;/p&gt;

&lt;figure title=&quot;The Aerospike Real-time Data Platform&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:700/1*83KoE4CmWbOJFgxFU6paeQ.png&quot; title=&quot;The Aerospike Real-time Data Platform&quot; alt=&quot;The Aerospike Real-time Data Platform&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    The Aerospike Real-time Data Platform
    
      [&lt;a href=&quot;https://aerospike.com/developer/blog/database-queries-json-db-6&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Aerospike is a distributed key-value store. You can access the data with a simple API:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Get(key) -&amp;gt; byte[]&lt;br /&gt;
Set(key, byte[], ttl)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The goal is to have small objects from a few bytes to 4 MiB, with low latency, 1 ms on average, and 5 ms at the 99th percentile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aerospike is first optimized for the OLTP paradigm because it is a KV Store.&lt;/strong&gt; Still, you can easily do OLAP queries for other usages for more exotic queries to scan the data thanks to the data models layer for Documents, SQL, Graphs, or Time Series.&lt;/p&gt;

&lt;h1 id=&quot;aerospike-clusters-at-criteo&quot;&gt;Aerospike clusters at Criteo&lt;/h1&gt;

&lt;p&gt;A DKVS plays a central role in online ads. With this storage, the infrastructure can answer to the small-time budgets required for each business use case: to bid a request for the auction of RTB (&amp;lt; 100 ms) or to render the ads (&amp;lt; 250 ms).&lt;/p&gt;

&lt;figure title=&quot;Time budget for the online ads&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:700/1*huw1bvBiZIDuDliExf6bOg.png&quot; title=&quot;Time budget for the online ads&quot; alt=&quot;Time budget for the online ads&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Time budget for the online ads
    
      [&lt;a href=&quot;https://www.meetup.com/aerospike-paris-meet-ups/events/289187127&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The tech stack is diversified to respond to the needs of online ads, and a DKVS is insufficient. It is only a part of the ecosystem:&lt;/p&gt;

&lt;figure title=&quot;Data stack at Criteo&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:700/1*2czh312iW3IsFkVU1YfW3w.png&quot; title=&quot;Data stack at Criteo&quot; alt=&quot;Data stack at Criteo&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Data stack at Criteo
    
      [&lt;a href=&quot;https://www.meetup.com/aerospike-paris-meet-ups/events/289187127&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The data stored in the KV stores must be persisted and loaded in memory to access long-term and quick readings.&lt;/p&gt;

&lt;h1 id=&quot;-read-more&quot;&gt;👀 Read more&lt;/h1&gt;

&lt;p&gt;Read the rest of the article …&lt;/p&gt;

&lt;div style=&quot;text-align: center;margin-bottom: 1em;&quot;&gt;
  &lt;a href=&quot;https://medium.com/@glegoux/aerospike-real-time-database-c88066769274&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; title=&quot;Read more&quot;&gt;
    &lt;button class=&quot;btn btn-dark&quot;&gt;
      &lt;b class=&quot;black&quot;&gt;Read more&lt;/b&gt;
    &lt;/button&gt;
  &lt;/a&gt;
&lt;/div&gt;

</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Learning PySpark with Google Colab</title>
   <link href="https://glegoux.com/blog/articles/2022/11/15/learning-pyspark-with-google-colab.html"/>
   <updated>2022-11-15T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2022/11/15/learning-pyspark-with-google-colab.html</id>
   <content type="html">&lt;p&gt;Learning  &lt;a href=&quot;https://spark.apache.org/&quot;&gt;&lt;strong&gt;Apache Spark&lt;/strong&gt;&lt;/a&gt;  with a quick learning curve is challenging. Discover  &lt;strong&gt;distributed computation&lt;/strong&gt;  and  &lt;strong&gt;machine learning&lt;/strong&gt;  with  &lt;a href=&quot;https://www.databricks.com/glossary/pyspark&quot;&gt;PySpark&lt;/a&gt;, with  &lt;strong&gt;several tutorials&lt;/strong&gt;  until building your movie recommendation engine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href=&quot;https://github.com/criteo-research/master-iasd/tree/master/module4&quot;&gt;GitHub&lt;/a&gt;  |  &lt;a href=&quot;https://colab.research.google.com/github/criteo-research/master-iasd/blob/master/module4/td1/td1-rdd-questions.ipynb&quot;&gt;Tutorials quick start&lt;/a&gt;  |  &lt;a href=&quot;https://grouplens.org/datasets/movielens/&quot;&gt;Dataset&lt;/a&gt;&lt;/p&gt;

&lt;figure title=&quot;&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:359/1*HZloIx45zZtPrtcEksmeRw.png&quot; title=&quot;&quot; alt=&quot;&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Let’s discover how to use PySpark on Google Colab with accessible tutorials.&lt;/p&gt;

&lt;p&gt;As a teaching fellow with  &lt;a href=&quot;https://www.linkedin.com/in/david-diebold-51249977/&quot;&gt;David Diebold&lt;/a&gt;  about  &lt;a href=&quot;https://www.lamsade.dauphine.fr/wp/iasd/en/programme/options/systemes-paradigmes-et-langages-pour-les-big-data/&quot;&gt;Systems, paradigms, and algorithms for Big Data&lt;/a&gt;  for the international  &lt;a href=&quot;https://www.lamsade.dauphine.fr/wp/iasd/en/&quot;&gt;Master IASD&lt;/a&gt;  (&lt;a href=&quot;https://www.universite-paris-saclay.fr/en/education/french-higher-education-system&quot;&gt;graduate degree M2&lt;/a&gt;) for the French  &lt;a href=&quot;https://dauphine.psl.eu/&quot;&gt;Dauphine Paris University&lt;/a&gt;  member of the  &lt;a href=&quot;https://psl.eu/en&quot;&gt;PSL University&lt;/a&gt;, I needed to organize sessions of tutorials for the students on the distributed computation with  &lt;a href=&quot;https://spark.apache.org/&quot;&gt;&lt;strong&gt;Apache Spark&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fast, flexible, and developer-friendly&lt;/strong&gt;, this  &lt;strong&gt;data-distributed processing&lt;/strong&gt;  framework has become  &lt;strong&gt;one of the world’s most significant&lt;/strong&gt;. Before teaching the features provided by Spark, we had to choose  &lt;strong&gt;which language and platform&lt;/strong&gt;  our learners could run the tutorials we prepared. We chose the tech stack:  &lt;strong&gt;PySpark with Google Colab&lt;/strong&gt;.&lt;/p&gt;

&lt;h1 id=&quot;pyspark-vs-spark&quot;&gt;PySpark vs. Spark&lt;/h1&gt;

&lt;p&gt;&lt;a href=&quot;https://www.databricks.com/glossary/pyspark&quot;&gt;&lt;strong&gt;PySpark&lt;/strong&gt;&lt;/a&gt;  allows interaction with Spark in  &lt;strong&gt;Python&lt;/strong&gt;. It gives a  &lt;strong&gt;better learning curve&lt;/strong&gt;  than Spark (written originally in Scala). Even though it is less performant for a production world using  &lt;a href=&quot;https://www.py4j.org/&quot;&gt;Py4J&lt;/a&gt;  to interact with the JVM of Spark, it gives  &lt;strong&gt;sufficient performance&lt;/strong&gt;  (sometimes close to Spark with Java/Scala) to experiment with distributed data science and machine learning.&lt;/p&gt;

&lt;figure title=&quot;PySpark is an interaction of Spark with Python&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:571/1*jLK8saUaKj8KuovUgXumUg.png&quot; title=&quot;PySpark is an interaction of Spark with Python&quot; alt=&quot;PySpark is an interaction of Spark with Python&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    PySpark is an interaction of Spark with Python
    
      [built by author]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;PySpark with Python remains largely the  &lt;strong&gt;preferred language&lt;/strong&gt;  for  &lt;strong&gt;Notebooks.&lt;/strong&gt;&lt;/p&gt;

&lt;figure title=&quot;Percent of commands on the Databricks platform in each Spark language &quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:344/1*L8jzF1__70sSDfflDM5CBg.png&quot; title=&quot;Percent of commands on the Databricks platform in each Spark language &quot; alt=&quot;Percent of commands on the Databricks platform in each Spark language &quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Percent of commands on the Databricks platform in each Spark language 
    
      [&lt;a href=&quot;https://www.databricks.com/blog/2020/06/18/introducing-apache-spark-3-0-now-available-in-databricks-runtime-7-0.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The  &lt;strong&gt;support&lt;/strong&gt;  of PySpark is already  &lt;strong&gt;excellent&lt;/strong&gt;  and continues to be improved with the future version of  &lt;a href=&quot;https://www.databricks.com/blog/2020/06/18/introducing-apache-spark-3-0-now-available-in-databricks-runtime-7-0.html&quot;&gt;&lt;strong&gt;Spark 3+&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Python is  &lt;strong&gt;easier to learn&lt;/strong&gt;  than Scala and has a  &lt;strong&gt;mature ecosystem for applied mathematics&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For these reasons,  &lt;strong&gt;we preferred teaching PySpark over Spark&lt;/strong&gt;. Moving from one to another is easy, only the cost for the learners to become familiar with the Scala/Java ecosystem for advanced use.&lt;/p&gt;

&lt;h1 id=&quot;-read-more&quot;&gt;👀 Read more&lt;/h1&gt;

&lt;p&gt;Read the rest of the article …&lt;/p&gt;

&lt;div style=&quot;text-align: center;margin-bottom: 1em;&quot;&gt;
  &lt;a href=&quot;https://medium.com/@glegoux/apache-spark-pyspark-with-google-colab-for-data-science-63478138a63e&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; title=&quot;Read more&quot;&gt;
    &lt;button class=&quot;btn btn-dark&quot;&gt;
      &lt;b class=&quot;black&quot;&gt;Read more&lt;/b&gt;
    &lt;/button&gt;
  &lt;/a&gt;
&lt;/div&gt;

</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>The Apache Software Foundation for the open-source</title>
   <link href="https://glegoux.com/blog/articles/2022/11/13/the-apache-software-foundation-for-the-open-source.html"/>
   <updated>2022-11-13T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2022/11/13/the-apache-software-foundation-for-the-open-source.html</id>
   <content type="html">&lt;p&gt;ASF is one of the larger foundations for open-source projects in the tech world. The official website  &lt;a href=&quot;https://apache.org/&quot;&gt;https://apache.org/&lt;/a&gt;  is exhaustive of useful information.&lt;/p&gt;

&lt;figure title=&quot;Metrics about the Apache Foundation&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:700/1*zIWuiiqmXct1v7HjBxCFUA.png&quot; title=&quot;Metrics about the Apache Foundation&quot; alt=&quot;Metrics about the Apache Foundation&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Metrics about the Apache Foundation
    
      [&lt;a href=&quot;https://apache.org&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h1 id=&quot;apache-organization&quot;&gt;Apache Organization&lt;/h1&gt;

&lt;p&gt;The organization of ASF is complex enough, here are useful like to understand how it works:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.apache.org/foundation/how-it-works.html&quot;&gt;https://www.apache.org/foundation/how-it-works.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://apache.org/foundation/&quot;&gt;https://apache.org/foundation/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.apache.org/foundation/governance/orgchart&quot;&gt;https://www.apache.org/foundation/governance/orgchart&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;apache-community&quot;&gt;Apache community&lt;/h1&gt;

&lt;p&gt;See  &lt;a href=&quot;https://community.apache.org/&quot;&gt;https://community.apache.org/&lt;/a&gt;&lt;/p&gt;

&lt;h1 id=&quot;apache-way-core-values&quot;&gt;Apache Way: Core values&lt;/h1&gt;

&lt;p&gt;It is a set of methodologies and values designed to enable disparate communities of volunteers to work collaboratively over time.&lt;/p&gt;

&lt;p&gt;See  &lt;a href=&quot;https://www.apache.org/theapacheway/&quot;&gt;https://www.apache.org/theapacheway/&lt;/a&gt;&lt;/p&gt;

&lt;h1 id=&quot;apache-news&quot;&gt;Apache News&lt;/h1&gt;

&lt;p&gt;ApacheCon is a conference that is a must for anyone who works deeply with Apache-based software programs.&lt;/p&gt;

&lt;figure title=&quot;ApacheCon&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:206/1*bbdfE_HQ-S98x0vUV5Dgnw.png&quot; title=&quot;ApacheCon&quot; alt=&quot;ApacheCon&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    ApacheCon
    
      [&lt;a href=&quot;http://www.apachecon.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;See the old conferences:  &lt;a href=&quot;https://archive.apachecon.com/&quot;&gt;https://archive.apachecon.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See all the Apache events:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://events.apache.org/event/&quot;&gt;https://events.apache.org/event/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apache Blog posts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://news.apache.org/&quot;&gt;https://news.apache.org/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blogs.apache.org/&quot;&gt;https://blogs.apache.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apache Reports:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.apache.org/foundation/reports.html&quot;&gt;https://www.apache.org/foundation/reports.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;apache-sponsors&quot;&gt;Apache sponsors&lt;/h1&gt;

&lt;p&gt;See  &lt;a href=&quot;https://apache.org/foundation/thanks&quot;&gt;https://apache.org/foundation/thanks&lt;/a&gt;&lt;/p&gt;

&lt;h1 id=&quot;-read-more&quot;&gt;👀 Read more&lt;/h1&gt;

&lt;p&gt;Read the rest of the article …&lt;/p&gt;

&lt;div style=&quot;text-align: center;margin-bottom: 1em;&quot;&gt;
  &lt;a href=&quot;https://medium.com/@glegoux/top-five-ways-to-beat-blue-monday-0f0de0950827&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; title=&quot;Read more&quot;&gt;
    &lt;button class=&quot;btn btn-dark&quot;&gt;
      &lt;b class=&quot;black&quot;&gt;Read more&lt;/b&gt;
    &lt;/button&gt;
  &lt;/a&gt;
&lt;/div&gt;

</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Apache Spark: Ecosystem overview with Apache Hadoop YARN and HDFS</title>
   <link href="https://glegoux.com/blog/articles/2022/11/02/apache-spark-ecosystem-overview-with-apache-hadoop-yarn-and-hdfs.html"/>
   <updated>2022-11-02T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2022/11/02/apache-spark-ecosystem-overview-with-apache-hadoop-yarn-and-hdfs.html</id>
   <content type="html">&lt;p&gt;Apache Spark: ecosystem overview with Apache Hadoop YARN and HDFS&lt;a href=&quot;https://spark.apache.org/&quot;&gt;Apache Spark™&lt;/a&gt;  is a multi-language engine for executing data engineerinApache Spark: ecosystem overview with Apache Hadoop YARN and HDFSg, data science, and machine learning on single-node machines or clusters. It is largely used in the industry for distributed computation of data at scale.&lt;/p&gt;

&lt;p&gt;This project is  &lt;a href=&quot;https://github.com/apache/spark&quot;&gt;open-source&lt;/a&gt;  under the  &lt;a href=&quot;https://apache.org/&quot;&gt;Apache software foundation,&lt;/a&gt;  created by the founders of the company  &lt;a href=&quot;https://www.databricks.com/&quot;&gt;Databricks&lt;/a&gt;  that provides cluster and support for Spark.&lt;/p&gt;

&lt;p&gt;Let deep dive on the architecture of  &lt;strong&gt;Apache Spark on YARN&lt;/strong&gt; in a distributed ecosystem of containers and  &lt;strong&gt;Java VMs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This architecture need to address the  &lt;strong&gt;computation&lt;/strong&gt;  and the  &lt;strong&gt;storage&lt;/strong&gt;  at  &lt;strong&gt;high scale&lt;/strong&gt;  to manipulate big volume of data with an efficient processing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Table of contents&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Spark ecosystem&lt;/li&gt;
  &lt;li&gt;Spark architecture through Hadoop&lt;/li&gt;
  &lt;li&gt;Spark engine for computation and storage&lt;/li&gt;
  &lt;li&gt;Go with Spark in production&lt;/li&gt;
  &lt;li&gt;Example of Spark application at Scale&lt;/li&gt;
  &lt;li&gt;Go further&lt;/li&gt;
  &lt;li&gt;What’s next&lt;/li&gt;
  &lt;li&gt;Thanks to&lt;/li&gt;
  &lt;li&gt;Glossary&lt;/li&gt;
  &lt;li&gt;References&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s start with the basics, you can jump straight to the sections that interest you, otherwise see vertically how this whole ecosystem works.&lt;/p&gt;

&lt;h1 id=&quot;spark-ecosystem&quot;&gt;Spark ecosystem&lt;/h1&gt;

&lt;h2 id=&quot;data-pipelines&quot;&gt;Data pipelines&lt;/h2&gt;

&lt;p&gt;Spark allows building data pipeline in  &lt;strong&gt;batch mode&lt;/strong&gt; and the  &lt;strong&gt;streaming mode&lt;/strong&gt;.&lt;/p&gt;

&lt;figure title=&quot;Lambda architecture with Spark&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:408/0*zqTHvZ2Uckv_Hjz3.png&quot; title=&quot;Lambda architecture with Spark&quot; alt=&quot;Lambda architecture with Spark&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Lambda architecture with Spark
    
      [&lt;a href=&quot;true&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Here, you see a  &lt;strong&gt;lambda architecture&lt;/strong&gt;, but to associate online and offline processing, you can have a  &lt;strong&gt;kappa&lt;/strong&gt;  or  &lt;strong&gt;zeta&lt;/strong&gt;  &lt;strong&gt;architecture&lt;/strong&gt;  on your data pipeline. You will see it in another article.&lt;/p&gt;

&lt;figure title=&quot;Spark vs Spark Streaming&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:394/1*4QrgYLPJto1TBvMcs45iqg.png&quot; title=&quot;Spark vs Spark Streaming&quot; alt=&quot;Spark vs Spark Streaming&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Spark vs Spark Streaming
    
      [built by author]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The streaming mode of Spark is more micro-batch approach. Other framework like  &lt;a href=&quot;https://kafka.apache.org/documentation/streams/&quot;&gt;Kafka Streaming&lt;/a&gt;,  &lt;a href=&quot;https://faust-streaming.github.io/faust/&quot;&gt;Faust Streaming&lt;/a&gt;  or  &lt;a href=&quot;https://flink.apache.org/&quot;&gt;Apache Flink&lt;/a&gt;  are more used to process data streams. Spark is forceful to process data batch overall.&lt;/p&gt;

&lt;h2 id=&quot;apis&quot;&gt;APIs&lt;/h2&gt;

&lt;p&gt;Mainly, Spark can run with several APIs, one for each following programming language  &lt;a href=&quot;https://spark.apache.org/docs/latest/api/scala/org/apache/spark/index.html&quot;&gt;Scala&lt;/a&gt;/&lt;a href=&quot;https://spark.apache.org/docs/latest/api/java/&quot;&gt;Java&lt;/a&gt;,  &lt;a href=&quot;https://spark.apache.org/docs/latest/api/python/&quot;&gt;Python&lt;/a&gt;  and  &lt;a href=&quot;https://spark.apache.org/docs/latest/api/R/&quot;&gt;R&lt;/a&gt;, respectively with  &lt;strong&gt;Spark&lt;/strong&gt;,  &lt;strong&gt;PySpark&lt;/strong&gt;  and  &lt;strong&gt;SparkR&lt;/strong&gt;.&lt;/p&gt;

&lt;figure title=&quot;Different types of Spark engines&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:700/1*zXXVD_S-pBs8mWBi3OcR7w.png&quot; title=&quot;Different types of Spark engines&quot; alt=&quot;Different types of Spark engines&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Different types of Spark engines
    
      [built by author]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;In practice, Spark and PySpark are more used than SparkR. For the experimentation, PySpark is more helpful, and for the performances Spark is better.&lt;/p&gt;

&lt;h2 id=&quot;connectors&quot;&gt;Connectors&lt;/h2&gt;

&lt;p&gt;Spark has many  &lt;strong&gt;connectors&lt;/strong&gt;  to write  &lt;strong&gt;to different types of storage&lt;/strong&gt;.&lt;/p&gt;

&lt;figure title=&quot;Apache Spark’s ecosystem of connectors&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:684/0*uQtzEnoXUORb2dgi&quot; title=&quot;Apache Spark’s ecosystem of connectors&quot; alt=&quot;Apache Spark’s ecosystem of connectors&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Apache Spark’s ecosystem of connectors
    
      [&lt;a href=&quot;https://pages.databricks.com/rs/094-YMS-629/images/LearningSpark2.0.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Here, we are going to speak a bit more about the connection with Apache Hadoop HDFS.&lt;/p&gt;

&lt;h2 id=&quot;spark-sql&quot;&gt;Spark SQL&lt;/h2&gt;

&lt;p&gt;In addition, you can also run Spark with  &lt;a href=&quot;https://spark.apache.org/docs/latest/api/sql/&quot;&gt;SQL&lt;/a&gt;. With a SQL request, you can also access to heterogeneous data then combine them in memory:&lt;/p&gt;

&lt;figure title=&quot;Spark SQL overview&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:720/format:webp/0*Ts-DH76DiRFZh4p1.png&quot; title=&quot;Spark SQL overview&quot; alt=&quot;Spark SQL overview&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Spark SQL overview
    
      [&lt;a href=&quot;http://www.gatorsmile.io/sparksqloverview/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The  &lt;a href=&quot;https://www.linkedin.com/pulse/catalyst-tungsten-apache-sparks-speeding-engine-deepak-rajak/&quot;&gt;Catalyst &amp;amp; Tungsten&lt;/a&gt; engines allows optimizing the execution plan of the query:&lt;/p&gt;

&lt;figure title=&quot;Catalyst&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://miro.medium.com/v2/resize:fit:700/0*CRcfOe8vbDWNGJhV.png&quot; title=&quot;Catalyst&quot; alt=&quot;Catalyst&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Catalyst
    
      [&lt;a href=&quot;https://www.databricks.com/glossary/catalyst-optimizer&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;]
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;pyspark&quot;&gt;PySpark&lt;/h2&gt;

&lt;p&gt;In the Python driver program, SparkContext uses  &lt;a href=&quot;https://www.py4j.org/&quot;&gt;Py4J&lt;/a&gt;  to launch a JVM and create a JavaSparkContext. Py4J is only used on the driver for local communication between the Python and Java SparkContext objects; large data transfers are performed through a different mechanism.&lt;/p&gt;

&lt;h1 id=&quot;-read-more&quot;&gt;👀 Read more&lt;/h1&gt;

&lt;p&gt;Read the rest of the article …&lt;/p&gt;

&lt;div style=&quot;text-align: center;margin-bottom: 1em;&quot;&gt;
  &lt;a href=&quot;https://medium.com/@glegoux/apache-spark-ecosystem-with-hadoop-apache-yarn-and-hdfs-8e64eeba68c0&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; title=&quot;Read more&quot;&gt;
    &lt;button class=&quot;btn btn-dark&quot;&gt;
      &lt;b class=&quot;black&quot;&gt;Read more&lt;/b&gt;
    &lt;/button&gt;
  &lt;/a&gt;
&lt;/div&gt;

</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>My tech blog on Medium</title>
   <link href="https://glegoux.com/blog/articles/2022/11/01/my-tech-blog-on-medium.html"/>
   <updated>2022-11-01T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2022/11/01/my-tech-blog-on-medium.html</id>
   <content type="html">&lt;p&gt;I will continue writing blog posts here, but they will mainly be published on Medium under the user &lt;a href=&quot;https://medium.com/@glegoux&quot;&gt;@glegoux&lt;/a&gt;. The goal is always to improve the experience of readers and my experience of writing. After having re-evaluated the market of online editors, the Medium platform is mature and becoming more and more popular, being one of the leaders among the editors of tech blogs now. It provides a full WYSIWYG user interface when editing online, with various formatting options provided as the user edits. It allows publishing blog posts (called stories) to capture large audiences and communities.&lt;/p&gt;

&lt;p&gt;With the evolution of the practices and tools of online blogging these last few years, I wanted to cross thresholds in my tech writer experience: be more efficient and effective in writing content and gain more visibility by publishing content. It requires allocating less time to maintaining editor tools and more time to write and publish content on other websites than here. So, I needed to choose between continuing to use only this blog, starting to use only Medium, using both, or something else. I chose to use both:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The most of blog posts will be published on Medium first, with always a partial version here (or inversely)&lt;/li&gt;
  &lt;li&gt;The other ones will remain only in this blog.&lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vRwK7XcVBBYBxZhx3_nqSjUF4boYbf9BBdHP-HJYOlx2vX2Pe_scKcZTZFys9K5BEaaYmrGPN_3WziZ/pub?w=798&amp;amp;h=100&quot; alt=&quot;Migration from glegoux.com to Medium&quot; title=&quot;Migration from glegoux.com to Medium&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Migration from glegoux.com to Medium
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;After evaluating and testing Medium, here are the pros and cons of using Medium vs. my blog:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr class=&quot;text-center&quot;&gt;
      &lt;th&gt;✅ Pros&lt;/th&gt;
      &lt;th&gt;❌ Cons&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tr&gt;
    &lt;td style=&quot;vertical-align: top;&quot;&gt;
• Medium editor is quicker and handier in updating a post with simple assets like text and images, more intuitive than YAFIYGI, and with instant updates without delay during the deployment of new content like with Jekyll used for my blog&lt;br /&gt;
• Medium has advanced features of collaboration with co-writers, claps, peer comments, and followers, not all available on my blog natively and smoothly&lt;br /&gt;
• Medium decorates the post with an auto-estimation of reading, no need to fill manually, and an auto-listen generation not available on my blog natively&lt;br /&gt;
• Medium offers stats with custom metrics (reads, etc.) for each story more relevant than using a third-party solution like Google Analytics used on my blog
    &lt;/td&gt;
    &lt;td style=&quot;vertical-align: top;&quot;&gt;
• Medium has partial propriety of the written content and limits the number of readings for non-members, while my blog is free and unlimited open&lt;br /&gt;
• The Medium content has a pre-defined style of design. It is not highly customizable like the content on my blog&lt;br /&gt;
• The Medium features remain less advanced in pushing varied content like dynamic technical diagrams and mathematics formulae. While some workarounds exist, my blog allows it
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;For all these reasons, the right choice is a consensus by keeping the best of these 2 worlds. Also, I prefer remaining independent for the long term,
and &lt;a href=&quot;https://glegoux.com&quot;&gt;https://glegoux.com&lt;/a&gt; is not only a tech blog but a hub of centralized online activities.&lt;/p&gt;

&lt;p&gt;Don’t worry. I will keep maintaining this website and the open-source template behind it. To avoid breaking changes, the past blog posts will remain accessible without breaking their web links.&lt;/p&gt;

&lt;p&gt;However, it seems time-consuming to synchronize the content between Medium and this blog bi-directionally. At best, I can only export and import a blog post to and from Medium by copying/pasting the content manually and by adapting the past content. Because the automatic Medium feature for external synchronization has been closed, and no other mature tools allow it, the custom extension of Mardown used here forces potential adaptations. So, the synchronization in updating a blog post from Medium becomes a nightmare to maintain. In contrast, I want to use Medium editor more, which is quicker and more handy to publish followed content. So, as I explained, some complete articles will only be on Medium or exclusively on this blog (with often a second partial version). When I want to have one blog post at both locations, instead of having a full post everywhere, I will use bidirectional web links cross-websites between the partial post and full post (to avoid divergences and too heavy maintenance in case of multiple evolutive versions with there are editions after the original publication).&lt;/p&gt;

&lt;p&gt;🙏 Thanks for your understanding and your readings.&lt;/p&gt;

&lt;div style=&quot;height: 200px&quot;&gt;&lt;/div&gt;
</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Secret Santa</title>
   <link href="https://glegoux.com/blog/articles/2021/11/23/secret-santa.html"/>
   <updated>2021-11-23T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2021/11/23/secret-santa.html</id>
   <content type="html">&lt;p&gt;Secret Santa 🎅 is a traditional event in December with family, friends, or office colleagues, 
in which each guest gives a gift to another guest without knowing who will give him/her a gift.&lt;/p&gt;

&lt;p&gt;Could you imagine that you want to organize it? As an independent, technical, and meticulous 
organizer, you could automate the drawing of pairs (donor, recipient) to work even for an odd 
number of guests. You could implement an algorithm (given later) that generates a directed cyclic 
graph where the vertices are guests and the edges represent the relationship (donor -&amp;gt; recipient).&lt;/p&gt;

&lt;p&gt;But you want to increase the secrecy, you choose to draw lots for the identity of the recipients 
at the last moment. In this case, the guests do not know neither for whom the gift they buy will be. 
In addition, it counters the effect of a no-show, in which a guest might not receive the pre-chosen 
gift during the event.&lt;/p&gt;

&lt;p&gt;So the identities of gifts (ideally all different), donors, and receivers remain secret until the last 
moment. However, several problems could reduce the surprise effect. Let us understand  it thanks to 
applied mathematics in probability, statistics, and combinatorics.&lt;/p&gt;

&lt;h1 id=&quot;self-selection-problem&quot;&gt;⟲Self-selection problem&lt;/h1&gt;

&lt;p&gt;Let’s begin with the first problem: to whom does each guest give his/her gift? Let’s suppose 
each guest has well his/her gift for a unique other guest. Of course, the draw could 
have been done before and kept secret, as mentioned previously. But you want to do the draw at the last moment 
and by revealing simultaneously who gives his/her gift to whom. That is to say, you 
write the name of each guest on a different piece of paper for each, and mix it in 
a Christmas hat. Then, each one takes a piece of paper randomly. Finally, all of them, at
the same time, unfold the piece of paper and discover the name of the guest to whom 
he/she gives his/her gift.&lt;/p&gt;

&lt;p&gt;Will a guest draw his/her name at random? If this is the case, the surprise effect will be 
broken for him/her, and what would imply redoing the draw or exchanging gifts? What we 
want to avoid.&lt;/p&gt;

&lt;p&gt;This concrete problem can be reformulated: Is there at least a fixed point in the permutation 
of a set with $n$ elements? Where $n$ is the number of guests. It is the famous &lt;strong&gt;hat-check problem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The probability that at least one guest draws his/her name is the inverse of
the probability that no one drew his/her name, that is to say:&lt;/p&gt;

\[p_n =  1 - \dfrac{\mathcal{D}_{n}}{n!} = 1 - u_n\]

&lt;p&gt;$\mathcal{D}_{n}$ is the number of derangements, that is to say, the number of permutations 
without fixed points, knowing that $n!$ is the number of permutation with $n$ elements. 
You can prove with the &lt;strong&gt;inclusion-exclusion generalized principle&lt;/strong&gt; that:&lt;/p&gt;

\[\mathcal{D}_{n} = n! \sum_{k=0}^{n} \dfrac{(-1)^k}{k!}\]

&lt;p&gt;According to the &lt;strong&gt;Taylor-Maclaurin development&lt;/strong&gt;, we have:&lt;/p&gt;

\[\displaystyle\lim_{n\mapsto +\infty}u_n = \displaystyle\lim_{n\mapsto +\infty}\sum_{k=0}^{n}\dfrac{(-1)^k}{k!} = \dfrac{1}{e}\]

&lt;p&gt;with $e \approx 2.71828…$. In addition, 
this suite $(u_n)_{n\in \mathbb{N}}$ has a rate of convergence quick:&lt;/p&gt;

&lt;figure title=&quot;Inverse of the probability that a guest draws randomly his/her name&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2021-11-23-secret-santa/images/u_n-convergence.png&quot; title=&quot;Inverse of the probability that a guest draws randomly his/her name&quot; alt=&quot;Inverse of the probability that a guest draws randomly his/her name&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Inverse of the probability that a guest draws randomly his/her name
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;So if the number of guests is greater than or equal to 4, you have around $0.63\%$ of chance, 
to have at least one guest who drew their name, that is a bit less than 2 out of 3 chances:&lt;/p&gt;

\[p_{n\geq 4} \approx \dfrac{2}{3}\]

&lt;p&gt;This simultaneous strategy risks limiting the surprise effect, like the probability that a guest randomly 
draws his/her name, which becomes high quickly as a function of the number of guests.&lt;/p&gt;

&lt;p&gt;However, another sequential strategy could be considered, the same as presented in the introduction, 
to generate a cyclic-oriented graph (donor -&amp;gt; recipient). The algorithm will be:
A guest randomly draws a piece of paper, keeps it, and gives the Christmas hat to
The person whose name is on it. Only the first guest could draw her/his name.
In this case, the person redraws a piece of paper and then puts the paper back with his/her name. 
But here, the surprise effect becomes split into two moments, first discovering the identity of donors progressively,
and then all the gifts simultaneously, instead of one moment previously.&lt;/p&gt;

&lt;h1 id=&quot;-different-gifts-problem&quot;&gt;🎁 Different gifts problem&lt;/h1&gt;

&lt;p&gt;A second problem will be to know if two guests could bring the same type of gift. 
Having all gifts different could make it more fun, as the guests did not know for whom the gift they bought would be. 
These gifts are not personalized. Let’s suppose that you categorized 300 types of gifts.&lt;/p&gt;

&lt;p&gt;This is equivalent to another famous problem, the &lt;strong&gt;birthday problem&lt;/strong&gt;. The probability that 
two people were born on the same day increases quickly depending
on the number of people. It becomes almost certain, that is to say, more than $99\%$ 
of a chance to be valid for a group of 60 people.&lt;/p&gt;

&lt;p&gt;More generally, the probability that a group of size $n$, built with replacement and a sequence of independent and uniformly distributed trials from a set of size $N$,
contains at least two identical elements:&lt;/p&gt;

\[g_n = 1 - \frac{N}{N}\,\frac{N-1}{N}\,\cdots\,\frac{N-n+1}{N} = 1 - 1\,\left(1-\frac{1}{N}\right)\,\cdots\,\left(1-\frac{n-1}{N}\right)\]

&lt;p&gt;It is the inverse of the probability that no element is the same.&lt;/p&gt;

&lt;p&gt;Here, $N$ is the number of possible types of Christmas gifts, and $n$ is the number of guests. 
Except for some guests with a very original gift, suppose that your guest chose a 
pre-defined list influenced by the constraints and the ads, with a few hundred types of items, 
let’s say $N=300$:&lt;/p&gt;

&lt;figure title=&quot;Probability to have two identical types of gifts among 300 possible types of Christmas gifts&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2021-11-23-secret-santa/images/g_n-convergence.png&quot; title=&quot;Probability to have two identical types of gifts among 300 possible types of Christmas gifts&quot; alt=&quot;Probability to have two identical types of gifts among 300 possible types of Christmas gifts&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Probability to have two identical types of gifts among 300 possible types of Christmas gifts
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;With an approximation $e^{x} \approx 1 +x$ when $x$ is close to $0$, and the &lt;strong&gt;sum of young Gauss&lt;/strong&gt; 
$\sum_{k=0}^{n}\,k = \frac{n(n+1)}{2}$, you can get:&lt;/p&gt;

\[g_n \approx 1 - e^{-\frac{n(n-1)}{2N}}\]

&lt;p&gt;But in any case, you see:&lt;/p&gt;

\[\displaystyle\lim_{n\mapsto +\infty}g_n = 1\]

&lt;p&gt;And:&lt;/p&gt;

\[g_{n\geq 20} \geq \dfrac{1}{2} \qquad g_{n\geq 60} \approx 1\]

&lt;p&gt;If you have more than 20 guests, we have more than 1 out of 2 chances to have
at least two identical types of gifts.&lt;/p&gt;

&lt;p&gt;So, I wish you a good Secret Santa 🎄.&lt;/p&gt;
</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Software versioning</title>
   <link href="https://glegoux.com/blog/articles/2021/11/13/software-versioning.html"/>
   <updated>2021-11-13T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2021/11/13/software-versioning.html</id>
   <content type="html">&lt;h1 id=&quot;what-is-a-software-version&quot;&gt;What is a software version?&lt;/h1&gt;

&lt;p&gt;A software is a dynamic set of lines of code, that evolves discretely from state to state in function 
of time. To identify a specific state of a software, a versioning can be used whether it be for a
language compiler, a library, a web API, an application, a server, or a client. Of course a versioning 
can be used more generally for any project, but here I focus only on the &lt;strong&gt;software versioning&lt;/strong&gt; at large.&lt;/p&gt;

&lt;figure&gt;
&lt;pre class=&quot;notranslate&quot;&gt;
             ┌─────────┐           ┌─────────┐           ┌─────────┐
             │         │           │         │           │         │
  ──────────►│ State 1 ├──────────►│ State 2 ├──────────►│ State 3 │─────────►
             │         │           │         │           │         │
             └─────────┘           └─────────┘           └─────────┘
&lt;/pre&gt;
&lt;figcaption&gt;Software states&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The software versioning is the process to assign a version to a state of a software: 
a &lt;strong&gt;version scheme&lt;/strong&gt; and a &lt;strong&gt;version strategy&lt;/strong&gt; are chosen to track the successive evolutions. 
For example, with a version control system as &lt;a href=&quot;https://git-scm.com/&quot;&gt;Git&lt;/a&gt;, the history of a 
software is split into commits, where each commit identifier is used as a version.&lt;/p&gt;

&lt;figure&gt;
&lt;pre class=&quot;notranslate&quot;&gt;
40551405dc02afe8240024c952fa1de953fc2ff9 Commit message: State 3
3982dcd90b486eab39eb610ec5e7e5963b92ab33 Commit message: State 2
32f0469eb344029bd1ecf5b0626685f2fa795f47 Commit message: State 1
...
&lt;/pre&gt;
&lt;figcaption&gt;Commit logs with commit identifier and message&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Here the version scheme is a &lt;a href=&quot;https://wikipedia.org/wiki/SHA-1&quot;&gt;SHA1-hash&lt;/a&gt;, where the version strategy is 
to assign a new version to each change of code rendered the more atomic than possible. It is a software 
versioning handy for development team, because each version is unique and points to each different change
in the code base. But not very useable for the users of this software, because a given version is not
human readable or user friendly, no useful information is given by this complex naming. And each change
has a version, what makes too many existing versions with a naming not discriminant, to know which
versions are important except the last one.&lt;/p&gt;

&lt;p&gt;A software version is a unique identifier to distribute a software also to users. But the development team 
of a software wishes to reduce the number of supported and maintained versions exposed to their clients,
and wants to package these changes to propose a software as a product with coherent features. That is why
another software versioning is applied often above these commit identifiers, and the usage of Git tag
and/or Git release is privileged.&lt;/p&gt;

&lt;h1 id=&quot;what-are-the-features-of-a-software-version&quot;&gt;What are the features of a software version?&lt;/h1&gt;

&lt;p&gt;As we have seen above, a software can have &lt;strong&gt;several versioning systems&lt;/strong&gt;, for example one used internally 
by the development team, and one exposed externally to users.&lt;/p&gt;

&lt;p&gt;In addition to be &lt;strong&gt;unique identifiers&lt;/strong&gt;, the versions are often ordered to know if a version is more
recent than another. So the naming of a version repects a &lt;strong&gt;semantics&lt;/strong&gt;, that contains this order and 
additional meanings.&lt;/p&gt;

&lt;p&gt;The publication of a new version follows a &lt;strong&gt;lifecycle&lt;/strong&gt; with a workflow and a process. This publication 
produces a distributable format of the software called &lt;strong&gt;archive&lt;/strong&gt; or &lt;strong&gt;package&lt;/strong&gt;. The version is 
assigned to the archive that is &lt;strong&gt;signed by the software provider identity&lt;/strong&gt; with a hash function on the
content of the archive to guarantee that once a particular version is published, this one remains
immutable and author of this archive is well the official provider of this software.&lt;/p&gt;

&lt;p&gt;A software can have &lt;strong&gt;direct&lt;/strong&gt; and &lt;strong&gt;transitive dependencies&lt;/strong&gt; that are also a versioning, and can be 
also a &lt;strong&gt;dependency of another software&lt;/strong&gt;. So, the question is raised of the compatibility between
the different versions.&lt;/p&gt;

&lt;p&gt;There are two directions to describe compatibility between 2 versions of a same software:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Backward compatible&lt;/strong&gt; means that a newer version can be used successfully in an context where an older 
version is expected.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Forward compatible&lt;/strong&gt; means that an older version can be used successfully in an context where a newer 
version is expected.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Fully compatible&lt;/strong&gt; means backward compatible and forward compatible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backward compatibility is often guaranteed, but forward compatibility is not. Compatibility depends on a
context of use, if the use is not exhaustive, it should be noted that compatibility is only guaranteed for
this use. Otherwise, implicitly, compatibility is assumed to be true for all possible contexts of use. For
example, full compatibility is only possible in sub-context and not on the global context, otherwise the 2
versions would point to an identical state of the software.&lt;/p&gt;

&lt;h1 id=&quot;how-to-build-a-software-version&quot;&gt;How to build a software version?&lt;/h1&gt;

&lt;p&gt;Breaking change, compatibility, Changelog, releases, alpha, beta, dependencies&lt;/p&gt;

&lt;p&gt;For example, &lt;a href=&quot;https://ubuntu.com/about/release-cycle&quot;&gt;Ubuntu versioning&lt;/a&gt;, &lt;a href=&quot;https://www.oracle.com/java/technologies/javase/versioning-naming.html&quot;&gt;SDK/JRE versioning&lt;/a&gt;, …&lt;/p&gt;

&lt;h1 id=&quot;example-for-javascala&quot;&gt;Example for Java/Scala&lt;/h1&gt;

&lt;p&gt;A Java/Scala library is compiled to a platform-independent format called JVM bytecode and stored in 
&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;.class&lt;/code&gt; files. These class files are zipped in JAR files for distribution.&lt;/p&gt;

&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Software_versioning&quot;&gt;https://en.wikipedia.org/wiki/Software_versioning&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.akka.io/docs/akka/current/common/binary-compatibility-rules.html&quot;&gt;https://doc.akka.io/docs/akka/current/common/binary-compatibility-rules.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://semver.org/&quot;&gt;https://semver.org/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.scala-lang.org/blog/2021/02/16/preventing-version-conflicts-with-versionscheme.html&quot;&gt;https://www.scala-lang.org/blog/2021/02/16/preventing-version-conflicts-with-versionscheme.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.scala-lang.org/overviews/core/binary-compatibility-for-library-authors.html&quot;&gt;https://docs.scala-lang.org/overviews/core/binary-compatibility-for-library-authors.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.scala-lang.org/overviews/jdk-compatibility/overview.html&quot;&gt;https://docs.scala-lang.org/overviews/jdk-compatibility/overview.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jatcwang/binary-compatibility-guide&quot;&gt;https://github.com/jatcwang/binary-compatibility-guide&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/lightbend/mima&quot;&gt;https://github.com/lightbend/mima&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.openjdk.java.net/display/csr/Kinds+of+Compatibility&quot;&gt;https://wiki.openjdk.java.net/display/csr/Kinds+of+Compatibility&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Time management</title>
   <link href="https://glegoux.com/blog/articles/2021/04/20/time-management.html"/>
   <updated>2021-04-20T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2021/04/20/time-management.html</id>
   <content type="html">&lt;p&gt;You could need to &lt;strong&gt;optimize the spending of your time&lt;/strong&gt; for &lt;strong&gt;professional or personal activities&lt;/strong&gt;. 
I am going to explain what means to me the time, and how you can manage it. I have been inspired by my
knowledge, experiences, readings, and listenings, but it is my personal version of time management 
between math, physics, management, philosophy, and operational research. Without giving a lot of details, 
time management is also linked to the &lt;strong&gt;agile methodologies&lt;/strong&gt; that are one implementation, 
like &lt;strong&gt;Scrum&lt;/strong&gt;, &lt;strong&gt;Kanban&lt;/strong&gt;, or &lt;strong&gt;Pomodoro&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;time management&lt;/strong&gt; is the science of the usage of time, a possible definition could be the process of planning and 
exercising conscious control of time spent on specific activities, especially &lt;strong&gt;to increase effectiveness, efficiency, 
and productivity&lt;/strong&gt;.&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vR9gDDDWTNK3btntBfhxsrL18EDGgytkOLDCS2yrgp8ZqxgvJQsCpnyWJwWT4cIk_8z0rLUn1iTS8cG/pub?w=600&amp;amp;h=348&quot; alt=&quot;Time Management&quot; title=&quot;Time Management&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Time Management
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The way you can &lt;strong&gt;use your time&lt;/strong&gt; depends on a lot of things, among others, there are your:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;context&lt;/strong&gt;:
    &lt;ul&gt;
      &lt;li&gt;Which resources do you have (knowledge, time, energy, money …)&lt;/li&gt;
      &lt;li&gt;What are your features (skills, experiences, character traits …)&lt;/li&gt;
      &lt;li&gt;What are your constraints (costs, exigencies, …)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;projection&lt;/strong&gt;:
    &lt;ul&gt;
      &lt;li&gt;What you want to do (ambitions, preferences, choices …)&lt;/li&gt;
      &lt;li&gt;What are your goals (objectives, key results, tasks, sub-tasks, projects, missions …)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;strategy&lt;/strong&gt;:
    &lt;ul&gt;
      &lt;li&gt;How do you organize your activities (priorities, hierarchies, dependencies, sizing, partitioning
…)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;analysis&lt;/strong&gt;:
    &lt;ul&gt;
      &lt;li&gt;How you know yourself (strong points, weak points, personal will, and effort …)&lt;/li&gt;
      &lt;li&gt;How you have a projection &amp;amp; strategy coherent of yourself (clairvoyance, honesty, realism …)&lt;/li&gt;
      &lt;li&gt;How you receive a critical opinion positive or negative on yourself (feedback,
auto-introspections, questionings, doubts…)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;time-definition&quot;&gt;Time Definition&lt;/h1&gt;

&lt;p&gt;With the meta-physique considerations, the &lt;strong&gt;time&lt;/strong&gt; has wondering features: &lt;strong&gt;universal, continuous, unlimited, 
non-renewable, solid (incompressible/no expansible), perpetually self-generated, no accumulative&lt;/strong&gt;. Focus is on the &lt;strong&gt;timescale&lt;/strong&gt; of our &lt;strong&gt;human life&lt;/strong&gt;.
These features are immutable, or more precisely their changes are negligible. But we can interpret the time differently.&lt;/p&gt;

&lt;p&gt;Here I am going to interpret the time like a &lt;strong&gt;quantizable object&lt;/strong&gt; with an arbitrary window in the &lt;strong&gt;past, present or future&lt;/strong&gt;.
The present moment is seen like a progressive cursor representing a dynamic &lt;strong&gt;instant&lt;/strong&gt; on the &lt;strong&gt;timeline&lt;/strong&gt;. This present instant 
plays the role of an irreversible transformer altering the future into the past. The &lt;strong&gt;duration&lt;/strong&gt; of an &lt;strong&gt;event&lt;/strong&gt; is the length of a &lt;strong&gt;windows time&lt;/strong&gt; 
delimited by 2 instants where the event began and finished. For the following, when I speak about time, I refer to these &lt;strong&gt;sliding windows&lt;/strong&gt;.&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vQMPHMxeI8O86epOjBylFK4Pv1L71MKeIki-rfSJzG5wZ9jeickJi_y32JDWLGqLlXqm0lTj-3vBBge/pub?w=537&amp;amp;h=147&quot; alt=&quot;Time vs Duration&quot; title=&quot;Time vs Duration&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Time vs Duration
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div class=&quot;info&quot;&gt;
The &lt;b&gt;time&lt;/b&gt; :clock2: is one of our &lt;b&gt;most valuable resources&lt;/b&gt;, for me more important than 
knowledge, money or energy, because all ones depend on time.
&lt;/div&gt;

&lt;p&gt;It is important to distinguish the &lt;strong&gt;absolute time&lt;/strong&gt;, and the &lt;strong&gt;subjective time&lt;/strong&gt;. The quantity of
elapsed time to carry out an activity can be &lt;strong&gt;viewed and interpreted subjectively&lt;/strong&gt;. The same
quantity of time measured objectively in &lt;strong&gt;seconds&lt;/strong&gt; could be lived differently by 2 different
people esteemed like &lt;strong&gt;short or long&lt;/strong&gt;. Take into account this subjectivity, because time
management is more relevant if it is applied individually with your sensibility.&lt;/p&gt;

&lt;p&gt;For example, &lt;strong&gt;a sharp mind&lt;/strong&gt; in a particular situation will have the feeling of life in accelerated
time by interacting with a less sharp mind, because he compares his thinking speed to that of his
interlocutor, and this one is faster, and reciprocally. Another example is when you are doing a
&lt;strong&gt;passionate activity&lt;/strong&gt;. The time seems to go faster, because you forget the feeling of elapsed
time, and inversely with the boredom.&lt;/p&gt;

&lt;p&gt;The absolute time allows you to compare the duration between 2 activities objectively, but when you want
to organize or optimize your time, you need to adjust your efforts with your personal consideration
of an elapsed time for a given activity. The &lt;strong&gt;elapsed time&lt;/strong&gt; can be interpreted as a &lt;strong&gt;sum of done
activities&lt;/strong&gt;. The &lt;strong&gt;unit measure of an activity&lt;/strong&gt; is subjective, and could be called &lt;strong&gt;weight&lt;/strong&gt;,
where mixed the &lt;strong&gt;quantities of used resources&lt;/strong&gt; to do the activity (for example the quantities
of time, energy, or money). Here more the activity has a light color, the more the activity has a lightweight:&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vR_VEmMKNndJR493-_obuNMiuI0c3h_MeUADJoeCJF7KdAPEuAgJm0F-f7U_UF4bF-aStk1pQZF5A6K/pub?w=537&amp;amp;h=147&quot; alt=&quot;Time usage&quot; title=&quot;Time usage&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Time usage
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The time could be considered as a quantity of spent resources during a duration (itself in another meaning)
to do activities now. So the &lt;strong&gt;quantity of available time at your disposition&lt;/strong&gt; 
does not respect the time features mentioned previously, it is:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;personal&lt;/strong&gt;: you have a personal context and subjective time&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;discrete&lt;/strong&gt;: you have a minimum time of reactivity for your frequency sample to measure the elapsed time&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;limited&lt;/strong&gt;: you have a life length and resources which are finite&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;renewable&lt;/strong&gt;: you can renew some activities in the future&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;compressible/expansible&lt;/strong&gt;: you feel elapsed time differently for a given activity in function
of time&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;occasionally generated by you&lt;/strong&gt;: you make your choices, and your organization to free of time&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;cumulative&lt;/strong&gt;: we interpret the time with a quantity now, not only an instant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the quantity of time is always available immediately.&lt;/p&gt;

&lt;h1 id=&quot;concepts&quot;&gt;Concepts&lt;/h1&gt;

&lt;p&gt;We defined several ways to conceptualize the time, here I can define more precisely the other
concepts of time management like the &lt;strong&gt;effort&lt;/strong&gt; and the &lt;strong&gt;optimization&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;effort&lt;/strong&gt; to do an activity is like the &lt;strong&gt;way of consummation of a number of resources&lt;/strong&gt;.
Your resources are renewed perpetually and have a &lt;strong&gt;potential&lt;/strong&gt;, the activity has also a &lt;strong&gt;potential&lt;/strong&gt;.
You need to create a resource flow, called the &lt;strong&gt;intensity&lt;/strong&gt; of the effort, to do the activity.
The awareness to practice an extreme effort in quantity (too much or too few) or quality (too easy or
too difficult) slows down the feeling of elapsed time and extends the time. This reduces your
endurance in this activity. But the practice and the training allow you to reduce the feeling of
effort, you consume less and/or have more resources.&lt;/p&gt;

&lt;p&gt;It is important to observe that the optimization of the &lt;strong&gt;time usage&lt;/strong&gt; is in fact the optimization
of future projection of the productivity of an activity on a time range. This
&lt;strong&gt;optimization&lt;/strong&gt; is &lt;strong&gt;under constraints&lt;/strong&gt; and depends on &lt;strong&gt;objectives&lt;/strong&gt;, called also goals. To
achieve these goals one of the &lt;strong&gt;available resources&lt;/strong&gt; to use and save is time.&lt;/p&gt;

&lt;p&gt;I use several concepts above without defining them, here is a summary:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Goal&lt;/strong&gt;: definition of result(s) that you want to get, called also objective.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Task&lt;/strong&gt;: definition of action(s) that you need to achieve a goal.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Activity&lt;/strong&gt;: execution of task(s) over time.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Productivity&lt;/strong&gt;: a measure of your performance (that is a combination of effectiveness and
efficiency) of your activities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;optimization-model&quot;&gt;Optimization Model&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;time management&lt;/strong&gt; can be seen in the &lt;strong&gt;modeling of an objective function&lt;/strong&gt;
to optimize. The model of this objective function is fixed by the &lt;strong&gt;definition&lt;/strong&gt; of your &lt;strong&gt;goals&lt;/strong&gt;
(split into &lt;strong&gt;tasks&lt;/strong&gt;) and of the &lt;strong&gt;execution plan&lt;/strong&gt;. Then its optimization is determined by the
duality between the &lt;strong&gt;minimization&lt;/strong&gt; of the &lt;strong&gt;cost of executions&lt;/strong&gt; and the &lt;strong&gt;maximization&lt;/strong&gt; of 
&lt;strong&gt;quality of got results&lt;/strong&gt; for a set of tasks.&lt;/p&gt;

&lt;p&gt;In mathematics terms, that is to say optimize the &lt;strong&gt;objective function&lt;/strong&gt; $g \circ f$ on a set of tasks $\bigcup x \subset X$
where:&lt;/p&gt;

\[f: X \rightarrow \mathbb{R}^+ \times \mathbb{R}^+ \quad x \mapsto f(x) = (c(x), q(x))\]

\[g: Img(f) = \{\,f(x)\,|\,x \in X \} \subset \mathbb{R}^+ \times \mathbb{R}^+ \rightarrow
\mathbb{R}^+ \quad y \mapsto g(y) = g(f(x)) = g(c(x), q(x))\]

&lt;ul&gt;
  &lt;li&gt;$c$ is the &lt;strong&gt;cost function&lt;/strong&gt; of executions&lt;/li&gt;
  &lt;li&gt;$q$ is the &lt;strong&gt;quality function&lt;/strong&gt; of got results&lt;/li&gt;
  &lt;li&gt;$f$ is the &lt;strong&gt;productivity function&lt;/strong&gt; in terms of efficiency and effectiveness&lt;/li&gt;
  &lt;li&gt;$g$ is a &lt;strong&gt;trade-off function&lt;/strong&gt; between the minimization of the cost $c$ and maximization of the quality
$q$ on subset of $X$&lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vQWBneRL7immMkY2pHZ1FMm7Kz3LNDcrF7by2pUAonxbNXIBP9dKNtc0NohlMi72y8Duk1BJaTZCwWg/pub?w=500&amp;amp;h=366&quot; alt=&quot;Objective function is a trade-off: cost vs quality of
a set of tasks&quot; title=&quot;Objective function is a trade-off: cost vs quality of
a set of tasks&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Objective function is a trade-off: cost vs quality of
a set of tasks
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div class=&quot;warning&quot;&gt;
But the stability, the evolution of the objective function depends on your &lt;b&gt;regularity&lt;/b&gt;, your &lt;b&gt;implication&lt;/b&gt;, and your &lt;b&gt;progress&lt;/b&gt;.
&lt;/div&gt;

&lt;p&gt;The functions $c$ and $q$ are often linked, and it influences generally each one negatively for the
optimization: reducing the cost reduces the quality, and increasing the quality increases the cost.
While our optimization consists in reducing the cost, being &lt;strong&gt;efficient&lt;/strong&gt;, and increasing the quality,
to be &lt;strong&gt;effective&lt;/strong&gt;. It is often more performant to be firstly effective, than efficient for a given
task. Learning to do correctly a task before doing it faster. But it is clear, that being
effective and efficient (at the same time and in good proportion) is the final goal for each task.&lt;/p&gt;

&lt;div class=&quot;info&quot;&gt;
You can do an analogy with the &lt;b&gt;machine learning&lt;/b&gt; algorithm. The execution plan is your &lt;b&gt;model&lt;/b&gt; owning &lt;b&gt;hyper-parameters&lt;/b&gt;, 
the tasks are rows of your &lt;b&gt;dataset&lt;/b&gt; (training, validation, test) and the maximization of the objection function is the step of &lt;b&gt;learning&lt;/b&gt;. 
With experience in an execution plan, you can predict the speed of execution and the quality of results.
&lt;/div&gt;

&lt;h1 id=&quot;methodology&quot;&gt;Methodology&lt;/h1&gt;

&lt;p&gt;After having modeled and defined the concepts of time management, I am interested here by
applying it in practice through a methodology. Firstly, even if you can model the time management,
in my point of view it is an &lt;strong&gt;empirical science&lt;/strong&gt;. That is to say, you need a methodology to test
it, and your knowledge about this science will be provided by your experiences and your
observations.&lt;/p&gt;

&lt;div class=&quot;info&quot;&gt;
Here the &lt;b&gt;main considered resource&lt;/b&gt; is &lt;b&gt;the time&lt;/b&gt;, but in practice, the methodology could be more complex you could consider 
other inter-dependent resources to spend like money or energy.
&lt;/div&gt;

&lt;h2 id=&quot;context&quot;&gt;Context&lt;/h2&gt;

&lt;p&gt;You need to list and put into perspective your resources, your skills, and your constraints.&lt;/p&gt;

&lt;h2 id=&quot;projection&quot;&gt;Projection&lt;/h2&gt;

&lt;p&gt;After you need to define what you want to do and build your &lt;strong&gt;goals&lt;/strong&gt; each one with a &lt;strong&gt;dateline&lt;/strong&gt;.
Do a first pass of the following section strategy applied to your goals (replace activities with
goals). Once your goals are partitioned, hierarchized, sized, prioritized, and sequenced. Your destructed
goals should now fill in a &lt;strong&gt;coherent structure&lt;/strong&gt;. Then split each goal into tasks. You can repeat
this operation to split each task into smaller activities to pass &lt;strong&gt;from a macro timescale to a
micro timescale&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;strategy&quot;&gt;Strategy&lt;/h2&gt;

&lt;p&gt;The strategies are the fact to structure your activities to reach out.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Partition your activities&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Partition your activities which have the same &lt;strong&gt;type&lt;/strong&gt; in &lt;strong&gt;independent class&lt;/strong&gt; between them the more
possible. Of course, the content of each &lt;strong&gt;partition&lt;/strong&gt;
is subjective for some activities, you can classify your activities into these partitions
differently in the function of your sensitivities and interests. You can already give an important
weight to each partition.&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vRt1dc1fZp69-BO05hjcdjSoRflDhlTG_9NmctQRn-EbmvITD_Lg2xlgT-MqsnkAF7XA_31X0Uv-a0m/pub?w=300&amp;amp;h=321&quot; alt=&quot;Partitioning&quot; title=&quot;Partitioning&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Partitioning
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Organize into a hierarchy your activities&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here the goal is to estimate roughly the weight of an activity to have its order of magnitude.&lt;/p&gt;

&lt;p&gt;Each goal should be realistic, reachable, measurable with success keys, and sized in difficulty and
required time to achieve it. You can play on &lt;strong&gt;several scales&lt;/strong&gt; for your future projections:
&lt;strong&gt;very long term, long term, middle term, short term, and very short term&lt;/strong&gt;.&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vT2INReaOVrCjN2rKrOCBToYqXnIg6dU7hHGiwSvcZl_7Lg6uXqoj5aNlV68abuP29q_OaZm6vc5bPF/pub?w=480&amp;amp;h=360&quot; alt=&quot;Scaling&quot; title=&quot;Scaling&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Scaling
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Size your activities&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now you can size more precisely each task. You can measure absolutely if it is complicated, you can
also measure relatively the ones in relation to the other ones. You need to choose the unit of the *
weight* of your activity.&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vTKLnvm7RpJb3SSmZ4mEmLFyvb84e9ndFV1ehYUDe7OV5ev-yWVztyG8VE0gYpyi_KpQNyhZtuN_ToH/pub?w=200&amp;amp;h=331&quot; alt=&quot;Sizing&quot; title=&quot;Sizing&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Sizing
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Organize the interactions of activities&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You need to build a &lt;strong&gt;dependency graph&lt;/strong&gt; of each activity to see if an activity depends on other
one(s).&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vSudssT0neN76LmXVxtcbVBVQEI_cVhyS6wqCWo9jqCTX2EqIJeb6qMtUvm-7XR0m2J_AWm1Ynps9qB/pub?w=250&amp;amp;h=289&quot; alt=&quot;Dependency graph&quot; title=&quot;Dependency graph&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Dependency graph
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Your &lt;strong&gt;dependency graph&lt;/strong&gt; must be a set of &lt;strong&gt;acyclic graphs&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Prioritize your activities&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After you need &lt;strong&gt;to rank your activities&lt;/strong&gt; which ones are the most important ones:&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vS8OzDo_ArOse_qIVYYg1yati0qf8MeIyxeiP_bL618xEMEFxdBwLGiFK1jsj66hY7OPzCz-rlP71Kl/pub?w=245&amp;amp;h=240&quot; alt=&quot;Prioritizing&quot; title=&quot;Prioritizing&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Prioritizing
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Sequence your activities&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is you build your &lt;strong&gt;plan of execution&lt;/strong&gt; by sequencing each activity by respecting the previous
steps and your other constraints:&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vTaWiI1eOkX3AKOSixZzaKHyXRaMc7_RVdFqwglYzHhfMss0hQ7No16GBqfDbzJqM1hfNk1Pw7wDdpV/pub?w=573&amp;amp;h=145&quot; alt=&quot;Sequencing&quot; title=&quot;Sequencing&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Sequencing
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;You can also optimize these sequencing.&lt;/p&gt;

&lt;h2 id=&quot;auto-analysis&quot;&gt;Auto-analysis&lt;/h2&gt;

&lt;p&gt;Now you can execute your plan. But you need to &lt;strong&gt;monitor&lt;/strong&gt; it, have logs, metrics, and traces,
and have dashboards to visualize it. You need to do regular &lt;strong&gt;retrospectives&lt;/strong&gt; and &lt;strong&gt;plans&lt;/strong&gt;.
Respectively adjust your strategy in the function of time, and continue to converge to the filling of
your goals. Then define new goals or delete goals in order to avoid the shortage of tasks, the
overload, or the accumulation of deprecated goals. Then you need to measure your &lt;strong&gt;KPI&lt;/strong&gt; and your
productivity. You need to have a &lt;strong&gt;feedback loop&lt;/strong&gt; to build your &lt;strong&gt;virtuous circle&lt;/strong&gt;, and iterate on
it.&lt;/p&gt;

&lt;h1 id=&quot;for-example&quot;&gt;For Example&lt;/h1&gt;

&lt;p&gt;Are you a student, a worker, or a retiree? Take the example of a worker, more precisely a professional
software engineer full-time working exclusively for a unique company at the beginning of their
career. By hoping, that it matches your &lt;strong&gt;auto-introspection&lt;/strong&gt;, else the following could help you to do
the same thing for your personal context. I give you here only a &lt;strong&gt;partial overview&lt;/strong&gt; of how it can be done, 
this example is not necessarily my real usage of my personal time.&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vTP167tBMm4i3nTOrf72NzpkGNLuTAVMnsQqdasktHiuAnOx-AMG1G9We3qWRADeDgrfCC3EV2Oxwm7/pub?w=537&amp;amp;h=147&quot; alt=&quot;Timescale of the human life&quot; title=&quot;Timescale of the human life&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Timescale of the human life
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I analyze my resources, my constraints, and my features (hard skills and soft skills, …).&lt;/p&gt;

&lt;p&gt;Above all, I define what I want to do and my ambitions: following conferences, coding an open-source project, having a side project, 
becoming a speaker, losing weight, finishing TV series, reading books, following training, giving courses …
Each goal should be precise, measurable, and reachable.&lt;/p&gt;

&lt;p&gt;I split my activities into 3 partitions:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Life activities&lt;/strong&gt;: required vital, society or community activities&lt;br /&gt;
&lt;em&gt;for example sleep, eat, wash, practice a physical activity, interact with your environment, do
the housework, pay the taxes, see your friends …&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Work activities&lt;/strong&gt;: required activities for your job&lt;br /&gt;
&lt;em&gt;for example commute, work, do brainstorm, code, participate in a meeting, take a break …&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Personal activities&lt;/strong&gt;: spare and free activities&lt;br /&gt;
&lt;em&gt;for example: practice its development personal, relaxation …&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I focus on the &lt;strong&gt;life activities&lt;/strong&gt; that compose my lifetime. I let on side work and personal activities, it is the principle.&lt;/p&gt;

&lt;p&gt;For example, for the different timescales, I take long: ~hour and short: ~minute. 
I try to evaluate the time of each life activity:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;sleeping: 7 hours per day&lt;/li&gt;
  &lt;li&gt;washing: 2 times 3 minutes per day for teeth and 15min per day for body&lt;/li&gt;
  &lt;li&gt;eating: 2 times 20 minutes per day for lunch and dinner, with 10 minutes per day for breakfast&lt;/li&gt;
  &lt;li&gt;seeing friends: at least one time per week for several hours&lt;/li&gt;
  &lt;li&gt;practicing sport: 3 hours per week&lt;/li&gt;
  &lt;li&gt;doing the other tasks: several hours per week (taking out the trash, preparing the meals, doing housework, shopping, do-it-yourself …)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These activities are not really dependent on each other and have the same priority for me. Now I sequence them for each period of a day and of a week.&lt;/p&gt;

&lt;p&gt;I have a &lt;strong&gt;calendar&lt;/strong&gt; where I can monitor each timescale and put my tasks, a &lt;strong&gt;weekly planning&lt;/strong&gt;
for my deadlines, and a &lt;strong&gt;to-do list&lt;/strong&gt; for daily tasks.&lt;/p&gt;

&lt;p&gt;Now I redo the same things for both my personal and work activities to manage my time more effectively.&lt;/p&gt;

&lt;h1 id=&quot;go-further&quot;&gt;Go Further&lt;/h1&gt;

&lt;p&gt;This article is only an introduction to time management applied to oneself by oneself. But the situation can
be &lt;strong&gt;more complex&lt;/strong&gt; and applied in &lt;strong&gt;all situations&lt;/strong&gt;. For example, if you think about the time management 
for other people or projects, in a professional context for the tech sector:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Tech/Team/Dev Leader&lt;/strong&gt; for a team composed of a group of people&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Tech/Project Manager/Director&lt;/strong&gt; for a department composed of a group of teams&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CTO&lt;/strong&gt; for a R&amp;amp;D pole composed of departments&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CEO&lt;/strong&gt; for a company or a group of companies …&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It requires delegating tasks, understanding the personal context of other people, and driving
the time management for a group of people at &lt;strong&gt;different scales&lt;/strong&gt;. These organizations can have
different structures and different stakes. For this, you must redefine the &lt;strong&gt;time management&lt;/strong&gt; to
resolve your new needs for &lt;strong&gt;yourself&lt;/strong&gt; and for &lt;strong&gt;other people&lt;/strong&gt; and/or &lt;strong&gt;projects&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To conclude, as time management is a set of &lt;strong&gt;meta-concepts&lt;/strong&gt; learned mainly through &lt;strong&gt;self-education practice&lt;/strong&gt;, 
here is a paradoxical quote to consider (translated from French):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Dare I set forth here the greatest, the most important, the most useful rule of all education? It is not to save time, but to waste it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jean-Jacques Rousseau from Emile, or On Education (1762)&lt;/p&gt;

&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;MALABOU, Catherine. &lt;strong&gt;Le Temps&lt;/strong&gt;. Hatier, 2019. 80 pages. ISBN: 2-218-71678-X.&lt;/li&gt;
  &lt;li&gt;Saint-Augustin. &lt;strong&gt;Les Confessions&lt;/strong&gt;. 4 BC. Book XI.&lt;/li&gt;
  &lt;li&gt;KLEIN, Etienne. &lt;strong&gt;Les tactiques de Chronos&lt;/strong&gt;. Flammarion, 2009. 224 pages. ISBN: 978-2-0812-2305-9.&lt;/li&gt;
  &lt;li&gt;HAWKING, Stephen. &lt;strong&gt;A Brief History of Time&lt;/strong&gt;. Bantam Book, 2011. Chapter 2: Space and Time. 23 pages. ISBN: 978-0-857-50100-4.&lt;/li&gt;
  &lt;li&gt;VANDENBERGHE, Lieven. &lt;strong&gt;Convex Optimization&lt;/strong&gt;. Cambridge University Press, 2009. Chapter 1: 16 pages. ISBN: 978-0-521-83378-3.&lt;/li&gt;
  &lt;li&gt;WINSTON, Wayne L.. &lt;strong&gt;Operations Research&lt;/strong&gt;. Thomson Brooks/Cole, 2004. Chapter 1: 12 pages. ISBN: 0-534-38058-1.&lt;/li&gt;
  &lt;li&gt;MURPHY, Kevin P.. &lt;strong&gt;Machine Learning: A probabilistic Perspective&lt;/strong&gt;. The MIT Press, 2012. Chapter 1: 24 pages. ISBN: 978-0-262-01802-9.&lt;/li&gt;
  &lt;li&gt;SUTHERLAND, Jeff. &lt;strong&gt;SCRUM&lt;/strong&gt;. Business Books, 2014. 248 pages. ISBN: 978-1-847-94108-4.&lt;/li&gt;
  &lt;li&gt;ANDERSON, David J. &lt;strong&gt;Kanban: Successful Evolutionary …&lt;/strong&gt; Blue Hole Press, 2010. 278 pages. ISBN: 978-0-9845214-1-8.&lt;/li&gt;
  &lt;li&gt;CIRILLO, Francesco. &lt;strong&gt;The Pomodoro Technique&lt;/strong&gt;. 2018. 160 pages. ISBN: 1524760706.&lt;/li&gt;
  &lt;li&gt;OHNO, Taiichi. &lt;strong&gt;Toyota Production System&lt;/strong&gt;. Synermage, 2020. 150 pages. ISBN: 106992329X.&lt;/li&gt;
  &lt;li&gt;New York University. &lt;strong&gt;Time Management&lt;/strong&gt;. NYC, January 2023. &lt;a href=&quot;https://meet.nyu.edu/academics/time-management-101-guide-to-reclaim-your-time/&quot;&gt;Link&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;KOLMAR, Chris. &lt;strong&gt;Efficiency vs Effectiveness&lt;/strong&gt;. Zippia, April 2021. &lt;a href=&quot;https://www.zippia.com/advice/efficiency-vs-effectiveness/&quot;&gt;Link&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Unix timestamp</title>
   <link href="https://glegoux.com/blog/articles/2020/11/28/unix-timestamp.html"/>
   <updated>2020-11-28T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2020/11/28/unix-timestamp.html</id>
   <content type="html">&lt;p&gt;In fact, 2038 is a particular year when an informatics bug could occur, sometimes referred as the &lt;strong&gt;Y2K38 problem&lt;/strong&gt;. 
Because an &lt;strong&gt;arithmetic overflow&lt;/strong&gt; on the Unix timestamp risks appearing, what it means, there are insufficient bits in a 
binary number representation to portray the result of an arithmetic operation. For example, an arithmetic operation 
is not closed with respect to addition, subtraction, multiplication, or division.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Y2K38 problem is caused by insufficient capacity used to represent a time duration:&lt;br /&gt;
the Unix timestamp as a signed 32-bits integer. It could produce a huge chaos.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;h1 id=&quot;unix-timestamp&quot;&gt;Unix timestamp&lt;/h1&gt;

&lt;p&gt;Effectively, the &lt;strong&gt;Unix timestamp&lt;/strong&gt;, used largely in informatics systems, represents the number of
elapsed seconds since January 1st, 1970 at midnight in the Coordinated Universal Time (UTC) time standard.
This value is incremented every second. And the date &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;1970-01-01 00:00:00 UTC&lt;/code&gt;, usually called &lt;strong&gt;epoch date&lt;/strong&gt;, 
is a particular date in a lot of informatics system representing the origin time, inherited of the Unix operating system
an POSIX standard. The Unix engineers picked this date arbitrarily, because they needed to set a uniform date for the start of time, 
and New Year’s Day, 1970, seemed most convenient.&lt;/p&gt;

&lt;p&gt;As you can see:&lt;/p&gt;

&lt;div class=&quot;language-terminal 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;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;s &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;seq &lt;/span&gt;0 3&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;date&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--date&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;1970-01-01 00:00:00 UTC &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$s&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; seconds&quot;&lt;/span&gt; +%s&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;0
1
2
3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A Unix timestamp is used to known the occurrence date of an informatics event, after 1970. Sometimes other 
granularity of time like the millisecond, or the nanosecond are used, but traditionally it is the second.&lt;/p&gt;

&lt;div class=&quot;info&quot;&gt;
While the trademark today is UNIX, in this article, we use Unix in deference to dmr&apos;s wishes, dmr being the 
username of Dennis MacAlistair Ritchie, famous computer scientist having worked the on Unix operating system.
&lt;/div&gt;

&lt;h1 id=&quot;arithmetic-binary-representation-overflow&quot;&gt;Arithmetic binary representation overflow&lt;/h1&gt;

&lt;p&gt;But the arithmetic binary representation of this Unix timestamp is sometimes on &lt;strong&gt;32-bits as a signed integer&lt;/strong&gt; again as 
originally at its creation. That is to say, its maximum value is $ 2^{31} - 1 $. The negative values until $ -2^{31} 
$ (inclusive) are used by convention for representing a duration from &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;1970-01-01 00:00:00 UTC&lt;/code&gt; to an anterior date. 
Then the maximum duration time supported by a such Unix timestamp will be reach out at &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;2038-01-19 03:14:07 UTC&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-terminal 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;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;date&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--date&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;@&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$((&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;31&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--utc&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;Tue Jan 19 03:14:07 UTC 2038
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;adding of 1 second at this date&lt;/strong&gt; raises an arithmetic overflow error. For a representation on &lt;strong&gt;32-bits 
as an unsigned integer&lt;/strong&gt;. The problem will be the same in 2106:&lt;/p&gt;

&lt;div class=&quot;language-terminal 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;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;date&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--date&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;@&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$((&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;32&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--utc&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;Sun Feb  7 06:28:15 UTC 2106
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Hopefully, the majority of informatics technology have already migrated to a &lt;strong&gt;64-bits representation&lt;/strong&gt;. For a signed integer,
this problem is rescheduled for around in 290 billions of years, in other words in a &lt;strong&gt;quantity quasi-infinity of time&lt;/strong&gt;, knowing the 
age of the universe is estimated around 13 billions of years, or around 20 times less. With the approximate computation:&lt;/p&gt;

&lt;div class=&quot;language-scala 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;n&quot;&gt;scala&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Long&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;MaxValue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;365&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;24&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3600&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;pow&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Double&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;292.471208677&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The problem could be considered as resolved. But &lt;strong&gt;some informatics system could be bugged&lt;/strong&gt; by the &lt;strong&gt;negligence&lt;/strong&gt; or the &lt;strong&gt;ignorance&lt;/strong&gt; of this problem 
from developers and/or maintainers of these informatics systems. The informatics system uses often &lt;strong&gt;a lot of dependencies&lt;/strong&gt; like code libraries, 
hardware components, or operating systems. Only one of the dependency could be the source of a such bug in the related informatics systems that uses it, 
because the Unix timestamp are omnipresent on each system layer from low level to high level.&lt;/p&gt;

&lt;p&gt;Concretely, it raises an &lt;strong&gt;arithmetic overflow error&lt;/strong&gt;. It could be silent, trigger a coding exception, or have a different behavior.
For example for the most programming languages, it will be silent for the programmer but with a different behavior. 
Even if the test policy of the coding project could catch this kind of error. It is enough rare to have a unit or integration test 
with the current time or a future time, often the time is fixed to have an exact reproducible test. But it could be observed in 
the end-to-end test. In any case, &lt;strong&gt;the error will appear firstly at the runtime directly in production&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It could produce a chaos, because the consequences of a such error are hard to forecast, with a risk to be destructive.
Events can be not synchronized between several systems or just stop working: internet, cars, IoT devices, banks, airplanes, etc … 
suddenly could no longer work.&lt;/p&gt;

&lt;h1 id=&quot;example-in-javascala&quot;&gt;Example in Java/Scala&lt;/h1&gt;

&lt;p&gt;While currently Java/Scala ecosystem is not exposed to this problem in the standard library, 
with a signed 64-bits representation for an Unix timestamp:&lt;/p&gt;

&lt;div class=&quot;language-scala 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;n&quot;&gt;scala&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;java.time.Instant&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Instant&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;getEpochSecond&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isInstanceOf&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Long&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Boolean&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A Unix timestamp is well represented by a &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Long&lt;/code&gt; from $-2^{63}$ to $2^{63} - 1$. Let’s study together, what it could happen, if it was a &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Int&lt;/code&gt;.&lt;br /&gt;
The range of values will be between $-2^{31}$ and $2^{31} - 1$ for a &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Int&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-scala 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;n&quot;&gt;scala&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;MinValue&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2147483648&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;scala&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;MaxValue&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2147483647&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;warning&quot;&gt;
In Scala, it is false to express $2^{31}$ with Math.pow(2, 31).intValue that is equal to 2147483647, what it doesn&apos;t make sense.
Here, you have a odd number instead of an even number, and typically an arithmetic overflow per truncation from Double to Int.
&lt;/div&gt;

&lt;p&gt;In addition we have:&lt;/p&gt;

&lt;div class=&quot;language-scala 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;n&quot;&gt;scala&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;MaxValue&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;MinValue&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Boolean&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The adding of 1 second after &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Tue Jan 19 03:14:07 UTC 2038&lt;/code&gt; gives:&lt;/p&gt;

&lt;div class=&quot;language-terminal 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;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;date&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--date&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;@&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$((&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;31&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--utc&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;Fri Dec 13 20:45:52 UTC 1901
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Weird, how could we explain that. The error is silent no exception raised, the addition provoking the arithmetic overflow is cyclic on the 
arithmetic representation. Because, here a &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Int&lt;/code&gt; has a &lt;strong&gt;two’s complement binary representation&lt;/strong&gt; (2C) in Scala.
Here the relation between the base 10 and the two’s complement binary representation on 32-bits is:&lt;/p&gt;

\[[N]_{10} = [b_{31}\,...\,b_{1}\,b_{0}]_{2C} = - b_{31}\,2^{31} + \sum_{i=0}^{30} b_{i}\,2^{i} \text{ where } b_k \,\in\, \{ 0,1 \}\]

&lt;p&gt;with the notation &lt;strong&gt;little endian&lt;/strong&gt; for the order of the bits, the most significant bit (MSB) $ b_{31} $ is the &lt;strong&gt;sign bit&lt;/strong&gt; 
and the least significant (LSB) bit $ b_{0} $ the &lt;strong&gt;unit bit&lt;/strong&gt;. It the sign bit is 1, the number is stricly negative. And if the unit bit is 1, the numbder is odd. For example:&lt;/p&gt;

&lt;div class=&quot;language-scala 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;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;toBinaryRepresentation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;toBinaryString&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;reverse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;padTo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sc&quot;&gt;&apos;0&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;reverse&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;scala&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;toBinaryRepresentation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;MinValue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10000000000000000000000000000000&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;scala&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;toBinaryRepresentation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;11111111111111111111111111111111&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;scala&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;toBinaryRepresentation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00000000000000000000000000000000&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;scala&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;toBinaryRepresentation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;MaxValue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01111111111111111111111111111111&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To conclude the limitations of storage capacity for a value can provoke weird bugs in an informatics ecosystem, 
it is important to be aware of this kind of behavior when a technology is used.&lt;/p&gt;

&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;RITCHIE Dennis M., THOMPSON Ken, &lt;strong&gt;The UNIX TimeSharing System&lt;/strong&gt;. Bell Labs, July 1974. &lt;a href=&quot;https://dsf.berkeley.edu/cs262/unix.pdf&quot;&gt;Link&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;NYGREN Erik, &lt;strong&gt;Preparing for Y2038 (ALREADY?!)&lt;/strong&gt;. Akamai Blog, January 2019. &lt;a href=&quot;https://www.akamai.com/blog/performance/preparing-for-y2038-already&quot;&gt;Link&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;DINAMANI Deepa, &lt;strong&gt;Solving the Year 2038 problem in the Linux kernel&lt;/strong&gt;. opensource.com, January 2019. &lt;a href=&quot;https://opensource.com/article/19/1/year2038-problem-linux-kernel&quot;&gt;Link&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;THAKUR Vishal, &lt;strong&gt;What Is The 2038 Problem?&lt;/strong&gt;. Science ABC, October 2020. &lt;a href=&quot;https://www.scienceabc.com/innovation/what-is-the-2038-problem.html&quot;&gt;Link&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Geo-location</title>
   <link href="https://glegoux.com/blog/articles/2020/08/24/geo-location.html"/>
   <updated>2020-08-24T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2020/08/24/geo-location.html</id>
   <content type="html">&lt;p&gt;We can model the surface of the earth as a sphere of radius $R$. Even if in reality, the earth is more a kind of ellipsoid with an irregular surface, where each point of its surface owns an altitude in relation to the sea level.&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vRdm2uIt-uhISovgxlwTgP6w08Lq8LPqX-vpNz8RVt7cr_sHn8k1Fb5-3d8kVV5Z2K5-Ys8gwEYLfy9/pub?w=480&amp;amp;h=360&quot; alt=&quot;Coordinates on earth with latitude and longitude&quot; title=&quot;Coordinates on earth with latitude and longitude&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Coordinates on earth with latitude and longitude
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Let $p1 = (\text{lat1}, \text{long1})$, $p2 = (\text{lat2}, \text{long2})$ be 2 points on the surface of the earth with a latitude and a longitude given in radian respectively. The latitude has a value between $[-\frac{\pi}{2}, \frac{\pi}{2}]$, and the longitude between $]-\pi, \pi]$. So each point is identified by unique way with this tuple: latitude and longitude. There is at least a great circle of the sphere passing both through $p1$ and $p2$, either an infinity if $p1$, $p2$ and the center of the sphere are aligned in the ambient space, or an unique one. The smallest length of a path joining $p1$ and $p2$ on the earth surface is the size of the minor circular arc of a great circle. A such arc is called a geodesic, that we note $d(p1, p2)$ its size. We put $\alpha \in [0, \pi]$ is the smallest central angle, to avoid all ambiguities, because $p1$ and $p2$ belong to a circle, and define 2 circular arcs: the minor one and the major one, respectively with a size $d(p1, p2)$ and $2\pi R - d(p1, p2)$. If $\alpha = 0$, then $p1$ and $p2$ are confused, and if $\alpha = \pi$, then $p1$ is the antipode of $p2$ (diametrically opposite, and reciprocally).&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vQptEFbx1SxwX-p1QFsK94CvkoJwbVAKXpiQ8FaL9-BJbZnEUw4PYZqce7UnUtD-Hcm01ZRV4vOornF/pub?w=480&amp;amp;h=360&quot; alt=&quot;Smallest distance between 2 points on the earth surface&quot; title=&quot;Smallest distance between 2 points on the earth surface&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Smallest distance between 2 points on the earth surface
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;So:&lt;/p&gt;

\[d(p1, p2) = R\;\alpha\]

&lt;p&gt;With the formula of scalar product, we can find $\alpha$, because:&lt;/p&gt;

\[p1\,.\,p2 = ||p1||\,||p2||\,\cos(\alpha) = R^2 \cos(\alpha)\]

&lt;p&gt;But also, in the cartesian coordinates system, with $( 0, 0, 0 )$ the center of the earth, we have that a point $p = (\text{lat}, \text{long})$ on the surface of the earth has for cartesian coordinates:&lt;/p&gt;

\[p = \begin{pmatrix} R\cos(\text{lat})\cos(\text{long}) \\\ R\cos(\text{lat})\sin(\text{long}) \\\ R\sin(\text{lat}) \end{pmatrix}\]

&lt;p&gt;Indeed, even if it means changing reference points, we can always by symmetry come back to this diagram:&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vSo-qbr70ZR3v_49gXzE7HI6cv0jgPXLEANpuZaNszi0QAL3NLIzjAd34V-s-2nCAtSaiW3AXno0urI/pub?w=529&amp;amp;h=323&quot; alt=&quot;Cartesian coordinates on earth&quot; title=&quot;Cartesian coordinates on earth&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Cartesian coordinates on earth
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Then, we have also:&lt;/p&gt;

\[\begin{align*}
p1\,.\,p2 &amp;amp;= R^2\left(\sin(\text{lat1})\sin(\text{lat2}) + \cos(\text{lat1})\cos(\text{lat2})(\cos(\text{long1})\cos(\text{long2}) + \sin(\text{long1})\sin(\text{long2})\right) \\\
          &amp;amp;= R^2\left(\sin(\text{lat1})\sin(\text{lat2}) + \cos(\text{lat1})\cos(\text{lat2})\cos(\text{long1} - \text{long2})\right)
\end{align*}\]

&lt;p&gt;So:&lt;/p&gt;

\[\cos(\alpha) = \sin(\text{lat1})\sin(\text{lat2}) + \cos(\text{lat1})\cos(\text{lat2})\cos(\text{long1} - \text{long2})\]

&lt;p&gt;By applying the function $\text{arccos}: [-1, 1] \rightarrow [0, \pi]$ the reciprocal bijection of $\cos$ on $[0, \pi]$, we get the smallest center angle $\alpha$, and:&lt;/p&gt;

\[\boxed{ 
  d(p1, p2) = R\,\text{arccos}\big(\sin(\text{lat1})\sin(\text{lat2}) + \cos(\text{lat1})\cos(\text{lat2})\cos(\text{long1} - \text{long2})\big) 
}\]

&lt;p&gt;For a historical reason and numerical computation often the haversine fonction $\text{hav}: \mathbb{R} \rightarrow [0, 1]\quad x \mapsto \sin^2\left(\frac{x}{2}\right)$.&lt;/p&gt;

&lt;p&gt;We have $\cos(\alpha) = 1 - 2\text{hav}(\alpha)$, so:&lt;/p&gt;

\[1 - 2\text{hav}(\alpha) = \sin(\text{lat1})\sin(\text{lat2}) + \cos(\text{lat1})\cos(\text{lat2}) - 2\text{hav}(\text{long1} - \text{long2})\cos(\text{lat1})\cos(\text{lat2})\]

&lt;p&gt;That is to say:&lt;/p&gt;

\[\begin{align*}
\text{hav}(\alpha) &amp;amp;= \dfrac{1 - (\sin(\text{lat1})\sin(\text{lat2}) + \cos(\text{lat1})\cos(\text{lat2}))}{2} + \text{hav}(\text{long1} - \text{long2})\cos(\text{lat1})\cos(\text{lat2}) \\\
                   &amp;amp;= \dfrac{1 - \cos(\text{lat1 - lat2})}{2} + \text{hav}(\text{long1} - \text{long2})\cos(\text{lat1})\cos(\text{lat2}) 
\end{align*}\]

&lt;p&gt;Thus, we get the harvesine relation:&lt;/p&gt;

\[\boxed{ 
  hav(p1, p2) = \text{hav}(\text{lat1} - \text{lat2}) + \text{hav}(\text{long1} - \text{long2})\cos(\text{lat1})\cos(\text{lat2}) 
}\]

&lt;p&gt;Where $hav: \left(\left[-\frac{\pi}{2}, \frac{\pi}{2}\right] \times ]-\pi, \pi]\right)^2 \rightarrow [0, 1]$ is defined by overloading of 
$hav$ on $[0, \pi]$ by a change of variables $hav(p1, p2) = hav(\alpha)$, because the couple $(p1, p2)$ defines a unique $\alpha$ (it is not reciprocal).&lt;/p&gt;

&lt;p&gt;By using $\text{archav}: [0, 1] \rightarrow [0, \pi]$ the reciprocal bijection of $\text{hav}$ on $[0, \pi]$, we have for $\alpha \in [0, \pi]$:&lt;/p&gt;

\[d(p1, p2) = R\,\text{archav}(\text{hav}(\alpha))\]

&lt;p&gt;In addition $\forall x \in [0, 1]$:&lt;/p&gt;

\[\text{archav}(x) = 2\,\text{arcsin}(\sqrt{x})\]

&lt;p&gt;And by putting $y = \text{arcsin}(x)$ and $x = \sin(y)$ with $\tan(y) = \sqrt{\dfrac{\sin^2(y)}{1 - \sin^2(y)}}$ we have for $x \neq 1$:&lt;/p&gt;

\[\text{arcsin}(x) = \text{arctan}\left(\sqrt{\dfrac{x^2}{1 - x^2}}\right)\]

&lt;p&gt;So:&lt;/p&gt;

\[d(p1, p2) = 2\,R\,\text{arctan}\left(\sqrt{\dfrac{\text{hav}(p1, p2)}{1 - \text{hav}(p1, p2)}}\right)\]

&lt;p&gt;In order to have a valid formula for the case where $\text{hav}(p1, p2) = \text{hav}(\alpha) = 1$, that is to say for $\alpha = \pi$, we introduce the function:&lt;/p&gt;

\[\text{atan2}: \mathbb{R}^+ \times \mathbb{R}^+ \backslash \left\{0, 0\right\} \quad (x,y) \mapsto \left\{
    \begin{array}{ll}
        \text{arctan}\left(\frac{x}{y}\right) &amp;amp; \text{if } y &amp;gt; 0 \\\
        \frac{\pi}{2} &amp;amp; \text{if } y = 0
    \end{array}
\right.\]

&lt;p&gt;So:&lt;/p&gt;

\[\boxed{ 
  d(p1,p2) = 2\,R\,\text{atan2}\left( \sqrt{\text{hav}(p1, p2)}, \sqrt{1 - \text{hav}(p1, p2)} \right) 
}\]

&lt;p&gt;We can check that the coherence of the formula where $d$ is well a metric distance, it is a positive function, symetric $d(p1, p2) = d(p2, p1)$, and homogeneous $d(p, p) = 0$ 
respecting the triangle inegality.&lt;/p&gt;

&lt;p&gt;In practice, the radius of the earth is  $R = 6371\,km$, and the latitude and longitude are given often in decimal degree and not in radian.&lt;/p&gt;
</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>GNU privacy guard</title>
   <link href="https://glegoux.com/blog/articles/2020/05/15/gnu-privacy-guard.html"/>
   <updated>2020-05-15T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2020/05/15/gnu-privacy-guard.html</id>
   <content type="html">&lt;p&gt;First, it is important to distinguish: &lt;strong&gt;PGP&lt;/strong&gt; (Pretty Good Privacy), &lt;strong&gt;OpenPGP&lt;/strong&gt; and &lt;strong&gt;GnuPG&lt;/strong&gt; also named &lt;strong&gt;GPG&lt;/strong&gt; (Gnu Privacy Guard).
Phil Zimmerman made up PGP in 1991 as a way for people to communicate without eavesdropping. Going further 
back into the 1990s, there used to be a law in the US that restricted the export of cryptographic technology 
outside the US until 1992 after the World War II. Due to this patent and license around the source code and specification of 
the proprietary product PGP, it was not always practical for international use. That’s why the 
&lt;a href=&quot;https://www.openpgp.org/about&quot;&gt;OpenPGP Working Group&lt;/a&gt; was formed within the Internet Engineering Task Force (IETF) 
to define a free standard protocol OpenPGP inspired by PGP with &lt;a href=&quot;https://www.ietf.org/rfc/rfc4880.txt&quot;&gt;RFC4880&lt;/a&gt; and 
after the end of the US restriction to allow to everyone to implement a solution. In June 2010 Symantec Corporation bought PGP Inc., 
but it is acquired by &lt;a href=&quot;https://www.broadcom.com&quot;&gt;Broadcom Inc&lt;/a&gt; in 2019 that owns a propriety implementation of PGP now. 
&lt;a href=&quot;https://gnupg.org&quot;&gt;GnuPG&lt;/a&gt; is a free implementation of the OpenPGP standard very used in the world.&lt;/p&gt;

&lt;p&gt;GnuPG proposes services as authentication, confidentiality, compression, compatibility and segmentation
with a hybrid cryptosystem combining the efficiency of symmetrical cryptosystem and the convenience of asymmetrical cryptosystem. 
Particularly, you can:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;sign resources (electronic document, Git commit …)&lt;/li&gt;
  &lt;li&gt;encrypt/decrypt resources (email, sms, message, filesystem partition, stored data …)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;References:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://help.github.com/en/github/authenticating-to-github/generating-a-new-gpg-key&quot;&gt;https://help.github.com/en/github/authenticating-to-github/generating-a-new-gpg-key&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.gnupg.org/index.html&quot;&gt;https://www.gnupg.org/index.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://git.gnupg.org/cgi-bin/gitweb.cgi&quot;&gt;https://git.gnupg.org/cgi-bin/gitweb.cgi&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.faqs.org/faqs/pgp-faq/part1/&quot;&gt;http://www.faqs.org/faqs/pgp-faq/part1/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.linuxjournal.com/content/signing-git-commits&quot;&gt;https://www.linuxjournal.com/content/signing-git-commits&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.linode.com/docs/security/encryption/gpg-keys-to-send-encrypted-messages/#more-information&quot;&gt;https://www.linode.com/docs/security/encryption/gpg-keys-to-send-encrypted-messages/#more-information&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Java ecosystem</title>
   <link href="https://glegoux.com/blog/articles/2020/05/04/java-ecosystem.html"/>
   <updated>2020-05-04T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2020/05/04/java-ecosystem.html</id>
   <content type="html">&lt;p&gt;The Java language is initiated by &lt;strong&gt;James Gosling&lt;/strong&gt;, &lt;strong&gt;Mike Sheridan&lt;/strong&gt; and &lt;strong&gt;Patrick Naughton&lt;/strong&gt; is June &lt;strong&gt;1991&lt;/strong&gt;. After several years,
the company &lt;strong&gt;Sun Microsystems&lt;/strong&gt; released the first version of Java. Here its principles:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;It must be simple, object-oriented, and familiar.&lt;/li&gt;
  &lt;li&gt;It must be robust and secure.&lt;/li&gt;
  &lt;li&gt;It must be architecture-neutral and portable.&lt;/li&gt;
  &lt;li&gt;It must execute with high performance.&lt;/li&gt;
  &lt;li&gt;It must be interpreted, threaded, and dynamic.&lt;/li&gt;
&lt;/ol&gt;

&lt;figure title=&quot;Java logo&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2020-05-04-java-ecosystem/images/java-logo.png&quot; title=&quot;Java logo&quot; alt=&quot;Java logo&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Java logo
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;That is to say:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Java is C++ without the guns, clubs and knives.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;James Gosling, one of inventors of Java language&lt;/p&gt;

&lt;p&gt;Java is a &lt;strong&gt;most famous programming language&lt;/strong&gt;, it is in the &lt;strong&gt;top 10&lt;/strong&gt; of the languages 
the most &lt;strong&gt;present on the Internet resources&lt;/strong&gt; and with the highest number of contributors 
respectively with the &lt;a href=&quot;https://www.tiobe.com/tiobe-index/programming-languages-definition&quot;&gt;TIOBE index&lt;/a&gt; 
that counts the search engine hits, and the &lt;a href=&quot;https://octoverse.github.com&quot;&gt;octoverse&lt;/a&gt;
annual report of Github that counts the number of unique contributors of java projects.&lt;/p&gt;

&lt;p&gt;But the mascot of Java is &lt;a href=&quot;https://www.oracle.com/java/duke.html&quot;&gt;Duke&lt;/a&gt; that plays the role of a &lt;em&gt;software agent&lt;/em&gt; 
that performed tasks for the user:&lt;/p&gt;

&lt;figure title=&quot;Duke the Java mascot&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2020-05-04-java-ecosystem/images/duke.png&quot; title=&quot;Duke the Java mascot&quot; alt=&quot;Duke the Java mascot&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Duke the Java mascot
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The best resource about Java is surely the &lt;em&gt;Effective Java&lt;/em&gt; book with its different editions:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Learning the art of programming, like most other disciplines,&lt;br /&gt;
consists of first learning the rules and then learning when to break them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Joshua Bloch, author of Effective Java&lt;/p&gt;

&lt;figure title=&quot;Effective Java book&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2020-05-04-java-ecosystem/images/effective-java-book-cover.jpg&quot; title=&quot;Effective Java book&quot; alt=&quot;Effective Java book&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Effective Java book
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;But Sun Microsystems had an issue a business model, and &lt;strong&gt;Oracle acquired Java in January 2010&lt;/strong&gt;. 
Now the project has 2 main versions, an &lt;strong&gt;open source version with OpenJDK&lt;/strong&gt; and &lt;strong&gt;commercial version with Oracle JDK&lt;/strong&gt;.
These both Java Development Kit are available respectively at &lt;a href=&quot;https://openjdk.java.net&quot;&gt;https://openjdk.java.net&lt;/a&gt; and &lt;a href=&quot;https://www.oracle.com/java&quot;&gt;https://www.oracle.com/java&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are &lt;strong&gt;several JDK vendors among AdoptOpenJDK, Amazon Correto, SAP, Red Hat, Azul, IBM&lt;/strong&gt;. 
The most of the vendors have a project based on OpenJDK. The Java Community Process (JCP) 
provides a &lt;strong&gt;Technology Compatibility Kit&lt;/strong&gt; (TCK) to certify whether a JDK build meets 
the Java standards. Once a build passes the TCK, it can be referred to as &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Java SE compatible&lt;/code&gt;.
The certification process requires a commercial license from Oracle.&lt;/p&gt;

&lt;p&gt;You can see, what is the usage of the Java ecosystem in terms of IDE, Java vendors, Java version, Java 
with the Snyk company survey, or the Jrebel company survey.&lt;/p&gt;

&lt;p&gt;To follow the evolution of the ecosystem, you can subscribe to the Java magazine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://blogs.oracle.com/java-platform-group/the-arrival-of-java-14&quot;&gt;https://blogs.oracle.com/java-platform-group/the-arrival-of-java-14&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dzone.com/articles/an-overview-on-jdk-vendors&quot;&gt;https://dzone.com/articles/an-overview-on-jdk-vendors&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.overops.com/java-wish-list-the-top-differences-between-java-scala-groovy-clojure-and-kotlin&quot;&gt;https://blog.overops.com/java-wish-list-the-top-differences-between-java-scala-groovy-clojure-and-kotlin&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://mreinhold.org/blog/forward-faster&quot;&gt;https://mreinhold.org/blog/forward-faster&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.jrebel.com/blog/2020-java-technology-report&quot;&gt;https://www.jrebel.com/blog/2020-java-technology-report&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blogs.oracle.com/java-platform-group/faster-and-easier-use-and-redistribution-of-java-se&quot;&gt;https://blogs.oracle.com/java-platform-group/faster-and-easier-use-and-redistribution-of-java-se&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.developpez.com/actu/159181/Oracle-annonce-des-changements-pour-Java-SE-deux-versions-par-an-licence-GPL-des-fonctionnalites-commerciales-du-JDK-d-Oracle-en-open-source&quot;&gt;https://www.developpez.com/actu/159181/Oracle-annonce-des-changements-pour-Java-SE-deux-versions-par-an-licence-GPL-des-fonctionnalites-commerciales-du-JDK-d-Oracle-en-open-source&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.developpez.com/actu/185779/Java-8-ne-va-plus-recevoir-de-mises-a-jour-et-correctifs-de-securite-a-partir-de-septembre-a-moins-de-passer-a-un-support-commercial&quot;&gt;https://www.developpez.com/actu/185779/Java-8-ne-va-plus-recevoir-de-mises-a-jour-et-correctifs-de-securite-a-partir-de-septembre-a-moins-de-passer-a-un-support-commercial&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://tekcollab.imdeo.com/java-devient-payant&quot;&gt;https://tekcollab.imdeo.com/java-devient-payant&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.oracle.com/java/technologies/java-se-support-roadmap.html&quot;&gt;https://www.oracle.com/java/technologies/java-se-support-roadmap.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://oss.oracle.com&quot;&gt;https://oss.oracle.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dzone.com/articles/difference-between-jdk-vs-jre-vs-jvm&quot;&gt;https://dzone.com/articles/difference-between-jdk-vs-jre-vs-jvm&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.scala-lang.org/overviews/jdk-compatibility/overview.html&quot;&gt;https://docs.scala-lang.org/overviews/jdk-compatibility/overview.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/search?l=&amp;amp;o=desc&amp;amp;q=stars%3A%22%3E+1000%22+language%3AJava&amp;amp;s=stars&amp;amp;type=Repositories&quot;&gt;https://github.com/search?l=&amp;amp;o=desc&amp;amp;q=stars%3A%22%3E+1000%22+language%3AJava&amp;amp;s=stars&amp;amp;type=Repositories&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Development environment</title>
   <link href="https://glegoux.com/blog/articles/2020/03/04/development-environment.html"/>
   <updated>2020-03-04T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2020/03/04/development-environment.html</id>
   <content type="html">&lt;p&gt;It is a good practice to isolate the used technologies for your development environment, because:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Your operating system could already have an installed version of this technology for its own needs, 
and you don’t want touch that for not break that.&lt;/li&gt;
  &lt;li&gt;Your development environment should be close to your production environment, that is not necessary the same as your local environment&lt;/li&gt;
  &lt;li&gt;Your projects use certainly several versions of the same technology, you don’t want to have conflicts between them&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s why you need to have a tool in order to build and isolate your environment development, and to can switch between 
these different environment.&lt;/p&gt;

&lt;p&gt;Of course, it depends on which kind of projects you work. You don’t need to have always a full isolated environment by setting up 
another physical machine (bare metal), a virtual machine or a container. Because, the computer ecosystem is composed of layers.&lt;/p&gt;

&lt;p&gt;If you use only a high-level layer for writing applications in &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Python&lt;/code&gt;, &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Java&lt;/code&gt; or &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Ruby&lt;/code&gt; …, you can use a tool of version management 
as &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Pyenv&lt;/code&gt;,  &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Sdkman&lt;/code&gt; and &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Rvm&lt;/code&gt;, it is sufficient. Like that you can use your project language in the correct version for your project, 
directly on your host machine that you be on Windows, WSL, macOS, or a Linux distribution and regardless of the environment ecosystem … 
because these languages are cross platform. You need also that related dependencies libraries be installed in dedicated locations, 
but these tools do that as well.&lt;/p&gt;

&lt;p&gt;If you need to have other services like a database, a email service, a message brokers, machine learning platform, perhaps you can
use a pre-built staging environment for each service, running on your own machine, or on a cluster with the cloud computing paradigme if
the services are too complex to set up or too greedy in resources. Else often, you can use mock-ups for each service respecting
the contract of interface.&lt;/p&gt;

&lt;p&gt;This problematic is the same for the test environment, or the pre-production environment and prod environment. In addition, for security 
reason, these environments should be isolated and partitioned with a segregation of permission. It is another subject.&lt;/p&gt;
</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Gafa vs Batx</title>
   <link href="https://glegoux.com/blog/articles/2019/11/29/gafa-vs-batx.html"/>
   <updated>2019-11-29T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2019/11/29/gafa-vs-batx.html</id>
   <content type="html">&lt;p&gt;The business world is split into 3 regions with the acronyms: &lt;strong&gt;AMER, EMEA, APAC&lt;/strong&gt;. But the web and 
computer worldwide market is bi-polaire due to the &lt;strong&gt;Internet censorship in China&lt;/strong&gt;.&lt;/p&gt;

&lt;figure title=&quot;Business regions and computer technology areas&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2019-11-29-gafa-vs-batx/images/business-area.png&quot; title=&quot;Business regions and computer technology areas&quot; alt=&quot;Business regions and computer technology areas&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Business regions and computer technology areas
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;So the behaviours of consumers are different according to they are in China or not. This Oligopoly 
constraints the chinese inhabitants to use the digital chinese services, or to be in the illegality 
by using a Virtual &lt;strong&gt;Network Private&lt;/strong&gt; (VPN) to use other blacklisted services. So chinese government 
controls the chinese digital market with its own private companies.&lt;/p&gt;

&lt;p&gt;In China we have a gang of four with &lt;strong&gt;Baidu, Alibaba, Tencent, Xiaomi&lt;/strong&gt; (BATX), and for the rest of 
the world there is the big four tech companies &lt;strong&gt;Google, Apple, Facebook, Amazon&lt;/strong&gt; (GAFA):&lt;/p&gt;

&lt;figure title=&quot;BATX &amp;amp; GAFA&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2019-11-29-gafa-vs-batx/images/batx-gafa.png&quot; title=&quot;BATX &amp;amp; GAFA&quot; alt=&quot;BATX &amp;amp; GAFA&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    BATX &amp;amp; GAFA
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Hence, this market has really 2 groups of companies on a B2B or/and B2C position in function of geolocation.
&lt;strong&gt;Baidu, Alibaba, Tencent, Xiaomi&lt;/strong&gt; for the &lt;strong&gt;APAC hub&lt;/strong&gt; mainly where the China has a central role in terms 
of economical weight, and &lt;strong&gt;Google, Apple, Facebook, Amazon&lt;/strong&gt; for the &lt;strong&gt;AMER and EMEA hubs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On the &lt;strong&gt;hardware side&lt;/strong&gt;, Apple and Xiaomi control the &lt;strong&gt;market of smartphones&lt;/strong&gt;, to allow an end user to 
enter in the digital consummation. On the &lt;strong&gt;software side&lt;/strong&gt;, your digital experience consists of 
searching with engine of Google or Baidu, &lt;strong&gt;buying&lt;/strong&gt; with e-commerce platform of Amazon or Alibaba, and 
&lt;strong&gt;communicating&lt;/strong&gt; with social network of Tencent or Facebook, that have respectively instant messaging 
Messenger &amp;amp; Whatsapp and WeChat. For &lt;strong&gt;spending money online&lt;/strong&gt;, WeChat is in competition with Apple Pay 
and Google Pay.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;cloud computing and hosting&lt;/strong&gt; is managed by Google Cloud Platform, or Amazon Web Service (AWS), 
and in China there is Alibaba Cloud, also known as Aliyun.&lt;/p&gt;

&lt;p&gt;After the cloud infrastructure, and the web services, each main actor wants to control the markets 
of &lt;strong&gt;Artificial Intelligence&lt;/strong&gt; (AI) and of &lt;strong&gt;Internet of Things&lt;/strong&gt; (IoT) what compose the new business 
opportunities. Of course a lot of companies are forgotten in the artificial classification BATX 
vs GAFA as (without quoting all other ones). Here are some of them with TikTok too now:&lt;/p&gt;

&lt;figure title=&quot;Other big companies&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2019-11-29-gafa-vs-batx/images/other-companies.png&quot; title=&quot;Other big companies&quot; alt=&quot;Other big companies&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Other big companies
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Trace a request path</title>
   <link href="https://glegoux.com/blog/articles/2019/07/14/trace-a-request-path.html"/>
   <updated>2019-07-14T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2019/07/14/trace-a-request-path.html</id>
   <content type="html">&lt;p&gt;What are the used path of HTTP request generated by your web browser to load a web page between your computer and a server web? I suppose each time DNS resolution is done, that is to say the web browser knows IP server.&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vT8X8g2uXuTLb3lruhcD17wdroEZaMSFRbiKbMKpdYNKTvkGnRgTs80T7L4SS1fE_-68ofjmjim0q0-/pub?w=855&amp;amp;h=364&quot; alt=&quot;Request path from your laptop to web server&quot; title=&quot;Request path from your laptop to web server&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Request path from your laptop to web server
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Internet is a network of routers. When your web browser is sending one HTTP request your computer uses by default the destination &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;0.0.0.0&lt;/code&gt; if no one sub-network matches with your original destination IP address in its route table.&lt;/p&gt;

&lt;div class=&quot;language-terminal 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;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;route &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.254   0.0.0.0         UG    600    0        0 wlp6s0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here the gateway &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;192.168.1.254&lt;/code&gt;  is my Internet box related to network interface &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;wlp6s0&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-terminal 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;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;nslookup 192.168.1.254
&lt;span class=&quot;go&quot;&gt;Server:		127.0.1.1
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;Address:	127.0.1.1#&lt;/span&gt;53
&lt;span class=&quot;go&quot;&gt;name = bbox.lan.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Your request is sent to box of your Internet Service Provider (ISP), for me it is a French ISP: Bouygues Telecom. Leaving your Local Area Network (LAN) to the Wide Area Network (WAN) of Internet, thanks to  Network Address Translation  (NAT), your box replaces IP address source in the header of your HTTP request (equals to your private IP, see &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;ifconfig wlp6s0&lt;/code&gt;) by its public IP address (see &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;dig +short myip.opendns.com @resolver1.opendns.com&lt;/code&gt;), and keeps in memory this matching only for this request in order to it comes from your computer by doing reverse translation.&lt;/p&gt;

&lt;p&gt;The Time to live (TTL) of your request allows to know how many maximally your request can cross routers before arriving at destination. It prevents infinite cycle of routers in the network, by default a value of 64 is recommended depending of diameter of Internet. By modifying this value from 1 to N, you can get the IP address of each router on the path of your request: it will be the IP source of the response of your request HTTP.&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vTKqD-P7RBe5bT7jx4i7wOvMQtp3hNgVZchWR8eM3KnJ7Z-bsgBwKYqPfBBW2ABp8zel6wJ6NbuFfcA/pub?w=855&amp;amp;h=364&quot; alt=&quot;Time to Live (TTL)&quot; title=&quot;Time to Live (TTL)&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Time to Live (TTL)
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;For example, you can get TTL minimum by successive ping commands, see details in &lt;a href=&quot;https://github.com/glegoux/glegoux.com/blob/master/articles/6PmiK7b/n_routers.sh&quot;&gt;n_routers.sh&lt;/a&gt; bash script. Each router must decrement TTL value and if TTL is 0, it refuses to transmit message. The minimum TTL is length path in the network to reach the server (by excluding source machine for number of nodes or is directly number of edges). Here one time to live of 4 is insufficient to reach glegoux.com from my machine location:&lt;/p&gt;

&lt;div class=&quot;language-terminal 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;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;ping &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; 1 &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; 4 glegoux.com
&lt;span class=&quot;go&quot;&gt;PING glegoux.com (195.164.48.181) 56(84) bytes of data.
From 10.125.135.205 icmp_seq=1 Time to live exceeded

--- glegoux.com ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is valid for outward network path your TTL must be sufficient, you can see your current TTL &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;cat /proc/sys/net/ipv4/ip_default_ttl&lt;/code&gt; or with &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;ping -c 1 localhost&lt;/code&gt; (for Linux default value is 64), and change that without persistence &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;sudo sysctl net.ipv4.ip_default_ttl=128&lt;/code&gt;. Targeted server must have also sufficient TTL for return network path, this value is decremented (until value 56 here, but we don’t know initial value a priori):&lt;/p&gt;

&lt;div class=&quot;language-terminal 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;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;ping &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; 1 glegoux.com
&lt;span class=&quot;go&quot;&gt;PING glegoux.com (195.164.48.181) 56(84) bytes of data.
64 bytes from 10.125.135.205.rev.poneytelecom.eu (10.125.135.205): icmp_seq=1 ttl=56 time=13.8 ms

--- glegoux.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 13.821/13.821/13.821/0.000 ms
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;While ping command uses ICMP protocol, the system command &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;traceroute&lt;/code&gt; realizes that directly with TCP protocol more easily. If there are stars instead of one IP address it means router refused to give its identity.&lt;/p&gt;

&lt;p&gt;There is no rule to guarantee that outward path and return path are identical. This is sometimes useful to get traceroute from both ends of your network. Here I am considering only outward path.&lt;/p&gt;

&lt;p&gt;By combining that with free IP locator like :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://ip-api.com&quot;&gt;http://ip-api.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://ipinfo.io&quot;&gt;https://ipinfo.io&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://getcitydetails.geobytes.com&quot;&gt;http://getcitydetails.geobytes.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can locate request path via Application Programming Interface (API) with the usage of pre-computed databases of geolocalisation of these free IP locators.&lt;/p&gt;

&lt;p&gt;It is important to keep in mind that IP locator is not 100% accurate, only 95% for the best ones. And behind one IP address  can hide a web proxy and a virtual private cluster preventing to locate really the destination. Thanks to Regional Internet Registry (RIR) and static address IP of  ISPs, IP locators can know the location of some IP addresses easily.&lt;/p&gt;

&lt;figure title=&quot;Map of Regional Internet Registry&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2019-07-14-trace-a-request-path/images/rir.png&quot; title=&quot;Map of Regional Internet Registry&quot; alt=&quot;Map of Regional Internet Registry&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Map of Regional Internet Registry
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;But an constant update and smart analysis of the network is required to locate any IP address (IPv4 or IPv6), because of dynamic IP addresses and moving connected objects for instance in the Internet of Things (IoT) or mobile networks. In addition, this location could not be too precised to respect private life of each Internet surfer, even if this one shares its location via its web browser.&lt;/p&gt;

&lt;p&gt;With this &lt;a href=&quot;https://github.com/glegoux/articles-glegoux-com/tree/master/articles/2019-07-14-geo-location-of-request-path/code&quot;&gt;Proof of Concept (PoC)&lt;/a&gt;, you can run &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;get_route.sh glegoux.com&lt;/code&gt; to get IP locations in csv file &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;route.csv&lt;/code&gt; and see the result via Google Maps (just &lt;a href=&quot;https://developers.google.com/maps/documentation/javascript/get-api-key&quot;&gt;get your own API token&lt;/a&gt;) and a python web server by executing &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;httpserver.sh&lt;/code&gt; and by visualizing &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;index.html&lt;/code&gt; in your favorite web browser.&lt;/p&gt;

&lt;figure title=&quot;Geo-location of request path from Paris to glegoux.com&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2019-07-14-trace-a-request-path/images/map.png&quot; title=&quot;Geo-location of request path from Paris to glegoux.com&quot; alt=&quot;Geo-location of request path from Paris to glegoux.com&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Geo-location of request path from Paris to glegoux.com
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Java champion</title>
   <link href="https://glegoux.com/blog/articles/2019/05/24/java-champion.html"/>
   <updated>2019-05-24T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2019/05/24/java-champion.html</id>
   <content type="html">&lt;p&gt;Java champion is ambassador of Java ecosystem for the world! It is enough hard to become Java champion.&lt;/p&gt;

&lt;p&gt;Here qualities of Java champion:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;leader&lt;/li&gt;
  &lt;li&gt;technical luminary&lt;/li&gt;
  &lt;li&gt;independent-minded and credible&lt;/li&gt;
  &lt;li&gt;involved in Java technology&lt;/li&gt;
  &lt;li&gt;influencer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Currently in the world, there are 282 Java champions in 2019 knowing that in 2012 there are more that 10 millions of Java developers. That is to say about 1 per 30 thousands of Java developers. Here you can see repartition of Java champions in the world:&lt;/p&gt;

&lt;figure&gt;
    &lt;div id=&quot;java-champions&quot;&gt;&lt;/div&gt;
    &lt;figcaption&gt;Java champions in the world (Source: https://github.com/aalmiray/java-champions)&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;You can write to Java champions:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;mailto://javachampions@groups.io&quot;&gt;javachampions@groups.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://apex.oracle.com/champions&quot;&gt;Find a Java Champion&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://developer.oracle.com/javachampions&quot;&gt;Who are Java Champions?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;script type=&quot;text/javascript&quot; src=&quot;https://www.gstatic.com/charts/loader.js&quot;&gt;&lt;/script&gt;

&lt;script type=&quot;text/javascript&quot;&gt;
jQuery(document).ready(function () {
    google.charts.load(&apos;current&apos;, {
        &apos;packages&apos;:[&apos;geochart&apos;],
        // Note: you will need to get a mapsApiKey for your project.
        // See: https://developers.google.com/chart/interactive/docs/basic_load_libs#load-settings
        &apos;mapsApiKey&apos;: &apos;AIzaSyD-9tSrke72PouQMnMX-a7eZSW0jkFMBWY&apos;
    });
    google.charts.setOnLoadCallback(drawRegionsMap);
    
    function drawRegionsMap() {
        var data = google.visualization.arrayToDataTable([
            [&apos;Country&apos;, &apos;Number&apos;],
            [&apos;Armenia&apos;,1],
            [&apos;Australia&apos;,1],
            [&apos;Australia/USA&apos;,1],
            [&apos;Austria&apos;,3],
            [&apos;Belgium&apos;,5],
            [&apos;Brazil&apos;,14],
            [&apos;Bulgaria&apos;,2],
            [&apos;Canada&apos;,4],
            [&apos;China&apos;,2],
            [&apos;Colombia&apos;,2],
            [&apos;Denmark&apos;,2],
            [&apos;Ecuador&apos;,1],
            [&apos;Egypt&apos;,2],
            [&apos;Estonia&apos;,2],
            [&apos;France&apos;,12],
            [&apos;Germany&apos;,25],
            [&apos;Germany/Switzerland&apos;,1],
            [&apos;Greece&apos;,3],
            [&apos;Guatemala&apos;,2],
            [&apos;Hungary&apos;,2],
            [&apos;India&apos;,3],
            [&apos;Indonesia&apos;,1],
            [&apos;Ireland&apos;,1],
            [&apos;Italy&apos;,7],
            [&apos;Japan&apos;,5],
            [&apos;Malaysia&apos;,1],
            [&apos;Mexico&apos;,2],
            [&apos;Mexico/Switzerland&apos;,2],
            [&apos;Morocco&apos;,1],
            [&apos;New Zealand&apos;,1],
            [&apos;Norway&apos;,4],
            [&apos;Perú&apos;,1],
            [&apos;Poland&apos;,4],
            [&apos;Portugal&apos;,1],
            [&apos;Romania&apos;,2],
            [&apos;Russia&apos;,4],
            [&apos;Scotland&apos;,2],
            [&apos;Serbia&apos;,1],
            [&apos;Slovenia&apos;,1],
            [&apos;South Africa&apos;,1],
            [&apos;South Korea&apos;,1],
            [&apos;Spain&apos;,4],
            [&apos;Sweden&apos;,5],
            [&apos;Switzerland&apos;,3],
            [&apos;Netherlands&apos;,8],
            [&apos;Turkey&apos;,5],
            [&apos;United States&apos;,77],
            [&apos;USA/Germany&apos;,1],
            [&apos;United Kingdom&apos;,23]
        ]);
    
        var options = {
            colorAxis: {colors: [&apos;#e6f7ff&apos;, &apos;#00334d&apos;]},
            width: $(&apos;#content&apos;).width(), // responsive
            legend: false
        };
        
        var chart = new google.visualization.GeoChart(document.getElementById(&apos;java-champions&apos;));
        
         chart.draw(data, options);
    }
    
    // responsive
    var width = $(window).width();
    $(window).resize(function(){
        if ($(this).width() != width) {
            width = $(this).width();
            drawRegionsMap();
        }
    });
});
&lt;/script&gt;

</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Lighthouse</title>
   <link href="https://glegoux.com/blog/articles/2019/04/01/lighthouse.html"/>
   <updated>2019-04-01T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2019/04/01/lighthouse.html</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/GoogleChrome/lighthouse&quot;&gt;Lighthouse&lt;/a&gt; is an automated tool for improving the quality of web pages by auditing and analyzing your web pages and give you metrics and advices. You can run it against any web page, public or requiring authentication. It creates reports for performance, accessibility, progressive web apps, and more. It is an &lt;a href=&quot;https://github.com/GoogleChrome/lighthouse&quot;&gt;open-source project&lt;/a&gt; written in Javascript.&lt;/p&gt;

&lt;figure title=&quot;Logo of Lighthouse&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2019-04-01-lighthouse/images/lighthouse-logo.png&quot; title=&quot;Logo of Lighthouse&quot; alt=&quot;Logo of Lighthouse&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Logo of Lighthouse
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;You can run Lighthouse as a &lt;a href=&quot;https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk?hl=en&quot;&gt;Chrome Extension&lt;/a&gt;, from the command line, or as a &lt;a href=&quot;https://www.npmjs.com/package/lighthouse&quot;&gt;Node module&lt;/a&gt;. You give Lighthouse a URL to audit, it runs a series of audits against the page, and then it generates a report on how well the page did. From there, use the failing audits as indicators on how to improve the page. Each audit has a reference doc explaining why the audit is important, as well as how to fix it.&lt;/p&gt;

&lt;h1 id=&quot;lighthouse-reports&quot;&gt;Lighthouse reports&lt;/h1&gt;

&lt;p&gt;The reports are divided into 4 categories:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Progressive Web App&lt;/strong&gt;: tests if your app is corect progressive web app.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: measures if the page is loaded quickly.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Accessibility&lt;/strong&gt;: checks if the content of your page is accessible.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Best Practices&lt;/strong&gt;: checks if good practices are applied.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal is to have a score of 100 for each category and for each web page of your website:&lt;/p&gt;

&lt;figure title=&quot;Lighthouse scores by report category&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2019-04-01-lighthouse/images/scores.png&quot; title=&quot;Lighthouse scores by report category&quot; alt=&quot;Lighthouse scores by report category&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Lighthouse scores by report category
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;You can export report under HTML or JSON format, then import these format or see directly report due to &lt;a href=&quot;https://googlechrome.github.io/lighthouse/viewer/&quot;&gt;Lighthouse Viewer&lt;/a&gt; (online version). You can install on-premises version directly from the &lt;a href=&quot;https://github.com/GoogleChrome/lighthouse/tree/master/lighthouse-viewer&quot;&gt;Git repository if Lighthouse Viewer&lt;/a&gt; .&lt;/p&gt;

&lt;figure title=&quot;Export, import and view Lighthouse report&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2019-04-01-lighthouse/images/export-import-view.jpg&quot; title=&quot;Export, import and view Lighthouse report&quot; alt=&quot;Export, import and view Lighthouse report&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Export, import and view Lighthouse report
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h1 id=&quot;lighthouse-architecture&quot;&gt;Lighthouse architecture&lt;/h1&gt;

&lt;p&gt;The workflow of Lighthouse core is described by the following chart:&lt;/p&gt;

&lt;figure title=&quot;Architecture of Lighthouse Core&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2019-04-01-lighthouse/images/architecture.jpg&quot; title=&quot;Architecture of Lighthouse Core&quot; alt=&quot;Architecture of Lighthouse Core&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Architecture of Lighthouse Core
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/GoogleChrome/lighthouse/blob/master/docs/architecture.md&quot;&gt;See details of the architecture&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The project &lt;a href=&quot;https://github.com/GoogleChrome/lighthouse&quot;&gt;Lighthouse&lt;/a&gt; has 5 main components:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;lighthouse-cli&lt;/strong&gt;: allows to call lighthouse services from command line.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;lighthouse-core&lt;/strong&gt;: allows to generate report to measure the quality of your app at some urls.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;lighthouse-extension&lt;/strong&gt;: allows to call lighthouse services from an Google Chrome extension.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;lighthouse-logger&lt;/strong&gt;: allows common logs.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;lighthouse-viewer&lt;/strong&gt;: allows to see report in your web browser or to import reports under JSON or HTML format.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1 id=&quot;lighthouse-installation&quot;&gt;Lighthouse installation&lt;/h1&gt;

&lt;p&gt;Before installing &lt;a href=&quot;https://github.com/GoogleChrome/lighthouse&quot;&gt;Lighthouse&lt;/a&gt;, we must have and check the versions of your tools:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://chromereleases.googleblog.com&quot;&gt;Google Chrome&lt;/a&gt; : &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;google-chrome --version&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/nodejs/node&quot;&gt;Node&lt;/a&gt; : &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;node --version&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/npm/cli&quot;&gt;NPM&lt;/a&gt; : &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;npm --version&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the recent versions of lighthouse, you can use &lt;a href=&quot;https://www.google.com/chrome/browser/canary.html&quot;&gt;Canary&lt;/a&gt; version for Google Chrome.&lt;/p&gt;

&lt;figure title=&quot;Google Chrome, Chromium and Canary version&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2019-04-01-lighthouse/images/chrome-version.jpg&quot; title=&quot;Google Chrome, Chromium and Canary version&quot; alt=&quot;Google Chrome, Chromium and Canary version&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Google Chrome, Chromium and Canary version
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Reminder you in a nutshell that &lt;a href=&quot;https://www.google.com/chrome/browser&quot;&gt;Google Chrome&lt;/a&gt; is the &lt;a href=&quot;https://github.com/chromium/chromium&quot;&gt;Chromium&lt;/a&gt; open source project built, packaged, 
and distributed by Google. You can see a few &lt;a href=&quot;https://chromium.googlesource.com/chromium/src/+/master/docs/chromium_browser_vs_google_chrome.md&quot;&gt;differences&lt;/a&gt; . 
It has &lt;a href=&quot;https://www.chromium.org/getting-involved/dev-channel&quot;&gt;4 versions&lt;/a&gt; Stable, Beta, Dev, Canary for MAC, Windows and Linux for desktops and Android, iOS for smart phones and tablets.&lt;/p&gt;

&lt;h1 id=&quot;example&quot;&gt;Example&lt;/h1&gt;

&lt;p&gt;For example, I tested Lighthouse on this blog. Suppose that you have this file &lt;strong&gt;urls.txt&lt;/strong&gt; containing one URL per line:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;https://glegoux.com/
https://glegoux.com/blog/
https://glegoux.com/blog/articles/
https://glegoux.com/about/
https://glegoux.com/contact/
https://glegoux.com/contact/email/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Run this bash script to get one report by url:&lt;/p&gt;

&lt;div class=&quot;language-bash 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;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0
&lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;url &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat &lt;/span&gt;urls.txt&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do
  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;--&quot;&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;tee&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt; matching_url_report.txt
  &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;--&quot;&lt;/span&gt;
  lighthouse &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--output&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;json &lt;span class=&quot;nt&quot;&gt;--output-path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;report-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.json&quot;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;$((&lt;/span&gt;i++&lt;span class=&quot;k&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then run this python script &lt;strong&gt;lighthouse.py&lt;/strong&gt;:&lt;/p&gt;

&lt;div class=&quot;language-terminal 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;go&quot;&gt;python3 lighthouse.py urls.txt reports.csv
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/glegoux/articles-glegoux-com/tree/master/articles/2019-04-01-lighthouse/code&quot;&gt;See code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You get this csv file &lt;strong&gt;reports.csv&lt;/strong&gt;. Visualize with &lt;strong&gt;matplotlib&lt;/strong&gt; library:&lt;/p&gt;

&lt;figure title=&quot; Charts of scores for a set of URLs&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2019-04-01-lighthouse/images/plot_scores.png&quot; title=&quot; Charts of scores for a set of URLs&quot; alt=&quot; Charts of scores for a set of URLs&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
     Charts of scores for a set of URLs
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;url&lt;/th&gt;
      &lt;th&gt;date&lt;/th&gt;
      &lt;th&gt;pwa&lt;/th&gt;
      &lt;th&gt;performance&lt;/th&gt;
      &lt;th&gt;accessibility&lt;/th&gt;
      &lt;th&gt;best-practices&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;https://glegoux.com/projects/&lt;/td&gt;
      &lt;td&gt;2017-08-17&lt;/td&gt;
      &lt;td&gt;45.45&lt;/td&gt;
      &lt;td&gt;46.12&lt;/td&gt;
      &lt;td&gt;91.43&lt;/td&gt;
      &lt;td&gt;69.23&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;https://glegoux.com/blog/&lt;/td&gt;
      &lt;td&gt;2017-08-17&lt;/td&gt;
      &lt;td&gt;45.45&lt;/td&gt;
      &lt;td&gt;48.71&lt;/td&gt;
      &lt;td&gt;91.43&lt;/td&gt;
      &lt;td&gt;69.23&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;https://glegoux.com/home/&lt;/td&gt;
      &lt;td&gt;2017-08-17&lt;/td&gt;
      &lt;td&gt;36.36&lt;/td&gt;
      &lt;td&gt;36.53&lt;/td&gt;
      &lt;td&gt;88.57&lt;/td&gt;
      &lt;td&gt;69.23&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;https://glegoux.com/snippets/&lt;/td&gt;
      &lt;td&gt;2017-08-17&lt;/td&gt;
      &lt;td&gt;45.45&lt;/td&gt;
      &lt;td&gt;40.88&lt;/td&gt;
      &lt;td&gt;91.43&lt;/td&gt;
      &lt;td&gt;61.54&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;https://glegoux.com/articles/&lt;/td&gt;
      &lt;td&gt;2017-08-17&lt;/td&gt;
      &lt;td&gt;45.45&lt;/td&gt;
      &lt;td&gt;46.12&lt;/td&gt;
      &lt;td&gt;88.57&lt;/td&gt;
      &lt;td&gt;69.23&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;https://glegoux.com/about/&lt;/td&gt;
      &lt;td&gt;2017-08-17&lt;/td&gt;
      &lt;td&gt;36.36&lt;/td&gt;
      &lt;td&gt;40.18&lt;/td&gt;
      &lt;td&gt;88.57&lt;/td&gt;
      &lt;td&gt;69.23&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://developers.google.com/web/tools/lighthouse&quot;&gt;User Documentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/GoogleChrome/lighthouse&quot;&gt;Lighthouse Open Source Code&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk?hl=en&quot;&gt;Lighthouse as Google Chrome Extension&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/lighthouse&quot;&gt;Lighthouse as NPM Javascript module&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Kerberos in 5 minutes</title>
   <link href="https://glegoux.com/blog/articles/2019/03/23/kerberos-in-5-minutes.html"/>
   <updated>2019-03-23T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2019/03/23/kerberos-in-5-minutes.html</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.kerberos.org/&quot;&gt;Kerberos&lt;/a&gt; is a protocol of communication to guarantee a part of the security of your information infrastructure. 
Among the key concepts of security of the CIA triad: Confidentiality, Integrity, and Availability. Kerberos allows setting up 
communications with confidentiality, integrity and non-repudiation, it is an &lt;strong&gt;Authentication and Authorization System&lt;/strong&gt; (AAS), although
the step of authorization is very limited, it is essentially an authentication system.&lt;/p&gt;

&lt;p&gt;This article is an introduction to Kerberos ecosystem. It can be interesting for a &lt;strong&gt;manager&lt;/strong&gt; to understand key principles of 
Kerberos, a &lt;strong&gt;non-technical person&lt;/strong&gt; to have a overview of this technology, or for &lt;strong&gt;technical person&lt;/strong&gt; particularly with 
&lt;strong&gt;DevOps&lt;/strong&gt; skills to increase action field and go further if necessary.&lt;/p&gt;

&lt;h1 id=&quot;what-is-kerberos&quot;&gt;What is Kerberos?&lt;/h1&gt;

&lt;p&gt;The goal of Kerberos is to secure a communication channel over UDP and TCP by proving mutually the identity of each entity:
transmitter and receiver. Kerberos can also encrypted the communication by exchanging session key securely.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Kerberos allows to secure communications on untrusted networks but where each node is trusted&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Massachusetts Institute of Technology (MIT)&lt;/p&gt;

&lt;p&gt;Kerberos is built by design from an architecture based on the &lt;strong&gt;symmetric key cryptography&lt;/strong&gt; 
to authenticate, and to encrypt communication. It requires a trusted third party to guarantee a &lt;strong&gt;mutual authentication&lt;/strong&gt; 
with a system of secrets and renewable tickets.&lt;/p&gt;

&lt;p&gt;Kerberos’ name comes from Greek mythology, the three-headed guard dog of Hades.This technology is invented at MIT in the 1980s, became an 
&lt;strong&gt;IETF Standard&lt;/strong&gt; in 1993. United States governement classified &lt;a href=&quot;https://en.wikipedia.org/wiki/Kerberos_(protocol)&quot;&gt;Kerberos protocol&lt;/a&gt; as 
“Auxiliary Military Equipment” and banned its export until 2000. It continues being used largely today.
The important Requests for Comments (RFC) to understand Kerberos are &lt;a href=&quot;https://www.ietf.org/rfc/rfc4120.txt&quot;&gt;rfc4120&lt;/a&gt; and 
&lt;a href=&quot;https://www.ietf.org/rfc/rfc6649.txt&quot;&gt;rfc6649&lt;/a&gt;, see &lt;a href=&quot;https://datatracker.ietf.org/doc/search/?name=Kerberos&amp;amp;sort=&amp;amp;rfcs=on&quot;&gt;all Kerberos RFCs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;MIT Kerberos Consortium&lt;/strong&gt; ensures development and lasting quality of the Kerberos project since 2007 with past and present
sponsors of Apple, Google, Oracle, Stanford University, Microsoft … but less active now.&lt;/p&gt;

&lt;p&gt;Kerberos is a very used in the &lt;strong&gt;Hadoop ecosystem&lt;/strong&gt; to secure a environment &lt;strong&gt;Big Data&lt;/strong&gt; for Spark, Hadoop YARN, 
Hadoop Mapreduce, or Hadoop Distributed File System…  It is used by lot of companies as a &lt;strong&gt;Single Sign On solution at large&lt;/strong&gt;
to access to web UIs/APIs, databases, services, servers with SSH, or your local system login of your workstation and not only web
HTTP applications, for any operating system. But it is also famous in the Microsoft world by the Active Directory cornerstone of 
your clusters of Windows servers.&lt;/p&gt;

&lt;p&gt;The current widespread implementations are &lt;a href=&quot;https://web.mit.edu/kerberos/&quot;&gt;MIT Kerberos&lt;/a&gt;, &lt;a href=&quot;https://github.com/heimdal/heimdal&quot;&gt;Heimdal&lt;/a&gt;, 
and &lt;a href=&quot;wikipedia.org/wiki/Active_Directory&quot;&gt;Active Directory&lt;/a&gt;. These are native Kerberos implementations respectively 
for &lt;strong&gt;Linux&lt;/strong&gt;, &lt;strong&gt;macOS&lt;/strong&gt;, and &lt;strong&gt;Windows&lt;/strong&gt;. But they are built also for other operating systems than their native one. For most usages, 
these implementations are compatible between them client-server or server-server for Kerberos communication protocol, but the ticket 
credentials and keytabs are not standardized by the RFCs. Some implementations are diverged on some edge aspects, or propose extra 
features.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;historical implementation&lt;/strong&gt; is &lt;strong&gt;MIT Kerberos&lt;/strong&gt;, because it has been written by the founders of Kerberos Steve Miller and Clifford
Neuman.The first implementation release was in 1987. New releases are pushblished until present with continuous improvements. The latest MIT 
Kerberos version is &lt;a href=&quot;https://web.mit.edu/kerberos/krb5-latest/&quot;&gt;Kerberos V5&lt;/a&gt; written in Language C under
&lt;a href=&quot;https://web.mit.edu/kerberos/krb5latest/doc/mitK5license.html&quot;&gt;MIT License&lt;/a&gt;. 
You can see &lt;a href=&quot;https://web.mit.edu/kerberos/dist/historic.html&quot;&gt;all available releases&lt;/a&gt;. 
The project is open source project published on a &lt;a href=&quot;https://github.com/krb5/krb5&quot;&gt;git mirror repository on GitHub&lt;/a&gt; 
by &lt;a href=&quot;https://github.com/krb5&quot;&gt;GitHub Organization krb5&lt;/a&gt;. There are a &lt;a href=&quot;https://web.mit.edu/kerberos/krb5-latest/doc/&quot;&gt;online documentation&lt;/a&gt; 
and &lt;a href=&quot;http://www.kerberos.org/software/adminkerberos.pdf&quot;&gt;short guide pdf&lt;/a&gt;.&lt;/p&gt;

&lt;figure title=&quot;MIT Kerberos&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2019-03-23-kerberos-in-5-minutes/images/kerberos-logo.jpg&quot; title=&quot;MIT Kerberos&quot; alt=&quot;MIT Kerberos&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    MIT Kerberos
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Another interesting implementation of Kerberos is in Java: &lt;a href=&quot;https://directory.apache.org/kerby/&quot;&gt;Apache Kerby&lt;/a&gt;. The &lt;strong&gt;Java ecosystem&lt;/strong&gt; 
integrates very well Kerberos, it is in the standard library. A lot of Java projects use Kerberos.&lt;/p&gt;

&lt;p&gt;See &lt;a href=&quot;http://www.kerberos.org/about/FAQ.html&quot;&gt;Frequently Asked Questions (FAQ)&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;pros-and-cons&quot;&gt;Pros and cons&lt;/h1&gt;

&lt;p&gt;You can read this paper: &lt;a href=&quot;https://www.kerberos.org/software/whykerberos.pdf&quot;&gt;Why is Kerberos a credible security solution?&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;pros&quot;&gt;Pro’s&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;There is better performance when using of Kerberos. Because it uses symmetric key operations, which are orders of magnitude faster than public key operations used by SSL.&lt;/li&gt;
  &lt;li&gt;User management is simpler. For example, revoking a user can be done by simply deleting the user from the centrally managed Kerberos KDC (key distribution center). Whereas in SSL, a new certificate revocation list has to be generated and propagated to all servers&lt;/li&gt;
  &lt;li&gt;Thanks to its ticket system, Kerberos allows temporary access if a key session is stolen.&lt;/li&gt;
  &lt;li&gt;The passwords is never sent through network (even ciphered, robust against Man In the Middle attack).&lt;/li&gt;
  &lt;li&gt;Kerberos allows a mutual authentication, when a client is connected to  a service. The client knows which is the service and vice versa unlike SSL certificate where the server does not know a priori the client.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;cons&quot;&gt;Con’s&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;A brute force attack on Key Distribution Service (KDC) could compromise the entire network, since it contains all the passwords (in an encrypted version, but still). So the security of the KDC is essential.&lt;/li&gt;
  &lt;li&gt;Kerberos assumes that the host it is running on is safe, so if an attacker can get hold of a client it can steal tickets and during the lifetime of the ticket do the same things a normal user could. On multi-user systems the above point even becomes more important. Meaning that the different users should not be able to access each others files and memory.&lt;/li&gt;
  &lt;li&gt;Since anybody can request a (TGT) of any user, and that ticket is encrypted with the user’s secret key (password), it is simple to perform an offline attack on this ticket by trying to decrypt it with different passwords. Kerberos 5 introduced to solve this problem.&lt;/li&gt;
  &lt;li&gt;Kerberos is very dependent on the Domain Name Service (DNS), a service principal should have both:  DNS lookup and reverse DNS lookup working. If your DNS Server crashed your authentication system is out.&lt;/li&gt;
  &lt;li&gt;The set up of Kerberos can be more constraining than another authentication system.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;how-it-works&quot;&gt;How it works?&lt;/h1&gt;

&lt;p&gt;Imagine that a client wishes to access to a service through a Kerberos Authentication. The Kerberos authentication is divided into 3 main steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Getting a Ticket-Granting Ticket (TGT) from Authentication Server (AS)&lt;/li&gt;
  &lt;li&gt;Getting a Ticket-Granting Service (TGS) from Ticket-Granting Server (TGS)&lt;/li&gt;
  &lt;li&gt;Accessing to the Service&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here client (identified as user) and service are already registered in the Kerberos database in the same Realm (understanding same Kerberos perimeter), respectively as User Principal Name (UPN) and Service Principal Name (SPN).&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vRFoa0U8YarJybG_tJJ4bxSaDj000n8XduoQyDVJQ77XHTovCd4EuGArkG9JhGDqATybKOHV9TSCVSh/pub?w=959&amp;amp;h=535&quot; alt=&quot;Kerberos authentication architecture&quot; title=&quot;Kerberos authentication architecture&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Kerberos authentication architecture
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;You can use &lt;strong&gt;Lightweight Directory Access Protocol&lt;/strong&gt; (LDAP) as principal database to store users and groups of your organization. Now you have a nice &lt;strong&gt;Authentication, Authorization&lt;/strong&gt; and &lt;strong&gt;Accounting&lt;/strong&gt; System (AAAS) :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Authentication&lt;/code&gt; is managed by the KDC to guarantee the identity of an entity.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Authorization&lt;/code&gt; is controlled by the Service directly to authorize access (you can also use Access Control List (ACL) for other permissions)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Accounting&lt;/code&gt; is allowed by LDAP server.&lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vRmsLxbS-kwQOzK20d0i3PZGADr1dmoWbG2ld-M2hIyXYjw1pGPuXtWO8LmBv9VaYJVh-E1aJOU7xoF/pub?w=959&amp;amp;h=542&quot; alt=&quot; Kerberos authentication workflow with LDAP&quot; title=&quot; Kerberos authentication workflow with LDAP&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
     Kerberos authentication workflow with LDAP
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h1 id=&quot;how-to-test&quot;&gt;How to test?&lt;/h1&gt;

&lt;p&gt;I suppose that you are comfortable with docker containers and command-line interface under Linux Operating System as Ubuntu. You can test directly Kerberos ecosystem in few commands.&lt;/p&gt;

&lt;p&gt;To do that, just consult this Open Source project &lt;a href=&quot;https://github.com/criteo/kerberos-docker&quot;&gt;kerberos-docker&lt;/a&gt;.&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;kerberos-docker-logo.png&quot; alt=&quot;Kerberos/Docker icon&quot; title=&quot;Kerberos/Docker icon&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Kerberos/Docker icon
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;This servers cluster is deployed automatically with only one command.&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vSWzlGsP6c2XMkKZnJ8ncLx5rfaqR9vWJlvG8ksr5CxAKc1zeJ4aFUC-Zw4KpZt-ipcGJRcoY4P2q-o/pub?w=695&amp;amp;h=421&quot; alt=&quot;Kerberos architecture on docker for Kerberos/Docker project&quot; title=&quot;Kerberos architecture on docker for Kerberos/Docker project&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Kerberos architecture on docker for Kerberos/Docker project
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Thanks to GSS-API implementation in C, OpenSSH use one method based on Kerberos authentication: &lt;strong&gt;gssapi-with-mic&lt;/strong&gt;. That is a Message Authentication Code (MAC) methods renamed in Message Integrated Code (MIC) for disambiguation MAC address. Thus the suffix with-mic is used. But SSH continue to manage authorization (using Linux-PAM or/and AllowsUser, Allowsgroup,PermitRootLogin in /etc/ssh/sshd_config), and accounting is managed by the Operating System.&lt;/p&gt;

&lt;p&gt;The layer of access authorization provided by Kerberos is really minimal and consists in a ~/.k5login file and a few configurations. See details &lt;a href=&quot;https://web.mit.edu/kerberos/krb5-latest/doc/admin/host_config.html#login-authorization&quot;&gt;here&lt;/a&gt;. By default Kerberos applies a default authorization rule: if host H is in realm R, the Kerberos principal u@R is allowed access to the account u@H. You change the configuration of SSH server with KerberosAuthentication yes to connect directly the service without doing kinit. And you can use also another way to use the PAM module of Kerberos &lt;a href=&quot;https://github.com/rra/pam-krb5&quot;&gt;pam_krb5.so&lt;/a&gt; thanks to the configuration UsePAM yes.&lt;/p&gt;

&lt;p&gt;For developing your own kerberized application, you can read &lt;a href=&quot;https://www.kerberos.org/software/appskerberos.pdf&quot;&gt;Best Practices for Integrating Kerberos into Your Application&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;go-further&quot;&gt;Go further&lt;/h1&gt;

&lt;p&gt;To go further, you should know that with Kerberos you can do Delegation of authentication, Servers’ replication and redundancy, Cross Realm Authentication. And it is important to distinguish Kerberos with SSL/HTTPS, SSH or JWT, Radius and Diameter.&lt;/p&gt;

&lt;h1 id=&quot;annexes&quot;&gt;Annexes&lt;/h1&gt;

&lt;h2 id=&quot;key-concepts&quot;&gt;Key Concepts&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Authentication&lt;/code&gt;: Action of checking that an entity is really this entity without impersonating another entity.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Authorization&lt;/code&gt;: Action of verifying that an entity have sufficient rights to access a system.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Accounting&lt;/code&gt;: Management of defined groups and users.&lt;/p&gt;

&lt;h2 id=&quot;general-concepts&quot;&gt;General concepts&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Mutual authentication&lt;/code&gt;: It is also called two-way authentication, is a process or technology in which both entities in a communications link authenticate each other. In a network environment, the client authenticates the server and vice-versa.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;AAS&lt;/code&gt;: Authentication and Authorization System.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;AAAS&lt;/code&gt;: Authentication, Authorization, Accounting/Auditing System.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Client&lt;/code&gt;: An entity that can obtain a ticket. This entity is usually either a user or a host.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Host&lt;/code&gt;: A computer that can be accessed over a network.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;DNS&lt;/code&gt;: The Domain Name System is a hierarchical decentralized naming system for computers.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Service&lt;/code&gt;: Any program or computer you access over a network. Examples of services include “host” (a host, e.g., when you use telnet and rsh), “ftp” (FTP), “krbtgt” (authentication; cf. ticket-granting ticket), and “pop” (email).&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;RFC&lt;/code&gt;: A Request for Comments (RFC) is a type of publication from the Internet Engineering Task Force (IETF) and the Internet Society (ISOC), the principal technical development and standards-setting bodies for the Internet.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;LDAP&lt;/code&gt;: Lightweight Directory Access Protocol is a directory service protocol that runs on a layer above the TCP/IP stack. It provides a mechanism used to connect to, search, and modify Internet directories. It is essentially a database that contains information about users and groups in a tree structure&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;HDFS&lt;/code&gt;:  Hadoop Distributed File System is a Java-based file system that provides scalable and reliable data storage, and it was designed to span large clusters of commodity servers.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;SSO&lt;/code&gt;: Single Sign On is a method allowing to an user to access to several applications thanks to one unique authentication.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;OpenSSH&lt;/code&gt;: Implementation Open Source of Secure SHell (SSH) is a cryptographic network protocol for operating network services securely over an unsecured network.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;ACL&lt;/code&gt;: Access Control List allows to manage permissions attached to an object.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;PAM&lt;/code&gt;: A Pluggable Authentication Module allows to standardize security layer dynamically though system of same customizable modules for all applications.&lt;/p&gt;

&lt;h2 id=&quot;kerberos-concepts&quot;&gt;Kerberos concepts&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Kerberos&lt;/code&gt;: In Greek mythology, the three-headed dog that guards the entrance to the underworld. In the computing world, Kerberos is a network security package that was developed at MIT.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;KDC&lt;/code&gt;: Key Distribution Center. A machine that issues Kerberos tickets composed of Ticket-Granting Server (TGS), Authentication Server (AS) and database instances.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;AS&lt;/code&gt;: Authentication Service gives Ticket-Granting Ticket (TGT) to authenticate a client.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;AD&lt;/code&gt;: Active Directory is a Microsoft product which makes use of a Kerberos implementation.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Keytab&lt;/code&gt;: Shortcut for key table a key tab is the file containing one or more keys. A host or service uses a keytab file in much the same way as a user uses his/her password.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Realm&lt;/code&gt;: A REALM is in Kerberos terms equivalent to a Domain in Domain Name Server (DNS) by convention in UPPERCASE.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Principal&lt;/code&gt;: You can understand that as UNIX username. There 2 types of principles: Service Principal Name (SPN) and User Principal Name (UPN). It is a string that names a specific entity to which a set of credentials may be assigned. 
It can have an arbitrary number of components:
component1/component2/…@REALM
The typical format of a typical Kerberos principal is primary/instance@REALM.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;primary&lt;/code&gt;: The first part of a Kerberos principal. In the case of a user, it is the username. In the case of a service, it is the name of the service.
&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;instance&lt;/code&gt;: The second part of a Kerberos principal. It gives information that qualifies the primary. The instance may be null. In the case of a user, the instance is often used to describe the intended use of the corresponding credentials. In the case of a host, the instance is the fully qualified hostname.
&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;realm&lt;/code&gt;: The logical network served by a single Kerberos database and a set of Key Distribution Centers. By convention, realm names are generally all uppercase letters, to differentiate the realm from the internet domain.
&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Ticket&lt;/code&gt;: A temporary set of electronic credentials that verify the identity of a client for a particular service (typically 8 or 10 hours of life time).&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;TGT&lt;/code&gt;: Ticket-Granting Ticket. A special Kerberos ticket to guarantee authentication that permits the client to obtain additional Kerberos tickets within the same Kerberos realm given by Authentication Service (AS).&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;TGS&lt;/code&gt;: Ticket-Granting Service or Ticket-Granting Server (depends on context). The TGS exchange is initiated by a client when it wishes to obtain authentication credentials for a given server&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;GSS-API&lt;/code&gt;: Acronym for Generic Security Service Application Program Interface (GSSAPI, also GSS-API) is an application programming interface for programs to access security services.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Session Key&lt;/code&gt;:  Random number generated by the KDC when it builds a ticket. It is the shared secret that the KDC, the client, and the validating server have in common.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;KVNO&lt;/code&gt;: It is an acronym for Key version number. Kerberos can hold multiple keys for a principal. To distinguish between those keys every key has version number. The number is incremented by one when the password or encryption is changed.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;KRBTGT Account&lt;/code&gt;: This is a special account to create Ticket Granting Tickets.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;Key salt&lt;/code&gt;: The salt is a string concatenated to the password to make sure the string2key function creates a unique encryption key, via a one-way hash. In Kerberos 5 the salt is the complete principal name including the realm. The reason the salt is used is to make sure the outcome of the one way hash is unique across realms.&lt;/p&gt;

&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;ROBINSON Trevor (eztenia). &lt;strong&gt;Kerberos&lt;/strong&gt;. Canonical Ltd. Ubuntu Article, November 2014. Link: https://help.ubuntu.com/community/Kerberos.&lt;/li&gt;
  &lt;li&gt;MIGEON Jean. &lt;strong&gt;Protocol, Installation and Single Sign On, The MIT Kerberos Admnistrator’s how-to Guide&lt;/strong&gt;. MIT Kerberos Consortium, July 2008. p 62.&lt;/li&gt;
  &lt;li&gt;BARRETT Daniel, SILVERMAN Richard, BYRNES Robert. &lt;strong&gt;SSH, The Secure Shell: The Definitive Guide, 2nd Edition&lt;/strong&gt;. O’Reilly Media, June 2009. p. 672. Notes: Chapter 11. ISBN-10: 0596008953, ISBN-13: 978-0596008956&lt;/li&gt;
  &lt;li&gt;GARMAN, Jason. &lt;strong&gt;Kerberos: The Definitive Guide, 2nd Edition&lt;/strong&gt;. O’Reilly Media, March 2010. p. 272.  ISBN-10: 0596004036, ISBN-13: 978-0596004033.&lt;/li&gt;
  &lt;li&gt;Phillip J. Windley. &lt;strong&gt;Digital Identity&lt;/strong&gt;.  O’Reilly Media, August 2005. p. 254.&lt;/li&gt;
  &lt;li&gt;O’MALLEY Owen, ZHANG Kan, RADIA Sanjay, MARTI Ram, and HARRELL Christopher. &lt;strong&gt;Hadoop Security Design&lt;/strong&gt;. Yahoo! Research Paper, October 2009. p 19. ISBN-10: 0596008783, ISBN-13: 978-0596008789&lt;/li&gt;
  &lt;li&gt;MATTHIAS Karl, KANE Sean. &lt;strong&gt;Docker: Up &amp;amp; Running&lt;/strong&gt;. O’Reilly Media, June 2015. p. 232. ISBN-10: 1491917571, ISBN-13: 978-1491917572.&lt;/li&gt;
&lt;/ul&gt;
</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Access to a computer from USB key</title>
   <link href="https://glegoux.com/blog/articles/2019/03/01/access-to-a-computer-from-usb-key.html"/>
   <updated>2019-03-01T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2019/03/01/access-to-a-computer-from-usb-key.html</id>
   <content type="html">&lt;p&gt;Imagine that you are in one of the following situations:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;You have forgotten your password to connect to the personal workspace of your computer, and you want to reset it.&lt;/li&gt;
  &lt;li&gt;After a wrong manipulation, you can not access the personal data of your computer, and you want to retrieve this access.&lt;/li&gt;
  &lt;li&gt;You found a computer without supervision for which you are not the owner, but you want to see the file system’s content.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With a bootable USB key on Ubuntu, you can resolve these situations by first mounting the file system of the targeted computer with all permissions, then changing the password of any local user, and finally by connecting to the targeted workspace and exploring the file system.&lt;/p&gt;

&lt;p&gt;First, plug your USB drive into the target computer and select your key as the boot device. This will enable the target computer to boot into the Ubuntu system on your USB drive. On a DELL computer, press &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;F12&lt;/code&gt; to access this selection. This information is visible on the welcome screen of your computer’s manufacturer.&lt;/p&gt;

&lt;figure title=&quot;DELL welcome screen&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2019-03-01-access-to-a-computer-from-usb-key/images/welcome-screen-dell.png&quot; title=&quot;DELL welcome screen&quot; alt=&quot;DELL welcome screen&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    DELL welcome screen
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Start by choosing the following option:&lt;/p&gt;

&lt;figure title=&quot;Advanced startup options&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2019-03-01-access-to-a-computer-from-usb-key/images/hack1.png&quot; title=&quot;Advanced startup options&quot; alt=&quot;Advanced startup options&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Advanced startup options
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Then select the &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;recovery mode&lt;/code&gt;:&lt;/p&gt;

&lt;figure title=&quot;Getting started in recovery mode&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2019-03-01-access-to-a-computer-from-usb-key/images/hack2.png&quot; title=&quot;Getting started in recovery mode&quot; alt=&quot;Getting started in recovery mode&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Getting started in recovery mode
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Launch a &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;root shell&lt;/code&gt;:&lt;/p&gt;

&lt;figure title=&quot;Choosing the root shell&quot; class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://raw.githubusercontent.com/glegoux/articles-glegoux-com/master/articles/2019-03-01-access-to-a-computer-from-usb-key/images/hack3.png&quot; title=&quot;Choosing the root shell&quot; alt=&quot;Choosing the root shell&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Choosing the root shell
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;You access a device as a &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;root&lt;/code&gt; user.&lt;/p&gt;

&lt;div class=&quot;info&quot;&gt;
If you need to access the internet, select the network entry before. To verify that you have access to the web you can &lt;i&gt;ping 8.8.8.8&lt;/i&gt; on the Google DNS server, then make &lt;i&gt;nslookup  8.8.8.8&lt;/i&gt; to check that the DNS resolution works. If that does not work, add this line &lt;i&gt;nameserver 8.8.8.8&lt;/i&gt; to the file &lt;i&gt;/etc/resolv.conf&lt;/i&gt; (this will be deleted when you restart the computer) and restart your service &lt;i&gt;network-manager&lt;/i&gt; with &lt;i&gt;service network-manager restart&lt;/i&gt;.
&lt;/div&gt;

&lt;p&gt;For the moment, the file system is only in &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;read only&lt;/code&gt;, type the following command to mount the file system in&lt;code class=&quot;language-text highlighter-rouge&quot;&gt; read / write&lt;/code&gt; at the root of your key:&lt;/p&gt;

&lt;div class=&quot;language-terminal 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;go&quot;&gt;mount -o remount, rw /
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now you can copy the file system to an external hard drive, and then you can choose the new user password by typing:&lt;/p&gt;

&lt;div class=&quot;language-terminal 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;gp&quot;&gt;passwd &amp;lt;username&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;info&quot;&gt;
If you do not know the users on this machine, you can do &lt;i&gt;ls /home&lt;/i&gt;. Certainly, a user of this machine corresponds to a directory name in &lt;i&gt;/home/&lt;/i&gt;, or even view the file &lt;i&gt;/etc/passwd&lt;/i&gt;, or else you can create a user as you are &lt;i&gt;root&lt;/i&gt;.
&lt;/div&gt;

&lt;p&gt;Type in the new password and confirm.&lt;/p&gt;

&lt;p&gt;You can shut down the computer.&lt;/p&gt;

&lt;div class=&quot;language-terminal 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;go&quot;&gt;shutdown -h now
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can now turn on the computer normally and log in with the chosen user and password.&lt;/p&gt;

&lt;div class=&quot;error&quot;&gt;
Beware, the morality of this article is that a person physically accessing your computer does not need login/password to access your computer. If you want to protect yourself from this attack, you must &lt;b&gt;encrypt your hard drive&lt;/b&gt;.
&lt;/div&gt;

&lt;p&gt;Well done :smile:!&lt;/p&gt;
</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>How to quote sources</title>
   <link href="https://glegoux.com/blog/articles/2019/02/14/how-to-quote-sources.html"/>
   <updated>2019-02-14T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2019/02/14/how-to-quote-sources.html</id>
   <content type="html">&lt;p&gt;The standard in force is mainly Afnor Standard Z 44-005, December 1987 (ISO 690). Here is a link of the website of the Ministry of Culture and Communication which presents in a synthetic way the standards in force for the writing of bibliographical references:&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
  &lt;a href=&quot;http://www.culture.gouv.fr/culture/inventai/telechar/normes.pdf&quot;&gt;http://www.culture.gouv.fr/culture/inventai/telechar/normes.pdf&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;To write a blog article resources are used and must be specified in a &lt;strong&gt;bibliography&lt;/strong&gt; and / or a &lt;strong&gt;sitemap&lt;/strong&gt;. These groups respectively the paper resources or online like books, articles, videos, research papers, interviews …&lt;/p&gt;

&lt;p&gt;In general, these rules are to be respected with a certain freedom, but all known information must be mentioned. Some information is mandatory or conditionally mandatory (ISBN, ISSN for example).&lt;/p&gt;

&lt;p&gt;You can find out what an ISBN (International Standard Book Number) is:&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
  &lt;a href=&quot;https://www.isbn-international.org/fr/&quot;&gt; https://www.isbn-international.org/en/ &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Likewise for what is an ISBN (International Standard Book Number):&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
  &lt;a href=&quot;http://www.issn.org/fr/&quot;&gt; http://www.issn.org/en/ &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Two sites are also interesting:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The website of AFNIL (French Agency for International Numbering of Books):&lt;/li&gt;
&lt;/ul&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;a href=&quot;http://www.afnil.org/&quot;&gt; http://www.afnil.org/ &lt;/a&gt;
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The site of the BnF (Libraries National of France):&lt;/li&gt;
&lt;/ul&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;a href=&quot;http://www.bnf.fr/&quot;&gt; http://www.bnf.fr/ &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;With these resources:&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
  &lt;a href=&quot;http://www.bnf.fr/fr/professionnels/s_informer_obtenir_issn.html&quot;&gt; Get informed and get an ISSN &lt;/a&gt; &lt;br /&gt;
  &lt;a href=&quot;http://www.bnf.fr/fr/professionnels/s_informer_obtenir_isbn.html&quot;&gt; Get information and get an ISBN &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Your references must be in alphabetical order at the end of your article respecting these conventions.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Book&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NAME OF THE AUTHOR, First name of the author. &lt;strong&gt;Title of the book&lt;/strong&gt;. Name of publisher, year of publication. Number of pages. Notes. ISBN.&lt;/p&gt;

&lt;h1 id=&quot;periodical-article&quot;&gt;Periodical article&lt;/h1&gt;

&lt;p&gt;NAME OF THE AUTHOR, First name of the author. &lt;strong&gt;Title of the article&lt;/strong&gt;. &lt;em&gt;Title of the periodical&lt;/em&gt;. year of publication. not. paging. ISSN.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Internet resource&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This convention is personal. For this blog by default the links given are consulted the day of the creation of the article.&lt;/p&gt;

&lt;p&gt;NAME OF THE AUTHOR, First name of the author. &lt;strong&gt;Title&lt;/strong&gt; [online]. &lt;em&gt;Editor’s name&lt;/em&gt;. [date of publication or update date of consultation]. Availability and access. (or just a link)&lt;/p&gt;

&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.isbn-international.org&quot;&gt;https://www.isbn-international.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.issn.org&quot;&gt;http://www.issn.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.afnil.org&quot;&gt;http://www.afnil.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.bnf.fr&quot;&gt;http://www.bnf.fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 
 <entry>
   <title>Getting started</title>
   <link href="https://glegoux.com/blog/articles/2019/01/21/getting-started.html"/>
   <updated>2019-01-21T00:00:00+00:00</updated>
   <id>https://glegoux.com/blog/articles/2019/01/21/getting-started.html</id>
   <content type="html">&lt;p&gt;Discover the &lt;strong&gt;extended Markdown syntax&lt;/strong&gt; used on this tech blog, generated from the template &lt;a href=&quot;https://github.com/glegoux/jekyll-tech-blog&quot;&gt;🧪 Jekyll Tech blog&lt;/a&gt;, to write articles or to generate static web pages. It is based on &lt;a href=&quot;https://kramdown.gettalong.org/syntax.html&quot;&gt;Kramdown syntax&lt;/a&gt; with &lt;a href=&quot;https://kramdown.gettalong.org/parser/gfm.html&quot;&gt;GFM parser&lt;/a&gt; and a light
custom extension for rendering. Besides, this article is written with this syntax. At the top of the web page, click on
&lt;b&gt;&lt;i class=&quot;far fa-file-code&quot;&gt;&lt;/i&gt; Source&lt;/b&gt; to explore its source code and on &lt;b&gt;&lt;i class=&quot;fas fa-list-ul&quot;&gt;&lt;/i&gt; Table of contents&lt;/b&gt; to browse
the supported features. So, you can mix this syntax with &lt;strong&gt;existing macro&lt;/strong&gt; and &lt;strong&gt;native &lt;abbr title=&quot;Hyper Text Markup Language&quot;&gt;HTML&lt;/abbr&gt; syntaxes&lt;/strong&gt; to write any content. As this blog is &lt;strong&gt;highly configurable&lt;/strong&gt;, you can &lt;strong&gt;build&lt;/strong&gt; your &lt;strong&gt;custom macros&lt;/strong&gt;. Each article
also has &lt;strong&gt;metadata&lt;/strong&gt; to inject constants of configurations.&lt;/p&gt;

&lt;details open=&quot;true&quot;&gt;
  &lt;summary title=&quot;Click to expand and collapse the content&quot;&gt;&lt;b&gt;Summary of supported features by the extended Markdown syntax&lt;/b&gt;&lt;/summary&gt;
  &lt;p&gt;
    Read the documentation of the &lt;a href=&quot;https://kramdown.gettalong.org/syntax.html&quot;&gt;Kramdown syntax&lt;/a&gt;.
    All contents, even if unavailable with the extended Markdown syntax, can be shown thanks to embedded native content: &lt;abbr title=&quot;Hyper Text Markup Language&quot;&gt;HTML&lt;/abbr&gt;, JS, CSS, or macros: &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;includes&lt;/code&gt; and &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;tags&lt;/code&gt; of the &lt;a href=&quot;https://shopify.github.io/liquid&quot;&gt;Liquid template&lt;/a&gt;.
  &lt;/p&gt;
  &lt;div&gt;
      &lt;table class=&quot;text-center&quot;&gt;
        &lt;thead&gt;
          &lt;tr&gt;
            &lt;th&gt;Feature name&lt;/th&gt;
            &lt;th&gt;Comment&lt;/th&gt;
            &lt;th&gt;Extended Markdown syntax&lt;/th&gt;
            &lt;th&gt;Existing Macro syntax&lt;/th&gt;
            &lt;th&gt;Native HTML syntax&lt;/th&gt;
          &lt;/tr&gt;
        &lt;/thead&gt;
        &lt;tbody&gt;
          &lt;tr style=&quot;background-color: lightgrey&quot;&gt;
            &lt;td colspan=&quot;5&quot;&gt;&lt;b&gt;&lt;a href=&quot;#structure&quot;&gt;Structure&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;
          &lt;/tr&gt;  
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#heading&quot;&gt;Heading&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Organize your content with part, subpart, sub-subpart, etc.&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#new-line--paragraph&quot;&gt;New line &amp;amp; Paragraph&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Organize the content in a part&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#horizontal-rule&quot;&gt;Horizontal Rule&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Break between paragraph-level elements&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#note&quot;&gt;Note&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Soon refactored! Add your notes: info, question, warning, error, success, etc.&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr style=&quot;background-color: lightgrey&quot;&gt;
            &lt;td colspan=&quot;5&quot;&gt;&lt;b&gt;&lt;a href=&quot;#textual-content&quot;&gt;Textual Content&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;
          &lt;/tr&gt; 
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#enchanced-text&quot;&gt;Enchanced Text&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Enhance your text: italics, bold, strikethrough, inline code, highlight, superscript, subscript, etc.&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#link&quot;&gt;Link&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Use absolute and relative links named or not and re-usable&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#emoticon&quot;&gt;Emoticon&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Use emoticons with shortcode or unicode&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#list&quot;&gt;List&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Build an ordered, unordered, definition or task lists and sublists&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#table&quot;&gt;Table&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Arrange the content in rows and columns with an optional header.&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#blockquote&quot;&gt;Blockquote&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Format a special sentence of paragraph to draw attention to the reader&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#quote&quot;&gt;Quote&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Soon refactored! Quote your authors&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#footnote&quot;&gt;Footnote&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Put extra information at the bottom of the article referencing inside content&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#abbreviation&quot;&gt;Abbreviation&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Shorten used word or concept by keeping the accessible meaning&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr style=&quot;background-color: lightgrey&quot;&gt;
            &lt;td colspan=&quot;5&quot;&gt;&lt;b&gt;&lt;a href=&quot;#illustration-content&quot;&gt;Illustration Content&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#image&quot;&gt;Image&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Soon documented!&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#video&quot;&gt;Video&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Soon documented!&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#presentation&quot;&gt;Presentation&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Soon documented!&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#diagram&quot;&gt;Diagram&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Soon documented!&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr style=&quot;background-color: lightgrey&quot;&gt;
            &lt;td colspan=&quot;5&quot;&gt;&lt;b&gt;&lt;a href=&quot;#informatics-code&quot;&gt;Informatics Code&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;
          &lt;/tr&gt; 
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#programming-language&quot;&gt;Programming Language&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Highlight code: python, java, scala, rust, c#, c++, c, bash, ruby, go, typescript, javascript, html, css ...&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#terminal&quot;&gt;Terminal&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Highlight content in a terminal&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#text-file&quot;&gt;Text File&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Highlight text content: plain, json, yaml, xml, ini ...&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr style=&quot;background-color: lightgrey&quot;&gt;
            &lt;td colspan=&quot;5&quot;&gt;&lt;b&gt;&lt;a href=&quot;#mathematics-equation&quot;&gt;Mathematics Equation&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;
          &lt;/tr&gt; 
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#in-line-equation&quot;&gt;In-Line Equation&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Use LateX syntax for in-line equation&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#single-line-equation&quot;&gt;Single-Line Equation&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Use LateX syntax for single-line equation&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#multi-lines-equation&quot;&gt;Multi-lines Equation&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Use LateX syntax for multi-lines equation&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr style=&quot;background-color: lightgrey&quot;&gt;
            &lt;td colspan=&quot;5&quot;&gt;&lt;b&gt;&lt;a href=&quot;#special-content&quot;&gt;Special Content&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#html&quot;&gt;HTML&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Put native HTML when the Markdown syntax is not available, it can contain Markdown in its markups&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#comment&quot;&gt;Comment&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Comment content&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#escape&quot;&gt;Escape&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Escape meta or special characters&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;  
          &lt;tr&gt;
            &lt;td&gt;&lt;a href=&quot;#others&quot;&gt;Others&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Create your macros, extend the project or the tools everything is open-source&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;❌&lt;/td&gt;
            &lt;td&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
  &lt;/div&gt;
&lt;/details&gt;

&lt;p&gt;What is the
&lt;a href=&quot;https://daringfireball.net/projects/markdown/&quot;&gt;Markdown syntax&lt;/a&gt;?
It is a lightweight and popular text metalanguage that is a writing standard. It is often converted into &lt;abbr title=&quot;Hyper Text Markup Language&quot;&gt;HTML&lt;/abbr&gt;,
allowing it to be easily shared on the web :spider_web:. After converting to
&lt;abbr title=&quot;Hyper Text Markup Language&quot;&gt;HTML&lt;/abbr&gt;, it is decorated and animated by CSS style sheets and/or JS scripts. See
more details on this &lt;a href=&quot;https://www.markdownguide.org&quot;&gt;Markdown Guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Why use Markdown? Because it is very handy to use for the reader and the writer:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Reader&lt;/strong&gt;: The generated &lt;abbr title=&quot;Hyper Text Markup Language&quot;&gt;HTML&lt;/abbr&gt; content from the Markdown content is compatible
with all web browsers that can render it for the final reader.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Writer&lt;/strong&gt;: The Markdown content continues to be separated from the rendering.
In addition, it is easy to learn and use syntax, with the pros of portability
and compatibility, flexibility and customizable, and readability and
maintainability. Modify its article so the content is more
human-writable/readable and shorter than the &lt;abbr title=&quot;Hyper Text Markup Language&quot;&gt;HTML&lt;/abbr&gt; code, less expressive, but
sufficient for a blog post.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why use an extended Markdown syntax? Markdown has a basic syntax, that is limited
for more advanced use cases (like tables, code blocks, syntax highlighting, footnotes and so one…). This extension
is &lt;strong&gt;Markdown compatible&lt;/strong&gt;, so all articles written in Markdown can be used directly in this blog without breaking
changes, and &lt;strong&gt;largely used&lt;/strong&gt; by an &lt;strong&gt;active community&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;How it works? The files having the Markdown extension &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;.md&lt;/code&gt; or &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;.markdown&lt;/code&gt; are processed to &lt;abbr title=&quot;Hyper Text Markup Language&quot;&gt;HTML&lt;/abbr&gt; with this &lt;a href=&quot;https://jekyllrb.com/tutorials/orderofinterpretation/&quot;&gt;processing workflow&lt;/a&gt;:&lt;/p&gt;

&lt;figure class=&quot;content&quot;&gt;
  &lt;div&gt;
    &lt;img class=&quot;img-fluid lazyload&quot; data-src=&quot;https://docs.google.com/drawings/d/e/2PACX-1vRPwfUjnj6bT9B-M4jdzQqOICzCwblxYR5xvgiXYWrpcgpmFddbWR-ErodWf-U0rE8f0aqzUfazXvf8/pub?w=960&amp;amp;h=267&quot; alt=&quot;Extended Markdown to HTML&quot; title=&quot;Extended Markdown to HTML&quot; /&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Extended Markdown to HTML
    
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The following sections give examples for each usage to create your content with the right syntax.&lt;/p&gt;

&lt;h1 id=&quot;structure&quot;&gt;Structure&lt;/h1&gt;

&lt;h2 id=&quot;heading&quot;&gt;Heading&lt;/h2&gt;

&lt;p&gt;Make a part, a subpart, and a sub-subpart.&lt;/p&gt;

&lt;p&gt;It is used for each section here.&lt;/p&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# H1
## H2
### H3


H1
======

H2
------
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;new-line--paragraph&quot;&gt;New line &amp;amp; Paragraph&lt;/h2&gt;

&lt;p&gt;Let 2 trailing spaces have an end of the line, and let an empty line for a new
paragraph:&lt;/p&gt;

&lt;p&gt;Hello,&lt;/p&gt;

&lt;p&gt;World!&lt;/p&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-whitespace&quot;&gt;Hello,␣␣\n
\n
World!\n
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Note: &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;\n&lt;/code&gt; and &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;␣&lt;/code&gt; represent respectively a new line character and a space
character.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;horizontal-rule&quot;&gt;Horizontal rule&lt;/h2&gt;

&lt;p&gt;To create a horizontal rule, use three or more asterisks &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;***&lt;/code&gt;, dashes &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;---&lt;/code&gt;, or underscores &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;___&lt;/code&gt; on a line by themselves:&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;---
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;note&quot;&gt;Note&lt;/h2&gt;

&lt;p&gt;Add your notes: info, question, warning, error, and success etc.&lt;/p&gt;

&lt;div class=&quot;info&quot;&gt;
INFO
&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;info&quot;&amp;gt;
INFO
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;question&quot;&gt;
QUESTION
&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;question&quot;&amp;gt;
QUESTION
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;warning&quot;&gt;
WARNING
&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;warning&quot;&amp;gt;
WARNING
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;error&quot;&gt;
ERROR
&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;error&quot;&amp;gt;
ERROR
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;success&quot;&gt;
SUCCESS
&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;success&quot;&amp;gt;
SUCCESS
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;textual-content&quot;&gt;Textual Content&lt;/h1&gt;

&lt;h2 id=&quot;enchanced-text&quot;&gt;Enchanced Text&lt;/h2&gt;

&lt;p&gt;Enhance your text:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Italics: &lt;em&gt;italics&lt;/em&gt; or &lt;em&gt;italics&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Bold:    &lt;strong&gt;bold&lt;/strong&gt; or &lt;strong&gt;bold&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Strikethrough: &lt;del&gt;strikethrough&lt;/del&gt;&lt;/li&gt;
  &lt;li&gt;Bold &amp;amp; Italics: &lt;strong&gt;&lt;em&gt;bold italics&lt;/em&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;em&gt;bold italics&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Inline code: &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;code&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Highlight: &lt;mark&gt;highlight&lt;/mark&gt;&lt;/li&gt;
  &lt;li&gt;Supscript: sup&lt;sup&gt;sup&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;Subscript: sub&lt;sub&gt;sub&lt;/sub&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;- Italics: *italics* or _italics_  
- Bold:	**bold** or __bold__ 
- Strikethrough: ~~strikethrough~~
- Bold &amp;amp; Italics: **_bold italics_** or __*bold italics*__
- Inline code: `code`
- Highlight: &amp;lt;mark&amp;gt;highlight&amp;lt;/mark&amp;gt;
- Supscript: sup&amp;lt;sup&amp;gt;sup&amp;lt;/sup&amp;gt;
- Subscript: sub&amp;lt;sub&amp;gt;sub&amp;lt;/sub&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;link&quot;&gt;Link&lt;/h2&gt;

&lt;p&gt;It works with absolute and relative links:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simple Link&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.glegoux.com&quot;&gt;https://www.glegoux.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;https://www.glegoux.com&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Named Link&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.glegoux.com&quot;&gt;glegoux&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[glegoux](https://www.glegoux.com)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;with a title:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.glegoux.com&quot; title=&quot;glegoux&apos;s Homepage&quot;&gt;glegoux1&lt;/a&gt; (with the
  title &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;glegoux&apos;s Homepage&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[glegoux](https://www.glegoux.com &quot;glegoux&apos;s Homepage&quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Reference-style Link&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can use shortcuts for your links to use that several times on the article or to centralize links:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.glegoux.com&quot; title=&quot;glegoux&apos;s Homepage&quot;&gt;glegoux1&lt;/a&gt; &lt;a href=&quot;https://www.glegoux.com&quot; title=&quot;glegoux&apos;s Homepage&quot;&gt;glegoux2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[glegoux1][1] [glegoux2][1]

[1]: https://www.glegoux.com &quot;glegoux&apos;s Homepage&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;emoticon&quot;&gt;Emoticon&lt;/h2&gt;

&lt;p&gt;Use emoji, with &lt;a href=&quot;https://github.com/github/gemoji&quot;&gt;gemoji&lt;/a&gt;
see &lt;a href=&quot;https://www.webfx.com/tools/emoji-cheat-sheet/&quot;&gt;emoji cheat sheet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For example: with shortcode :smile: :scream: :yum: or unicode directly 😀 😱 😋.&lt;/p&gt;

&lt;p&gt;Source code for emoji with shortcode:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-@escape&quot;&gt;:smile: :scream: :yum:
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Source code for emoji with unicode:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-@escape&quot;&gt;😀 😱 😋
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;list&quot;&gt;List&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ordered List&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;item&lt;/li&gt;
  &lt;li&gt;item&lt;/li&gt;
  &lt;li&gt;item&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;1. item
2. item
3. item
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;info&quot;&gt;
  &lt;p&gt;Use &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;+&lt;/code&gt;, &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;*&lt;/code&gt; and &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;-&lt;/code&gt; indifferently.&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Unordered List&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;item
    &lt;ul&gt;
      &lt;li&gt;subitem&lt;/li&gt;
      &lt;li&gt;…&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;item
    &lt;ul&gt;
      &lt;li&gt;subitem&lt;/li&gt;
      &lt;li&gt;…&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;item&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; * item
 * item
 * item
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Definition List&lt;/strong&gt;&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;item&lt;/dt&gt;
  &lt;dd&gt;definition&lt;/dd&gt;
  &lt;dt&gt;item&lt;/dt&gt;
  &lt;dd&gt;definition&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;item
: definition

item
: definition
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Task List&lt;/strong&gt;&lt;/p&gt;

&lt;ul class=&quot;task-list&quot;&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; checked=&quot;checked&quot; /&gt;item&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; checked=&quot;checked&quot; /&gt;item&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;item&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;- [x] item
- [x] item
- [ ] item
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;table&quot;&gt;Table&lt;/h2&gt;

&lt;p&gt;TODO&lt;/p&gt;

&lt;h2 id=&quot;blockquote&quot;&gt;Blockquote&lt;/h2&gt;

&lt;p&gt;TODO&lt;/p&gt;

&lt;h2 id=&quot;quote&quot;&gt;Quote&lt;/h2&gt;

&lt;p&gt;Quote authors:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Talk is cheap. Show me the code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Linus Torvalds, creator of the Linux operating system&lt;/p&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-@escape&quot;&gt;&amp;gt; Talk is cheap. Show me the code.

Linus Torvalds, creator of the Linux operating system
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;footnote&quot;&gt;Footnote&lt;/h2&gt;

&lt;p&gt;Footnotes work mostly like reference-style links. A footnote is made of two things: a marker in the text that will become a superscript number; 
a footnote definition that will be placed in a list of footnotes at the end of the document. A footnote looks like this:&lt;/p&gt;

&lt;p&gt;That’s some text with a footnote&lt;sup id=&quot;fnref:1&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;That&apos;s some text with a footnote.[^1]

[^1]: And that&apos;s the footnote.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;abbreviation&quot;&gt;Abbreviation&lt;/h2&gt;

&lt;p&gt;The &lt;abbr title=&quot;Hyper Text Markup Language&quot;&gt;HTML&lt;/abbr&gt; specification is maintained by the W3C.&lt;/p&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;The HTML specification is maintained by the W3C.

*[HTML]: Hyper Text Markup Language
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;illustration-content&quot;&gt;Illustration Content&lt;/h1&gt;

&lt;h2 id=&quot;image&quot;&gt;Image&lt;/h2&gt;

&lt;p&gt;TODO&lt;/p&gt;

&lt;h2 id=&quot;video&quot;&gt;Video&lt;/h2&gt;

&lt;p&gt;TODO&lt;/p&gt;

&lt;h2 id=&quot;presentation&quot;&gt;Presentation&lt;/h2&gt;

&lt;p&gt;TODO&lt;/p&gt;

&lt;h2 id=&quot;diagram&quot;&gt;Diagram&lt;/h2&gt;

&lt;p&gt;TODO&lt;/p&gt;

&lt;h1 id=&quot;informatics-code&quot;&gt;Informatics Code&lt;/h1&gt;

&lt;h2 id=&quot;programming-language&quot;&gt;Programming Language&lt;/h2&gt;

&lt;p&gt;The used syntax highlighter is Rouge, see
the &lt;a href=&quot;https://github.com/rouge-ruby/rouge/wiki/List-of-supported-languages-and-lexers&quot;&gt;list of supported languages and lexers&lt;/a&gt;,
with python, java, scala, rust, c#, c++, c, bash, ruby, go, typescript,
javascript, html, css etc.&lt;/p&gt;

&lt;div class=&quot;language-python 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;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Hello world!&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ python
print(&quot;Hello world!&quot;)
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-r 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;n&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Hello World!&quot;&lt;/span&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;n&quot;&gt;quote&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;FALSE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ r
print(&quot;Hello World!&quot;, quote = FALSE)
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-m 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;nb&quot;&gt;disp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Hello World!&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ m
disp(&apos;Hello World!&apos;)
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-java 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;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello world!&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ java 
System.out.println(&quot;Hello world!&quot;);
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-kotlin 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;nf&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello world!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ kotlin 
println(&quot;Hello world!&quot;)
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-scala 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;nf&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello world!&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ scala 
println(&quot;Hello world!&quot;)
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-csharp 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;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello world!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ csharp 
Console.WriteLine(&quot;Hello world!&quot;);
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-dart 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;n&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ dart
print(&quot;Hello World!&quot;);
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-swift 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;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ swift
print(&quot;Hello World!&quot;)
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-rust 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;nd&quot;&gt;println!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ rust
println!(&quot;Hello World!&quot;);
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-c++ 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;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ c++
std::cout &amp;lt;&amp;lt; &quot;Hello World!&quot;;
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-c 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;n&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ c 
printf(&quot;Hello, World!&quot;);
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-bash 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;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Hello world!&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ bash 
echo &quot;Hello world!&quot;
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-ruby 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;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Hello world!&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ ruby 
puts &quot;Hello world!&quot;
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-go 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;import&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello world!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ go
import(&quot;fmt&quot;)

fmt.Println(&quot;Hello world!&quot;)
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-php 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;print&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Hello world!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ php
print &quot;Hello world!&quot;;
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-perl 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;print&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;Hello world!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&quot;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ perl
print &quot;Hello world!&quot;;
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-typescript 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;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;Hello world!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ typescript
console.log(&quot;Hello world!&quot;);
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-javascript 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;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;Hello world!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ javascript
console.log(&quot;Hello world!&quot;);
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-sql 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;CREATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;helloworld&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ sql
CREATE TABLE helloworld;
~~~
&lt;/pre&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;p&amp;gt;&lt;/span&gt;Hello world!&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;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ html
&amp;lt;p&amp;gt;Hello world&amp;lt;/p&amp;gt;
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-css 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;.hello&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;.world&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;text-align&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;center&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ css
.hello .world {
  text-align: center
}
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-sass 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;.hello&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nc&quot;&gt;.world&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;text-align&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;center&lt;/span&gt;
  &lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ sass
.hello {
  .world {
    text-align: center
  }
}
~~~
&lt;/pre&gt;

&lt;h2 id=&quot;terminal&quot;&gt;Terminal&lt;/h2&gt;

&lt;p&gt;Have a dark terminal container:&lt;/p&gt;

&lt;div class=&quot;language-terminal 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;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;command&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;result
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;pre&gt;
~~~ terminal
$ command
result
~~~
&lt;/pre&gt;

&lt;h2 id=&quot;text-file&quot;&gt;Text File&lt;/h2&gt;

&lt;p&gt;Highlight your text file content: plain, json, yaml, xml, ini etc.&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&quot;Hello World!&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~
&quot;Hello World!&quot;
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-json 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;nl&quot;&gt;&quot;message&quot;&lt;/span&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;s2&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ json
{&quot;message&quot;: &quot;Hello World!&quot;}
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-yaml 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;na&quot;&gt;hello&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;world&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Hello&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;World!&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ yaml
hello:
  world: &quot;Hello World!&quot;
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-xml 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;cp&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;message&amp;gt;&lt;/span&gt;Hello World!&lt;span class=&quot;nt&quot;&gt;&amp;lt;/message&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;pre&gt;
~~~ xml
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;message&amp;gt;Hello World!&amp;lt;/message&amp;gt;
~~~
&lt;/pre&gt;

&lt;div class=&quot;language-ini 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;nn&quot;&gt;[message]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Source code:&lt;/p&gt;
&lt;pre&gt;
~~~ ini
[message]
message=&quot;Hello World!&quot;
~~~
&lt;/pre&gt;

&lt;h1 id=&quot;mathematics-equation&quot;&gt;Mathematics Equation&lt;/h1&gt;

&lt;p&gt;Use LateX syntax, see &lt;a href=&quot;https://www.latex-project.org&quot;&gt;latex-project.org&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;warning&quot;&gt;
  &lt;p&gt;The dollar symbol $ becomes a meta symbol, so there is a conflict
  with the dollar symbol use the &lt;abbr title=&quot;Hyper Text Markup Language&quot;&gt;HTML&lt;/abbr&gt; code &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&amp;amp;#36;&lt;/code&gt; to see the dollar symbol $.&lt;/p&gt;
&lt;/div&gt;

&lt;h2 id=&quot;in-line-equation&quot;&gt;In-line Equation&lt;/h2&gt;

&lt;p&gt;This equation $\int_0^1 x^2dx = \frac{1}{3}$ is in-line.&lt;/p&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;This equation $\int_0^1 x^2dx = \frac{1}{3}$ is in-line.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;single-line-equation&quot;&gt;Single-line Equation&lt;/h2&gt;

&lt;p&gt;This equation is single-line and centered:&lt;/p&gt;

\[\int_0^1 x^2dx = \frac{1}{3}\]

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$$\int_0^1 x^2dx = \frac{1}{3}$$
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;multi-lines-equation&quot;&gt;Multi-lines Equation&lt;/h2&gt;

&lt;p&gt;This equation is multi-line and centered:&lt;/p&gt;

\[\displaylines{
\int_0^1 x\,dx = \frac{1}{2} \\
\int_0^1 x^2dx = \frac{1}{3}
}\]

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$$
\displaylines{
\int_0^1 x\,dx = \frac{1}{2} \\
\int_0^1 x^2dx = \frac{1}{3} 
}
$$
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;special-content&quot;&gt;Special Content&lt;/h1&gt;

&lt;h2 id=&quot;html&quot;&gt;&lt;abbr title=&quot;Hyper Text Markup Language&quot;&gt;HTML&lt;/abbr&gt;&lt;/h2&gt;

&lt;p&gt;TODO&lt;/p&gt;

&lt;h2 id=&quot;comment&quot;&gt;Comment&lt;/h2&gt;

&lt;p&gt;If you want to put a hidden text not displayed in the article but present in the
written source, that is to say, a comment, simply do an &lt;abbr title=&quot;Hyper Text Markup Language&quot;&gt;HTML&lt;/abbr&gt; comment:&lt;/p&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;!-- comments --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;escape&quot;&gt;Escape&lt;/h2&gt;

&lt;div class=&quot;info&quot;&gt;
  &lt;p&gt;All described multi-lines escapes can work to escape inline and single line characters.&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Character by Character&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use a backslash &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;\&lt;/code&gt;, see the &lt;a href=&quot;https://kramdown.gettalong.org/syntax.html#automatic-and-manual-escaping&quot;&gt;list of all the characters that can be escaped&lt;/a&gt;, or &lt;abbr title=&quot;Hyper Text Markup Language&quot;&gt;HTML&lt;/abbr&gt; entities like &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&amp;amp;lt;&lt;/code&gt; or &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&amp;amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inline and Single Line Characters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of using multiple backslashes, use for multiple characters inline and composing a single line, these syntaxes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;`inline or single line`&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But you cannot display &lt;code&gt;`&lt;/code&gt; inside a section delimited by &lt;code&gt;`&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-lines Characters&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;&amp;lt;code&amp;gt;inline or single line&amp;lt;/code&amp;gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have to display reserved characters such as &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&amp;lt;&lt;/code&gt;, and &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&amp;gt;&lt;/code&gt; within the &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&amp;lt;code&amp;gt;&lt;/code&gt; section, the characters must be escaped using their respective &lt;abbr title=&quot;Hyper Text Markup Language&quot;&gt;HTML&lt;/abbr&gt; entity:
&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&amp;lt;: &amp;amp;lt;&lt;/code&gt;, and &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&amp;gt;: &amp;amp;gt;&lt;/code&gt;. But you cannot escape &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&amp;amp;&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;&amp;lt;pre&amp;gt;multi-lines&amp;lt;/pre&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have to display reserved characters such as &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&amp;lt;&lt;/code&gt;,&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&amp;gt;&lt;/code&gt;, &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&amp;amp;&lt;/code&gt;, and &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&quot;&lt;/code&gt; within the &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; section, the characters must be escaped using their respective &lt;abbr title=&quot;Hyper Text Markup Language&quot;&gt;HTML&lt;/abbr&gt; entity:
&lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&amp;lt;: &amp;amp;lt;&lt;/code&gt;, &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&amp;gt;: &amp;amp;gt;&lt;/code&gt;, &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&amp;amp;: &amp;amp;amp;&lt;/code&gt;, and &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;&quot;: &amp;amp;quot;&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;~~~ multi-lines ~~~&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But you cannot to display reserved sequence of characters &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;~~~&lt;/code&gt; within a section delimited by &lt;code class=&quot;language-text highlighter-rouge&quot;&gt;~~~&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;``` multi-lines ```&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But you cannot to display reserved sequence of characters &lt;code&gt;```&lt;/code&gt; within a section delimited by &lt;code&gt;```&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;others&quot;&gt;Others&lt;/h2&gt;

&lt;p&gt;TODO&lt;/p&gt;
&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;And that’s the footnote. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content><author>
       <name>glegoux</name>
       <uri></uri>
   </author></entry>
 

</feed>
