<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Jothi Prasath</title><link>https://jothiprasath.com/</link><description>Recent content on Jothi Prasath</description><language>en</language><lastBuildDate>Mon, 29 Jan 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://jothiprasath.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Search</title><link>https://jothiprasath.com/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://jothiprasath.com/search/</guid><description>&lt;p>
&lt;input id="search" type="text" placeholder="Enter your search query here">
&lt;/p>
&lt;ul id="results">&lt;/ul>
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js">&lt;/script>
&lt;!-- &lt;script src="./js/jquery.js">&lt;/script> -->
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lunr.js/2.3.9/lunr.min.js">&lt;/script>
&lt;script>
var lunrIndex,
$results,
documents;
function initLunr() {
// retrieve the index file
$.getJSON("/index.json")
.done(function(index) {
documents = index;
lunrIndex = lunr(function(){
this.ref('href')
this.field('content')
this.field("title", {
boost: 10
});
this.field("tags", {
boost: 5
});
documents.forEach(function(doc) {
try {
this.add(doc)
} catch (e) {}
}, this)
})
})
.fail(function(jqxhr, textStatus, error) {
var err = textStatus + ", " + error;
console.error("Error getting Lunr index file:", err);
});
}
function search(query) {
return lunrIndex.search(query).map(function(result) {
return documents.filter(function(page) {
try {
console.log(page)
return page.href === result.ref;
} catch (e) {
console.log('whoops')
}
})[0];
});
}
function renderResults(results) {
if (!results.length) {
return;
}
// show first ten results
results.slice(0, 10).forEach(function(result) {
var $result = $("&lt;li>");
$result.append($("&lt;a>", {
href: result.href,
text: "» " + result.title
}));
$results.append($result);
});
}
function initUI() {
$results = $("#results");
$("#search").keyup(function(){
// empty previous results
$results.empty();
// trigger search when at least two chars provided.
var query = $(this).val();
if (query.length &lt; 2) {
return;
}
var results = search(query);
renderResults(results);
});
}
initLunr();
$(document).ready(function(){
initUI();
});
&lt;/script></description></item><item><title>How to enable Anime4k upscaling in MPV player</title><link>https://jothiprasath.com/blog/mpv-anime4k-upscaling/</link><pubDate>Mon, 29 Jan 2024 00:00:00 +0000</pubDate><guid>https://jothiprasath.com/blog/mpv-anime4k-upscaling/</guid><description>&lt;h2 id="what-is-anime4k">What is Anime4k?&lt;/h2>
&lt;p>&lt;a href="https://github.com/bloc97/Anime4K">Anime4K&lt;/a> is a set of open-source, high-quality real-time anime upscaling/denoising algorithms that can be implemented in any programming language. This is also not replacement for &lt;a href="https://github.com/tensorlayer/SRGAN">SRGANs&lt;/a>, as they perform much better on low-resolution images or images with lots of degradation.&lt;/p>
&lt;div class="hint">
&lt;p class="hint-title">&lt;i class="fa fa-info-circle">&lt;/i>&amp;nbsp;&amp;nbsp;&lt;strong>Disclaimer&lt;/strong>&lt;/p>
&lt;p class="hint-body">Anime4k is optimized for native 1080p anime. For lower resolution video file try using &lt;a href="./blog/mpv-fsr-upscaling">FSR upscaling&lt;/a>.&lt;/p>
&lt;/div>
&lt;h2 id="samples">Samples&lt;/h2>
&lt;img-comparison-slider hover="hover">
&lt;figure slot="first" class="before">
&lt;img slot="first" src="./img/mpv-anime4k/summer-wars1-before.jpg" />
&lt;figcaption>Before&lt;/figcaption>
&lt;/figure>
&lt;figure slot="second" class="after">
&lt;img slot="second" src="./img/mpv-anime4k/summer-wars1-after.jpg" />
&lt;figcaption>After&lt;/figcaption>
&lt;/figure>
&lt;/img-comparison-slider>
&lt;figcaption>Summer Wars (2009)&lt;/figcaption>
&lt;img-comparison-slider hover="hover">
&lt;figure slot="first" class="before">
&lt;img slot="first" src="./img/mpv-anime4k/summer-wars2-before.jpg" />
&lt;figcaption>Before&lt;/figcaption>
&lt;/figure>
&lt;figure slot="second" class="after">
&lt;img slot="second" src="./img/mpv-anime4k/summer-wars2-after.jpg" />
&lt;figcaption>After&lt;/figcaption>
&lt;/figure>
&lt;/img-comparison-slider>
&lt;figcaption>Summer Wars (2009)&lt;/figcaption>
&lt;img-comparison-slider hover="hover">
&lt;figure slot="first" class="before">
&lt;img slot="first" src="./img/mpv-anime4k/ponyo-before.jpg" />
&lt;figcaption>Before&lt;/figcaption>
&lt;/figure>
&lt;figure slot="second" class="after">
&lt;img slot="second" src="./img/mpv-anime4k/ponyo-after.jpg" />
&lt;figcaption>After&lt;/figcaption>
&lt;/figure>
&lt;/img-comparison-slider>
&lt;figcaption>Ponyo (2008)&lt;/figcaption>
&lt;h2 id="step-1-install-mpv">Step 1: Install MPV&lt;/h2>
&lt;h3 id="windows">Windows&lt;/h3>
&lt;p>Download the installer from the &lt;a href="https://mpv.io/installation/">official MPV website&lt;/a> and follow the installation instructions.&lt;/p>
&lt;h3 id="linux">Linux&lt;/h3>
&lt;p>Ubuntu/Debian&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install mpv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Fedora&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo dnf install mpv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="mac">Mac&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>brew install mpv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="step-2-create-a-shaders-directory">Step 2: Create a Shaders Directory&lt;/h2>
&lt;h3 id="windows-1">Windows&lt;/h3>
&lt;ol>
&lt;li>Navigate to appdata. This is typically located in %APPDATA%. You can quickly navigate there by entering this path into the File Explorer&amp;rsquo;s address bar.&lt;/li>
&lt;li>Create a Folder &amp;ldquo;mpv&amp;rdquo; inside that folder.&lt;/li>
&lt;li>Inside the &amp;ldquo;mpv&amp;rdquo; folder, create another folder named &amp;ldquo;shaders&amp;rdquo;.&lt;/li>
&lt;li>Inside that &amp;ldquo;shaders&amp;rdquo; folder, create a folder named &amp;ldquo;anime4k&amp;rdquo;.&lt;/li>
&lt;/ol>
&lt;h3 id="linuxmac">Linux/Mac&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkdir -P ~/.config/mpv/shaders/anime4k
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="step-3-download-the-anime4k-shaders-into-mpv">Step 3: Download the Anime4k Shaders into MPV&lt;/h2>
&lt;h3 id="windows-2">Windows&lt;/h3>
&lt;ol>
&lt;li>Download this file &lt;a href="https://github.com/bloc97/Anime4K/releases/download/v4.0.1/Anime4K_v4.0.zip">https://github.com/bloc97/Anime4K/releases/download/v4.0.1/Anime4K_v4.0.zip&lt;/a>&lt;/li>
&lt;li>Extract the downloaded file, where you can find bunch of &lt;code>.glsl&lt;/code> files.&lt;/li>
&lt;li>Copy that those &lt;code>.glsl&lt;/code> files into previously created &amp;ldquo;anime4k&amp;rdquo; folder.&lt;/li>
&lt;/ol>
&lt;h3 id="linuxmac-1">Linux/Mac&lt;/h3>
&lt;p>Run this command to download the Anime4k shaders into mpv shaders folder&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -Lo ~/.config/mpv/shaders/anime4k/anime4k.zip https://github.com/bloc97/Anime4K/releases/download/v4.0.1/Anime4K_v4.0.zip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>unzip ~/.config/mpv/shaders/anime4k/anime4k.zip -d ~/.config/mpv/shaders/anime4k/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rm ~/.config/mpv/shaders/anime4k/anime4k.zip
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="step-4-modify-mpv-configuration-file">Step 4: Modify MPV Configuration File&lt;/h2>
&lt;h3 id="windows-3">Windows&lt;/h3>
&lt;ol>
&lt;li>open the mpv folder and create a text file &amp;ldquo;input.conf&amp;rdquo;&lt;/li>
&lt;li>Paste the following lines and save it.&lt;/li>
&lt;/ol>
&lt;pre tabindex="0">&lt;code>CTRL+1 no-osd change-list glsl-shaders set &amp;#34;~~/shaders/anime4K/Anime4K_Clamp_Highlights.glsl:~~/shaders/anime4K/Anime4K_Restore_CNN_M.glsl:~~/shaders/anime4K/Anime4K_Upscale_CNN_x2_M.glsl:~~/shaders/anime4K/Anime4K_Restore_CNN_S.glsl:~~/shaders/anime4K/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/anime4K/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/anime4K/Anime4K_Upscale_CNN_x2_S.glsl&amp;#34;; show-text &amp;#34;Anime4K&amp;#34;
CTRL+0 no-osd change-list glsl-shaders clr &amp;#34;&amp;#34;; show-text &amp;#34;GLSL shaders cleared&amp;#34;
&lt;/code>&lt;/pre>&lt;h3 id="linuxmac-2">Linux/Mac&lt;/h3>
&lt;ol>
&lt;li>Run this command to create/open input.conf file&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>nano ~/.config/mpv/input.conf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>Paste the following lines and save it.&lt;/li>
&lt;/ol>
&lt;pre tabindex="0">&lt;code>CTRL+1 no-osd change-list glsl-shaders set &amp;#34;~~/shaders/anime4K/Anime4K_Clamp_Highlights.glsl:~~/shaders/anime4K/Anime4K_Restore_CNN_M.glsl:~~/shaders/anime4K/Anime4K_Upscale_CNN_x2_M.glsl:~~/shaders/anime4K/Anime4K_Restore_CNN_S.glsl:~~/shaders/anime4K/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/anime4K/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/anime4K/Anime4K_Upscale_CNN_x2_S.glsl&amp;#34;; show-text &amp;#34;Anime4K&amp;#34;
CTRL+0 no-osd change-list glsl-shaders clr &amp;#34;&amp;#34;; show-text &amp;#34;GLSL shaders cleared&amp;#34;
&lt;/code>&lt;/pre>&lt;h2 id="usage-instructions">Usage Instructions&lt;/h2>
&lt;p>Play a anime video and press ctrl+1 to enable Anime4k and ctrl+0 for disable it.&lt;/p></description></item><item><title>How to enable FSR upscaling in MPV player</title><link>https://jothiprasath.com/blog/mpv-fsr-upscaling/</link><pubDate>Fri, 26 Jan 2024 00:00:00 +0000</pubDate><guid>https://jothiprasath.com/blog/mpv-fsr-upscaling/</guid><description>&lt;h2 id="what-is-fsr-fidelityfx-super-resolution">What is FSR (FidelityFX Super Resolution)?&lt;/h2>
&lt;p>FSR, or FidelityFX Super Resolution, is an upscaling technology developed by AMD (Advanced Micro Devices) to improve the visual quality of lower-resolution images or videos in real-time. It is designed to enhance the gaming and multimedia experience by providing a more detailed and sharper image without significantly impacting performance.&lt;/p>
&lt;p>Here we are going to apply the same fsr techinque to mpv media player to upscale the lower resolution videos.&lt;/p>
&lt;h2 id="step-1-install-mpv">Step 1: Install MPV&lt;/h2>
&lt;h3 id="windows">Windows&lt;/h3>
&lt;p>Download the installer from the &lt;a href="https://mpv.io/installation/">official MPV website&lt;/a> and follow the installation instructions.&lt;/p>
&lt;h3 id="linux">Linux&lt;/h3>
&lt;p>Ubuntu/Debian&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install mpv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Fedora&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo dnf install mpv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="mac">Mac&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>brew install mpv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="step-2-create-a-shaders-directory">Step 2: Create a Shaders Directory&lt;/h2>
&lt;h3 id="windows-1">Windows&lt;/h3>
&lt;ol>
&lt;li>Navigate to appdata. This is typically located in %APPDATA%. You can quickly navigate there by entering this path into the File Explorer&amp;rsquo;s address bar.&lt;/li>
&lt;li>Create a Folder &amp;ldquo;mpv&amp;rdquo; inside that folder.&lt;/li>
&lt;li>Inside the &amp;ldquo;mpv&amp;rdquo; folder, create another folder named &amp;ldquo;shaders&amp;rdquo;.&lt;/li>
&lt;/ol>
&lt;h3 id="linuxmac">Linux/Mac&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkdir -P ~/.config/mpv/shaders
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="step-3-download-the-fsr-shader-into-shaders-folder">Step 3: Download the FSR Shader into shaders folder&lt;/h2>
&lt;h3 id="windows-2">Windows&lt;/h3>
&lt;ol>
&lt;li>Open your web browser and go to this website &lt;a href="https://gist.github.com/agyild/82219c545228d70c5604f865ce0b0ce5">https://gist.github.com/agyild/82219c545228d70c5604f865ce0b0ce5&lt;/a>&lt;/li>
&lt;li>Click on the Download ZIP button on the top right corner.&lt;/li>
&lt;li>Extract the downloaded file, where you can find &lt;code>fsr.glsl&lt;/code>.&lt;/li>
&lt;li>Copy that &lt;code>fsr.glsl&lt;/code> into newly created shaders folder.&lt;/li>
&lt;/ol>
&lt;h3 id="linuxmac-1">Linux/Mac&lt;/h3>
&lt;p>Run this command to download the FSR shaders into shaders folder&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -Lo ~/.config/mpv/shaders/FSR.glsl https://gist.githubusercontent.com/agyild/82219c545228d70c5604f865ce0b0ce5/raw/2623d743b9c23f500ba086f05b385dcb1557e15d/FSR.glsl
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="step-4-modify-mpv-configuration-file">Step 4: Modify MPV Configuration File&lt;/h2>
&lt;h3 id="windows-3">Windows&lt;/h3>
&lt;ol>
&lt;li>open the mpv folder and create a text file input.conf&lt;/li>
&lt;li>Paste the following lines and save it.&lt;/li>
&lt;/ol>
&lt;pre tabindex="0">&lt;code>CTRL+1 no-osd change-list glsl-shaders set &amp;#34;~~/shaders/FSR.glsl&amp;#34;; show-text &amp;#34;FSR&amp;#34;
CTRL+0 no-osd change-list glsl-shaders clr &amp;#34;&amp;#34;; show-text &amp;#34;GLSL shaders cleared&amp;#34;
&lt;/code>&lt;/pre>&lt;h3 id="linuxmac-2">Linux/Mac&lt;/h3>
&lt;ol>
&lt;li>Run this command to create/open input.conf file&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>nano ~/.config/mpv/input.conf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>Paste the following lines and save it.&lt;/li>
&lt;/ol>
&lt;pre tabindex="0">&lt;code>CTRL+1 no-osd change-list glsl-shaders set &amp;#34;~~/shaders/FSR.glsl&amp;#34;; show-text &amp;#34;FSR&amp;#34;
CTRL+0 no-osd change-list glsl-shaders clr &amp;#34;&amp;#34;; show-text &amp;#34;GLSL shaders cleared&amp;#34;
&lt;/code>&lt;/pre>&lt;h2 id="usage-instructions">Usage Instructions&lt;/h2>
&lt;p>Play a video which is lower than your display resolution and press ctrl+1 to enable FSR and ctrl+0 for disable FSR.&lt;/p></description></item><item><title>gzip vs zstd: A Performance Comparison</title><link>https://jothiprasath.com/blog/gzip-vs-zstd/</link><pubDate>Sun, 21 Jan 2024 00:00:00 +0000</pubDate><guid>https://jothiprasath.com/blog/gzip-vs-zstd/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>I have a collection of files and folders containing JavaScript, Node.js modules, Python, and C/C++ files from various mini projects. The total size is 3 GB, and while I don&amp;rsquo;t need them all the time, I still want to archive them for occasional use. I usually use &lt;a href="https://wikipedia.org/wiki/Gzip">gzip&lt;/a> for compression, but I&amp;rsquo;m currently experimenting with the newer and more efficient &lt;a href="https://wikipedia.org/wiki/Zstd">zstd&lt;/a> compression. In this blog post, I&amp;rsquo;ll be comparing the compression performance of gzip and zstd.&lt;/p>
&lt;h2 id="system-specifications">System Specifications&lt;/h2>
&lt;ul>
&lt;li>Operating System: &lt;a href="https://archlinux.org/">Arch Linux&lt;/a>&lt;/li>
&lt;li>Processor: &lt;a href="https://www.amd.com/en/products/apu/amd-ryzen-5-5500u">Ryzen 5 5500U&lt;/a> (6c/12t)&lt;/li>
&lt;li>RAM: 8GB&lt;/li>
&lt;/ul>
&lt;h2 id="compression">Compression&lt;/h2>
&lt;h3 id="gzip-with-pigz">gzip with pigz&lt;/h3>
&lt;p>Using &lt;code>pigz&lt;/code>, a parallel implementation of gzip:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>tar -c -I&lt;span style="color:#d88200">&amp;#34;pigz&amp;#34;&lt;/span> -f temp.tar.gz temp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Time taken : 40 seconds&lt;/li>
&lt;li>CPU usage : 50%&lt;/li>
&lt;li>File Size : 848MB&lt;/li>
&lt;/ul>
&lt;!-- &lt;img src="./img/gzip-vs-zstd/gzip-compression.jpg" alt="jpg" loading="lazy" /> -->
&lt;picture>
&lt;source srcset="./img/gzip-vs-zstd/gzip-compression.avif" type="image/avif" />
&lt;img class="inline" src="./img/gzip-vs-zstd/gzip-compression.png" alt="gzip compression" title="gzip compression" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
&lt;h3 id="zstd">zstd&lt;/h3>
&lt;p>The zstd compression algorithm offers a range of compression levels from 1-19, where 1 is least compression and 19 is highest compression. Using higher compression levels requires more cpu power and time. Therefore i have choosen a sweet spot and decided on level 3 and 19.&lt;/p>
&lt;h4 id="zstd-level-3">zstd (Level 3)&lt;/h4>
&lt;p>Using zstd with level 3(default)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>tar c -I&lt;span style="color:#d88200">&amp;#34;zstd -T0&amp;#34;&lt;/span> -f temp.tar.zst temp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Time taken : 27 seconds&lt;/li>
&lt;li>CPU usage : 15%&lt;/li>
&lt;li>File Size : 770MB
&lt;picture>
&lt;source srcset="./img/gzip-vs-zstd/zstd-3-compression.avif" type="image/avif" />
&lt;img class="inline" src="./img/gzip-vs-zstd/zstd-3-compression.png" alt="zstd (Level 3) compression" title="zstd (Level 3) compression" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
&lt;/li>
&lt;/ul>
&lt;h4 id="zstd-level-19">zstd (Level 19)&lt;/h4>
&lt;p>Using zstd with level 19&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>tar c -I&lt;span style="color:#d88200">&amp;#34;zstd -19 -T0&amp;#34;&lt;/span> -f temp.tar.zst temp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Time taken : 4 minutes 2 seconds&lt;/li>
&lt;li>CPU usage : 50%&lt;/li>
&lt;li>File Size : 593MB
&lt;picture>
&lt;source srcset="./img/gzip-vs-zstd/zstd-19-compression.avif" type="image/avif" />
&lt;img class="inline" src="./img/gzip-vs-zstd/zstd-19-compression.png" alt="zstd (Level 19) compression" title="zstd (Level 19) compression" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
&lt;/li>
&lt;/ul>
&lt;h2 id="extraction">Extraction&lt;/h2>
&lt;h3 id="gzip-with-pigz-1">gzip with pigz&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>tar -x -Ipigz -f temp.tar.gz -C temp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Time taken : 56 seconds&lt;/li>
&lt;li>CPU Usage : 10%
&lt;picture>
&lt;source srcset="./img/gzip-vs-zstd/gzip-extraction.avif" type="image/avif" />
&lt;img class="inline" src="./img/gzip-vs-zstd/gzip-extraction.png" alt="gzip extraction" title="gzip extraction" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
&lt;/li>
&lt;/ul>
&lt;h3 id="zstd-level-3-1">zstd (Level 3)&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>tar -x --zstd -f temp.tar.zst -C temp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Time taken : 52 seconds&lt;/li>
&lt;li>CPU Usage : 7%
&lt;picture>
&lt;source srcset="./img/gzip-vs-zstd/zstd-3-extraction.avif" type="image/avif" />
&lt;img class="inline" src="./img/gzip-vs-zstd/zstd-3-extraction.png" alt="zstd (Level 3) extraction" title="zstd (Level 3) extraction" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
&lt;/li>
&lt;/ul>
&lt;h3 id="zstd-level-19-1">zstd (Level 19)&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>tar -x --zstd -f temp.tar.zst -C temp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Time taken : 50 seconds&lt;/li>
&lt;li>CPU Usage : 7%
&lt;picture>
&lt;source srcset="./img/gzip-vs-zstd/zstd-19-extraction.avif" type="image/avif" />
&lt;img class="inline" src="./img/gzip-vs-zstd/zstd-19-extraction.png" alt="zstd (Level 19) extraction" title="zstd (Level 19) extraction" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
&lt;/li>
&lt;/ul>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>
&lt;picture>
&lt;source srcset="./img/gzip-vs-zstd/graph.avif" type="image/avif" />
&lt;img class="inline" src="./img/gzip-vs-zstd/graph.png" alt="" title="" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
Clearly, the zstd level 19 achieves a smaller size file but comes at the cost of increased CPU power and time consumption. However, using the default zstd (level 3) proves to be a more efficient choice compared to gzip, giving a balance between compression performance and resource utilization. Additionally, the decompression almost similar regardless of which level.&lt;/p></description></item><item><title>How I Optimized My Google Photos Library with the Power of AVIF</title><link>https://jothiprasath.com/blog/how-i-optimized-my-google-photos-library-with-the-power-of-avif/</link><pubDate>Fri, 14 Jul 2023 00:00:00 +0000</pubDate><guid>https://jothiprasath.com/blog/how-i-optimized-my-google-photos-library-with-the-power-of-avif/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>As a user of Google&amp;rsquo;s free tier services, I have access to 15GB of storage. With a total of 2.7GB of Google Photos already occupying my storage, I started to worry about the future growth of my photo collection. Considering the rate at which my photos are accumulating, it became clear that my storage would likely fill up within approximately four or less years. To address this, I decided to convert all my images to a better optimized format. which is absolutely my favorite, AVIF format.&lt;/p>
&lt;h2 id="why-avif-format">Why AVIF Format&lt;/h2>
&lt;p>When it comes to choosing a highly optimized image format, three major formats stand out: HEIC, AVIF, and JXL. However, considering browser and platform support, AVIF emerges as the clear winner. Let me explain why AVIF stands out among these formats.&lt;/p>
&lt;p>JXL, or JPEG XL, offers impressive image compression efficiency. However, &lt;strong>it doesn&amp;rsquo;t supported by popular browsers like Google Chrome and Firefox&lt;/strong>, which are widely used for daily browsing activities. Relying on JXL for image delivery may result in compatibility issues across various platforms.&lt;/p>
&lt;p>On the other hand, HEIC, the format primarily used by Apple devices, has gained popularity due to its efficient compression capabilities. However, &lt;strong>it is not supported by any browsers, except Safari&lt;/strong>. Accessing HEIC images on Android devices can be challenging and may lead to compatibility problems.&lt;/p>
&lt;p>Therefore, considering efficiency, browser, and platform support, &lt;strong>AVIF is the preferred choice for an optimized image format&lt;/strong>. Additionally, I have already written a blog post on the topic of &lt;a href="https://jothiprasath.com/blog/jpg-vs-avif/">&amp;ldquo;JPG vs AVIF: A Comparison&amp;rdquo;&lt;/a>. In that post, I gone into more detail about the efficiency and visual difference between these two formats. Feel free to check it out for more information.&lt;/p>
&lt;h2 id="google-photos-data-extraction">Google Photos Data Extraction&lt;/h2>
&lt;p>To convert all of my Google Photos, first I started by dumping the content from Google Photos using the Google Takeout service &lt;a href="https://takeout.google.com/">https://takeout.google.com/&lt;/a>. Here&amp;rsquo;s a step-by-step description of the process&lt;/p>
&lt;ol>
&lt;li>On the Google Takeout page, I deselected all services.&lt;/li>
&lt;/ol>
&lt;center>
&lt;picture>
&lt;source srcset="./img/google-photos-avif/google-takeout-1.avif" type="image/avif" />
&lt;img class="inline" src="./img/google-photos-avif/google-takeout-1.png" alt="Google takeout" title="Google takeout" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
&lt;/center>
&lt;ol start="2">
&lt;li>I selected Google Photos option as the service to export.&lt;/li>
&lt;/ol>
&lt;center>
&lt;picture>
&lt;source srcset="./img/google-photos-avif/google-takeout-2.avif" type="image/avif" />
&lt;img class="inline" src="./img/google-photos-avif/google-takeout-2.png" alt="Google takeout" title="Google takeout" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
&lt;/center>
&lt;ol start="3">
&lt;li>And initiate the data export and it informed to wait while Google prepared the download.&lt;/li>
&lt;li>After approximately an hour, I received an email from Google containing a download link. This link led me to a zip file containing my Google Photos data.&lt;/li>
&lt;/ol>
&lt;p> &lt;/p>
&lt;center>
&lt;picture>
&lt;source srcset="./img/google-photos-avif/mail.avif" type="image/avif" />
&lt;img class="inline" src="./img/google-photos-avif/mail.png" alt="Mail from google" title="Mail from google" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
&lt;/center>
&lt;h2 id="data-cleaning">Data Cleaning&lt;/h2>
&lt;p>After downloading and extracting the zip files containing my Google Photos data, I was left with a total of 32 folders containing photos and videos. The way they structured initially included individual folders for each album, labeled with the album name. Additionally, separate folders were created for each year, such as &amp;ldquo;photos from 2020,&amp;rdquo; which contained all the photos from that year. However, the album folders duplicated the respective year-specific folders, resulting in unnecessary redundancy.&lt;/p>
&lt;p>So I performed a data cleaning process by &lt;strong>removing all the album and archive folders&lt;/strong>. As a result, Now I have a more organized structure with folders dedicated to each year (e.g., &amp;ldquo;photos from 2020&amp;rdquo;) that contain the photos from that specific year.&lt;/p>
&lt;center>
&lt;picture>
&lt;source srcset="./img/google-photos-avif/folder-1.avif" type="image/avif" />
&lt;img class="inline" src="./img/google-photos-avif/folder-1.png" alt="Organized folders" title="Organized folders" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
&lt;/center>
&lt;h2 id="merging-metadata">Merging Metadata&lt;/h2>
&lt;div class="hint">
&lt;p class="hint-title">&lt;i class="fa fa-info-circle">&lt;/i>&amp;nbsp;&amp;nbsp;&lt;strong>Disclaimer&lt;/strong>&lt;/p>
&lt;p class="hint-body">&lt;/center>The "google-photos-exif" script used for merging metadata, only works well with photos that contain EXIF metadata. EXIF metadata means information like device model, date, and other camera settings &lt;/p>
&lt;/div>
&lt;p>Each of the year-specific folders contains images as well as separate JSON files that hold corresponding metadata. These JSON files contain important information such as the date and time of each image, as well as geolocation data.&lt;/p>
&lt;p>To properly organize the images by date and time, it was crucial to merge the images with their respective JSON files. Fortunately, I discovered a useful script called &lt;a href="https://github.com/mattwilson1024/google-photos-exif">google-photos-exif&lt;/a> on github that specifically performs this task. The script efficiently merges the images with their corresponding JSON metadata and saves them all in one big folder.&lt;/p>
&lt;center>
&lt;picture>
&lt;source srcset="./img/google-photos-avif/metadata-merge.avif" type="image/avif" />
&lt;img class="inline" src="./img/google-photos-avif/metadata-merge.png" alt="Merging metadata" title="Merging metadata" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
&lt;/center>
&lt;p>After completing the merging process, I cross-verified the results by checking some of the image properties. Specifically, I checked the &amp;ldquo;created on&amp;rdquo; information, where the original image date and time were explicitly printed.&lt;/p>
&lt;center>
&lt;picture>
&lt;source srcset="./img/google-photos-avif/image-properties.avif" type="image/avif" />
&lt;img class="inline" src="./img/google-photos-avif/image-properties.png" alt="Image properties" title="Image properties" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
&lt;/center>
&lt;p>This successful merging of image metadata ensures that each image is now associated with its correct date, time, and other relevant information. And it stores all images in one folder, it simplifies the organization and future access of the images.&lt;/p>
&lt;h2 id="analying-the-files-before-conversion">Analying The Files Before Conversion&lt;/h2>
&lt;p>After successfully merging the images with their corresponding metadata, the next step was to analyze the types of files present in the folder. This identifies the number of various file formats such as JPG, PNG, AVIF, HEIC, and videos.&lt;/p>
&lt;p>To accomplish this, I began writing a Python script that goes through the entire folder and analyze the file types and sizes. The script provided the number of files for each format and their total sizes.&lt;/p>
&lt;center>
&lt;picture>
&lt;source srcset="./img/google-photos-avif/analyze-1.avif" type="image/avif" />
&lt;img class="inline" src="./img/google-photos-avif/analyze-1.png" alt="Files before conversion" title="Files before conversion" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
&lt;/center>
&lt;p>According to the script&amp;rsquo;s output, the folder contained:&lt;/p>
&lt;ul>
&lt;li>1,734 normal JPG and PNG images, occupying approximately 1.93 GB of storage space.&lt;/li>
&lt;li>82 HEIC images, which are typically captured by Apple devices and are already compressed, so I decided not to convert them. They occupy approximately 97 MB of storage space.&lt;/li>
&lt;li>Additionally, there were 77 video files, totaling approximately 1.21 GB. However, at this point, I am not yet familiar with video encoding formats and the longer encoding time required for videos on my laptop. Therefore, I excluded the videos from the conversion for now.&lt;/li>
&lt;/ul>
&lt;h2 id="converting-into-avif">Converting Into AVIF&lt;/h2>
&lt;p>To convert the images into the AVIF format, I initially started writing a shell script. However, I soon realized the advantages of cross-platform compatibility and decided to scrap the shell script code. Instead, I began writing code in Python to perform the conversion.&lt;/p>
&lt;p>For the conversion process, I used &lt;code>pillow_heif&lt;/code> Python library, which provides support for handling AVIF images. To optimize the conversion speed and efficiency, I implemented parallel multi-processing techniques. The resulting code, along with all the necessary files, is available in a GitHub repository &lt;a href="https://github.com/jothi-prasath/google-photos-compressor">google-photos-compressor&lt;/a>.&lt;/p>
&lt;p>The conversion process takes approximately 45 minutes to complete. This can vary depending on the power and specifications of the system being used for the conversion. The processing speed and efficiency of the system play a significant role in determining the overall time required for the conversion. In my case, using a Ryzen 5 5500U processor with 6 cores and 12 threads running at 4GHz, with 8Gb ram&lt;/p>
&lt;h2 id="analying-the-files-after-conversion">Analying The Files After Conversion&lt;/h2>
&lt;p>To calculate the impact of the conversion process, I used the same Python script to analyze the folder containing the converted images. Here are the findings:&lt;/p>
&lt;center>
&lt;picture>
&lt;source srcset="./img/google-photos-avif/analyze-2.avif" type="image/avif" />
&lt;img class="inline" src="./img/google-photos-avif/analyze-2.png" alt="Files after conversion" title="Files after conversion" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
&lt;/center>
&lt;ul>
&lt;li>The initial collection of 1.93 GB, consisting of 1,734 JPG and PNG images, has been compressed into 679 MB.&lt;/li>
&lt;li>The total size was significantly reduced to 679 MB, resulting in a compression rate of approximately 65%.&lt;/li>
&lt;li>As a result, the conversion process saved a total of 1.25 GB of storage space.&lt;/li>
&lt;/ul>
&lt;p>I have successfully optimized my image collection while ensuring that the visual quality of the photos is preserved.&lt;/p>
&lt;h2 id="deleting-all-images-in-google-photos">Deleting All Images In Google Photos&lt;/h2>
&lt;p>When it came to deleting all the photos in Google Photos, I discovered that there was no built-in option to accomplish this task easily. Manually selecting and deleting each of the 1,734 photos would have been a time-consuming nightmare.&lt;/p>
&lt;p>Fortunately, I came across a JavaScript solution that could be executed in the browser&amp;rsquo;s console to automate the selection and deletion of all the files in Google Photos. That script automatically selects and deletes the photos without the need for manual interaction. It saves a considerable amount of time and effort.&lt;/p>
&lt;center>
&lt;picture>
&lt;source srcset="./img/google-photos-avif/delete-photos.avif" type="image/avif" />
&lt;img class="inline" src="./img/google-photos-avif/delete-photos.png" alt="Deleting all Google Photos" title="Deleting all Google Photos" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
&lt;/center>
&lt;p>You can find the JavaScript code at the following link: &lt;a href="https://raw.githubusercontent.com/mrishab/google-photos-delete-tool/master/delete_photos.js">delete_photos.js&lt;/a>&lt;/p>
&lt;h2 id="uploading-converted-photos-to-google-photos">Uploading Converted Photos To Google Photos&lt;/h2>
&lt;p>To upload the converted AVIF images, and other images and videos back to Google Photos, I followed a specific order. First, I uploaded the converted AVIF images, followed by the HEIC images, and finally the videos.&lt;/p>
&lt;p>During the uploading process, I noticed that all the albums in the Albums section were empty. So, I proceeded to delete these empty albums.&lt;/p>
&lt;p>After the upload was complete, I observed that a few images (5 in total) were screenshots and WhatsApp images, while some of the videos (15 in total) were received from WhatsApp. These images and videos were not properly sorted in terms of their date and time metadata.&lt;/p>
&lt;p>To solve this issue, I manually adjusted the date and time for these particular images and videos, referring to the date and time information present in the original versions of the files. This helps me to arrange the images and videos in chronological order within Google Photos.&lt;/p>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>In this blog post, I shared my experience of downloading and converting my Google Photos collection to the AVIF format. Overall, by converting my Google Photos collection to the AVIF format, I was able to achieve significant storage savings while maintaining the visual quality of my images.&lt;/p>
&lt;p>I hope my journey and the steps I followed to optimize my photo collection using AVIF format will inspire and guide others in their efforts to manage and optimize their digital media.&lt;/p></description></item><item><title>JPG vs AVIF: A Comparison</title><link>https://jothiprasath.com/blog/jpg-vs-avif/</link><pubDate>Mon, 10 Jul 2023 00:00:00 +0000</pubDate><guid>https://jothiprasath.com/blog/jpg-vs-avif/</guid><description>&lt;p>JPG and AVIF are the two main contenders in the battle, where JPG/JPEG are common image format we use daily in mobiles, laptops, cameras. It is mostly supported by all devices and platforms. And on the other hand AVIF the next generation image format. It is not supported by many social media platforms and browsers like Microsoft Edge and Opera Mini.&lt;/p>
&lt;h2 id="methodology">Methodology&lt;/h2>
&lt;p>I have selected four different test images to run through both the JPG and the AVIF encoders:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Flower&lt;/strong> - A normal image we take everyday using our smartphones.
&lt;figure class="fig-center">&lt;a href="./img/jpg-vs-avif/flower.jpg" target="_blank">&lt;picture>
&lt;source srcset="./img/jpg-vs-avif/flower-1080.avif" type="image/avif" />
&lt;img src="./img/jpg-vs-avif/flower-1080.jpg"
alt="flower" width="30%" loading="lazy"decoding="async" />
&lt;/picture>&lt;/a>&lt;figcaption style="margin: 0 auto; width:30%;">
&lt;p>Taken from Redmi 9 Power&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Lemur&lt;/strong> - A normal image we take everyday using our smartphones.
&lt;figure class="fig-center">&lt;a href="./img/jpg-vs-avif/lemur.jpg" target="_blank">&lt;picture>
&lt;source srcset="./img/jpg-vs-avif/lemur-1080.avif" type="image/avif" />
&lt;img src="./img/jpg-vs-avif/lemur-1080.jpg"
alt="lemur" width="50%" loading="lazy"decoding="async" />
&lt;/picture>&lt;/a>&lt;figcaption style="margin: 0 auto; width:50%;">
&lt;p>Taken from free-images.com. Untouched 13Mb image&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Text&lt;/strong> - A screenshot image of terminal.
&lt;figure class="fig-center">&lt;a href="./img/jpg-vs-avif/text.jpg" target="_blank">&lt;picture>
&lt;source srcset="./img/jpg-vs-avif/text.avif" type="image/avif" />
&lt;img src="./img/jpg-vs-avif/text.jpg"
alt="text" width="80%" loading="lazy"decoding="async" />
&lt;/picture>&lt;/a>&lt;figcaption style="margin: 0 auto; width:80%;">
&lt;p>A text image with small range of colors&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Cartoon&lt;/strong> - A cartoon image.
&lt;figure class="fig-center">&lt;a href="./img/jpg-vs-avif/cartoon.jpg" target="_blank">&lt;picture>
&lt;source srcset="./img/jpg-vs-avif/cartoon-1080.avif" type="image/avif" />
&lt;img src="./img/jpg-vs-avif/cartoon-1080.jpg"
alt="cartoon" width="30%" loading="lazy"decoding="async" />
&lt;/picture>&lt;/a>&lt;figcaption style="margin: 0 auto; width:30%;">
&lt;p>A cartoon I designed by using Sketchbook&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>All images used in this post (source &lt;code>.jpg&lt;/code>, encoded &lt;code>.avif&lt;/code>)&lt;/p>
&lt;p>To conduct the image encoding tests, the following system specifications were used:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Operating System:&lt;/strong> Linux (Arch Linux)&lt;/li>
&lt;li>&lt;strong>Kernel Version:&lt;/strong> 6.4.2&lt;/li>
&lt;li>&lt;strong>Processor:&lt;/strong> Ryzen 5 5500U (4 Ghz)&lt;/li>
&lt;li>&lt;strong>RAM:&lt;/strong> 8GB DDR4&lt;/li>
&lt;/ul>
&lt;h2 id="lossy-compression">Lossy compression&lt;/h2>
&lt;p>Lossy compression is a method of data compression that selectively discards or reduces some of the information from the original data in order to reduce file size. It is widely used in image compression algorithms to achieve smaller file sizes while maintaining acceptable image quality.&lt;/p>
&lt;p>To encode the &lt;strong>AVIF&lt;/strong> images I used &lt;code>avifenc&lt;/code> provided by &lt;code>libavif&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>avifenc input.jpg output.avif --min &lt;span style="color:#ae81ff">0&lt;/span> --max &lt;span style="color:#ae81ff">63&lt;/span> -j &lt;span style="color:#ae81ff">12&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>--min&lt;/code> and &lt;code>--max&lt;/code> set the minimum and maximum quantizer for color. We use the full range here. The &lt;code>-j&lt;/code> set the number of parallel threads. Here I am using 12 threads.&lt;/p>
&lt;h2 id="flower">Flower&lt;/h2>
&lt;p>For this flower image I have cropped around the one of the flower. The crop is based on 200% zoomed image. Here are the results&lt;/p>
&lt;center>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: center">File format&lt;/th>
&lt;th style="text-align: center">File size&lt;/th>
&lt;th style="text-align: center">Compression ratio&lt;/th>
&lt;th style="text-align: center">Time taken to encode&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: center">JPG&lt;/td>
&lt;td style="text-align: center">440Kb&lt;/td>
&lt;td style="text-align: center">-&lt;/td>
&lt;td style="text-align: center">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">AVIF&lt;/td>
&lt;td style="text-align: center">156Kb&lt;/td>
&lt;td style="text-align: center">- 64.54%&lt;/td>
&lt;td style="text-align: center">0.465s&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: center">&lt;/th>
&lt;th style="text-align: center">&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: center">&lt;img src="./img/jpg-vs-avif/crop-lossy/flower.jpg" alt="jpg" loading="lazy" />&lt;/td>
&lt;td style="text-align: center">&lt;img src="./img/jpg-vs-avif/crop-lossy/flower.avif" alt="avif" loading="lazy" />&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">Original&lt;/td>
&lt;td style="text-align: center">AVIF&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;figcaption> Image (200% zoom crop) &lt;/figcaption>
&lt;!-- convert flower.jpg -resize 200% -gravity center -crop 254x254-400-400 crop-lossy/flower.jpg -->
&lt;/center>
&lt;p>We compressed the original 440Kb image to 156Kb image which is 64% lesser than original. And the AVIF version is more smooth in edges than JPG. Most of the smart phones take these images and &lt;strong>the difference is not noticeable.&lt;/strong>&lt;/p>
&lt;h2 id="lemur">Lemur&lt;/h2>
&lt;p>For this lemur image I have cropped around the eye. The crop is based on 200% zoomed image. Here are the results&lt;/p>
&lt;center>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: center">File format&lt;/th>
&lt;th style="text-align: center">File size&lt;/th>
&lt;th style="text-align: center">Compression ratio&lt;/th>
&lt;th style="text-align: center">Time taken to encode&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: center">JPG&lt;/td>
&lt;td style="text-align: center">13Mb&lt;/td>
&lt;td style="text-align: center">-&lt;/td>
&lt;td style="text-align: center">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">AVIF&lt;/td>
&lt;td style="text-align: center">1.1Mb&lt;/td>
&lt;td style="text-align: center">- 91.53%&lt;/td>
&lt;td style="text-align: center">3.547s&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: center">&lt;/th>
&lt;th style="text-align: center">&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: center">&lt;img src="./img/jpg-vs-avif/crop-lossy/lemur.jpg" alt="jpg" loading="lazy" />&lt;/td>
&lt;td style="text-align: center">&lt;img src="./img/jpg-vs-avif/crop-lossy/lemur.avif" alt="avif" loading="lazy" />&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">Original&lt;/td>
&lt;td style="text-align: center">AVIF&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;figcaption> Image (200% zoom crop) &lt;/figcaption>
&lt;!-- convert lemur.jpg -resize 200% -gravity center -crop 254x254+200-600 crop-lossy/lemur.jpg -->
&lt;/center>
&lt;p>Comparing to other three images this lemur image is huge in size with resolution around 5K (4928x3264). We compressed the original 13Mb image into 1.1Mb image which is &lt;strong>whopping 91.53% less than original image&lt;/strong> and &lt;strong>There are some color artifacts in the AVIF format&lt;/strong>.&lt;/p>
&lt;h2 id="text">Text&lt;/h2>
&lt;p>For this image I have cropped around the text. The crop is based on 200% zoomed image. Here are the results&lt;/p>
&lt;center>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: center">File format&lt;/th>
&lt;th style="text-align: center">File size&lt;/th>
&lt;th style="text-align: center">Compression ratio&lt;/th>
&lt;th style="text-align: center">Time taken to encode&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: center">JPG&lt;/td>
&lt;td style="text-align: center">392Kb&lt;/td>
&lt;td style="text-align: center">-&lt;/td>
&lt;td style="text-align: center">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">AVIF&lt;/td>
&lt;td style="text-align: center">40Kb&lt;/td>
&lt;td style="text-align: center">- 89.79%&lt;/td>
&lt;td style="text-align: center">3.54s&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: center">&lt;/th>
&lt;th style="text-align: center">&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: center">&lt;img src="./img/jpg-vs-avif/crop-lossy/text.jpg" alt="jpg" loading="lazy" />&lt;/td>
&lt;td style="text-align: center">&lt;img src="./img/jpg-vs-avif/crop-lossy/text.avif" alt="avif" loading="lazy" />&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">Original&lt;/td>
&lt;td style="text-align: center">AVIF&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;figcaption> Image (200% zoom crop) &lt;/figcaption>
&lt;!-- convert text.jpg -resize 200% -gravity center -crop 254x254+0-0 crop-lossy/text.jpg -->
&lt;/center>
&lt;p>This image is very simple with limited colors. This will give you an overview of text based images. We converted the original image 392Kb to 40Kb image. Which is again a huge compression of 89.79%. &lt;strong>The edges of the text are slightly blurry compared to original image.&lt;/strong>&lt;/p>
&lt;h2 id="cartoon">Cartoon&lt;/h2>
&lt;p>For this cartoon image I have cropped center of the image. The crop is based on 200% zoomed image. Here are the results&lt;/p>
&lt;center>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: center">File format&lt;/th>
&lt;th style="text-align: center">File size&lt;/th>
&lt;th style="text-align: center">Compression ratio&lt;/th>
&lt;th style="text-align: center">Time taken to encode&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: center">JPG&lt;/td>
&lt;td style="text-align: center">864Kb&lt;/td>
&lt;td style="text-align: center">-&lt;/td>
&lt;td style="text-align: center">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">AVIF&lt;/td>
&lt;td style="text-align: center">136Kb&lt;/td>
&lt;td style="text-align: center">- 84.25%&lt;/td>
&lt;td style="text-align: center">0.887s&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: center">&lt;/th>
&lt;th style="text-align: center">&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: center">&lt;img src="./img/jpg-vs-avif/crop-lossy/cartoon.jpg" alt="jpg" loading="lazy" />&lt;/td>
&lt;td style="text-align: center">&lt;img src="./img/jpg-vs-avif/crop-lossy/cartoon.avif" alt="avif" href="./img/jpg-vs-avif/cartoon.avif" target="_blank" loading="lazy" />&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">(Original)&lt;/td>
&lt;td style="text-align: center">AVIF&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;figcaption> Image (200% zoom crop) &lt;/figcaption>
&lt;!-- convert cartoon.jpg -resize 200% -gravity center -crop 254x254-200-200 crop-lossy/cartoon.jpg -->
&lt;/center>
&lt;p>The cartoon image is contain less colors and overfill colors in the edges. We converted the original 136Kb to 86Kb which is 84.25% lesser than original image. &lt;strong>There are some blue color overfill in the edges of the original image which is not visible in AVIF format&lt;/strong>.&lt;/p>
&lt;h2 id="how-to-use-avif-in-websites">How to use AVIF in websites&lt;/h2>
&lt;p>You can use AVIF in websites using &lt;code>&amp;lt;picture&amp;gt;&lt;/code> element. The &lt;code>&amp;lt;picture&amp;gt;&lt;/code> element contains one &lt;code>&amp;lt;img&amp;gt;&lt;/code> tag and one or more &lt;code>&amp;lt;source&amp;gt;&lt;/code> tags. Put the normal JPG/PNG images in the &lt;code>&amp;lt;img&amp;gt;&lt;/code> tag and add AVIF images to &lt;code>&amp;lt;source&amp;gt;&lt;/code> tag. The browser first looks for the &lt;code>&amp;lt;source&amp;gt;&lt;/code> tag, if the image format is supported by the browser it loads the image. If not supported by the browser then the &lt;code>&amp;lt;img&amp;gt;&lt;/code> tag image loads.&lt;/p>
&lt;p>You can verify which format of the file loaded by&lt;/p>
&lt;ol>
&lt;li>Right clicking the page and select the inspect option.&lt;/li>
&lt;li>Switch to the network tab and reload the page.&lt;/li>
&lt;li>You can find the image name with extension .AVIF&lt;/li>
&lt;/ol>
&lt;picture>
&lt;source srcset="./img/jpg-vs-avif/browser-inspect.avif" type="image/avif" />
&lt;img class="inline" src="./img/jpg-vs-avif/browser-inspect.png" alt="google chrome" title="google chrome" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>According to the results presented above, my option is that AVIF is better compared to JPG in lossy compression. For haven&amp;rsquo;t tested for lossless compression because my original JPGs are compressed images. The main reason for this comparison is for website use.&lt;/p></description></item><item><title>How to Compile the Linux Kernel</title><link>https://jothiprasath.com/blog/linux-kernel-compile/</link><pubDate>Sun, 02 Jul 2023 00:00:00 +0000</pubDate><guid>https://jothiprasath.com/blog/linux-kernel-compile/</guid><description>&lt;h2 id="what-is-linux-kernel">What is Linux Kernel?&lt;/h2>
&lt;p>The Linux kernel can be defined as the core component of the Linux operating system. It is a piece of software that manages the system&amp;rsquo;s hardware resources and provides essential services to other software applications. In simple terms, the kernel acts as a mediator, allowing the operating system and the hardware to interact effectively.&lt;/p>
&lt;h2 id="requiremented-packages">Requiremented packages&lt;/h2>
&lt;ul>
&lt;li>git&lt;/li>
&lt;li>fakeroot&lt;/li>
&lt;li>build-essential&lt;/li>
&lt;li>xz-utils&lt;/li>
&lt;li>bc&lt;/li>
&lt;li>ncurses-dev&lt;/li>
&lt;li>libssl-dev&lt;/li>
&lt;li>libelf-dev&lt;/li>
&lt;li>bison&lt;/li>
&lt;li>flex&lt;/li>
&lt;/ul>
&lt;h2 id="download-linux-source-code">Download Linux Source Code&lt;/h2>
&lt;p>To compile the Linux kernel, the first step is to obtain the source code. Which can be obtained from official website &lt;a href="https://kernel.org">kernel.org&lt;/a>. Download the required kernel version.&lt;/p>
&lt;div class="hint">
&lt;p class="hint-title">&lt;i class="fa fa-info-circle">&lt;/i>&amp;nbsp;&amp;nbsp;&lt;strong>Disclaimer&lt;/strong>&lt;/p>
&lt;p class="hint-body">It is recommended to select a stable version unless you have specific requirements for a particular version.&lt;/p>
&lt;/div>
&lt;h2 id="extract-the-source-code">Extract the Source Code&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>tar xvf linux-6.0.7.tar.xz
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="configuring-kernel">Configuring Kernel&lt;/h2>
&lt;ol>
&lt;li>Navigate to extracted directory.&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#111">cd&lt;/span> linux-version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>Copy the current kernel config to current directory.&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>zcat /proc/config.gz &amp;gt; .config
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>Make changes using the following command.&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>make menuconfig
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;picture>
&lt;source srcset="./img/linux-kernel-compile/1.avif" type="image/avif" />
&lt;img class="inline" src="./img/linux-kernel-compile/1.png" alt="make menuconfig" title="make menuconfig" loading="lazy" width="auto" height="auto">&lt;/img>
&lt;/picture>
&lt;h2 id="building-kernel">Building Kernel&lt;/h2>
&lt;p>Build the kernel by using the following command.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>make -j&lt;span style="color:#00a8c8">$(&lt;/span>nproc&lt;span style="color:#00a8c8">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="install-kernel">Install Kernel&lt;/h2>
&lt;p>The compiled kernel can be installed by using the following command.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo make -j&lt;span style="color:#00a8c8">$(&lt;/span>nproc&lt;span style="color:#00a8c8">)&lt;/span> modules_install
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo make -j&lt;span style="color:#00a8c8">$(&lt;/span>nproc&lt;span style="color:#00a8c8">)&lt;/span> install
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>hello there!</title><link>https://jothiprasath.com/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://jothiprasath.com/about/</guid><description>&lt;picture>
&lt;source srcset="./img/myself.avif" type="image/avif" />
&lt;img src="./img/myself.jpg" alt="Jothi Prasath" title="Jothi Prasath" style="float: right;
margin-left: 5%;
height:auto;
min-width:100px;
width: 25%" />
&lt;/picture>
&lt;p>Since you are already here, I think a short introduction is in order. I am &lt;strong>Jothi Prasath&lt;/strong>, Computer Science graduate. I find immense joy in exploring various aspects of technology, particularly in the realm of open source and Linux. Most of the time trying to automate tasks.&lt;/p>
&lt;p>I am currently seeking job opportunities in the field of Computer Science. With a strong background in computer science and a passion for technology, I am eager to contribute my skills and knowledge to a dynamic and innovative organization.&lt;/p>
&lt;p>If you are looking for a highly motivated and skilled individual with a strong foundation in computer science, Please feel free to reach out to me through the provided contact information. I am excited to contribute my expertise and continue growing in the field of computer science.&lt;/p>
&lt;p>You can find me on &lt;a rel="me" href="https://linkedin.com/in/jothi-prasath">Linkedin&lt;/a>&lt;/p>
&lt;br/>
Here is a summary of the content in this site:
&lt;br/>
&lt;table class="menu-table-index">
&lt;tr>
&lt;td>
&lt;a href="./blog">&lt;div class="menu-table-item">
&lt;i class="fa fa-file-word-o ">
&lt;/i>
&lt;br/>
/blog
&lt;/div>&lt;/a>
&lt;/td>
&lt;td>
&lt;a href="./posts-list">&lt;div class="menu-table-item">
&lt;i class="fa fa-list ">
&lt;/i>
&lt;br/>
/all-posts
&lt;/div>&lt;/a>
&lt;/td>
&lt;td>
&lt;a href="./projects">&lt;div class="menu-table-item">
&lt;i class="fa fa-cube ">
&lt;/i>
&lt;br/>
/projects
&lt;/div>&lt;/a>
&lt;/td>
&lt;td>
&lt;a href="./tags">&lt;div class="menu-table-item">
&lt;i class="fa fa-tags ">
&lt;/i>
&lt;br/>
/tags
&lt;/div>&lt;/a>
&lt;/td>
&lt;td>
&lt;a href="./resume">&lt;div class="menu-table-item">
&lt;i class="fa fa-address-card-o ">
&lt;/i>
&lt;br/>
/resume
&lt;/div>&lt;/a>
&lt;/td>
&lt;/tr>
&lt;/table></description></item><item><title>Posts list</title><link>https://jothiprasath.com/posts-list/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://jothiprasath.com/posts-list/</guid><description/></item><item><title>Projects</title><link>https://jothiprasath.com/projects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://jothiprasath.com/projects/</guid><description>&lt;h2 id="applications-and-software">Applications and software&lt;/h2>
&lt;article>
&lt;strong>&lt;a href="https://github.com/jothi-prasath/archlinux-playbook">Archlinux Ansible Playbook&lt;/a> &lt;i class="fa-tss fa fa-linux">&lt;/i> &lt;i class="fa fa-cogs">&lt;/i> &lt;i class="fa fa-github-alt">&lt;/i>&lt;/strong> &amp;mdash; A playbook for automating the installation and configuration of Arch Linux using Ansible. It provides a streamlined and reproducible method for setting up a fresh Arch Linux system with commonly used packages and configurations.
&lt;/article>
&lt;br />
&lt;article>
&lt;strong>&lt;a href="https://github.com/jothi-prasath/auto-epp">Auto-epp&lt;/a> &lt;i class="fa-tss fa fa-linux">&lt;/i> &lt;i class="fa fa-cogs">&lt;/i> &lt;i class="fa-tss fa fa-python">&lt;/i> &lt;i class="fa fa-github-alt">&lt;/i>&lt;/strong> &amp;mdash; Auto-epp manages the energy performance preferences (EPP) of amd-pstate-epp (CPU Scaling Driver). It adjusts the EPP settings based on whether system is running on AC power or battery power, helping optimize power consumption and performance.
&lt;/article>
&lt;br />
&lt;article>
&lt;strong>&lt;a href="https://github.com/jothi-prasath/movie-radar">Movie Radar&lt;/a> &lt;i class="fa-tss fa fa-linux">&lt;/i> &lt;i class="fa-tss fa fa-apple">&lt;/i> &lt;i class="fa-tss fa fa-windows">&lt;/i> &lt;i class="fa-tss fa fa-python">&lt;/i> &lt;i class="fa-tss fa fa-flask">&lt;/i> &lt;i class="fa fa-github-alt">&lt;/i>&lt;/strong> &amp;mdash; A Flask web application that displays latest now playing movies based on language using TMDB API.
&lt;/article>
&lt;br />
&lt;article>
&lt;strong>&lt;a href="https://github.com/jothi-prasath/docker-qbittorrent-enhanced-edition">qBittorrent Enhanced Edition Docker Image&lt;/a> &lt;i class="fa-tss fa fa-linux">&lt;/i> &lt;i class="fa fa-cogs">&lt;/i> &lt;i class="fa fa-github-alt">&lt;/i>&lt;/strong> &amp;mdash; A Docker image for qBittorrent Enhanced Edition, built automatically with GitHub Actions.
&lt;/article>
&lt;br />
&lt;article>
&lt;strong>&lt;a href="https://github.com/jothi-prasath/movie-radar-js">Movie Radar JS&lt;/a> &lt;i class="fa-tss fa fa-linux">&lt;/i> &lt;i class="fa-tss fa fa-apple">&lt;/i> &lt;i class="fa-tss fa fa-windows">&lt;/i> &lt;i class="fa-tss fa fa-java">&lt;/i> &lt;i class="fa fa-github-alt">&lt;/i>&lt;/strong> &amp;mdash; A nodejs application that displays latest now playing movies based on language using TMDB API.
&lt;/article>
&lt;br />
&lt;article>
&lt;strong>&lt;a href="https://github.com/jothi-prasath/debian-playbook">Debian Ansible Playbook&lt;/a> &lt;i class="fa-tss fa fa-linux">&lt;/i> &lt;i class="fa fa-cogs">&lt;/i> &lt;i class="fa fa-github-alt">&lt;/i>&lt;/strong> &amp;mdash; A playbook for automating the installation and configuration of Debian Linux using Ansible.
&lt;/article>
&lt;br />
&lt;article>
&lt;strong>&lt;a href="https://github.com/jothi-prasath/password-manager">Password Manager&lt;/a> &lt;i class="fa-tss fa fa-linux">&lt;/i> &lt;i class="fa-tss fa fa-apple">&lt;/i> &lt;i class="fa-tss fa fa-windows">&lt;/i> &lt;i class="fa-tss fa fa-python">&lt;/i> &lt;i class="fa fa-github-alt">&lt;/i>&lt;/strong> &amp;mdash; A GUI Password Manager using python with encryption.
&lt;/article>
&lt;br />
&lt;article>
&lt;strong>&lt;a href="https://github.com/jothi-prasath/termux-dev-setup">Termux Development Setup&lt;/a> &lt;i class="fa-tss fa fa-linux">&lt;/i> &lt;i class="fa fa-cogs">&lt;/i> &lt;i class="fa fa-github-alt">&lt;/i>&lt;/strong> &amp;mdash; A script to set up a development environment in the Termux app for Android.
&lt;/article>
&lt;br />
&lt;article>
&lt;strong>&lt;a href="https://github.com/jothi-prasath/gnomintosh">Gnomintosh&lt;/a> &lt;i class="fa-tss fa fa-linux">&lt;/i> &lt;i class="fa fa-sass">&lt;/i> &lt;i class="fa fa-github-alt">&lt;/i>&lt;/strong> &amp;mdash; Macintosh inspired theme for GNOME Linux desktop environment.
&lt;/article>
&lt;br />
&lt;article>
&lt;strong>&lt;a href="https://github.com/jothi-prasath/smallsur">Small Sur&lt;/a> &lt;i class="fa-tss fa fa-linux">&lt;/i> &lt;i class="fa fa-sass">&lt;/i> &lt;i class="fa fa-github-alt">&lt;/i>&lt;/strong> &amp;mdash; Mac os Big Sur inspired theme for Xfce4 Linux desktop.
&lt;/article>
&lt;br />
&lt;article>
&lt;strong>&lt;a href="https://github.com/jothi-prasath/bash-scripts">Bash Script Collection&lt;/a> &lt;i class="fa-tss fa fa-linux">&lt;/i> &lt;i class="fa fa-cogs">&lt;/i> &lt;i class="fa fa-github-alt">&lt;/i>&lt;/strong> &amp;mdash; A collection of useful Bash scripts that I have created for various purposes. These scripts are designed to automate tasks, simplify workflows, and improve productivity in a Linux environment.
&lt;/article>
&lt;br />
&lt;!-- &lt;article>
&lt;strong>&lt;a href="https://github.com/jothi-prasath/dotfiles">Dotfiles&lt;/a> &lt;i class="fa-tss fa fa-linux">&lt;/i> &lt;i class="fa fa-github-alt">&lt;/i>&lt;/strong> &amp;mdash; My dotfiles project. Contains the bashrc, aliases and other configurations.
&lt;/article>
&lt;br /> -->
&lt;article>
&lt;strong>&lt;a href="https://github.com/jothi-prasath/google-photos-compressor">Google Photos Compressor&lt;/a> &lt;i class="fa-tss fa fa-python">&lt;/i> &lt;i class="fa-tss fa fa-java">&lt;/i> &lt;i class="fa-tss fa fa-python">&lt;/i> &lt;i class="fa fa-github-alt">&lt;/i>&lt;/strong> &amp;mdash; Compress images stored in Google Photos to AVIF.
&lt;/article>
&lt;br />
&lt;article>
&lt;strong>&lt;a href="https://github.com/jothi-prasath/wynk-music">Wynk Music&lt;/a> &lt;i class="fa-tss fa fa-linux">&lt;/i> &lt;i class="fa-tss fa fa-apple">&lt;/i> &lt;i class="fa-tss fa fa-windows">&lt;/i> &lt;i class="fa-tss fa fa-nodejs">&lt;/i> &lt;i class="fa fa-github-alt">&lt;/i>&lt;/strong> &amp;mdash; Wynk music(unofficial) is an Electron-based lightweight client for streaming music.
&lt;/article>
&lt;br />
&lt;h2 id="contributed-projects">Contributed Projects&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://github.com/coder/code-server">code-server&lt;/a> - VS Code in the browser&lt;/li>
&lt;li>&lt;a href="https://github.com/jesseduffield/lazygit">lazygit&lt;/a> - Simple terminal UI for git commands&lt;/li>
&lt;li>&lt;a href="https://github.com/ravachol/cue">cue&lt;/a> - A command-line music player&lt;/li>
&lt;li>&lt;a href="https://github.com/lwfinger/rtw88">rtw88&lt;/a> - Linux Realtek Drivers&lt;/li>
&lt;li>&lt;a href="https://github.com/soberhacker/obsidian-telegram-sync">obsidian-telegram-sync&lt;/a> - Transfer messages and files from Telegram bot to Obsidian&lt;/li>
&lt;/ul></description></item><item><title>Resume</title><link>https://jothiprasath.com/resume/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://jothiprasath.com/resume/</guid><description>&lt;p>
&lt;link href="./css/resume.css" rel="stylesheet" type="text/css">
&lt;/p>
&lt;div id="cv-wrap">
&lt;picture>
&lt;source srcset="./img/myself.avif" type="image/avif" />
&lt;img src="./img/myself.jpg" alt="Jothi Prasath" title="Jothi Prasath" style="float: right;
margin-left: 5%;
height:auto;
min-width:100px;
width: 25%" decoding="async"/>
&lt;/picture>
&lt;div class="vcard" id="contact-info">
&lt;!-- Microformats! -->
&lt;h1 class="fn">Jothi Prasath&lt;/h1>
&lt;div class="subtitle">Developer&lt;/div>
&lt;!-- &lt;p class="pdflink">
[ PDF: &lt;a href="./pdf/resume.pdf" target="_blank">link&lt;/a> ]
&lt;/p> --!>
&lt;p class="contactinfo">
&lt;!-- Cell: &lt;span class="tel">+91 86086 96984&lt;/span> -->
&lt;br>Email: &lt;a class="email" href="mailto:jothiprasath2@gmail.com">jothiprasath2@gmail.com&lt;/a>
&lt;!-- &lt;br>Website: &lt;a class="email" href="https://jothiprasath.com">jothiprasath.com&lt;/a> --!>
&lt;br>Born: 11, February, 2002
&lt;/p>
&lt;/div>
&lt;!-- &lt;div id="objective">
&lt;p>&lt;/p>
&lt;/div> -->
&lt;br>
&lt;dl class="cv">
&lt;dt class="cv">Education&lt;/dt>
&lt;dd class="cv">
&lt;h2 class="cv">&lt;a style="color: inherit;" href="https://americancollege.edu.in/" target="_blank">The American College, Madurai&lt;/a>&lt;/h2>
&lt;p>August 2020 &amp;ndash; April 2023 &amp;nbsp; &amp;nbsp;&lt;strong>B.Sc. in Computer Science.&lt;/strong>&lt;/p>
&lt;br>
&lt;/dd>
&lt;dt class="cv">Skills&lt;/dt>
&lt;dd class="cv">
&lt;h2 class="cv">Technical Skills&lt;/h2>
&lt;ul>
&lt;!-- &lt;li>&lt;strong>C, C++&lt;/strong> &amp;ndash; Used in some personal projects and practical works done in both languages during my college degree.&lt;/li> -->
&lt;li>&lt;strong>Python&lt;/strong> &amp;ndash; Used extensively during my degree. And made some personal projects.&lt;/li>
&lt;li>&lt;strong>Shell scripting&lt;/strong> &amp;ndash; POSIX sh, bash.
&lt;li>&lt;strong>Databases&lt;/strong> &amp;ndash; SQLite.&lt;/li>
&lt;li>&lt;strong>Devops tools&lt;/strong> &amp;ndash; Git, Ansible, Docker.&lt;/li>
&lt;li>&lt;strong>VS Code&lt;/strong> &amp;ndash; My main development tool, aided with handy plugins.&lt;/li>
&lt;li>&lt;strong>Web technologies&lt;/strong> &amp;ndash; I am proficient in web technologies.
&lt;ul>
&lt;li>&lt;strong>CSS3 &amp; HTML5&lt;/strong> &amp;ndash; The future of the web.&lt;/li>
&lt;li>&lt;strong>Javascript&lt;/strong> &amp;ndash; Node.js.&lt;/li>
&lt;li>&lt;strong>Flask&lt;/strong> &amp;ndash; Python web framework&lt;/li>
&lt;li>&lt;strong>Others&lt;/strong> &amp;ndash; Hugo (this site).&lt;/li>
&lt;/ul>
&lt;/ul>
&lt;h2 class="cv">Social Skills&lt;/h2>
&lt;ul>
&lt;li>Teamworking.&lt;/li>
&lt;li>Good communication and presentation skills.&lt;/li>
&lt;li>Easily socialize, adept at connecting and engaging with others.&lt;/li>
&lt;/ul>
&lt;/dd>
&lt;dt class="cv">Projects&lt;/dt>
&lt;dd class="cv">
Please, see the &lt;a href="./projects">projects&lt;/a> sections of this webiste.
&lt;ul>
&lt;li>Gnomintosh &amp;ndash; &lt;a href="https://www.github.com/jothi-prasath/gnomintosh">Github&lt;/a>&lt;/li>
&lt;li>Archlinux Playbook &amp;ndash; &lt;a href="https://www.github.com/jothi-prasath/archlinux-playbook">Github&lt;/a>&lt;/li>
&lt;li>Auto-epp &amp;ndash; &lt;a href="https://github.com/jothi-prasath/auto-epp">Github&lt;/a>&lt;/li>
&lt;li>qBittorrent Enhanced Docker Image &amp;ndash; &lt;a href="https://github.com/jothi-prasath/docker-qbittorrent-enhanced-edition">Github&lt;/a>&lt;/li>
&lt;li>Password Manager &amp;ndash; &lt;a href="https://github.com/jothi-prasath/password-manager">Github&lt;/a>&lt;/li>
&lt;li>Small Sur &amp;ndash; &lt;a href="https://github.com/jothi-prasath/SmallSur/">Github&lt;/a>&lt;/li>
&lt;li>Termux Development Setup &amp;ndash; &lt;a href="https://github.com/jothi-prasath/termux-dev-setup">Github&lt;/a>&lt;/li>
&lt;li>Bash Script Collection &amp;ndash; &lt;a href="https://github.com/jothi-prasath/bash-scripts">Github&lt;/a>&lt;/li>
&lt;li>Google Photos Compressor &amp;ndash; &lt;a href="https://github.com/jothi-prasath/google-photos-compressor">Github&lt;/a>&lt;/li>
&lt;li>Wynk Music &amp;ndash; &lt;a href="https://github.com/jothi-prasath/wynk-music">Github&lt;/a>&lt;/li>
&lt;/ul>
&lt;/dd>
&lt;dt class="cv">Contributions&lt;/dt>
&lt;dd class="cv">
&lt;ul>
&lt;li>&lt;a href="https://github.com/coder/code-server">code-server&lt;/a> - VS Code in the browser&lt;/li>
&lt;li>&lt;a href="https://github.com/jesseduffield/lazygit">lazygit&lt;/a> - Simple terminal UI for git commands&lt;/li>
&lt;li>&lt;a href="https://github.com/ravachol/cue">cue&lt;/a> - A command-line music player&lt;/li>
&lt;li>&lt;a href="https://github.com/lwfinger/rtw88">rtw88&lt;/a> - Linux Realtek Drivers&lt;/li>
&lt;li>&lt;a href="https://github.com/soberhacker/obsidian-telegram-sync">obsidian-telegram-sync&lt;/a> - Transfer messages and files from Telegram bot to Obsidian&lt;/li>
&lt;/ul>
&lt;/dd>
&lt;/br>
&lt;dt class="cv">Language skills&lt;/dt>
&lt;dd class="cv">
&lt;ul>
&lt;li>English&lt;/li>
&lt;li>Tamil&lt;/li>
&lt;/ul>
&lt;/dd>
&lt;/dl>
&lt;/div></description></item></channel></rss>