<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pierre Grimaud</title>
    <description>The latest articles on DEV Community by Pierre Grimaud (@pgrimaud).</description>
    <link>https://dev.to/pgrimaud</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F21264%2Ff09719ce-cf8f-4d77-876f-786ccb7a560f.jpg</url>
      <title>DEV Community: Pierre Grimaud</title>
      <link>https://dev.to/pgrimaud</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pgrimaud"/>
    <language>en</language>
    <item>
      <title>Redraw a masterpiece with mosaic pictures</title>
      <dc:creator>Pierre Grimaud</dc:creator>
      <pubDate>Wed, 30 Jun 2021 16:19:35 +0000</pubDate>
      <link>https://dev.to/pgrimaud/redraw-a-masterpiece-with-mosaic-pictures-2138</link>
      <guid>https://dev.to/pgrimaud/redraw-a-masterpiece-with-mosaic-pictures-2138</guid>
      <description>&lt;p&gt;Today, my brilliant intern &lt;a href="https://twitter.com/nispeon"&gt;@nispeon&lt;/a&gt; finished a small project I imagined last year: redraw a masterpiece with mosaic pictures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explanation of the project
&lt;/h2&gt;

&lt;p&gt;I created an exercice for him, to work with python, GitHub API and GitHub Actions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Main goal&lt;/strong&gt;: redraw a masterpiece with mosaic pictures.&lt;/p&gt;

&lt;p&gt;We would have been able to use a random sample of pictures to do this exercice, but we thought it could be funny for visitors to check where's their avatar on the generated picture.&lt;/p&gt;

&lt;p&gt;We found a nice project &lt;a href="https://github.com/uvipen/Photomosaic-generator"&gt;Photomosaic generator&lt;/a&gt; by &lt;a href="https://github.com/uvipen"&gt;Viet Nguyen&lt;/a&gt; to generate mosaic with pictures.&lt;/p&gt;

&lt;p&gt;So we decided to re-use his code base which works perfectly.&lt;/p&gt;

&lt;h2&gt;
  
  
  How is generated the picture?
&lt;/h2&gt;

&lt;p&gt;Each day, the script will : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetch all stargazers of the repository using GitHub API&lt;/li&gt;
&lt;li&gt;Download avatar picture of all users&lt;/li&gt;
&lt;li&gt;Extract main color of each avatar picture&lt;/li&gt;
&lt;li&gt;Split origin picture into small parts of 30px&lt;/li&gt;
&lt;li&gt;Extract main color of each part of the origin picture&lt;/li&gt;
&lt;li&gt;Match color of each part with the color of an avatar and replace it on the origin picture&lt;/li&gt;
&lt;li&gt;Write the new picture on a folder&lt;/li&gt;
&lt;li&gt;Commit the picture generated using GitHub Actions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How you can help
&lt;/h2&gt;

&lt;p&gt;We will not add random people without permission, so if you would like to participate: you just have to star &lt;a href="https://github.com/pgrimaud/pgrimaud"&gt;this repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Why do you need to star to participate? Because it will be very easy to retrieve all avatars with GitHub API and automatically update the image every day.&lt;/p&gt;

&lt;p&gt;The more stargazers we will get, more qualitative will be the output. We could also reduce the size of the avatars to get best definition.&lt;/p&gt;

&lt;h2&gt;
  
  
  First result
&lt;/h2&gt;

&lt;p&gt;Original picture :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gIqfR1Qi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/5/5b/Michelangelo_-_Creation_of_Adam_%2528cropped%2529.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gIqfR1Qi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/5/5b/Michelangelo_-_Creation_of_Adam_%2528cropped%2529.jpg" alt="original picture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Output picture :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_3FNB-eG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/pgrimaud/pgrimaud/master/data/output.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_3FNB-eG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/pgrimaud/pgrimaud/master/data/output.jpg" alt="output picture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Take a look at the &lt;a href="https://raw.githubusercontent.com/pgrimaud/pgrimaud/master/data/output.jpg"&gt;HD generated picture&lt;/a&gt; and the &lt;a href="https://github.com/pgrimaud/pgrimaud"&gt;repository&lt;/a&gt; 👀&lt;/p&gt;

&lt;p&gt;What do you think about it?&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
Pierre 🤖&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;__&lt;br&gt;
&lt;em&gt;&lt;a href="https://github.com/pgrimaud"&gt;Connect with me on GitHub&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://twitter.com/pgrimaud_"&gt;Connect with me on Twitter&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>art</category>
      <category>python</category>
      <category>github</category>
      <category>actions</category>
    </item>
    <item>
      <title>How to generate a random number in Shopify?</title>
      <dc:creator>Pierre Grimaud</dc:creator>
      <pubDate>Tue, 26 Jan 2021 18:08:41 +0000</pubDate>
      <link>https://dev.to/pgrimaud/how-to-generate-a-random-number-in-shopify-2nd5</link>
      <guid>https://dev.to/pgrimaud/how-to-generate-a-random-number-in-shopify-2nd5</guid>
      <description>&lt;p&gt;Hello there, this is my first post in DEV. 🙋🏻‍♂️&lt;/p&gt;

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

