<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>alchemmist — Linux</title><link>https://alchemmist.xyz/tags/linux/</link><description>Последние записи в блоге alchemmist</description><generator>Hugo 0.163.3</generator><language>en</language><atom:link href="https://alchemmist.xyz/tags/linux/index.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Sat, 23 Aug 2025 17:14:00 +0300</lastBuildDate><item><title>Privacy screen share in Hyprland</title><link>https://alchemmist.xyz/articles/hyrpland-noscreenshare/</link><pubDate>Sat, 23 Aug 2025 17:14:00 +0300</pubDate><dc:creator>alchemmist</dc:creator><guid>https://alchemmist.xyz/articles/hyrpland-noscreenshare/</guid><description>We’ve all been in a situation when you need to share your screen with many windows, and you need a few minutes before clicking on “Share screen” button, in order to decide. It’s okay, especially if your system is your second (or even first) home: with private notes, documents, passwords, chats and so on.
Next we will set up a useful workflow for this case. But, this setup will use new feature, which is hardwired into Hyprland and most likely absent in other DEs/compositors. I will demonstrate our final goal. For example, my screen share can be looks, like this:</description><content:encoded><![CDATA[<p>We’ve all been in a situation when you need to share your screen with many windows, and you need a few minutes before clicking on “Share screen” button, in order to decide. It’s okay, especially if your system is your second (or even first) home: with private notes, documents, passwords, chats and so on.</p>
<p>Next we will set up a useful workflow for this case. But, this setup will use new feature, which is hardwired into Hyprland and most likely absent in other DEs/compositors. I will demonstrate our final goal. For example, my screen share can be looks, like this:
<img src="/images/noscreenshare-demo.mp4" class="content-img" style="width:85px" alt="" loading="lazy" decoding="async" /></p>
<blockquote class="markdown-blockquote">
  <p>If you like my wallpaper you can find <a href="https://github.com/alchemmist/dotfiles/blob/main/wallpapers/miyazaki/images/1198594-3200x1680-desktop-hd-studio-ghibli-background.jpg">this</a> and more very good stuff in my <code>dotfiles</code> repository on <a href="https://github.com/alchemmist/dotfiles/tree/main/wallpapers">GitHub</a>. Don’f forget: I love your stars!</p>

</blockquote>
<p>Let’s go step-by-step. Firstly, let’s recall that in Hyprland <a href="https://hypr.land/news/update50/#:~:text=on%20by%20default.-,No%20screen%20share,-There%E2%80%99s%20a%20new">release</a> of version <code>0.50.0</code> a new <code>windowrulev2</code> option <code>noscreenshare</code> was added. It’s a new release and now it isn’t controlled from <code>hyprctl</code> only from the config file, like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-plaintext" data-lang="plaintext"><span class="line"><span class="cl">windowrulev2 = noscreenshare, class:^(org.telegram.desktop|obsidian|discord)$
</span></span></code></pre></div><p>This option will tell Hyprland to draw a black rectangle instead of window content (<em>even if this window isn’t in focus or int the background</em>). This works perfect and protects our privacy. But, I’ve found two inconvenient cases: <strong>1.</strong> When we want to make screenshot (<em>in my case, with flameshot</em>) Hyprland interpret it as try to share our screen and hide all privacy windows. <strong>2.</strong> Sometimes, I want to share something from my Obsidian, for example, and dive into configs in this moment — not so good.</p>

<h2 id="cli-control-noscreenshare-option">
  <a class="link" href="#cli-control-noscreenshare-option">
    #
  </a>
  CLI control noscreenshare option
</h2>

<p>To fix this experience, let’s write a script for control window rule in config. If you don’t have time, the full version of the script <a href="https://github.com/alchemmist/dotfiles/blob/main/scripts/toggle_noscreenshare.sh">here</a>. Script will comment or uncomment line in config file with rule and save info about current rule state in maker-file <code>~/.config/hypr/.screenshare_rule_disabled</code>. And script can be run with command <code>toggle</code> to change state to the opposite:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_FILE</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$HOME</span><span class="s2">/.config/hypr/hyprland.conf&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">STATE_FILE</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$HOME</span><span class="s2">/.config/hypr/.screenshare_rule_disabled&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">toggle_rule<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">	<span class="c1"># TODO</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">case</span> <span class="si">${</span><span class="nv">1</span><span class="si">}</span> in
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;toggle&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">        toggle_rule
</span></span><span class="line"><span class="cl">        <span class="p">;;</span>
</span></span><span class="line"><span class="cl"><span class="k">esac</span>
</span></span></code></pre></div><p>Let’s write <code>toggle_rule</code> function. We will use <code>sed</code> (<em>Stream Editor</em>) Linux util. It’s one of the most powerful tools for text processing in Linux and Unix systems. It&rsquo;s commonly used for tasks like search and replace, text transformation, and stream editing. Syntax of <code>sed</code>, in general, looks like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sed <span class="o">[</span>options<span class="o">]</span> <span class="s2">&#34;script&#34;</span> <span class="o">[</span>file...<span class="o">]</span>
</span></span></code></pre></div><p>We need <code>-i</code> option edit file in-place. Then write a script. Firstly we need to find string with <code>noscreenshare</code> rule, like in regex:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="s2">&#34;/windowrolev2.*noscreenshare.*&#34;</span>
</span></span></code></pre></div><p>We start with <code>&quot;/&quot;</code> for write search query, this we need to line start with <code>&quot;windowrolev2&quot;</code>, after that <code>&quot;.*&quot;</code> for any count of any symbols, between which <code>&quot;noscreenshare&quot;</code>. Then we use <code>&quot;/&quot;</code> for end search query, and <code>&quot;s/&quot;</code> (<em>substitute</em>) for replace:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="s2">&#34;/windowrulev2.*noscreenshare.*/s/^#//&#34;</span>
</span></span></code></pre></div><p>Finally, we use <code>&quot;^#&quot;</code> regular expression for find hash at the start of line and replace it to nothing: <code>&quot;//&quot;</code>. Full command looks like:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sed -i <span class="s1">&#39;/windowrulev2.*noscreenshare.*/s/^#//&#39;</span> <span class="s2">&#34;</span><span class="nv">$CONFIG_FILE</span><span class="s2">&#34;</span>
</span></span></code></pre></div><p>Then use <code>sed</code> for add hash to start of line similar, depending on existence of marker-file:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">toggle_rule<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[</span> -f <span class="s2">&#34;</span><span class="nv">$STATE_FILE</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        sed -i <span class="s1">&#39;/windowrulev2.*noscreenshare.*/s/^#//&#39;</span> <span class="s2">&#34;</span><span class="nv">$CONFIG_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        rm -f <span class="s2">&#34;</span><span class="nv">$STATE_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="nv">CLASS</span><span class="o">=</span><span class="s2">&#34;on&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="cl">        sed -i <span class="s1">&#39;/windowrulev2.*noscreenshare.*/s/^/#/&#39;</span> <span class="s2">&#34;</span><span class="nv">$CONFIG_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        touch <span class="s2">&#34;</span><span class="nv">$STATE_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="nv">CLASS</span><span class="o">=</span><span class="s2">&#34;of&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><p>In last step of script, we call this function, if <code>toggle</code> option was given, and return a json-like string for waybar. Full script:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_FILE</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$HOME</span><span class="s2">/.config/hypr/hyprland.conf&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">STATE_FILE</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$HOME</span><span class="s2">/.config/hypr/.screenshare_rule_disabled&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">toggle_rule<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[</span> -f <span class="s2">&#34;</span><span class="nv">$STATE_FILE</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        sed -i <span class="s1">&#39;/windowrulev2.*noscreenshare.*/s/^#//&#39;</span> <span class="s2">&#34;</span><span class="nv">$CONFIG_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        rm -f <span class="s2">&#34;</span><span class="nv">$STATE_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="nv">CLASS</span><span class="o">=</span><span class="s2">&#34;on&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="cl">        sed -i <span class="s1">&#39;/windowrulev2.*noscreenshare.*/s/^/#/&#39;</span> <span class="s2">&#34;</span><span class="nv">$CONFIG_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        touch <span class="s2">&#34;</span><span class="nv">$STATE_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="nv">CLASS</span><span class="o">=</span><span class="s2">&#34;off&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">case</span> <span class="si">${</span><span class="nv">1</span><span class="si">}</span> in
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;toggle&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">        toggle_rule
</span></span><span class="line"><span class="cl">        <span class="p">;;</span>
</span></span><span class="line"><span class="cl">    *<span class="o">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="o">[</span> -f <span class="s2">&#34;</span><span class="nv">$STATE_FILE</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">            <span class="nv">CLASS</span><span class="o">=</span><span class="s2">&#34;off&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span>
</span></span><span class="line"><span class="cl">            <span class="nv">CLASS</span><span class="o">=</span><span class="s2">&#34;on&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="k">fi</span>
</span></span><span class="line"><span class="cl">        <span class="p">;;</span>
</span></span><span class="line"><span class="cl"><span class="k">esac</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;{\&#34;class\&#34;: \&#34;</span><span class="nv">$CLASS</span><span class="s2">\&#34;, \&#34;alt\&#34;: \&#34;</span><span class="nv">$CLASS</span><span class="s2">\&#34;}&#34;</span>
</span></span></code></pre></div>
<h2 id="waybar-module">
  <a class="link" href="#waybar-module">
    #
  </a>
  Waybar module
</h2>

<p>To use this conveniently and instantly detect the current privacy state we write a waybar module:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="s2">&#34;custom/noscreenshare&#34;</span><span class="err">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;exec&#34;</span><span class="p">:</span> <span class="s2">&#34;~/scripts/toggle_noscreenshare.sh&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;on-click&#34;</span><span class="p">:</span> <span class="s2">&#34;~/scripts/toggle_noscreenshare.sh toggle &amp;&amp; pkill -SIGRTMIN+4 waybar&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;signal&#34;</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;interval&#34;</span><span class="p">:</span> <span class="s2">&#34;once&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;return-type&#34;</span><span class="p">:</span> <span class="s2">&#34;json&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;format&#34;</span><span class="p">:</span> <span class="s2">&#34;{icon}&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;format-icons&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;off&#34;</span><span class="p">:</span> <span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;on&#34;</span><span class="p">:</span> <span class="s2">&#34;󰗹&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;tooltip&#34;</span><span class="p">:</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span><span class="err">,</span>
</span></span></code></pre></div><p>Let’s describe whats going on here. To get value for this module we use <code>exec</code> field and set our script. Then we defined what will happen, when we click on module at <code>on-click</code> option: run script with <code>toggle</code> option and send system signal to waybar. This allows you to not reload all waybar process, but only this module. Here it’s very important to sync <code>signal</code> value and number at <code>pkill -SIGRTMIN+4 waybar</code> command, and to make this value unique only for this waybar module. Then we configure to run our script once on waybar startup and define view format (<code>tooltip: false</code> for not showing text, when hovering over cursor) . I’m using this nerdfonts icons for this, but they are not the same size. Therefore I fine-tune padding and add some styles:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">#</span><span class="nn">custom-noscreenshare</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">background</span><span class="p">:</span> <span class="mh">#1e1e2e</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">opacity</span><span class="p">:</span> <span class="mf">0.7</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">padding</span><span class="p">:</span> <span class="mi">0</span><span class="kt">px</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">margin</span><span class="p">:</span> <span class="mi">5</span><span class="kt">px</span> <span class="mi">5</span><span class="kt">px</span> <span class="mi">3</span><span class="kt">px</span> <span class="mi">0</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">border</span><span class="p">:</span> <span class="mi">0</span><span class="kt">px</span> <span class="kc">solid</span> <span class="mh">#181825</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">border-radius</span><span class="p">:</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">#</span><span class="nn">custom-noscreenshare</span><span class="p">.</span><span class="nc">on</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">font-size</span><span class="p">:</span> <span class="mi">18</span><span class="kt">px</span><span class="p">;</span> 
</span></span><span class="line"><span class="cl">  <span class="k">padding-right</span><span class="p">:</span> <span class="mi">14</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">#</span><span class="nn">custom-noscreenshare</span><span class="p">.</span><span class="nc">off</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">font-size</span><span class="p">:</span> <span class="mi">16</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">padding-right</span><span class="p">:</span> <span class="mi">16</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">padding-left</span><span class="p">:</span> <span class="mi">9</span><span class="kt">px</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>After that we have got nice interface for hands-on control of our privacy:
<img src="/images/noscreenshare-demo.gif" class="content-img" style="width:700px" alt="" loading="lazy" decoding="async" /></p>
]]></content:encoded><category>linux</category></item><item><title>Battery degradation on Linux</title><link>https://alchemmist.xyz/articles/battery-degradation/</link><pubDate>Fri, 11 Jul 2025 09:58:00 +0300</pubDate><dc:creator>alchemmist</dc:creator><guid>https://alchemmist.xyz/articles/battery-degradation/</guid><description>We all know our battery not forever. It’s okay, we can replace degraded battery at service and use machine again. But very useful see current state of your battery. In MacOS it’s default feature, on Linux we, of course, can do same thing. Let’s see!
Now we will understand how to find the desired value and then make a beautiful minimalistic waybar module for battery.
# Find a battery degradation value Firstly get list of all power devices:</description><content:encoded><![CDATA[<p>We all know our battery not forever. It’s okay, we can replace degraded battery at service and use machine again. But very useful see current state of your battery. In MacOS it’s default feature, on Linux we, of course, can do same thing. Let’s see!</p>
<p>Now we will understand how to find the desired value and then make a beautiful minimalistic waybar module for battery.</p>

<h2 id="find-a-battery-degradation-value">
  <a class="link" href="#find-a-battery-degradation-value">
    #
  </a>
  Find a battery degradation value
</h2>

<p>Firstly get list of all power devices:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">upower -e
</span></span></code></pre></div><p>Then find battery from this list:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">upower -e <span class="p">|</span> grep BAT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># For example:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /org/freedesktop/UPower/devices/battery_BATT</span>
</span></span></code></pre></div><p>Then get detailed information about this device, with <code>-i</code> flag of <code>upower</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">upower -i <span class="k">$(</span>upower -e <span class="p">|</span> grep BAT<span class="k">)</span>
</span></span></code></pre></div><p>We got something like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">  native-path:          BATT
</span></span><span class="line"><span class="cl">  vendor:               DESAY
</span></span><span class="line"><span class="cl">  model:                BASE-BAT
</span></span><span class="line"><span class="cl">  serial:               1
</span></span><span class="line"><span class="cl">  power supply:         yes
</span></span><span class="line"><span class="cl">  updated:              Fri Jul 11 11:37:00 2025 (7 seconds ago)
</span></span><span class="line"><span class="cl">  has history:          yes
</span></span><span class="line"><span class="cl">  has statistics:       yes
</span></span><span class="line"><span class="cl">  battery
</span></span><span class="line"><span class="cl">    present:             yes
</span></span><span class="line"><span class="cl">    rechargeable:        yes
</span></span><span class="line"><span class="cl">    state:               charging
</span></span><span class="line"><span class="cl">    warning-level:       none
</span></span><span class="line"><span class="cl">    energy:              25.514 Wh
</span></span><span class="line"><span class="cl">    energy-empty:        0 Wh
</span></span><span class="line"><span class="cl">    energy-full:         47.5052 Wh
</span></span><span class="line"><span class="cl">    energy-full-design:  59.4247 Wh
</span></span><span class="line"><span class="cl">    energy-rate:         11.1573 W
</span></span><span class="line"><span class="cl">    voltage:             11.972 V
</span></span><span class="line"><span class="cl">    charge-cycles:       650
</span></span><span class="line"><span class="cl">    time to full:        2.0 hours
</span></span><span class="line"><span class="cl">    percentage:          53%
</span></span><span class="line"><span class="cl">    capacity:            79.9417%
</span></span><span class="line"><span class="cl">    technology:          lithium-ion
</span></span><span class="line"><span class="cl">    charge-start-threshold:        75%
</span></span><span class="line"><span class="cl">    charge-end-threshold:          80%
</span></span><span class="line"><span class="cl">    charge-threshold-supported:    yes
</span></span><span class="line"><span class="cl">    icon-name:          &#39;battery-good-charging-symbolic&#39;
</span></span><span class="line"><span class="cl">  History (charge):
</span></span><span class="line"><span class="cl">    1752222927	53.000	charging
</span></span><span class="line"><span class="cl">  History (rate):
</span></span><span class="line"><span class="cl">    1752223020	11.157	charging
</span></span><span class="line"><span class="cl">    1752222990	11.123	charging
</span></span><span class="line"><span class="cl">    1752222987	11.192	charging
</span></span><span class="line"><span class="cl">    1752222957	10.822	charging
</span></span><span class="line"><span class="cl">    1752222927	10.857	charging
</span></span></code></pre></div><p>Here many interesting information, for example charge-cycles, time to full battery, and so on. But now we use two parameters:</p>
<ul>
<li><code>energy-full-design</code> — the original full battery volume</li>
<li><code>energy-full</code> — current battery volume
Deference between this two parameters is degradation of battery:

$$
\text{Degradation} = \left(1 - \frac{E_{\text{full}}}{E_{\text{design}}}\right) \times 100\%
$$
Now let’s calculate this metric in percents.</li>
</ul>
<p>First find this parameters in big output and devide them, with <code>awk</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">upower -i <span class="k">$(</span>upower -e <span class="p">|</span> grep BAT<span class="k">)</span> <span class="p">|</span> awk <span class="s1">&#39;\
</span></span></span><span class="line"><span class="cl"><span class="s1">	/energy-full:/ {ef=$2}\
</span></span></span><span class="line"><span class="cl"><span class="s1">	/energy-full-design:/ {efd=$2}\
</span></span></span><span class="line"><span class="cl"><span class="s1">	END {print ef/efd}&#39;</span>
</span></span></code></pre></div><p>Here we find <code>energy-full</code> and save to variable <code>ef</code>, find <code>enengry-full-design</code> and save to <code>efd</code> variable. On the end we divide them: <code>ef/efd</code>.</p>
<p>After that calculate percent value, with <code>bc</code> <em>(is shell calculator for expression with float numbers)</em>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;(1 - </span><span class="k">$(</span>upower -i <span class="k">$(</span>upower -e <span class="p">|</span> grep BAT<span class="k">)</span> <span class="p">|</span> awk <span class="s1">&#39;\
</span></span></span><span class="line"><span class="cl"><span class="s1">        /energy-full:/ {ef=$2}\
</span></span></span><span class="line"><span class="cl"><span class="s1">        /energy-full-design:/ {efd=$2}\
</span></span></span><span class="line"><span class="cl"><span class="s1">        END {print ef/efd}&#39;</span><span class="k">)</span><span class="s2">) * 100 + 0.5&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">	<span class="p">|</span> bc
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Output example:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 20.558200</span>
</span></span></code></pre></div><p>Here we make <code>+ 0.5</code> for rounding when the fractional part is cut off later.</p>
<p>In last step we need to round value. We make it simple: we already add <code>0.5</code> to value and now it remains to cut off the fractional part with <code>cut</code> util:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;(1 - </span><span class="k">$(</span>upower -i <span class="k">$(</span>upower -e <span class="p">|</span> grep BAT<span class="k">)</span> <span class="p">|</span> awk <span class="s1">&#39;\
</span></span></span><span class="line"><span class="cl"><span class="s1">        /energy-full:/ {ef=$2}\
</span></span></span><span class="line"><span class="cl"><span class="s1">        /energy-full-design:/ {efd=$2}\
</span></span></span><span class="line"><span class="cl"><span class="s1">        END {print ef/efd}&#39;</span><span class="k">)</span><span class="s2">) * 100 + 0.5&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">	<span class="p">|</span> bc <span class="se">\
</span></span></span><span class="line"><span class="cl">	<span class="p">|</span> cut -d<span class="s1">&#39;.&#39;</span> -f1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Output example:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 20</span>
</span></span></code></pre></div><p>Here <code>-d'.'</code> means we split by dot and <code>-f1</code> means we take first part.</p>

<h2 id="waybar-module">
  <a class="link" href="#waybar-module">
    #
  </a>
  Waybar module
</h2>

<p>In my waybar config <code>~/.config/waybar/config.json</code> I’m add two modules on right section, but you can do as you want. Finally i’m got this:
<img
    src="/images/battery-waybar-module_hu_7adf571591eb9de4.webp"
    width="1600"
    height="1050"
    class="content-img"
    alt=""
    loading="lazy"
    decoding="async"
  /></p>
<blockquote class="markdown-blockquote">
  <p>If you like my wallpaper you can find <a href="https://github.com/alchemmist/dotfiles/blob/main/wallpapers/anime/images/wallhaven-9mv6ew.jpg">this</a> and more very good stuff in my <code>dotfiles</code> repository on <a href="https://github.com/alchemmist/dotfiles/tree/main/wallpapers">GitHub</a>. Don’f forget: I love your stars!</p>

</blockquote>
<p>Let’s see:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;modules-left&#34;</span><span class="p">:</span> <span class="p">[</span><span class="err">...</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;modules-center&#34;</span><span class="p">:</span> <span class="p">[</span><span class="err">...</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;modules-left&#34;</span><span class="p">:</span> <span class="p">[</span><span class="err">...</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;modules-right&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;battery&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;custom/battery-degradation&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="p">],</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>First module it’s default <code>battery</code> module, for me it’s great work on hyprland. Here we define levels of good, warning and critical level of charging, define nerd icons format for different battery state:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="s2">&#34;battery&#34;</span><span class="err">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;states&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;good&#34;</span><span class="p">:</span> <span class="mi">90</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;warning&#34;</span><span class="p">:</span> <span class="mi">25</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;critical&#34;</span><span class="p">:</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;format&#34;</span><span class="p">:</span> <span class="s2">&#34;{icon} {capacity}%&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;format-charging&#34;</span><span class="p">:</span> <span class="s2">&#34; {capacity}%&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;format-plugged&#34;</span><span class="p">:</span> <span class="s2">&#34; {capacity}%&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;format-icons&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;󰂎&#34;</span><span class="p">,</span> <span class="s2">&#34;󰁺&#34;</span><span class="p">,</span> <span class="s2">&#34;󰁻&#34;</span><span class="p">,</span> <span class="s2">&#34;󰁼&#34;</span><span class="p">,</span> <span class="s2">&#34;󰁽&#34;</span><span class="p">,</span> <span class="s2">&#34;󰁾&#34;</span><span class="p">,</span> <span class="s2">&#34;󰁿&#34;</span><span class="p">,</span> <span class="s2">&#34;󰂀&#34;</span><span class="p">,</span> <span class="s2">&#34;󰂁&#34;</span><span class="p">,</span> <span class="s2">&#34;󰂂&#34;</span><span class="p">,</span> <span class="s2">&#34;󰁹&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;tooltip&#34;</span><span class="p">:</span> <span class="s2">&#34;{time}&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;style&#34;</span><span class="p">:</span> <span class="s2">&#34;{capacity &lt; 10 ? &#39;color: red;&#39; : &#39;color: normal;&#39;}&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Second module it’s today topic: <code>custom/batterydegradaion</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="s2">&#34;custom/battery-degradation&#34;</span><span class="err">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;format&#34;</span><span class="p">:</span> <span class="s2">&#34; {}%&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;interval&#34;</span><span class="p">:</span> <span class="s2">&#34;once&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;exec&#34;</span><span class="p">:</span> <span class="s2">&#34;~/scripts/battery-degradation.sh&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;tooltip&#34;</span><span class="p">:</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>I’m put our command to script, for me it’s useful. You can do same, don’t forgot add shebang <code>#!/bin/bash</code> and:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">chmod +x ~/scripts/battery-degradation.sh
</span></span></code></pre></div><p>In module we define the format with nerd icon and percent, turn off tooltip and set run once on waybar start <em>(because this parameter changing very long)</em>.</p>
<p>And finish this modules with css style in <code>~/.config/waybar/style.css</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">#</span><span class="nn">battery</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">#</span><span class="nn">custom-battery-degradation</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">background</span><span class="p">:</span> <span class="mh">#1e1e2e</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">opacity</span><span class="p">:</span> <span class="mf">0.7</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">padding</span><span class="p">:</span> <span class="mi">0</span><span class="kt">px</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">margin</span><span class="p">:</span> <span class="mi">3</span><span class="kt">px</span> <span class="mi">0</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">margin-top</span><span class="p">:</span> <span class="mi">5</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">border</span><span class="p">:</span> <span class="mi">0</span><span class="kt">px</span> <span class="kc">solid</span> <span class="mh">#181825</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">#</span><span class="nn">battery</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">padding-right</span><span class="p">:</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">border-radius</span><span class="p">:</span> <span class="mi">10</span><span class="kt">px</span> <span class="mi">0</span><span class="kt">px</span> <span class="mi">0</span><span class="kt">px</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">min-width</span><span class="p">:</span> <span class="mi">50</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">#</span><span class="nn">custom-battery-degradation</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">border-radius</span><span class="p">:</span> <span class="mi">0</span><span class="kt">px</span> <span class="mi">10</span><span class="kt">px</span> <span class="mi">10</span><span class="kt">px</span> <span class="mi">0</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">margin-right</span><span class="p">:</span> <span class="mi">5</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">min-width</span><span class="p">:</span> <span class="mi">35</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">#</span><span class="nn">battery</span><span class="p">.</span><span class="nc">critical</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="kc">red</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Done! As result:
<img
    src="/images/waybar-battery-module-2_hu_6854c9035f9f40e3.webp"
    width="151"
    height="41"
    class="content-img"
    alt=""
    loading="lazy"
    decoding="async"
  /></p>
]]></content:encoded><category>linux</category></item><item><title>Linux disk clean up</title><link>https://alchemmist.xyz/articles/linux-clean-up/</link><pubDate>Sun, 02 Feb 2025 14:18:00 +0300</pubDate><dc:creator>alchemmist</dc:creator><guid>https://alchemmist.xyz/articles/linux-clean-up/</guid><description>If you using docker on your machine, would be a good place for start it’s clean all docker stuff. Only if you’re sure in your docker containers, volumes nothing important:
docker system prune # 1. Clean packages Next tips for Arch-base systems:
Find heaviest packages. This command show top-20 most heavy packages:
pacman -Qi | awk &amp;#39;/^Name/{name=$3} /^Installed Size/{print $4 $5, name}&amp;#39; | sort -hr | head -n 20 Find unused dependencies:</description><content:encoded><![CDATA[<p>If you using docker on your machine, would be a good place for start it’s clean all docker stuff. Only if you’re sure in your docker containers, volumes nothing important:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">docker system prune
</span></span></code></pre></div>
<h2 id="1--clean-packages">
  <a class="link" href="#1--clean-packages">
    #
  </a>
  1.  Clean packages
</h2>

<p>Next tips for Arch-base systems:</p>
<p>Find heaviest packages. This command show top-20 most heavy packages:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">pacman -Qi <span class="p">|</span> awk <span class="s1">&#39;/^Name/{name=$3} /^Installed Size/{print $4 $5, name}&#39;</span> <span class="p">|</span> sort -hr <span class="p">|</span> head -n <span class="m">20</span>
</span></span></code></pre></div><p>Find unused dependencies:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">pacman -Qdtq
</span></span></code></pre></div><p><strong>Pay attention</strong>, in this list can be important packages for you, that are no one is using, it’s doesn’t mean this need to be remove.</p>
<p>If you’re sure, you can be remove all this list:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sudo pacman -Rns <span class="k">$(</span>pacman -Qdtq<span class="k">)</span>
</span></span></code></pre></div><p>Find forgotten packages. This command show top-20 long-unused packages:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">expac --timefmt<span class="o">=</span><span class="s1">&#39;%Y-%m-%d %T&#39;</span> <span class="s1">&#39;%l %n&#39;</span> <span class="p">|</span> sort <span class="p">|</span> head -n <span class="m">20</span>
</span></span></code></pre></div><p>Clean pacman cache. This command remove all old versions of packages, apart from last and current:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sudo paccache -r
</span></span></code></pre></div><p>This command remove all packages, apart from current installed:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sudo paccache -r -k <span class="m">0</span>
</span></span></code></pre></div><p>Keep in mind, after that you can be rollback to old package version without internet.</p>

<h2 id="2-clean-files">
  <a class="link" href="#2-clean-files">
    #
  </a>
  2. Clean files
</h2>

<p>This command show top-15 the heaviest directories at <code>home</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">du -h ~/ --max-depth<span class="o">=</span><span class="m">1</span> <span class="p">|</span> sort -hr <span class="p">|</span> head -n <span class="m">15</span>
</span></span></code></pre></div><p>This command show top-20 the heaviest directories at <code>home</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">find ~/ -type f -exec du -Sh <span class="o">{}</span> + <span class="p">|</span> sort -rh <span class="p">|</span> head -n <span class="m">20</span>
</span></span></code></pre></div><p>I think that’s two command enough to do all clean up what you want. You can find heavies directory at home, than go here. Then again run command for this directory. Then go to heaviest, then find heavy files…</p>
]]></content:encoded><category>linux</category></item></channel></rss>