&lt;p&gt;Random is always useful, even on e-commerce environments. Showing random products or pictures for example, could be nice. &lt;/p&gt;

&lt;h1&gt;
  
  
  What's the problem?
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://shopify.github.io/liquid/"&gt;Liquid&lt;/a&gt; is a template language created by Shopify and written in Ruby. It is the backbone of Shopify themes and is used to load dynamic content on storefronts.&lt;/p&gt;

&lt;p&gt;There's an awesome &lt;a href="https://www.shopify.com/partners/shopify-cheat-sheet"&gt;Shopify cheat sheet&lt;/a&gt; with basics, tags, filters and objects available on Liquid. But the are &lt;strong&gt;no tags to pick a random number from a range&lt;/strong&gt; or just generate one.&lt;/p&gt;

&lt;p&gt;Let me explain you how to do it with a simple trick.&lt;/p&gt;

&lt;h1&gt;
  
  
  How?
&lt;/h1&gt;

&lt;p&gt;First, define &lt;code&gt;min&lt;/code&gt; and &lt;code&gt;max&lt;/code&gt; numbers. They will be use as range to generate a random number.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight liquid"&gt;&lt;code&gt;&lt;span class="p"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;assign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;O&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-%}&lt;/span&gt;
&lt;span class="p"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;assign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;max&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, get the current date with &lt;code&gt;"now"&lt;/code&gt; and apply the "%N" date filter to get fractional seconds digits (precise to nanoseconds).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight liquid"&gt;&lt;code&gt;&lt;span class="p"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;assign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;date_fract&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"now"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"%N"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, use the modulo filter to get a random value between your min &amp;amp; max values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight liquid"&gt;&lt;code&gt;&lt;span class="p"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;assign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;diff&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;max&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;minus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-%}&lt;/span&gt;
&lt;span class="p"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;assign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;random_number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"now"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"%N"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;modulo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;diff&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, add your &lt;code&gt;min&lt;/code&gt; value to the result.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight liquid"&gt;&lt;code&gt;&lt;span class="p"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;assign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;random_number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;random_number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;plus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In short:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight liquid"&gt;&lt;code&gt;&lt;span class="p"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;assign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-%}&lt;/span&gt;
&lt;span class="p"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;assign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;max&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-%}&lt;/span&gt;
&lt;span class="p"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;assign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;diff&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;max&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;minus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-%}&lt;/span&gt;
&lt;span class="p"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;assign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;random_number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"now"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"%N"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;modulo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;diff&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;plus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use it as snippets as well:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight liquid"&gt;&lt;code&gt;&lt;span class="p"&gt;{%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;render&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'random-number'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;%}&lt;/span&gt; # snippets with random number code 
&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;random_number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt; # here's your random number
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;br&gt;
&lt;strong&gt;With a random number, you can now pick a random value in an array of products, pictures or whatever.&lt;/strong&gt; 💯&lt;/p&gt;

&lt;h1&gt;
  
  
  Limitations
&lt;/h1&gt;

&lt;p&gt;On Shopify, store pages are aggressively cached. Using it on production theme may not work as intended and random numbers could be stuck for &lt;em&gt;minutes or hours&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Adding a product to card or editing a product on Shopify back-end will flush cache, so use is wisely.&lt;/p&gt;

&lt;h1&gt;
  
  
  Wanna more?
&lt;/h1&gt;

&lt;p&gt;This code comes from a repository &lt;a href="https://github.com/pgrimaud/shopify-snippets"&gt;Shopify snippets&lt;/a&gt; with "ready to use" parts of code which can be reusable when developing Shopify themes. &lt;/p&gt;

&lt;p&gt;Put a 🌟 if this post helped you. :)&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
Pierre 🤖&lt;br&gt;
 &lt;br&gt;
__&lt;br&gt;
&lt;em&gt;&lt;a href="https://github.com/pgrimaud"&gt;Follow me on GitHub&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://twitter.com/pgrimaud_"&gt;Follow me on Twitter&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
 &lt;br&gt;
&lt;em&gt;&lt;a href="https://pixabay.com/photos/dice-games-game-random-probability-5432439/"&gt;Cover image via Pixabay&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>liquid</category>
    </item>
  </channel>
</rss>
